@walkeros/web-source-datalayer 4.4.0-next-1785261149472 → 4.4.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/CHANGELOG.md CHANGED
@@ -1,14 +1,25 @@
1
1
  # @walkeros/web-source-datalayer
2
2
 
3
- ## 4.4.0-next-1785261149472
3
+ ## 4.4.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 87937a8: Web sources now send events through the collector's source pipeline,
8
+ so `next`/`before` chains, source mapping, `cache`, `state` and per-source
9
+ status work on web like they do on server. Walker commands are unaffected and
10
+ still go straight to the collector. Flows that already configured these fields
11
+ on a web source will see them take effect for the first time.
4
12
 
5
13
  ### Patch Changes
6
14
 
7
15
  - Updated dependencies [393b942]
8
16
  - Updated dependencies [6c89afb]
9
17
  - Updated dependencies [393b942]
10
- - @walkeros/collector@4.4.0-next-1785261149472
11
- - @walkeros/core@4.4.0-next-1785261149472
18
+ - Updated dependencies [35756dd]
19
+ - Updated dependencies [034b1de]
20
+ - Updated dependencies [d00e2bd]
21
+ - @walkeros/collector@4.4.0
22
+ - @walkeros/core@4.4.0
12
23
 
13
24
  ## 4.3.2
14
25
 
