@jenil_121/ga-bridge 1.0.7 → 1.0.8

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 CHANGED
@@ -25,4 +25,4 @@ This allows you to use Google Analytics as the source of truth and mirror the sa
25
25
  ### CDN (Recommended)
26
26
 
27
27
  ```html
28
- <script src="https://cdn.jsdelivr.net/npm/@jenil_121/ga-bridge@1.0.7/dist/twinalyze-ga-bridge.min.js"></script>
28
+ <script src="https://cdn.jsdelivr.net/npm/@jenil_121/ga-bridge@1.0.8/dist/twinalyze-ga-bridge.min.js"></script>
@@ -23,4 +23,6 @@
23
23
  // })(window);
24
24
 
25
25
 
26
- !function(e){"use strict";var t={debug:!1,forwardOnlyValidEvents:!0,addBridgeFlag:!0,bridgeFlagKey:"__from_bridge",installPollIntervalMs:100,installTimeoutMs:10000,maxRetryAttempts:3,retryDelayMs:500},n="__gaTwinalyzeBridgeInstalled",o=/^[A-Za-z][A-Za-z0-9_]{0,39}$/;function i(){if(!e.__twinalyzeBridge||!e.__twinalyzeBridge.debug)return;var t=Array.prototype.slice.call(arguments);t.unshift("[Twinalyze GA Bridge]"),console.log.apply(console,t)}function r(){var t=Array.prototype.slice.call(arguments);t.unshift("[Twinalyze GA Bridge]"),console.warn.apply(console,t)}function a(e){return e&&"object"==typeof e&&!Array.isArray(e)}function l(e){return"string"==typeof e&&o.test(e)}function g(){return e.twinalyze||e.TwinalyzeAnalytics||null}var c=[],d=!1;function s(e,t,n){return new Promise(function(o,i){!function r(){Promise.resolve().then(e).then(o).catch(function(e){1===t?i(e):(t--,setTimeout(r,n))})}()})}function f(e,t){return s(function(){var n=g();if(!n||"function"!=typeof n.track)throw new Error("twinalyze.track missing");i("Forwarding event:",e,t);return n.track(e,t)},t.retryAttempts||t.maxRetryAttempts,t.retryDelay||t.retryDelayMs).catch(function(e){r("Failed to forward event:",e)})}function p(){if(!d)return;for(;c.length>0;){var e=c.shift();f(e.eventName,e.params)}}function m(){if(e[n])return void i("Bridge already installed");if("function"!=typeof e.gtag)return void r("gtag not found");var t=g();if(!t||"function"!=typeof t.track)return void r("twinalyze.track not found");var o=e.gtag;e.gtag=function(){var n=Array.prototype.slice.call(arguments);i("gtag call:",n);"event"===n[0]&&(function(){var t=n[1],r=a(n[2])?Object.assign({},n[2]):{};if(l(t)===!1)return void(r("Invalid GA event name:",t),o.apply(e,n));if(t==="click"){i('Skipping forwarding "click" event to Twinalyze SDK');return o.apply(e,n)}t.addBridgeFlag&&(r[t.addBridgeFlag]=!0);d?f(t,r):c.push({eventName:t,params:r})})();return o.apply(e,n)},d=!0,e[n]=!0,i("Bridge installed successfully"),p()}function u(){var n=e.TwinalyzeGABridgeConfig||{};for(var o in t)n.hasOwnProperty(o)&&(t[o]=n[o]);i("Initializing bridge with config:",t),setTimeout(m,t.installPollIntervalMs||t.installWaitMs||100)}u()}(window);
26
+ // !function(e){"use strict";var t={debug:!1,forwardOnlyValidEvents:!0,addBridgeFlag:!0,bridgeFlagKey:"__from_bridge",installPollIntervalMs:100,installTimeoutMs:10000,maxRetryAttempts:3,retryDelayMs:500},n="__gaTwinalyzeBridgeInstalled",o=/^[A-Za-z][A-Za-z0-9_]{0,39}$/;function i(){if(!e.__twinalyzeBridge||!e.__twinalyzeBridge.debug)return;var t=Array.prototype.slice.call(arguments);t.unshift("[Twinalyze GA Bridge]"),console.log.apply(console,t)}function r(){var t=Array.prototype.slice.call(arguments);t.unshift("[Twinalyze GA Bridge]"),console.warn.apply(console,t)}function a(e){return e&&"object"==typeof e&&!Array.isArray(e)}function l(e){return"string"==typeof e&&o.test(e)}function g(){return e.twinalyze||e.TwinalyzeAnalytics||null}var c=[],d=!1;function s(e,t,n){return new Promise(function(o,i){!function r(){Promise.resolve().then(e).then(o).catch(function(e){1===t?i(e):(t--,setTimeout(r,n))})}()})}function f(e,t){return s(function(){var n=g();if(!n||"function"!=typeof n.track)throw new Error("twinalyze.track missing");i("Forwarding event:",e,t);return n.track(e,t)},t.retryAttempts||t.maxRetryAttempts,t.retryDelay||t.retryDelayMs).catch(function(e){r("Failed to forward event:",e)})}function p(){if(!d)return;for(;c.length>0;){var e=c.shift();f(e.eventName,e.params)}}function m(){if(e[n])return void i("Bridge already installed");if("function"!=typeof e.gtag)return void r("gtag not found");var t=g();if(!t||"function"!=typeof t.track)return void r("twinalyze.track not found");var o=e.gtag;e.gtag=function(){var n=Array.prototype.slice.call(arguments);i("gtag call:",n);"event"===n[0]&&(function(){var t=n[1],r=a(n[2])?Object.assign({},n[2]):{};if(l(t)===!1)return void(r("Invalid GA event name:",t),o.apply(e,n));if(t==="click"){i('Skipping forwarding "click" event to Twinalyze SDK');return o.apply(e,n)}t.addBridgeFlag&&(r[t.addBridgeFlag]=!0);d?f(t,r):c.push({eventName:t,params:r})})();return o.apply(e,n)},d=!0,e[n]=!0,i("Bridge installed successfully"),p()}function u(){var n=e.TwinalyzeGABridgeConfig||{};for(var o in t)n.hasOwnProperty(o)&&(t[o]=n[o]);i("Initializing bridge with config:",t),setTimeout(m,t.installPollIntervalMs||t.installWaitMs||100)}u()}(window);
27
+
28
+ !function(global){"use strict";var DEFAULTS={debug:!1,forwardOnlyValidEvents:!0,addBridgeFlag:!0,bridgeFlagKey:"__from_bridge",gaEventTimeoutMs:2e3,sdkPollIntervalMs:250,sdkInitTimeoutMs:3e4,maxRetryAttempts:3,retryDelayMs:500,replayExistingDataLayerEvents:!1},BRIDGE_INSTALLED_KEY="__gaTwinalyzeBridgeInstalled",SDK_READY_KEY="__gaTwinalyzeBridgeSdkReady",DL_HOOKED_KEY="__twinalyzeBridgeHooked",GA_EVENT_NAME_RE=/^[A-Za-z][A-Za-z0-9_]{0,39}$/,debug=DEFAULTS.debug,eventQueue=[];function log(){if(!debug)return;var args=Array.prototype.slice.call(arguments);args.unshift("[Twinalyze GA Bridge]"),console.log.apply(console,args)}function warn(){var args=Array.prototype.slice.call(arguments);args.unshift("[Twinalyze GA Bridge]"),console.warn.apply(console,args)}function isObject(value){return value&&"object"==typeof value&&!Array.isArray(value)}function isValidGaEventName(name){return"string"==typeof name&&GA_EVENT_NAME_RE.test(name)}function cloneObject(obj){var out={};if(!isObject(obj))return out;for(var key in obj)Object.prototype.hasOwnProperty.call(obj,key)&&(out[key]=obj[key]);return out}function getTwinalyzeSdk(){return global.twinalyze||global.TwinalyzeAnalytics||null}function retry(fn,attemptsLeft,delayMs){return new Promise(function(resolve,reject){function attempt(){Promise.resolve().then(fn).then(resolve).catch(function(err){attemptsLeft<=1?(reject(err),0):(attemptsLeft-=1,setTimeout(attempt,delayMs))})}attempt()})}function forwardToTwinalyze(eventName,params){return retry(function(){var sdk=getTwinalyzeSdk();if(!sdk||"function"!=typeof sdk.track)throw new Error("twinalyze.track missing");return log("Forwarding event:",eventName,params),sdk.track(eventName,params)},DEFAULTS.maxRetryAttempts,DEFAULTS.retryDelayMs).catch(function(err){warn("Failed to forward event:",eventName,err&&err.message?err.message:err)})}function flushQueue(){if(global[SDK_READY_KEY]&&eventQueue.length)for(;eventQueue.length>0;){var ev=eventQueue.shift();forwardToTwinalyze(ev.eventName,ev.params)}}function markWrapped(params){if(isObject(params))try{Object.defineProperty(params,"__twinalyzeBridgeWrapped",{value:!0,configurable:!0,enumerable:!1})}catch(e){params.__twinalyzeBridgeWrapped=!0}}function isWrapped(params){return!!(params&&params.__twinalyzeBridgeWrapped)}function buildForwarder(eventName,originalParams){var forwarded=!1,forwardParams=cloneObject(originalParams);return DEFAULTS.addBridgeFlag&&(forwardParams[DEFAULTS.bridgeFlagKey]=!0),function(){forwarded||(forwarded=!0,global[SDK_READY_KEY]?forwardToTwinalyze(eventName,forwardParams):(eventQueue.push({eventName:eventName,params:forwardParams}),log("Queued event until SDK becomes ready:",eventName,forwardParams)))}}function normalizeDataLayerItem(item){if(Array.isArray(item))return item;if(item&&"object"==typeof item&&"number"==typeof item.length&&"string"!=typeof item)try{return Array.prototype.slice.call(item)}catch(e){return null}return null}function processDataLayerItem(item){var arr=normalizeDataLayerItem(item);if(!arr)return item;var eventType=arr[0],eventName=arr[1],params=isObject(arr[2])?arr[2]:{};if("event"!==eventType)return item;if("click"===eventName)return log('Skipping forwarding GA event named "click"'),item;if(DEFAULTS.forwardOnlyValidEvents&&!isValidGaEventName(eventName))return warn("Invalid GA event name, forwarding only to GA:",eventName),item;if(isWrapped(params))return item;var originalCallback="function"==typeof params.event_callback?params.event_callback:null,timeoutMs="number"==typeof params.event_timeout?params.event_timeout:DEFAULTS.gaEventTimeoutMs,forwardOnce=buildForwarder(eventName,params);return params.event_callback=function(){try{originalCallback&&originalCallback.apply(this,arguments)}finally{forwardOnce()}},("number"!=typeof params.event_timeout)&&(params.event_timeout=timeoutMs),markWrapped(params),setTimeout(function(){forwardOnce()},timeoutMs+50),function(){try{item[2]=params}catch(e){}return item}()}function hookDataLayer(){var dl=global.dataLayer=global.dataLayer||[];if(dl[DL_HOOKED_KEY])return void log("dataLayer already hooked");var originalPush=dl.push;dl.push=function(){for(var i=0;i<arguments.length;i++)processDataLayerItem(arguments[i]);return originalPush.apply(dl,arguments)};try{Object.defineProperty(dl,DL_HOOKED_KEY,{value:!0,configurable:!1,enumerable:!1})}catch(e){dl[DL_HOOKED_KEY]=!0}if(DEFAULTS.replayExistingDataLayerEvents&&dl.length)for(var j=0;j<dl.length;j++)processDataLayerItem(dl[j]);log("dataLayer hooked successfully")}function waitForSdkAndFlush(){var warned=!1,startedAt=Date.now();!function poll(){var sdk=getTwinalyzeSdk();if(sdk&&"function"==typeof sdk.track)return global[SDK_READY_KEY]=!0,log("twinalyze.track detected"),void flushQueue();!warned&&Date.now()-startedAt>=DEFAULTS.sdkInitTimeoutMs&&(warned=!0,warn("Still waiting for Twinalyze SDK...")),setTimeout(poll,DEFAULTS.sdkPollIntervalMs)}()}function mergeConfig(){var config=global.TwinalyzeGABridgeConfig||{};for(var key in DEFAULTS)Object.prototype.hasOwnProperty.call(config,key)&&(DEFAULTS[key]=config[key]);debug=DEFAULTS.debug}function bootstrap(){global[BRIDGE_INSTALLED_KEY]||(mergeConfig(),hookDataLayer(),waitForSdkAndFlush(),global[BRIDGE_INSTALLED_KEY]=!0,log("Bridge installed successfully"))}bootstrap()}(window);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jenil_121/ga-bridge",
3
- "version": "1.0.7",
3
+ "version": "1.0.8",
4
4
  "description": "Twinalyze GA Bridge (GA → Twinalyze event forwarding)",
5
5
  "main": "dist/twinalyze-ga-bridge.min.js",
6
6
  "files": [