{ "version": 3, "sources": ["../../../../../../owl-nest/common/shadow/src/ga/types.ts", "../../../../../../owl-nest/common/shadow/src/ga/safePush.ts"], "sourcesContent": ["export enum BRAND_ACTION {\n IMPRESSION = 'Brand Impression',\n IMPRESSION_CLICKABLE = 'Brand Impression Clickable',\n CLICK = 'Brand click',\n ON_PAGE = 'Brands on page',\n}\n\nexport enum CATEGORY {\n BOUTIQUE = 'Boutique',\n CHECKOUT = 'Checkout',\n DISCOVER_ULULE = 'Discover Ulule',\n HOMEPAGE = 'Homepage',\n MEMBERSHIP_NEWS = 'Membership post',\n MEMBERSHIP_PAGE = 'Membership page',\n PARTNERS_OPERATIONS = 'Partners operations',\n PROJECT_FORM = 'project_form',\n PROJECT_PAGE = 'project_page',\n PROJECT_PROPOSAL_TRACKING = 'Project proposal',\n REGISTRATION = 'User registration',\n SOCIAL = 'social on Ulule',\n ULULE = 'Ulule',\n WIDGET = 'External widget',\n}\n\nexport enum EVENT_TYPE {\n BRAND = 'BRANDevent',\n GENERIC = 'GAevent',\n PROJECT_FORM_ERROR = 'projectFormError',\n SOCIAL = 'socialInt',\n TRANSACTION = 'transaction',\n}\n\nexport enum SITE {\n CHECKOUT = 'Checkout',\n ULULE = 'Ulule',\n WIDGET = 'External widget',\n CONNECT = 'Connect',\n}\n\nexport enum SOCIAL_NETWORK {\n FACEBOOK = 'Facebook',\n HYPERLINK = 'Hyperlink',\n LINKEDIN = 'Linkedin',\n MESSENGER = 'Messenger',\n NATIVE = 'Native',\n TWITTER = 'Twitter',\n ULULE = 'Ulule',\n WHATSAPP = 'WhatsApp',\n WIDGET = 'Widget',\n}\n\nexport const apiTagTypeToGTM = {\n facebook: 'poFBpixelID',\n google: 'poGApropertyID',\n tiktok: 'poTTpixelID',\n twitter: 'poTWpixelID',\n} as const\n\ntype AnalyticsTagType = (typeof apiTagTypeToGTM)[keyof typeof apiTagTypeToGTM]\n\nexport type AnalyticsTags = {\n [key in AnalyticsTagType]?: string\n}\n\nexport type BaseTracking<EVENT extends Partial<TrackingEvent> = Partial<TrackingEvent>> = {\n track: (event: EVENT) => void\n}\n\nexport type BrandEvent = {\n event: EVENT_TYPE.BRAND\n eventAction: BRAND_ACTION\n eventCategory: 'Brand visibility'\n eventLabel: string\n eventValue?: string\n logoId?: string\n nonInteractionEvent?: boolean\n linkUrl?: string\n eventTimeout?: number\n eventCallback?: () => void\n}\n\nexport type GenericEvent = {\n event: EVENT_TYPE.GENERIC\n eventCategory: CATEGORY\n pageCategory: string\n siteCategory: SITE\n eventAction: string\n eventValue?: string\n eventLabel?: string\n eventTimeout?: number\n eventCallback?: () => void\n}\n\nexport type SocialEvent = {\n event: EVENT_TYPE.SOCIAL\n eventCallback?: () => void\n eventCategory?: CATEGORY\n eventTimeout?: number\n socialAction: string\n socialNetwork: SOCIAL_NETWORK\n socialTarget: string\n ululeProjectId?: number\n eventAction?: string\n eventLabel?: string\n eventValue?: string\n}\n\nexport type TransactionEvent = {\n event: EVENT_TYPE.TRANSACTION\n eventCallback?: () => void\n transactionId: number\n transactionAffiliation: 'Ulule'\n transactionTotal: number\n transactionCurrencyCode: string\n transactionProducts?: TransactionProductEvent[]\n ululeProjectId: number\n}\n\nexport type TransactionProductEvent = {\n sku: number\n price: number\n quantity: number\n}\n\nexport type RecommandedEvent = {\n 0: 'event'\n 1: string\n 2: unknown\n eventCallback?: () => void\n}\n\nexport type EcommerceEvent = {\n event: string\n ecommerce: any\n eventCallback?: () => void\n}\n\nexport type TrackingEvent =\n | GenericEvent\n | SocialEvent\n | TransactionEvent\n | BrandEvent\n | RecommandedEvent\n | EcommerceEvent\n", "import { EVENT_TYPE, TrackingEvent } from './types'\n\nexport type SafePush = <EVENT extends TrackingEvent = TrackingEvent>(event: EVENT) => void\n\nexport function safePusher(gtmContainerId?: string) {\n return <EVENT extends TrackingEvent = TrackingEvent>(event: EVENT): void => {\n if (gtmContainerId === undefined) {\n console.warn('[shadow] tracking was not initialized (need gtmContainerId)')\n }\n\n if (window.dataLayer === undefined || window.google_tag_manager === undefined) {\n return simulatePush(event)\n }\n\n if (\n 'event' in event &&\n event.event === EVENT_TYPE.GENERIC &&\n !(window.ga !== undefined && window.ga.loaded === true)\n ) {\n simulatePush(event)\n } else {\n const callback = event.eventCallback\n const safeEvent: any = { ...event }\n if (callback) {\n // since the callback can be called by the `eventCallback` and\n // `setTimeout`, we want to make sure `callback` is only called once\n const onceCallback = once(callback)\n if (!safeEvent.eventTimeout) {\n safeEvent.eventTimeout = 1000\n }\n\n safeEvent.eventCallback = (containerId: string) => {\n /**\n * A bit of context: the native `eventCallback()` has an `id` argument\n * that represents the container within which it is executed.\n * Shimmed/stubbed versions do not have access to the ID, thus not passing\n * the argument. We test that through `!containerId` and manually execute\n * the callback in that case.\n */\n if (containerId === gtmContainerId || !containerId) {\n onceCallback()\n }\n }\n\n /**\n * As a last resort, force manually invoking callback after 1s. This is for cases where:\n * - GTM fails to finish sending the event or timing out\n * - GTM is stubbed by the browser (hi there, strict mode Firefox) and the callback isn't naturally called\n */\n setTimeout(onceCallback, 1200)\n }\n window.dataLayer.push(safeEvent)\n }\n }\n}\n\n// return a function that will call `callback` only once\nfunction once(callback: () => void): () => void {\n let called = false\n return () => {\n if (!called) {\n called = true\n callback()\n }\n }\n}\n\nfunction simulatePush(event: TrackingEvent): void {\n // try to push anyway, we never know, but without callback\n if (window.dataLayer !== undefined) {\n window.dataLayer.push({\n ...event,\n eventCallback: undefined,\n })\n }\n\n // run the callback ourselves\n const callback = event.eventCallback\n if (callback !== undefined) {\n setTimeout(callback, 0)\n }\n}\n"], "mappings": "6DAAAA,IAmDO,IAAMC,EAAkB,CAC7B,SAAU,cACV,OAAQ,iBACR,OAAQ,cACR,QAAS,aACX,ECxDAC,IAIO,SAASC,EAAWC,EAAyB,CAClD,OAAqDC,GAAuB,CAK1E,GAJID,IAAmB,QACrB,QAAQ,KAAK,6DAA6D,EAGxE,OAAO,YAAc,QAAa,OAAO,qBAAuB,OAClE,OAAOE,EAAaD,CAAK,EAG3B,GACE,UAAWA,GACXA,EAAM,mBACN,EAAE,OAAO,KAAO,QAAa,OAAO,GAAG,SAAW,IAElDC,EAAaD,CAAK,MACb,CACL,IAAME,EAAWF,EAAM,cACjBG,EAAiBC,EAAA,GAAKJ,GAC5B,GAAIE,EAAU,CAGZ,IAAMG,EAAeC,EAAKJ,CAAQ,EAC7BC,EAAU,eACbA,EAAU,aAAe,KAG3BA,EAAU,cAAiBI,GAAwB,EAQ7CA,IAAgBR,GAAkB,CAACQ,IACrCF,EAAa,CAEjB,EAOA,WAAWA,EAAc,IAAI,CAC/B,CACA,OAAO,UAAU,KAAKF,CAAS,CACjC,CACF,CACF,CAGA,SAASG,EAAKJ,EAAkC,CAC9C,IAAIM,EAAS,GACb,MAAO,IAAM,CACNA,IACHA,EAAS,GACTN,EAAS,EAEb,CACF,CAEA,SAASD,EAAaD,EAA4B,CAE5C,OAAO,YAAc,QACvB,OAAO,UAAU,KAAKS,EAAAL,EAAA,GACjBJ,GADiB,CAEpB,cAAe,MACjB,EAAC,EAIH,IAAME,EAAWF,EAAM,cACnBE,IAAa,QACf,WAAWA,EAAU,CAAC,CAE1B", "names": ["init_define_process_env", "apiTagTypeToGTM", "init_define_process_env", "safePusher", "gtmContainerId", "event", "simulatePush", "callback", "safeEvent", "__spreadValues", "onceCallback", "once", "containerId", "called", "__spreadProps"] }