@@ -1 +1 @@
1
- "use strict";var Destination=(()=>{var r=Object.defineProperty,t=Object.getOwnPropertyDescriptor,n=Object.getOwnPropertyNames,e=Object.prototype.hasOwnProperty,o={};((t,n)=>{for(var e in n)r(t,e,{get:n[e],enumerable:!0})})(o,{SourceDataLayer:()=>A,default:()=>L,sourceDataLayer:()=>j});var a=Object.defineProperty,u=(r,t)=>{for(var n in t)a(r,n,{get:t[n],enumerable:!0})};function i(r,t){if("collector"===r)return"collector";if(!t)throw new Error(`stepId(${r}) requires an id`);return`${r}.${t}`}u({},{stepId:()=>i});function f(r,t){const n=r.destinations[t];if(!n)throw new Error(`Destination not found: ${t}`);return n}u({},{getDestination:()=>f});u({},{Level:()=>c});var l,c=((l=c||{})[l.ERROR=0]="ERROR",l[l.WARN=1]="WARN",l[l.INFO=2]="INFO",l[l.DEBUG=3]="DEBUG",l);function s(r,t){const n=r.transformers[t];if(!n)throw new Error(`Transformer not found: ${t}`);return n}u({},{getTransformer:()=>s});function y(r,t){const n=r.sources[t];if(!n)throw new Error(`Source not found: ${t}`);return n}u({},{getSource:()=>y});function d(r,t){const n=r.stores[t];if(!n)throw new Error(`Store not found: ${t}`);return n}async function g(r,t){return await r.get(t)}function p(r){return Array.isArray(r)}function b(r){return"object"==typeof r&&null!==r&&!p(r)&&"[object Object]"===Object.prototype.toString.call(r)}function m(r){return"string"==typeof r}function w(r,t,n){return function(...e){try{return r(...e)}catch(r){if(!t)return;return t(r)}finally{null==n||n()}}}u({},{getStore:()=>d,getStoreValue:()=>g});var h=!1;function v(r,t={},n){if(t.filter){if(!0===w(()=>t.filter(n),()=>!1)())return}const e=function(r){if(b(r)&&m(r.event)){const{event:t,...n}=r;return{name:t,...n}}if(p(r)&&r.length>=2)return $(r);if(t=r,null!=t&&"object"==typeof t&&"length"in t&&"number"==typeof t.length&&t.length>0){return $(Array.from(r))}var t;return null}(n);if(!e)return;const o=`${t.prefix||"dataLayer"} ${e.name}`,{name:a,...u}=e,i={name:o,data:u};w(()=>r(i),()=>{})()}function $(r){const[t,n,e]=r;if(!m(t))return null;let o,a={};switch(t){case"consent":if(!m(n)||r.length<3)return null;if("default"!==n&&"update"!==n)return null;if(!b(e)||null===e)return null;o=`${t} ${n}`,a={...e};break;case"event":if(!m(n))return null;o=n,b(e)&&(a={...e});break;case"config":if(!m(n))return null;o=`${t} ${n}`,b(e)&&(a={...e});break;case"set":if(m(n))o=`${t} ${n}`,b(e)&&(a={...e});else{if(!b(n))return null;o=`${t} custom`,a={...n}}break;default:return null}return{name:o,...a}}var O,A={},j=async r=>{const{config:t,env:n}=r,{elb:e,window:o}=n,a={name:"dataLayer",prefix:"dataLayer",...null==t?void 0:t.settings},u={settings:a};let i=0;return{type:"dataLayer",config:u,push:e,on:async r=>{if("run"===r&&o&&i>0){!function(r,t,n,e=globalThis.window){const o=t.settings,a=e[(null==o?void 0:o.name)||"dataLayer"];if(Array.isArray(a)&&!h){h=!0;try{const t=null!=n?n:a.length;for(let n=0;n<t;n++)v(r,o,a[n])}finally{h=!1}}}(e,u,i,o),i=0}},init:()=>{if(!o)return;const r=a.name||"dataLayer",t=o[r];i=Array.isArray(t)?t.length:0;!function(r,t,n=globalThis.window){const e=t.settings,o=(null==e?void 0:e.name)||"dataLayer";n[o]||(n[o]=[]);const a=n[o];if(!Array.isArray(a))return;const u=a.push.bind(a);a.push=function(...t){if(h)return u(...t);h=!0;try{for(const n of t)v(r,e,n)}finally{h=!1}return u(...t)}}(e,u,o)},destroy:async()=>{const r=a.name||"dataLayer";o&&o[r]&&Array.isArray(o[r])}}},L=j;return O=o,((o,a,u,i)=>{if(a&&"object"==typeof a||"function"==typeof a)for(let f of n(a))e.call(o,f)||f===u||r(o,f,{get:()=>a[f],enumerable:!(i=t(a,f))||i.enumerable});return o})(r({},"__esModule",{value:!0}),O)})();
1
+ "use strict";var Destination=(()=>{var r=Object.defineProperty,t=Object.getOwnPropertyDescriptor,n=Object.getOwnPropertyNames,e=Object.prototype.hasOwnProperty,o={};((t,n)=>{for(var e in n)r(t,e,{get:n[e],enumerable:!0})})(o,{SourceDataLayer:()=>A,default:()=>L,sourceDataLayer:()=>j});var a=Object.defineProperty,u=(r,t)=>{for(var n in t)a(r,n,{get:t[n],enumerable:!0})};function i(r,t){if("collector"===r)return"collector";if(!t)throw new Error(`stepId(${r}) requires an id`);return`${r}.${t}`}u({},{stepId:()=>i});function f(r,t){const n=r.destinations[t];if(!n)throw new Error(`Destination not found: ${t}`);return n}u({},{getDestination:()=>f});u({},{Level:()=>c});var l,c=((l=c||{})[l.ERROR=0]="ERROR",l[l.WARN=1]="WARN",l[l.INFO=2]="INFO",l[l.DEBUG=3]="DEBUG",l);function s(r,t){const n=r.transformers[t];if(!n)throw new Error(`Transformer not found: ${t}`);return n}u({},{getTransformer:()=>s});function y(r,t){const n=r.sources[t];if(!n)throw new Error(`Source not found: ${t}`);return n}u({},{getSource:()=>y});function d(r,t){const n=r.stores[t];if(!n)throw new Error(`Store not found: ${t}`);return n}async function g(r,t){return await r.get(t)}function p(r){return Array.isArray(r)}function b(r){return"object"==typeof r&&null!==r&&!p(r)&&"[object Object]"===Object.prototype.toString.call(r)}function h(r){return"string"==typeof r}function m(r,t,n){return function(...e){try{return r(...e)}catch(r){if(!t)return;return t(r)}finally{null==n||n()}}}u({},{getStore:()=>d,getStoreValue:()=>g});var w=!1;function v(r,t={},n){if(t.filter){if(!0===m(()=>t.filter(n),()=>!1)())return}const e=function(r){if(b(r)&&h(r.event)){const{event:t,...n}=r;return{name:t,...n}}if(p(r)&&r.length>=2)return $(r);if(t=r,null!=t&&"object"==typeof t&&"length"in t&&"number"==typeof t.length&&t.length>0){return $(Array.from(r))}var t;return null}(n);if(!e)return;const o=`${t.prefix||"dataLayer"} ${e.name}`,{name:a,...u}=e,i={name:o,data:u};m(()=>r(i),()=>{})()}function $(r){const[t,n,e]=r;if(!h(t))return null;let o,a={};switch(t){case"consent":if(!h(n)||r.length<3)return null;if("default"!==n&&"update"!==n)return null;if(!b(e)||null===e)return null;o=`${t} ${n}`,a={...e};break;case"event":if(!h(n))return null;o=n,b(e)&&(a={...e});break;case"config":if(!h(n))return null;o=`${t} ${n}`,b(e)&&(a={...e});break;case"set":if(h(n))o=`${t} ${n}`,b(e)&&(a={...e});else{if(!b(n))return null;o=`${t} custom`,a={...n}}break;default:return null}return{name:o,...a}}var O,A={},j=async r=>{const{config:t,env:n}=r,{elb:e,push:o,window:a}=n,u={name:"dataLayer",prefix:"dataLayer",...null==t?void 0:t.settings},i={settings:u};let f=0;return{type:"dataLayer",config:i,push:e,on:async r=>{if("run"===r&&a&&f>0){!function(r,t,n,e=globalThis.window){const o=t.settings,a=e[(null==o?void 0:o.name)||"dataLayer"];if(Array.isArray(a)&&!w){w=!0;try{const t=null!=n?n:a.length;for(let n=0;n<t;n++)v(r,o,a[n])}finally{w=!1}}}(o,i,f,a),f=0}},init:()=>{if(!a)return;const r=u.name||"dataLayer",t=a[r];f=Array.isArray(t)?t.length:0;!function(r,t,n=globalThis.window){const e=t.settings,o=(null==e?void 0:e.name)||"dataLayer";n[o]||(n[o]=[]);const a=n[o];if(!Array.isArray(a))return;const u=a.push.bind(a);a.push=function(...t){if(w)return u(...t);w=!0;try{for(const n of t)v(r,e,n)}finally{w=!1}return u(...t)}}(o,i,a)},destroy:async()=>{const r=u.name||"dataLayer";a&&a[r]&&Array.isArray(a[r])}}},L=j;return O=o,((o,a,u,i)=>{if(a&&"object"==typeof a||"function"==typeof a)for(let f of n(a))e.call(o,f)||f===u||r(o,f,{get:()=>a[f],enumerable:!(i=t(a,f))||i.enumerable});return o})(r({},"__esModule",{value:!0}),O)})();
package/dist/index.es5.js CHANGED
@@ -1 +1 @@
1
- "use strict";function _array_like_to_array(r,t){(null==t||t>r.length)&&(t=r.length);for(var e=0,n=new Array(t);e<t;e++)n[e]=r[e];return n}function _array_with_holes(r){if(Array.isArray(r))return r}function _array_without_holes(r){if(Array.isArray(r))return _array_like_to_array(r)}function asyncGeneratorStep(r,t,e,n,o,a,i){try{var u=r[a](i),c=u.value}catch(r){return void e(r)}u.done?t(c):Promise.resolve(c).then(n,o)}function _async_to_generator(r){return function(){var t=this,e=arguments;return new Promise(function(n,o){var a=r.apply(t,e);function i(r){asyncGeneratorStep(a,n,o,i,u,"next",r)}function u(r){asyncGeneratorStep(a,n,o,i,u,"throw",r)}i(void 0)})}}function _define_property(r,t,e){return t in r?Object.defineProperty(r,t,{value:e,enumerable:!0,configurable:!0,writable:!0}):r[t]=e,r}function _iterable_to_array(r){if("undefined"!=typeof Symbol&&null!=r[Symbol.iterator]||null!=r["@@iterator"])return Array.from(r)}function _iterable_to_array_limit(r,t){var e=null==r?null:"undefined"!=typeof Symbol&&r[Symbol.iterator]||r["@@iterator"];if(null!=e){var n,o,a=[],i=!0,u=!1;try{for(e=e.call(r);!(i=(n=e.next()).done)&&(a.push(n.value),!t||a.length!==t);i=!0);}catch(r){u=!0,o=r}finally{try{i||null==e.return||e.return()}finally{if(u)throw o}}return a}}function _non_iterable_rest(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _non_iterable_spread(){throw new TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _object_spread(r){for(var t=1;t<arguments.length;t++){var e=null!=arguments[t]?arguments[t]:{},n=Object.keys(e);"function"==typeof Object.getOwnPropertySymbols&&(n=n.concat(Object.getOwnPropertySymbols(e).filter(function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable}))),n.forEach(function(t){_define_property(r,t,e[t])})}return r}function _object_without_properties(r,t){if(null==r)return{};var e,n,o,a={};if("undefined"!=typeof Reflect&&Reflect.ownKeys){for(e=Reflect.ownKeys(Object(r)),o=0;o<e.length;o++)n=e[o],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(r,n)&&(a[n]=r[n]);return a}if(a=_object_without_properties_loose(r,t),Object.getOwnPropertySymbols)for(e=Object.getOwnPropertySymbols(r),o=0;o<e.length;o++)n=e[o],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(r,n)&&(a[n]=r[n]);return a}function _object_without_properties_loose(r,t){if(null==r)return{};var e,n,o={},a=Object.getOwnPropertyNames(r);for(n=0;n<a.length;n++)e=a[n],t.indexOf(e)>=0||Object.prototype.propertyIsEnumerable.call(r,e)&&(o[e]=r[e]);return o}function _sliced_to_array(r,t){return _array_with_holes(r)||_iterable_to_array_limit(r,t)||_unsupported_iterable_to_array(r,t)||_non_iterable_rest()}function _to_consumable_array(r){return _array_without_holes(r)||_iterable_to_array(r)||_unsupported_iterable_to_array(r)||_non_iterable_spread()}function _type_of(r){return r&&"undefined"!=typeof Symbol&&r.constructor===Symbol?"symbol":typeof r}function _unsupported_iterable_to_array(r,t){if(r){if("string"==typeof r)return _array_like_to_array(r,t);var e=Object.prototype.toString.call(r).slice(8,-1);return"Object"===e&&r.constructor&&(e=r.constructor.name),"Map"===e||"Set"===e?Array.from(e):"Arguments"===e||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(e)?_array_like_to_array(r,t):void 0}}function _ts_generator(r,t){var e,n,o,a={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]},i=Object.create(("function"==typeof Iterator?Iterator:Object).prototype),u=Object.defineProperty;return u(i,"next",{value:c(0)}),u(i,"throw",{value:c(1)}),u(i,"return",{value:c(2)}),"function"==typeof Symbol&&u(i,Symbol.iterator,{value:function(){return this}}),i;function c(u){return function(c){return function(u){if(e)throw new TypeError("Generator is already executing.");for(;i&&(i=0,u[0]&&(a=0)),a;)try{if(e=1,n&&(o=2&u[0]?n.return:u[0]?n.throw||((o=n.return)&&o.call(n),0):n.next)&&!(o=o.call(n,u[1])).done)return o;switch(n=0,o&&(u=[2&u[0],o.value]),u[0]){case 0:case 1:o=u;break;case 4:return a.label++,{value:u[1],done:!1};case 5:a.label++,n=u[1],u=[0];continue;case 7:u=a.ops.pop(),a.trys.pop();continue;default:if(!(o=a.trys,(o=o.length>0&&o[o.length-1])||6!==u[0]&&2!==u[0])){a=0;continue}if(3===u[0]&&(!o||u[1]>o[0]&&u[1]<o[3])){a.label=u[1];break}if(6===u[0]&&a.label<o[1]){a.label=o[1],o=u;break}if(o&&a.label<o[2]){a.label=o[2],a.ops.push(u);break}o[2]&&a.ops.pop(),a.trys.pop();continue}u=t.call(r,a)}catch(r){u=[6,r],n=0}finally{e=o=0}if(5&u[0])throw u[1];return{value:u[0]?u[1]:void 0,done:!0}}([u,c])}}}var Destination=function(){var r=function(r,t){if("collector"===r)return"collector";if(!t)throw new Error("stepId(".concat(r,") requires an id"));return"".concat(r,".").concat(t)},t=function(r,t){var e=r.destinations[t];if(!e)throw new Error("Destination not found: ".concat(t));return e},e=function(r,t){var e=r.transformers[t];if(!e)throw new Error("Transformer not found: ".concat(t));return e},n=function(r,t){var e=r.sources[t];if(!e)throw new Error("Source not found: ".concat(t));return e},o=function(r,t){var e=r.stores[t];if(!e)throw new Error("Store not found: ".concat(t));return e},a=function(r,t){return _async_to_generator(function(){return _ts_generator(this,function(e){switch(e.label){case 0:return[4,r.get(t)];case 1:return[2,e.sent()]}})})()},i=function(r){return Array.isArray(r)},u=function(r){return"object"==(void 0===r?"undefined":_type_of(r))&&null!==r&&!i(r)&&"[object Object]"===Object.prototype.toString.call(r)},c=function(r){return"string"==typeof r},l=function(r,t,e){return function(){for(var n=arguments.length,o=new Array(n),a=0;a<n;a++)o[a]=arguments[a];try{return r.apply(void 0,_to_consumable_array(o))}catch(r){if(!t)return;return t(r)}finally{null==e||e()}}},f=function(r){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},e=arguments.length>2?arguments[2]:void 0;if(t.filter&&!0===l(function(){return t.filter(e)},function(){return!1})())return;var n=y(e);if(n){var o=t.prefix||"dataLayer",a="".concat(o," ").concat(n.name),i=(n.name,{name:a,data:_object_without_properties(n,["name"])});l(function(){return r(i)},function(){})()}},y=function(r){if(u(r)&&c(r.event))return _object_spread({name:r.event},_object_without_properties(r,["event"]));if(i(r)&&r.length>=2)return s(r);if(_(r)){var t=Array.from(r);return s(t)}return null},s=function(r){var t,e=_sliced_to_array(r,3),n=e[0],o=e[1],a=e[2];if(!c(n))return null;var i={};switch(n){case"consent":if(!c(o)||r.length<3)return null;if("default"!==o&&"update"!==o)return null;if(!u(a)||null===a)return null;t="".concat(n," ").concat(o),i=_object_spread({},a);break;case"event":if(!c(o))return null;t=o,u(a)&&(i=_object_spread({},a));break;case"config":if(!c(o))return null;t="".concat(n," ").concat(o),u(a)&&(i=_object_spread({},a));break;case"set":if(c(o))t="".concat(n," ").concat(o),u(a)&&(i=_object_spread({},a));else{if(!u(o))return null;t="".concat(n," custom"),i=_object_spread({},o)}break;default:return null}return _object_spread({name:t},i)},_=function(r){return null!=r&&"object"===(void 0===r?"undefined":_type_of(r))&&"length"in r&&"number"==typeof r.length&&r.length>0},p=Object.defineProperty,b=Object.getOwnPropertyDescriptor,d=Object.getOwnPropertyNames,v=Object.prototype.hasOwnProperty,h={};!function(r,t){for(var e in t)p(r,e,{get:t[e],enumerable:!0})}(h,{SourceDataLayer:function(){return A},default:function(){return P},sourceDataLayer:function(){return E}});var g=Object.defineProperty,m=function(r,t){for(var e in t)g(r,e,{get:t[e],enumerable:!0})};m({},{stepId:function(){return r}});m({},{getDestination:function(){return t}});m({},{Level:function(){return j}});var w,j=((w=j||{})[w.ERROR=0]="ERROR",w[w.WARN=1]="WARN",w[w.INFO=2]="INFO",w[w.DEBUG=3]="DEBUG",w);m({},{getTransformer:function(){return e}});m({},{getSource:function(){return n}});m({},{getStore:function(){return o},getStoreValue:function(){return a}});var O,S=!1,A={},E=function(r){return _async_to_generator(function(){var t,e,n,o,a,i,u,c,l;return _ts_generator(this,function(y){return t=r.config,e=r.env,n=e.elb,o=e.window,a=_object_spread({name:"dataLayer",prefix:"dataLayer"},null==t?void 0:t.settings),u=0,c=function(){if(o){var r=a.name||"dataLayer",t=o[r];u=Array.isArray(t)?t.length:0,function(r,t){var e=arguments.length>2&&void 0!==arguments[2]?arguments[2]:globalThis.window,n=t.settings,o=(null==n?void 0:n.name)||"dataLayer";e[o]||(e[o]=[]);var a=e[o];if(Array.isArray(a)){var i=a.push.bind(a);a.push=function(){for(var t=arguments.length,e=new Array(t),o=0;o<t;o++)e[o]=arguments[o];if(S)return i.apply(void 0,_to_consumable_array(e));S=!0;try{var a=!0,u=!1,c=void 0;try{for(var l,y=e[Symbol.iterator]();!(a=(l=y.next()).done);a=!0){var s=l.value;f(r,n,s)}}catch(r){u=!0,c=r}finally{try{a||null==y.return||y.return()}finally{if(u)throw c}}}finally{S=!1}return i.apply(void 0,_to_consumable_array(e))}}}(n,i,o)}},l=function(r){return _async_to_generator(function(){return _ts_generator(this,function(t){return"run"===r&&o&&u>0&&(function(r,t,e){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:globalThis.window,o=t.settings,a=n[(null==o?void 0:o.name)||"dataLayer"];if(Array.isArray(a)&&!S){S=!0;try{for(var i=null!=e?e:a.length,u=0;u<i;u++)f(r,o,a[u])}finally{S=!1}}}(n,i,u,o),u=0),[2]})})()},[2,{type:"dataLayer",config:i={settings:a},push:n,on:l,init:c,destroy:function(){return _async_to_generator(function(){var r;return _ts_generator(this,function(t){return r=a.name||"dataLayer",o&&o[r]&&Array.isArray(o[r]),[2]})})()}}]})})()},P=E;return O=h,function(r,t,e,n){if(t&&"object"===(void 0===t?"undefined":_type_of(t))||"function"==typeof t){var o=!0,a=!1,i=void 0;try{for(var u,c=function(){var o=u.value;v.call(r,o)||o===e||p(r,o,{get:function(){return t[o]},enumerable:!(n=b(t,o))||n.enumerable})},l=d(t)[Symbol.iterator]();!(o=(u=l.next()).done);o=!0)c()}catch(r){a=!0,i=r}finally{try{o||null==l.return||l.return()}finally{if(a)throw i}}}return r}(p({},"__esModule",{value:!0}),O)}();
1
+ "use strict";function _array_like_to_array(r,t){(null==t||t>r.length)&&(t=r.length);for(var e=0,n=new Array(t);e<t;e++)n[e]=r[e];return n}function _array_with_holes(r){if(Array.isArray(r))return r}function _array_without_holes(r){if(Array.isArray(r))return _array_like_to_array(r)}function asyncGeneratorStep(r,t,e,n,o,a,u){try{var i=r[a](u),c=i.value}catch(r){return void e(r)}i.done?t(c):Promise.resolve(c).then(n,o)}function _async_to_generator(r){return function(){var t=this,e=arguments;return new Promise(function(n,o){var a=r.apply(t,e);function u(r){asyncGeneratorStep(a,n,o,u,i,"next",r)}function i(r){asyncGeneratorStep(a,n,o,u,i,"throw",r)}u(void 0)})}}function _define_property(r,t,e){return t in r?Object.defineProperty(r,t,{value:e,enumerable:!0,configurable:!0,writable:!0}):r[t]=e,r}function _iterable_to_array(r){if("undefined"!=typeof Symbol&&null!=r[Symbol.iterator]||null!=r["@@iterator"])return Array.from(r)}function _iterable_to_array_limit(r,t){var e=null==r?null:"undefined"!=typeof Symbol&&r[Symbol.iterator]||r["@@iterator"];if(null!=e){var n,o,a=[],u=!0,i=!1;try{for(e=e.call(r);!(u=(n=e.next()).done)&&(a.push(n.value),!t||a.length!==t);u=!0);}catch(r){i=!0,o=r}finally{try{u||null==e.return||e.return()}finally{if(i)throw o}}return a}}function _non_iterable_rest(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _non_iterable_spread(){throw new TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _object_spread(r){for(var t=1;t<arguments.length;t++){var e=null!=arguments[t]?arguments[t]:{},n=Object.keys(e);"function"==typeof Object.getOwnPropertySymbols&&(n=n.concat(Object.getOwnPropertySymbols(e).filter(function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable}))),n.forEach(function(t){_define_property(r,t,e[t])})}return r}function _object_without_properties(r,t){if(null==r)return{};var e,n,o,a={};if("undefined"!=typeof Reflect&&Reflect.ownKeys){for(e=Reflect.ownKeys(Object(r)),o=0;o<e.length;o++)n=e[o],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(r,n)&&(a[n]=r[n]);return a}if(a=_object_without_properties_loose(r,t),Object.getOwnPropertySymbols)for(e=Object.getOwnPropertySymbols(r),o=0;o<e.length;o++)n=e[o],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(r,n)&&(a[n]=r[n]);return a}function _object_without_properties_loose(r,t){if(null==r)return{};var e,n,o={},a=Object.getOwnPropertyNames(r);for(n=0;n<a.length;n++)e=a[n],t.indexOf(e)>=0||Object.prototype.propertyIsEnumerable.call(r,e)&&(o[e]=r[e]);return o}function _sliced_to_array(r,t){return _array_with_holes(r)||_iterable_to_array_limit(r,t)||_unsupported_iterable_to_array(r,t)||_non_iterable_rest()}function _to_consumable_array(r){return _array_without_holes(r)||_iterable_to_array(r)||_unsupported_iterable_to_array(r)||_non_iterable_spread()}function _type_of(r){return r&&"undefined"!=typeof Symbol&&r.constructor===Symbol?"symbol":typeof r}function _unsupported_iterable_to_array(r,t){if(r){if("string"==typeof r)return _array_like_to_array(r,t);var e=Object.prototype.toString.call(r).slice(8,-1);return"Object"===e&&r.constructor&&(e=r.constructor.name),"Map"===e||"Set"===e?Array.from(e):"Arguments"===e||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(e)?_array_like_to_array(r,t):void 0}}function _ts_generator(r,t){var e,n,o,a={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]},u=Object.create(("function"==typeof Iterator?Iterator:Object).prototype),i=Object.defineProperty;return i(u,"next",{value:c(0)}),i(u,"throw",{value:c(1)}),i(u,"return",{value:c(2)}),"function"==typeof Symbol&&i(u,Symbol.iterator,{value:function(){return this}}),u;function c(i){return function(c){return function(i){if(e)throw new TypeError("Generator is already executing.");for(;u&&(u=0,i[0]&&(a=0)),a;)try{if(e=1,n&&(o=2&i[0]?n.return:i[0]?n.throw||((o=n.return)&&o.call(n),0):n.next)&&!(o=o.call(n,i[1])).done)return o;switch(n=0,o&&(i=[2&i[0],o.value]),i[0]){case 0:case 1:o=i;break;case 4:return a.label++,{value:i[1],done:!1};case 5:a.label++,n=i[1],i=[0];continue;case 7:i=a.ops.pop(),a.trys.pop();continue;default:if(!(o=a.trys,(o=o.length>0&&o[o.length-1])||6!==i[0]&&2!==i[0])){a=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]<o[3])){a.label=i[1];break}if(6===i[0]&&a.label<o[1]){a.label=o[1],o=i;break}if(o&&a.label<o[2]){a.label=o[2],a.ops.push(i);break}o[2]&&a.ops.pop(),a.trys.pop();continue}i=t.call(r,a)}catch(r){i=[6,r],n=0}finally{e=o=0}if(5&i[0])throw i[1];return{value:i[0]?i[1]:void 0,done:!0}}([i,c])}}}var Destination=function(){var r=function(r,t){if("collector"===r)return"collector";if(!t)throw new Error("stepId(".concat(r,") requires an id"));return"".concat(r,".").concat(t)},t=function(r,t){var e=r.destinations[t];if(!e)throw new Error("Destination not found: ".concat(t));return e},e=function(r,t){var e=r.transformers[t];if(!e)throw new Error("Transformer not found: ".concat(t));return e},n=function(r,t){var e=r.sources[t];if(!e)throw new Error("Source not found: ".concat(t));return e},o=function(r,t){var e=r.stores[t];if(!e)throw new Error("Store not found: ".concat(t));return e},a=function(r,t){return _async_to_generator(function(){return _ts_generator(this,function(e){switch(e.label){case 0:return[4,r.get(t)];case 1:return[2,e.sent()]}})})()},u=function(r){return Array.isArray(r)},i=function(r){return"object"==(void 0===r?"undefined":_type_of(r))&&null!==r&&!u(r)&&"[object Object]"===Object.prototype.toString.call(r)},c=function(r){return"string"==typeof r},l=function(r,t,e){return function(){for(var n=arguments.length,o=new Array(n),a=0;a<n;a++)o[a]=arguments[a];try{return r.apply(void 0,_to_consumable_array(o))}catch(r){if(!t)return;return t(r)}finally{null==e||e()}}},f=function(r){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},e=arguments.length>2?arguments[2]:void 0;if(t.filter&&!0===l(function(){return t.filter(e)},function(){return!1})())return;var n=y(e);if(n){var o=t.prefix||"dataLayer",a="".concat(o," ").concat(n.name),u=(n.name,{name:a,data:_object_without_properties(n,["name"])});l(function(){return r(u)},function(){})()}},y=function(r){if(i(r)&&c(r.event))return _object_spread({name:r.event},_object_without_properties(r,["event"]));if(u(r)&&r.length>=2)return s(r);if(_(r)){var t=Array.from(r);return s(t)}return null},s=function(r){var t,e=_sliced_to_array(r,3),n=e[0],o=e[1],a=e[2];if(!c(n))return null;var u={};switch(n){case"consent":if(!c(o)||r.length<3)return null;if("default"!==o&&"update"!==o)return null;if(!i(a)||null===a)return null;t="".concat(n," ").concat(o),u=_object_spread({},a);break;case"event":if(!c(o))return null;t=o,i(a)&&(u=_object_spread({},a));break;case"config":if(!c(o))return null;t="".concat(n," ").concat(o),i(a)&&(u=_object_spread({},a));break;case"set":if(c(o))t="".concat(n," ").concat(o),i(a)&&(u=_object_spread({},a));else{if(!i(o))return null;t="".concat(n," custom"),u=_object_spread({},o)}break;default:return null}return _object_spread({name:t},u)},_=function(r){return null!=r&&"object"===(void 0===r?"undefined":_type_of(r))&&"length"in r&&"number"==typeof r.length&&r.length>0},p=Object.defineProperty,b=Object.getOwnPropertyDescriptor,d=Object.getOwnPropertyNames,v=Object.prototype.hasOwnProperty,h={};!function(r,t){for(var e in t)p(r,e,{get:t[e],enumerable:!0})}(h,{SourceDataLayer:function(){return A},default:function(){return P},sourceDataLayer:function(){return E}});var g=Object.defineProperty,m=function(r,t){for(var e in t)g(r,e,{get:t[e],enumerable:!0})};m({},{stepId:function(){return r}});m({},{getDestination:function(){return t}});m({},{Level:function(){return j}});var w,j=((w=j||{})[w.ERROR=0]="ERROR",w[w.WARN=1]="WARN",w[w.INFO=2]="INFO",w[w.DEBUG=3]="DEBUG",w);m({},{getTransformer:function(){return e}});m({},{getSource:function(){return n}});m({},{getStore:function(){return o},getStoreValue:function(){return a}});var O,S=!1,A={},E=function(r){return _async_to_generator(function(){var t,e,n,o,a,u,i,c,l,y;return _ts_generator(this,function(s){return t=r.config,e=r.env,n=e.elb,o=e.push,a=e.window,u=_object_spread({name:"dataLayer",prefix:"dataLayer"},null==t?void 0:t.settings),c=0,l=function(){if(a){var r=u.name||"dataLayer",t=a[r];c=Array.isArray(t)?t.length:0,function(r,t){var e=arguments.length>2&&void 0!==arguments[2]?arguments[2]:globalThis.window,n=t.settings,o=(null==n?void 0:n.name)||"dataLayer";e[o]||(e[o]=[]);var a=e[o];if(Array.isArray(a)){var u=a.push.bind(a);a.push=function(){for(var t=arguments.length,e=new Array(t),o=0;o<t;o++)e[o]=arguments[o];if(S)return u.apply(void 0,_to_consumable_array(e));S=!0;try{var a=!0,i=!1,c=void 0;try{for(var l,y=e[Symbol.iterator]();!(a=(l=y.next()).done);a=!0){var s=l.value;f(r,n,s)}}catch(r){i=!0,c=r}finally{try{a||null==y.return||y.return()}finally{if(i)throw c}}}finally{S=!1}return u.apply(void 0,_to_consumable_array(e))}}}(o,i,a)}},y=function(r){return _async_to_generator(function(){return _ts_generator(this,function(t){return"run"===r&&a&&c>0&&(function(r,t,e){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:globalThis.window,o=t.settings,a=n[(null==o?void 0:o.name)||"dataLayer"];if(Array.isArray(a)&&!S){S=!0;try{for(var u=null!=e?e:a.length,i=0;i<u;i++)f(r,o,a[i])}finally{S=!1}}}(o,i,c,a),c=0),[2]})})()},[2,{type:"dataLayer",config:i={settings:u},push:n,on:y,init:l,destroy:function(){return _async_to_generator(function(){var r;return _ts_generator(this,function(t){return r=u.name||"dataLayer",a&&a[r]&&Array.isArray(a[r]),[2]})})()}}]})})()},P=E;return O=h,function(r,t,e,n){if(t&&"object"===(void 0===t?"undefined":_type_of(t))||"function"==typeof t){var o=!0,a=!1,u=void 0;try{for(var i,c=function(){var o=i.value;v.call(r,o)||o===e||p(r,o,{get:function(){return t[o]},enumerable:!(n=b(t,o))||n.enumerable})},l=d(t)[Symbol.iterator]();!(o=(i=l.next()).done);o=!0)c()}catch(r){a=!0,u=r}finally{try{o||null==l.return||l.return()}finally{if(a)throw u}}}return r}(p({},"__esModule",{value:!0}),O)}();
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- "use strict";var e,t=Object.defineProperty,r=Object.getOwnPropertyDescriptor,n=Object.getOwnPropertyNames,a=Object.prototype.hasOwnProperty,i={};((e,r)=>{for(var n in r)t(e,n,{get:r[n],enumerable:!0})})(i,{SourceDataLayer:()=>c,default:()=>y,sourceDataLayer:()=>f}),module.exports=(e=i,((e,i,l,s)=>{if(i&&"object"==typeof i||"function"==typeof i)for(let u of n(i))a.call(e,u)||u===l||t(e,u,{get:()=>i[u],enumerable:!(s=r(i,u))||s.enumerable});return e})(t({},"__esModule",{value:!0}),e));var l=require("@walkeros/core"),s=!1;function u(e,t={},r){if(t.filter){if(!0===(0,l.tryCatch)(()=>t.filter(r),()=>!1)())return}const n=function(e){if((0,l.isObject)(e)&&(0,l.isString)(e.event)){const{event:t,...r}=e;return{name:t,...r}}if((0,l.isArray)(e)&&e.length>=2)return o(e);if(t=e,null!=t&&"object"==typeof t&&"length"in t&&"number"==typeof t.length&&t.length>0){return o(Array.from(e))}var t;return null}(r);if(!n)return;const a=`${t.prefix||"dataLayer"} ${n.name}`,{name:i,...s}=n,u={name:a,data:s};(0,l.tryCatch)(()=>e(u),()=>{})()}function o(e){const[t,r,n]=e;if(!(0,l.isString)(t))return null;let a,i={};switch(t){case"consent":if(!(0,l.isString)(r)||e.length<3)return null;if("default"!==r&&"update"!==r)return null;if(!(0,l.isObject)(n)||null===n)return null;a=`${t} ${r}`,i={...n};break;case"event":if(!(0,l.isString)(r))return null;a=r,(0,l.isObject)(n)&&(i={...n});break;case"config":if(!(0,l.isString)(r))return null;a=`${t} ${r}`,(0,l.isObject)(n)&&(i={...n});break;case"set":if((0,l.isString)(r))a=`${t} ${r}`,(0,l.isObject)(n)&&(i={...n});else{if(!(0,l.isObject)(r))return null;a=`${t} custom`,i={...r}}break;default:return null}return{name:a,...i}}var c={},f=async e=>{const{config:t,env:r}=e,{elb:n,window:a}=r,i={name:"dataLayer",prefix:"dataLayer",...null==t?void 0:t.settings},l={settings:i};let o=0;return{type:"dataLayer",config:l,push:n,on:async e=>{if("run"===e&&a&&o>0){!function(e,t,r,n=globalThis.window){const a=t.settings,i=n[(null==a?void 0:a.name)||"dataLayer"];if(Array.isArray(i)&&!s){s=!0;try{const t=null!=r?r:i.length;for(let r=0;r<t;r++)u(e,a,i[r])}finally{s=!1}}}(n,l,o,a),o=0}},init:()=>{if(!a)return;const e=i.name||"dataLayer",t=a[e];o=Array.isArray(t)?t.length:0;!function(e,t,r=globalThis.window){const n=t.settings,a=(null==n?void 0:n.name)||"dataLayer";r[a]||(r[a]=[]);const i=r[a];if(!Array.isArray(i))return;const l=i.push.bind(i);i.push=function(...t){if(s)return l(...t);s=!0;try{for(const r of t)u(e,n,r)}finally{s=!1}return l(...t)}}(n,l,a)},destroy:async()=>{const e=i.name||"dataLayer";a&&a[e]&&Array.isArray(a[e])}}},y=f;//# sourceMappingURL=index.js.map
1
+ "use strict";var e,t=Object.defineProperty,r=Object.getOwnPropertyDescriptor,n=Object.getOwnPropertyNames,a=Object.prototype.hasOwnProperty,i={};((e,r)=>{for(var n in r)t(e,n,{get:r[n],enumerable:!0})})(i,{SourceDataLayer:()=>c,default:()=>y,sourceDataLayer:()=>f}),module.exports=(e=i,((e,i,s,l)=>{if(i&&"object"==typeof i||"function"==typeof i)for(let u of n(i))a.call(e,u)||u===s||t(e,u,{get:()=>i[u],enumerable:!(l=r(i,u))||l.enumerable});return e})(t({},"__esModule",{value:!0}),e));var s=require("@walkeros/core"),l=!1;function u(e,t={},r){if(t.filter){if(!0===(0,s.tryCatch)(()=>t.filter(r),()=>!1)())return}const n=function(e){if((0,s.isObject)(e)&&(0,s.isString)(e.event)){const{event:t,...r}=e;return{name:t,...r}}if((0,s.isArray)(e)&&e.length>=2)return o(e);if(t=e,null!=t&&"object"==typeof t&&"length"in t&&"number"==typeof t.length&&t.length>0){return o(Array.from(e))}var t;return null}(r);if(!n)return;const a=`${t.prefix||"dataLayer"} ${n.name}`,{name:i,...l}=n,u={name:a,data:l};(0,s.tryCatch)(()=>e(u),()=>{})()}function o(e){const[t,r,n]=e;if(!(0,s.isString)(t))return null;let a,i={};switch(t){case"consent":if(!(0,s.isString)(r)||e.length<3)return null;if("default"!==r&&"update"!==r)return null;if(!(0,s.isObject)(n)||null===n)return null;a=`${t} ${r}`,i={...n};break;case"event":if(!(0,s.isString)(r))return null;a=r,(0,s.isObject)(n)&&(i={...n});break;case"config":if(!(0,s.isString)(r))return null;a=`${t} ${r}`,(0,s.isObject)(n)&&(i={...n});break;case"set":if((0,s.isString)(r))a=`${t} ${r}`,(0,s.isObject)(n)&&(i={...n});else{if(!(0,s.isObject)(r))return null;a=`${t} custom`,i={...r}}break;default:return null}return{name:a,...i}}var c={},f=async e=>{const{config:t,env:r}=e,{elb:n,push:a,window:i}=r,s={name:"dataLayer",prefix:"dataLayer",...null==t?void 0:t.settings},o={settings:s};let c=0;return{type:"dataLayer",config:o,push:n,on:async e=>{if("run"===e&&i&&c>0){!function(e,t,r,n=globalThis.window){const a=t.settings,i=n[(null==a?void 0:a.name)||"dataLayer"];if(Array.isArray(i)&&!l){l=!0;try{const t=null!=r?r:i.length;for(let r=0;r<t;r++)u(e,a,i[r])}finally{l=!1}}}(a,o,c,i),c=0}},init:()=>{if(!i)return;const e=s.name||"dataLayer",t=i[e];c=Array.isArray(t)?t.length:0;!function(e,t,r=globalThis.window){const n=t.settings,a=(null==n?void 0:n.name)||"dataLayer";r[a]||(r[a]=[]);const i=r[a];if(!Array.isArray(i))return;const s=i.push.bind(i);i.push=function(...t){if(l)return s(...t);l=!0;try{for(const r of t)u(e,n,r)}finally{l=!1}return s(...t)}}(a,o,i)},destroy:async()=>{const e=s.name||"dataLayer";i&&i[e]&&Array.isArray(i[e])}}},y=f;//# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/interceptor.ts","../src/types/index.ts"],"sourcesContent":["import type { Source, On } from '@walkeros/core';\nimport type { Types } from './types';\nimport { interceptDataLayer, processExistingEvents } from './interceptor';\n\n// Export types for external usage\nexport * as SourceDataLayer from './types';\n\n/**\n * DataLayer source implementation using environment injection.\n *\n * This source intercepts dataLayer.push calls and transforms them to WalkerOS events.\n * It works by replacing the dataLayer.push method with a custom handler.\n */\nexport const sourceDataLayer: Source.Init<Types> = async (context) => {\n const { config, env } = context;\n const { elb, window: envWindow } = env;\n\n const settings: Source.Settings<Types> = {\n name: 'dataLayer',\n prefix: 'dataLayer',\n ...config?.settings,\n };\n\n const fullConfig: Source.Config<Types> = {\n settings,\n };\n\n // Captured at init time — see init below.\n let pendingReplayCount = 0;\n\n // Lifecycle setup. Called by the collector eagerly after registration,\n // regardless of `require`. The factory body above is side-effect-free.\n const init = () => {\n if (!envWindow) return;\n const dataLayerName = settings.name || 'dataLayer';\n const dl = (envWindow as Record<string, unknown>)[dataLayerName];\n pendingReplayCount = Array.isArray(dl) ? dl.length : 0;\n\n const win = envWindow as unknown as Record<string, unknown>;\n interceptDataLayer(elb, fullConfig, win);\n };\n\n // Replay pre-existing entries when the run signal lands. The collector\n // strictly gates on() delivery: this fires only when the source is\n // started (`config.init === true` AND `config.require` empty). If a\n // require gate is unmet, the run event is queued in `queueOn` by\n // onApply and replayed when the source becomes started.\n const handleEvent = async (event: On.Types) => {\n if (event === 'run' && envWindow && pendingReplayCount > 0) {\n const win = envWindow as unknown as Record<string, unknown>;\n processExistingEvents(elb, fullConfig, pendingReplayCount, win);\n pendingReplayCount = 0;\n }\n };\n\n return {\n type: 'dataLayer',\n config: fullConfig,\n push: elb,\n on: handleEvent,\n init,\n destroy: async () => {\n // Cleanup: restore original dataLayer.push if possible\n const dataLayerName = settings.name || 'dataLayer';\n if (\n envWindow &&\n envWindow[dataLayerName] &&\n Array.isArray(envWindow[dataLayerName])\n ) {\n // Note: Complete restoration would require storing original push method\n // For now, we'll just document this limitation\n }\n },\n };\n};\n\nexport default sourceDataLayer;\n","import type { WalkerOS, Source, Collector } from '@walkeros/core';\nimport { isArray, isObject, isString, tryCatch } from '@walkeros/core';\n\n// Global flag to prevent infinite loops\nlet isProcessing = false;\n\n/**\n * DataLayer interceptor - handles dataLayer.push interception and event transformation\n */\nexport function interceptDataLayer(\n push: Collector.PushFn,\n config: Source.Config,\n win: Record<string, unknown> = globalThis.window as unknown as Record<\n string,\n unknown\n >,\n): void {\n const settings = config.settings as {\n name?: string;\n prefix?: string;\n filter?: (event: unknown) => boolean;\n };\n const dataLayerName = settings?.name || 'dataLayer';\n\n // Ensure dataLayer exists\n if (!win[dataLayerName]) {\n win[dataLayerName] = [];\n }\n\n const dataLayer = win[dataLayerName] as unknown[];\n if (!Array.isArray(dataLayer)) return;\n\n // Store original push\n const originalPush = dataLayer.push.bind(dataLayer);\n\n // Override push with event processing\n dataLayer.push = function (...args: unknown[]): number {\n // Prevent infinite loops\n if (isProcessing) {\n return originalPush(...args);\n }\n\n isProcessing = true;\n try {\n // Process each argument\n for (const arg of args) {\n processEvent(push, settings, arg);\n }\n } finally {\n isProcessing = false;\n }\n\n // Call original push\n return originalPush(...args);\n };\n}\n\n/**\n * Process existing events on initialization\n */\nexport function processExistingEvents(\n push: Collector.PushFn,\n config: Source.Config,\n limit?: number,\n win: Record<string, unknown> = globalThis.window as unknown as Record<\n string,\n unknown\n >,\n): void {\n const settings = config.settings as {\n name?: string;\n prefix?: string;\n filter?: (event: unknown) => boolean;\n };\n const dataLayerName = settings?.name || 'dataLayer';\n const dataLayer = win[dataLayerName] as unknown[];\n\n if (!Array.isArray(dataLayer)) return;\n\n // Prevent loops during initialization\n if (isProcessing) return;\n\n isProcessing = true;\n try {\n const count = limit ?? dataLayer.length;\n for (let i = 0; i < count; i++) {\n processEvent(push, settings, dataLayer[i]);\n }\n } finally {\n isProcessing = false;\n }\n}\n\n/**\n * Process a single event - handles filtering, transformation, and WalkerOS event creation\n */\nfunction processEvent(\n push: Collector.PushFn,\n settings: { prefix?: string; filter?: (event: unknown) => boolean } = {},\n rawEvent: unknown,\n): void {\n // Apply filter if provided\n if (settings.filter) {\n const filterFn = tryCatch(\n () => settings.filter!(rawEvent),\n () => false, // If filter throws, don't skip the event\n );\n const filterResult = filterFn();\n if (filterResult === true) {\n return; // Skip filtered events\n }\n }\n\n // Transform the event (handles gtag format and direct objects)\n const transformedEvent = transformDataLayerEvent(rawEvent);\n if (!transformedEvent) {\n return; // Skip invalid events\n }\n\n const prefix = settings.prefix || 'dataLayer';\n const eventName = `${prefix} ${transformedEvent.name}`;\n\n // Create partial WalkerOS event structure (collector will enrich it)\n const { name: _name, ...data } = transformedEvent;\n const partialEvent: WalkerOS.DeepPartialEvent = {\n name: eventName,\n data: data as WalkerOS.Properties,\n };\n\n // Push to collector\n tryCatch(\n () => push(partialEvent),\n () => {}, // Silently handle push errors\n )();\n}\n\n/**\n * Transform dataLayer events to standardized format\n * Handles: gtag arguments, direct objects, existing events\n */\nfunction transformDataLayerEvent(\n rawEvent: unknown,\n): { name: string; [key: string]: unknown } | null {\n // Handle direct object format: { event: 'test', data: 'value' }\n if (isObject(rawEvent) && isString(rawEvent.event)) {\n const { event, ...rest } = rawEvent;\n return { name: event, ...rest };\n }\n\n // Handle gtag argument format: ['consent', 'update', { ad_storage: 'granted' }]\n if (isArray(rawEvent) && rawEvent.length >= 2) {\n return transformGtagArgs(rawEvent);\n }\n\n // Handle arguments object (from gtag function calls)\n if (isGtagArguments(rawEvent)) {\n const argsArray = Array.from(rawEvent as ArrayLike<unknown>);\n return transformGtagArgs(argsArray);\n }\n\n return null;\n}\n\n/**\n * Transform gtag-style arguments to event object\n * ['consent', 'update', { ad_storage: 'granted' }] → { event: 'consent update', ad_storage: 'granted' }\n */\nfunction transformGtagArgs(\n args: unknown[],\n): { name: string; [key: string]: unknown } | null {\n const [command, action, params] = args;\n\n if (!isString(command)) return null;\n\n let eventName: string;\n let eventData: Record<string, unknown> = {};\n\n switch (command) {\n case 'consent':\n // Consent requires action and params\n if (!isString(action) || args.length < 3) return null;\n // Only allow 'default' and 'update' actions for consent\n if (action !== 'default' && action !== 'update') return null;\n // Params must be a valid object (not null)\n if (!isObject(params) || params === null) return null;\n\n eventName = `${command} ${action}`;\n eventData = { ...params };\n break;\n\n case 'event':\n // Event requires at least action parameter\n if (!isString(action)) return null;\n eventName = action;\n if (isObject(params)) {\n eventData = { ...params };\n }\n break;\n\n case 'config':\n // Config requires at least action parameter\n if (!isString(action)) return null;\n eventName = `${command} ${action}`;\n if (isObject(params)) {\n eventData = { ...params };\n }\n break;\n\n case 'set':\n if (isString(action)) {\n eventName = `${command} ${action}`;\n if (isObject(params)) {\n eventData = { ...params };\n }\n } else if (isObject(action)) {\n eventName = `${command} custom`;\n eventData = { ...action };\n } else {\n return null;\n }\n break;\n\n default:\n // Unknown command, ignore\n return null;\n }\n\n return {\n name: eventName,\n ...eventData,\n };\n}\n\n/**\n * Check if object is gtag arguments object\n */\nfunction isGtagArguments(obj: unknown): boolean {\n return (\n obj != null &&\n typeof obj === 'object' &&\n 'length' in obj &&\n typeof (obj as ArrayLike<unknown>).length === 'number' &&\n (obj as ArrayLike<unknown>).length > 0\n );\n}\n","import type { WalkerOS, Source, Elb } from '@walkeros/core';\nimport type { SettingsSchema, Mapping } from '../schemas';\nimport type { z } from '@walkeros/core/dev';\n\ndeclare module '@walkeros/core' {\n interface SourceMap {\n dataLayer: { type: 'dataLayer'; platform?: 'web' };\n }\n}\n\ndeclare global {\n interface Window {\n dataLayer?: DataLayer;\n [key: string]: DataLayer | unknown;\n }\n}\n\nexport type DataLayer = Array<unknown>;\n\n// Base settings from Zod schema\ntype BaseSettings = z.infer<typeof SettingsSchema>;\n\n// Override filter to be actual function type (not serializable in schema)\nexport interface Settings extends Omit<BaseSettings, 'filter'> {\n name?: string;\n prefix?: string;\n filter?: (event: unknown) => WalkerOS.PromiseOrValue<boolean>;\n}\n\n// InitSettings: user input (all optional)\nexport type InitSettings = Partial<Settings>;\n\nexport type { Mapping };\n\nexport type Push = Elb.Fn;\n\nexport interface Env extends Source.BaseEnv {\n window?: Window & typeof globalThis;\n}\n\nexport type Types = Source.Types<Settings, Mapping, Push, Env, InitSettings>;\n\nexport type Config = Source.Config<Types>;\n\nexport type DataLayerEvent = {\n event: string;\n [key: string]: unknown;\n};\n\nexport type MappedEvent = {\n event?: WalkerOS.DeepPartialEvent & { id: string };\n command?: {\n name: string;\n data: unknown;\n };\n};\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/index.ts","../src/interceptor.ts","../src/types/index.ts"],"sourcesContent":["import type { Source, On } from '@walkeros/core';\nimport type { Types } from './types';\nimport { interceptDataLayer, processExistingEvents } from './interceptor';\n\n// Export types for external usage\nexport * as SourceDataLayer from './types';\n\n/**\n * DataLayer source implementation using environment injection.\n *\n * This source intercepts dataLayer.push calls and transforms them to WalkerOS events.\n * It works by replacing the dataLayer.push method with a custom handler.\n */\nexport const sourceDataLayer: Source.Init<Types> = async (context) => {\n const { config, env } = context;\n // Events exit via `push` (the collector's source pipeline, so this source's\n // `next`/`before`/mapping/cache/state and status apply); `elb` stays the\n // outward-facing slot on the instance below. This source emits no commands.\n const { elb, push, window: envWindow } = env;\n\n const settings: Source.Settings<Types> = {\n name: 'dataLayer',\n prefix: 'dataLayer',\n ...config?.settings,\n };\n\n const fullConfig: Source.Config<Types> = {\n settings,\n };\n\n // Captured at init time — see init below.\n let pendingReplayCount = 0;\n\n // Lifecycle setup. Called by the collector eagerly after registration,\n // regardless of `require`. The factory body above is side-effect-free.\n const init = () => {\n if (!envWindow) return;\n const dataLayerName = settings.name || 'dataLayer';\n const dl = (envWindow as Record<string, unknown>)[dataLayerName];\n pendingReplayCount = Array.isArray(dl) ? dl.length : 0;\n\n const win = envWindow as unknown as Record<string, unknown>;\n interceptDataLayer(push, fullConfig, win);\n };\n\n // Replay pre-existing entries when the run signal lands. The collector\n // strictly gates on() delivery: this fires only when the source is\n // started (`config.init === true` AND `config.require` empty). If a\n // require gate is unmet, the run event is queued in `queueOn` by\n // onApply and replayed when the source becomes started.\n const handleEvent = async (event: On.Types) => {\n if (event === 'run' && envWindow && pendingReplayCount > 0) {\n const win = envWindow as unknown as Record<string, unknown>;\n processExistingEvents(push, fullConfig, pendingReplayCount, win);\n pendingReplayCount = 0;\n }\n };\n\n return {\n type: 'dataLayer',\n config: fullConfig,\n // Deliberately `elb`, not the pipeline `push`. This slot is the source's\n // outward-facing entry (and what `startFlow` exports as its `elb` when this\n // source is primary), not the capture path: real dataLayer entries arrive\n // through the intercepted `dataLayer.push`, which routes via the pipeline.\n push: elb,\n on: handleEvent,\n init,\n destroy: async () => {\n // Cleanup: restore original dataLayer.push if possible\n const dataLayerName = settings.name || 'dataLayer';\n if (\n envWindow &&\n envWindow[dataLayerName] &&\n Array.isArray(envWindow[dataLayerName])\n ) {\n // Note: Complete restoration would require storing original push method\n // For now, we'll just document this limitation\n }\n },\n };\n};\n\nexport default sourceDataLayer;\n","import type { WalkerOS, Source, Collector } from '@walkeros/core';\nimport { isArray, isObject, isString, tryCatch } from '@walkeros/core';\n\n// Global flag to prevent infinite loops\nlet isProcessing = false;\n\n/**\n * DataLayer interceptor - handles dataLayer.push interception and event transformation\n */\nexport function interceptDataLayer(\n push: Collector.PushFn,\n config: Source.Config,\n win: Record<string, unknown> = globalThis.window as unknown as Record<\n string,\n unknown\n >,\n): void {\n const settings = config.settings as {\n name?: string;\n prefix?: string;\n filter?: (event: unknown) => boolean;\n };\n const dataLayerName = settings?.name || 'dataLayer';\n\n // Ensure dataLayer exists\n if (!win[dataLayerName]) {\n win[dataLayerName] = [];\n }\n\n const dataLayer = win[dataLayerName] as unknown[];\n if (!Array.isArray(dataLayer)) return;\n\n // Store original push\n const originalPush = dataLayer.push.bind(dataLayer);\n\n // Override push with event processing\n dataLayer.push = function (...args: unknown[]): number {\n // Prevent infinite loops\n if (isProcessing) {\n return originalPush(...args);\n }\n\n isProcessing = true;\n try {\n // Process each argument\n for (const arg of args) {\n processEvent(push, settings, arg);\n }\n } finally {\n isProcessing = false;\n }\n\n // Call original push\n return originalPush(...args);\n };\n}\n\n/**\n * Process existing events on initialization\n */\nexport function processExistingEvents(\n push: Collector.PushFn,\n config: Source.Config,\n limit?: number,\n win: Record<string, unknown> = globalThis.window as unknown as Record<\n string,\n unknown\n >,\n): void {\n const settings = config.settings as {\n name?: string;\n prefix?: string;\n filter?: (event: unknown) => boolean;\n };\n const dataLayerName = settings?.name || 'dataLayer';\n const dataLayer = win[dataLayerName] as unknown[];\n\n if (!Array.isArray(dataLayer)) return;\n\n // Prevent loops during initialization\n if (isProcessing) return;\n\n isProcessing = true;\n try {\n const count = limit ?? dataLayer.length;\n for (let i = 0; i < count; i++) {\n processEvent(push, settings, dataLayer[i]);\n }\n } finally {\n isProcessing = false;\n }\n}\n\n/**\n * Process a single event - handles filtering, transformation, and WalkerOS event creation\n */\nfunction processEvent(\n push: Collector.PushFn,\n settings: { prefix?: string; filter?: (event: unknown) => boolean } = {},\n rawEvent: unknown,\n): void {\n // Apply filter if provided\n if (settings.filter) {\n const filterFn = tryCatch(\n () => settings.filter!(rawEvent),\n () => false, // If filter throws, don't skip the event\n );\n const filterResult = filterFn();\n if (filterResult === true) {\n return; // Skip filtered events\n }\n }\n\n // Transform the event (handles gtag format and direct objects)\n const transformedEvent = transformDataLayerEvent(rawEvent);\n if (!transformedEvent) {\n return; // Skip invalid events\n }\n\n const prefix = settings.prefix || 'dataLayer';\n const eventName = `${prefix} ${transformedEvent.name}`;\n\n // Create partial WalkerOS event structure (collector will enrich it)\n const { name: _name, ...data } = transformedEvent;\n const partialEvent: WalkerOS.DeepPartialEvent = {\n name: eventName,\n data: data as WalkerOS.Properties,\n };\n\n // Push to collector\n tryCatch(\n () => push(partialEvent),\n () => {}, // Silently handle push errors\n )();\n}\n\n/**\n * Transform dataLayer events to standardized format\n * Handles: gtag arguments, direct objects, existing events\n */\nfunction transformDataLayerEvent(\n rawEvent: unknown,\n): { name: string; [key: string]: unknown } | null {\n // Handle direct object format: { event: 'test', data: 'value' }\n if (isObject(rawEvent) && isString(rawEvent.event)) {\n const { event, ...rest } = rawEvent;\n return { name: event, ...rest };\n }\n\n // Handle gtag argument format: ['consent', 'update', { ad_storage: 'granted' }]\n if (isArray(rawEvent) && rawEvent.length >= 2) {\n return transformGtagArgs(rawEvent);\n }\n\n // Handle arguments object (from gtag function calls)\n if (isGtagArguments(rawEvent)) {\n const argsArray = Array.from(rawEvent as ArrayLike<unknown>);\n return transformGtagArgs(argsArray);\n }\n\n return null;\n}\n\n/**\n * Transform gtag-style arguments to event object\n * ['consent', 'update', { ad_storage: 'granted' }] → { event: 'consent update', ad_storage: 'granted' }\n */\nfunction transformGtagArgs(\n args: unknown[],\n): { name: string; [key: string]: unknown } | null {\n const [command, action, params] = args;\n\n if (!isString(command)) return null;\n\n let eventName: string;\n let eventData: Record<string, unknown> = {};\n\n switch (command) {\n case 'consent':\n // Consent requires action and params\n if (!isString(action) || args.length < 3) return null;\n // Only allow 'default' and 'update' actions for consent\n if (action !== 'default' && action !== 'update') return null;\n // Params must be a valid object (not null)\n if (!isObject(params) || params === null) return null;\n\n eventName = `${command} ${action}`;\n eventData = { ...params };\n break;\n\n case 'event':\n // Event requires at least action parameter\n if (!isString(action)) return null;\n eventName = action;\n if (isObject(params)) {\n eventData = { ...params };\n }\n break;\n\n case 'config':\n // Config requires at least action parameter\n if (!isString(action)) return null;\n eventName = `${command} ${action}`;\n if (isObject(params)) {\n eventData = { ...params };\n }\n break;\n\n case 'set':\n if (isString(action)) {\n eventName = `${command} ${action}`;\n if (isObject(params)) {\n eventData = { ...params };\n }\n } else if (isObject(action)) {\n eventName = `${command} custom`;\n eventData = { ...action };\n } else {\n return null;\n }\n break;\n\n default:\n // Unknown command, ignore\n return null;\n }\n\n return {\n name: eventName,\n ...eventData,\n };\n}\n\n/**\n * Check if object is gtag arguments object\n */\nfunction isGtagArguments(obj: unknown): boolean {\n return (\n obj != null &&\n typeof obj === 'object' &&\n 'length' in obj &&\n typeof (obj as ArrayLike<unknown>).length === 'number' &&\n (obj as ArrayLike<unknown>).length > 0\n );\n}\n","import type { WalkerOS, Source, Elb } from '@walkeros/core';\nimport type { SettingsSchema, Mapping } from '../schemas';\nimport type { z } from '@walkeros/core/dev';\n\ndeclare module '@walkeros/core' {\n interface SourceMap {\n dataLayer: { type: 'dataLayer'; platform?: 'web' };\n }\n}\n\ndeclare global {\n interface Window {\n dataLayer?: DataLayer;\n [key: string]: DataLayer | unknown;\n }\n}\n\nexport type DataLayer = Array<unknown>;\n\n// Base settings from Zod schema\ntype BaseSettings = z.infer<typeof SettingsSchema>;\n\n// Override filter to be actual function type (not serializable in schema)\nexport interface Settings extends Omit<BaseSettings, 'filter'> {\n name?: string;\n prefix?: string;\n filter?: (event: unknown) => WalkerOS.PromiseOrValue<boolean>;\n}\n\n// InitSettings: user input (all optional)\nexport type InitSettings = Partial<Settings>;\n\nexport type { Mapping };\n\nexport type Push = Elb.Fn;\n\nexport interface Env extends Source.BaseEnv {\n window?: Window & typeof globalThis;\n}\n\nexport type Types = Source.Types<Settings, Mapping, Push, Env, InitSettings>;\n\nexport type Config = Source.Config<Types>;\n\nexport type DataLayerEvent = {\n event: string;\n [key: string]: unknown;\n};\n\nexport type MappedEvent = {\n event?: WalkerOS.DeepPartialEvent & { id: string };\n command?: {\n name: string;\n data: unknown;\n };\n};\n"],"mappings":"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","names":[]}
package/dist/index.mjs CHANGED
@@ -1 +1 @@
1
- import{isArray as n,isObject as r,isString as e,tryCatch as t}from"@walkeros/core";var a=!1;function i(a,i={},u){if(i.filter){if(!0===t(()=>i.filter(u),()=>!1)())return}const o=function(t){if(r(t)&&e(t.event)){const{event:n,...r}=t;return{name:n,...r}}if(n(t)&&t.length>=2)return l(t);if(a=t,null!=a&&"object"==typeof a&&"length"in a&&"number"==typeof a.length&&a.length>0){return l(Array.from(t))}var a;return null}(u);if(!o)return;const s=`${i.prefix||"dataLayer"} ${o.name}`,{name:f,...c}=o,y={name:s,data:c};t(()=>a(y),()=>{})()}function l(n){const[t,a,i]=n;if(!e(t))return null;let l,u={};switch(t){case"consent":if(!e(a)||n.length<3)return null;if("default"!==a&&"update"!==a)return null;if(!r(i)||null===i)return null;l=`${t} ${a}`,u={...i};break;case"event":if(!e(a))return null;l=a,r(i)&&(u={...i});break;case"config":if(!e(a))return null;l=`${t} ${a}`,r(i)&&(u={...i});break;case"set":if(e(a))l=`${t} ${a}`,r(i)&&(u={...i});else{if(!r(a))return null;l=`${t} custom`,u={...a}}break;default:return null}return{name:l,...u}}var u={},o=async n=>{const{config:r,env:e}=n,{elb:t,window:l}=e,u={name:"dataLayer",prefix:"dataLayer",...null==r?void 0:r.settings},o={settings:u};let s=0;return{type:"dataLayer",config:o,push:t,on:async n=>{if("run"===n&&l&&s>0){!function(n,r,e,t=globalThis.window){const l=r.settings,u=t[(null==l?void 0:l.name)||"dataLayer"];if(Array.isArray(u)&&!a){a=!0;try{const r=null!=e?e:u.length;for(let e=0;e<r;e++)i(n,l,u[e])}finally{a=!1}}}(t,o,s,l),s=0}},init:()=>{if(!l)return;const n=u.name||"dataLayer",r=l[n];s=Array.isArray(r)?r.length:0;!function(n,r,e=globalThis.window){const t=r.settings,l=(null==t?void 0:t.name)||"dataLayer";e[l]||(e[l]=[]);const u=e[l];if(!Array.isArray(u))return;const o=u.push.bind(u);u.push=function(...r){if(a)return o(...r);a=!0;try{for(const e of r)i(n,t,e)}finally{a=!1}return o(...r)}}(t,o,l)},destroy:async()=>{const n=u.name||"dataLayer";l&&l[n]&&Array.isArray(l[n])}}},s=o;export{u as SourceDataLayer,s as default,o as sourceDataLayer};//# sourceMappingURL=index.mjs.map
1
+ import{isArray as n,isObject as r,isString as e,tryCatch as t}from"@walkeros/core";var a=!1;function i(a,i={},u){if(i.filter){if(!0===t(()=>i.filter(u),()=>!1)())return}const o=function(t){if(r(t)&&e(t.event)){const{event:n,...r}=t;return{name:n,...r}}if(n(t)&&t.length>=2)return l(t);if(a=t,null!=a&&"object"==typeof a&&"length"in a&&"number"==typeof a.length&&a.length>0){return l(Array.from(t))}var a;return null}(u);if(!o)return;const s=`${i.prefix||"dataLayer"} ${o.name}`,{name:f,...c}=o,y={name:s,data:c};t(()=>a(y),()=>{})()}function l(n){const[t,a,i]=n;if(!e(t))return null;let l,u={};switch(t){case"consent":if(!e(a)||n.length<3)return null;if("default"!==a&&"update"!==a)return null;if(!r(i)||null===i)return null;l=`${t} ${a}`,u={...i};break;case"event":if(!e(a))return null;l=a,r(i)&&(u={...i});break;case"config":if(!e(a))return null;l=`${t} ${a}`,r(i)&&(u={...i});break;case"set":if(e(a))l=`${t} ${a}`,r(i)&&(u={...i});else{if(!r(a))return null;l=`${t} custom`,u={...a}}break;default:return null}return{name:l,...u}}var u={},o=async n=>{const{config:r,env:e}=n,{elb:t,push:l,window:u}=e,o={name:"dataLayer",prefix:"dataLayer",...null==r?void 0:r.settings},s={settings:o};let f=0;return{type:"dataLayer",config:s,push:t,on:async n=>{if("run"===n&&u&&f>0){!function(n,r,e,t=globalThis.window){const l=r.settings,u=t[(null==l?void 0:l.name)||"dataLayer"];if(Array.isArray(u)&&!a){a=!0;try{const r=null!=e?e:u.length;for(let e=0;e<r;e++)i(n,l,u[e])}finally{a=!1}}}(l,s,f,u),f=0}},init:()=>{if(!u)return;const n=o.name||"dataLayer",r=u[n];f=Array.isArray(r)?r.length:0;!function(n,r,e=globalThis.window){const t=r.settings,l=(null==t?void 0:t.name)||"dataLayer";e[l]||(e[l]=[]);const u=e[l];if(!Array.isArray(u))return;const o=u.push.bind(u);u.push=function(...r){if(a)return o(...r);a=!0;try{for(const e of r)i(n,t,e)}finally{a=!1}return o(...r)}}(l,s,u)},destroy:async()=>{const n=o.name||"dataLayer";u&&u[n]&&Array.isArray(u[n])}}},s=o;export{u as SourceDataLayer,s as default,o as sourceDataLayer};//# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/interceptor.ts","../src/types/index.ts","../src/index.ts"],"sourcesContent":["import type { WalkerOS, Source, Collector } from '@walkeros/core';\nimport { isArray, isObject, isString, tryCatch } from '@walkeros/core';\n\n// Global flag to prevent infinite loops\nlet isProcessing = false;\n\n/**\n * DataLayer interceptor - handles dataLayer.push interception and event transformation\n */\nexport function interceptDataLayer(\n push: Collector.PushFn,\n config: Source.Config,\n win: Record<string, unknown> = globalThis.window as unknown as Record<\n string,\n unknown\n >,\n): void {\n const settings = config.settings as {\n name?: string;\n prefix?: string;\n filter?: (event: unknown) => boolean;\n };\n const dataLayerName = settings?.name || 'dataLayer';\n\n // Ensure dataLayer exists\n if (!win[dataLayerName]) {\n win[dataLayerName] = [];\n }\n\n const dataLayer = win[dataLayerName] as unknown[];\n if (!Array.isArray(dataLayer)) return;\n\n // Store original push\n const originalPush = dataLayer.push.bind(dataLayer);\n\n // Override push with event processing\n dataLayer.push = function (...args: unknown[]): number {\n // Prevent infinite loops\n if (isProcessing) {\n return originalPush(...args);\n }\n\n isProcessing = true;\n try {\n // Process each argument\n for (const arg of args) {\n processEvent(push, settings, arg);\n }\n } finally {\n isProcessing = false;\n }\n\n // Call original push\n return originalPush(...args);\n };\n}\n\n/**\n * Process existing events on initialization\n */\nexport function processExistingEvents(\n push: Collector.PushFn,\n config: Source.Config,\n limit?: number,\n win: Record<string, unknown> = globalThis.window as unknown as Record<\n string,\n unknown\n >,\n): void {\n const settings = config.settings as {\n name?: string;\n prefix?: string;\n filter?: (event: unknown) => boolean;\n };\n const dataLayerName = settings?.name || 'dataLayer';\n const dataLayer = win[dataLayerName] as unknown[];\n\n if (!Array.isArray(dataLayer)) return;\n\n // Prevent loops during initialization\n if (isProcessing) return;\n\n isProcessing = true;\n try {\n const count = limit ?? dataLayer.length;\n for (let i = 0; i < count; i++) {\n processEvent(push, settings, dataLayer[i]);\n }\n } finally {\n isProcessing = false;\n }\n}\n\n/**\n * Process a single event - handles filtering, transformation, and WalkerOS event creation\n */\nfunction processEvent(\n push: Collector.PushFn,\n settings: { prefix?: string; filter?: (event: unknown) => boolean } = {},\n rawEvent: unknown,\n): void {\n // Apply filter if provided\n if (settings.filter) {\n const filterFn = tryCatch(\n () => settings.filter!(rawEvent),\n () => false, // If filter throws, don't skip the event\n );\n const filterResult = filterFn();\n if (filterResult === true) {\n return; // Skip filtered events\n }\n }\n\n // Transform the event (handles gtag format and direct objects)\n const transformedEvent = transformDataLayerEvent(rawEvent);\n if (!transformedEvent) {\n return; // Skip invalid events\n }\n\n const prefix = settings.prefix || 'dataLayer';\n const eventName = `${prefix} ${transformedEvent.name}`;\n\n // Create partial WalkerOS event structure (collector will enrich it)\n const { name: _name, ...data } = transformedEvent;\n const partialEvent: WalkerOS.DeepPartialEvent = {\n name: eventName,\n data: data as WalkerOS.Properties,\n };\n\n // Push to collector\n tryCatch(\n () => push(partialEvent),\n () => {}, // Silently handle push errors\n )();\n}\n\n/**\n * Transform dataLayer events to standardized format\n * Handles: gtag arguments, direct objects, existing events\n */\nfunction transformDataLayerEvent(\n rawEvent: unknown,\n): { name: string; [key: string]: unknown } | null {\n // Handle direct object format: { event: 'test', data: 'value' }\n if (isObject(rawEvent) && isString(rawEvent.event)) {\n const { event, ...rest } = rawEvent;\n return { name: event, ...rest };\n }\n\n // Handle gtag argument format: ['consent', 'update', { ad_storage: 'granted' }]\n if (isArray(rawEvent) && rawEvent.length >= 2) {\n return transformGtagArgs(rawEvent);\n }\n\n // Handle arguments object (from gtag function calls)\n if (isGtagArguments(rawEvent)) {\n const argsArray = Array.from(rawEvent as ArrayLike<unknown>);\n return transformGtagArgs(argsArray);\n }\n\n return null;\n}\n\n/**\n * Transform gtag-style arguments to event object\n * ['consent', 'update', { ad_storage: 'granted' }] → { event: 'consent update', ad_storage: 'granted' }\n */\nfunction transformGtagArgs(\n args: unknown[],\n): { name: string; [key: string]: unknown } | null {\n const [command, action, params] = args;\n\n if (!isString(command)) return null;\n\n let eventName: string;\n let eventData: Record<string, unknown> = {};\n\n switch (command) {\n case 'consent':\n // Consent requires action and params\n if (!isString(action) || args.length < 3) return null;\n // Only allow 'default' and 'update' actions for consent\n if (action !== 'default' && action !== 'update') return null;\n // Params must be a valid object (not null)\n if (!isObject(params) || params === null) return null;\n\n eventName = `${command} ${action}`;\n eventData = { ...params };\n break;\n\n case 'event':\n // Event requires at least action parameter\n if (!isString(action)) return null;\n eventName = action;\n if (isObject(params)) {\n eventData = { ...params };\n }\n break;\n\n case 'config':\n // Config requires at least action parameter\n if (!isString(action)) return null;\n eventName = `${command} ${action}`;\n if (isObject(params)) {\n eventData = { ...params };\n }\n break;\n\n case 'set':\n if (isString(action)) {\n eventName = `${command} ${action}`;\n if (isObject(params)) {\n eventData = { ...params };\n }\n } else if (isObject(action)) {\n eventName = `${command} custom`;\n eventData = { ...action };\n } else {\n return null;\n }\n break;\n\n default:\n // Unknown command, ignore\n return null;\n }\n\n return {\n name: eventName,\n ...eventData,\n };\n}\n\n/**\n * Check if object is gtag arguments object\n */\nfunction isGtagArguments(obj: unknown): boolean {\n return (\n obj != null &&\n typeof obj === 'object' &&\n 'length' in obj &&\n typeof (obj as ArrayLike<unknown>).length === 'number' &&\n (obj as ArrayLike<unknown>).length > 0\n );\n}\n","import type { WalkerOS, Source, Elb } from '@walkeros/core';\nimport type { SettingsSchema, Mapping } from '../schemas';\nimport type { z } from '@walkeros/core/dev';\n\ndeclare module '@walkeros/core' {\n interface SourceMap {\n dataLayer: { type: 'dataLayer'; platform?: 'web' };\n }\n}\n\ndeclare global {\n interface Window {\n dataLayer?: DataLayer;\n [key: string]: DataLayer | unknown;\n }\n}\n\nexport type DataLayer = Array<unknown>;\n\n// Base settings from Zod schema\ntype BaseSettings = z.infer<typeof SettingsSchema>;\n\n// Override filter to be actual function type (not serializable in schema)\nexport interface Settings extends Omit<BaseSettings, 'filter'> {\n name?: string;\n prefix?: string;\n filter?: (event: unknown) => WalkerOS.PromiseOrValue<boolean>;\n}\n\n// InitSettings: user input (all optional)\nexport type InitSettings = Partial<Settings>;\n\nexport type { Mapping };\n\nexport type Push = Elb.Fn;\n\nexport interface Env extends Source.BaseEnv {\n window?: Window & typeof globalThis;\n}\n\nexport type Types = Source.Types<Settings, Mapping, Push, Env, InitSettings>;\n\nexport type Config = Source.Config<Types>;\n\nexport type DataLayerEvent = {\n event: string;\n [key: string]: unknown;\n};\n\nexport type MappedEvent = {\n event?: WalkerOS.DeepPartialEvent & { id: string };\n command?: {\n name: string;\n data: unknown;\n };\n};\n","import type { Source, On } from '@walkeros/core';\nimport type { Types } from './types';\nimport { interceptDataLayer, processExistingEvents } from './interceptor';\n\n// Export types for external usage\nexport * as SourceDataLayer from './types';\n\n/**\n * DataLayer source implementation using environment injection.\n *\n * This source intercepts dataLayer.push calls and transforms them to WalkerOS events.\n * It works by replacing the dataLayer.push method with a custom handler.\n */\nexport const sourceDataLayer: Source.Init<Types> = async (context) => {\n const { config, env } = context;\n const { elb, window: envWindow } = env;\n\n const settings: Source.Settings<Types> = {\n name: 'dataLayer',\n prefix: 'dataLayer',\n ...config?.settings,\n };\n\n const fullConfig: Source.Config<Types> = {\n settings,\n };\n\n // Captured at init time — see init below.\n let pendingReplayCount = 0;\n\n // Lifecycle setup. Called by the collector eagerly after registration,\n // regardless of `require`. The factory body above is side-effect-free.\n const init = () => {\n if (!envWindow) return;\n const dataLayerName = settings.name || 'dataLayer';\n const dl = (envWindow as Record<string, unknown>)[dataLayerName];\n pendingReplayCount = Array.isArray(dl) ? dl.length : 0;\n\n const win = envWindow as unknown as Record<string, unknown>;\n interceptDataLayer(elb, fullConfig, win);\n };\n\n // Replay pre-existing entries when the run signal lands. The collector\n // strictly gates on() delivery: this fires only when the source is\n // started (`config.init === true` AND `config.require` empty). If a\n // require gate is unmet, the run event is queued in `queueOn` by\n // onApply and replayed when the source becomes started.\n const handleEvent = async (event: On.Types) => {\n if (event === 'run' && envWindow && pendingReplayCount > 0) {\n const win = envWindow as unknown as Record<string, unknown>;\n processExistingEvents(elb, fullConfig, pendingReplayCount, win);\n pendingReplayCount = 0;\n }\n };\n\n return {\n type: 'dataLayer',\n config: fullConfig,\n push: elb,\n on: handleEvent,\n init,\n destroy: async () => {\n // Cleanup: restore original dataLayer.push if possible\n const dataLayerName = settings.name || 'dataLayer';\n if (\n envWindow &&\n envWindow[dataLayerName] &&\n Array.isArray(envWindow[dataLayerName])\n ) {\n // Note: Complete restoration would require storing original push method\n // For now, we'll just document this limitation\n }\n },\n };\n};\n\nexport default sourceDataLayer;\n"],"mappings":";AACA,SAAS,SAAS,UAAU,UAAU,gBAAgB;AAGtD,IAAI,eAAe;AAKZ,SAAS,mBACd,MACA,QACA,MAA+B,WAAW,QAIpC;AACN,QAAM,WAAW,OAAO;AAKxB,QAAM,iBAAgB,qCAAU,SAAQ;AAGxC,MAAI,CAAC,IAAI,aAAa,GAAG;AACvB,QAAI,aAAa,IAAI,CAAC;AAAA,EACxB;AAEA,QAAM,YAAY,IAAI,aAAa;AACnC,MAAI,CAAC,MAAM,QAAQ,SAAS,EAAG;AAG/B,QAAM,eAAe,UAAU,KAAK,KAAK,SAAS;AAGlD,YAAU,OAAO,YAAa,MAAyB;AAErD,QAAI,cAAc;AAChB,aAAO,aAAa,GAAG,IAAI;AAAA,IAC7B;AAEA,mBAAe;AACf,QAAI;AAEF,iBAAW,OAAO,MAAM;AACtB,qBAAa,MAAM,UAAU,GAAG;AAAA,MAClC;AAAA,IACF,UAAE;AACA,qBAAe;AAAA,IACjB;AAGA,WAAO,aAAa,GAAG,IAAI;AAAA,EAC7B;AACF;AAKO,SAAS,sBACd,MACA,QACA,OACA,MAA+B,WAAW,QAIpC;AACN,QAAM,WAAW,OAAO;AAKxB,QAAM,iBAAgB,qCAAU,SAAQ;AACxC,QAAM,YAAY,IAAI,aAAa;AAEnC,MAAI,CAAC,MAAM,QAAQ,SAAS,EAAG;AAG/B,MAAI,aAAc;AAElB,iBAAe;AACf,MAAI;AACF,UAAM,QAAQ,wBAAS,UAAU;AACjC,aAAS,IAAI,GAAG,IAAI,OAAO,KAAK;AAC9B,mBAAa,MAAM,UAAU,UAAU,CAAC,CAAC;AAAA,IAC3C;AAAA,EACF,UAAE;AACA,mBAAe;AAAA,EACjB;AACF;AAKA,SAAS,aACP,MACA,WAAsE,CAAC,GACvE,UACM;AAEN,MAAI,SAAS,QAAQ;AACnB,UAAM,WAAW;AAAA,MACf,MAAM,SAAS,OAAQ,QAAQ;AAAA,MAC/B,MAAM;AAAA;AAAA,IACR;AACA,UAAM,eAAe,SAAS;AAC9B,QAAI,iBAAiB,MAAM;AACzB;AAAA,IACF;AAAA,EACF;AAGA,QAAM,mBAAmB,wBAAwB,QAAQ;AACzD,MAAI,CAAC,kBAAkB;AACrB;AAAA,EACF;AAEA,QAAM,SAAS,SAAS,UAAU;AAClC,QAAM,YAAY,GAAG,MAAM,IAAI,iBAAiB,IAAI;AAGpD,QAAM,EAAE,MAAM,OAAO,GAAG,KAAK,IAAI;AACjC,QAAM,eAA0C;AAAA,IAC9C,MAAM;AAAA,IACN;AAAA,EACF;AAGA;AAAA,IACE,MAAM,KAAK,YAAY;AAAA,IACvB,MAAM;AAAA,IAAC;AAAA;AAAA,EACT,EAAE;AACJ;AAMA,SAAS,wBACP,UACiD;AAEjD,MAAI,SAAS,QAAQ,KAAK,SAAS,SAAS,KAAK,GAAG;AAClD,UAAM,EAAE,OAAO,GAAG,KAAK,IAAI;AAC3B,WAAO,EAAE,MAAM,OAAO,GAAG,KAAK;AAAA,EAChC;AAGA,MAAI,QAAQ,QAAQ,KAAK,SAAS,UAAU,GAAG;AAC7C,WAAO,kBAAkB,QAAQ;AAAA,EACnC;AAGA,MAAI,gBAAgB,QAAQ,GAAG;AAC7B,UAAM,YAAY,MAAM,KAAK,QAA8B;AAC3D,WAAO,kBAAkB,SAAS;AAAA,EACpC;AAEA,SAAO;AACT;AAMA,SAAS,kBACP,MACiD;AACjD,QAAM,CAAC,SAAS,QAAQ,MAAM,IAAI;AAElC,MAAI,CAAC,SAAS,OAAO,EAAG,QAAO;AAE/B,MAAI;AACJ,MAAI,YAAqC,CAAC;AAE1C,UAAQ,SAAS;AAAA,IACf,KAAK;AAEH,UAAI,CAAC,SAAS,MAAM,KAAK,KAAK,SAAS,EAAG,QAAO;AAEjD,UAAI,WAAW,aAAa,WAAW,SAAU,QAAO;AAExD,UAAI,CAAC,SAAS,MAAM,KAAK,WAAW,KAAM,QAAO;AAEjD,kBAAY,GAAG,OAAO,IAAI,MAAM;AAChC,kBAAY,EAAE,GAAG,OAAO;AACxB;AAAA,IAEF,KAAK;AAEH,UAAI,CAAC,SAAS,MAAM,EAAG,QAAO;AAC9B,kBAAY;AACZ,UAAI,SAAS,MAAM,GAAG;AACpB,oBAAY,EAAE,GAAG,OAAO;AAAA,MAC1B;AACA;AAAA,IAEF,KAAK;AAEH,UAAI,CAAC,SAAS,MAAM,EAAG,QAAO;AAC9B,kBAAY,GAAG,OAAO,IAAI,MAAM;AAChC,UAAI,SAAS,MAAM,GAAG;AACpB,oBAAY,EAAE,GAAG,OAAO;AAAA,MAC1B;AACA;AAAA,IAEF,KAAK;AACH,UAAI,SAAS,MAAM,GAAG;AACpB,oBAAY,GAAG,OAAO,IAAI,MAAM;AAChC,YAAI,SAAS,MAAM,GAAG;AACpB,sBAAY,EAAE,GAAG,OAAO;AAAA,QAC1B;AAAA,MACF,WAAW,SAAS,MAAM,GAAG;AAC3B,oBAAY,GAAG,OAAO;AACtB,oBAAY,EAAE,GAAG,OAAO;AAAA,MAC1B,OAAO;AACL,eAAO;AAAA,MACT;AACA;AAAA,IAEF;AAEE,aAAO;AAAA,EACX;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,GAAG;AAAA,EACL;AACF;AAKA,SAAS,gBAAgB,KAAuB;AAC9C,SACE,OAAO,QACP,OAAO,QAAQ,YACf,YAAY,OACZ,OAAQ,IAA2B,WAAW,YAC7C,IAA2B,SAAS;AAEzC;;;ACpPA;;;ACaO,IAAM,kBAAsC,OAAO,YAAY;AACpE,QAAM,EAAE,QAAQ,IAAI,IAAI;AACxB,QAAM,EAAE,KAAK,QAAQ,UAAU,IAAI;AAEnC,QAAM,WAAmC;AAAA,IACvC,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,GAAG,iCAAQ;AAAA,EACb;AAEA,QAAM,aAAmC;AAAA,IACvC;AAAA,EACF;AAGA,MAAI,qBAAqB;AAIzB,QAAM,OAAO,MAAM;AACjB,QAAI,CAAC,UAAW;AAChB,UAAM,gBAAgB,SAAS,QAAQ;AACvC,UAAM,KAAM,UAAsC,aAAa;AAC/D,yBAAqB,MAAM,QAAQ,EAAE,IAAI,GAAG,SAAS;AAErD,UAAM,MAAM;AACZ,uBAAmB,KAAK,YAAY,GAAG;AAAA,EACzC;AAOA,QAAM,cAAc,OAAO,UAAoB;AAC7C,QAAI,UAAU,SAAS,aAAa,qBAAqB,GAAG;AAC1D,YAAM,MAAM;AACZ,4BAAsB,KAAK,YAAY,oBAAoB,GAAG;AAC9D,2BAAqB;AAAA,IACvB;AAAA,EACF;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,IAAI;AAAA,IACJ;AAAA,IACA,SAAS,YAAY;AAEnB,YAAM,gBAAgB,SAAS,QAAQ;AACvC,UACE,aACA,UAAU,aAAa,KACvB,MAAM,QAAQ,UAAU,aAAa,CAAC,GACtC;AAAA,MAGF;AAAA,IACF;AAAA,EACF;AACF;AAEA,IAAO,gBAAQ;","names":[]}
1
+ {"version":3,"sources":["../src/interceptor.ts","../src/types/index.ts","../src/index.ts"],"sourcesContent":["import type { WalkerOS, Source, Collector } from '@walkeros/core';\nimport { isArray, isObject, isString, tryCatch } from '@walkeros/core';\n\n// Global flag to prevent infinite loops\nlet isProcessing = false;\n\n/**\n * DataLayer interceptor - handles dataLayer.push interception and event transformation\n */\nexport function interceptDataLayer(\n push: Collector.PushFn,\n config: Source.Config,\n win: Record<string, unknown> = globalThis.window as unknown as Record<\n string,\n unknown\n >,\n): void {\n const settings = config.settings as {\n name?: string;\n prefix?: string;\n filter?: (event: unknown) => boolean;\n };\n const dataLayerName = settings?.name || 'dataLayer';\n\n // Ensure dataLayer exists\n if (!win[dataLayerName]) {\n win[dataLayerName] = [];\n }\n\n const dataLayer = win[dataLayerName] as unknown[];\n if (!Array.isArray(dataLayer)) return;\n\n // Store original push\n const originalPush = dataLayer.push.bind(dataLayer);\n\n // Override push with event processing\n dataLayer.push = function (...args: unknown[]): number {\n // Prevent infinite loops\n if (isProcessing) {\n return originalPush(...args);\n }\n\n isProcessing = true;\n try {\n // Process each argument\n for (const arg of args) {\n processEvent(push, settings, arg);\n }\n } finally {\n isProcessing = false;\n }\n\n // Call original push\n return originalPush(...args);\n };\n}\n\n/**\n * Process existing events on initialization\n */\nexport function processExistingEvents(\n push: Collector.PushFn,\n config: Source.Config,\n limit?: number,\n win: Record<string, unknown> = globalThis.window as unknown as Record<\n string,\n unknown\n >,\n): void {\n const settings = config.settings as {\n name?: string;\n prefix?: string;\n filter?: (event: unknown) => boolean;\n };\n const dataLayerName = settings?.name || 'dataLayer';\n const dataLayer = win[dataLayerName] as unknown[];\n\n if (!Array.isArray(dataLayer)) return;\n\n // Prevent loops during initialization\n if (isProcessing) return;\n\n isProcessing = true;\n try {\n const count = limit ?? dataLayer.length;\n for (let i = 0; i < count; i++) {\n processEvent(push, settings, dataLayer[i]);\n }\n } finally {\n isProcessing = false;\n }\n}\n\n/**\n * Process a single event - handles filtering, transformation, and WalkerOS event creation\n */\nfunction processEvent(\n push: Collector.PushFn,\n settings: { prefix?: string; filter?: (event: unknown) => boolean } = {},\n rawEvent: unknown,\n): void {\n // Apply filter if provided\n if (settings.filter) {\n const filterFn = tryCatch(\n () => settings.filter!(rawEvent),\n () => false, // If filter throws, don't skip the event\n );\n const filterResult = filterFn();\n if (filterResult === true) {\n return; // Skip filtered events\n }\n }\n\n // Transform the event (handles gtag format and direct objects)\n const transformedEvent = transformDataLayerEvent(rawEvent);\n if (!transformedEvent) {\n return; // Skip invalid events\n }\n\n const prefix = settings.prefix || 'dataLayer';\n const eventName = `${prefix} ${transformedEvent.name}`;\n\n // Create partial WalkerOS event structure (collector will enrich it)\n const { name: _name, ...data } = transformedEvent;\n const partialEvent: WalkerOS.DeepPartialEvent = {\n name: eventName,\n data: data as WalkerOS.Properties,\n };\n\n // Push to collector\n tryCatch(\n () => push(partialEvent),\n () => {}, // Silently handle push errors\n )();\n}\n\n/**\n * Transform dataLayer events to standardized format\n * Handles: gtag arguments, direct objects, existing events\n */\nfunction transformDataLayerEvent(\n rawEvent: unknown,\n): { name: string; [key: string]: unknown } | null {\n // Handle direct object format: { event: 'test', data: 'value' }\n if (isObject(rawEvent) && isString(rawEvent.event)) {\n const { event, ...rest } = rawEvent;\n return { name: event, ...rest };\n }\n\n // Handle gtag argument format: ['consent', 'update', { ad_storage: 'granted' }]\n if (isArray(rawEvent) && rawEvent.length >= 2) {\n return transformGtagArgs(rawEvent);\n }\n\n // Handle arguments object (from gtag function calls)\n if (isGtagArguments(rawEvent)) {\n const argsArray = Array.from(rawEvent as ArrayLike<unknown>);\n return transformGtagArgs(argsArray);\n }\n\n return null;\n}\n\n/**\n * Transform gtag-style arguments to event object\n * ['consent', 'update', { ad_storage: 'granted' }] → { event: 'consent update', ad_storage: 'granted' }\n */\nfunction transformGtagArgs(\n args: unknown[],\n): { name: string; [key: string]: unknown } | null {\n const [command, action, params] = args;\n\n if (!isString(command)) return null;\n\n let eventName: string;\n let eventData: Record<string, unknown> = {};\n\n switch (command) {\n case 'consent':\n // Consent requires action and params\n if (!isString(action) || args.length < 3) return null;\n // Only allow 'default' and 'update' actions for consent\n if (action !== 'default' && action !== 'update') return null;\n // Params must be a valid object (not null)\n if (!isObject(params) || params === null) return null;\n\n eventName = `${command} ${action}`;\n eventData = { ...params };\n break;\n\n case 'event':\n // Event requires at least action parameter\n if (!isString(action)) return null;\n eventName = action;\n if (isObject(params)) {\n eventData = { ...params };\n }\n break;\n\n case 'config':\n // Config requires at least action parameter\n if (!isString(action)) return null;\n eventName = `${command} ${action}`;\n if (isObject(params)) {\n eventData = { ...params };\n }\n break;\n\n case 'set':\n if (isString(action)) {\n eventName = `${command} ${action}`;\n if (isObject(params)) {\n eventData = { ...params };\n }\n } else if (isObject(action)) {\n eventName = `${command} custom`;\n eventData = { ...action };\n } else {\n return null;\n }\n break;\n\n default:\n // Unknown command, ignore\n return null;\n }\n\n return {\n name: eventName,\n ...eventData,\n };\n}\n\n/**\n * Check if object is gtag arguments object\n */\nfunction isGtagArguments(obj: unknown): boolean {\n return (\n obj != null &&\n typeof obj === 'object' &&\n 'length' in obj &&\n typeof (obj as ArrayLike<unknown>).length === 'number' &&\n (obj as ArrayLike<unknown>).length > 0\n );\n}\n","import type { WalkerOS, Source, Elb } from '@walkeros/core';\nimport type { SettingsSchema, Mapping } from '../schemas';\nimport type { z } from '@walkeros/core/dev';\n\ndeclare module '@walkeros/core' {\n interface SourceMap {\n dataLayer: { type: 'dataLayer'; platform?: 'web' };\n }\n}\n\ndeclare global {\n interface Window {\n dataLayer?: DataLayer;\n [key: string]: DataLayer | unknown;\n }\n}\n\nexport type DataLayer = Array<unknown>;\n\n// Base settings from Zod schema\ntype BaseSettings = z.infer<typeof SettingsSchema>;\n\n// Override filter to be actual function type (not serializable in schema)\nexport interface Settings extends Omit<BaseSettings, 'filter'> {\n name?: string;\n prefix?: string;\n filter?: (event: unknown) => WalkerOS.PromiseOrValue<boolean>;\n}\n\n// InitSettings: user input (all optional)\nexport type InitSettings = Partial<Settings>;\n\nexport type { Mapping };\n\nexport type Push = Elb.Fn;\n\nexport interface Env extends Source.BaseEnv {\n window?: Window & typeof globalThis;\n}\n\nexport type Types = Source.Types<Settings, Mapping, Push, Env, InitSettings>;\n\nexport type Config = Source.Config<Types>;\n\nexport type DataLayerEvent = {\n event: string;\n [key: string]: unknown;\n};\n\nexport type MappedEvent = {\n event?: WalkerOS.DeepPartialEvent & { id: string };\n command?: {\n name: string;\n data: unknown;\n };\n};\n","import type { Source, On } from '@walkeros/core';\nimport type { Types } from './types';\nimport { interceptDataLayer, processExistingEvents } from './interceptor';\n\n// Export types for external usage\nexport * as SourceDataLayer from './types';\n\n/**\n * DataLayer source implementation using environment injection.\n *\n * This source intercepts dataLayer.push calls and transforms them to WalkerOS events.\n * It works by replacing the dataLayer.push method with a custom handler.\n */\nexport const sourceDataLayer: Source.Init<Types> = async (context) => {\n const { config, env } = context;\n // Events exit via `push` (the collector's source pipeline, so this source's\n // `next`/`before`/mapping/cache/state and status apply); `elb` stays the\n // outward-facing slot on the instance below. This source emits no commands.\n const { elb, push, window: envWindow } = env;\n\n const settings: Source.Settings<Types> = {\n name: 'dataLayer',\n prefix: 'dataLayer',\n ...config?.settings,\n };\n\n const fullConfig: Source.Config<Types> = {\n settings,\n };\n\n // Captured at init time — see init below.\n let pendingReplayCount = 0;\n\n // Lifecycle setup. Called by the collector eagerly after registration,\n // regardless of `require`. The factory body above is side-effect-free.\n const init = () => {\n if (!envWindow) return;\n const dataLayerName = settings.name || 'dataLayer';\n const dl = (envWindow as Record<string, unknown>)[dataLayerName];\n pendingReplayCount = Array.isArray(dl) ? dl.length : 0;\n\n const win = envWindow as unknown as Record<string, unknown>;\n interceptDataLayer(push, fullConfig, win);\n };\n\n // Replay pre-existing entries when the run signal lands. The collector\n // strictly gates on() delivery: this fires only when the source is\n // started (`config.init === true` AND `config.require` empty). If a\n // require gate is unmet, the run event is queued in `queueOn` by\n // onApply and replayed when the source becomes started.\n const handleEvent = async (event: On.Types) => {\n if (event === 'run' && envWindow && pendingReplayCount > 0) {\n const win = envWindow as unknown as Record<string, unknown>;\n processExistingEvents(push, fullConfig, pendingReplayCount, win);\n pendingReplayCount = 0;\n }\n };\n\n return {\n type: 'dataLayer',\n config: fullConfig,\n // Deliberately `elb`, not the pipeline `push`. This slot is the source's\n // outward-facing entry (and what `startFlow` exports as its `elb` when this\n // source is primary), not the capture path: real dataLayer entries arrive\n // through the intercepted `dataLayer.push`, which routes via the pipeline.\n push: elb,\n on: handleEvent,\n init,\n destroy: async () => {\n // Cleanup: restore original dataLayer.push if possible\n const dataLayerName = settings.name || 'dataLayer';\n if (\n envWindow &&\n envWindow[dataLayerName] &&\n Array.isArray(envWindow[dataLayerName])\n ) {\n // Note: Complete restoration would require storing original push method\n // For now, we'll just document this limitation\n }\n },\n };\n};\n\nexport default sourceDataLayer;\n"],"mappings":"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","names":[]}
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$meta": {
3
3
  "package": "@walkeros/web-source-datalayer",
4
- "version": "4.4.0-next-1785261149472",
4
+ "version": "4.4.0",
5
5
  "type": "source",
6
6
  "platform": [
7
7
  "web"
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@walkeros/web-source-datalayer",
3
3
  "description": "DataLayer source for walkerOS",
4
- "version": "4.4.0-next-1785261149472",
4
+ "version": "4.4.0",
5
5
  "license": "MIT",
6
6
  "main": "./dist/index.js",
7
7
  "module": "./dist/index.mjs",
@@ -38,8 +38,8 @@
38
38
  "update": "npx npm-check-updates -u && npm update"
39
39
  },
40
40
  "dependencies": {
41
- "@walkeros/core": "4.4.0-next-1785261149472",
42
- "@walkeros/collector": "4.4.0-next-1785261149472"
41
+ "@walkeros/core": "4.4.0",
42
+ "@walkeros/collector": "4.4.0"
43
43
  },
44
44
  "devDependencies": {
45
45
  "@types/gtag.js": "^0.0.20"