@walkeros/web-destination-gtag 0.1.2 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +56 -2
- package/dist/examples/index.d.mts +40 -11
- package/dist/examples/index.d.ts +40 -11
- package/dist/examples/index.js +77 -34
- package/dist/examples/index.mjs +76 -34
- package/dist/index.browser.js +1 -1
- package/dist/index.d.mts +53 -9
- package/dist/index.d.ts +53 -9
- package/dist/index.es5.js +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/shared/gtag.ts","../src/ga4/config.ts","../src/shared/parameters.ts","../src/shared/mapping.ts","../src/ga4/push.ts","../src/ads/config.ts","../src/ads/push.ts","../src/gtm/config.ts","../src/gtm/push.ts","../src/types/index.ts","../src/examples/index.ts","../src/examples/events.ts","../src/examples/mapping.ts"],"sourcesContent":["import type { WalkerOS } from '@walkeros/core';\nimport type { Settings, Destination } from './types';\nimport { initGA4, pushGA4Event } from './ga4';\nimport { initAds, pushAdsEvent } from './ads';\nimport { initGTM, pushGTMEvent } from './gtm';\n\n// Types\nexport * as DestinationGtag from './types';\n\n// Examples\nexport * as examples from './examples';\n\nexport const destinationGtag: Destination = {\n type: 'google-gtag',\n\n config: { settings: {} },\n\n env: {\n window: {\n gtag: function (...args: unknown[]): void {},\n dataLayer: [] as unknown[],\n },\n document: {\n createElement: (tagName: string) => ({\n src: '',\n async: false,\n setAttribute: () => {},\n removeAttribute: () => {},\n }),\n head: {\n appendChild: () => {},\n },\n },\n },\n\n init({ config, env }) {\n const { settings = {} as Partial<Settings>, loadScript } = config;\n const { ga4, ads, gtm } = settings;\n\n // Initialize GA4 if configured\n if (ga4?.measurementId) {\n initGA4(ga4, loadScript, env);\n }\n\n // Initialize Google Ads if configured\n if (ads?.conversionId) {\n initAds(ads, loadScript, env);\n }\n\n // Initialize GTM if configured\n if (gtm?.containerId) {\n initGTM(gtm, loadScript, env);\n }\n\n // Fail if no tools are configured\n if (!ga4?.measurementId && !ads?.conversionId && !gtm?.containerId) {\n return false;\n }\n\n return config;\n },\n\n push(event, { config, mapping = {}, data, env }) {\n const { settings = {} } = config;\n const { ga4, ads, gtm } = settings;\n const eventMapping = mapping.settings || {};\n\n // Push to GA4 if configured\n if (ga4?.measurementId) {\n pushGA4Event(\n event,\n ga4,\n eventMapping.ga4,\n data as WalkerOS.AnyObject,\n env,\n );\n }\n\n // @TODO: Fix condition - should check for mapping.settings?.ads?.label || mapping.name\n // Currently requires mapping.name even when label is provided via settings.ads.label\n if (ads?.conversionId && mapping.name) {\n pushAdsEvent(\n event,\n ads,\n eventMapping.ads,\n data as WalkerOS.AnyObject,\n mapping.name,\n env,\n );\n }\n\n // Push to GTM if configured\n if (gtm?.containerId) {\n pushGTMEvent(\n event,\n gtm,\n eventMapping.gtm,\n data as WalkerOS.AnyObject,\n env,\n );\n }\n },\n};\n\nexport default destinationGtag;\n","// Gtag script loading and initialization utilities\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(window: Window = globalThis.window): void {\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 as unknown[]).push(arguments);\n };\n }\n}\n","import type { WalkerOS } from '@walkeros/core';\nimport type { GA4Settings } from '../types';\nimport type { DestinationWeb } from '@walkeros/web-core';\nimport { addScript, initializeGtag } from '../shared/gtag';\nimport { getEnvironment } from '@walkeros/web-core';\n\nexport function initGA4(\n settings: GA4Settings,\n loadScript?: boolean,\n env?: DestinationWeb.Environment,\n): void {\n const { window, document } = getEnvironment(env);\n const { measurementId, transport_url, server_container_url, pageview } =\n settings;\n\n if (!measurementId) return;\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 as Gtag.Gtag;\n gtag('js', new Date());\n\n // gtag init call\n gtag('config', measurementId, gtagSettings);\n}\n","import type { WalkerOS } from '@walkeros/core';\nimport type { Include, Parameters } from '../types';\n\nexport function getParamsInclude(\n event: WalkerOS.DeepPartialEvent,\n include: Include,\n): Parameters {\n const params: Parameters = {};\n\n // Check for the 'all' group to add each group\n if (include.includes('all'))\n include = [\n 'context',\n 'data',\n 'event',\n 'globals',\n 'source',\n 'user',\n 'version',\n ];\n\n include.forEach((groupName) => {\n let group = event[groupName as keyof Omit<WalkerOS.Event, 'all'>] || {};\n\n // Create a fake group for event properties\n if (groupName == 'event')\n group = {\n id: event.id,\n timing: event.timing,\n trigger: event.trigger,\n entity: event.entity,\n action: event.action,\n group: event.group,\n count: event.count,\n };\n\n Object.entries(group).forEach(([key, val]) => {\n // Different value access for context\n if (groupName == 'context') val = (val as WalkerOS.OrderedProperties)[0];\n\n params[`${groupName}_${key}`] = val;\n });\n });\n\n return params;\n}\n","// Shared mapping utilities for all Google tools\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","import type { WalkerOS } from '@walkeros/core';\nimport type { GA4Settings, GA4Mapping, Parameters } from '../types';\nimport type { DestinationWeb } from '@walkeros/web-core';\nimport { isObject } from '@walkeros/core';\nimport { getParamsInclude } from '../shared/parameters';\nimport { normalizeEventName } from '../shared/mapping';\nimport { getEnvironment } from '@walkeros/web-core';\n\nexport function pushGA4Event(\n event: WalkerOS.Event,\n settings: GA4Settings,\n mapping: GA4Mapping = {},\n data: WalkerOS.AnyObject,\n env?: DestinationWeb.Environment,\n): void {\n const { window } = getEnvironment(env);\n\n if (!settings.measurementId) return;\n\n const eventData = isObject(data) ? data : {};\n\n const paramsInclude = getParamsInclude(\n event,\n // Add data to include by default\n mapping.include || settings.include || ['data'],\n );\n\n const eventParams: Parameters = {\n ...paramsInclude,\n ...eventData,\n };\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 as Gtag.Gtag;\n gtag('event', eventName, eventParams);\n}\n","import type { AdsSettings } from '../types';\nimport type { DestinationWeb } from '@walkeros/web-core';\nimport { addScript, initializeGtag } from '../shared/gtag';\nimport { getEnvironment } from '@walkeros/web-core';\n\nexport function initAds(\n settings: AdsSettings,\n loadScript?: boolean,\n env?: DestinationWeb.Environment,\n): void {\n const { window, document } = getEnvironment(env);\n const { conversionId } = settings;\n\n if (!conversionId) return;\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 as Gtag.Gtag;\n gtag('js', new Date());\n\n // gtag init call\n gtag('config', conversionId);\n}\n","import type { WalkerOS } from '@walkeros/core';\nimport type { AdsSettings, AdsMapping } from '../types';\nimport type { DestinationWeb } from '@walkeros/web-core';\nimport { isObject } from '@walkeros/core';\nimport { getEnvironment } from '@walkeros/web-core';\n\nexport function pushAdsEvent(\n event: WalkerOS.Event,\n settings: AdsSettings,\n mapping: AdsMapping = {},\n data: WalkerOS.AnyObject,\n mappingName?: string,\n env?: DestinationWeb.Environment,\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) return;\n\n const params: Gtag.CustomParams = {\n send_to: `${conversionId}/${conversionLabel}`,\n currency: currency || 'EUR',\n ...eventData,\n };\n\n const { window } = getEnvironment(env);\n const gtag = window.gtag as Gtag.Gtag;\n gtag('event', 'conversion', params);\n}\n","import type { GTMSettings } from '../types';\nimport type { DestinationWeb } from '@walkeros/web-core';\nimport { getEnvironment } from '@walkeros/web-core';\n\nconst defaultDataLayer = 'dataLayer';\nconst defaultDomain = 'https://www.googletagmanager.com/gtm.js?id=';\n\nexport function initGTM(\n settings: GTMSettings,\n loadScript?: boolean,\n env?: DestinationWeb.Environment,\n): void {\n const { window, document } = getEnvironment(env);\n const { containerId, dataLayer, domain } = settings;\n const dataLayerName = dataLayer || defaultDataLayer;\n\n // Initialize the dataLayer (default or custom name)\n if (dataLayerName === defaultDataLayer) {\n window.dataLayer = window.dataLayer || [];\n } else {\n window[dataLayerName] = (window[dataLayerName] as unknown[]) || [];\n }\n\n // Get the appropriate dataLayer array\n const dataLayerArray = window[dataLayerName] as unknown[];\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 } from '@walkeros/core';\nimport type { GTMSettings, GTMMapping } from '../types';\nimport type { DestinationWeb } from '@walkeros/web-core';\nimport { isObject } from '@walkeros/core';\nimport { getEnvironment } from '@walkeros/web-core';\n\nexport function pushGTMEvent(\n event: WalkerOS.Event,\n settings: GTMSettings,\n mapping: GTMMapping = {},\n data: WalkerOS.AnyObject,\n env?: DestinationWeb.Environment,\n): void {\n const { window } = getEnvironment(env);\n const obj = { event: event.name }; // Use the name mapping by default\n\n (window.dataLayer as unknown[]).push({\n ...obj,\n ...(isObject(data) ? data : event),\n });\n}\n","import type { Mapping as WalkerOSMapping } from '@walkeros/core';\nimport type { DestinationWeb } from '@walkeros/web-core';\n\n// Extend Window interface with specific dataLayer typing\ninterface 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\nexport type Destination = DestinationWeb.Destination<Settings, Mapping>;\nexport type Config = DestinationWeb.Config<Settings, Mapping>;\n\n// Unified settings for all Google tools\nexport interface Settings {\n // GA4 settings\n ga4?: GA4Settings;\n // Google Ads settings\n ads?: AdsSettings;\n // GTM settings\n gtm?: GTMSettings;\n}\n\n// GA4-specific settings\nexport interface GA4Settings {\n measurementId: string;\n debug?: boolean;\n include?: Include;\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 {\n conversionId: string;\n currency?: string;\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 {\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 include?: Include;\n}\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 Include = Array<\n | 'all'\n | 'context'\n | 'data'\n | 'event'\n | 'globals'\n | 'source'\n | 'user'\n | 'version'\n>;\n\nexport type Parameters = Gtag.ControlParams &\n Gtag.EventParams &\n Gtag.CustomParams;\n","export * as events from './events';\nexport * as mapping from './mapping';\n","import { getEvent } from '@walkeros/core';\n\n// GA4 Purchase Event Example\nexport function ga4Purchase(): unknown[] {\n const event = getEvent('order complete');\n\n return [\n 'event',\n 'purchase',\n {\n transaction_id: event.data.id,\n value: event.data.total,\n tax: event.data.taxes,\n shipping: event.data.shipping,\n currency: 'EUR',\n items: event.nested\n .filter((item) => item.entity === 'product')\n .map((item) => ({\n item_id: item.data.id,\n item_name: item.data.name,\n quantity: 1,\n })),\n send_to: 'G-XXXXXX-1',\n },\n ];\n}\n\n// GA4 Add to Cart Event Example\nexport function ga4AddToCart(): unknown[] {\n const event = getEvent('product add');\n\n return [\n 'event',\n 'add_to_cart',\n {\n currency: 'EUR',\n value: event.data.price,\n items: [\n {\n item_id: event.data.id,\n item_variant: event.data.color,\n quantity: 1,\n },\n ],\n send_to: 'G-XXXXXX-1',\n },\n ];\n}\n\n// Google Ads Conversion Event Example\nexport function adsConversion(): unknown[] {\n const event = getEvent('order complete');\n\n return [\n 'event',\n 'conversion',\n {\n send_to: 'AW-XXXXXXXXX/CONVERSION_LABEL',\n currency: 'EUR',\n value: event.data.total,\n transaction_id: event.data.id,\n },\n ];\n}\n\n// GTM DataLayer Push Example\nexport function gtmEvent(): Record<string, unknown> {\n const event = getEvent('product view');\n\n return {\n event: 'product_view',\n product_id: event.data.id,\n product_name: event.data.name,\n product_category: event.data.category,\n value: event.data.price,\n currency: 'EUR',\n };\n}\n","import type { Mapping } from '@walkeros/core';\nimport type { DestinationGtag } from '..';\nimport { isObject } from '@walkeros/core';\n\n// GA4 Purchase Mapping\nexport const ga4Purchase: DestinationGtag.Rule = {\n name: 'purchase',\n settings: {\n ga4: {\n include: ['data', 'context'],\n },\n },\n data: {\n map: {\n transaction_id: 'data.id',\n value: 'data.total',\n tax: 'data.taxes',\n shipping: 'data.shipping',\n currency: { key: 'data.currency', value: 'EUR' },\n items: {\n loop: [\n 'nested',\n {\n condition: (entity) =>\n isObject(entity) && entity.entity === 'product',\n map: {\n item_id: 'data.id',\n item_name: 'data.name',\n quantity: { key: 'data.quantity', value: 1 },\n },\n },\n ],\n },\n },\n },\n};\n\n// GA4 Add to Cart Mapping\nexport const ga4AddToCart: DestinationGtag.Rule = {\n name: 'add_to_cart',\n settings: {\n ga4: {\n include: ['data'],\n },\n },\n data: {\n map: {\n currency: { value: 'EUR', key: 'data.currency' },\n value: 'data.price',\n items: {\n loop: [\n 'this',\n {\n map: {\n item_id: 'data.id',\n item_variant: 'data.color',\n quantity: { value: 1, key: 'data.quantity' },\n },\n },\n ],\n },\n },\n },\n};\n\n// Google Ads Conversion Mapping\nexport const adsConversion: DestinationGtag.Rule = {\n name: 'CONVERSION_LABEL', // This becomes the conversion label\n settings: {\n ads: {},\n },\n data: {\n map: {\n value: 'data.total',\n currency: { value: 'EUR', key: 'data.currency' },\n transaction_id: 'data.id',\n },\n },\n};\n\n// GTM Event Mapping\nexport const gtmProductView: DestinationGtag.Rule = {\n name: 'product_view',\n settings: {\n gtm: {},\n },\n data: {\n map: {\n product_id: 'data.id',\n product_name: 'data.name',\n product_category: 'data.category',\n value: 'data.price',\n currency: { value: 'EUR', key: 'data.currency' },\n },\n },\n};\n\n// Combined mapping for all tools\nexport const combinedPurchase: DestinationGtag.Rule = {\n name: 'purchase', // GA4 event name\n settings: {\n ga4: {\n include: ['data'],\n },\n ads: {}, // Will use 'purchase' as conversion label for ads\n gtm: {},\n },\n data: {\n map: {\n transaction_id: 'data.id',\n value: 'data.total',\n currency: { value: 'EUR', key: 'data.currency' },\n items: {\n loop: [\n 'nested',\n {\n condition: (entity) =>\n isObject(entity) && entity.entity === 'product',\n map: {\n item_id: 'data.id',\n item_name: 'data.name',\n quantity: { value: 1, key: 'data.quantity' },\n },\n },\n ],\n },\n },\n },\n};\n\n// Example configuration with all mappings\nexport const config = {\n order: { complete: combinedPurchase },\n product: {\n add: ga4AddToCart,\n view: gtmProductView,\n },\n} satisfies DestinationGtag.Rules;\n"],"mappings":"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","names":["document","w","document","import_web_core","import_web_core","document","import_web_core","import_web_core","document","addScript","import_web_core","adsConversion","ga4AddToCart","ga4Purchase","ga4Purchase","ga4AddToCart","adsConversion","config"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/shared/gtag.ts","../src/ga4/config.ts","../src/shared/parameters.ts","../src/shared/mapping.ts","../src/ga4/push.ts","../src/ads/config.ts","../src/ads/push.ts","../src/gtm/config.ts","../src/gtm/push.ts","../src/types/index.ts","../src/examples/index.ts","../src/examples/env.ts","../src/examples/events.ts","../src/examples/mapping.ts"],"sourcesContent":["import type { WalkerOS, On, Collector } from '@walkeros/core';\nimport type { Settings, Destination, ConsentMapping } from './types';\nimport { initGA4, pushGA4Event } from './ga4';\nimport { initAds, pushAdsEvent } from './ads';\nimport { initGTM, pushGTMEvent } from './gtm';\nimport { getData } from './shared/mapping';\nimport { initializeGtag } from './shared/gtag';\nimport { getEnv } from '@walkeros/web-core';\n\n// Types\nexport * as DestinationGtag from './types';\n\n// Examples\nexport * as examples from './examples';\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// Default consent mapping: walkerOS consent groups → gtag consent parameters\nconst DEFAULT_CONSENT_MAPPING: ConsentMapping = {\n marketing: ['ad_storage', 'ad_user_data', 'ad_personalization'],\n functional: ['analytics_storage'],\n};\n\nexport const destinationGtag: Destination = {\n type: 'google-gtag',\n\n config: { settings: {} },\n\n init({ config, env }) {\n const { settings = {} as Partial<Settings>, loadScript } = config;\n const { ga4, ads, gtm } = settings;\n\n // Initialize GA4 if configured\n if (ga4?.measurementId) {\n initGA4(ga4, loadScript, env);\n }\n\n // Initialize Google Ads if configured\n if (ads?.conversionId) {\n initAds(ads, loadScript, env);\n }\n\n // Initialize GTM if configured\n if (gtm?.containerId) {\n initGTM(gtm, loadScript, env);\n }\n\n // Fail if no tools are configured\n if (!ga4?.measurementId && !ads?.conversionId && !gtm?.containerId) {\n return false;\n }\n\n return config;\n },\n\n async push(event, { config, mapping = {}, data, env, collector }) {\n const { settings = {} } = config;\n const { ga4, ads, gtm } = settings;\n const eventMapping = mapping.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, eventMapping.ga4, ga4Data, env);\n }\n\n // @TODO: Fix condition - should check for mapping.settings?.ads?.label || mapping.name\n // Currently requires mapping.name even when label is provided via settings.ads.label\n if (ads?.conversionId && mapping.name) {\n pushAdsEvent(event, ads, eventMapping.ads, adsData, mapping.name, env);\n }\n\n // Push to GTM if configured\n if (gtm?.containerId) {\n pushGTMEvent(event, gtm, eventMapping.gtm, gtmData, env);\n }\n },\n\n on(type, context) {\n // Only handle consent events\n if (type !== 'consent' || !context) return;\n\n const consent = context;\n\n // Access config directly from this destination instance\n const settings = this.config?.settings || {};\n const { como = true } = settings;\n\n // Skip if consent mode is disabled\n if (!como) return;\n\n // Ensure gtag is available\n const { window } = getEnv(this.env);\n const gtag = initializeGtag(window as Window);\n if (!gtag) return;\n\n // Determine consent mapping to use\n const consentMapping: ConsentMapping =\n como === true ? DEFAULT_CONSENT_MAPPING : como;\n\n // If this is the first consent call, set default to denied for all parameters\n if (!defaultConsentSet) {\n // Get all possible gtag parameters from the mapping\n const allGtagParams = new Set<string>();\n Object.values(consentMapping).forEach((params) => {\n const paramArray = Array.isArray(params) ? params : [params];\n paramArray.forEach((param) => allGtagParams.add(param));\n });\n\n // Only call default if we have parameters to set\n if (allGtagParams.size > 0) {\n const defaultConsent: Record<string, 'denied'> = {};\n allGtagParams.forEach((param) => {\n defaultConsent[param] = 'denied';\n });\n\n // Call default with all denied\n gtag('consent', 'default', defaultConsent);\n }\n\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 as WalkerOS.Consent).forEach(\n ([walkerOSGroup, granted]) => {\n const gtagParams = consentMapping[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\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\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(window: Window): 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 as unknown[]).push(arguments);\n };\n }\n\n return w.gtag;\n}\n","import type { WalkerOS } from '@walkeros/core';\nimport type { GA4Settings } from '../types';\nimport type { DestinationWeb } from '@walkeros/web-core';\nimport { addScript, initializeGtag } from '../shared/gtag';\nimport { getEnv } from '@walkeros/web-core';\n\nexport function initGA4(\n settings: GA4Settings,\n loadScript?: boolean,\n env?: DestinationWeb.Env,\n): void {\n const { window, document } = getEnv(env);\n const { measurementId, transport_url, server_container_url, pageview } =\n settings;\n\n if (!measurementId) return;\n\n // Load the gtag script\n if (loadScript) addScript(measurementId, undefined, document as Document);\n\n // Initialize gtag infrastructure\n initializeGtag(window as 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 as Gtag.Gtag;\n gtag('js', new Date());\n\n // gtag init call\n gtag('config', measurementId, gtagSettings);\n}\n","import type { WalkerOS } from '@walkeros/core';\nimport type { Include, Parameters } from '../types';\n\nexport function getParamsInclude(\n event: WalkerOS.DeepPartialEvent,\n include: Include,\n): Parameters {\n const params: Parameters = {};\n\n // Check for the 'all' group to add each group\n if (include.includes('all'))\n include = [\n 'context',\n 'data',\n 'event',\n 'globals',\n 'source',\n 'user',\n 'version',\n ];\n\n include.forEach((groupName) => {\n let group = event[groupName as keyof Omit<WalkerOS.Event, 'all'>] || {};\n\n // Create a fake group for event properties\n if (groupName == 'event')\n group = {\n id: event.id,\n timing: event.timing,\n trigger: event.trigger,\n entity: event.entity,\n action: event.action,\n group: event.group,\n count: event.count,\n };\n\n Object.entries(group).forEach(([key, val]) => {\n // Different value access for context\n if (groupName == 'context') val = (val as WalkerOS.OrderedProperties)[0];\n\n params[`${groupName}_${key}`] = val;\n });\n });\n\n return params;\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 { WalkerOS } from '@walkeros/core';\nimport type { GA4Settings, GA4Mapping, Parameters } from '../types';\nimport type { DestinationWeb } from '@walkeros/web-core';\nimport { isObject } from '@walkeros/core';\nimport { getParamsInclude } from '../shared/parameters';\nimport { normalizeEventName } from '../shared/mapping';\nimport { getEnv } from '@walkeros/web-core';\n\nexport function pushGA4Event(\n event: WalkerOS.Event,\n settings: GA4Settings,\n mapping: GA4Mapping = {},\n data: WalkerOS.AnyObject,\n env?: DestinationWeb.Env,\n): void {\n const { window } = getEnv(env);\n\n if (!settings.measurementId) return;\n\n const eventData = isObject(data) ? data : {};\n\n const paramsInclude = getParamsInclude(\n event,\n // Add data to include by default\n mapping.include || settings.include || ['data'],\n );\n\n const eventParams: Parameters = {\n ...paramsInclude,\n ...eventData,\n };\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 as Gtag.Gtag;\n gtag('event', eventName, eventParams);\n}\n","import type { AdsSettings } from '../types';\nimport type { DestinationWeb } from '@walkeros/web-core';\nimport { addScript, initializeGtag } from '../shared/gtag';\nimport { getEnv } from '@walkeros/web-core';\n\nexport function initAds(\n settings: AdsSettings,\n loadScript?: boolean,\n env?: DestinationWeb.Env,\n): void {\n const { window, document } = getEnv(env);\n const { conversionId } = settings;\n\n if (!conversionId) return;\n\n // Default currency value\n if (!settings.currency) settings.currency = 'EUR';\n\n if (loadScript) addScript(conversionId, undefined, document as Document);\n\n // Initialize gtag infrastructure\n initializeGtag(window as Window);\n\n const gtag = window.gtag as Gtag.Gtag;\n gtag('js', new Date());\n\n // gtag init call\n gtag('config', conversionId);\n}\n","import type { WalkerOS } 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: WalkerOS.AnyObject,\n mappingName?: string,\n env?: DestinationWeb.Env,\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) return;\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 gtag('event', 'conversion', params);\n}\n","import type { GTMSettings } from '../types';\nimport type { DestinationWeb } from '@walkeros/web-core';\nimport { getEnv } from '@walkeros/web-core';\n\nconst defaultDataLayer = 'dataLayer';\nconst defaultDomain = 'https://www.googletagmanager.com/gtm.js?id=';\n\nexport function initGTM(\n settings: GTMSettings,\n loadScript?: boolean,\n env?: DestinationWeb.Env,\n): void {\n const { window, document } = getEnv(env);\n const { containerId, dataLayer, domain } = settings;\n const dataLayerName = dataLayer || defaultDataLayer;\n\n // Initialize the dataLayer (default or custom name)\n if (dataLayerName === defaultDataLayer) {\n window.dataLayer = window.dataLayer || [];\n } else {\n window[dataLayerName] = (window[dataLayerName] as unknown[]) || [];\n }\n\n // Get the appropriate dataLayer array\n const dataLayerArray = window[dataLayerName] as unknown[];\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(\n containerId,\n domain || defaultDomain,\n dataLayerName,\n document as Document,\n );\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 } from '@walkeros/core';\nimport type { GTMSettings, GTMMapping } from '../types';\nimport type { DestinationWeb } from '@walkeros/web-core';\nimport { isObject } from '@walkeros/core';\nimport { getEnv } from '@walkeros/web-core';\n\nexport function pushGTMEvent(\n event: WalkerOS.Event,\n settings: GTMSettings,\n mapping: GTMMapping = {},\n data: WalkerOS.AnyObject,\n env?: DestinationWeb.Env,\n): void {\n const { window } = getEnv(env);\n const obj = { event: event.name }; // Use the name mapping by default\n\n (window.dataLayer as unknown[]).push({\n ...obj,\n ...(isObject(data) ? data : event),\n });\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\ninterface 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 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>;\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 // GA4 settings\n ga4?: GA4Settings;\n // Google Ads settings\n ads?: AdsSettings;\n // GTM settings\n gtm?: GTMSettings;\n}\n\n// GA4-specific settings\nexport interface GA4Settings extends BaseSettings {\n measurementId: string;\n debug?: boolean;\n include?: Include;\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}\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 include?: Include;\n}\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 Include = Array<\n | 'all'\n | 'context'\n | 'data'\n | 'event'\n | 'globals'\n | 'source'\n | 'user'\n | 'version'\n>;\n\nexport type Parameters = Gtag.ControlParams &\n Gtag.EventParams &\n Gtag.CustomParams;\n","export * as env from './env';\nexport * as events from './events';\nexport * as mapping from './mapping';\n","import type { Env } from '../types';\n\n/**\n * Example environment configurations for Gtag destination\n *\n * These environments provide standardized mock structures for testing\n * and development without requiring external dependencies.\n */\n\n// Simple no-op function for mocking\nconst noop = () => {};\n\nexport const init: Env | undefined = {\n window: {\n gtag: undefined as unknown as Env['window']['gtag'],\n dataLayer: [],\n },\n document: {\n createElement: () => ({\n src: '',\n setAttribute: () => {},\n removeAttribute: () => {},\n }),\n head: { appendChild: () => {} },\n },\n};\n\nexport const push: Env = {\n window: {\n gtag: Object.assign(noop, {\n // Add any gtag-specific properties if needed\n }) as unknown as Env['window']['gtag'],\n dataLayer: [] as unknown[],\n },\n document: {\n createElement: () => ({\n src: '',\n setAttribute: () => {},\n removeAttribute: () => {},\n }),\n head: { appendChild: () => {} },\n },\n};\n\nexport const simulation = [\n 'call:window.gtag', // Track gtag function calls\n];\n","import { getEvent } from '@walkeros/core';\n\n// GA4 Purchase Event Example\nexport function ga4Purchase(): unknown[] {\n const event = getEvent('order complete');\n\n return [\n 'event',\n 'purchase',\n {\n transaction_id: event.data.id,\n value: event.data.total,\n tax: event.data.taxes,\n shipping: event.data.shipping,\n currency: 'EUR',\n items: event.nested\n .filter((item) => item.entity === 'product')\n .map((item) => ({\n item_id: item.data.id,\n item_name: item.data.name,\n quantity: 1,\n })),\n send_to: 'G-XXXXXX-1',\n },\n ];\n}\n\n// GA4 Add to Cart Event Example\nexport function ga4AddToCart(): unknown[] {\n const event = getEvent('product add');\n\n return [\n 'event',\n 'add_to_cart',\n {\n currency: 'EUR',\n value: event.data.price,\n items: [\n {\n item_id: event.data.id,\n item_variant: event.data.color,\n quantity: 1,\n },\n ],\n send_to: 'G-XXXXXX-1',\n },\n ];\n}\n\n// Google Ads Conversion Event Example\nexport function adsConversion(): unknown[] {\n const event = getEvent('order complete');\n\n return [\n 'event',\n 'conversion',\n {\n send_to: 'AW-XXXXXXXXX/CONVERSION_LABEL',\n currency: 'EUR',\n value: event.data.total,\n transaction_id: event.data.id,\n },\n ];\n}\n\n// GTM DataLayer Push Example\nexport function gtmEvent(): Record<string, unknown> {\n const event = getEvent('product view');\n\n return {\n event: 'product_view',\n product_id: event.data.id,\n product_name: event.data.name,\n product_category: event.data.category,\n value: event.data.price,\n currency: 'EUR',\n };\n}\n","import type { Mapping } from '@walkeros/core';\nimport type { DestinationGtag } from '..';\nimport { isObject } from '@walkeros/core';\n\n// GA4 Purchase Mapping\nexport const ga4Purchase: DestinationGtag.Rule = {\n name: 'purchase',\n settings: {\n ga4: {\n include: ['data', 'context'],\n },\n },\n data: {\n map: {\n transaction_id: 'data.id',\n value: 'data.total',\n tax: 'data.taxes',\n shipping: 'data.shipping',\n currency: { key: 'data.currency', value: 'EUR' },\n items: {\n loop: [\n 'nested',\n {\n condition: (entity) =>\n isObject(entity) && entity.entity === 'product',\n map: {\n item_id: 'data.id',\n item_name: 'data.name',\n quantity: { key: 'data.quantity', value: 1 },\n },\n },\n ],\n },\n },\n },\n};\n\n// GA4 Add to Cart Mapping\nexport const ga4AddToCart: DestinationGtag.Rule = {\n name: 'add_to_cart',\n settings: {\n ga4: {\n include: ['data'],\n },\n },\n data: {\n map: {\n currency: { value: 'EUR', key: 'data.currency' },\n value: 'data.price',\n items: {\n loop: [\n 'this',\n {\n map: {\n item_id: 'data.id',\n item_variant: 'data.color',\n quantity: { value: 1, key: 'data.quantity' },\n },\n },\n ],\n },\n },\n },\n};\n\n// Google Ads Conversion Mapping\nexport const adsConversion: DestinationGtag.Rule = {\n name: 'CONVERSION_LABEL', // This becomes the conversion label\n settings: {\n ads: {},\n },\n data: {\n map: {\n value: 'data.total',\n currency: { value: 'EUR', key: 'data.currency' },\n transaction_id: 'data.id',\n },\n },\n};\n\n// GTM Event Mapping\nexport const gtmProductView: DestinationGtag.Rule = {\n name: 'product_view',\n settings: {\n gtm: {},\n },\n data: {\n map: {\n product_id: 'data.id',\n product_name: 'data.name',\n product_category: 'data.category',\n value: 'data.price',\n currency: { value: 'EUR', key: 'data.currency' },\n },\n },\n};\n\n// Combined mapping for all tools\nexport const combinedPurchase: DestinationGtag.Rule = {\n name: 'purchase', // GA4 event name\n settings: {\n ga4: {\n include: ['data'],\n },\n ads: {}, // Will use 'purchase' as conversion label for ads\n gtm: {},\n },\n data: {\n map: {\n transaction_id: 'data.id',\n value: 'data.total',\n currency: { value: 'EUR', key: 'data.currency' },\n items: {\n loop: [\n 'nested',\n {\n condition: (entity) =>\n isObject(entity) && entity.entity === 'product',\n map: {\n item_id: 'data.id',\n item_name: 'data.name',\n quantity: { value: 1, key: 'data.quantity' },\n },\n },\n ],\n },\n },\n },\n};\n\n// Example configuration with all mappings\nexport const config = {\n order: { complete: combinedPurchase },\n product: {\n add: ga4AddToCart,\n view: gtmProductView,\n },\n} satisfies DestinationGtag.Rules;\n"],"mappings":"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","names":["document","w","document","config","import_web_core","import_web_core","document","import_web_core","import_web_core","document","addScript","import_web_core","import_web_core","adsConversion","ga4AddToCart","ga4Purchase","ga4Purchase","ga4AddToCart","adsConversion","config"]}
|
package/dist/index.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var e,t,a=Object.defineProperty,n=(e,t)=>{for(var n in t)a(e,n,{get:t[n],enumerable:!0})},o=new Set;function r(e,t="https://www.googletagmanager.com/gtag/js?id=",a=globalThis.document){if(o.has(e))return;const n=a.createElement("script");n.src=t+e,a.head.appendChild(n),o.add(e)}function i(e=globalThis.window){const t=e;t.dataLayer=t.dataLayer||[],t.gtag||(t.gtag=function(){t.dataLayer.push(arguments)})}import{getEnvironment as s}from"@walkeros/web-core";var c=Object.getOwnPropertyNames,d=(e={"package.json"(e,t){t.exports={name:"@walkeros/core",description:"Core types and platform-agnostic utilities for walkerOS",version:"0.1.2",main:"./dist/index.js",module:"./dist/index.mjs",types:"./dist/index.d.ts",license:"MIT",files:["dist/**"],scripts:{build:"tsup --silent",clean:"rm -rf .turbo && rm -rf node_modules && rm -rf dist",dev:"jest --watchAll --colors",lint:'tsc && eslint "**/*.ts*"',test:"jest",update:"npx npm-check-updates -u && npm update"},dependencies:{},devDependencies:{},repository:{url:"git+https://github.com/elbwalker/walkerOS.git",directory:"packages/core"},author:"elbwalker <hello@elbwalker.com>",homepage:"https://github.com/elbwalker/walkerOS#readme",bugs:{url:"https://github.com/elbwalker/walkerOS/issues"},keywords:["walker","walkerOS","analytics","tracking","data collection","measurement","data privacy","privacy friendly","web analytics","product analytics","core","types","utils"],funding:[{type:"GitHub Sponsors",url:"https://github.com/sponsors/elbwalker"}]}}},function(){return t||(0,e[c(e)[0]])((t={exports:{}}).exports,t),t.exports}),u={merge:!0,shallow:!0,extend:!0};function l(e){return"object"==typeof e&&null!==e&&!function(e){return Array.isArray(e)}(e)&&"[object Object]"===Object.prototype.toString.call(e)}var{version:p}=d();function g(e={}){var t;const a=e.timestamp||(new Date).setHours(0,13,37,0),n=e.group||"gr0up",o=e.count||1,r=function(e,t={},a={}){a={...u,...a};const n=Object.entries(t).reduce((t,[n,o])=>{const r=e[n];return a.merge&&Array.isArray(r)&&Array.isArray(o)?t[n]=o.reduce((e,t)=>e.includes(t)?e:[...e,t],[...r]):(a.extend||n in e)&&(t[n]=o),t},{});return a.shallow?{...e,...n}:(Object.assign(e,n),e)}({name:"entity action",data:{string:"foo",number:1,boolean:!0,array:[0,"text",!1],not:void 0},context:{dev:["test",1]},globals:{lang:"elb"},custom:{completely:"random"},user:{id:"us3r",device:"c00k13",session:"s3ss10n"},nested:[{entity:"child",data:{is:"subordinated"},nested:[],context:{element:["child",0]}}],consent:{functional:!0},id:`${a}-${n}-${o}`,trigger:"test",entity:"entity",action:"action",timestamp:a,timing:3.14,group:n,count:o,version:{source:p,tagging:1},source:{type:"web",id:"https://localhost:80",previous_id:"http://remotehost:9001"}},e,{merge:!1});if(e.name){const[a,n]=null!=(t=e.name.split(" "))?t:[];a&&n&&(r.entity=a,r.action=n)}return r}function m(e="entity action",t={}){const a=t.timestamp||(new Date).setHours(0,13,37,0),n={data:{id:"ers",name:"Everyday Ruck Snack",color:"black",size:"l",price:420}},o={data:{id:"cc",name:"Cool Cap",size:"one size",price:42}};return g({...{"cart view":{data:{currency:"EUR",value:2*n.data.price},context:{shopping:["cart",0]},globals:{pagegroup:"shop"},nested:[{entity:"product",data:{...n.data,quantity:2},context:{shopping:["cart",0]},nested:[]}],trigger:"load"},"checkout view":{data:{step:"payment",currency:"EUR",value:n.data.price+o.data.price},context:{shopping:["checkout",0]},globals:{pagegroup:"shop"},nested:[{entity:"product",...n,context:{shopping:["checkout",0]},nested:[]},{entity:"product",...o,context:{shopping:["checkout",0]},nested:[]}],trigger:"load"},"order complete":{data:{id:"0rd3r1d",currency:"EUR",shipping:5.22,taxes:73.76,total:555},context:{shopping:["complete",0]},globals:{pagegroup:"shop"},nested:[{entity:"product",...n,context:{shopping:["complete",0]},nested:[]},{entity:"product",...o,context:{shopping:["complete",0]},nested:[]},{entity:"gift",data:{name:"Surprise"},context:{shopping:["complete",0]},nested:[]}],trigger:"load"},"page view":{data:{domain:"www.example.com",title:"walkerOS documentation",referrer:"https://www.elbwalker.com/",search:"?foo=bar",hash:"#hash",id:"/docs/"},globals:{pagegroup:"docs"},trigger:"load"},"product add":{...n,context:{shopping:["intent",0]},globals:{pagegroup:"shop"},nested:[],trigger:"click"},"product view":{...n,context:{shopping:["detail",0]},globals:{pagegroup:"shop"},nested:[],trigger:"load"},"product visible":{data:{...n.data,position:3,promo:!0},context:{shopping:["discover",0]},globals:{pagegroup:"shop"},nested:[],trigger:"load"},"promotion visible":{data:{name:"Setting up tracking easily",position:"hero"},context:{ab_test:["engagement",0]},globals:{pagegroup:"homepage"},trigger:"visible"},"session start":{data:{id:"s3ss10n",start:a,isNew:!0,count:1,runs:1,isStart:!0,storage:!0,referrer:"",device:"c00k13"},user:{id:"us3r",device:"c00k13",session:"s3ss10n",hash:"h4sh",address:"street number",email:"user@example.com",phone:"+49 123 456 789",userAgent:"Mozilla...",browser:"Chrome",browserVersion:"90",deviceType:"desktop",language:"de-DE",country:"DE",region:"HH",city:"Hamburg",zip:"20354",timezone:"Berlin",os:"walkerOS",osVersion:"1.0",screenSize:"1337x420",ip:"127.0.0.0",internal:!0,custom:"value"}}}[e],...t,name:e})}import{getEnvironment as v}from"@walkeros/web-core";function y(e,t,a={},n,o){const{window:r}=v(o);if(!t.measurementId)return;const i=l(n)?n:{},s=function(e,t){const a={};return t.includes("all")&&(t=["context","data","event","globals","source","user","version"]),t.forEach(t=>{let n=e[t]||{};"event"==t&&(n={id:e.id,timing:e.timing,trigger:e.trigger,entity:e.entity,action:e.action,group:e.group,count:e.count}),Object.entries(n).forEach(([e,n])=>{"context"==t&&(n=n[0]),a[`${t}_${e}`]=n})}),a}(e,a.include||t.include||["data"]),c={...s,...i};let d=e.name;!1!==t.snakeCase&&(d=function(e,t=!0){return t?e.replace(/\s+/g,"_").toLowerCase():e}(d)),c.send_to=t.measurementId,t.debug&&(c.debug_mode=!0);(0,r.gtag)("event",d,c)}import{getEnvironment as h}from"@walkeros/web-core";import{getEnvironment as w}from"@walkeros/web-core";import{getEnvironment as b}from"@walkeros/web-core";var f="dataLayer";function k(e,t,a){const{window:n,document:o}=b(a),{containerId:r,dataLayer:i,domain:s}=e,c=i||f;c===f?n.dataLayer=n.dataLayer||[]:n[c]=n[c]||[];n[c].push({"gtm.start":(new Date).getTime(),event:"gtm.js"}),t&&r&&function(e,t,a,n=globalThis.document){const o=a!=f?"&l="+a:"",r=n.createElement("script");r.src=t+e+o,n.head.appendChild(r)}(r,s||"https://www.googletagmanager.com/gtm.js?id=",c,o)}import{getEnvironment as _}from"@walkeros/web-core";var x={},E={};n(E,{events:()=>X,mapping:()=>R});var X={};function j(){const e=m("order complete");return["event","purchase",{transaction_id:e.data.id,value:e.data.total,tax:e.data.taxes,shipping:e.data.shipping,currency:"EUR",items:e.nested.filter(e=>"product"===e.entity).map(e=>({item_id:e.data.id,item_name:e.data.name,quantity:1})),send_to:"G-XXXXXX-1"}]}function O(){const e=m("product add");return["event","add_to_cart",{currency:"EUR",value:e.data.price,items:[{item_id:e.data.id,item_variant:e.data.color,quantity:1}],send_to:"G-XXXXXX-1"}]}function I(){const e=m("order complete");return["event","conversion",{send_to:"AW-XXXXXXXXX/CONVERSION_LABEL",currency:"EUR",value:e.data.total,transaction_id:e.data.id}]}function S(){const e=m("product view");return{event:"product_view",product_id:e.data.id,product_name:e.data.name,product_category:e.data.category,value:e.data.price,currency:"EUR"}}n(X,{adsConversion:()=>I,ga4AddToCart:()=>O,ga4Purchase:()=>j,gtmEvent:()=>S});var R={};n(R,{adsConversion:()=>L,combinedPurchase:()=>q,config:()=>D,ga4AddToCart:()=>C,ga4Purchase:()=>A,gtmProductView:()=>U});var A={name:"purchase",settings:{ga4:{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=>l(e)&&"product"===e.entity,map:{item_id:"data.id",item_name:"data.name",quantity:{key:"data.quantity",value:1}}}]}}}},C={name:"add_to_cart",settings:{ga4:{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"}}}]}}}},L={name:"CONVERSION_LABEL",settings:{ads:{}},data:{map:{value:"data.total",currency:{value:"EUR",key:"data.currency"},transaction_id:"data.id"}}},U={name:"product_view",settings:{gtm:{}},data:{map:{product_id:"data.id",product_name:"data.name",product_category:"data.category",value:"data.price",currency:{value:"EUR",key:"data.currency"}}}},q={name:"purchase",settings:{ga4:{include:["data"]},ads:{},gtm:{}},data:{map:{transaction_id:"data.id",value:"data.total",currency:{value:"EUR",key:"data.currency"},items:{loop:["nested",{condition:e=>l(e)&&"product"===e.entity,map:{item_id:"data.id",item_name:"data.name",quantity:{value:1,key:"data.quantity"}}}]}}}},D={order:{complete:q},product:{add:C,view:U}},T={type:"google-gtag",config:{settings:{}},env:{window:{gtag:function(...e){},dataLayer:[]},document:{createElement:e=>({src:"",async:!1,setAttribute:()=>{},removeAttribute:()=>{}}),head:{appendChild:()=>{}}}},init({config:e,env:t}){const{settings:a={},loadScript:n}=e,{ga4:o,ads:c,gtm:d}=a;return(null==o?void 0:o.measurementId)&&function(e,t,a){const{window:n,document:o}=s(a),{measurementId:c,transport_url:d,server_container_url:u,pageview:l}=e;if(!c)return;t&&r(c,void 0,o),i(n);const p={};d&&(p.transport_url=d),u&&(p.server_container_url=u),!1===l&&(p.send_page_view=!1);const g=n.gtag;g("js",new Date),g("config",c,p)}(o,n,t),(null==c?void 0:c.conversionId)&&function(e,t,a){const{window:n,document:o}=h(a),{conversionId:s}=e;if(!s)return;e.currency||(e.currency="EUR"),t&&r(s,void 0,o),i(n);const c=n.gtag;c("js",new Date),c("config",s)}(c,n,t),(null==d?void 0:d.containerId)&&k(d,n,t),!!((null==o?void 0:o.measurementId)||(null==c?void 0:c.conversionId)||(null==d?void 0:d.containerId))&&e},push(e,{config:t,mapping:a={},data:n,env:o}){const{settings:r={}}=t,{ga4:i,ads:s,gtm:c}=r,d=a.settings||{};(null==i?void 0:i.measurementId)&&y(e,i,d.ga4,n,o),(null==s?void 0:s.conversionId)&&a.name&&function(e,t,a={},n,o,r){const{conversionId:i,currency:s}=t,c=l(n)?n:{},d=a.label||o;if(!d)return;const u={send_to:`${i}/${d}`,currency:s||"EUR",...c},{window:p}=w(r);(0,p.gtag)("event","conversion",u)}(0,s,d.ads,n,a.name,o),(null==c?void 0:c.containerId)&&function(e,t,a={},n,o){const{window:r}=_(o),i={event:e.name};r.dataLayer.push({...i,...l(n)?n:e})}(e,0,d.gtm,n,o)}},z=T;export{x as DestinationGtag,z as default,T as destinationGtag,E as examples};//# sourceMappingURL=index.mjs.map
|
|
1
|
+
var t=Object.defineProperty,e=(e,a)=>{for(var n in a)t(e,n,{get:a[n],enumerable:!0})},a=new Set;function n(t,e="https://www.googletagmanager.com/gtag/js?id=",n=globalThis.document){if(a.has(t))return;const o=n.createElement("script");o.src=e+t,n.head.appendChild(o),a.add(t)}function o(t){const e=t;return e.dataLayer=e.dataLayer||[],e.gtag||(e.gtag=function(){e.dataLayer.push(arguments)}),e.gtag}import{getEnv as r}from"@walkeros/web-core";var i={merge:!0,shallow:!0,extend:!0};function c(t,e={},a={}){a={...i,...a};const n=Object.entries(e).reduce((e,[n,o])=>{const r=t[n];return a.merge&&Array.isArray(r)&&Array.isArray(o)?e[n]=o.reduce((t,e)=>t.includes(e)?t:[...t,e],[...r]):(a.extend||n in t)&&(e[n]=o),e},{});return a.shallow?{...t,...n}:(Object.assign(t,n),t)}function s(t){return Array.isArray(t)}function d(t){return void 0!==t}function u(t){return"object"==typeof t&&null!==t&&!s(t)&&"[object Object]"===Object.prototype.toString.call(t)}function l(t){return"string"==typeof t}function g(t,e="",a){const n=e.split(".");let o=t;for(let t=0;t<n.length;t++){const e=n[t];if("*"===e&&s(o)){const e=n.slice(t+1).join("."),r=[];for(const t of o){const n=g(t,e,a);r.push(n)}return r}if(o=o instanceof Object?o[e]:void 0,!o)break}return d(o)?o:a}function p(t="entity action",e={}){const a=e.timestamp||(new Date).setHours(0,13,37,0),n={data:{id:"ers",name:"Everyday Ruck Snack",color:"black",size:"l",price:420}},o={data:{id:"cc",name:"Cool Cap",size:"one size",price:42}};return function(t={}){var e;const a=t.timestamp||(new Date).setHours(0,13,37,0),n=t.group||"gr0up",o=t.count||1,r=c({name:"entity action",data:{string:"foo",number:1,boolean:!0,array:[0,"text",!1],not:void 0},context:{dev:["test",1]},globals:{lang:"elb"},custom:{completely:"random"},user:{id:"us3r",device:"c00k13",session:"s3ss10n"},nested:[{entity:"child",data:{is:"subordinated"},nested:[],context:{element:["child",0]}}],consent:{functional:!0},id:`${a}-${n}-${o}`,trigger:"test",entity:"entity",action:"action",timestamp:a,timing:3.14,group:n,count:o,version:{source:"0.2.0",tagging:1},source:{type:"web",id:"https://localhost:80",previous_id:"http://remotehost:9001"}},t,{merge:!1});if(t.name){const[a,n]=null!=(e=t.name.split(" "))?e:[];a&&n&&(r.entity=a,r.action=n)}return r}({...{"cart view":{data:{currency:"EUR",value:2*n.data.price},context:{shopping:["cart",0]},globals:{pagegroup:"shop"},nested:[{entity:"product",data:{...n.data,quantity:2},context:{shopping:["cart",0]},nested:[]}],trigger:"load"},"checkout view":{data:{step:"payment",currency:"EUR",value:n.data.price+o.data.price},context:{shopping:["checkout",0]},globals:{pagegroup:"shop"},nested:[{entity:"product",...n,context:{shopping:["checkout",0]},nested:[]},{entity:"product",...o,context:{shopping:["checkout",0]},nested:[]}],trigger:"load"},"order complete":{data:{id:"0rd3r1d",currency:"EUR",shipping:5.22,taxes:73.76,total:555},context:{shopping:["complete",0]},globals:{pagegroup:"shop"},nested:[{entity:"product",...n,context:{shopping:["complete",0]},nested:[]},{entity:"product",...o,context:{shopping:["complete",0]},nested:[]},{entity:"gift",data:{name:"Surprise"},context:{shopping:["complete",0]},nested:[]}],trigger:"load"},"page view":{data:{domain:"www.example.com",title:"walkerOS documentation",referrer:"https://www.elbwalker.com/",search:"?foo=bar",hash:"#hash",id:"/docs/"},globals:{pagegroup:"docs"},trigger:"load"},"product add":{...n,context:{shopping:["intent",0]},globals:{pagegroup:"shop"},nested:[],trigger:"click"},"product view":{...n,context:{shopping:["detail",0]},globals:{pagegroup:"shop"},nested:[],trigger:"load"},"product visible":{data:{...n.data,position:3,promo:!0},context:{shopping:["discover",0]},globals:{pagegroup:"shop"},nested:[],trigger:"load"},"promotion visible":{data:{name:"Setting up tracking easily",position:"hero"},context:{ab_test:["engagement",0]},globals:{pagegroup:"homepage"},trigger:"visible"},"session start":{data:{id:"s3ss10n",start:a,isNew:!0,count:1,runs:1,isStart:!0,storage:!0,referrer:"",device:"c00k13"},user:{id:"us3r",device:"c00k13",session:"s3ss10n",hash:"h4sh",address:"street number",email:"user@example.com",phone:"+49 123 456 789",userAgent:"Mozilla...",browser:"Chrome",browserVersion:"90",deviceType:"desktop",language:"de-DE",country:"DE",region:"HH",city:"Hamburg",zip:"20354",timezone:"Berlin",os:"walkerOS",osVersion:"1.0",screenSize:"1337x420",ip:"127.0.0.0",internal:!0,custom:"value"}}}[t],...e,name:t})}function m(t){return function(t){return"boolean"==typeof t}(t)||l(t)||function(t){return"number"==typeof t&&!Number.isNaN(t)}(t)||!d(t)||s(t)&&t.every(m)||u(t)&&Object.values(t).every(m)}function v(t){return m(t)?t:void 0}function y(t,e,a){return async function(...n){try{return await t(...n)}catch(t){if(!e)return;return await e(t)}finally{await(null==a?void 0:a())}}}async function f(t,e={},a={}){var n;if(!d(t))return;const o=u(t)&&t.consent||a.consent||(null==(n=a.collector)?void 0:n.consent),r=s(e)?e:[e];for(const e of r){const n=await y(w)(t,e,{...a,consent:o});if(d(n))return n}}async function w(t,e,a={}){const{collector:n,consent:o}=a;return(s(e)?e:[e]).reduce(async(e,r)=>{const i=await e;if(i)return i;const c=l(r)?{key:r}:r;if(!Object.keys(c).length)return;const{condition:u,consent:p,fn:m,key:h,loop:b,map:_,set:E,validate:k,value:x}=c;if(u&&!await y(u)(t,r,n))return;if(p&&!function(t,e={},a={}){const n={...e,...a},o={};let r=void 0===t;return Object.keys(n).forEach(e=>{n[e]&&(o[e]=!0,t&&t[e]&&(r=!0))}),!!r&&o}(p,o))return x;let j=d(x)?x:t;if(m&&(j=await y(m)(t,r,a)),h&&(j=g(t,h,x)),b){const[e,n]=b,o="this"===e?[t]:await f(t,e,a);s(o)&&(j=(await Promise.all(o.map(t=>f(t,n,a)))).filter(d))}else _?j=await Object.entries(_).reduce(async(e,[n,o])=>{const r=await e,i=await f(t,o,a);return d(i)&&(r[n]=i),r},Promise.resolve({})):E&&(j=await Promise.all(E.map(e=>w(t,e,a))));k&&!await y(k)(j)&&(j=void 0);const O=v(j);return d(O)?O:v(x)},Promise.resolve(void 0))}async function h(t,e,a,n,o){const r=u(e)?e:{},i=a.data?await f(t,a.data,{collector:o}):{},s=(null==n?void 0:n.data)?await f(t,n.data,{collector:o}):{},d=u(i)?i:{},l=u(s)?s:{};return c(c(r,d),l)}import{getEnv as b}from"@walkeros/web-core";function _(t,e,a={},n,o){const{window:r}=b(o);if(!e.measurementId)return;const i=u(n)?n:{},c=function(t,e){const a={};return e.includes("all")&&(e=["context","data","event","globals","source","user","version"]),e.forEach(e=>{let n=t[e]||{};"event"==e&&(n={id:t.id,timing:t.timing,trigger:t.trigger,entity:t.entity,action:t.action,group:t.group,count:t.count}),Object.entries(n).forEach(([t,n])=>{"context"==e&&(n=n[0]),a[`${e}_${t}`]=n})}),a}(t,a.include||e.include||["data"]),s={...c,...i};let d=t.name;!1!==e.snakeCase&&(d=function(t,e=!0){return e?t.replace(/\s+/g,"_").toLowerCase():t}(d)),s.send_to=e.measurementId,e.debug&&(s.debug_mode=!0);(0,r.gtag)("event",d,s)}import{getEnv as E}from"@walkeros/web-core";import{getEnv as k}from"@walkeros/web-core";import{getEnv as x}from"@walkeros/web-core";var j="dataLayer";function O(t,e,a){const{window:n,document:o}=x(a),{containerId:r,dataLayer:i,domain:c}=t,s=i||j;s===j?n.dataLayer=n.dataLayer||[]:n[s]=n[s]||[];n[s].push({"gtm.start":(new Date).getTime(),event:"gtm.js"}),e&&r&&function(t,e,a,n=globalThis.document){const o=a!=j?"&l="+a:"",r=n.createElement("script");r.src=e+t+o,n.head.appendChild(r)}(r,c||"https://www.googletagmanager.com/gtm.js?id=",s,o)}import{getEnv as X}from"@walkeros/web-core";import{getEnv as A}from"@walkeros/web-core";var I={},R={};e(R,{env:()=>C,events:()=>q,mapping:()=>$});var C={};e(C,{init:()=>L,push:()=>U,simulation:()=>S});var L={window:{gtag:void 0,dataLayer:[]},document:{createElement:()=>({src:"",setAttribute:()=>{},removeAttribute:()=>{}}),head:{appendChild:()=>{}}}},U={window:{gtag:Object.assign(()=>{},{}),dataLayer:[]},document:{createElement:()=>({src:"",setAttribute:()=>{},removeAttribute:()=>{}}),head:{appendChild:()=>{}}}},S=["call:window.gtag"],q={};function z(){const t=p("order complete");return["event","purchase",{transaction_id:t.data.id,value:t.data.total,tax:t.data.taxes,shipping:t.data.shipping,currency:"EUR",items:t.nested.filter(t=>"product"===t.entity).map(t=>({item_id:t.data.id,item_name:t.data.name,quantity:1})),send_to:"G-XXXXXX-1"}]}function P(){const t=p("product add");return["event","add_to_cart",{currency:"EUR",value:t.data.price,items:[{item_id:t.data.id,item_variant:t.data.color,quantity:1}],send_to:"G-XXXXXX-1"}]}function D(){const t=p("order complete");return["event","conversion",{send_to:"AW-XXXXXXXXX/CONVERSION_LABEL",currency:"EUR",value:t.data.total,transaction_id:t.data.id}]}function N(){const t=p("product view");return{event:"product_view",product_id:t.data.id,product_name:t.data.name,product_category:t.data.category,value:t.data.price,currency:"EUR"}}e(q,{adsConversion:()=>D,ga4AddToCart:()=>P,ga4Purchase:()=>z,gtmEvent:()=>N});var $={};e($,{adsConversion:()=>V,combinedPurchase:()=>G,config:()=>M,ga4AddToCart:()=>H,ga4Purchase:()=>T,gtmProductView:()=>B});var T={name:"purchase",settings:{ga4:{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:t=>u(t)&&"product"===t.entity,map:{item_id:"data.id",item_name:"data.name",quantity:{key:"data.quantity",value:1}}}]}}}},H={name:"add_to_cart",settings:{ga4:{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"}}}]}}}},V={name:"CONVERSION_LABEL",settings:{ads:{}},data:{map:{value:"data.total",currency:{value:"EUR",key:"data.currency"},transaction_id:"data.id"}}},B={name:"product_view",settings:{gtm:{}},data:{map:{product_id:"data.id",product_name:"data.name",product_category:"data.category",value:"data.price",currency:{value:"EUR",key:"data.currency"}}}},G={name:"purchase",settings:{ga4:{include:["data"]},ads:{},gtm:{}},data:{map:{transaction_id:"data.id",value:"data.total",currency:{value:"EUR",key:"data.currency"},items:{loop:["nested",{condition:t=>u(t)&&"product"===t.entity,map:{item_id:"data.id",item_name:"data.name",quantity:{value:1,key:"data.quantity"}}}]}}}},M={order:{complete:G},product:{add:H,view:B}},W=!1;function F(){W=!1}var J={marketing:["ad_storage","ad_user_data","ad_personalization"],functional:["analytics_storage"]},K={type:"google-gtag",config:{settings:{}},init({config:t,env:e}){const{settings:a={},loadScript:i}=t,{ga4:c,ads:s,gtm:d}=a;return(null==c?void 0:c.measurementId)&&function(t,e,a){const{window:i,document:c}=r(a),{measurementId:s,transport_url:d,server_container_url:u,pageview:l}=t;if(!s)return;e&&n(s,void 0,c),o(i);const g={};d&&(g.transport_url=d),u&&(g.server_container_url=u),!1===l&&(g.send_page_view=!1);const p=i.gtag;p("js",new Date),p("config",s,g)}(c,i,e),(null==s?void 0:s.conversionId)&&function(t,e,a){const{window:r,document:i}=E(a),{conversionId:c}=t;if(!c)return;t.currency||(t.currency="EUR"),e&&n(c,void 0,i),o(r);const s=r.gtag;s("js",new Date),s("config",c)}(s,i,e),(null==d?void 0:d.containerId)&&O(d,i,e),!!((null==c?void 0:c.measurementId)||(null==s?void 0:s.conversionId)||(null==d?void 0:d.containerId))&&t},async push(t,{config:e,mapping:a={},data:n,env:o,collector:r}){const{settings:i={}}=e,{ga4:c,ads:s,gtm:d}=i,l=a.settings||{},g=await h(t,n,e,c,r),p=await h(t,n,e,s,r),m=await h(t,n,e,d,r);(null==c?void 0:c.measurementId)&&_(t,c,l.ga4,g,o),(null==s?void 0:s.conversionId)&&a.name&&function(t,e,a={},n,o,r){const{conversionId:i,currency:c}=e,s=u(n)?n:{},d=a.label||o;if(!d)return;const l={send_to:`${i}/${d}`,currency:c||"EUR",...s},{window:g}=k(r);(0,g.gtag)("event","conversion",l)}(0,s,l.ads,p,a.name,o),(null==d?void 0:d.containerId)&&function(t,e,a={},n,o){const{window:r}=X(o),i={event:t.name};r.dataLayer.push({...i,...u(n)?n:t})}(t,0,l.gtm,m,o)},on(t,e){var a;if("consent"!==t||!e)return;const n=e,r=(null==(a=this.config)?void 0:a.settings)||{},{como:i=!0}=r;if(!i)return;const{window:c}=A(this.env),s=o(c);if(!s)return;const d=!0===i?J:i;if(!W){const t=new Set;if(Object.values(d).forEach(e=>{(Array.isArray(e)?e:[e]).forEach(e=>t.add(e))}),t.size>0){const e={};t.forEach(t=>{e[t]="denied"}),s("consent","default",e)}W=!0}const u={};Object.entries(n).forEach(([t,e])=>{const a=d[t];if(!a)return;const n=Array.isArray(a)?a:[a],o=e?"granted":"denied";n.forEach(t=>{u[t]=o})}),0!==Object.keys(u).length&&s("consent","update",u)}},Q=K;export{I as DestinationGtag,Q as default,K as destinationGtag,R as examples,F as resetConsentState};//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/shared/gtag.ts","../src/ga4/config.ts","../src/shared/parameters.ts","../src/shared/mapping.ts","../src/ga4/push.ts","../src/ads/config.ts","../src/ads/push.ts","../src/gtm/config.ts","../src/gtm/push.ts","../src/types/index.ts","../src/examples/index.ts","../src/examples/events.ts","../src/examples/mapping.ts","../src/index.ts"],"sourcesContent":["// Gtag script loading and initialization utilities\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(window: Window = globalThis.window): void {\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 as unknown[]).push(arguments);\n };\n }\n}\n","import type { WalkerOS } from '@walkeros/core';\nimport type { GA4Settings } from '../types';\nimport type { DestinationWeb } from '@walkeros/web-core';\nimport { addScript, initializeGtag } from '../shared/gtag';\nimport { getEnvironment } from '@walkeros/web-core';\n\nexport function initGA4(\n settings: GA4Settings,\n loadScript?: boolean,\n env?: DestinationWeb.Environment,\n): void {\n const { window, document } = getEnvironment(env);\n const { measurementId, transport_url, server_container_url, pageview } =\n settings;\n\n if (!measurementId) return;\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 as Gtag.Gtag;\n gtag('js', new Date());\n\n // gtag init call\n gtag('config', measurementId, gtagSettings);\n}\n","import type { WalkerOS } from '@walkeros/core';\nimport type { Include, Parameters } from '../types';\n\nexport function getParamsInclude(\n event: WalkerOS.DeepPartialEvent,\n include: Include,\n): Parameters {\n const params: Parameters = {};\n\n // Check for the 'all' group to add each group\n if (include.includes('all'))\n include = [\n 'context',\n 'data',\n 'event',\n 'globals',\n 'source',\n 'user',\n 'version',\n ];\n\n include.forEach((groupName) => {\n let group = event[groupName as keyof Omit<WalkerOS.Event, 'all'>] || {};\n\n // Create a fake group for event properties\n if (groupName == 'event')\n group = {\n id: event.id,\n timing: event.timing,\n trigger: event.trigger,\n entity: event.entity,\n action: event.action,\n group: event.group,\n count: event.count,\n };\n\n Object.entries(group).forEach(([key, val]) => {\n // Different value access for context\n if (groupName == 'context') val = (val as WalkerOS.OrderedProperties)[0];\n\n params[`${groupName}_${key}`] = val;\n });\n });\n\n return params;\n}\n","// Shared mapping utilities for all Google tools\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","import type { WalkerOS } from '@walkeros/core';\nimport type { GA4Settings, GA4Mapping, Parameters } from '../types';\nimport type { DestinationWeb } from '@walkeros/web-core';\nimport { isObject } from '@walkeros/core';\nimport { getParamsInclude } from '../shared/parameters';\nimport { normalizeEventName } from '../shared/mapping';\nimport { getEnvironment } from '@walkeros/web-core';\n\nexport function pushGA4Event(\n event: WalkerOS.Event,\n settings: GA4Settings,\n mapping: GA4Mapping = {},\n data: WalkerOS.AnyObject,\n env?: DestinationWeb.Environment,\n): void {\n const { window } = getEnvironment(env);\n\n if (!settings.measurementId) return;\n\n const eventData = isObject(data) ? data : {};\n\n const paramsInclude = getParamsInclude(\n event,\n // Add data to include by default\n mapping.include || settings.include || ['data'],\n );\n\n const eventParams: Parameters = {\n ...paramsInclude,\n ...eventData,\n };\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 as Gtag.Gtag;\n gtag('event', eventName, eventParams);\n}\n","import type { AdsSettings } from '../types';\nimport type { DestinationWeb } from '@walkeros/web-core';\nimport { addScript, initializeGtag } from '../shared/gtag';\nimport { getEnvironment } from '@walkeros/web-core';\n\nexport function initAds(\n settings: AdsSettings,\n loadScript?: boolean,\n env?: DestinationWeb.Environment,\n): void {\n const { window, document } = getEnvironment(env);\n const { conversionId } = settings;\n\n if (!conversionId) return;\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 as Gtag.Gtag;\n gtag('js', new Date());\n\n // gtag init call\n gtag('config', conversionId);\n}\n","import type { WalkerOS } from '@walkeros/core';\nimport type { AdsSettings, AdsMapping } from '../types';\nimport type { DestinationWeb } from '@walkeros/web-core';\nimport { isObject } from '@walkeros/core';\nimport { getEnvironment } from '@walkeros/web-core';\n\nexport function pushAdsEvent(\n event: WalkerOS.Event,\n settings: AdsSettings,\n mapping: AdsMapping = {},\n data: WalkerOS.AnyObject,\n mappingName?: string,\n env?: DestinationWeb.Environment,\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) return;\n\n const params: Gtag.CustomParams = {\n send_to: `${conversionId}/${conversionLabel}`,\n currency: currency || 'EUR',\n ...eventData,\n };\n\n const { window } = getEnvironment(env);\n const gtag = window.gtag as Gtag.Gtag;\n gtag('event', 'conversion', params);\n}\n","import type { GTMSettings } from '../types';\nimport type { DestinationWeb } from '@walkeros/web-core';\nimport { getEnvironment } from '@walkeros/web-core';\n\nconst defaultDataLayer = 'dataLayer';\nconst defaultDomain = 'https://www.googletagmanager.com/gtm.js?id=';\n\nexport function initGTM(\n settings: GTMSettings,\n loadScript?: boolean,\n env?: DestinationWeb.Environment,\n): void {\n const { window, document } = getEnvironment(env);\n const { containerId, dataLayer, domain } = settings;\n const dataLayerName = dataLayer || defaultDataLayer;\n\n // Initialize the dataLayer (default or custom name)\n if (dataLayerName === defaultDataLayer) {\n window.dataLayer = window.dataLayer || [];\n } else {\n window[dataLayerName] = (window[dataLayerName] as unknown[]) || [];\n }\n\n // Get the appropriate dataLayer array\n const dataLayerArray = window[dataLayerName] as unknown[];\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 } from '@walkeros/core';\nimport type { GTMSettings, GTMMapping } from '../types';\nimport type { DestinationWeb } from '@walkeros/web-core';\nimport { isObject } from '@walkeros/core';\nimport { getEnvironment } from '@walkeros/web-core';\n\nexport function pushGTMEvent(\n event: WalkerOS.Event,\n settings: GTMSettings,\n mapping: GTMMapping = {},\n data: WalkerOS.AnyObject,\n env?: DestinationWeb.Environment,\n): void {\n const { window } = getEnvironment(env);\n const obj = { event: event.name }; // Use the name mapping by default\n\n (window.dataLayer as unknown[]).push({\n ...obj,\n ...(isObject(data) ? data : event),\n });\n}\n","import type { Mapping as WalkerOSMapping } from '@walkeros/core';\nimport type { DestinationWeb } from '@walkeros/web-core';\n\n// Extend Window interface with specific dataLayer typing\ninterface 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\nexport type Destination = DestinationWeb.Destination<Settings, Mapping>;\nexport type Config = DestinationWeb.Config<Settings, Mapping>;\n\n// Unified settings for all Google tools\nexport interface Settings {\n // GA4 settings\n ga4?: GA4Settings;\n // Google Ads settings\n ads?: AdsSettings;\n // GTM settings\n gtm?: GTMSettings;\n}\n\n// GA4-specific settings\nexport interface GA4Settings {\n measurementId: string;\n debug?: boolean;\n include?: Include;\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 {\n conversionId: string;\n currency?: string;\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 {\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 include?: Include;\n}\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 Include = Array<\n | 'all'\n | 'context'\n | 'data'\n | 'event'\n | 'globals'\n | 'source'\n | 'user'\n | 'version'\n>;\n\nexport type Parameters = Gtag.ControlParams &\n Gtag.EventParams &\n Gtag.CustomParams;\n","export * as events from './events';\nexport * as mapping from './mapping';\n","import { getEvent } from '@walkeros/core';\n\n// GA4 Purchase Event Example\nexport function ga4Purchase(): unknown[] {\n const event = getEvent('order complete');\n\n return [\n 'event',\n 'purchase',\n {\n transaction_id: event.data.id,\n value: event.data.total,\n tax: event.data.taxes,\n shipping: event.data.shipping,\n currency: 'EUR',\n items: event.nested\n .filter((item) => item.entity === 'product')\n .map((item) => ({\n item_id: item.data.id,\n item_name: item.data.name,\n quantity: 1,\n })),\n send_to: 'G-XXXXXX-1',\n },\n ];\n}\n\n// GA4 Add to Cart Event Example\nexport function ga4AddToCart(): unknown[] {\n const event = getEvent('product add');\n\n return [\n 'event',\n 'add_to_cart',\n {\n currency: 'EUR',\n value: event.data.price,\n items: [\n {\n item_id: event.data.id,\n item_variant: event.data.color,\n quantity: 1,\n },\n ],\n send_to: 'G-XXXXXX-1',\n },\n ];\n}\n\n// Google Ads Conversion Event Example\nexport function adsConversion(): unknown[] {\n const event = getEvent('order complete');\n\n return [\n 'event',\n 'conversion',\n {\n send_to: 'AW-XXXXXXXXX/CONVERSION_LABEL',\n currency: 'EUR',\n value: event.data.total,\n transaction_id: event.data.id,\n },\n ];\n}\n\n// GTM DataLayer Push Example\nexport function gtmEvent(): Record<string, unknown> {\n const event = getEvent('product view');\n\n return {\n event: 'product_view',\n product_id: event.data.id,\n product_name: event.data.name,\n product_category: event.data.category,\n value: event.data.price,\n currency: 'EUR',\n };\n}\n","import type { Mapping } from '@walkeros/core';\nimport type { DestinationGtag } from '..';\nimport { isObject } from '@walkeros/core';\n\n// GA4 Purchase Mapping\nexport const ga4Purchase: DestinationGtag.Rule = {\n name: 'purchase',\n settings: {\n ga4: {\n include: ['data', 'context'],\n },\n },\n data: {\n map: {\n transaction_id: 'data.id',\n value: 'data.total',\n tax: 'data.taxes',\n shipping: 'data.shipping',\n currency: { key: 'data.currency', value: 'EUR' },\n items: {\n loop: [\n 'nested',\n {\n condition: (entity) =>\n isObject(entity) && entity.entity === 'product',\n map: {\n item_id: 'data.id',\n item_name: 'data.name',\n quantity: { key: 'data.quantity', value: 1 },\n },\n },\n ],\n },\n },\n },\n};\n\n// GA4 Add to Cart Mapping\nexport const ga4AddToCart: DestinationGtag.Rule = {\n name: 'add_to_cart',\n settings: {\n ga4: {\n include: ['data'],\n },\n },\n data: {\n map: {\n currency: { value: 'EUR', key: 'data.currency' },\n value: 'data.price',\n items: {\n loop: [\n 'this',\n {\n map: {\n item_id: 'data.id',\n item_variant: 'data.color',\n quantity: { value: 1, key: 'data.quantity' },\n },\n },\n ],\n },\n },\n },\n};\n\n// Google Ads Conversion Mapping\nexport const adsConversion: DestinationGtag.Rule = {\n name: 'CONVERSION_LABEL', // This becomes the conversion label\n settings: {\n ads: {},\n },\n data: {\n map: {\n value: 'data.total',\n currency: { value: 'EUR', key: 'data.currency' },\n transaction_id: 'data.id',\n },\n },\n};\n\n// GTM Event Mapping\nexport const gtmProductView: DestinationGtag.Rule = {\n name: 'product_view',\n settings: {\n gtm: {},\n },\n data: {\n map: {\n product_id: 'data.id',\n product_name: 'data.name',\n product_category: 'data.category',\n value: 'data.price',\n currency: { value: 'EUR', key: 'data.currency' },\n },\n },\n};\n\n// Combined mapping for all tools\nexport const combinedPurchase: DestinationGtag.Rule = {\n name: 'purchase', // GA4 event name\n settings: {\n ga4: {\n include: ['data'],\n },\n ads: {}, // Will use 'purchase' as conversion label for ads\n gtm: {},\n },\n data: {\n map: {\n transaction_id: 'data.id',\n value: 'data.total',\n currency: { value: 'EUR', key: 'data.currency' },\n items: {\n loop: [\n 'nested',\n {\n condition: (entity) =>\n isObject(entity) && entity.entity === 'product',\n map: {\n item_id: 'data.id',\n item_name: 'data.name',\n quantity: { value: 1, key: 'data.quantity' },\n },\n },\n ],\n },\n },\n },\n};\n\n// Example configuration with all mappings\nexport const config = {\n order: { complete: combinedPurchase },\n product: {\n add: ga4AddToCart,\n view: gtmProductView,\n },\n} satisfies DestinationGtag.Rules;\n","import type { WalkerOS } from '@walkeros/core';\nimport type { Settings, Destination } from './types';\nimport { initGA4, pushGA4Event } from './ga4';\nimport { initAds, pushAdsEvent } from './ads';\nimport { initGTM, pushGTMEvent } from './gtm';\n\n// Types\nexport * as DestinationGtag from './types';\n\n// Examples\nexport * as examples from './examples';\n\nexport const destinationGtag: Destination = {\n type: 'google-gtag',\n\n config: { settings: {} },\n\n env: {\n window: {\n gtag: function (...args: unknown[]): void {},\n dataLayer: [] as unknown[],\n },\n document: {\n createElement: (tagName: string) => ({\n src: '',\n async: false,\n setAttribute: () => {},\n removeAttribute: () => {},\n }),\n head: {\n appendChild: () => {},\n },\n },\n },\n\n init({ config, env }) {\n const { settings = {} as Partial<Settings>, loadScript } = config;\n const { ga4, ads, gtm } = settings;\n\n // Initialize GA4 if configured\n if (ga4?.measurementId) {\n initGA4(ga4, loadScript, env);\n }\n\n // Initialize Google Ads if configured\n if (ads?.conversionId) {\n initAds(ads, loadScript, env);\n }\n\n // Initialize GTM if configured\n if (gtm?.containerId) {\n initGTM(gtm, loadScript, env);\n }\n\n // Fail if no tools are configured\n if (!ga4?.measurementId && !ads?.conversionId && !gtm?.containerId) {\n return false;\n }\n\n return config;\n },\n\n push(event, { config, mapping = {}, data, env }) {\n const { settings = {} } = config;\n const { ga4, ads, gtm } = settings;\n const eventMapping = mapping.settings || {};\n\n // Push to GA4 if configured\n if (ga4?.measurementId) {\n pushGA4Event(\n event,\n ga4,\n eventMapping.ga4,\n data as WalkerOS.AnyObject,\n env,\n );\n }\n\n // @TODO: Fix condition - should check for mapping.settings?.ads?.label || mapping.name\n // Currently requires mapping.name even when label is provided via settings.ads.label\n if (ads?.conversionId && mapping.name) {\n pushAdsEvent(\n event,\n ads,\n eventMapping.ads,\n data as WalkerOS.AnyObject,\n mapping.name,\n env,\n );\n }\n\n // Push to GTM if configured\n if (gtm?.containerId) {\n pushGTMEvent(\n event,\n gtm,\n eventMapping.gtm,\n data as WalkerOS.AnyObject,\n env,\n );\n }\n },\n};\n\nexport default destinationGtag;\n"],"mappings":"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","names":["document","w","document","getEnvironment","getEnvironment","document","getEnvironment","getEnvironment","document","addScript","getEnvironment","adsConversion","ga4AddToCart","ga4Purchase","ga4Purchase","ga4AddToCart","adsConversion","config"]}
|
|
1
|
+
{"version":3,"sources":["../src/shared/gtag.ts","../src/ga4/config.ts","../src/shared/parameters.ts","../src/shared/mapping.ts","../src/ga4/push.ts","../src/ads/config.ts","../src/ads/push.ts","../src/gtm/config.ts","../src/gtm/push.ts","../src/index.ts","../src/types/index.ts","../src/examples/index.ts","../src/examples/env.ts","../src/examples/events.ts","../src/examples/mapping.ts"],"sourcesContent":["// Gtag script loading and initialization utilities\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(window: Window): 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 as unknown[]).push(arguments);\n };\n }\n\n return w.gtag;\n}\n","import type { WalkerOS } from '@walkeros/core';\nimport type { GA4Settings } from '../types';\nimport type { DestinationWeb } from '@walkeros/web-core';\nimport { addScript, initializeGtag } from '../shared/gtag';\nimport { getEnv } from '@walkeros/web-core';\n\nexport function initGA4(\n settings: GA4Settings,\n loadScript?: boolean,\n env?: DestinationWeb.Env,\n): void {\n const { window, document } = getEnv(env);\n const { measurementId, transport_url, server_container_url, pageview } =\n settings;\n\n if (!measurementId) return;\n\n // Load the gtag script\n if (loadScript) addScript(measurementId, undefined, document as Document);\n\n // Initialize gtag infrastructure\n initializeGtag(window as 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 as Gtag.Gtag;\n gtag('js', new Date());\n\n // gtag init call\n gtag('config', measurementId, gtagSettings);\n}\n","import type { WalkerOS } from '@walkeros/core';\nimport type { Include, Parameters } from '../types';\n\nexport function getParamsInclude(\n event: WalkerOS.DeepPartialEvent,\n include: Include,\n): Parameters {\n const params: Parameters = {};\n\n // Check for the 'all' group to add each group\n if (include.includes('all'))\n include = [\n 'context',\n 'data',\n 'event',\n 'globals',\n 'source',\n 'user',\n 'version',\n ];\n\n include.forEach((groupName) => {\n let group = event[groupName as keyof Omit<WalkerOS.Event, 'all'>] || {};\n\n // Create a fake group for event properties\n if (groupName == 'event')\n group = {\n id: event.id,\n timing: event.timing,\n trigger: event.trigger,\n entity: event.entity,\n action: event.action,\n group: event.group,\n count: event.count,\n };\n\n Object.entries(group).forEach(([key, val]) => {\n // Different value access for context\n if (groupName == 'context') val = (val as WalkerOS.OrderedProperties)[0];\n\n params[`${groupName}_${key}`] = val;\n });\n });\n\n return params;\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 { WalkerOS } from '@walkeros/core';\nimport type { GA4Settings, GA4Mapping, Parameters } from '../types';\nimport type { DestinationWeb } from '@walkeros/web-core';\nimport { isObject } from '@walkeros/core';\nimport { getParamsInclude } from '../shared/parameters';\nimport { normalizeEventName } from '../shared/mapping';\nimport { getEnv } from '@walkeros/web-core';\n\nexport function pushGA4Event(\n event: WalkerOS.Event,\n settings: GA4Settings,\n mapping: GA4Mapping = {},\n data: WalkerOS.AnyObject,\n env?: DestinationWeb.Env,\n): void {\n const { window } = getEnv(env);\n\n if (!settings.measurementId) return;\n\n const eventData = isObject(data) ? data : {};\n\n const paramsInclude = getParamsInclude(\n event,\n // Add data to include by default\n mapping.include || settings.include || ['data'],\n );\n\n const eventParams: Parameters = {\n ...paramsInclude,\n ...eventData,\n };\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 as Gtag.Gtag;\n gtag('event', eventName, eventParams);\n}\n","import type { AdsSettings } from '../types';\nimport type { DestinationWeb } from '@walkeros/web-core';\nimport { addScript, initializeGtag } from '../shared/gtag';\nimport { getEnv } from '@walkeros/web-core';\n\nexport function initAds(\n settings: AdsSettings,\n loadScript?: boolean,\n env?: DestinationWeb.Env,\n): void {\n const { window, document } = getEnv(env);\n const { conversionId } = settings;\n\n if (!conversionId) return;\n\n // Default currency value\n if (!settings.currency) settings.currency = 'EUR';\n\n if (loadScript) addScript(conversionId, undefined, document as Document);\n\n // Initialize gtag infrastructure\n initializeGtag(window as Window);\n\n const gtag = window.gtag as Gtag.Gtag;\n gtag('js', new Date());\n\n // gtag init call\n gtag('config', conversionId);\n}\n","import type { WalkerOS } 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: WalkerOS.AnyObject,\n mappingName?: string,\n env?: DestinationWeb.Env,\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) return;\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 gtag('event', 'conversion', params);\n}\n","import type { GTMSettings } from '../types';\nimport type { DestinationWeb } from '@walkeros/web-core';\nimport { getEnv } from '@walkeros/web-core';\n\nconst defaultDataLayer = 'dataLayer';\nconst defaultDomain = 'https://www.googletagmanager.com/gtm.js?id=';\n\nexport function initGTM(\n settings: GTMSettings,\n loadScript?: boolean,\n env?: DestinationWeb.Env,\n): void {\n const { window, document } = getEnv(env);\n const { containerId, dataLayer, domain } = settings;\n const dataLayerName = dataLayer || defaultDataLayer;\n\n // Initialize the dataLayer (default or custom name)\n if (dataLayerName === defaultDataLayer) {\n window.dataLayer = window.dataLayer || [];\n } else {\n window[dataLayerName] = (window[dataLayerName] as unknown[]) || [];\n }\n\n // Get the appropriate dataLayer array\n const dataLayerArray = window[dataLayerName] as unknown[];\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(\n containerId,\n domain || defaultDomain,\n dataLayerName,\n document as Document,\n );\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 } from '@walkeros/core';\nimport type { GTMSettings, GTMMapping } from '../types';\nimport type { DestinationWeb } from '@walkeros/web-core';\nimport { isObject } from '@walkeros/core';\nimport { getEnv } from '@walkeros/web-core';\n\nexport function pushGTMEvent(\n event: WalkerOS.Event,\n settings: GTMSettings,\n mapping: GTMMapping = {},\n data: WalkerOS.AnyObject,\n env?: DestinationWeb.Env,\n): void {\n const { window } = getEnv(env);\n const obj = { event: event.name }; // Use the name mapping by default\n\n (window.dataLayer as unknown[]).push({\n ...obj,\n ...(isObject(data) ? data : event),\n });\n}\n","import type { WalkerOS, On, Collector } from '@walkeros/core';\nimport type { Settings, Destination, ConsentMapping } from './types';\nimport { initGA4, pushGA4Event } from './ga4';\nimport { initAds, pushAdsEvent } from './ads';\nimport { initGTM, pushGTMEvent } from './gtm';\nimport { getData } from './shared/mapping';\nimport { initializeGtag } from './shared/gtag';\nimport { getEnv } from '@walkeros/web-core';\n\n// Types\nexport * as DestinationGtag from './types';\n\n// Examples\nexport * as examples from './examples';\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// Default consent mapping: walkerOS consent groups → gtag consent parameters\nconst DEFAULT_CONSENT_MAPPING: ConsentMapping = {\n marketing: ['ad_storage', 'ad_user_data', 'ad_personalization'],\n functional: ['analytics_storage'],\n};\n\nexport const destinationGtag: Destination = {\n type: 'google-gtag',\n\n config: { settings: {} },\n\n init({ config, env }) {\n const { settings = {} as Partial<Settings>, loadScript } = config;\n const { ga4, ads, gtm } = settings;\n\n // Initialize GA4 if configured\n if (ga4?.measurementId) {\n initGA4(ga4, loadScript, env);\n }\n\n // Initialize Google Ads if configured\n if (ads?.conversionId) {\n initAds(ads, loadScript, env);\n }\n\n // Initialize GTM if configured\n if (gtm?.containerId) {\n initGTM(gtm, loadScript, env);\n }\n\n // Fail if no tools are configured\n if (!ga4?.measurementId && !ads?.conversionId && !gtm?.containerId) {\n return false;\n }\n\n return config;\n },\n\n async push(event, { config, mapping = {}, data, env, collector }) {\n const { settings = {} } = config;\n const { ga4, ads, gtm } = settings;\n const eventMapping = mapping.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, eventMapping.ga4, ga4Data, env);\n }\n\n // @TODO: Fix condition - should check for mapping.settings?.ads?.label || mapping.name\n // Currently requires mapping.name even when label is provided via settings.ads.label\n if (ads?.conversionId && mapping.name) {\n pushAdsEvent(event, ads, eventMapping.ads, adsData, mapping.name, env);\n }\n\n // Push to GTM if configured\n if (gtm?.containerId) {\n pushGTMEvent(event, gtm, eventMapping.gtm, gtmData, env);\n }\n },\n\n on(type, context) {\n // Only handle consent events\n if (type !== 'consent' || !context) return;\n\n const consent = context;\n\n // Access config directly from this destination instance\n const settings = this.config?.settings || {};\n const { como = true } = settings;\n\n // Skip if consent mode is disabled\n if (!como) return;\n\n // Ensure gtag is available\n const { window } = getEnv(this.env);\n const gtag = initializeGtag(window as Window);\n if (!gtag) return;\n\n // Determine consent mapping to use\n const consentMapping: ConsentMapping =\n como === true ? DEFAULT_CONSENT_MAPPING : como;\n\n // If this is the first consent call, set default to denied for all parameters\n if (!defaultConsentSet) {\n // Get all possible gtag parameters from the mapping\n const allGtagParams = new Set<string>();\n Object.values(consentMapping).forEach((params) => {\n const paramArray = Array.isArray(params) ? params : [params];\n paramArray.forEach((param) => allGtagParams.add(param));\n });\n\n // Only call default if we have parameters to set\n if (allGtagParams.size > 0) {\n const defaultConsent: Record<string, 'denied'> = {};\n allGtagParams.forEach((param) => {\n defaultConsent[param] = 'denied';\n });\n\n // Call default with all denied\n gtag('consent', 'default', defaultConsent);\n }\n\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 as WalkerOS.Consent).forEach(\n ([walkerOSGroup, granted]) => {\n const gtagParams = consentMapping[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\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\ninterface 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 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>;\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 // GA4 settings\n ga4?: GA4Settings;\n // Google Ads settings\n ads?: AdsSettings;\n // GTM settings\n gtm?: GTMSettings;\n}\n\n// GA4-specific settings\nexport interface GA4Settings extends BaseSettings {\n measurementId: string;\n debug?: boolean;\n include?: Include;\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}\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 include?: Include;\n}\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 Include = Array<\n | 'all'\n | 'context'\n | 'data'\n | 'event'\n | 'globals'\n | 'source'\n | 'user'\n | 'version'\n>;\n\nexport type Parameters = Gtag.ControlParams &\n Gtag.EventParams &\n Gtag.CustomParams;\n","export * as env from './env';\nexport * as events from './events';\nexport * as mapping from './mapping';\n","import type { Env } from '../types';\n\n/**\n * Example environment configurations for Gtag destination\n *\n * These environments provide standardized mock structures for testing\n * and development without requiring external dependencies.\n */\n\n// Simple no-op function for mocking\nconst noop = () => {};\n\nexport const init: Env | undefined = {\n window: {\n gtag: undefined as unknown as Env['window']['gtag'],\n dataLayer: [],\n },\n document: {\n createElement: () => ({\n src: '',\n setAttribute: () => {},\n removeAttribute: () => {},\n }),\n head: { appendChild: () => {} },\n },\n};\n\nexport const push: Env = {\n window: {\n gtag: Object.assign(noop, {\n // Add any gtag-specific properties if needed\n }) as unknown as Env['window']['gtag'],\n dataLayer: [] as unknown[],\n },\n document: {\n createElement: () => ({\n src: '',\n setAttribute: () => {},\n removeAttribute: () => {},\n }),\n head: { appendChild: () => {} },\n },\n};\n\nexport const simulation = [\n 'call:window.gtag', // Track gtag function calls\n];\n","import { getEvent } from '@walkeros/core';\n\n// GA4 Purchase Event Example\nexport function ga4Purchase(): unknown[] {\n const event = getEvent('order complete');\n\n return [\n 'event',\n 'purchase',\n {\n transaction_id: event.data.id,\n value: event.data.total,\n tax: event.data.taxes,\n shipping: event.data.shipping,\n currency: 'EUR',\n items: event.nested\n .filter((item) => item.entity === 'product')\n .map((item) => ({\n item_id: item.data.id,\n item_name: item.data.name,\n quantity: 1,\n })),\n send_to: 'G-XXXXXX-1',\n },\n ];\n}\n\n// GA4 Add to Cart Event Example\nexport function ga4AddToCart(): unknown[] {\n const event = getEvent('product add');\n\n return [\n 'event',\n 'add_to_cart',\n {\n currency: 'EUR',\n value: event.data.price,\n items: [\n {\n item_id: event.data.id,\n item_variant: event.data.color,\n quantity: 1,\n },\n ],\n send_to: 'G-XXXXXX-1',\n },\n ];\n}\n\n// Google Ads Conversion Event Example\nexport function adsConversion(): unknown[] {\n const event = getEvent('order complete');\n\n return [\n 'event',\n 'conversion',\n {\n send_to: 'AW-XXXXXXXXX/CONVERSION_LABEL',\n currency: 'EUR',\n value: event.data.total,\n transaction_id: event.data.id,\n },\n ];\n}\n\n// GTM DataLayer Push Example\nexport function gtmEvent(): Record<string, unknown> {\n const event = getEvent('product view');\n\n return {\n event: 'product_view',\n product_id: event.data.id,\n product_name: event.data.name,\n product_category: event.data.category,\n value: event.data.price,\n currency: 'EUR',\n };\n}\n","import type { Mapping } from '@walkeros/core';\nimport type { DestinationGtag } from '..';\nimport { isObject } from '@walkeros/core';\n\n// GA4 Purchase Mapping\nexport const ga4Purchase: DestinationGtag.Rule = {\n name: 'purchase',\n settings: {\n ga4: {\n include: ['data', 'context'],\n },\n },\n data: {\n map: {\n transaction_id: 'data.id',\n value: 'data.total',\n tax: 'data.taxes',\n shipping: 'data.shipping',\n currency: { key: 'data.currency', value: 'EUR' },\n items: {\n loop: [\n 'nested',\n {\n condition: (entity) =>\n isObject(entity) && entity.entity === 'product',\n map: {\n item_id: 'data.id',\n item_name: 'data.name',\n quantity: { key: 'data.quantity', value: 1 },\n },\n },\n ],\n },\n },\n },\n};\n\n// GA4 Add to Cart Mapping\nexport const ga4AddToCart: DestinationGtag.Rule = {\n name: 'add_to_cart',\n settings: {\n ga4: {\n include: ['data'],\n },\n },\n data: {\n map: {\n currency: { value: 'EUR', key: 'data.currency' },\n value: 'data.price',\n items: {\n loop: [\n 'this',\n {\n map: {\n item_id: 'data.id',\n item_variant: 'data.color',\n quantity: { value: 1, key: 'data.quantity' },\n },\n },\n ],\n },\n },\n },\n};\n\n// Google Ads Conversion Mapping\nexport const adsConversion: DestinationGtag.Rule = {\n name: 'CONVERSION_LABEL', // This becomes the conversion label\n settings: {\n ads: {},\n },\n data: {\n map: {\n value: 'data.total',\n currency: { value: 'EUR', key: 'data.currency' },\n transaction_id: 'data.id',\n },\n },\n};\n\n// GTM Event Mapping\nexport const gtmProductView: DestinationGtag.Rule = {\n name: 'product_view',\n settings: {\n gtm: {},\n },\n data: {\n map: {\n product_id: 'data.id',\n product_name: 'data.name',\n product_category: 'data.category',\n value: 'data.price',\n currency: { value: 'EUR', key: 'data.currency' },\n },\n },\n};\n\n// Combined mapping for all tools\nexport const combinedPurchase: DestinationGtag.Rule = {\n name: 'purchase', // GA4 event name\n settings: {\n ga4: {\n include: ['data'],\n },\n ads: {}, // Will use 'purchase' as conversion label for ads\n gtm: {},\n },\n data: {\n map: {\n transaction_id: 'data.id',\n value: 'data.total',\n currency: { value: 'EUR', key: 'data.currency' },\n items: {\n loop: [\n 'nested',\n {\n condition: (entity) =>\n isObject(entity) && entity.entity === 'product',\n map: {\n item_id: 'data.id',\n item_name: 'data.name',\n quantity: { value: 1, key: 'data.quantity' },\n },\n },\n ],\n },\n },\n },\n};\n\n// Example configuration with all mappings\nexport const config = {\n order: { complete: combinedPurchase },\n product: {\n add: ga4AddToCart,\n view: gtmProductView,\n },\n} satisfies DestinationGtag.Rules;\n"],"mappings":"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","names":["document","w","document","config","getEnv","getEnv","document","getEnv","getEnv","document","addScript","getEnv","getEnv","adsConversion","ga4AddToCart","ga4Purchase","ga4Purchase","ga4AddToCart","adsConversion","config","getEnv"]}
|
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": "0.
|
|
4
|
+
"version": "0.2.0",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"main": "./dist/index.js",
|
|
7
7
|
"module": "./dist/index.mjs",
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
"update": "npx npm-check-updates -u && npm update"
|
|
31
31
|
},
|
|
32
32
|
"dependencies": {
|
|
33
|
-
"@walkeros/web-core": "0.
|
|
33
|
+
"@walkeros/web-core": "0.2.0"
|
|
34
34
|
},
|
|
35
35
|
"repository": {
|
|
36
36
|
"url": "git+https://github.com/elbwalker/walkerOS.git",
|