@walkeros/web-source-cmp-usercentrics 4.2.0-next-1780387694663 → 4.2.0-next-1780420352914

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,16 +1,22 @@
1
1
  # @walkeros/web-source-cmp-usercentrics
2
2
 
3
- ## 4.2.0-next-1780387694663
3
+ ## 4.2.0-next-1780420352914
4
4
 
5
5
  ### Patch Changes
6
6
 
7
+ - 776e5f9: Step examples are no longer bundled into production output. They were
8
+ accidentally exported from the production entry of these packages and pulled
9
+ into bundled JS. Examples remain available via the package `./dev` subpath for
10
+ simulation and testing.
7
11
  - Updated dependencies [908d6f0]
8
12
  - Updated dependencies [654ba38]
9
13
  - Updated dependencies [f4a9013]
14
+ - Updated dependencies [d65bbde]
15
+ - Updated dependencies [126c0f1]
10
16
  - Updated dependencies [654ba38]
11
17
  - Updated dependencies [3eb2467]
12
- - @walkeros/collector@4.2.0-next-1780387694663
13
- - @walkeros/core@4.2.0-next-1780387694663
18
+ - @walkeros/collector@4.2.0-next-1780420352914
19
+ - @walkeros/core@4.2.0-next-1780420352914
14
20
 
15
21
  ## 4.1.2
16
22
 
@@ -1 +1 @@
1
- "use strict";var SourceUsercentrics=(()=>{var e=Object.defineProperty,t=Object.getOwnPropertyDescriptor,n=Object.getOwnPropertyNames,o=Object.prototype.hasOwnProperty,r=(t,n)=>{for(var o in n)e(t,o,{get:n[o],enumerable:!0})},s={};r(s,{SourceUsercentrics:()=>p,createMockElbFn:()=>I,createTrigger:()=>Pt,default:()=>Rt,fullConsent:()=>g,fullConsentCustomMapped:()=>j,fullConsentMapped:()=>k,fullConsentUpperCase:()=>h,implicitConsent:()=>y,minimalConsent:()=>m,minimalConsentMapped:()=>x,nonConsentEvent:()=>b,noopLogger:()=>A,partialConsent:()=>v,partialConsentMapped:()=>O,serviceLevelConsent:()=>w,serviceLevelMapped:()=>E,sourceUsercentrics:()=>Ut,step:()=>S,trigger:()=>Nt});var i=["action","event","type","ucCategory"];function a(e,t,n){e[t]=(void 0===e[t]||Boolean(e[t]))&&n}function c(e,t){const n={};var o;return e.ucCategory&&(o=e.ucCategory,Object.values(o).every(e=>"boolean"==typeof e))?Object.entries(e.ucCategory).forEach(([e,o])=>{var r,s;if("boolean"!=typeof o)return;const i=null!=(s=null==(r=t.categoryMap)?void 0:r[e])?s:e;a(n,i,o)}):(e.ucCategory&&Object.entries(e.ucCategory).forEach(([e,o])=>{var r,s;if("boolean"==typeof o){const i=null!=(s=null==(r=t.categoryMap)?void 0:r[e])?s:e;a(n,i,o)}}),Object.entries(e).forEach(([e,t])=>{if(i.includes(e))return;if("boolean"!=typeof t)return;const o=e.toLowerCase().replace(/ /g,"_");a(n,o,t)})),n}function l(e){const t={};return e.forEach(e=>{var n,o;const r=e.categorySlug,s=null!=(o=null==(n=e.consent)?void 0:n.status)&&o;t[r]=(void 0===t[r]||t[r])&&s}),t}function u(e){var t,n;const{window:o,elb:r,settings:s,logger:i}=e,a=null!=(t=s.eventName)?t:"ucEvent",u=e=>{var t;if(i.debug("event received",e),"consent_status"!==e.event)return;if(s.explicitOnly&&"explicit"!==(null==(t=e.type)?void 0:t.toLowerCase()))return;const n=c(e,s);Object.keys(n).length>0&&r("walker consent",n)},f=e=>{const t=e;t.detail&&u(t.detail)};o.addEventListener(a,f);const d=o.UC_UI;if((null==(n=null==d?void 0:d.isInitialized)?void 0:n.call(d))&&d.getServicesBaseInfo){const e=d.getServicesBaseInfo();e.length>0&&u(function(e){return{event:"consent_status",type:"implicit",ucCategory:l(e)}}(e))}return()=>{o.removeEventListener(a,f)}}var f=new Set(["ACCEPT_ALL","DENY_ALL","SAVE"]);async function d(e){var t;const{window:n,elb:o,settings:r,logger:s}=e,i=null!=(t=r.v3EventName)?t:"UC_UI_CMP_EVENT",a=async e=>{const t=function(e){const t={};return Object.entries(e.categories).forEach(([e,n])=>{t[e]="ALL_ACCEPTED"===n.state}),{event:"consent_status",type:"EXPLICIT"===e.consent.type?"explicit":"implicit",ucCategory:t}}(await e.getConsentDetails());if(s.debug("event received",t),r.explicitOnly&&"explicit"!==t.type)return;const n=c(t,r);Object.keys(n).length>0&&o("walker consent",n)},l=e=>{const t=n.__ucCmp;if(!t)return;const o=e.detail;o&&"CMP"===o.source&&o.type&&f.has(o.type)&&a(t).catch(()=>{})};n.addEventListener(i,l);const u=n.__ucCmp;if(u)try{await u.isInitialized()&&await a(u)}catch(e){s.warn("v3 static consent read failed",e)}return()=>{n.removeEventListener(i,l)}}var p={},g={event:"consent_status",type:"explicit",action:"onAcceptAllServices",ucCategory:{essential:!0,functional:!0,marketing:!0},"Google Analytics":!0,"Google Ads Remarketing":!0},v={event:"consent_status",type:"explicit",action:"onUpdateServices",ucCategory:{essential:!0,functional:!0,marketing:!1},"Google Analytics":!0,"Google Ads Remarketing":!1},m={event:"consent_status",type:"explicit",action:"onDenyAllServices",ucCategory:{essential:!0,functional:!1,marketing:!1},"Google Analytics":!1,"Google Ads Remarketing":!1},y={event:"consent_status",type:"implicit",ucCategory:{essential:!0,functional:!1,marketing:!1},"Google Analytics":!1,"Google Ads Remarketing":!1},h={event:"consent_status",type:"EXPLICIT",action:"onAcceptAllServices",ucCategory:{essential:!0,functional:!0,marketing:!0}},w={event:"consent_status",type:"explicit",action:"onUpdateServices",ucCategory:{essential:!0,functional:"partial",marketing:"partial"},"Google Analytics":!0,"Google Ads Remarketing":!1,Hotjar:!0},b={event:"other_event",type:"explicit"},k={essential:!0,functional:!0,marketing:!0},O={essential:!0,functional:!0,marketing:!1},x={essential:!0,functional:!1,marketing:!1},j={functional:!0,marketing:!0},E={essential:!0,google_analytics:!0,google_ads_remarketing:!1,hotjar:!0},C=()=>{},I=()=>()=>Promise.resolve({ok:!0}),A={error:C,warn:C,info:C,debug:C,throw:e=>{throw"string"==typeof e?new Error(e):e},json:C,scope:()=>A},S={};r(S,{categoryMapOverride:()=>$,customEventName:()=>D,fullConsent:()=>_,minimalConsent:()=>q});var _={title:"Full consent",description:"A Usercentrics onAcceptAllServices event emits a walker consent command with essential, functional, and marketing granted.",trigger:{type:"consent"},in:{event:"consent_status",type:"explicit",action:"onAcceptAllServices",ucCategory:{essential:!0,functional:!0,marketing:!0}},out:[["elb","walker consent",{essential:!0,functional:!0,marketing:!0}]]},q={title:"Minimal consent",description:"A Usercentrics onDenyAllServices event emits a walker consent command with only essential granted.",trigger:{type:"consent"},in:{event:"consent_status",type:"explicit",action:"onDenyAllServices",ucCategory:{essential:!0,functional:!1,marketing:!1}},out:[["elb","walker consent",{essential:!0,functional:!1,marketing:!1}]]},$={title:"Category map override",description:"Custom categoryMap remaps essential to functional and functional to analytics",trigger:{type:"consent"},in:{event:"consent_status",type:"explicit",ucCategory:{essential:!0,functional:!0,marketing:!1}},mapping:{categoryMap:{essential:"functional",functional:"analytics"}},out:[["elb","walker consent",{functional:!0,analytics:!0,marketing:!1}]]},D={title:"Custom event name",description:"Using UC_SDK_EVENT instead of ucEvent for Usercentrics SDK v2",trigger:{type:"consent",options:{eventName:"UC_SDK_EVENT"}},in:{event:"consent_status",type:"explicit",ucCategory:{essential:!0,functional:!0,marketing:!0}},mapping:{eventName:"UC_SDK_EVENT"},out:[["elb","walker consent",{essential:!0,functional:!0,marketing:!0}]]},M=Object.defineProperty,T=(e,t)=>{for(var n in t)M(e,n,{get:t[n],enumerable:!0})};function P(e,t){if("collector"===e)return"collector";if(!t)throw new Error(`stepId(${e}) requires an id`);return`${e}.${t}`}T({},{stepId:()=>P});function N(e,t){const n=e.destinations[t];if(!n)throw new Error(`Destination not found: ${t}`);return n}T({},{getDestination:()=>N});T({},{Level:()=>R});var U,R=((U=R||{})[U.ERROR=0]="ERROR",U[U.WARN=1]="WARN",U[U.INFO=2]="INFO",U[U.DEBUG=3]="DEBUG",U);function z(e,t){const n=e.transformers[t];if(!n)throw new Error(`Transformer not found: ${t}`);return n}T({},{getTransformer:()=>z});function G(e,t){const n=e.sources[t];if(!n)throw new Error(`Source not found: ${t}`);return n}T({},{getSource:()=>G});function L(e,t){const n=e.stores[t];if(!n)throw new Error(`Store not found: ${t}`);return n}function V(e){return{_meta:{hops:0,path:[e]}}}T({},{getStore:()=>L});var K={merge:!0,shallow:!0,extend:!0};function B(e,t={},n={}){n={...K,...n};const o=Object.entries(t).reduce((t,[o,r])=>{const s=e[o];return n.merge&&Array.isArray(s)&&Array.isArray(r)?t[o]=r.reduce((e,t)=>e.includes(t)?e:[...e,t],[...s]):(n.extend||o in e)&&(t[o]=r),t},{});return n.shallow?{...e,...o}:(Object.assign(e,o),e)}function H(e){return Array.isArray(e)}function W(e){return void 0!==e}function F(e){return"function"==typeof e}function Y(e){return"object"==typeof e&&null!==e&&!H(e)&&"[object Object]"===Object.prototype.toString.call(e)}function J(e){return"string"==typeof e}function X(e,t=new WeakMap){if("object"!=typeof e||null===e)return e;if(t.has(e))return t.get(e);const n=Object.prototype.toString.call(e);if("[object Object]"===n){const n={};t.set(e,n);for(const o in e)Object.prototype.hasOwnProperty.call(e,o)&&(n[o]=X(e[o],t));return n}if("[object Array]"===n){const n=[];return t.set(e,n),e.forEach(e=>{n.push(X(e,t))}),n}if("[object Date]"===n)return new Date(e.getTime());if("[object RegExp]"===n){const t=e;return new RegExp(t.source,t.flags)}return e}function Z(e,t="",n){const o=t.split(".");let r=e;for(let e=0;e<o.length;e++){const t=o[e];if("*"===t&&H(r)){const t=o.slice(e+1).join("."),s=[];for(const e of r){const o=Z(e,t,n);s.push(o)}return s}if(r=Y(r)||H(r)?r[t]:void 0,void 0===r)break}return W(r)?r:n}function Q(e,t,n){if(!Y(e))return e;const o=X(e),r=t.split(".");let s=o;for(let e=0;e<r.length;e++){const t=r[e];e===r.length-1?s[t]=n:(t in s&&"object"==typeof s[t]&&null!==s[t]||(s[t]={}),s=s[t])}return o}function ee(e,t){if(!Y(e)&&!H(e))return e;const n=X(e),o=t.split(".");let r=n;for(let e=0;e<o.length;e++){const t=o[e],s=e===o.length-1;if(H(r)){const e=Number(t);if(!Number.isInteger(e)||e<0||e>=r.length)return n;if(s)r.splice(e,1);else{const t=r[e];if(!Y(t)&&!H(t))return n;r=t}}else if(s)delete r[t];else{const e=r[t];if(!Y(e)&&!H(e))return n;r=e}}return n}var te={data:e=>e.data,globals:e=>e.globals,context:e=>e.context,user:e=>e.user,source:e=>e.source,event:e=>({entity:e.entity,action:e.action,id:e.id,timestamp:e.timestamp,name:e.name,trigger:e.trigger,timing:e.timing})};function ne(e,t={},n={}){const o={...t,...n},r={};let s=!e||0===Object.keys(e).length;return Object.keys(o).forEach(t=>{o[t]&&(r[t]=!0,e&&e[t]&&(s=!0))}),!!s&&r}function oe(){let e="";for(let t=0;t<16;t++)e+=(16*Math.random()|0).toString(16);return e}function re(e=6,t){if(t){const n=t.length;let o="";for(let r=0;r<e;r++)o+=t[Math.random()*n|0];return o}let n="";for(let t=36;n.length<e;)n+=(Math.random()*t|0).toString(t);return n}function se(e){return{message:e.message,name:e.name,stack:e.stack,cause:e.cause}}function ie(e,t){let n,o={};return e instanceof Error?(n=e.message,o.error=se(e)):n=e,void 0!==t&&(t instanceof Error?o.error=se(t):"object"==typeof t&&null!==t?(o={...o,...t},"error"in o&&o.error instanceof Error&&(o.error=se(o.error))):o.value=t),{message:n,context:o}}var ae=(e,t,n,o)=>{const r=`${R[e]}${o.length>0?` [${o.join(":")}]`:""}`,s=Object.keys(n).length>0,i=0===e?console.error:1===e?console.warn:console.log;s?i(r,t,n):i(r,t)};function ce(e={}){return le({level:void 0!==e.level?(t=e.level,"string"==typeof t?R[t]:t):0,handler:e.handler,jsonHandler:e.jsonHandler,scope:[]});var t}function le(e){const{level:t,handler:n,jsonHandler:o,scope:r}=e,s=(e,o,s)=>{if(e<=t){const t=ie(o,s);n?n(e,t.message,t.context,r,ae):ae(e,t.message,t.context,r)}};return{error:(e,t)=>s(0,e,t),warn:(e,t)=>s(1,e,t),info:(e,t)=>s(2,e,t),debug:(e,t)=>s(3,e,t),throw:(e,t)=>{const o=ie(e,t);throw n?n(0,o.message,o.context,r,ae):ae(0,o.message,o.context,r),new Error(o.message)},json:e=>{o?o(e):console.log(JSON.stringify(e,null,2))},scope:e=>le({level:t,handler:n,jsonHandler:o,scope:[...r,e]})}}function ue(e){return function(e){return"boolean"==typeof e}(e)||J(e)||function(e){return"number"==typeof e&&!Number.isNaN(e)}(e)||!W(e)||H(e)&&e.every(ue)||Y(e)&&Object.values(e).every(ue)}function fe(e){return ue(e)?e:void 0}function de(e,t,n){return function(...o){try{return e(...o)}catch(e){if(!t)return;return t(e)}finally{null==n||n()}}}function pe(e,t,n){return async function(...o){try{return await e(...o)}catch(e){if(!t)return;return await t(e)}finally{await(null==n?void 0:n())}}}var ge=class e extends Error{constructor(t,n){super(t,n),this.name="FatalError",Object.setPrototypeOf(this,e.prototype)}};async function ve(e,t={},n={}){var o,r;if(!W(e))return;const s=Y(e)&&e.consent||n.consent||(null==(o=n.collector)?void 0:o.consent),i=null!=(r=n.event)?r:Y(e)?e:{};if(!n.collector)throw new Error("getMappingValue: context.collector is required");const a={event:i,mapping:t,collector:n.collector,logger:n.collector.logger,consent:s},c=H(t)?t:[t];for(const t of c){const o=await pe(me,e=>{if(e instanceof ge)throw e;n.collector&&n.collector.status.failed++,a.logger.error("mapping processing failed",{event:i,error:e})})(e,t,{...a,mapping:t});if(W(o))return o}}async function me(e,t,n){return(H(t)?t:[t]).reduce(async(t,o)=>{const r=await t;if(r)return r;const s=J(o)?{key:o}:o;if(!Object.keys(s).length)return;const{condition:i,consent:a,fn:c,key:l,loop:u,map:f,set:d,validate:p,value:g}=s,v={...n,mapping:o};if(i&&!await pe(i,e=>{if(e instanceof ge)throw e;return v.logger.error("mapping condition failed",{event:v.event,error:e}),!1})(e,v))return;if(a&&!ne(a,v.consent))return g;let m=W(g)?g:e;if(c&&(m=await pe(c,e=>{if(e instanceof ge)throw e;v.logger.error("mapping fn failed",{event:v.event,error:e})})(e,v)),l&&(m=Z(e,l,g)),u){const[t,n]=u,o="this"===t?[e]:await ve(e,t,v);H(o)&&(m=(await Promise.all(o.map(e=>ve(e,n,v)))).filter(W))}else f?m=await Object.entries(f).reduce(async(t,[n,o])=>{const r=await t,s=await ve(e,o,v);return W(s)&&(r[n]=s),r},Promise.resolve({})):d&&(m=await Promise.all(d.map(t=>me(e,t,v))));p&&!await pe(p,e=>{if(e instanceof ge)throw e;return v.logger.error("mapping validate failed",{event:v.event,error:e}),!1})(m,v)&&(m=void 0);const y=fe(m);return W(y)?y:fe(g)},Promise.resolve(void 0))}async function ye(e,t,n){var o;t.policy&&await Promise.all(Object.entries(t.policy).map(async([t,o])=>{const r=await ve(e,o,{collector:n,event:e});e=Q(e,t,r)}));const{eventMapping:r,mappingKey:s}=await async function(e,t,n){var o;const[r,s]=(e.name||"").split(" ");if(!t||!r||!s)return{};let i,a="",c=r,l=s;const u=t=>{if(t)return(H(t)?t:[t]).find(t=>{if(!t.condition)return!0;if(!n)return Boolean(t.condition(e,void 0));const o={event:e,mapping:t,collector:n,logger:n.logger,consent:Y(e)&&e.consent||n.consent};return Boolean(t.condition(e,o))})};t[c]||(c="*");const f=t[c];return f&&(f[l]||(l="*"),i=u(f[l])),i||(c="*",l="*",i=u(null==(o=t[c])?void 0:o[l])),i&&(a=`${c} ${l}`),{eventMapping:i,mappingKey:a}}(e,t.mapping,n);(null==r?void 0:r.policy)&&await Promise.all(Object.entries(r.policy).map(async([t,o])=>{const r=await ve(e,o,{collector:n,event:e});e=Q(e,t,r)}));let i=t.data&&await ve(e,t.data,{collector:n,event:e});const a=Boolean(null==r?void 0:r.silent);if(r){if(r.ignore)return{event:e,data:i,mapping:r,mappingKey:s,ignore:!0,silent:a};if(r.name&&(e.name=r.name),r.data){const t=r.data&&await ve(e,r.data,{collector:n,event:e});i=Y(i)&&Y(t)?B(i,t):t}}const c=null!=(o=null==r?void 0:r.include)?o:t.include;if(c&&c.length>0){const t=function(e,t){const n={},o=t.includes("all")?Object.keys(te):t;for(const t of o){const o=te[t];if(!o)continue;const r=o(e);if(Y(r))for(const[e,o]of Object.entries(r)){if(void 0===o)continue;const r="context"===t&&Array.isArray(o)?o[0]:o;n[`${t}_${e}`]=r}}return n}(e,c);Object.keys(t).length>0&&(i=Y(i)?B(t,i):null!=i?i:t)}if((null==r?void 0:r.remove)&&Y(i))for(const e of r.remove)i=ee(i,e);return{event:e,data:i,mapping:r,mappingKey:s,ignore:!1,silent:a}}function he(e,t,n,o){const r=e;return function(...e){let s;const i="pre"+t,a="post"+t,c=n[i],l=n[a],u=(e,t)=>{o?o.warn(e,{error:t}):console.warn(e,t)};if(c)try{s=c({fn:r},...e)}catch(t){u(`Hook ${String(i)} failed, falling back to original function`,t),s=r(...e)}else s=r(...e);if(l)try{s=l({fn:r,result:s},...e)}catch(e){u(`Hook ${String(a)} failed, keeping original result`,e)}return s}}function we(e,t){if(0===e.observers.size)return;const n=Array.from(e.observers);for(const e of n)try{e(t)}catch(e){}}function be(e){if(void 0===e||"*"===e)return()=>!0;if("and"in e){const t=e.and.map(be);return e=>t.every(t=>t(e))}if("or"in e){const t=e.or.map(be);return e=>t.some(t=>t(e))}return function(e){const{key:t,operator:n,value:o,not:r}=e,s=function(e,t){switch(e){case"eq":return e=>String(null!=e?e:"")===t;case"contains":return e=>String(null!=e?e:"").includes(t);case"prefix":return e=>String(null!=e?e:"").startsWith(t);case"suffix":return e=>String(null!=e?e:"").endsWith(t);case"regex":{const e=new RegExp(t);return t=>e.test(String(null!=t?t:""))}case"gt":{const e=Number(t);return t=>Number(t)>e}case"lt":{const e=Number(t);return t=>Number(t)<e}case"exists":return e=>null!=e}}(n,o);return e=>{const n=Z(e,t),o=s(n);return r?!o:o}}(e)}function ke(e){return Array.isArray(e)&&e.length>0&&e.every(e=>function(e){return"object"==typeof e&&null!==e&&!Array.isArray(e)&&("match"in e||"next"in e||"one"in e||"many"in e)}(e))}function Oe(e){return e.map(e=>{var t,n;if("string"==typeof e)return{match:()=>!0,next:{type:"static",value:e}};if(Array.isArray(e))return{match:()=>!0,next:null!=(t=xe(e))?t:{type:"chain",value:[]}};const o=e;return{match:o.match?be(o.match):()=>!0,next:null!=(n=xe(o))?n:{type:"chain",value:[]}}})}function xe(e){if(null==e)return;if("string"==typeof e)return{type:"static",value:e};if(Array.isArray(e)){if(0===e.length)return;if(ke(e))return xe({one:e});if(e.every(e=>"string"==typeof e))return{type:"chain",value:e};const t=[];for(const n of e){const e=xe(n);void 0!==e&&t.push(e)}if(0===t.length)return;return{type:"sequence",value:t}}const t=e;if("next"in t&&void 0!==t.next)return t.match?{type:"gate",match:be(t.match),next:xe(t.next)}:xe(t.next);if("one"in t&&t.one){const e=Oe(t.one);return t.match?{type:"gate",match:be(t.match),next:{type:"one",routes:e}}:{type:"one",routes:e}}if("many"in t&&t.many){const e=Oe(t.many);return t.match?{type:"gate",match:be(t.match),next:{type:"many",routes:e}}:{type:"many",routes:e}}return t.match?{type:"gate",match:be(t.match)}:void 0}var je=new WeakMap;function Ee(e,t={}){if(null==e)return[];let n;if("object"==typeof e){const t=je.get(e);t?n=t:(n=xe(e),n&&je.set(e,n))}else n=xe(e);if(!n)return[];const o=Ce(n,t);return void 0===o?[]:Array.isArray(o)?o:[o]}function Ce(e,t={}){if(e){if("static"===e.type)return e.value;if("chain"===e.type)return e.value;if("gate"===e.type){if(!e.match(t))return;return Ce(e.next,t)}if("sequence"===e.type){const n=[];for(const o of e.value){const e=Ce(o,t);void 0!==e&&(Array.isArray(e)?n.push(...e):n.push(e))}return n.length>0?n:void 0}if("many"===e.type){const n=[];for(const o of e.routes){if(!o.match(t))continue;const e=Ce(o.next,t);void 0!==e&&(Array.isArray(e)?n.push(...e):n.push(e))}return n.length>0?n:void 0}for(const n of e.routes)if(n.match(t))return Ce(n.next,t)}}function Ie(e,t){const n={ingest:null!=e?e:{}};return void 0!==t&&(n.event=t),n}function Ae(e){var t;return{stop:null!=(t=e.stop)&&t,storeId:e.store,namespace:e.namespace,rules:e.rules.map(e=>({match:e.match?be(e.match):()=>!0,key:e.key,ttl:e.ttl,update:e.update}))}}async function Se(e,t,n,o){const r=e.rules.find(e=>e.match(n));if(!r)return null;const s=r.key.map(e=>{var t;return String(null!=(t=Z(n,e))?t:"")});if(s.every(e=>""===e))return null;const i=s.join(":"),a=null!=o?o:e.namespace,c=a?`${a}:${i}`:i,l=await t.get(c);return void 0!==l?{status:"HIT",key:c,value:l,rule:r}:{status:"MISS",key:c,rule:r}}function _e(e,t,n,o){e.set(t,n,1e3*o)}async function qe(e,t,n,o){if(!t)return e;let r=e;for(const[e,s]of Object.entries(t))r=Q(r,e,await ve(n,s,{collector:o}));return r}function $e(e){return H(e)?e:[e]}async function De(e,t,n,o){let r=n;for(const n of e)await pe(async()=>{const e=t(n.store);if(!e)return;const s=await ve(r,n.key,{collector:o,event:r});if(!J(s))return;const i=n.store?s:`state:${s}`;if("set"===n.mode){const t=await ve(r,n.value,{collector:o,event:r});if(!W(t))return;await e.set(i,t)}else{const t=J(a=n.value)?a:Y(a)&&J(a.key)?a.key:void 0;if(!t)return;const o=await e.get(i);if(!W(o))return;r=Q(r,t,o)}var a},e=>{var t,n;if(e instanceof ge)throw e;null==(n=null==(t=o.logger)?void 0:t.error)||n.call(t,"[state] operation failed",e)})();return r}var Me={Source:["code","package","import","before","next","cache","state"],Transformer:["code","package","import","before","next","cache","state","mapping"],Destination:["code","package","import","before","next","cache","state"],Store:["code","package","import","cache"]},Te=["config","env","validate","variables","examples","disabled","id","logger","mock","chainMocks"],Pe={Source:["primary"],Transformer:[],Destination:[],Store:[]},Ne=/^[A-Za-z_$][A-Za-z0-9_$]*$/;function Ue(e,t){const n=(o=t,new Set([...Me[o],...Te,...Pe[o]]));var o;for(const o of Object.keys(e))if(!n.has(o))return{ok:!1,code:"UNKNOWN_KEY",key:o,reason:`Unknown key "${o}" on ${t}. Allowed: ${[...n].sort().join(", ")}.`};const r=void 0!==e.package,s=void 0!==e.import,i=void 0!==e.code;return i&&"string"==typeof e.code?{ok:!1,code:"OBSOLETE_CODE_STRING",key:"code",reason:`code: "<name>" is no longer supported. Use import: "${e.code}" with the package field instead.`}:i&&("object"!=typeof e.code&&"function"!=typeof e.code||null===e.code||Array.isArray(e.code))?{ok:!1,code:"INVALID_CODE_SHAPE",key:"code",reason:"code must be an object ({ push, type?, init? }) or a resolved function value."}:i&&r?{ok:!1,code:"CONFLICT",key:"package",reason:"Cannot specify both `code` and `package`. Use one or the other."}:i&&s?{ok:!1,code:"CONFLICT",key:"import",reason:"Cannot specify both `code` and `import`."}:s&&!r?{ok:!1,code:"MISSING_PACKAGE",key:"import",reason:"`import` requires `package` to be set."}:!s||"string"==typeof e.import&&Ne.test(e.import)?{ok:!0}:{ok:!1,code:"INVALID_IMPORT",key:"import",reason:`import must match ${Ne.source}. Got: ${JSON.stringify(e.import)}.`}}var Re={Action:"action",Actions:"actions",Config:"config",Consent:"consent",Context:"context",Custom:"custom",Destination:"destination",Elb:"elb",Globals:"globals",Hook:"hook",Init:"init",Link:"link",On:"on",Prefix:"data-elb",Ready:"ready",Run:"run",Session:"session",Shutdown:"shutdown",User:"user",Walker:"walker"};function ze(e,t){const n=e.status.startedAt;return{flowId:"default",stepId:t.stepId,stepType:t.stepType,phase:t.phase,eventId:t.eventId,timestamp:new Date(t.now).toISOString(),elapsedMs:t.now-n}}function Ge(e,t){return e.storeId&&t.stores[e.storeId]?t.stores[e.storeId]:t.stores.__cache}function Le(e,t){return e?t.stores[e]:t.stores.__cache}function Ve(e){var t;const n={};for(const[o,r]of Object.entries(e)){const e=null==(t=r.config)?void 0:t.next;"string"==typeof e||Array.isArray(e)&&e.every(e=>"string"==typeof e)?n[o]={next:e}:n[o]={}}return n}function Ke(e,t){const n=e.config||{},o=e[t];return void 0!==o?{config:{...n,[t]:o},chainValue:o}:{config:n,chainValue:void 0}}function Be(e,t={}){if(!e)return[];if(Array.isArray(e))return e;const n=[],o=new Set;let r=e;for(;r&&t[r]&&!o.has(r);){o.add(r),n.push(r);const e=t[r].next;if(Array.isArray(e)){n.push(...e);break}r=e}return n}async function He(e,t,n){if(t.init&&!t.config.init){const o=t.type||"unknown",r=e.logger.scope(`transformer:${o}`),s={collector:e,logger:r,id:n,ingest:V(n),config:t.config,env:Je(t.config.env)};r.debug("init");const i=await he(t.init,"TransformerInit",e.hooks,e.logger)(s);if(!1===i)return!1;t.config={...i||t.config,env:(null==i?void 0:i.env)||t.config.env,init:!0},r.debug("init done")}return!0}async function We(e,t,n,o,r,s){const i=t.type||"unknown",a=e.logger.scope(`transformer:${i}`),c={collector:e,logger:a,id:n,ingest:r,config:t.config,env:{...Je(t.config.env),...s?{respond:s}:{}}};a.debug("push",{event:o.name});const l="string"==typeof o.id?o.id:"",u=Date.now();we(e,ze(e,{stepId:P("transformer",n),stepType:"transformer",phase:"in",eventId:l,now:u}));try{const r=await he(t.push,"TransformerPush",e.hooks,e.logger)(o,c),s=Date.now(),i=ze(e,{stepId:P("transformer",n),stepType:"transformer",phase:"out",eventId:l,now:s});return i.durationMs=s-u,i.outEvent=r,we(e,i),a.debug("push done"),r}catch(t){const o=Date.now(),r=ze(e,{stepId:P("transformer",n),stepType:"transformer",phase:"error",eventId:l,now:o});throw r.durationMs=o-u,r.error=t instanceof Error?{name:t.name,message:t.message}:{message:String(t)},we(e,r),t}}function Fe(e,t){return e?{...e,_meta:{...e._meta,path:[...e._meta.path]}}:V(t)}async function Ye(e,t,n,o,r,s,i){var a,c,l,u,f,d,p,g,v;r||(r=V(null!=(a=n[0])?a:"chain")),i&&r._meta&&(r._meta.chainPath=i);let m=o,y=s;for(const o of n){const s=t[o];if(!s){e.logger.warn(`Transformer not found: ${o}`);continue}if(r&&r._meta&&r._meta.path.length>256)return e.logger.error(`Max path length exceeded at ${o}`),{event:null,respond:y};if(r&&r._meta&&(r._meta.hops++,r._meta.path.push(o)),!await pe(He,t=>{if(t instanceof ge)throw t;return e.status.failed++,e.logger.scope(`transformer:${s.type||"unknown"}`).error("transformer init failed",{transformer:o,error:t}),!1})(e,s,o))return{event:null,respond:y};if(i&&void 0!==(null==(l=null==(c=s.config)?void 0:c.chainMocks)?void 0:l[i])){const t=s.config.chainMocks[i];e.logger.scope(`transformer:${s.type||"unknown"}`).debug("chainMock",{chain:i}),m=t;continue}if(void 0!==(null==(u=s.config)?void 0:u.mock)){e.logger.scope(`transformer:${s.type||"unknown"}`).debug("mock"),m=s.config.mock;continue}if(null==(f=s.config)?void 0:f.disabled)continue;const a=null==(d=s.config)?void 0:d.cache,h=a?Ae(a):void 0,w=h?Ge(h,e):void 0,b=(null==(p=s.config)?void 0:p.state)?$e(s.config.state):void 0,k=null==b?void 0:b.filter(e=>"get"===e.mode),O=null==b?void 0:b.filter(e=>"set"===e.mode),x=async t=>O&&0!==O.length?De(O,t=>Le(t,e),t,e):t;let j;if(h&&w){const e=Ie(r,m),t=await Se(h,w,e);if("HIT"===(null==t?void 0:t.status)&&t.value){if(m=t.value,h.stop)return{event:m,respond:y,stopped:!0};continue}"MISS"===(null==t?void 0:t.status)&&(j={key:t.key,ttl:t.rule.ttl})}const E=s.config.before;if(E){const n=Ee(E,Ie(r,m));if(1===n.length){const o=Be(n[0],Ve(t));if(o.length>0){const n=await Ye(e,t,o,m,r,y,i);if(null===n.event)return{event:null,respond:null!=(g=n.respond)?g:y};if(n.stopped)return{event:Array.isArray(n.event)?n.event[0]:n.event,respond:null!=(v=n.respond)?v:y,stopped:!0};n.respond&&(y=n.respond),m=Array.isArray(n.event)?n.event[0]:n.event}}else n.length>1&&await Promise.all(n.map(n=>pe(Ye,t=>(e.logger.scope("transformer:many").error(`many branch ${n} failed`,{error:t}),{event:null,respond:void 0}))(e,t,Be(n,Ve(t)),m,Fe(r,n),void 0,i)))}k&&k.length>0&&(m=await De(k,t=>Le(t,e),m,e));const C=await pe(We,t=>(e.logger.scope(`transformer:${s.type||"unknown"}`).error("Push failed",{error:t}),!1))(e,s,o,m,r,y);if(!1===C)return{event:null,respond:y};if(Array.isArray(C)){const s=n.slice(n.indexOf(o)+1),a=await Promise.all(C.map(async n=>{const o=await x(n.event||m),a=Fe(r,"unknown");if(n.next){const r=Ee(n.next,Ie(a,o));if(0===r.length)return{event:o,respond:y};if(1===r.length){const n=Be(r[0],Ve(t));return n.length>0?Ye(e,t,n,o,a,y,i):{event:o,respond:y}}return(await Promise.all(r.map(n=>pe(Ye,t=>(e.logger.scope("transformer:many").error(`many branch ${n} failed`,{error:t}),{event:null,respond:void 0}))(e,t,Be(n,Ve(t)),o,Fe(a,n),void 0,i)))).map(e=>({event:e.event,respond:void 0}))}return s.length>0?Ye(e,t,s,o,a,y,i):{event:o,respond:y}}));let c=y;const l=[];for(const e of a.flat())if(null!==e)if(e&&"object"==typeof e&&"event"in e){const t=e;if(t.respond&&(c=t.respond),null===t.event)continue;Array.isArray(t.event)?l.push(...t.event):l.push(t.event)}else l.push(e);return 0===l.length?{event:null,respond:c}:1===l.length?{event:l[0],respond:c}:{event:l,respond:c}}if(C&&"object"==typeof C){const{event:n,respond:o,next:s}=C;if(o&&(y=o),void 0!==s){const o=await x(n||m),a=Ee(s,Ie(r,o));if(0===a.length){m=o;continue}if(1===a.length){const n=Be(a[0],Ve(t));return n.length>0?Ye(e,t,n,o,r,y,i):(e.logger.warn(`Branch target not found: ${JSON.stringify(s)}`),{event:null,respond:y})}return await Promise.all(a.map(n=>pe(Ye,t=>(e.logger.scope("transformer:many").error(`many branch ${n} failed`,{error:t}),{event:null,respond:void 0}))(e,t,Be(n,Ve(t)),o,Fe(r,n),void 0,i))),{event:null,respond:void 0}}n&&(m=n)}O&&O.length>0&&(m=await De(O,t=>Le(t,e),m,e)),j&&w&&_e(w,j.key,m,j.ttl);const I=s.config.next,A="string"==typeof I||Array.isArray(I)&&I.every(e=>"string"==typeof e),S=void 0!==I&&!A;if((!C||"object"==typeof C&&!C.next)&&S){const n=Ee(s.config.next,Ie(r,m));if(1===n.length){const o=Be(n[0],Ve(t));return o.length>0?Ye(e,t,o,m,r,y,i):{event:m,respond:y}}return n.length>1?(await Promise.all(n.map(n=>pe(Ye,t=>(e.logger.scope("transformer:many").error(`many branch ${n} failed`,{error:t}),{event:null,respond:void 0}))(e,t,Be(n,Ve(t)),m,Fe(r,n),void 0,i))),{event:null,respond:void 0}):{event:m,respond:y}}}return{event:m,respond:y}}function Je(e){return e&&Y(e)?e:{}}function Xe(e){return"string"==typeof e||!(!Array.isArray(e)||!e.every(e=>"string"==typeof e))}async function Ze(e,t,n){var o,r;if(!t.on||!(null==(o=t.queueOn)?void 0:o.length))return;const s=t.queueOn;t.queueOn=[];const i=n||(null==(r=t.config)?void 0:r.id)||"unknown";for(const{type:n,data:o}of s)nt(n)&&!rt(e,t)||(await pe(t.on,t=>{if(t instanceof ge)throw t;e.status.failed++,e.logger.scope("source").error("source on flush failed",{sourceId:i,type:n,error:t})})(n,o),nt(n)&&ot(e,t))}function Qe(e){var t;return Boolean(e.config.init)&&!(null==(t=e.config.require)?void 0:t.length)}async function et(e,t,n){var o,r;const{code:s,config:i={},env:a={},primary:c,next:l,before:u,cache:f}=n,d=null!=(o=i.state)?o:n.state,p=d?$e(d):void 0,g=f,v=g?Ae({...g,stop:null==(r=g.stop)||r}):void 0,m=Xe(l)?Be(l,Ve(e.transformers)):void 0,y=Xe(u)?Be(u,Ve(e.transformers)):void 0,h=a.push,w=null!=h?h:e.push,b=Boolean(h),k=async(n,o,r)=>{var s;let a;const c=null!=y?y:void 0!==u?(()=>{const t=Ee(u,Ie(r.ingest));return 0===t.length?[]:Be(1===t.length?t[0]:t,Ve(e.transformers))})():[];let f=[n];if(c.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const o=await Ye(e,e.transformers,c,n,r.ingest,r.respond,`source.${t}.before`);if(null===o.event)return{ok:!0};if(o.stopped)return o.respond&&(r.respond=o.respond),{ok:!0};o.respond&&(r.respond=o.respond),f=Array.isArray(o.event)?o.event:[o.event]}if(v){const t=Ge(v,e);if(t){const n=Ie(r.ingest),o=await Se(v,t,n);if(o){if("HIT"===o.status&&void 0!==o.value&&v.stop){let t=o.value;return o.rule.update&&(t=await qe(t,o.rule.update,{...n,cache:{status:"HIT"}},e)),null==(s=r.respond)||s.call(r,t),{ok:!0}}if("MISS"===o.status&&v.stop&&r.respond){const s=r.respond,i=o.rule.update,c={...n,cache:{status:"MISS"}},l=o.key,u=o.rule.ttl,f=n=>{_e(t,l,n,u),i?a=(async()=>{const t=await qe(n,i,c,e);s(t)})():s(n)};r.respond=f}"MISS"!==o.status||v.stop||_e(t,o.key,!0,o.rule.ttl)}}}const d=m?{kind:"single",preChain:m}:void 0!==l?(()=>{const t=Ee(l,Ie(r.ingest));return 0===t.length?{kind:"single",preChain:[]}:1===t.length?{kind:"single",preChain:Be(t[0],Ve(e.transformers))}:{kind:"many",branches:t.map(t=>Be(t,Ve(e.transformers)))}})():{kind:"single",preChain:[]};!b&&p&&p.length>0&&(f=await Promise.all(f.map(t=>De(p,t=>Le(t,e),t,e))));let g={ok:!0};for(const n of f)"many"===d.kind?(await Promise.all(d.branches.map((s,a)=>pe(async()=>b?w(n):w(n,{...o,id:t,ingest:Fe(r.ingest,`${t}.${a}`),respond:void 0,mapping:i,preChain:s}),t=>(e.logger.scope("source:many").error(`many branch ${a} failed`,{error:t}),{ok:!0}))())),g={ok:!0}):g=b?await w(n):await w(n,{...o,id:t,ingest:r.ingest,respond:r.respond,mapping:i,preChain:d.preChain});return a&&await a,g},O=async n=>{const o=V(t);if(!i.ingest||void 0===n)return o;const r=await ve(n,i.ingest,{collector:e});return{...o,...r,_meta:o._meta}},x=e.logger.scope("source").scope(t),j={command:e.command,sources:e.sources,elb:e.sources.elb.push,logger:x,...a,push:async(e,n={})=>{const o={ingest:V(t),respond:void 0};return k(e,n,o)}},E={collector:e,logger:x,id:t,config:i,env:j,withScope:async(e,t,n)=>{const o={ingest:await O(e),respond:t};return n({...j,push:(e,t={})=>k(e,t,o),ingest:o.ingest,respond:o.respond})}},C=await pe(s,n=>{if(n instanceof ge)throw n;e.status.failed++,e.logger.scope("source").error("source factory failed",{sourceId:t,error:n})})(E);if(!C)return;const I=C.type||"unknown",A=e.logger.scope(I).scope(t);return j.logger=A,c&&(C.config={...C.config,primary:c}),C}function tt(e,t,n,o){if(n instanceof ge)throw n;e.logger.scope("on").error("on callback failed",{kind:t,...o,error:n})}function nt(e){return e===Re.Consent||e===Re.User||e===Re.Globals||e===Re.Custom}function ot(e,t){e.delivery.set(t,e.stateVersion)}function rt(e,t){return e.allowed&&e.stateVersion>function(e,t){const n=e.delivery.get(t);return void 0===n?-1:n}(e,t)}function st(e,t,n){const o=e.cascade;if(!o)return!0;let r=o.counts.get(t);r||(r={},o.counts.set(t,r));const s=String(n),i=(r[s]||0)+1;return r[s]=i,i<=8||(9===i&&e.logger.error("state delivery did not converge",{type:s}),!1)}function it(e,t){return{collector:e,logger:e.logger.scope("on").scope(String(t))}}function at(e,t,n,o,r){if(!t.on)return;const s=t.type||"unknown",i=e.logger.scope(s).scope("on").scope(o),a={collector:e,logger:i,id:n,config:t.config,data:r,env:Ct(t.env,t.config.env)};de(t.on,t=>tt(e,"destination",t,{destId:n,type:o}))(o,a)}function ct(e,t,n,o){let r;switch(t){case Re.Consent:r=o||e.consent;break;case Re.Session:r=e.session;break;case Re.User:r=o||e.user;break;case Re.Custom:r=o||e.custom;break;case Re.Globals:r=o||e.globals;break;case Re.Config:r=o||e.config;break;case Re.Ready:case Re.Run:default:r=void 0}if(n.length)switch(t){case Re.Consent:!function(e,t,n){const o=n||e.consent,r=it(e,Re.Consent);t.forEach(t=>{rt(e,t)&&st(e,t,Re.Consent)&&(Object.keys(o).filter(e=>e in t).forEach(n=>{de(t[n],t=>tt(e,"consent",t,{key:n}))(o,r)}),ot(e,t))})}(e,n,o);break;case Re.Ready:!function(e,t){if(!e.allowed)return;const n=it(e,Re.Ready);t.forEach(t=>{de(t,t=>tt(e,"ready",t))(void 0,n)})}(e,n);break;case Re.Run:!function(e,t){if(!e.allowed)return;const n=it(e,Re.Run);t.forEach(t=>{de(t,t=>tt(e,"run",t))(void 0,n)})}(e,n);break;case Re.Session:!function(e,t){if(!e.session)return;const n=it(e,Re.Session);t.forEach(t=>{de(t,t=>tt(e,"session",t))(e.session,n)})}(e,n);break;default:{const o=it(e,t),s=nt(t);n.forEach(n=>{"function"==typeof n&&(s&&!rt(e,n)||s&&!st(e,n,t)||(de(n,n=>tt(e,"generic",n,{type:t}))(r,o),s&&ot(e,n)))});break}}}function lt(e,t,n){switch(t){case Re.Consent:return n||e.consent;case Re.Session:return e.session;case Re.User:return n||e.user;case Re.Custom:return n||e.custom;case Re.Globals:return n||e.globals;case Re.Config:return n||e.config;default:return}}async function ut(e,t,n,o,r){if(!t.on)return!1;if(nt(o)&&!rt(e,t))return!1;if(nt(o)&&!st(e,t,o))return!1;const s=await pe(t.on,t=>tt(e,"source",t,{sourceId:n,type:o}))(o,r);return nt(o)&&ot(e,t),!1===s}function ft(e,t,n,o){var r;if(!Number.isFinite(n.max)||n.max<=0)throw new Error(`pushBounded: max must be > 0 (got ${n.max})`);if("dropNewest"===(null!=(r=n.onOverflow)?r:"dropOldest"))return e.length>=n.max?(o&&o([t]),{appended:!1,dropped:1}):(e.push(t),{appended:!0,dropped:0});const s=[];for(;e.length>=n.max;)s.push(e.shift());return e.push(t),s.length>0&&o&&o(s),{appended:!0,dropped:s.length}}var dt=new WeakMap;function pt(e,t,n,o){dt.get(e)||(dt.set(e,!0),t.warn(n,o))}function gt(e){dt.delete(e)}var vt=Object.freeze({batched:!0});function mt(e){return e===vt}function yt(e){return void 0===e?{}:"number"==typeof e?{wait:e}:{wait:e.wait,size:e.size,age:e.age}}function ht(e,t){return e.status.destinations[t]||(e.status.destinations[t]={count:0,failed:0,duration:0,queuePushSize:0,dlqSize:0}),e.status.destinations[t]}function wt(e,t,n,o){var r;e.dropped[t]||(e.dropped[t]={});const s=e.dropped[t];return s[n]=(null!=(r=s[n])?r:0)+o,s[n]}function bt(e,t,n){if(!e)return[];if(Array.isArray(e)&&e.every(e=>"string"==typeof e))return Be(e,t);if("string"==typeof e)return Be(e,t);const o=Ee(e,Ie(n));return 0===o.length?[]:1===o.length?Be(o[0],t):Be(o,t)}async function kt(e,t,n={},o){var r,s,i,a,c,l;const{allowed:u,consent:f,globals:d,user:p}=e;if(!u)return jt({ok:!1});if(t){const n=e.config.queueMax;if(void 0===n)throw new Error("Collector.Config.queueMax is undefined; defaults must be seeded by collector()");const o=ft(e.queue,t,{max:n});if(o.dropped>0){const t=wt(e.status,P("collector"),"queue",o.dropped);pt(e.queue,e.logger,"collector.queue overflow; oldest events dropped",{buffer:"queue",cap:n,droppedCount:t})}else e.queue.length<n&&gt(e.queue);e.status.in++}o||(o=e.destinations);const g=e.transformers?Ve(e.transformers):{},v=await Promise.all(Object.entries(o||{}).map(async([o,r])=>{var s,i,a,c,l;if(r.config.disabled)return{id:o,destination:r,skipped:!0};let u=(r.queuePush||[]).map(e=>({...e,consent:f}));r.queuePush=[],t&&u.push(X(t));const v=n.ingest?{...n.ingest,_meta:{...n.ingest._meta,path:[...n.ingest._meta.path]}}:V("unknown");if(!u.length&&!(null==(s=r.queueOn)?void 0:s.length))return{id:o,destination:r,skipped:!0};if(!u.length&&(null==(i=r.queueOn)?void 0:i.length)){let t=!1;try{t=await Ot(e,r,o)}catch(t){e.status.failed++;const n=r.type||"unknown";e.logger.scope(n).error("destination init failed",{error:t instanceof Error?t.message:String(t)})}return{id:o,destination:r,skipped:!t}}const m=[],y=u.filter(t=>{const n=ne(r.config.consent,f,t.consent);if(n)return t.consent=n,m.push(t),!1;const s=ze(e,{stepId:P("destination",o),stepType:"destination",phase:"skip",eventId:"string"==typeof t.id?t.id:"",now:Date.now()});return s.skipReason="consent",f&&(s.consent={...f}),r.config.consent&&(s.meta={required:{...r.config.consent}}),we(e,s),!0});if(y.length>0){const t=r.queuePush,n=r.config.id||o,s={max:null!=(a=r.config.queueMax)?a:1e3};let i=0;for(const e of y)i+=ft(t,e,s).dropped;if(i>0){ht(e,n);const o=wt(e.status,P("destination",n),"queue",i);pt(t,e.logger.scope(r.type||"unknown"),"destination.queuePush overflow; oldest events dropped",{buffer:"queuePush",destination:n,cap:s.max,droppedCount:o})}else t.length<s.max&&gt(t)}if(!m.length)return{id:o,destination:r,queue:u};let h,w,b=!1;try{b=await Ot(e,r,o)}catch(t){e.status.failed++;const n=r.type||"unknown";e.logger.scope(n).error("destination init failed",{error:t instanceof Error?t.message:String(t)})}if(!b)return{id:o,destination:r,queue:u};r.dlq||(r.dlq=[]);const k=bt(r.config.before,g,v),O=r.config.next,x=null==(c=r.config)?void 0:c.cache,j=x?Ae(x):void 0,E=j?Ge(j,e):void 0,C=(null==(l=r.config)?void 0:l.state)?$e(r.config.state):void 0,I=null==C?void 0:C.filter(e=>"get"===e.mode),A=null==C?void 0:C.filter(e=>"set"===e.mode);let S=0,_=0;return await Promise.all(m.map(async t=>{let s;if(t.globals=B(d,t.globals),t.user=B(p,t.user),(null==j?void 0:j.stop)&&E){const e=Ie(v,t),n=await Se(j,E,e);if("HIT"===(null==n?void 0:n.status))return t;"MISS"===(null==n?void 0:n.status)&&(s={key:n.key,ttl:n.rule.ttl})}let i=t,a=n.respond;if(k.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const r=await Ye(e,e.transformers,k,t,v,n.respond,`destination.${o}.before`);if(null===r.event)return t;r.respond&&(a=r.respond),i=Array.isArray(r.event)?r.event[0]:r.event}if(j&&!j.stop&&E){const e=Ie(v,i),n=await Se(j,E,e);if("HIT"===(null==n?void 0:n.status))return t;"MISS"===(null==n?void 0:n.status)&&(s={key:n.key,ttl:n.rule.ttl})}I&&I.length>0&&i&&(i=await De(I,t=>Le(t,e),i,e));const c=Date.now();let l=!1;const u=await pe(xt,t=>{var n;const s=r.type||"unknown";e.logger.scope(s).error("Push failed",{error:t,event:i.name}),h=t,l=!0;const a=r.dlq,c=r.config.id||o,u={max:null!=(n=r.config.dlqMax)?n:100},f=ft(a,[i,t],u);if(f.dropped>0){ht(e,c);const t=wt(e.status,P("destination",c),"dlq",f.dropped);pt(a,e.logger.scope(r.type||"unknown"),"destination.dlq overflow; oldest entries dropped",{buffer:"dlq",destination:c,cap:u.max,droppedCount:t})}else a.length<u.max&&gt(a)})(e,r,o,i,v,a);if(S+=Date.now()-c,s&&E&&void 0===r.config.mock&&_e(E,s.key,null==u||u,s.ttl),!l&&!mt(u)&&A&&A.length>0&&i&&(i=await De(A,t=>Le(t,e),i,e)),void 0===u||mt(u)||(w=u),mt(u)&&_++,!l&&O){void 0!==u&&(v._response=u);const t=bt(O,g,v);if(t.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const n=await Ye(e,e.transformers,t,i,v,a,`destination.${o}.next`);n.respond&&(a=n.respond)}}return t})),{id:o,destination:r,error:h,response:w,totalDuration:S,batchedCount:_,allowedCount:m.length}})),m={},y={},h={};for(const t of v){if(t.skipped)continue;const n=t.destination,o={type:n.type||"unknown",data:t.response};ht(e,t.id);const u=e.status.destinations[t.id],f=Date.now();if(u.queuePushSize=null!=(s=null==(r=n.queuePush)?void 0:r.length)?s:0,u.dlqSize=null!=(a=null==(i=n.dlq)?void 0:i.length)?a:0,t.error)o.error=t.error,h[t.id]=o,u.failed++,u.lastAt=f,u.duration+=t.totalDuration||0,e.status.failed++;else if(t.queue&&t.queue.length)y[t.id]=o;else{const n=null!=(c=t.batchedCount)?c:0,r=null!=(l=t.allowedCount)?l:0;(Math.max(0,r-n)>0||0===r)&&(m[t.id]=o,u.count++,u.lastAt=f,u.duration+=t.totalDuration||0,e.status.out++)}}return jt({event:t,...Object.keys(m).length&&{done:m},...Object.keys(y).length&&{queued:y},...Object.keys(h).length&&{failed:h}})}async function Ot(e,t,n){var o;if(t.init&&!t.config.init){const r=t.type||"unknown",s=e.logger.scope(r),i={collector:e,logger:s,id:n,config:t.config,env:Ct(t.env,t.config.env)};s.debug("init");const a=Date.now();let c;we(e,ze(e,{stepId:P("destination",n),stepType:"destination",phase:"init",eventId:"",now:a}));try{c=await he(t.init,"DestinationInit",e.hooks,e.logger)(i)}catch(t){const o=Date.now(),r=ze(e,{stepId:P("destination",n),stepType:"destination",phase:"error",eventId:"",now:o});throw r.durationMs=o-a,r.error=t instanceof Error?{name:t.name,message:t.message}:{message:String(t)},we(e,r),t}if(!1===c)return c;if(t.config={...c||t.config,init:!0},null==(o=t.queueOn)?void 0:o.length){const o=t.queueOn;t.queueOn=[];for(const{type:r,data:s}of o)at(e,t,n,r,s)}s.debug("init done")}return!0}async function xt(e,t,n,o,r,s){var i,a,c,l,u,f,d;const{config:p}=t,g=await ye(o,p,e);if(g.ignore)return!1;const v=t.type||"unknown",m=e.logger.scope(v),y={collector:e,logger:m,id:n,config:p,data:g.data,rule:g.mapping,ingest:r,env:{...Ct(t.env,p.env),...s?{respond:s}:{}}};if(void 0!==p.mock)return m.debug("mock",{event:g.event.name}),p.mock;const h=g.mapping,w=g.mappingKey||"* *";if((null==h?void 0:h.batch)&&t.pushBatch&&void 0===p.mock){if(t.batches=t.batches||{},!t.batches[w]){const o={key:w,entries:[],events:[],data:[]},r=yt(h.batch),s=yt(p.batch),d=null!=(a=null!=(i=r.wait)?i:s.wait)?a:3e4,g=null!=(l=null!=(c=r.size)?c:s.size)?l:1e3,v=null!=(f=null!=(u=r.age)?u:s.age)?f:3e4,y=Ct(t.env,p.env),b=function(e,t=1e3,n=!1){const{wait:o,size:r,age:s}=function(e,t){var n;return"number"==typeof e?{wait:e}:e?{wait:null!=(n=e.wait)?n:t,size:e.size,age:e.age}:{wait:t}}(t,1e3);let i,a,c=null,l=null,u=!1,f=[],d=0;const p=()=>{c&&(clearTimeout(c),c=null),l&&(clearTimeout(l),l=null),d=0,a=void 0},g=()=>{const t=a,n=f;if(p(),f=[],t)return i=e(...t),n.forEach(e=>e(i)),i;n.forEach(e=>e(void 0))},v=(...t)=>new Promise(p=>{const v=n&&!u;if(a=t,d+=1,f.push(p),c&&clearTimeout(c),c=setTimeout(()=>{c=null,n&&!u||g()},o),void 0===s||l||(l=setTimeout(()=>{l=null,g()},s)),void 0!==r&&d>=r)g();else if(v){u=!0,i=e(...t);const n=f;f=[],n.forEach(e=>e(i))}});return v.flush=()=>a||0!==f.length?new Promise(e=>{f.push(e),g()}):Promise.resolve(void 0),v.cancel=()=>{const e=f;f=[],p(),e.forEach(e=>e(void 0))},v.size=()=>d,v}(async()=>{var o;const r=t.batches[w].batched;if(0===r.entries.length)return;const s={key:r.key,entries:r.entries,events:r.events,data:r.data};r.entries=[],r.events=[],r.data=[];const i=s.entries[0],a={collector:e,logger:m,id:n,config:p,data:void 0,rule:i.rule,ingest:i.ingest,env:{...y,...i.respond?{respond:i.respond}:{}}};m.debug("push batch",{events:s.entries.length});const c=t.config.id||n,l=ht(e,c),u=Date.now(),f=ze(e,{stepId:P("destination",n),stepType:"destination",phase:"flush",eventId:"",now:u});f.batch={size:s.entries.length,index:0},we(e,f);let d=!0;await pe(he(t.pushBatch,"DestinationPushBatch",e.hooks,e.logger),o=>{var r;d=!1;const i=Date.now(),a=ze(e,{stepId:P("destination",n),stepType:"destination",phase:"error",eventId:"",now:i});a.durationMs=i-u,a.error=o instanceof Error?{name:o.name,message:o.message}:{message:String(o)},a.batch={size:s.entries.length,index:0},we(e,a);const f=t.dlq=t.dlq||[],p={max:null!=(r=t.config.dlqMax)?r:100};let g=0;for(const e of s.entries)g+=ft(f,[e.event,o],p).dropped;if(g>0){const t=wt(e.status,P("destination",c),"dlq",g);pt(f,m,"destination.dlq overflow; oldest entries dropped",{buffer:"dlq",destination:c,cap:p.max,droppedCount:t})}else f.length<p.max&&gt(f);l.failed+=s.entries.length,l.dlqSize=f.length,e.status.failed+=s.entries.length,m.error("Push batch failed",{error:o instanceof Error?o.message:String(o),entries:s.entries.length})})(s,a),m.debug("push batch done"),l.inFlightBatch=Math.max(0,(null!=(o=l.inFlightBatch)?o:0)-s.entries.length),d&&(l.count+=s.entries.length,l.lastAt=Date.now(),e.status.out+=s.entries.length)},{wait:d,size:g,age:v});t.batches[w]={batched:o,batchFn:()=>{b()},flush:async()=>{await b.flush()}}}const o=t.batches[w];o.batched.entries.push({event:g.event,ingest:r,respond:s,rule:h,data:g.data}),o.batched.events.push(g.event),W(g.data)&&o.batched.data.push(g.data);const v=t.config.id||n,y=ht(e,v);return y.inFlightBatch=(null!=(d=y.inFlightBatch)?d:0)+1,o.batchFn(),vt}{m.debug("push",{event:g.event.name});const o="string"==typeof g.event.id?g.event.id:"",r=Date.now(),s=ze(e,{stepId:P("destination",n),stepType:"destination",phase:"in",eventId:o,now:r});g.mappingKey&&(s.mappingKey=g.mappingKey),g.event.consent&&(s.consent={...g.event.consent}),we(e,s);try{const s=await he(t.push,"DestinationPush",e.hooks,e.logger)(g.event,y),i=Date.now(),a=ze(e,{stepId:P("destination",n),stepType:"destination",phase:"out",eventId:o,now:i});return a.durationMs=i-r,a.outEvent=s,g.mappingKey&&(a.mappingKey=g.mappingKey),we(e,a),m.debug("push done"),s}catch(t){const s=Date.now(),i=ze(e,{stepId:P("destination",n),stepType:"destination",phase:"error",eventId:o,now:s});throw i.durationMs=s-r,i.error=t instanceof Error?{name:t.name,message:t.message}:{message:String(t)},g.mappingKey&&(i.mappingKey=g.mappingKey),we(e,i),t}}}function jt(e){return{ok:!(null==e?void 0:e.failed),...e}}function Et(e){const{code:t,config:n={},env:o={},cache:r,state:s}=e,{config:i}=Ke(e,"before"),{config:a}=Ke({...e,config:i},"next"),c={...t.config,...n,...a};r&&(c.cache=r),void 0!==s&&void 0===c.state&&(c.state=s);const l=Ct(t.env,o);return{...t,config:c,env:l}}function Ct(e,t){return e||t?t?e&&Y(e)&&Y(t)?{...e,...t}:t:e:{}}async function It(e,t,n){const o=Object.entries(e).map(async([e,o])=>{var r;const s=o.destroy;if(!s)return;const i=o.type||"unknown",a=n.scope(i),c={id:e,config:o.config,env:null!=(r=o.env)?r:{},logger:a};try{await Promise.race([s(c),new Promise((n,o)=>setTimeout(()=>o(new Error(`${t} '${e}' destroy timed out`)),5e3))])}catch(n){a.error(`${t} '${e}' destroy failed: ${n}`)}});await Promise.allSettled(o)}async function At(e,t,n){let o,r,s=!1;const i=function(e){return e.cascade?()=>{}:(e.cascade={counts:new WeakMap},()=>{e.cascade=void 0})}(e);try{return await async function(){switch(t){case Re.Config:Y(n)&&(B(e.config,n,{shallow:!1}),r=n,s=!0);break;case Re.Consent:if(Y(n)){const{update:t}=function(e,t){const n={};return Object.entries(t).forEach(([e,t])=>{n[e]=!!t}),e.consent=B(e.consent,n),{update:n}}(e,n);e.stateVersion++,r=t,s=!0}break;case Re.Custom:Y(n)&&(e.custom=B(e.custom,n),e.stateVersion++,r=n,s=!0);break;case Re.Destination:Y(n)&&"code"in n&&Y(n.code)&&(o=await async function(e,t){const{code:n,config:o={},env:r={},before:s,next:i,cache:a,state:c}=t;if(!F(n.push))return jt({ok:!1,failed:{invalid:{type:"invalid",error:"Destination code must have a push method"}}});const l=o||{init:!1};let u=s?{...l,before:s}:{...l};i&&(u={...u,next:i}),a&&(u={...u,cache:a}),void 0!==c&&void 0===u.state&&(u={...u,state:c});const f={...n,config:u,env:Ct(n.env,r)};let d=f.config.id;if(!d)do{d=re(5,"abcdefghijklmnopqrstuvwxyz")}while(e.destinations[d]);return e.destinations[d]=f,!1!==f.config.queue&&(f.queuePush=[...e.queue]),kt(e,void 0,{},{[d]:f})}(e,n));break;case Re.Globals:Y(n)&&(e.globals=B(e.globals,n),e.stateVersion++,r=n,s=!0);break;case Re.Hook:if(Y(n)&&J(n.name)&&F(n.fn)){const{name:t,fn:o}=n;e.hooks[t]=o,r=n,s=!0}break;case Re.On:if(Y(n)&&J(n.type)){const{type:t,rules:o}=n;await async function(e,t,n){const o=e.on,r=o[t]||[],s=H(n)?n:[n];s.forEach(e=>{r.push(e)}),o[t]=r,ct(e,t,s)}(e,t,o)}break;case Re.Ready:s=!0;break;case Re.Run:o=await async function(e,t){return e.allowed=!0,e.timing=Date.now(),t&&(t.consent&&(e.consent=B(e.consent,t.consent),e.stateVersion++),t.user&&(e.user=B(e.user,t.user),e.stateVersion++),t.globals&&(e.globals=B(e.config.globalsStatic||{},t.globals),e.stateVersion++),t.custom&&(e.custom=B(e.custom,t.custom),e.stateVersion++)),Object.values(e.destinations).forEach(e=>{e.queuePush=[]}),e.queue=[],e.round++,await async function(e){const t=[{type:Re.Consent,nonEmpty:Object.keys(e.consent).length>0},{type:Re.User,nonEmpty:Object.keys(e.user).length>0},{type:Re.Globals,nonEmpty:Object.keys(e.globals).length>0},{type:Re.Custom,nonEmpty:Object.keys(e.custom).length>0}];for(const{type:n,nonEmpty:o}of t){if(!o)continue;const t=lt(e,n);ct(e,n,e.on[n]||[]);for(const[o,r]of Object.entries(e.sources))Qe(r)&&await ut(e,r,o,n,t)}}(e),await kt(e)}(e,n),s=!0;break;case Re.Session:s=!0;break;case Re.Shutdown:await async function(e){const t=e.logger;await It(e.sources,"source",t),await It(e.destinations,"destination",t),await It(e.transformers,"transformer",t),await It(e.stores,"store",t)}(e);break;case Re.User:Y(n)&&(B(e.user,n,{shallow:!1}),e.stateVersion++,r=n,s=!0)}return s&&(await async function(e,t,n,o){var r,s;let i,a=n||[];switch(n||(a=e.on[t]||[]),t){case Re.Consent:i=o||e.consent;break;case Re.Session:i=e.session;break;case Re.User:i=o||e.user;break;case Re.Custom:i=o||e.custom;break;case Re.Globals:i=o||e.globals;break;case Re.Config:i=o||e.config;break;case Re.Ready:case Re.Run:default:i=void 0}let c=!1;for(const[n,o]of Object.entries(e.sources)){if(null==(r=o.config.require)?void 0:r.length){const e=o.config.require.indexOf(t);-1!==e&&o.config.require.splice(e,1)}o.on&&(Qe(o)?await ut(e,o,n,t,i)&&(c=!0):(o.queueOn=o.queueOn||[],o.queueOn.push({type:t,data:i})))}Object.entries(e.destinations).forEach(([n,o])=>{if(o.on){if(!o.config.init)return o.queueOn=o.queueOn||[],void o.queueOn.push({type:t,data:i});at(e,o,n,t,i)}});for(const[t,n]of Object.entries(e.sources))Qe(n)&&(null==(s=n.queueOn)?void 0:s.length)&&await Ze(e,n,t);return Object.keys(e.pending.destinations).length>0&&await async function(e,t){var n;for(const[o,r]of Object.entries(e.pending.destinations)){if(!e.pending.destinations[o]||e.destinations[o])continue;const s=null==(n=r.config)?void 0:n.require;if(!s)continue;const i=s.indexOf(t);if(-1===i)continue;if(s.splice(i,1),s.length>0)continue;delete e.pending.destinations[o];const a=Et(r);!1!==a.config.queue&&(a.queuePush=[...e.queue]),e.destinations[o]=a}}(e,t),ct(e,t,a,o),!c}(e,t,void 0,r),o=await kt(e)),o||jt({ok:!0})}()}finally{i()}}function St(e,t){if(!t.name)throw new Error("Event name is required");const[n,o]=t.name.split(" ");if(!n||!o)throw new Error("Event name is invalid");const{timestamp:r=Date.now(),name:s=`${n} ${o}`,data:i={},context:a={},globals:c=e.globals,custom:l={},user:u=e.user,nested:f=[],consent:d=e.consent,id:p=oe(),trigger:g="",entity:v=n,action:m=o,timing:y=0,source:h={type:"collector",schema:"4"}}=t;return{name:s,data:i,context:a,globals:c,custom:l,user:u,nested:f,consent:d,id:p,trigger:g,entity:v,action:m,timestamp:r,timing:y,source:h}}function _t(e={}){var t,n,o;const r=null!=(t=e.maxEntries)?t:1e4,s=null!=(n=e.lowWaterMark)?n:.8,i=null!=(o=e.sweepIntervalMs)?o:6e4,a=Math.floor(r*s),c=new Map,l={hits:0,misses:0,populates:0,writes:0,deletes:0,evictions_entries:0,evictions_ttl:0};let u;return i>0&&(u=setInterval(function(){const e=Date.now();let t=0;for(const[n,o]of c)void 0!==o.expires&&o.expires<=e&&(c.delete(n),t++);l.evictions_ttl+=t},i),u&&"function"==typeof u.unref&&u.unref()),{type:"memory",config:{},get(e){const t=c.get(e);if(t)return void 0!==t.expires&&t.expires<=Date.now()?(c.delete(e),l.evictions_ttl++,void l.misses++):(c.delete(e),c.set(e,t),l.hits++,t.value);l.misses++},set(e,t,n){const o=!c.has(e);o||c.delete(e),c.set(e,{value:t,expires:void 0!==n?Date.now()+n:void 0}),l.writes++,o&&l.populates++,c.size>r&&function(){if(c.size<=r)return;const e=c.size-a;let t=0;for(const n of c.keys()){if(t>=e)break;c.delete(n),t++}l.evictions_entries+=t}()},delete(e){c.delete(e)&&l.deletes++},get counters(){return{...l}},destroy(){void 0!==u&&(clearInterval(u),u=void 0),c.clear()}}}function qt(e,t){const{cacheConfig:n,cacheStore:o,namespace:r,logger:s,storeId:i,collector:a}=t,c=(e,t)=>{if(!a)return;const n=ze(a,{stepId:`store.${i}`,stepType:"store",phase:"in",eventId:"",now:Date.now()});n.meta={op:"cache",cached:"hit"===t,status:t,key:e},we(a,n)},l={hits:0,misses:0,populates:0,writes:0,deletes:0,inflight_dedups:0},u=n.rules.map(e=>({match:e.match?be(e.match):()=>!0,ttl:e.ttl})),f=e=>`${r}:${e}`;function d(e,t){const n=void 0===t?{key:e}:{key:e,value:t};return u.find(e=>e.match(n))}const p=new Map;return{type:e.type,config:e.config,setup:e.setup,get counters(){return{...l}},async get(t){const n=f(t),r=await o.get(n);if(void 0!==r)return l.hits++,c(t,"hit"),r;const s=p.get(n);if(s)return l.inflight_dedups++,c(t,"hit"),s;l.misses++,c(t,"miss");const i=(async()=>{try{const r=await e.get(t);if(void 0===r)return;const s=d(t,r);if(s)try{await o.set(n,r,1e3*s.ttl),l.populates++}catch(e){g("set",t,e)}return r}finally{p.delete(n)}})();return p.set(n,i),i},async set(t,n,r){l.writes++,await e.set(t,n,r);const s=d(t,n);if(s)try{await o.set(f(t),n,1e3*s.ttl)}catch(e){g("set",t,e)}},async delete(t){l.deletes++,await e.delete(t);try{await o.delete(f(t))}catch(e){g("delete",t,e)}}};function g(e,t,n){const o=`store-cache(${i}): cache ${e} failed for "${t}"; backing succeeded, continuing`;s?s.warn(o,{error:n}):console.warn(o,n)}}function $t(e,t,n){const o=`store.${n}`,r=he(t.get,"StoreGet",e.hooks,e.logger),s=he(t.set,"StoreSet",e.hooks,e.logger),i=he(t.delete,"StoreDelete",e.hooks,e.logger);t.get=async t=>{const n=Date.now(),s=ze(e,{stepId:o,stepType:"store",phase:"in",eventId:"",now:n});s.meta={op:"get",key:t},we(e,s);try{const s=await r(t),i=Date.now(),a=ze(e,{stepId:o,stepType:"store",phase:"out",eventId:"",now:i});return a.durationMs=i-n,a.meta={op:"get",key:t},we(e,a),s}catch(r){const s=Date.now(),i=ze(e,{stepId:o,stepType:"store",phase:"error",eventId:"",now:s});throw i.durationMs=s-n,i.meta={op:"get",key:t},i.error=r instanceof Error?{name:r.name,message:r.message}:{message:String(r)},we(e,i),r}},t.set=async(t,n,r)=>{const i=Date.now(),a=ze(e,{stepId:o,stepType:"store",phase:"in",eventId:"",now:i});a.meta={op:"set",key:t},we(e,a);try{await s(t,n,r);const a=Date.now(),c=ze(e,{stepId:o,stepType:"store",phase:"out",eventId:"",now:a});c.durationMs=a-i,c.meta={op:"set",key:t},we(e,c)}catch(n){const r=Date.now(),s=ze(e,{stepId:o,stepType:"store",phase:"error",eventId:"",now:r});throw s.durationMs=r-i,s.meta={op:"set",key:t},s.error=n instanceof Error?{name:n.name,message:n.message}:{message:String(n)},we(e,s),n}},t.delete=async t=>{const n=Date.now(),r=ze(e,{stepId:o,stepType:"store",phase:"in",eventId:"",now:n});r.meta={op:"delete",key:t},we(e,r);try{await i(t);const r=Date.now(),s=ze(e,{stepId:o,stepType:"store",phase:"out",eventId:"",now:r});s.durationMs=r-n,s.meta={op:"delete",key:t},we(e,s)}catch(r){const s=Date.now(),i=ze(e,{stepId:o,stepType:"store",phase:"error",eventId:"",now:s});throw i.durationMs=s-n,i.meta={op:"delete",key:t},i.error=r instanceof Error?{name:r.name,message:r.message}:{message:String(r)},we(e,i),r}}}async function Dt(e){var t,n;const o=B({globalsStatic:{},sessionStatic:{},run:!0,queueMax:1e3},e,{merge:!1,extend:!1}),r=ce({level:null==(t=e.logger)?void 0:t.level,handler:null==(n=e.logger)?void 0:n.handler}),s={...o.globalsStatic,...e.globals},i={allowed:!1,config:o,consent:e.consent||{},custom:e.custom||{},destinations:{},transformers:{},stores:{},globals:s,hooks:e.hooks||{},observers:new Set,logger:r,on:{},queue:[],round:0,stateVersion:0,delivery:new WeakMap,session:void 0,status:{startedAt:Date.now(),in:0,out:0,failed:0,sources:{},destinations:{},dropped:{}},timing:Date.now(),user:e.user||{},sources:{},pending:{destinations:{}},push:void 0,command:void 0};var a,c;i.push=function(e,t){const n=he(async(n,o={})=>await pe(async()=>{var r;const s=Date.now(),{id:i,ingest:a,respond:c,mapping:l,preChain:u,include:f,exclude:d}=o;let p=c,g=n;const v=f||d?function(e,t,n){let o=e;return t&&(o=Object.fromEntries(Object.entries(o).filter(([e])=>t.includes(e)))),n&&(o=Object.fromEntries(Object.entries(o).filter(([e])=>!n.includes(e)))),o}(e.destinations,f,d):void 0,m=null!=a?a:V(i||"unknown");if(l){const t=await ye(g,l,e);if(t.ignore)return jt({ok:!0});if(l.consent&&!ne(l.consent,e.consent,t.event.consent))return jt({ok:!0});g=t.event}if((null==u?void 0:u.length)&&e.transformers&&Object.keys(e.transformers).length>0){const n=await Ye(e,e.transformers,u,g,m,p,i?`source.${i}.next`:void 0);if(null===n.event)return jt({ok:!0});if(n.stopped)return n.respond&&(p=n.respond),jt({ok:!0});if(n.respond&&(p=n.respond),Array.isArray(n.event)){const o=await Promise.all(n.event.map(async n=>{const o=t(n),r=St(e,o);return kt(e,r,{id:i,ingest:m,respond:p},v)}));if(i){e.status.sources[i]||(e.status.sources[i]={count:0,duration:0});const t=e.status.sources[i];t.count+=n.event.length,t.lastAt=Date.now(),t.duration+=Date.now()-s}return null!=(r=o[0])?r:jt({ok:!0})}g=n.event}const y=t(g),h=St(e,y),w=await kt(e,h,{id:i,ingest:m,respond:p},v);if(i){e.status.sources[i]||(e.status.sources[i]={count:0,duration:0});const t=e.status.sources[i];t.count++,t.lastAt=Date.now(),t.duration+=Date.now()-s}return w},t=>{if(t instanceof ge)throw t;return e.status.failed++,e.logger.error("push failed",{event:n,ingest:o.ingest,error:t}),jt({ok:!1})})(),"Push",e.hooks,e.logger);return async(t,o)=>{const r="string"==typeof t.id?t.id:"",s=Date.now();we(e,ze(e,{stepId:"collector.push",stepType:"collector",phase:"in",eventId:r,now:s}));try{const i=await n(t,o),a=Date.now(),c=ze(e,{stepId:"collector.push",stepType:"collector",phase:"out",eventId:r,now:a});return c.durationMs=a-s,c.outEvent=i,we(e,c),i}catch(t){const n=Date.now(),o=ze(e,{stepId:"collector.push",stepType:"collector",phase:"error",eventId:r,now:n});throw o.durationMs=n-s,o.error=t instanceof Error?{name:t.name,message:t.message}:{message:String(t)},we(e,o),t}}}(i,e=>({timing:Math.round((Date.now()-i.timing)/10)/100,source:{type:"collector",schema:"4",version:"4.2.0-next-1780387694663"},...e})),i.command=(c=At,he(async(e,t,n)=>await pe(async()=>await c(a,e,t,n),n=>{if(n instanceof ge)throw n;return a.status.failed++,a.logger.error("command failed",{command:e,data:t,error:n}),jt({ok:!1})})(),"Command",(a=i).hooks,a.logger));const l=e.stores||{};return i.stores=await async function(e,t={}){var n;const o={};for(const[n,r]of Object.entries(t)){const{code:t,config:s={},env:i={}}=r,a=e.logger.scope("store").scope(n),c={collector:e,logger:a,id:n,config:s,env:i},l=await t(c);o[n]=l}const r=t,s=function(e){const t={};for(const n of Object.keys(e))t[n]="WHITE";const n=[],o=[];function r(s){var i;const a=t[s];if("BLACK"===a)return;if("GRAY"===a){const e=o.indexOf(s),t=o.slice(-1===e?0:e).concat(s).join(" -> ");throw new Error(`Cycle in cache.store chain: ${t}`)}t[s]="GRAY",o.push(s);const c=null==(i=e[s].cache)?void 0:i.store;if(void 0!==c){if(!(c in e))throw new Error(`Store "${s}" cache.store references "${c}", which is not declared in flow.stores`);r(c)}o.pop(),t[s]="BLACK",n.push(s)}for(const n of Object.keys(e))"WHITE"===t[n]&&r(n);return n}(r);for(const t of s){const s=r[t].cache;if(!s)continue;let i,a;void 0!==s.store?(i=o[s.store],a=s.store):(o.__cache||(o.__cache=_t()),i=o.__cache,a="__cache");const c=null!=(n=s.namespace)?n:t;e.logger.scope("store-cache").scope(t).info(`store "${t}" caches with namespace "${c}:" via ${a}`),o[t]=qt(o[t],{storeId:t,cacheConfig:s,cacheStore:i,namespace:c,logger:e.logger.scope("store-cache").scope(t),collector:e})}for(const[t,n]of Object.entries(o))"__cache"!==t&&$t(e,n,t);return o}(i,l),function(e,t,n){const o=new Map;for(const[n,r]of Object.entries(e))t[n]&&o.set(r,t[n]);if(0!==o.size)for(const e of[n.transformers,n.destinations,n.sources])if(e)for(const t of Object.values(e))r(t.env);function r(e){if(e)for(const[t,n]of Object.entries(e))if("object"==typeof n&&null!==n){const r=o.get(n);r&&(e[t]=r)}}}(l,i.stores,e),i.stores.__cache||(i.stores.__cache=_t()),i.destinations=await async function(e,t={}){var n,o;const r={};for(const[s,i]of Object.entries(t))(null==(o=null==(n=i.config)?void 0:n.require)?void 0:o.length)?e.pending.destinations[s]=i:r[s]=Et(i);return r}(i,e.destinations||{}),i.transformers=await async function(e,t={}){var n,o,r,s,i,a,c,l;const u={};for(const[f,d]of Object.entries(t)){const{code:t,env:p={}}=d,g=Ue(d,"Transformer");if(!g.ok){e.logger.warn(`Transformer ${f} invalid (${g.code}): ${g.reason}. Skipping.`);continue}const{config:v}=Ke(d,"before"),{config:m}=Ke({...d,config:v},"next"),y=Object.keys(p).length>0?{...m,env:p}:m,{cache:h}=d,w=h?{...y,cache:h}:y,b=null!=(o=null==(n=d.config)?void 0:n.state)?o:d.state,k=void 0!==b&&void 0===w.state?{...w,state:b}:w,O=e.logger.scope("transformer").scope(f),x={collector:e,logger:O,id:f,ingest:V(f),config:k,env:p},j=null!=t?t:e=>{const t=d.mapping;if(t){const n=[];if(void 0!==t.data&&n.push("data"),t.mapping)for(const[e,o]of Object.entries(t.mapping))if("object"==typeof o&&null!==o)for(const[t,r]of Object.entries(o)){if("object"!=typeof r||null===r)continue;const o=r;void 0!==o.data&&n.push(`mapping[${e}][${t}].data`),void 0!==o.silent&&n.push(`mapping[${e}][${t}].silent`)}return n.length>0&&e.collector.logger.warn(`Transformer ${f}: \`${n.join(", ")}\` ignored at transformer position (only event-mutating fields apply).`),{type:"pass",config:e.config,push:async n=>{const o=await ye(n,t,e.collector);return!o.ignore&&{event:o.event}}}}return{type:"pass",config:e.config,push:e=>({event:e})}},E=await j(x);void 0!==d.before&&void 0===(null==(r=E.config)?void 0:r.before)&&(E.config={...null!=(s=E.config)?s:{},before:d.before}),void 0!==d.next&&void 0===(null==(i=E.config)?void 0:i.next)&&(E.config={...null!=(a=E.config)?a:{},next:d.next}),void 0!==b&&void 0===(null==(c=E.config)?void 0:c.state)&&(E.config={...null!=(l=E.config)?l:{},state:b}),u[f]=E}return u}(i,e.transformers||{}),i}async function Mt(e){e=e||{};const t=await Dt(e),n=(o=t,{type:"elb",config:{},push:async(e,t,n,r,s)=>{if("string"==typeof e&&e.startsWith("walker ")){const n=e.replace("walker ","");return o.command(n,t)}let i;if("string"==typeof e)i={name:e},t&&"object"==typeof t&&!Array.isArray(t)&&(i.data=t);else{if(!e||"object"!=typeof e)return jt({ok:!1});i=e,t&&"object"==typeof t&&!Array.isArray(t)&&(i.data={...i.data||{},...t})}return n&&"object"==typeof n&&(i.context=n),r&&Array.isArray(r)&&(i.nested=r),s&&"object"==typeof s&&(i.custom=s),o.push(i)}});var o;t.sources.elb=n,await async function(e,t={}){var n;const o={};for(const[r,s]of Object.entries(t)){const t=await et(e,r,s);if(!t)continue;const i=null==(n=s.config)?void 0:n.require;t.config={...t.config,init:!1,...i?{require:[...i]}:{}},o[r]=t}Object.assign(e.sources,o);for(const t of Object.keys(o)){const n=e.sources[t];let o=!1;n.init&&await pe(n.init.bind(n),n=>{if(n instanceof ge)throw n;o=!0,e.status.failed++,e.logger.scope("source").error("source init failed",{sourceId:t,error:n})})(),o||(n.config.init=!0,Qe(n)&&await Ze(e,n,t))}return o}(t,e.sources||{});const{consent:r,user:s,globals:i,custom:a}=e;r&&await t.command("consent",r),s&&await t.command("user",s),i&&Object.assign(t.globals,i),a&&Object.assign(t.custom,a),t.config.run&&await t.command("run");let c=n.push;const l=Object.values(t.sources).filter(e=>"elb"!==e.type),u=l.find(e=>e.config.primary);return u?c=u.push:l.length>0&&(c=l[0].push),{collector:t,elb:c}}var Tt,Pt=async e=>{let t;return{get flow(){return t},trigger:(n,o)=>async n=>{var r;if(!t){const n=await Mt({...e,run:null==(r=e.run)||r});t={collector:n.collector,elb:n.elb}}const s=(null==o?void 0:o.eventName)||"ucEvent";window.dispatchEvent(new CustomEvent(s,{detail:n}))}}},Nt=(e,t)=>{if(e&&"object"==typeof e)return()=>{t.window.dispatchEvent(new CustomEvent("ucEvent",{detail:e}))}},Ut=async e=>{var t,n,o,r,s,i,a,c,l,f,p,g;const{config:v,env:m}=e,{elb:y,logger:h}=m,w=null!=(t=m.window)?t:void 0!==globalThis.window?globalThis.window:void 0,b={eventName:null!=(o=null==(n=null==v?void 0:v.settings)?void 0:n.eventName)?o:"ucEvent",categoryMap:null!=(s=null==(r=null==v?void 0:v.settings)?void 0:r.categoryMap)?s:{},explicitOnly:null==(a=null==(i=null==v?void 0:v.settings)?void 0:i.explicitOnly)||a,apiVersion:null!=(l=null==(c=null==v?void 0:v.settings)?void 0:c.apiVersion)?l:"auto",v3EventName:null!=(p=null==(f=null==v?void 0:v.settings)?void 0:f.v3EventName)?p:"UC_UI_CMP_EVENT"},k={settings:b},O=[];if(w){const e={window:w,elb:y,settings:b,logger:h},t=null!=(g=b.apiVersion)?g:"auto";"v2"===t?O.push(u(e)):"v3"===t||w.__ucCmp?O.push(await d(e)):w.UC_UI?O.push(u(e)):(O.push(u(e)),O.push(await d(e)))}return{type:"usercentrics",config:k,push:y,destroy:async()=>{O.forEach(e=>e())}}},Rt=Ut;return Tt=s,((r,s,i,a)=>{if(s&&"object"==typeof s||"function"==typeof s)for(let c of n(s))o.call(r,c)||c===i||e(r,c,{get:()=>s[c],enumerable:!(a=t(s,c))||a.enumerable});return r})(e({},"__esModule",{value:!0}),Tt)})();
1
+ "use strict";var SourceUsercentrics=(()=>{var e=Object.defineProperty,t=Object.getOwnPropertyDescriptor,n=Object.getOwnPropertyNames,o=Object.prototype.hasOwnProperty,i={};((t,n)=>{for(var o in n)e(t,o,{get:n[o],enumerable:!0})})(i,{SourceUsercentrics:()=>p,default:()=>d,sourceUsercentrics:()=>y});var r=["action","event","type","ucCategory"];function c(e,t,n){e[t]=(void 0===e[t]||Boolean(e[t]))&&n}function l(e,t){const n={};var o;return e.ucCategory&&(o=e.ucCategory,Object.values(o).every(e=>"boolean"==typeof e))?Object.entries(e.ucCategory).forEach(([e,o])=>{var i,r;if("boolean"!=typeof o)return;const l=null!=(r=null==(i=t.categoryMap)?void 0:i[e])?r:e;c(n,l,o)}):(e.ucCategory&&Object.entries(e.ucCategory).forEach(([e,o])=>{var i,r;if("boolean"==typeof o){const l=null!=(r=null==(i=t.categoryMap)?void 0:i[e])?r:e;c(n,l,o)}}),Object.entries(e).forEach(([e,t])=>{if(r.includes(e))return;if("boolean"!=typeof t)return;const o=e.toLowerCase().replace(/ /g,"_");c(n,o,t)})),n}function s(e){const t={};return e.forEach(e=>{var n,o;const i=e.categorySlug,r=null!=(o=null==(n=e.consent)?void 0:n.status)&&o;t[i]=(void 0===t[i]||t[i])&&r}),t}function a(e){var t,n;const{window:o,elb:i,settings:r,logger:c}=e,a=null!=(t=r.eventName)?t:"ucEvent",u=e=>{var t;if(c.debug("event received",e),"consent_status"!==e.event)return;if(r.explicitOnly&&"explicit"!==(null==(t=e.type)?void 0:t.toLowerCase()))return;const n=l(e,r);Object.keys(n).length>0&&i("walker consent",n)},v=e=>{const t=e;t.detail&&u(t.detail)};o.addEventListener(a,v);const g=o.UC_UI;if((null==(n=null==g?void 0:g.isInitialized)?void 0:n.call(g))&&g.getServicesBaseInfo){const e=g.getServicesBaseInfo();e.length>0&&u(function(e){return{event:"consent_status",type:"implicit",ucCategory:s(e)}}(e))}return()=>{o.removeEventListener(a,v)}}var u=new Set(["ACCEPT_ALL","DENY_ALL","SAVE"]);async function v(e){var t;const{window:n,elb:o,settings:i,logger:r}=e,c=null!=(t=i.v3EventName)?t:"UC_UI_CMP_EVENT",s=async e=>{const t=function(e){const t={};return Object.entries(e.categories).forEach(([e,n])=>{t[e]="ALL_ACCEPTED"===n.state}),{event:"consent_status",type:"EXPLICIT"===e.consent.type?"explicit":"implicit",ucCategory:t}}(await e.getConsentDetails());if(r.debug("event received",t),i.explicitOnly&&"explicit"!==t.type)return;const n=l(t,i);Object.keys(n).length>0&&o("walker consent",n)},a=e=>{const t=n.__ucCmp;if(!t)return;const o=e.detail;o&&"CMP"===o.source&&o.type&&u.has(o.type)&&s(t).catch(()=>{})};n.addEventListener(c,a);const v=n.__ucCmp;if(v)try{await v.isInitialized()&&await s(v)}catch(e){r.warn("v3 static consent read failed",e)}return()=>{n.removeEventListener(c,a)}}var g,p={},y=async e=>{var t,n,o,i,r,c,l,s,u,g,p;const{config:y,env:d}=e,{elb:f,logger:b}=d,w=null!=(t=d.window)?t:void 0!==globalThis.window?globalThis.window:void 0,C={eventName:null!=(o=null==(n=null==y?void 0:y.settings)?void 0:n.eventName)?o:"ucEvent",categoryMap:null!=(r=null==(i=null==y?void 0:y.settings)?void 0:i.categoryMap)?r:{},explicitOnly:null==(l=null==(c=null==y?void 0:y.settings)?void 0:c.explicitOnly)||l,apiVersion:null!=(u=null==(s=null==y?void 0:y.settings)?void 0:s.apiVersion)?u:"auto",v3EventName:null!=(p=null==(g=null==y?void 0:y.settings)?void 0:g.v3EventName)?p:"UC_UI_CMP_EVENT"},E=[];return{type:"usercentrics",config:{settings:C},push:f,init:async()=>{var e;if(!w)return;const t={window:w,elb:f,settings:C,logger:b},n=null!=(e=C.apiVersion)?e:"auto";"v2"===n?E.push(a(t)):"v3"===n||w.__ucCmp?E.push(await v(t)):w.UC_UI?E.push(a(t)):(E.push(a(t)),E.push(await v(t)))},destroy:async()=>{E.forEach(e=>e())}}},d=y;return g=i,((i,r,c,l)=>{if(r&&"object"==typeof r||"function"==typeof r)for(let s of n(r))o.call(i,s)||s===c||e(i,s,{get:()=>r[s],enumerable:!(l=t(r,s))||l.enumerable});return i})(e({},"__esModule",{value:!0}),g)})();
package/dist/index.d.mts CHANGED
@@ -1,4 +1,4 @@
1
- import { Source, Elb, WalkerOS, Logger, Flow, Trigger } from '@walkeros/core';
1
+ import { Source, Elb } from '@walkeros/core';
2
2
 
3
3
  declare module '@walkeros/core' {
4
4
  interface SourceMap {
@@ -222,106 +222,6 @@ declare namespace index {
222
222
  export type { index_Config as Config, index_Env as Env, index_InitSettings as InitSettings, index_Mapping as Mapping, index_Push as Push, index_Settings as Settings, index_Types as Types, index_UsercentricsEventDetail as UsercentricsEventDetail, index_UsercentricsV2Api as UsercentricsV2Api, index_UsercentricsV2Service as UsercentricsV2Service, index_UsercentricsV3Api as UsercentricsV3Api, index_UsercentricsV3CategoryData as UsercentricsV3CategoryData, index_UsercentricsV3CategoryState as UsercentricsV3CategoryState, index_UsercentricsV3CmpEventDetail as UsercentricsV3CmpEventDetail, index_UsercentricsV3ConsentData as UsercentricsV3ConsentData, index_UsercentricsV3ConsentDetails as UsercentricsV3ConsentDetails };
223
223
  }
224
224
 
225
- /**
226
- * Example Usercentrics consent event detail inputs.
227
- *
228
- * These represent real event.detail payloads from Usercentrics CMP.
229
- */
230
- /**
231
- * Full consent - user accepted all categories (explicit)
232
- */
233
- declare const fullConsent$1: UsercentricsEventDetail;
234
- /**
235
- * Partial consent - user accepted only essential and functional (explicit)
236
- */
237
- declare const partialConsent: UsercentricsEventDetail;
238
- /**
239
- * Minimal consent - user denied everything except essential (explicit)
240
- */
241
- declare const minimalConsent$1: UsercentricsEventDetail;
242
- /**
243
- * Implicit consent - page load with default consent state
244
- * (not an explicit user choice)
245
- */
246
- declare const implicitConsent: UsercentricsEventDetail;
247
- /**
248
- * Explicit consent with uppercase type field (Usercentrics docs are
249
- * inconsistent about casing - some show 'EXPLICIT', others 'explicit')
250
- */
251
- declare const fullConsentUpperCase: UsercentricsEventDetail;
252
- /**
253
- * Service-level consent - ucCategory has mixed types (non-boolean values
254
- * indicate individual service-level choice rather than group-level)
255
- */
256
- declare const serviceLevelConsent: UsercentricsEventDetail;
257
- /**
258
- * Non-consent event (should be ignored)
259
- */
260
- declare const nonConsentEvent: UsercentricsEventDetail;
261
-
262
- /**
263
- * Expected walkerOS consent outputs.
264
- *
265
- * These represent the consent state after parsing Usercentrics event details
266
- * with no category mapping configured (pass-through).
267
- */
268
- /**
269
- * Full consent - all categories true (group-level)
270
- */
271
- declare const fullConsentMapped: WalkerOS.Consent;
272
- /**
273
- * Partial consent - essential and functional true, marketing false
274
- */
275
- declare const partialConsentMapped: WalkerOS.Consent;
276
- /**
277
- * Minimal consent - only essential true
278
- */
279
- declare const minimalConsentMapped: WalkerOS.Consent;
280
- /**
281
- * Full consent with custom category mapping applied
282
- * (essential->functional, functional->functional, marketing->marketing)
283
- */
284
- declare const fullConsentCustomMapped: WalkerOS.Consent;
285
- /**
286
- * Service-level consent - individual service booleans + boolean ucCategory entries
287
- * (services normalized: lowercase, spaces to underscores)
288
- * (ucCategory boolean entries mapped through categoryMap)
289
- */
290
- declare const serviceLevelMapped: WalkerOS.Consent;
291
-
292
- /**
293
- * Create a properly typed elb/push function mock
294
- */
295
- declare const createMockElbFn: () => Elb.Fn;
296
- /**
297
- * Simple no-op logger for demo purposes
298
- */
299
- declare const noopLogger: Logger.Instance;
300
-
301
- declare const fullConsent: Flow.StepExample;
302
- declare const minimalConsent: Flow.StepExample;
303
- declare const categoryMapOverride: Flow.StepExample;
304
- declare const customEventName: Flow.StepExample;
305
-
306
- declare const step_categoryMapOverride: typeof categoryMapOverride;
307
- declare const step_customEventName: typeof customEventName;
308
- declare const step_fullConsent: typeof fullConsent;
309
- declare const step_minimalConsent: typeof minimalConsent;
310
- declare namespace step {
311
- export { step_categoryMapOverride as categoryMapOverride, step_customEventName as customEventName, step_fullConsent as fullConsent, step_minimalConsent as minimalConsent };
312
- }
313
-
314
- interface UsercentricsContent {
315
- event: string;
316
- type: string;
317
- action?: string;
318
- ucCategory?: Record<string, boolean | unknown>;
319
- [service: string]: unknown;
320
- }
321
- declare const createTrigger: Trigger.CreateFn<UsercentricsContent, void>;
322
- /** Dispatches ucEvent CustomEvent after source init (post-init trigger). */
323
- declare const trigger: (input: unknown, env: Record<string, unknown>) => void | (() => void);
324
-
325
225
  /**
326
226
  * Usercentrics consent management source for walkerOS.
327
227
  *
@@ -355,4 +255,4 @@ declare const trigger: (input: unknown, env: Record<string, unknown>) => void |
355
255
  */
356
256
  declare const sourceUsercentrics: Source.Init<Types>;
357
257
 
358
- export { index as SourceUsercentrics, createMockElbFn, createTrigger, sourceUsercentrics as default, fullConsent$1 as fullConsent, fullConsentCustomMapped, fullConsentMapped, fullConsentUpperCase, implicitConsent, minimalConsent$1 as minimalConsent, minimalConsentMapped, nonConsentEvent, noopLogger, partialConsent, partialConsentMapped, serviceLevelConsent, serviceLevelMapped, sourceUsercentrics, step, trigger };
258
+ export { index as SourceUsercentrics, sourceUsercentrics as default, sourceUsercentrics };
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { Source, Elb, WalkerOS, Logger, Flow, Trigger } from '@walkeros/core';
1
+ import { Source, Elb } from '@walkeros/core';
2
2
 
3
3
  declare module '@walkeros/core' {
4
4
  interface SourceMap {
@@ -222,106 +222,6 @@ declare namespace index {
222
222
  export type { index_Config as Config, index_Env as Env, index_InitSettings as InitSettings, index_Mapping as Mapping, index_Push as Push, index_Settings as Settings, index_Types as Types, index_UsercentricsEventDetail as UsercentricsEventDetail, index_UsercentricsV2Api as UsercentricsV2Api, index_UsercentricsV2Service as UsercentricsV2Service, index_UsercentricsV3Api as UsercentricsV3Api, index_UsercentricsV3CategoryData as UsercentricsV3CategoryData, index_UsercentricsV3CategoryState as UsercentricsV3CategoryState, index_UsercentricsV3CmpEventDetail as UsercentricsV3CmpEventDetail, index_UsercentricsV3ConsentData as UsercentricsV3ConsentData, index_UsercentricsV3ConsentDetails as UsercentricsV3ConsentDetails };
223
223
  }
224
224
 
225
- /**
226
- * Example Usercentrics consent event detail inputs.
227
- *
228
- * These represent real event.detail payloads from Usercentrics CMP.
229
- */
230
- /**
231
- * Full consent - user accepted all categories (explicit)
232
- */
233
- declare const fullConsent$1: UsercentricsEventDetail;
234
- /**
235
- * Partial consent - user accepted only essential and functional (explicit)
236
- */
237
- declare const partialConsent: UsercentricsEventDetail;
238
- /**
239
- * Minimal consent - user denied everything except essential (explicit)
240
- */
241
- declare const minimalConsent$1: UsercentricsEventDetail;
242
- /**
243
- * Implicit consent - page load with default consent state
244
- * (not an explicit user choice)
245
- */
246
- declare const implicitConsent: UsercentricsEventDetail;
247
- /**
248
- * Explicit consent with uppercase type field (Usercentrics docs are
249
- * inconsistent about casing - some show 'EXPLICIT', others 'explicit')
250
- */
251
- declare const fullConsentUpperCase: UsercentricsEventDetail;
252
- /**
253
- * Service-level consent - ucCategory has mixed types (non-boolean values
254
- * indicate individual service-level choice rather than group-level)
255
- */
256
- declare const serviceLevelConsent: UsercentricsEventDetail;
257
- /**
258
- * Non-consent event (should be ignored)
259
- */
260
- declare const nonConsentEvent: UsercentricsEventDetail;
261
-
262
- /**
263
- * Expected walkerOS consent outputs.
264
- *
265
- * These represent the consent state after parsing Usercentrics event details
266
- * with no category mapping configured (pass-through).
267
- */
268
- /**
269
- * Full consent - all categories true (group-level)
270
- */
271
- declare const fullConsentMapped: WalkerOS.Consent;
272
- /**
273
- * Partial consent - essential and functional true, marketing false
274
- */
275
- declare const partialConsentMapped: WalkerOS.Consent;
276
- /**
277
- * Minimal consent - only essential true
278
- */
279
- declare const minimalConsentMapped: WalkerOS.Consent;
280
- /**
281
- * Full consent with custom category mapping applied
282
- * (essential->functional, functional->functional, marketing->marketing)
283
- */
284
- declare const fullConsentCustomMapped: WalkerOS.Consent;
285
- /**
286
- * Service-level consent - individual service booleans + boolean ucCategory entries
287
- * (services normalized: lowercase, spaces to underscores)
288
- * (ucCategory boolean entries mapped through categoryMap)
289
- */
290
- declare const serviceLevelMapped: WalkerOS.Consent;
291
-
292
- /**
293
- * Create a properly typed elb/push function mock
294
- */
295
- declare const createMockElbFn: () => Elb.Fn;
296
- /**
297
- * Simple no-op logger for demo purposes
298
- */
299
- declare const noopLogger: Logger.Instance;
300
-
301
- declare const fullConsent: Flow.StepExample;
302
- declare const minimalConsent: Flow.StepExample;
303
- declare const categoryMapOverride: Flow.StepExample;
304
- declare const customEventName: Flow.StepExample;
305
-
306
- declare const step_categoryMapOverride: typeof categoryMapOverride;
307
- declare const step_customEventName: typeof customEventName;
308
- declare const step_fullConsent: typeof fullConsent;
309
- declare const step_minimalConsent: typeof minimalConsent;
310
- declare namespace step {
311
- export { step_categoryMapOverride as categoryMapOverride, step_customEventName as customEventName, step_fullConsent as fullConsent, step_minimalConsent as minimalConsent };
312
- }
313
-
314
- interface UsercentricsContent {
315
- event: string;
316
- type: string;
317
- action?: string;
318
- ucCategory?: Record<string, boolean | unknown>;
319
- [service: string]: unknown;
320
- }
321
- declare const createTrigger: Trigger.CreateFn<UsercentricsContent, void>;
322
- /** Dispatches ucEvent CustomEvent after source init (post-init trigger). */
323
- declare const trigger: (input: unknown, env: Record<string, unknown>) => void | (() => void);
324
-
325
225
  /**
326
226
  * Usercentrics consent management source for walkerOS.
327
227
  *
@@ -355,4 +255,4 @@ declare const trigger: (input: unknown, env: Record<string, unknown>) => void |
355
255
  */
356
256
  declare const sourceUsercentrics: Source.Init<Types>;
357
257
 
358
- export { index as SourceUsercentrics, createMockElbFn, createTrigger, sourceUsercentrics as default, fullConsent$1 as fullConsent, fullConsentCustomMapped, fullConsentMapped, fullConsentUpperCase, implicitConsent, minimalConsent$1 as minimalConsent, minimalConsentMapped, nonConsentEvent, noopLogger, partialConsent, partialConsentMapped, serviceLevelConsent, serviceLevelMapped, sourceUsercentrics, step, trigger };
258
+ export { index as SourceUsercentrics, sourceUsercentrics as default, sourceUsercentrics };
package/dist/index.es5.js CHANGED
@@ -1 +1 @@
1
- "use strict";function _array_like_to_array(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}function _array_with_holes(e){if(Array.isArray(e))return e}function _array_without_holes(e){if(Array.isArray(e))return _array_like_to_array(e)}function _assert_this_initialized(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function asyncGeneratorStep(e,t,n,r,o,a,s){try{var i=e[a](s),c=i.value}catch(e){return void n(e)}i.done?t(c):Promise.resolve(c).then(r,o)}function _async_to_generator(e){return function(){var t=this,n=arguments;return new Promise(function(r,o){var a=e.apply(t,n);function s(e){asyncGeneratorStep(a,r,o,s,i,"next",e)}function i(e){asyncGeneratorStep(a,r,o,s,i,"throw",e)}s(void 0)})}}function _call_super(e,t,n){return t=_get_prototype_of(t),_possible_constructor_return(e,_is_native_reflect_construct()?Reflect.construct(t,n||[],_get_prototype_of(e).constructor):t.apply(e,n))}function _class_call_check(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _construct(e,t,n){return _construct=_is_native_reflect_construct()?Reflect.construct:function(e,t,n){var r=[null];r.push.apply(r,t);var o=new(Function.bind.apply(e,r));return n&&_set_prototype_of(o,n.prototype),o},_construct.apply(null,arguments)}function _define_property(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function _get_prototype_of(e){return _get_prototype_of=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)},_get_prototype_of(e)}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&_set_prototype_of(e,t)}function _instanceof(e,t){return null!=t&&"undefined"!=typeof Symbol&&t[Symbol.hasInstance]?!!t[Symbol.hasInstance](e):e instanceof t}function _is_native_function(e){return-1!==Function.toString.call(e).indexOf("[native code]")}function _iterable_to_array(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}function _iterable_to_array_limit(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,o,a=[],s=!0,i=!1;try{for(n=n.call(e);!(s=(r=n.next()).done)&&(a.push(r.value),!t||a.length!==t);s=!0);}catch(e){i=!0,o=e}finally{try{s||null==n.return||n.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(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{},r=Object.keys(n);"function"==typeof Object.getOwnPropertySymbols&&(r=r.concat(Object.getOwnPropertySymbols(n).filter(function(e){return Object.getOwnPropertyDescriptor(n,e).enumerable}))),r.forEach(function(t){_define_property(e,t,n[t])})}return e}function ownKeys(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,r)}return n}function _object_spread_props(e,t){return t=null!=t?t:{},Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):ownKeys(Object(t)).forEach(function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(t,n))}),e}function _possible_constructor_return(e,t){return!t||"object"!==_type_of(t)&&"function"!=typeof t?_assert_this_initialized(e):t}function _set_prototype_of(e,t){return _set_prototype_of=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},_set_prototype_of(e,t)}function _sliced_to_array(e,t){return _array_with_holes(e)||_iterable_to_array_limit(e,t)||_unsupported_iterable_to_array(e,t)||_non_iterable_rest()}function _to_consumable_array(e){return _array_without_holes(e)||_iterable_to_array(e)||_unsupported_iterable_to_array(e)||_non_iterable_spread()}function _type_of(e){return e&&"undefined"!=typeof Symbol&&e.constructor===Symbol?"symbol":typeof e}function _unsupported_iterable_to_array(e,t){if(e){if("string"==typeof e)return _array_like_to_array(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(n):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?_array_like_to_array(e,t):void 0}}function _wrap_native_super(e){var t="function"==typeof Map?new Map:void 0;return _wrap_native_super=function(e){if(null===e||!_is_native_function(e))return e;if("function"!=typeof e)throw new TypeError("Super expression must either be null or a function");if(void 0!==t){if(t.has(e))return t.get(e);t.set(e,n)}function n(){return _construct(e,arguments,_get_prototype_of(this).constructor)}return n.prototype=Object.create(e.prototype,{constructor:{value:n,enumerable:!1,writable:!0,configurable:!0}}),_set_prototype_of(n,e)},_wrap_native_super(e)}function _is_native_reflect_construct(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch(e){}return(_is_native_reflect_construct=function(){return!!e})()}function _ts_generator(e,t){var n,r,o,a={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]},s=Object.create(("function"==typeof Iterator?Iterator:Object).prototype),i=Object.defineProperty;return i(s,"next",{value:c(0)}),i(s,"throw",{value:c(1)}),i(s,"return",{value:c(2)}),"function"==typeof Symbol&&i(s,Symbol.iterator,{value:function(){return this}}),s;function c(i){return function(c){return function(i){if(n)throw new TypeError("Generator is already executing.");for(;s&&(s=0,i[0]&&(a=0)),a;)try{if(n=1,r&&(o=2&i[0]?r.return:i[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,i[1])).done)return o;switch(r=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++,r=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(e,a)}catch(e){i=[6,e],r=0}finally{n=o=0}if(5&i[0])throw i[1];return{value:i[0]?i[1]:void 0,done:!0}}([i,c])}}}function _ts_values(e){var t="function"==typeof Symbol&&Symbol.iterator,n=t&&e[t],r=0;if(n)return n.call(e);if(e&&"number"==typeof e.length)return{next:function(){return e&&r>=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}var SourceUsercentrics=function(){var e=function(e,t,n){e[t]=(void 0===e[t]||Boolean(e[t]))&&n},t=function(t,n){var r,o={};return t.ucCategory&&(r=t.ucCategory,Object.values(r).every(function(e){return"boolean"==typeof e}))?Object.entries(t.ucCategory).forEach(function(t){var r,a,s=_sliced_to_array(t,2),i=s[0],c=s[1];if("boolean"==typeof c){var u=null!==(r=null===(a=n.categoryMap)||void 0===a?void 0:a[i])&&void 0!==r?r:i;e(o,u,c)}}):(t.ucCategory&&Object.entries(t.ucCategory).forEach(function(t){var r=_sliced_to_array(t,2),a=r[0],s=r[1];if("boolean"==typeof s){var i,c,u=null!==(i=null===(c=n.categoryMap)||void 0===c?void 0:c[a])&&void 0!==i?i:a;e(o,u,s)}}),Object.entries(t).forEach(function(t){var n=_sliced_to_array(t,2),r=n[0],a=n[1];if(!We.includes(r)&&"boolean"==typeof a){var s=r.toLowerCase().replace(/ /g,"_");e(o,s,a)}})),o},n=function(e){var t={};return e.forEach(function(e){var n,r,o=e.categorySlug,a=null!==(n=null===(r=e.consent)||void 0===r?void 0:r.status)&&void 0!==n&&n;t[o]=(void 0===t[o]||t[o])&&a}),t},r=function(e){var r,o,a=e.window,s=e.elb,i=e.settings,c=e.logger,u=null!==(r=i.eventName)&&void 0!==r?r:"ucEvent",l=function(e){var n;if(c.debug("event received",e),"consent_status"===e.event&&(!i.explicitOnly||"explicit"===(null===(n=e.type)||void 0===n?void 0:n.toLowerCase()))){var r=t(e,i);Object.keys(r).length>0&&s("walker consent",r)}},f=function(e){var t=e;t.detail&&l(t.detail)};a.addEventListener(u,f);var d=a.UC_UI;if((null==d||null===(o=d.isInitialized)||void 0===o?void 0:o.call(d))&&d.getServicesBaseInfo){var p=d.getServicesBaseInfo();p.length>0&&l(function(e){return{event:"consent_status",type:"implicit",ucCategory:n(e)}}(p))}return function(){a.removeEventListener(u,f)}},o=function(e){return _async_to_generator(function(){var n,r,o,a,s,i,c,u,l,f;return _ts_generator(this,function(d){switch(d.label){case 0:if(r=e.window,o=e.elb,a=e.settings,s=e.logger,i=null!==(n=a.v3EventName)&&void 0!==n?n:Ye,c=function(e){return _async_to_generator(function(){var n,r,i;return _ts_generator(this,function(c){switch(c.label){case 0:return[4,e.getConsentDetails()];case 1:return n=c.sent(),r=function(e){var t={};return Object.entries(e.categories).forEach(function(e){var n=_sliced_to_array(e,2),r=n[0],o=n[1];t[r]="ALL_ACCEPTED"===o.state}),{event:"consent_status",type:"EXPLICIT"===e.consent.type?"explicit":"implicit",ucCategory:t}}(n),s.debug("event received",r),a.explicitOnly&&"explicit"!==r.type?[2]:(i=t(r,a),Object.keys(i).length>0&&o("walker consent",i),[2])}})})()},u=function(e){var t=r.__ucCmp;if(t){var n=e.detail;n&&"CMP"===n.source&&n.type&&$e.has(n.type)&&c(t).catch(function(){})}},r.addEventListener(i,u),!(l=r.__ucCmp))return[3,6];d.label=1;case 1:return d.trys.push([1,5,,6]),[4,l.isInitialized()];case 2:return d.sent()?[4,c(l)]:[3,4];case 3:d.sent(),d.label=4;case 4:return[3,6];case 5:return f=d.sent(),s.warn("v3 static consent read failed",f),[3,6];case 6:return[2,function(){r.removeEventListener(i,u)}]}})})()},a=function(e,t){if("collector"===e)return"collector";if(!t)throw new Error("stepId(".concat(e,") requires an id"));return"".concat(e,".").concat(t)},s=function(e,t){var n=e.destinations[t];if(!n)throw new Error("Destination not found: ".concat(t));return n},i=function(e,t){var n=e.transformers[t];if(!n)throw new Error("Transformer not found: ".concat(t));return n},c=function(e,t){var n=e.sources[t];if(!n)throw new Error("Source not found: ".concat(t));return n},u=function(e,t){var n=e.stores[t];if(!n)throw new Error("Store not found: ".concat(t));return n},l=function(e){return{_meta:{hops:0,path:[e]}}},f=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};n=_object_spread({},wt,n);var r=Object.entries(t).reduce(function(t,r){var o=_sliced_to_array(r,2),a=o[0],s=o[1],i=e[a];return n.merge&&Array.isArray(i)&&Array.isArray(s)?t[a]=s.reduce(function(e,t){return e.includes(t)?e:_to_consumable_array(e).concat([t])},_to_consumable_array(i)):(n.extend||a in e)&&(t[a]=s),t},{});return n.shallow?_object_spread({},e,r):(Object.assign(e,r),e)},d=function(e){return Array.isArray(e)},p=function(e){return void 0!==e},v=function(e){return"function"==typeof e},_=function(e){return"object"==(void 0===e?"undefined":_type_of(e))&&null!==e&&!d(e)&&"[object Object]"===Object.prototype.toString.call(e)},g=function(e){return"string"==typeof e},y=function(e,t,n){if(!_(e))return e;for(var r=kt(e),o=t.split("."),a=r,s=0;s<o.length;s++){var i=o[s];s===o.length-1?a[i]=n:(i in a&&"object"==_type_of(a[i])&&null!==a[i]||(a[i]={}),a=a[i])}return r},h=function(e,t){if(!_(e)&&!d(e))return e;for(var n=kt(e),r=t.split("."),o=n,a=0;a<r.length;a++){var s=r[a],i=a===r.length-1;if(d(o)){var c=Number(s);if(!Number.isInteger(c)||c<0||c>=o.length)return n;if(i)o.splice(c,1);else{var u=o[c];if(!_(u)&&!d(u))return n;o=u}}else if(i)delete o[s];else{var l=o[s];if(!_(l)&&!d(l))return n;o=l}}return n},m=function(e){var t=_object_spread({},arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},arguments.length>2&&void 0!==arguments[2]?arguments[2]:{}),n={},r=!e||0===Object.keys(e).length;return Object.keys(t).forEach(function(o){t[o]&&(n[o]=!0,e&&e[o]&&(r=!0))}),!!r&&n},b=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:6,t=arguments.length>1?arguments[1]:void 0;if(t){for(var n=t.length,r="",o=0;o<e;o++)r+=t[Math.random()*n|0];return r}for(var a="";a.length<e;)a+=(36*Math.random()|0).toString(36);return a},w=function(e){return{message:e.message,name:e.name,stack:e.stack,cause:e.cause}},k=function(e,t){var n,r={};return _instanceof(e,Error)?(n=e.message,r.error=w(e)):n=e,void 0!==t&&(_instanceof(t,Error)?r.error=w(t):"object"==(void 0===t?"undefined":_type_of(t))&&null!==t?"error"in(r=_object_spread({},r,t))&&_instanceof(r.error,Error)&&(r.error=w(r.error)):r.value=t),{message:n,context:r}},j=function(){var e,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return Ct({level:void 0!==t.level?(e=t.level,"string"==typeof e?bt[e]:e):0,handler:t.handler,jsonHandler:t.jsonHandler,scope:[]})},S=function(e){return Ot(e)?e:void 0},x=function(e,t,n){return function(){for(var r=arguments.length,o=new Array(r),a=0;a<r;a++)o[a]=arguments[a];try{return e.apply(void 0,_to_consumable_array(o))}catch(e){if(!t)return;return t(e)}finally{null==n||n()}}},C=function(e,t,n){return function(){for(var r=arguments.length,o=new Array(r),a=0;a<r;a++)o[a]=arguments[a];return _async_to_generator(function(){var r;return _ts_generator(this,function(a){switch(a.label){case 0:return a.trys.push([0,2,4,6]),[4,e.apply(void 0,_to_consumable_array(o))];case 1:case 3:return[2,a.sent()];case 2:return r=a.sent(),t?[4,t(r)]:[2];case 4:return[4,null==n?void 0:n()];case 5:return a.sent(),[7];case 6:return[2]}})})()}},O=function(e,t,n){return _async_to_generator(function(){var r,o,a,s,i,c,u,l,f,p;return _ts_generator(this,function(v){return o=_sliced_to_array((e.name||"").split(" "),2),a=o[0],s=o[1],t&&a&&s?(c="",l=s,f=function(t){if(t)return(d(t)?t:[t]).find(function(t){if(!t.condition)return!0;if(!n)return Boolean(t.condition(e,void 0));var r={event:e,mapping:t,collector:n,logger:n.logger,consent:_(e)&&e.consent||n.consent};return Boolean(t.condition(e,r))})},t[u=a]||(u="*"),[2,((p=t[u])&&(p[l]||(l="*"),i=f(p[l])),i||(u="*",l="*",i=f(null===(r=t[u])||void 0===r?void 0:r[l])),i&&(c="".concat(u," ").concat(l)),{eventMapping:i,mappingKey:c})]):[2,{}]})})()},E=function(e){return _async_to_generator(function(e){var t,n,r,o,a,s,i,c,u,l,f,v,g,y,h,m,b=arguments;return _ts_generator(this,function(w){switch(w.label){case 0:if(t=b.length>1&&void 0!==b[1]?b[1]:{},n=b.length>2&&void 0!==b[2]?b[2]:{},!p(e))return[2];if(a=_(e)&&e.consent||n.consent||(null===(o=n.collector)||void 0===o?void 0:o.consent),s=null!==(r=n.event)&&void 0!==r?r:_(e)?e:{},!n.collector)throw new Error("getMappingValue: context.collector is required");i={event:s,mapping:t,collector:n.collector,logger:n.collector.logger,consent:a},c=d(t)?t:[t],u=!0,l=!1,f=void 0,w.label=1;case 1:w.trys.push([1,6,7,8]),v=c[Symbol.iterator](),w.label=2;case 2:return(u=(g=v.next()).done)?[3,5]:(y=g.value,[4,C(At,function(e){if(_instanceof(e,Et))throw e;n.collector&&n.collector.status.failed++,i.logger.error("mapping processing failed",{event:s,error:e})})(e,y,_object_spread_props(_object_spread({},i),{mapping:y}))]);case 3:if(h=w.sent(),p(h))return[2,h];w.label=4;case 4:return u=!0,[3,2];case 5:return[3,8];case 6:return m=w.sent(),l=!0,f=m,[3,8];case 7:try{u||null==v.return||v.return()}finally{if(l)throw f}return[7];case 8:return[2]}})}).apply(this,arguments)},A=function(e,t,n){return _async_to_generator(function(){var r,o,a,s,i,c,u,l,d,p,v,g,m,b,w,k,j;return _ts_generator(this,function(S){switch(S.label){case 0:return t.policy?[4,Promise.all(Object.entries(t.policy).map(function(t){var r=_sliced_to_array(t,2),o=r[0],a=r[1];return _async_to_generator(function(){var t;return _ts_generator(this,function(r){switch(r.label){case 0:return[4,E(e,a,{collector:n,event:e})];case 1:return t=r.sent(),e=y(e,o,t),[2]}})})()}))]:[3,2];case 1:S.sent(),S.label=2;case 2:return[4,O(e,t.mapping,n)];case 3:return o=S.sent(),a=o.eventMapping,s=o.mappingKey,(null==a?void 0:a.policy)?[4,Promise.all(Object.entries(a.policy).map(function(t){var r=_sliced_to_array(t,2),o=r[0],a=r[1];return _async_to_generator(function(){var t;return _ts_generator(this,function(r){switch(r.label){case 0:return[4,E(e,a,{collector:n,event:e})];case 1:return t=r.sent(),e=y(e,o,t),[2]}})})()}))]:[3,5];case 4:S.sent(),S.label=5;case 5:return(c=t.data)?[4,E(e,t.data,{collector:n,event:e})]:[3,7];case 6:c=S.sent(),S.label=7;case 7:return i=c,u=Boolean(null==a?void 0:a.silent),a?a.ignore?[2,{event:e,data:i,mapping:a,mappingKey:s,ignore:!0,silent:u}]:(a.name&&(e.name=a.name),a.data?(d=a.data)?[4,E(e,a.data,{collector:n,event:e})]:[3,9]:[3,10]):[3,10];case 8:d=S.sent(),S.label=9;case 9:l=d,i=_(i)&&_(l)?f(i,l):l,S.label=10;case 10:if((p=null!==(r=null==a?void 0:a.include)&&void 0!==r?r:t.include)&&p.length>0&&(v=function(e,t){var n={},r=t.includes("all")?Object.keys(St):t,o=!0,a=!1,s=void 0;try{for(var i,c=r[Symbol.iterator]();!(o=(i=c.next()).done);o=!0){var u=i.value,l=St[u];if(l){var f=l(e),d=!0,p=!1,v=void 0;if(_(f))try{for(var g,y=Object.entries(f)[Symbol.iterator]();!(d=(g=y.next()).done);d=!0){var h=_sliced_to_array(g.value,2),m=h[0],b=h[1];if(void 0!==b){var w="context"===u&&Array.isArray(b)?b[0]:b;n["".concat(u,"_").concat(m)]=w}}}catch(e){p=!0,v=e}finally{try{d||null==y.return||y.return()}finally{if(p)throw v}}}}}catch(e){a=!0,s=e}finally{try{o||null==c.return||c.return()}finally{if(a)throw s}}return n}(e,p),Object.keys(v).length>0&&(i=_(i)?f(v,i):null!=i?i:v)),g=!0,m=!1,b=void 0,(null==a?void 0:a.remove)&&_(i))try{for(w=a.remove[Symbol.iterator]();!(g=(k=w.next()).done);g=!0)j=k.value,i=h(i,j)}catch(e){m=!0,b=e}finally{try{g||null==w.return||w.return()}finally{if(m)throw b}}return[2,{event:e,data:i,mapping:a,mappingKey:s,ignore:!1,silent:u}]}})})()},I=function(e,t,n,r){var o=e;return function(){for(var e=arguments.length,a=new Array(e),s=0;s<e;s++)a[s]=arguments[s];var i,c="pre"+t,u="post"+t,l=n[c],f=n[u],d=function(e,t){r?r.warn(e,{error:t}):console.warn(e,t)};if(l)try{i=l.apply(void 0,[{fn:o}].concat(_to_consumable_array(a)))}catch(e){d("Hook ".concat(String(c)," failed, falling back to original function"),e),i=o.apply(void 0,_to_consumable_array(a))}else i=o.apply(void 0,_to_consumable_array(a));if(f)try{i=f.apply(void 0,[{fn:o,result:i}].concat(_to_consumable_array(a)))}catch(e){d("Hook ".concat(String(u)," failed, keeping original result"),e)}return i}},q=function(e,t){if(0!==e.observers.size){var n=Array.from(e.observers),r=!0,o=!1,a=void 0;try{for(var s,i=n[Symbol.iterator]();!(r=(s=i.next()).done);r=!0){var c=s.value;try{c(t)}catch(e){}}}catch(e){o=!0,a=e}finally{try{r||null==i.return||i.return()}finally{if(o)throw a}}}},D=function(e){return Array.isArray(e)&&e.length>0&&e.every(function(e){return function(e){return"object"==(void 0===e?"undefined":_type_of(e))&&null!==e&&!Array.isArray(e)&&("match"in e||"next"in e||"one"in e||"many"in e)}(e)})},P=function(e){return e.map(function(e){var t,n;if("string"==typeof e)return{match:function(){return!0},next:{type:"static",value:e}};if(Array.isArray(e))return{match:function(){return!0},next:null!==(t=qt(e))&&void 0!==t?t:{type:"chain",value:[]}};var r=e;return{match:r.match?It(r.match):function(){return!0},next:null!==(n=qt(r))&&void 0!==n?n:{type:"chain",value:[]}}})},M=function(e){var t,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(null==e)return[];if("object"==(void 0===e?"undefined":_type_of(e))){var r=Dt.get(e);r?t=r:(t=qt(e))&&Dt.set(e,t)}else t=qt(e);if(!t)return[];var o=Pt(t,n);return void 0===o?[]:Array.isArray(o)?o:[o]},T=function(e,t){var n={ingest:null!=e?e:{}};return void 0!==t&&(n.event=t),n},N=function(e){var t;return{stop:null!==(t=e.stop)&&void 0!==t&&t,storeId:e.store,namespace:e.namespace,rules:e.rules.map(function(e){return{match:e.match?It(e.match):function(){return!0},key:e.key,ttl:e.ttl,update:e.update}})}},R=function(e,t,n,r){return _async_to_generator(function(){var o,a,s,i,c,u;return _ts_generator(this,function(l){switch(l.label){case 0:return(o=e.rules.find(function(e){return e.match(n)}))?(a=o.key.map(function(e){var t;return String(null!==(t=jt(n,e))&&void 0!==t?t:"")})).every(function(e){return""===e})?[2,null]:(s=a.join(":"),i=null!=r?r:e.namespace,c=i?"".concat(i,":").concat(s):s,[4,t.get(c)]):[2,null];case 1:return[2,void 0!==(u=l.sent())?{status:"HIT",key:c,value:u,rule:o}:{status:"MISS",key:c,rule:o}]}})})()},U=function(e,t,n,r){e.set(t,n,1e3*r)},G=function(e,t,n,r){return _async_to_generator(function(){var o,a,s,i,c,u,l,f,d,p,v;return _ts_generator(this,function(_){switch(_.label){case 0:if(!t)return[2,e];o=e,a=!0,s=!1,i=void 0,_.label=1;case 1:_.trys.push([1,6,7,8]),c=Object.entries(t)[Symbol.iterator](),_.label=2;case 2:return(a=(u=c.next()).done)?[3,5]:(l=_sliced_to_array(u.value,2),f=l[0],d=l[1],p=[o,f],[4,E(n,d,{collector:r})]);case 3:o=y.apply(void 0,p.concat([_.sent()])),_.label=4;case 4:return a=!0,[3,2];case 5:return[3,8];case 6:return v=_.sent(),s=!0,i=v,[3,8];case 7:try{a||null==c.return||c.return()}finally{if(s)throw i}return[7];case 8:return[2,o]}})})()},z=function(e){return d(e)?e:[e]},L=function(e,t,n,r){return _async_to_generator(function(){var o,a,s,i,c,u,l,f;return _ts_generator(this,function(d){switch(d.label){case 0:o=n,a=!0,s=!1,i=void 0,d.label=1;case 1:d.trys.push([1,6,7,8]),c=function(){var e;return _ts_generator(this,function(n){switch(n.label){case 0:return e=l.value,[4,C(function(){return _async_to_generator(function(){var n,a,s,i,c,u,l;return _ts_generator(this,function(f){switch(f.label){case 0:return(n=t(e.store))?[4,E(o,e.key,{collector:r,event:o})]:[2];case 1:return a=f.sent(),g(a)?(s=e.store?a:"state:".concat(a),"set"!==e.mode?[3,4]:[4,E(o,e.value,{collector:r,event:o})]):[2];case 2:return i=f.sent(),p(i)?[4,n.set(s,i)]:[2];case 3:return f.sent(),[3,6];case 4:return(c=g(l=e.value)?l:_(l)&&g(l.key)?l.key:void 0)?[4,n.get(s)]:[2];case 5:if(u=f.sent(),!p(u))return[2];o=y(o,c,u),f.label=6;case 6:return[2]}})})()},function(e){var t,n;if(_instanceof(e,Et))throw e;null===(n=r.logger)||void 0===n||null===(t=n.error)||void 0===t||t.call(n,"[state] operation failed",e)})()];case 1:return n.sent(),[2]}})},u=e[Symbol.iterator](),d.label=2;case 2:return(a=(l=u.next()).done)?[3,5]:[5,_ts_values(c())];case 3:d.sent(),d.label=4;case 4:return a=!0,[3,2];case 5:return[3,8];case 6:return f=d.sent(),s=!0,i=f,[3,8];case 7:try{a||null==u.return||u.return()}finally{if(s)throw i}return[7];case 8:return[2,o]}})})()},K=function(e,t){var n=e.status.startedAt;return{flowId:"default",stepId:t.stepId,stepType:t.stepType,phase:t.phase,eventId:t.eventId,timestamp:new Date(t.now).toISOString(),elapsedMs:t.now-n}},V=function(e,t){return e.storeId&&t.stores[e.storeId]?t.stores[e.storeId]:t.stores.__cache},B=function(e,t){return e?t.stores[e]:t.stores.__cache},H=function(e){var t={},n=!0,r=!1,o=void 0;try{for(var a,s=Object.entries(e)[Symbol.iterator]();!(n=(a=s.next()).done);n=!0){var i,c=_sliced_to_array(a.value,2),u=c[0],l=null===(i=c[1].config)||void 0===i?void 0:i.next;"string"==typeof l||Array.isArray(l)&&l.every(function(e){return"string"==typeof e})?t[u]={next:l}:t[u]={}}}catch(e){r=!0,o=e}finally{try{n||null==s.return||s.return()}finally{if(r)throw o}}return t},F=function(e,t){var n=e.config||{},r=e[t];return void 0!==r?{config:_object_spread_props(_object_spread({},n),_define_property({},t,r)),chainValue:r}:{config:n,chainValue:void 0}},W=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(!e)return[];if(Array.isArray(e))return e;for(var n=[],r=new Set,o=e;o&&t[o]&&!r.has(o);){r.add(o),n.push(o);var a=t[o].next;if(Array.isArray(a)){var s;(s=n).push.apply(s,_to_consumable_array(a));break}o=a}return n},Y=function(e,t,n){return _async_to_generator(function(){var r,o,a,s;return _ts_generator(this,function(i){switch(i.label){case 0:return!t.init||t.config.init?[3,2]:(r=t.type||"unknown",o=e.logger.scope("transformer:".concat(r)),a={collector:e,logger:o,id:n,ingest:l(n),config:t.config,env:X(t.config.env)},o.debug("init"),[4,I(t.init,"TransformerInit",e.hooks,e.logger)(a)]);case 1:if(!1===(s=i.sent()))return[2,!1];t.config=_object_spread_props(_object_spread({},s||t.config),{env:(null==s?void 0:s.env)||t.config.env,init:!0}),o.debug("init done"),i.label=2;case 2:return[2,!0]}})})()},$=function(e,t,n,r,o,s){return _async_to_generator(function(){var i,c,u,l,f,d,p,v,_,g,y,h;return _ts_generator(this,function(m){switch(m.label){case 0:i=t.type||"unknown",c=e.logger.scope("transformer:".concat(i)),u={collector:e,logger:c,id:n,ingest:o,config:t.config,env:_object_spread({},X(t.config.env),s?{respond:s}:{})},c.debug("push",{event:r.name}),l="string"==typeof r.id?r.id:"",f=Date.now(),d=K(e,{stepId:a("transformer",n),stepType:"transformer",phase:"in",eventId:l,now:f}),q(e,d),m.label=1;case 1:return m.trys.push([1,3,,4]),[4,I(t.push,"TransformerPush",e.hooks,e.logger)(r,u)];case 2:return p=m.sent(),v=Date.now(),[2,((_=K(e,{stepId:a("transformer",n),stepType:"transformer",phase:"out",eventId:l,now:v})).durationMs=v-f,_.outEvent=p,q(e,_),c.debug("push done"),p)];case 3:throw g=m.sent(),y=Date.now(),(h=K(e,{stepId:a("transformer",n),stepType:"transformer",phase:"error",eventId:l,now:y})).durationMs=y-f,h.error=_instanceof(g,Error)?{name:g.name,message:g.message}:{message:String(g)},q(e,h),g;case 4:return[2]}})})()},J=function(e,t){return e?_object_spread_props(_object_spread({},e),{_meta:_object_spread_props(_object_spread({},e._meta),{path:_to_consumable_array(e._meta.path)})}):l(t)},X=function(e){return e&&_(e)?e:{}},Z=function(e){return"string"==typeof e||!(!Array.isArray(e)||!e.every(function(e){return"string"==typeof e}))},Q=function(e,t,n){return _async_to_generator(function(){var r,o,a,s,i,c,u,l,f,d,p;return _ts_generator(this,function(v){switch(v.label){case 0:if(!t.on||!(null===(r=t.queueOn)||void 0===r?void 0:r.length))return[2];a=t.queueOn,t.queueOn=[],s=n||(null===(o=t.config)||void 0===o?void 0:o.id)||"unknown",i=!0,c=!1,u=void 0,v.label=1;case 1:v.trys.push([1,6,7,8]),l=function(){var n,r,o;return _ts_generator(this,function(a){switch(a.label){case 0:return n=d.value,r=n.type,o=n.data,oe(r)&&!se(e,t)?[3,2]:[4,C(t.on,function(t){if(_instanceof(t,Et))throw t;e.status.failed++,e.logger.scope("source").error("source on flush failed",{sourceId:s,type:r,error:t})})(r,o)];case 1:a.sent(),oe(r)&&ae(e,t),a.label=2;case 2:return[2]}})},f=a[Symbol.iterator](),v.label=2;case 2:return(i=(d=f.next()).done)?[3,5]:[5,_ts_values(l())];case 3:v.sent(),v.label=4;case 4:return i=!0,[3,2];case 5:return[3,8];case 6:return p=v.sent(),c=!0,u=p,[3,8];case 7:try{i||null==f.return||f.return()}finally{if(c)throw u}return[7];case 8:return[2]}})})()},ee=function(e){var t;return Boolean(e.config.init)&&!(null===(t=e.config.require)||void 0===t?void 0:t.length)},te=function(e,t,n){return _async_to_generator(function(){var r,o,a,s,i,c,u,f,d,p,v,_,g,y,h,m,b,w,k,j,S,x,O,A,I,q,D,P;return _ts_generator(this,function(K){switch(K.label){case 0:return a=n.code,s=n.config,i=void 0===s?{}:s,c=n.env,u=void 0===c?{}:c,f=n.primary,d=n.next,p=n.before,v=n.cache,_=null!==(r=i.state)&&void 0!==r?r:n.state,g=_?z(_):void 0,h=(y=v)?N(_object_spread_props(_object_spread({},y),{stop:null===(o=y.stop)||void 0===o||o})):void 0,m=Z(d)?W(d,H(e.transformers)):void 0,b=Z(p)?W(p,H(e.transformers)):void 0,w=u.push,k=null!=w?w:e.push,j=Boolean(w),S=function(n,r,o){return _async_to_generator(function(){var a,s,c,u,l,f,v,_,y,w,S,x,O,E,A,I,q,D,P,N,z,K,F,Y;return _ts_generator(this,function($){switch($.label){case 0:return s=null!=b?b:void 0!==p?function(){var t=M(p,T(o.ingest));return 0===t.length?[]:W(1===t.length?t[0]:t,H(e.transformers))}():[],c=[n],s.length>0&&e.transformers&&Object.keys(e.transformers).length>0?[4,Gt(e,e.transformers,s,n,o.ingest,o.respond,"source.".concat(t,".before"))]:[3,2];case 1:if(null===(u=$.sent()).event)return[2,{ok:!0}];if(u.stopped)return[2,(u.respond&&(o.respond=u.respond),{ok:!0})];u.respond&&(o.respond=u.respond),c=Array.isArray(u.event)?u.event:[u.event],$.label=2;case 2:return h&&(l=V(h,e))?(f=T(o.ingest),[4,R(h,l,f)]):[3,7];case 3:return(v=$.sent())?"HIT"===v.status&&void 0!==v.value&&h.stop?(y=v.value,v.rule.update?[4,G(y,v.rule.update,_object_spread_props(_object_spread({},f),{cache:{status:"HIT"}}),e)]:[3,5]):[3,6]:[3,7];case 4:y=$.sent(),$.label=5;case 5:return[2,(null===(_=o.respond)||void 0===_||_.call(o,y),{ok:!0})];case 6:"MISS"===v.status&&h.stop&&o.respond&&(w=o.respond,S=v.rule.update,x=_object_spread_props(_object_spread({},f),{cache:{status:"MISS"}}),O=v.key,E=v.rule.ttl,A=function(t){U(l,O,t,E),S?a=_async_to_generator(function(){var n;return _ts_generator(this,function(r){switch(r.label){case 0:return[4,G(t,S,x,e)];case 1:return n=r.sent(),w(n),[2]}})})():w(t)},o.respond=A),"MISS"!==v.status||h.stop||U(l,v.key,!0,v.rule.ttl),$.label=7;case 7:return I=m?{kind:"single",preChain:m}:void 0!==d?function(){var t=M(d,T(o.ingest));return 0===t.length?{kind:"single",preChain:[]}:1===t.length?{kind:"single",preChain:W(t[0],H(e.transformers))}:{kind:"many",branches:t.map(function(t){return W(t,H(e.transformers))})}}():{kind:"single",preChain:[]},!j&&g&&g.length>0?[4,Promise.all(c.map(function(t){return L(g,function(t){return B(t,e)},t,e)}))]:[3,9];case 8:c=$.sent(),$.label=9;case 9:q={ok:!0},D=!0,P=!1,N=void 0,$.label=10;case 10:$.trys.push([10,15,16,17]),z=function(){var n,a;return _ts_generator(this,function(s){switch(s.label){case 0:return n=F.value,"many"!==I.kind?[3,2]:[4,Promise.all(I.branches.map(function(a,s){return C(function(){return _async_to_generator(function(){return _ts_generator(this,function(e){return[2,j?k(n):k(n,_object_spread_props(_object_spread({},r),{id:t,ingest:J(o.ingest,"".concat(t,".").concat(s)),respond:void 0,mapping:i,preChain:a}))]})})()},function(t){return e.logger.scope("source:many").error("many branch ".concat(s," failed"),{error:t}),{ok:!0}})()}))];case 1:return s.sent(),q={ok:!0},[3,7];case 2:return j?[4,k(n)]:[3,4];case 3:return a=s.sent(),[3,6];case 4:return[4,k(n,_object_spread_props(_object_spread({},r),{id:t,ingest:o.ingest,respond:o.respond,mapping:i,preChain:I.preChain}))];case 5:a=s.sent(),s.label=6;case 6:q=a,s.label=7;case 7:return[2]}})},K=c[Symbol.iterator](),$.label=11;case 11:return(D=(F=K.next()).done)?[3,14]:[5,_ts_values(z())];case 12:$.sent(),$.label=13;case 13:return D=!0,[3,11];case 14:return[3,17];case 15:return Y=$.sent(),P=!0,N=Y,[3,17];case 16:try{D||null==K.return||K.return()}finally{if(P)throw N}return[7];case 17:return a?[4,a]:[3,19];case 18:$.sent(),$.label=19;case 19:return[2,q]}})})()},x=function(n){return _async_to_generator(function(){var r,o;return _ts_generator(this,function(a){switch(a.label){case 0:return r=l(t),i.ingest&&void 0!==n?[4,E(n,i.ingest,{collector:e})]:[2,r];case 1:return o=a.sent(),[2,_object_spread_props(_object_spread({},r,o),{_meta:r._meta})]}})})()},O=e.logger.scope("source").scope(t),A=_object_spread_props(_object_spread({command:e.command,sources:e.sources,elb:e.sources.elb.push,logger:O},u),{push:function(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return _async_to_generator(function(){var r;return _ts_generator(this,function(o){return r={ingest:l(t),respond:void 0},[2,S(e,n,r)]})})()}}),I={collector:e,logger:O,id:t,config:i,env:A,withScope:function(e,t,n){return _async_to_generator(function(){var r,o;return _ts_generator(this,function(a){switch(a.label){case 0:return o={},[4,x(e)];case 1:return o.ingest=a.sent(),o.respond=t,r=o,[2,n(_object_spread_props(_object_spread({},A),{push:function(e){return S(e,arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r)},ingest:r.ingest,respond:r.respond}))]}})})()}},[4,C(a,function(n){if(_instanceof(n,Et))throw n;e.status.failed++,e.logger.scope("source").error("source factory failed",{sourceId:t,error:n})})(I)];case 1:return(q=K.sent())?(D=q.type||"unknown",P=e.logger.scope(D).scope(t),[2,(A.logger=P,f&&(q.config=_object_spread_props(_object_spread({},q.config),{primary:f})),q)]):[2]}})})()},ne=function(e){return _async_to_generator(function(e){var t,n,r,o,a,s,i,c,u,l,f,d,p,v,_,g,y,h,m,b,w=arguments;return _ts_generator(this,function(k){switch(k.label){case 0:t=w.length>1&&void 0!==w[1]?w[1]:{},n={},r=!0,o=!1,a=void 0,k.label=1;case 1:k.trys.push([1,6,7,8]),s=Object.entries(t)[Symbol.iterator](),k.label=2;case 2:return(r=(i=s.next()).done)?[3,5]:(c=_sliced_to_array(i.value,2),u=c[0],l=c[1],[4,te(e,u,l)]);case 3:if(!(d=k.sent()))return[3,4];p=null===(f=l.config)||void 0===f?void 0:f.require,d.config=_object_spread(_object_spread_props(_object_spread({},d.config),{init:!1}),p?{require:_to_consumable_array(p)}:{}),n[u]=d,k.label=4;case 4:return r=!0,[3,2];case 5:return[3,8];case 6:return b=k.sent(),o=!0,a=b,[3,8];case 7:try{r||null==s.return||s.return()}finally{if(o)throw a}return[7];case 8:Object.assign(e.sources,n),v=!0,_=!1,g=void 0,k.label=9;case 9:k.trys.push([9,14,15,16]),y=function(){var t,n,r,o;return _ts_generator(this,function(a){switch(a.label){case 0:return t=m.value,n=e.sources[t],r=!1,n.init?[4,C(n.init.bind(n),function(n){if(_instanceof(n,Et))throw n;r=!0,e.status.failed++,e.logger.scope("source").error("source init failed",{sourceId:t,error:n})})()]:[3,2];case 1:a.sent(),a.label=2;case 2:return r?[3,5]:(n.config.init=!0,(o=ee(n))?[4,Q(e,n,t)]:[3,4]);case 3:o=a.sent(),a.label=4;case 4:a.label=5;case 5:return[2]}})},h=Object.keys(n)[Symbol.iterator](),k.label=10;case 10:return(v=(m=h.next()).done)?[3,13]:[5,_ts_values(y())];case 11:k.sent(),k.label=12;case 12:return v=!0,[3,10];case 13:return[3,16];case 14:return b=k.sent(),_=!0,g=b,[3,16];case 15:try{v||null==h.return||h.return()}finally{if(_)throw g}return[7];case 16:return[2,n]}})}).apply(this,arguments)},re=function(e,t,n,r){if(_instanceof(n,Et))throw n;e.logger.scope("on").error("on callback failed",_object_spread_props(_object_spread({kind:t},r),{error:n}))},oe=function(e){return e===Ut.Commands.Consent||e===Ut.Commands.User||e===Ut.Commands.Globals||e===Ut.Commands.Custom},ae=function(e,t){e.delivery.set(t,e.stateVersion)},se=function(e,t){return e.allowed&&e.stateVersion>(n=t,void 0===(r=e.delivery.get(n))?-1:r);var n,r},ie=function(e,t,n){var r=e.cascade;if(!r)return!0;var o=r.counts.get(t);o||(o={},r.counts.set(t,o));var a=String(n),s=(o[a]||0)+1;return o[a]=s,s<=8||(9===s&&e.logger.error("state delivery did not converge",{type:a}),!1)},ce=function(e,t){return{collector:e,logger:e.logger.scope("on").scope(String(t))}},ue=function(e,t,n){return _async_to_generator(function(){var r,o,a;return _ts_generator(this,function(s){return r=e.on,o=r[t]||[],(a=d(n)?n:[n]).forEach(function(e){o.push(e)}),r[t]=o,fe(e,t,a),[2]})})()},le=function(e,t,n,r,o){if(t.on){var a=t.type||"unknown",s=e.logger.scope(a).scope("on").scope(r),i={collector:e,logger:s,id:n,config:t.config,data:o,env:Ie(t.env,t.config.env)};x(t.on,function(t){return re(e,"destination",t,{destId:n,type:r})})(r,i)}},fe=function(e,t,n,r){var o;switch(t){case Ut.Commands.Consent:o=r||e.consent;break;case Ut.Commands.Session:o=e.session;break;case Ut.Commands.User:o=r||e.user;break;case Ut.Commands.Custom:o=r||e.custom;break;case Ut.Commands.Globals:o=r||e.globals;break;case Ut.Commands.Config:o=r||e.config;break;case Ut.Commands.Ready:case Ut.Commands.Run:default:o=void 0}if(n.length)switch(t){case Ut.Commands.Consent:!function(e,t,n){var r=n||e.consent,o=ce(e,Ut.Commands.Consent);t.forEach(function(t){se(e,t)&&ie(e,t,Ut.Commands.Consent)&&(Object.keys(r).filter(function(e){return e in t}).forEach(function(n){x(t[n],function(t){return re(e,"consent",t,{key:n})})(r,o)}),ae(e,t))})}(e,n,r);break;case Ut.Commands.Ready:!function(e,t){if(e.allowed){var n=ce(e,Ut.Commands.Ready);t.forEach(function(t){x(t,function(t){return re(e,"ready",t)})(void 0,n)})}}(e,n);break;case Ut.Commands.Run:!function(e,t){if(e.allowed){var n=ce(e,Ut.Commands.Run);t.forEach(function(t){x(t,function(t){return re(e,"run",t)})(void 0,n)})}}(e,n);break;case Ut.Commands.Session:!function(e,t){if(e.session){var n=ce(e,Ut.Commands.Session);t.forEach(function(t){x(t,function(t){return re(e,"session",t)})(e.session,n)})}}(e,n);break;default:var a=ce(e,t),s=oe(t);n.forEach(function(n){"function"==typeof n&&(s&&!se(e,n)||s&&!ie(e,n,t)||(x(n,function(n){return re(e,"generic",n,{type:t})})(o,a),s&&ae(e,n)))})}},de=function(e,t,n,r,o){return _async_to_generator(function(){var a;return _ts_generator(this,function(s){switch(s.label){case 0:return t.on?oe(r)&&!se(e,t)||oe(r)&&!ie(e,t,r)?[2,!1]:[4,C(t.on,function(t){return re(e,"source",t,{sourceId:n,type:r})})(r,o)]:[2,!1];case 1:return a=s.sent(),[2,(oe(r)&&ae(e,t),!1===a)]}})})()},pe=function(e){return _async_to_generator(function(){var t,n,r,o,a,s,i,c,u,l,f,d,p,v,_,g,y,h;return _ts_generator(this,function(m){switch(m.label){case 0:t=[{type:Ut.Commands.Consent,nonEmpty:Object.keys(e.consent).length>0},{type:Ut.Commands.User,nonEmpty:Object.keys(e.user).length>0},{type:Ut.Commands.Globals,nonEmpty:Object.keys(e.globals).length>0},{type:Ut.Commands.Custom,nonEmpty:Object.keys(e.custom).length>0}],n=!0,r=!1,o=void 0,m.label=1;case 1:m.trys.push([1,13,14,15]),a=t[Symbol.iterator](),m.label=2;case 2:if(n=(s=a.next()).done)return[3,12];if(i=s.value,c=i.type,!i.nonEmpty)return[3,11];u=function(e,t,n){switch(t){case Ut.Commands.Consent:return n||e.consent;case Ut.Commands.Session:return e.session;case Ut.Commands.User:return n||e.user;case Ut.Commands.Custom:return n||e.custom;case Ut.Commands.Globals:return n||e.globals;case Ut.Commands.Config:return n||e.config;default:return}}(e,c),fe(e,c,e.on[c]||[]),l=!0,f=!1,d=void 0,m.label=3;case 3:m.trys.push([3,9,10,11]),p=Object.entries(e.sources)[Symbol.iterator](),m.label=4;case 4:return(l=(v=p.next()).done)?[3,8]:(_=_sliced_to_array(v.value,2),g=_[0],y=_[1],ee(y)?[4,de(e,y,g,c,u)]:[3,6]);case 5:m.sent(),m.label=6;case 6:m.label=7;case 7:return l=!0,[3,4];case 8:return[3,11];case 9:return h=m.sent(),f=!0,d=h,[3,11];case 10:try{l||null==p.return||p.return()}finally{if(f)throw d}return[7];case 11:return n=!0,[3,2];case 12:return[3,15];case 13:return h=m.sent(),r=!0,o=h,[3,15];case 14:try{n||null==a.return||a.return()}finally{if(r)throw o}return[7];case 15:return[2]}})})()},ve=function(e,t,n,r){return _async_to_generator(function(){var o,a,s,i,c,u,l,f,d,p,v,_,g,y,h,m,b,w,k,j,S,x,C;return _ts_generator(this,function(O){switch(O.label){case 0:switch(s=n||[],n||(s=e.on[t]||[]),t){case Ut.Commands.Consent:a=r||e.consent;break;case Ut.Commands.Session:a=e.session;break;case Ut.Commands.User:a=r||e.user;break;case Ut.Commands.Custom:a=r||e.custom;break;case Ut.Commands.Globals:a=r||e.globals;break;case Ut.Commands.Config:a=r||e.config;break;case Ut.Commands.Ready:case Ut.Commands.Run:default:a=void 0}i=!1,c=!0,u=!1,l=void 0,O.label=1;case 1:O.trys.push([1,7,8,9]),f=Object.entries(e.sources)[Symbol.iterator](),O.label=2;case 2:return(c=(d=f.next()).done)?[3,6]:(p=_sliced_to_array(d.value,2),v=p[0],_=p[1],(null===(g=_.config.require)||void 0===g?void 0:g.length)&&-1!==(y=_.config.require.indexOf(t))&&_.config.require.splice(y,1),_.on?ee(_)?[4,de(e,_,v,t,a)]:[3,4]:[3,5]);case 3:return O.sent()&&(i=!0),[3,5];case 4:_.queueOn=_.queueOn||[],_.queueOn.push({type:t,data:a}),O.label=5;case 5:return c=!0,[3,2];case 6:return[3,9];case 7:return C=O.sent(),u=!0,l=C,[3,9];case 8:try{c||null==f.return||f.return()}finally{if(u)throw l}return[7];case 9:Object.entries(e.destinations).forEach(function(n){var r=_sliced_to_array(n,2),o=r[0],s=r[1];if(s.on){if(!s.config.init)return s.queueOn=s.queueOn||[],void s.queueOn.push({type:t,data:a});le(e,s,o,t,a)}}),h=!0,m=!1,b=void 0,O.label=10;case 10:O.trys.push([10,16,17,18]),w=Object.entries(e.sources)[Symbol.iterator](),O.label=11;case 11:return(h=(k=w.next()).done)?[3,15]:(j=_sliced_to_array(k.value,2),S=j[0],x=j[1],ee(x)&&(null===(o=x.queueOn)||void 0===o?void 0:o.length)?[4,Q(e,x,S)]:[3,13]);case 12:O.sent(),O.label=13;case 13:O.label=14;case 14:return h=!0,[3,11];case 15:return[3,18];case 16:return C=O.sent(),m=!0,b=C,[3,18];case 17:try{h||null==w.return||w.return()}finally{if(m)throw b}return[7];case 18:return Object.keys(e.pending.destinations).length>0?[4,function(e,t){return _async_to_generator(function(){var n,r,o,a,s,i,c,u,l,f,d,p;return _ts_generator(this,function(v){n=!0,r=!1,o=void 0;try{for(a=Object.entries(e.pending.destinations)[Symbol.iterator]();!(n=(s=a.next()).done);n=!0)i=_sliced_to_array(s.value,2),c=i[0],u=i[1],e.pending.destinations[c]&&!e.destinations[c]&&(f=null===(l=u.config)||void 0===l?void 0:l.require)&&-1!==(d=f.indexOf(t))&&(f.splice(d,1),f.length>0||(delete e.pending.destinations[c],!1!==(p=Ee(u)).config.queue&&(p.queuePush=_to_consumable_array(e.queue)),e.destinations[c]=p))}catch(e){r=!0,o=e}finally{try{n||null==a.return||a.return()}finally{if(r)throw o}}return[2]})})()}(e,t)]:[3,20];case 19:O.sent(),O.label=20;case 20:return[2,(fe(e,t,s,r),!i)]}})})()},_e=function(e,t,n,r){var o;if(!Number.isFinite(n.max)||n.max<=0)throw new Error("pushBounded: max must be > 0 (got ".concat(n.max,")"));if("dropNewest"===(null!==(o=n.onOverflow)&&void 0!==o?o:"dropOldest"))return e.length>=n.max?(r&&r([t]),{appended:!1,dropped:1}):(e.push(t),{appended:!0,dropped:0});for(var a=[];e.length>=n.max;)a.push(e.shift());return e.push(t),a.length>0&&r&&r(a),{appended:!0,dropped:a.length}},ge=function(e,t,n,r){Lt.get(e)||(Lt.set(e,!0),t.warn(n,r))},ye=function(e){Lt.delete(e)},he=function(e){return e===Kt},me=function(e){return void 0===e?{}:"number"==typeof e?{wait:e}:{wait:e.wait,size:e.size,age:e.age}},be=function(e,t){return e.status.destinations[t]||(e.status.destinations[t]={count:0,failed:0,duration:0,queuePushSize:0,dlqSize:0}),e.status.destinations[t]},we=function(e,t,n,r){var o;e.dropped[t]||(e.dropped[t]={});var a=e.dropped[t];return a[n]=(null!==(o=a[n])&&void 0!==o?o:0)+r,a[n]},ke=function(e,t,n){if(!e)return[];if(Array.isArray(e)&&e.every(function(e){return"string"==typeof e}))return W(e,t);if("string"==typeof e)return W(e,t);var r=M(e,T(n));return 0===r.length?[]:1===r.length?W(r[0],t):W(r,t)},je=function(e,t){return _async_to_generator(function(){var n,r,o,a,s,i,c,u,l,f,d,p,_;return _ts_generator(this,function(g){if(n=t.code,r=t.config,o=void 0===r?{}:r,a=t.env,s=void 0===a?{}:a,i=t.before,c=t.next,u=t.cache,l=t.state,!v(n.push))return[2,Oe({ok:!1,failed:{invalid:{type:"invalid",error:"Destination code must have a push method"}}})];if(f=o||{init:!1},d=i?_object_spread_props(_object_spread({},f),{before:i}):_object_spread({},f),c&&(d=_object_spread_props(_object_spread({},d),{next:c})),u&&(d=_object_spread_props(_object_spread({},d),{cache:u})),void 0!==l&&void 0===d.state&&(d=_object_spread_props(_object_spread({},d),{state:l})),p=_object_spread_props(_object_spread({},n),{config:d,env:Ie(n.env,s)}),!(_=p.config.id))do{_=b(5,"abcdefghijklmnopqrstuvwxyz")}while(e.destinations[_]);return[2,(e.destinations[_]=p,!1!==p.config.queue&&(p.queuePush=_to_consumable_array(e.queue)),Se(e,void 0,{},_define_property({},_,p)))]})})()},Se=function(e,t,n){return _async_to_generator(function(e,t){var n,r,o,s,i,c,u,d,p,v,_,g,y,h,b,w,k,j,S,x,O,E,A,I,D,P,M,G,F,W,Y,$,J=arguments;return _ts_generator(this,function(X){switch(X.label){case 0:if(n=J.length>2&&void 0!==J[2]?J[2]:{},r=J.length>3?J[3]:void 0,o=e.allowed,s=e.consent,i=e.globals,c=e.user,!o)return[2,Oe({ok:!1})];if(t){if(void 0===(u=e.config.queueMax))throw new Error("Collector.Config.queueMax is undefined; defaults must be seeded by collector()");(d=_e(e.queue,t,{max:u})).dropped>0?(p=we(e.status,a("collector"),"queue",d.dropped),ge(e.queue,e.logger,"collector.queue overflow; oldest events dropped",{buffer:"queue",cap:u,droppedCount:p})):e.queue.length<u&&ye(e.queue),e.status.in++}return r||(r=e.destinations),v=e.transformers?H(e.transformers):{},[4,Promise.all(Object.entries(r||{}).map(function(r){var o=_sliced_to_array(r,2),u=o[0],d=o[1];return _async_to_generator(function(){var r,o,p,_,g,y,h,b,w,k,j,S,x,O,E,A,I,D,P,M,G,H,F,W,Y,$,J,X,Z,Q,ee,te,ne,re,oe,ae,se,ie;return _ts_generator(this,function(ce){switch(ce.label){case 0:if(d.config.disabled)return[2,{id:u,destination:d,skipped:!0}];if(g=(d.queuePush||[]).map(function(e){return _object_spread_props(_object_spread({},e),{consent:s})}),d.queuePush=[],t&&g.push(kt(t)),y=n.ingest?_object_spread_props(_object_spread({},n.ingest),{_meta:_object_spread_props(_object_spread({},n.ingest._meta),{path:_to_consumable_array(n.ingest._meta.path)})}):l("unknown"),!g.length&&!(null===(r=d.queueOn)||void 0===r?void 0:r.length))return[2,{id:u,destination:d,skipped:!0}];if(g.length||!(null===(o=d.queueOn)||void 0===o?void 0:o.length))return[3,5];h=!1,ce.label=1;case 1:return ce.trys.push([1,3,,4]),[4,xe(e,d,u)];case 2:return h=ce.sent(),[3,4];case 3:return b=ce.sent(),e.status.failed++,w=d.type||"unknown",e.logger.scope(w).error("destination init failed",{error:_instanceof(b,Error)?b.message:String(b)}),[3,4];case 4:return[2,{id:u,destination:d,skipped:!h}];case 5:if(k=[],j=g.filter(function(t){var n=m(d.config.consent,s,t.consent);if(n)return t.consent=n,k.push(t),!1;var r=K(e,{stepId:a("destination",u),stepType:"destination",phase:"skip",eventId:"string"==typeof t.id?t.id:"",now:Date.now()});return r.skipReason="consent",s&&(r.consent=_object_spread({},s)),d.config.consent&&(r.meta={required:_object_spread({},d.config.consent)}),q(e,r),!0}),j.length>0){x=d.queuePush,O=d.config.id||u,E={max:null!==(S=d.config.queueMax)&&void 0!==S?S:1e3},A=0,I=!0,D=!1,P=void 0;try{for(M=j[Symbol.iterator]();!(I=(G=M.next()).done);I=!0)H=G.value,A+=_e(x,H,E).dropped}catch(e){D=!0,P=e}finally{try{I||null==M.return||M.return()}finally{if(D)throw P}}A>0?(be(e,O),F=we(e.status,a("destination",O),"queue",A),ge(x,e.logger.scope(d.type||"unknown"),"destination.queuePush overflow; oldest events dropped",{buffer:"queuePush",destination:O,cap:E.max,droppedCount:F})):x.length<E.max&&ye(x)}if(!k.length)return[2,{id:u,destination:d,queue:g}];$=!1,ce.label=6;case 6:return ce.trys.push([6,8,,9]),[4,xe(e,d,u)];case 7:return $=ce.sent(),[3,9];case 8:return J=ce.sent(),e.status.failed++,X=d.type||"unknown",e.logger.scope(X).error("destination init failed",{error:_instanceof(J,Error)?J.message:String(J)}),[3,9];case 9:return $?(d.dlq||(d.dlq=[]),Z=ke(d.config.before,v,y),Q=d.config.next,ee=null===(p=d.config)||void 0===p?void 0:p.cache,te=ee?N(ee):void 0,ne=te?V(te,e):void 0,re=(null===(_=d.config)||void 0===_?void 0:_.state)?z(d.config.state):void 0,oe=null==re?void 0:re.filter(function(e){return"get"===e.mode}),ae=null==re?void 0:re.filter(function(e){return"set"===e.mode}),se=0,ie=0,[4,Promise.all(k.map(function(t){return _async_to_generator(function(){var r,o,s,l,p,_,g,h,m,b,w,k,j;return _ts_generator(this,function(S){switch(S.label){case 0:return t.globals=f(i,t.globals),t.user=f(c,t.user),(null==te?void 0:te.stop)&&ne?(o=T(y,t),[4,R(te,ne,o)]):[3,2];case 1:if("HIT"===(null==(s=S.sent())?void 0:s.status))return[2,t];"MISS"===(null==s?void 0:s.status)&&(r={key:s.key,ttl:s.rule.ttl}),S.label=2;case 2:return l=t,p=n.respond,Z.length>0&&e.transformers&&Object.keys(e.transformers).length>0?[4,Gt(e,e.transformers,Z,t,y,n.respond,"destination.".concat(u,".before"))]:[3,4];case 3:if(null===(_=S.sent()).event)return[2,t];_.respond&&(p=_.respond),l=Array.isArray(_.event)?_.event[0]:_.event,S.label=4;case 4:return te&&!te.stop&&ne?(g=T(y,l),[4,R(te,ne,g)]):[3,6];case 5:if("HIT"===(null==(h=S.sent())?void 0:h.status))return[2,t];"MISS"===(null==h?void 0:h.status)&&(r={key:h.key,ttl:h.rule.ttl}),S.label=6;case 6:return oe&&oe.length>0&&l?[4,L(oe,function(t){return B(t,e)},l,e)]:[3,8];case 7:l=S.sent(),S.label=8;case 8:return m=Date.now(),b=!1,[4,C(Ce,function(t){var n,r=d.type||"unknown";e.logger.scope(r).error("Push failed",{error:t,event:l.name}),W=t,b=!0;var o=d.dlq,s=d.config.id||u,i={max:null!==(n=d.config.dlqMax)&&void 0!==n?n:100},c=_e(o,[l,t],i);if(c.dropped>0){be(e,s);var f=we(e.status,a("destination",s),"dlq",c.dropped);ge(o,e.logger.scope(d.type||"unknown"),"destination.dlq overflow; oldest entries dropped",{buffer:"dlq",destination:s,cap:i.max,droppedCount:f})}else o.length<i.max&&ye(o)})(e,d,u,l,y,p)];case 9:return w=S.sent(),se+=Date.now()-m,r&&ne&&void 0===d.config.mock&&U(ne,r.key,null==w||w,r.ttl),!b&&!he(w)&&ae&&ae.length>0&&l?[4,L(ae,function(t){return B(t,e)},l,e)]:[3,11];case 10:l=S.sent(),S.label=11;case 11:return void 0===w||he(w)||(Y=w),he(w)&&ie++,b||!Q?[3,13]:(void 0!==w&&(y._response=w),(k=ke(Q,v,y)).length>0&&e.transformers&&Object.keys(e.transformers).length>0?[4,Gt(e,e.transformers,k,l,y,p,"destination.".concat(u,".next"))]:[3,13]);case 12:(j=S.sent()).respond&&(p=j.respond),S.label=13;case 13:return[2,t]}})})()}))]):[2,{id:u,destination:d,queue:g}];case 10:return[2,(ce.sent(),{id:u,destination:d,error:W,response:Y,totalDuration:se,batchedCount:ie,allowedCount:k.length})]}})})()}))];case 1:_=X.sent(),g={},y={},h={},b=!0,w=!1,k=void 0;try{for(j=_[Symbol.iterator]();!(b=(S=j.next()).done);b=!0)(x=S.value).skipped||(D=x.destination,P={type:D.type||"unknown",data:x.response},be(e,x.id),M=e.status.destinations[x.id],G=Date.now(),M.queuePushSize=null!==(O=null===(A=D.queuePush)||void 0===A?void 0:A.length)&&void 0!==O?O:0,M.dlqSize=null!==(E=null===(I=D.dlq)||void 0===I?void 0:I.length)&&void 0!==E?E:0,x.error?(P.error=x.error,h[x.id]=P,M.failed++,M.lastAt=G,M.duration+=x.totalDuration||0,e.status.failed++):x.queue&&x.queue.length?y[x.id]=P:(Y=null!==(F=x.batchedCount)&&void 0!==F?F:0,$=null!==(W=x.allowedCount)&&void 0!==W?W:0,(Math.max(0,$-Y)>0||0===$)&&(g[x.id]=P,M.count++,M.lastAt=G,M.duration+=x.totalDuration||0,e.status.out++)))}catch(e){w=!0,k=e}finally{try{b||null==j.return||j.return()}finally{if(w)throw k}}return[2,Oe(_object_spread({event:t},Object.keys(g).length&&{done:g},Object.keys(y).length&&{queued:y},Object.keys(h).length&&{failed:h}))]}})}).apply(this,arguments)},xe=function(e,t,n){return _async_to_generator(function(){var r,o,s,i,c,u,l,f,d,p,v,_,g,y,h,m,b,w;return _ts_generator(this,function(k){switch(k.label){case 0:if(!t.init||t.config.init)return[3,5];o=t.type||"unknown",s=e.logger.scope(o),i={collector:e,logger:s,id:n,config:t.config,env:Ie(t.env,t.config.env)},s.debug("init"),c=Date.now(),q(e,K(e,{stepId:a("destination",n),stepType:"destination",phase:"init",eventId:"",now:c})),k.label=1;case 1:return k.trys.push([1,3,,4]),[4,I(t.init,"DestinationInit",e.hooks,e.logger)(i)];case 2:return u=k.sent(),[3,4];case 3:throw l=k.sent(),f=Date.now(),(d=K(e,{stepId:a("destination",n),stepType:"destination",phase:"error",eventId:"",now:f})).durationMs=f-c,d.error=_instanceof(l,Error)?{name:l.name,message:l.message}:{message:String(l)},q(e,d),l;case 4:if(!1===u)return[2,u];if(t.config=_object_spread_props(_object_spread({},u||t.config),{init:!0}),null===(r=t.queueOn)||void 0===r?void 0:r.length){p=t.queueOn,t.queueOn=[],v=!0,_=!1,g=void 0;try{for(y=p[Symbol.iterator]();!(v=(h=y.next()).done);v=!0)m=h.value,b=m.type,w=m.data,le(e,t,n,b,w)}catch(e){_=!0,g=e}finally{try{v||null==y.return||y.return()}finally{if(_)throw g}}}s.debug("init done"),k.label=5;case 5:return[2,!0]}})})()},Ce=function(e,t,n,r,o,s){return _async_to_generator(function(){var i,c,u,l,f,d,v,_,g,y,h,m,b,w,k,j,S,x,O,E,D,P,M,T,N,R,U,G,z,L,V,B,H,F;return _ts_generator(this,function(W){switch(W.label){case 0:return i=t.config,[4,A(r,i,e)];case 1:if((c=W.sent()).ignore)return[2,!1];if(u=t.type||"unknown",l=e.logger.scope(u),f={collector:e,logger:l,id:n,config:i,data:c.data,rule:c.mapping,ingest:o,env:_object_spread({},Ie(t.env,i.env),s?{respond:s}:{})},void 0!==i.mock)return[2,(l.debug("mock",{event:c.event.name}),i.mock)];if(d=c.mapping,v=c.mappingKey||"* *",(null==d?void 0:d.batch)&&t.pushBatch&&void 0===i.mock)return t.batches=t.batches||{},t.batches[v]||(k={key:v,entries:[],events:[],data:[]},j=me(d.batch),S=me(i.batch),x=null!==(g=null!==(y=j.wait)&&void 0!==y?y:S.wait)&&void 0!==g?g:3e4,O=null!==(h=null!==(m=j.size)&&void 0!==m?m:S.size)&&void 0!==h?h:1e3,E=null!==(b=null!==(w=j.age)&&void 0!==w?w:S.age)&&void 0!==b?b:3e4,D=Ie(t.env,i.env),P=function(e){var t,n,r=arguments.length>2&&void 0!==arguments[2]&&arguments[2],o=function(e,t){var n;return"number"==typeof e?{wait:e}:e?{wait:null!==(n=e.wait)&&void 0!==n?n:t,size:e.size,age:e.age}:{wait:t}}(arguments.length>1&&void 0!==arguments[1]?arguments[1]:1e3,1e3),a=o.wait,s=o.size,i=o.age,c=null,u=null,l=!1,f=[],d=0,p=function(){c&&(clearTimeout(c),c=null),u&&(clearTimeout(u),u=null),d=0,n=void 0},v=function(){var r=n,o=f;if(p(),f=[],r)return t=e.apply(void 0,_to_consumable_array(r)),o.forEach(function(e){return e(t)}),t;o.forEach(function(e){return e(void 0)})},_=function(){for(var o=arguments.length,p=new Array(o),_=0;_<o;_++)p[_]=arguments[_];return new Promise(function(o){var _=r&&!l;if(n=p,d+=1,f.push(o),c&&clearTimeout(c),c=setTimeout(function(){c=null,r&&!l||v()},a),void 0===i||u||(u=setTimeout(function(){u=null,v()},i)),void 0!==s&&d>=s)v();else if(_){l=!0,t=e.apply(void 0,_to_consumable_array(p));var g=f;f=[],g.forEach(function(e){return e(t)})}})};return _.flush=function(){return n||0!==f.length?new Promise(function(e){f.push(e),v()}):Promise.resolve(void 0)},_.cancel=function(){var e=f;f=[],p(),e.forEach(function(e){return e(void 0)})},_.size=function(){return d},_}(function(){return _async_to_generator(function(){var r,o,s,c,u,f,d,p,_,g;return _ts_generator(this,function(y){switch(y.label){case 0:return 0===(o=t.batches[v].batched).entries.length?[2]:(s={key:o.key,entries:o.entries,events:o.events,data:o.data},o.entries=[],o.events=[],o.data=[],c=s.entries[0],u={collector:e,logger:l,id:n,config:i,data:void 0,rule:c.rule,ingest:c.ingest,env:_object_spread({},D,c.respond?{respond:c.respond}:{})},l.debug("push batch",{events:s.entries.length}),f=t.config.id||n,d=be(e,f),p=Date.now(),(_=K(e,{stepId:a("destination",n),stepType:"destination",phase:"flush",eventId:"",now:p})).batch={size:s.entries.length,index:0},q(e,_),g=!0,[4,C(I(t.pushBatch,"DestinationPushBatch",e.hooks,e.logger),function(r){var o;g=!1;var i=Date.now(),c=K(e,{stepId:a("destination",n),stepType:"destination",phase:"error",eventId:"",now:i});c.durationMs=i-p,c.error=_instanceof(r,Error)?{name:r.name,message:r.message}:{message:String(r)},c.batch={size:s.entries.length,index:0},q(e,c);var u=t.dlq=t.dlq||[],v={max:null!==(o=t.config.dlqMax)&&void 0!==o?o:100},_=0,y=!0,h=!1,m=void 0;try{for(var b,w=s.entries[Symbol.iterator]();!(y=(b=w.next()).done);y=!0){var k=b.value;_+=_e(u,[k.event,r],v).dropped}}catch(e){h=!0,m=e}finally{try{y||null==w.return||w.return()}finally{if(h)throw m}}if(_>0){var j=we(e.status,a("destination",f),"dlq",_);ge(u,l,"destination.dlq overflow; oldest entries dropped",{buffer:"dlq",destination:f,cap:v.max,droppedCount:j})}else u.length<v.max&&ye(u);d.failed+=s.entries.length,d.dlqSize=u.length,e.status.failed+=s.entries.length,l.error("Push batch failed",{error:_instanceof(r,Error)?r.message:String(r),entries:s.entries.length})})(s,u)]);case 1:return y.sent(),l.debug("push batch done"),d.inFlightBatch=Math.max(0,(null!==(r=d.inFlightBatch)&&void 0!==r?r:0)-s.entries.length),g&&(d.count+=s.entries.length,d.lastAt=Date.now(),e.status.out+=s.entries.length),[2]}})})()},{wait:x,size:O,age:E}),t.batches[v]={batched:k,batchFn:function(){P()},flush:function(){return _async_to_generator(function(){return _ts_generator(this,function(e){switch(e.label){case 0:return[4,P.flush()];case 1:return e.sent(),[2]}})})()}}),(M=t.batches[v]).batched.entries.push({event:c.event,ingest:o,respond:s,rule:d,data:c.data}),M.batched.events.push(c.event),p(c.data)&&M.batched.data.push(c.data),T=t.config.id||n,[2,((N=be(e,T)).inFlightBatch=(null!==(_=N.inFlightBatch)&&void 0!==_?_:0)+1,M.batchFn(),Kt)];l.debug("push",{event:c.event.name}),R="string"==typeof c.event.id?c.event.id:"",U=Date.now(),G=K(e,{stepId:a("destination",n),stepType:"destination",phase:"in",eventId:R,now:U}),c.mappingKey&&(G.mappingKey=c.mappingKey),c.event.consent&&(G.consent=_object_spread({},c.event.consent)),q(e,G),W.label=2;case 2:return W.trys.push([2,4,,5]),[4,I(t.push,"DestinationPush",e.hooks,e.logger)(c.event,f)];case 3:return z=W.sent(),L=Date.now(),[2,((V=K(e,{stepId:a("destination",n),stepType:"destination",phase:"out",eventId:R,now:L})).durationMs=L-U,V.outEvent=z,c.mappingKey&&(V.mappingKey=c.mappingKey),q(e,V),l.debug("push done"),z)];case 4:throw B=W.sent(),H=Date.now(),(F=K(e,{stepId:a("destination",n),stepType:"destination",phase:"error",eventId:R,now:H})).durationMs=H-U,F.error=_instanceof(B,Error)?{name:B.name,message:B.message}:{message:String(B)},c.mappingKey&&(F.mappingKey=c.mappingKey),q(e,F),B;case 5:return[2]}})})()},Oe=function(e){return _object_spread({ok:!(null==e?void 0:e.failed)},e)},Ee=function(e){var t=e.code,n=e.config,r=void 0===n?{}:n,o=e.env,a=void 0===o?{}:o,s=e.cache,i=e.state,c=F(e,"before").config,u=F(_object_spread_props(_object_spread({},e),{config:c}),"next").config,l=_object_spread({},t.config,r,u);s&&(l.cache=s),void 0!==i&&void 0===l.state&&(l.state=i);var f=Ie(t.env,a);return _object_spread_props(_object_spread({},t),{config:l,env:f})},Ae=function(e){return _async_to_generator(function(e){var t,n,r,o,a,s,i,c,u,l,f,d,p=arguments;return _ts_generator(this,function(v){t=p.length>1&&void 0!==p[1]?p[1]:{},o={},a=!0,s=!1,i=void 0;try{for(c=Object.entries(t)[Symbol.iterator]();!(a=(u=c.next()).done);a=!0)l=_sliced_to_array(u.value,2),f=l[0],d=l[1],(null===(r=d.config)||void 0===r||null===(n=r.require)||void 0===n?void 0:n.length)?e.pending.destinations[f]=d:o[f]=Ee(d)}catch(e){s=!0,i=e}finally{try{a||null==c.return||c.return()}finally{if(s)throw i}}return[2,o]})}).apply(this,arguments)},Ie=function(e,t){return e||t?t?e&&_(e)&&_(t)?_object_spread({},e,t):t:e:{}},qe=function(e,t,n){return _async_to_generator(function(){var r;return _ts_generator(this,function(o){switch(o.label){case 0:return r=Object.entries(e).map(function(e){var r=_sliced_to_array(e,2),o=r[0],a=r[1];return _async_to_generator(function(){var e,r,s,i,c,u;return _ts_generator(this,function(l){switch(l.label){case 0:if(!(r=a.destroy))return[2];s=a.type||"unknown",i=n.scope(s),c={id:o,config:a.config,env:null!==(e=a.env)&&void 0!==e?e:{},logger:i},l.label=1;case 1:return l.trys.push([1,3,,4]),[4,Promise.race([r(c),new Promise(function(e,n){return setTimeout(function(){return n(new Error("".concat(t," '").concat(o,"' destroy timed out")))},5e3)})])];case 2:return l.sent(),[3,4];case 3:return u=l.sent(),i.error("".concat(t," '").concat(o,"' destroy failed: ").concat(u)),[3,4];case 4:return[2]}})})()}),[4,Promise.allSettled(r)];case 1:return o.sent(),[2]}})})()},De=function(e,t,n){return _async_to_generator(function(){var r,o,a,s;return _ts_generator(this,function(i){switch(i.label){case 0:a=!1,s=function(e){return e.cascade?function(){}:(e.cascade={counts:new WeakMap},function(){e.cascade=void 0})}(e),i.label=1;case 1:return i.trys.push([1,,3,4]),[4,_async_to_generator(function(){var s,i,c,u,l,d;return _ts_generator(this,function(p){switch(p.label){case 0:switch(t){case Ut.Commands.Config:return[3,1];case Ut.Commands.Consent:return[3,2];case Ut.Commands.Custom:return[3,3];case Ut.Commands.Destination:return[3,4];case Ut.Commands.Globals:return[3,7];case Ut.Commands.Hook:return[3,8];case Ut.Commands.On:return[3,9];case Ut.Commands.Ready:return[3,12];case Ut.Commands.Run:return[3,13];case Ut.Commands.Session:return[3,15];case Ut.Commands.Shutdown:return[3,16];case Ut.Commands.User:return[3,18]}return[3,19];case 1:return _(n)&&(f(e.config,n,{shallow:!1}),o=n,a=!0),[3,19];case 2:return _(n)&&(s=function(e,t){var n={};return Object.entries(t).forEach(function(e){var t=_sliced_to_array(e,2),r=t[0],o=t[1];n[r]=!!o}),e.consent=f(e.consent,n),{update:n}}(e,n),i=s.update,e.stateVersion++,o=i,a=!0),[3,19];case 3:return _(n)&&(e.custom=f(e.custom,n),e.stateVersion++,o=n,a=!0),[3,19];case 4:return _(n)&&"code"in n&&_(n.code)?[4,je(e,n)]:[3,6];case 5:r=p.sent(),p.label=6;case 6:return[3,19];case 7:return _(n)&&(e.globals=f(e.globals,n),e.stateVersion++,o=n,a=!0),[3,19];case 8:return _(n)&&g(n.name)&&v(n.fn)&&(c=n.name,u=n.fn,e.hooks[c]=u,o=n,a=!0),[3,19];case 9:return _(n)&&g(n.type)?(l=n.type,d=n.rules,[4,ue(e,l,d)]):[3,11];case 10:p.sent(),p.label=11;case 11:return[3,19];case 12:return a=!0,[3,19];case 13:return[4,Me(e,n)];case 14:return r=p.sent(),a=!0,[3,19];case 15:return a=!0,[3,19];case 16:return[4,(y=e,_async_to_generator(function(){var e;return _ts_generator(this,function(t){switch(t.label){case 0:return e=y.logger,[4,qe(y.sources,"source",e)];case 1:return t.sent(),[4,qe(y.destinations,"destination",e)];case 2:return t.sent(),[4,qe(y.transformers,"transformer",e)];case 3:return t.sent(),[4,qe(y.stores,"store",e)];case 4:return t.sent(),[2]}})})())];case 17:return p.sent(),[3,19];case 18:_(n)&&(f(e.user,n,{shallow:!1}),e.stateVersion++,o=n,a=!0),p.label=19;case 19:return a?[4,ve(e,t,void 0,o)]:[3,22];case 20:return p.sent(),[4,Se(e)];case 21:r=p.sent(),p.label=22;case 22:return[2,r||Oe({ok:!0})]}var y})})()];case 2:return[2,i.sent()];case 3:return s(),[7];case 4:return[2]}})})()},Pe=function(e,t){if(!t.name)throw new Error("Event name is required");var n=_sliced_to_array(t.name.split(" "),2),r=n[0],o=n[1];if(!r||!o)throw new Error("Event name is invalid");var a=t.timestamp,s=void 0===a?Date.now():a,i=t.name,c=void 0===i?"".concat(r," ").concat(o):i,u=t.data,l=void 0===u?{}:u,f=t.context,d=void 0===f?{}:f,p=t.globals,v=void 0===p?e.globals:p,_=t.custom,g=void 0===_?{}:_,y=t.user,h=void 0===y?e.user:y,m=t.nested,b=void 0===m?[]:m,w=t.consent,k=void 0===w?e.consent:w,j=t.id,S=void 0===j?function(){for(var e="",t=0;t<16;t++)e+=(16*Math.random()|0).toString(16);return e}():j,x=t.trigger,C=void 0===x?"":x,O=t.entity,E=void 0===O?r:O,A=t.action,I=void 0===A?o:A,q=t.timing,D=void 0===q?0:q,P=t.source;return{name:c,data:l,context:d,globals:v,custom:g,user:h,nested:b,consent:k,id:S,trigger:C,entity:E,action:I,timestamp:s,timing:D,source:void 0===P?{type:"collector",schema:"4"}:P}},Me=function(e,t){return _async_to_generator(function(){return _ts_generator(this,function(n){switch(n.label){case 0:return e.allowed=!0,e.timing=Date.now(),t&&(t.consent&&(e.consent=f(e.consent,t.consent),e.stateVersion++),t.user&&(e.user=f(e.user,t.user),e.stateVersion++),t.globals&&(e.globals=f(e.config.globalsStatic||{},t.globals),e.stateVersion++),t.custom&&(e.custom=f(e.custom,t.custom),e.stateVersion++)),Object.values(e.destinations).forEach(function(e){e.queuePush=[]}),e.queue=[],e.round++,[4,pe(e)];case 1:return n.sent(),[4,Se(e)];case 2:return[2,n.sent()]}})})()},Te=function(){var e,t,n,r,o=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},a=null!==(e=o.maxEntries)&&void 0!==e?e:1e4,s=null!==(t=o.lowWaterMark)&&void 0!==t?t:.8,i=null!==(n=o.sweepIntervalMs)&&void 0!==n?n:6e4,c=Math.floor(a*s),u=new Map,l={hits:0,misses:0,populates:0,writes:0,deletes:0,evictions_entries:0,evictions_ttl:0};return i>0&&((r=setInterval(function(){var e=Date.now(),t=0,n=!0,r=!1,o=void 0;try{for(var a,s=u[Symbol.iterator]();!(n=(a=s.next()).done);n=!0){var i=_sliced_to_array(a.value,2),c=i[0],f=i[1];void 0!==f.expires&&f.expires<=e&&(u.delete(c),t++)}}catch(e){r=!0,o=e}finally{try{n||null==s.return||s.return()}finally{if(r)throw o}}l.evictions_ttl+=t},i))&&"function"==typeof r.unref&&r.unref()),{type:"memory",config:{},get:function(e){var t=u.get(e);if(t)return void 0!==t.expires&&t.expires<=Date.now()?(u.delete(e),l.evictions_ttl++,void l.misses++):(u.delete(e),u.set(e,t),l.hits++,t.value);l.misses++},set:function(e,t,n){var r=!u.has(e);r||u.delete(e),u.set(e,{value:t,expires:void 0!==n?Date.now()+n:void 0}),l.writes++,r&&l.populates++,u.size>a&&function(){if(!(u.size<=a)){var e=u.size-c,t=0,n=!0,r=!1,o=void 0;try{for(var s,i=u.keys()[Symbol.iterator]();!(n=(s=i.next()).done);n=!0){var f=s.value;if(t>=e)break;u.delete(f),t++}}catch(e){r=!0,o=e}finally{try{n||null==i.return||i.return()}finally{if(r)throw o}}l.evictions_entries+=t}}()},delete:function(e){u.delete(e)&&l.deletes++},get counters(){return _object_spread({},l)},destroy:function(){void 0!==r&&(clearInterval(r),r=void 0),u.clear()}}},Ne=function(e,t){var n=t.cacheConfig,r=t.cacheStore,o=t.namespace,a=t.logger,s=t.storeId,i=t.collector,c=function(e,t){if(i){var n=K(i,{stepId:"store.".concat(s),stepType:"store",phase:"in",eventId:"",now:Date.now()});n.meta={op:"cache",cached:"hit"===t,status:t,key:e},q(i,n)}},u={hits:0,misses:0,populates:0,writes:0,deletes:0,inflight_dedups:0},l=n.rules.map(function(e){return{match:e.match?It(e.match):function(){return!0},ttl:e.ttl}}),f=function(e){return"".concat(o,":").concat(e)};function d(e,t){var n=void 0===t?{key:e}:{key:e,value:t};return l.find(function(e){return e.match(n)})}var p=new Map;return{type:e.type,config:e.config,setup:e.setup,get counters(){return _object_spread({},u)},get:function(t){return _async_to_generator(function(){var n,o,a,s;return _ts_generator(this,function(i){switch(i.label){case 0:return n=f(t),[4,r.get(n)];case 1:return void 0!==(o=i.sent())?[2,(u.hits++,c(t,"hit"),o)]:(a=p.get(n))?[2,(u.inflight_dedups++,c(t,"hit"),a)]:(u.misses++,c(t,"miss"),s=_async_to_generator(function(){var o,a,s;return _ts_generator(this,function(i){switch(i.label){case 0:return i.trys.push([0,,6,7]),[4,e.get(t)];case 1:if(void 0===(o=i.sent()))return[2];if(!(a=d(t,o)))return[3,5];i.label=2;case 2:return i.trys.push([2,4,,5]),[4,r.set(n,o,1e3*a.ttl)];case 3:return i.sent(),u.populates++,[3,5];case 4:return s=i.sent(),v("set",t,s),[3,5];case 5:return[2,o];case 6:return p.delete(n),[7];case 7:return[2]}})})(),[2,(p.set(n,s),s)])}})})()},set:function(t,n,o){return _async_to_generator(function(){var a,s;return _ts_generator(this,function(i){switch(i.label){case 0:return u.writes++,[4,e.set(t,n,o)];case 1:if(i.sent(),!(a=d(t,n)))return[3,5];i.label=2;case 2:return i.trys.push([2,4,,5]),[4,r.set(f(t),n,1e3*a.ttl)];case 3:return i.sent(),[3,5];case 4:return s=i.sent(),v("set",t,s),[3,5];case 5:return[2]}})})()},delete:function(t){return _async_to_generator(function(){var n;return _ts_generator(this,function(o){switch(o.label){case 0:return u.deletes++,[4,e.delete(t)];case 1:o.sent(),o.label=2;case 2:return o.trys.push([2,4,,5]),[4,r.delete(f(t))];case 3:return o.sent(),[3,5];case 4:return n=o.sent(),v("delete",t,n),[3,5];case 5:return[2]}})})()}};function v(e,t,n){var r="store-cache(".concat(s,"): cache ").concat(e,' failed for "').concat(t,'"; backing succeeded, continuing');a?a.warn(r,{error:n}):console.warn(r,n)}},Re=function(e,t,n){var r="store.".concat(n),o=I(t.get,"StoreGet",e.hooks,e.logger),a=I(t.set,"StoreSet",e.hooks,e.logger),s=I(t.delete,"StoreDelete",e.hooks,e.logger);t.get=function(t){return _async_to_generator(function(){var n,a,s,i,c,u,l,f;return _ts_generator(this,function(d){switch(d.label){case 0:n=Date.now(),(a=K(e,{stepId:r,stepType:"store",phase:"in",eventId:"",now:n})).meta={op:"get",key:t},q(e,a),d.label=1;case 1:return d.trys.push([1,3,,4]),[4,o(t)];case 2:return s=d.sent(),i=Date.now(),[2,((c=K(e,{stepId:r,stepType:"store",phase:"out",eventId:"",now:i})).durationMs=i-n,c.meta={op:"get",key:t},q(e,c),s)];case 3:throw u=d.sent(),l=Date.now(),(f=K(e,{stepId:r,stepType:"store",phase:"error",eventId:"",now:l})).durationMs=l-n,f.meta={op:"get",key:t},f.error=_instanceof(u,Error)?{name:u.name,message:u.message}:{message:String(u)},q(e,f),u;case 4:return[2]}})})()},t.set=function(t,n,o){return _async_to_generator(function(){var s,i,c,u,l,f,d;return _ts_generator(this,function(p){switch(p.label){case 0:s=Date.now(),(i=K(e,{stepId:r,stepType:"store",phase:"in",eventId:"",now:s})).meta={op:"set",key:t},q(e,i),p.label=1;case 1:return p.trys.push([1,3,,4]),[4,a(t,n,o)];case 2:return p.sent(),c=Date.now(),(u=K(e,{stepId:r,stepType:"store",phase:"out",eventId:"",now:c})).durationMs=c-s,u.meta={op:"set",key:t},q(e,u),[3,4];case 3:throw l=p.sent(),f=Date.now(),(d=K(e,{stepId:r,stepType:"store",phase:"error",eventId:"",now:f})).durationMs=f-s,d.meta={op:"set",key:t},d.error=_instanceof(l,Error)?{name:l.name,message:l.message}:{message:String(l)},q(e,d),l;case 4:return[2]}})})()},t.delete=function(t){return _async_to_generator(function(){var n,o,a,i,c,u,l;return _ts_generator(this,function(f){switch(f.label){case 0:n=Date.now(),(o=K(e,{stepId:r,stepType:"store",phase:"in",eventId:"",now:n})).meta={op:"delete",key:t},q(e,o),f.label=1;case 1:return f.trys.push([1,3,,4]),[4,s(t)];case 2:return f.sent(),a=Date.now(),(i=K(e,{stepId:r,stepType:"store",phase:"out",eventId:"",now:a})).durationMs=a-n,i.meta={op:"delete",key:t},q(e,i),[3,4];case 3:throw c=f.sent(),u=Date.now(),(l=K(e,{stepId:r,stepType:"store",phase:"error",eventId:"",now:u})).durationMs=u-n,l.meta={op:"delete",key:t},l.error=_instanceof(c,Error)?{name:c.name,message:c.message}:{message:String(c)},q(e,l),c;case 4:return[2]}})})()}},Ue=function(e){return _async_to_generator(function(e){var t,n,r,o,a,s,i,c,u,l,f,d,p,v,_,g,y,h,m,b,w,k,j,S,x,C,O,E,A,I,q,D,P,M,T,N,R,U,G,z=arguments;return _ts_generator(this,function(L){switch(L.label){case 0:t=z.length>1&&void 0!==z[1]?z[1]:{},n={},r=!0,o=!1,a=void 0,L.label=1;case 1:L.trys.push([1,6,7,8]),s=Object.entries(t)[Symbol.iterator](),L.label=2;case 2:return(r=(i=s.next()).done)?[3,5]:(c=_sliced_to_array(i.value,2),u=c[0],l=c[1],f=l.code,d=l.config,p=void 0===d?{}:d,v=l.env,_=void 0===v?{}:v,g=e.logger.scope("store").scope(u),[4,f({collector:e,logger:g,id:u,config:p,env:_})]);case 3:y=L.sent(),n[u]=y,L.label=4;case 4:return r=!0,[3,2];case 5:return[3,8];case 6:return h=L.sent(),o=!0,a=h,[3,8];case 7:try{r||null==s.return||s.return()}finally{if(o)throw a}return[7];case 8:b=function(e){var t={},n=!0,r=!1,o=void 0;try{for(var a,s=Object.keys(e)[Symbol.iterator]();!(n=(a=s.next()).done);n=!0){var i=a.value;t[i]="WHITE"}}catch(e){r=!0,o=e}finally{try{n||null==s.return||s.return()}finally{if(r)throw o}}var c=[],u=[];function l(n){var r,o=t[n];if("BLACK"!==o){if("GRAY"===o){var a=u.indexOf(n),s=u.slice(-1===a?0:a).concat(n).join(" -> ");throw new Error("Cycle in cache.store chain: ".concat(s))}t[n]="GRAY",u.push(n);var i=null===(r=e[n].cache)||void 0===r?void 0:r.store;if(void 0!==i){if(!(i in e))throw new Error('Store "'.concat(n,'" cache.store references "').concat(i,'", which is not declared in flow.stores'));l(i)}u.pop(),t[n]="BLACK",c.push(n)}}var f=!0,d=!1,p=void 0;try{for(var v,_=Object.keys(e)[Symbol.iterator]();!(f=(v=_.next()).done);f=!0){var g=v.value;"WHITE"===t[g]&&l(g)}}catch(e){d=!0,p=e}finally{try{f||null==_.return||_.return()}finally{if(d)throw p}}return c}(m=t),w=!0,k=!1,j=void 0;try{for(S=b[Symbol.iterator]();!(w=(x=S.next()).done);w=!0)C=x.value,(E=m[C].cache)&&(A=void 0,I=void 0,void 0!==E.store?(A=n[E.store],I=E.store):(n.__cache||(n.__cache=Te()),A=n.__cache,I="__cache"),q=null!==(O=E.namespace)&&void 0!==O?O:C,e.logger.scope("store-cache").scope(C).info('store "'.concat(C,'" caches with namespace "').concat(q,':" via ').concat(I)),n[C]=Ne(n[C],{storeId:C,cacheConfig:E,cacheStore:A,namespace:q,logger:e.logger.scope("store-cache").scope(C),collector:e}))}catch(e){k=!0,j=e}finally{try{w||null==S.return||S.return()}finally{if(k)throw j}}D=!0,P=!1,M=void 0;try{for(T=Object.entries(n)[Symbol.iterator]();!(D=(N=T.next()).done);D=!0)R=_sliced_to_array(N.value,2),U=R[0],G=R[1],"__cache"!==U&&Re(e,G,U)}catch(e){P=!0,M=e}finally{try{D||null==T.return||T.return()}finally{if(P)throw M}}return[2,n]}})}).apply(this,arguments)},Ge=function(e){return _async_to_generator(function(){var t,n,r,o,a,s,i,c;return _ts_generator(this,function(u){switch(u.label){case 0:return r=f({globalsStatic:{},sessionStatic:{},run:!0,queueMax:1e3},e,{merge:!1,extend:!1}),o={level:null===(t=e.logger)||void 0===t?void 0:t.level,handler:null===(n=e.logger)||void 0===n?void 0:n.handler},a=j(o),s=_object_spread({},r.globalsStatic,e.globals),(i={allowed:!1,config:r,consent:e.consent||{},custom:e.custom||{},destinations:{},transformers:{},stores:{},globals:s,hooks:e.hooks||{},observers:new Set,logger:a,on:{},queue:[],round:0,stateVersion:0,delivery:new WeakMap,session:void 0,status:{startedAt:Date.now(),in:0,out:0,failed:0,sources:{},destinations:{},dropped:{}},timing:Date.now(),user:e.user||{},sources:{},pending:{destinations:{}},push:void 0,command:void 0}).push=function(e,t){var n=I(function(n){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return _async_to_generator(function(){return _ts_generator(this,function(o){switch(o.label){case 0:return[4,C(function(){return _async_to_generator(function(){var o,a,s,i,c,u,f,d,p,v,_,g,y,h,b,w,k,j,S,x,C;return _ts_generator(this,function(O){switch(O.label){case 0:return o=Date.now(),a=r.id,s=r.ingest,i=r.respond,c=r.mapping,u=r.preChain,f=r.include,d=r.exclude,p=i,v=n,_=f||d?function(e,t,n){var r=e;return t&&(r=Object.fromEntries(Object.entries(r).filter(function(e){var n=_sliced_to_array(e,1)[0];return t.includes(n)}))),n&&(r=Object.fromEntries(Object.entries(r).filter(function(e){var t=_sliced_to_array(e,1)[0];return!n.includes(t)}))),r}(e.destinations,f,d):void 0,g=null!=s?s:l(a||"unknown"),c?[4,A(v,c,e)]:[3,2];case 1:if((y=O.sent()).ignore)return[2,Oe({ok:!0})];if(c.consent&&!m(c.consent,e.consent,y.event.consent))return[2,Oe({ok:!0})];v=y.event,O.label=2;case 2:return(null==u?void 0:u.length)&&e.transformers&&Object.keys(e.transformers).length>0?[4,Gt(e,e.transformers,u,v,g,p,a?"source.".concat(a,".next"):void 0)]:[3,6];case 3:return null===(h=O.sent()).event?[2,Oe({ok:!0})]:h.stopped?[2,(h.respond&&(p=h.respond),Oe({ok:!0}))]:(h.respond&&(p=h.respond),Array.isArray(h.event)?[4,Promise.all(h.event.map(function(n){return _async_to_generator(function(){var r,o;return _ts_generator(this,function(s){return r=t(n),o=Pe(e,r),[2,Se(e,o,{id:a,ingest:g,respond:p},_)]})})()}))]:[3,5]);case 4:return w=O.sent(),a&&(e.status.sources[a]||(e.status.sources[a]={count:0,duration:0}),(k=e.status.sources[a]).count+=h.event.length,k.lastAt=Date.now(),k.duration+=Date.now()-o),[2,null!==(b=w[0])&&void 0!==b?b:Oe({ok:!0})];case 5:v=h.event,O.label=6;case 6:return j=t(v),S=Pe(e,j),[4,Se(e,S,{id:a,ingest:g,respond:p},_)];case 7:return x=O.sent(),a&&(e.status.sources[a]||(e.status.sources[a]={count:0,duration:0}),(C=e.status.sources[a]).count++,C.lastAt=Date.now(),C.duration+=Date.now()-o),[2,x]}})})()},function(t){if(_instanceof(t,Et))throw t;return e.status.failed++,e.logger.error("push failed",{event:n,ingest:r.ingest,error:t}),Oe({ok:!1})})()];case 1:return[2,o.sent()]}})})()},"Push",e.hooks,e.logger);return function(t,r){return _async_to_generator(function(){var o,a,s,i,c,u,l,f;return _ts_generator(this,function(d){switch(d.label){case 0:o="string"==typeof t.id?t.id:"",a=Date.now(),q(e,K(e,{stepId:"collector.push",stepType:"collector",phase:"in",eventId:o,now:a})),d.label=1;case 1:return d.trys.push([1,3,,4]),[4,n(t,r)];case 2:return s=d.sent(),i=Date.now(),[2,((c=K(e,{stepId:"collector.push",stepType:"collector",phase:"out",eventId:o,now:i})).durationMs=i-a,c.outEvent=s,q(e,c),s)];case 3:throw u=d.sent(),l=Date.now(),(f=K(e,{stepId:"collector.push",stepType:"collector",phase:"error",eventId:o,now:l})).durationMs=l-a,f.error=_instanceof(u,Error)?{name:u.name,message:u.message}:{message:String(u)},q(e,f),u;case 4:return[2]}})})()}}(i,function(e){return _object_spread({timing:Math.round((Date.now()-i.timing)/10)/100,source:{type:"collector",schema:"4",version:"4.2.0-next-1780387694663"}},e)}),i.command=(p=De,I(function(e,t,n){return _async_to_generator(function(){return _ts_generator(this,function(r){switch(r.label){case 0:return[4,C(function(){return _async_to_generator(function(){return _ts_generator(this,function(r){switch(r.label){case 0:return[4,p(d,e,t,n)];case 1:return[2,r.sent()]}})})()},function(n){if(_instanceof(n,Et))throw n;return d.status.failed++,d.logger.error("command failed",{command:e,data:t,error:n}),Oe({ok:!1})})()];case 1:return[2,r.sent()]}})})()},"Command",(d=i).hooks,d.logger)),c=e.stores||{},[4,Ue(i,c)];case 1:return i.stores=u.sent(),function(e,t,n){var r=new Map,o=!0,a=!1,s=void 0;try{for(var i,c=Object.entries(e)[Symbol.iterator]();!(o=(i=c.next()).done);o=!0){var u=_sliced_to_array(i.value,2),l=u[0],f=u[1];t[l]&&r.set(f,t[l])}}catch(e){a=!0,s=e}finally{try{o||null==c.return||c.return()}finally{if(a)throw s}}if(0!==r.size)for(var d=!0,p=!1,v=void 0,_=0,g=[n.transformers,n.destinations,n.sources];_<g.length;_++){var y=g[_];if(y)try{for(var h,m=Object.values(y)[Symbol.iterator]();!(d=(h=m.next()).done);d=!0){b(h.value.env)}}catch(e){p=!0,v=e}finally{try{d||null==m.return||m.return()}finally{if(p)throw v}}}function b(e){if(e){var t=!0,n=!1,o=void 0;try{for(var a,s=Object.entries(e)[Symbol.iterator]();!(t=(a=s.next()).done);t=!0){var i=_sliced_to_array(a.value,2),c=i[0],u=i[1];if("object"==(void 0===u?"undefined":_type_of(u))&&null!==u){var l=r.get(u);l&&(e[c]=l)}}}catch(e){n=!0,o=e}finally{try{t||null==s.return||s.return()}finally{if(n)throw o}}}}}(c,i.stores,e),i.stores.__cache||(i.stores.__cache=Te()),[4,Ae(i,e.destinations||{})];case 2:return i.destinations=u.sent(),[4,function(e){return _async_to_generator(function(e){var t,n,r,o,a,s,i,c,u,f=arguments;return _ts_generator(this,function(d){switch(d.label){case 0:t=f.length>1&&void 0!==f[1]?f[1]:{},n={},r=!0,o=!1,a=void 0,d.label=1;case 1:d.trys.push([1,6,7,8]),s=function(){var t,r,o,a,s,i,u,f,d,p,v,_,g,y,h,m,b,w,k,j,S,x,C,O,E,I,q,D;return _ts_generator(this,function(P){switch(P.label){case 0:return t=_sliced_to_array(c.value,2),r=t[0],o=t[1],_=o.code,g=o.env,y=void 0===g?{}:g,h=function(e,t){var n,r=(n=t,new Set(_to_consumable_array(Mt[n]).concat(_to_consumable_array(Tt),_to_consumable_array(Nt[n])))),o=!0,a=!1,s=void 0;try{for(var i,c=Object.keys(e)[Symbol.iterator]();!(o=(i=c.next()).done);o=!0){var u=i.value;if(!r.has(u))return{ok:!1,code:"UNKNOWN_KEY",key:u,reason:'Unknown key "'.concat(u,'" on ').concat(t,". Allowed: ").concat(_to_consumable_array(r).sort().join(", "),".")}}}catch(e){a=!0,s=e}finally{try{o||null==c.return||c.return()}finally{if(a)throw s}}var l=void 0!==e.package,f=void 0!==e.import,d=void 0!==e.code;return d&&"string"==typeof e.code?{ok:!1,code:"OBSOLETE_CODE_STRING",key:"code",reason:'code: "<name>" is no longer supported. Use import: "'.concat(e.code,'" with the package field instead.')}:d&&("object"!=_type_of(e.code)&&"function"!=typeof e.code||null===e.code||Array.isArray(e.code))?{ok:!1,code:"INVALID_CODE_SHAPE",key:"code",reason:"code must be an object ({ push, type?, init? }) or a resolved function value."}:d&&l?{ok:!1,code:"CONFLICT",key:"package",reason:"Cannot specify both `code` and `package`. Use one or the other."}:d&&f?{ok:!1,code:"CONFLICT",key:"import",reason:"Cannot specify both `code` and `import`."}:f&&!l?{ok:!1,code:"MISSING_PACKAGE",key:"import",reason:"`import` requires `package` to be set."}:!f||"string"==typeof e.import&&Rt.test(e.import)?{ok:!0}:{ok:!1,code:"INVALID_IMPORT",key:"import",reason:"import must match ".concat(Rt.source,". Got: ").concat(JSON.stringify(e.import),".")}}(o,"Transformer"),h.ok?(m=F(o,"before"),b=m.config,w=F(_object_spread_props(_object_spread({},o),{config:b}),"next"),k=w.config,j=Object.keys(y).length>0?_object_spread_props(_object_spread({},k),{env:y}):k,S=o.cache,x=S?_object_spread_props(_object_spread({},j),{cache:S}):j,C=null!==(a=null===(f=o.config)||void 0===f?void 0:f.state)&&void 0!==a?a:o.state,O=void 0!==C&&void 0===x.state?_object_spread_props(_object_spread({},x),{state:C}):x,E=e.logger.scope("transformer").scope(r),I={collector:e,logger:E,id:r,ingest:l(r),config:O,env:y},q=null!=_?_:function(e){var t=o.mapping;if(t){var n=[];if(void 0!==t.data&&n.push("data"),t.mapping){var a=!0,s=!1,i=void 0,c=!0,u=!1,l=void 0;try{for(var f,d=Object.entries(t.mapping)[Symbol.iterator]();!(c=(f=d.next()).done);c=!0){var p=_sliced_to_array(f.value,2),v=p[0],_=p[1];if("object"==(void 0===_?"undefined":_type_of(_))&&null!==_)try{for(var g,y=Object.entries(_)[Symbol.iterator]();!(a=(g=y.next()).done);a=!0){var h=_sliced_to_array(g.value,2),m=h[0],b=h[1];if("object"==(void 0===b?"undefined":_type_of(b))&&null!==b){var w=b;void 0!==w.data&&n.push("mapping[".concat(v,"][").concat(m,"].data")),void 0!==w.silent&&n.push("mapping[".concat(v,"][").concat(m,"].silent"))}}}catch(e){s=!0,i=e}finally{try{a||null==y.return||y.return()}finally{if(s)throw i}}}}catch(e){u=!0,l=e}finally{try{c||null==d.return||d.return()}finally{if(u)throw l}}}return n.length>0&&e.collector.logger.warn("Transformer ".concat(r,": `").concat(n.join(", "),"` ignored at transformer position (only event-mutating fields apply).")),{type:"pass",config:e.config,push:function(n){return _async_to_generator(function(){var r;return _ts_generator(this,function(o){switch(o.label){case 0:return[4,A(n,t,e.collector)];case 1:return[2,!(r=o.sent()).ignore&&{event:r.event}]}})})()}}}return{type:"pass",config:e.config,push:function(e){return{event:e}}}},[4,q(I)]):(e.logger.warn("Transformer ".concat(r," invalid (").concat(h.code,"): ").concat(h.reason,". Skipping.")),[2,"continue"]);case 1:return D=P.sent(),void 0!==o.before&&void 0===(null===(d=D.config)||void 0===d?void 0:d.before)&&(D.config=_object_spread_props(_object_spread({},null!==(s=D.config)&&void 0!==s?s:{}),{before:o.before})),void 0!==o.next&&void 0===(null===(p=D.config)||void 0===p?void 0:p.next)&&(D.config=_object_spread_props(_object_spread({},null!==(i=D.config)&&void 0!==i?i:{}),{next:o.next})),void 0!==C&&void 0===(null===(v=D.config)||void 0===v?void 0:v.state)&&(D.config=_object_spread_props(_object_spread({},null!==(u=D.config)&&void 0!==u?u:{}),{state:C})),n[r]=D,[2]}})},i=Object.entries(t)[Symbol.iterator](),d.label=2;case 2:return(r=(c=i.next()).done)?[3,5]:[5,_ts_values(s())];case 3:d.sent(),d.label=4;case 4:return r=!0,[3,2];case 5:return[3,8];case 6:return u=d.sent(),o=!0,a=u,[3,8];case 7:try{r||null==i.return||i.return()}finally{if(o)throw a}return[7];case 8:return[2,n]}})}).apply(this,arguments)}(i,e.transformers||{})];case 3:return[2,(i.transformers=u.sent(),i)]}var d,p})})()},ze=function(e){return _async_to_generator(function(){var t,n,r,o,a,s,i,c,u,l;return _ts_generator(this,function(f){switch(f.label){case 0:return[4,Ge(e=e||{})];case 1:return t=f.sent(),r=t,n={type:"elb",config:{},push:function(e,t,n,o,a){return _async_to_generator(function(){var s,i;return _ts_generator(this,function(c){if("string"==typeof e&&e.startsWith("walker "))return s=e.replace("walker ",""),[2,r.command(s,t)];if("string"==typeof e)i={name:e},t&&"object"==(void 0===t?"undefined":_type_of(t))&&!Array.isArray(t)&&(i.data=t);else{if(!e||"object"!=(void 0===e?"undefined":_type_of(e)))return[2,Oe({ok:!1})];i=e,t&&"object"==(void 0===t?"undefined":_type_of(t))&&!Array.isArray(t)&&(i.data=_object_spread({},i.data||{},t))}return[2,(n&&"object"==(void 0===n?"undefined":_type_of(n))&&(i.context=n),o&&Array.isArray(o)&&(i.nested=o),a&&"object"==(void 0===a?"undefined":_type_of(a))&&(i.custom=a),r.push(i))]})})()}},t.sources.elb=n,[4,ne(t,e.sources||{})];case 2:return f.sent(),o=e.consent,a=e.user,s=e.globals,i=e.custom,o?[4,t.command("consent",o)]:[3,4];case 3:f.sent(),f.label=4;case 4:return a?[4,t.command("user",a)]:[3,6];case 5:f.sent(),f.label=6;case 6:return s&&Object.assign(t.globals,s),i&&Object.assign(t.custom,i),t.config.run?[4,t.command("run")]:[3,8];case 7:f.sent(),f.label=8;case 8:return c=n.push,u=Object.values(t.sources).filter(function(e){return"elb"!==e.type}),[2,((l=u.find(function(e){return e.config.primary}))?c=l.push:u.length>0&&(c=u[0].push),{collector:t,elb:c})]}})})()},Le=Object.defineProperty,Ke=Object.getOwnPropertyDescriptor,Ve=Object.getOwnPropertyNames,Be=Object.prototype.hasOwnProperty,He=function(e,t){for(var n in t)Le(e,n,{get:t[n],enumerable:!0})},Fe={};He(Fe,{SourceUsercentrics:function(){return Je},createMockElbFn:function(){return lt},createTrigger:function(){return Vt},default:function(){return Ft},fullConsent:function(){return Xe},fullConsentCustomMapped:function(){return it},fullConsentMapped:function(){return ot},fullConsentUpperCase:function(){return tt},implicitConsent:function(){return et},minimalConsent:function(){return Qe},minimalConsentMapped:function(){return st},nonConsentEvent:function(){return rt},noopLogger:function(){return ft},partialConsent:function(){return Ze},partialConsentMapped:function(){return at},serviceLevelConsent:function(){return nt},serviceLevelMapped:function(){return ct},sourceUsercentrics:function(){return Ht},step:function(){return dt},trigger:function(){return Bt}});var We=["action","event","type","ucCategory"],Ye="UC_UI_CMP_EVENT",$e=new Set(["ACCEPT_ALL","DENY_ALL","SAVE"]),Je={},Xe={event:"consent_status",type:"explicit",action:"onAcceptAllServices",ucCategory:{essential:!0,functional:!0,marketing:!0},"Google Analytics":!0,"Google Ads Remarketing":!0},Ze={event:"consent_status",type:"explicit",action:"onUpdateServices",ucCategory:{essential:!0,functional:!0,marketing:!1},"Google Analytics":!0,"Google Ads Remarketing":!1},Qe={event:"consent_status",type:"explicit",action:"onDenyAllServices",ucCategory:{essential:!0,functional:!1,marketing:!1},"Google Analytics":!1,"Google Ads Remarketing":!1},et={event:"consent_status",type:"implicit",ucCategory:{essential:!0,functional:!1,marketing:!1},"Google Analytics":!1,"Google Ads Remarketing":!1},tt={event:"consent_status",type:"EXPLICIT",action:"onAcceptAllServices",ucCategory:{essential:!0,functional:!0,marketing:!0}},nt={event:"consent_status",type:"explicit",action:"onUpdateServices",ucCategory:{essential:!0,functional:"partial",marketing:"partial"},"Google Analytics":!0,"Google Ads Remarketing":!1,Hotjar:!0},rt={event:"other_event",type:"explicit"},ot={essential:!0,functional:!0,marketing:!0},at={essential:!0,functional:!0,marketing:!1},st={essential:!0,functional:!1,marketing:!1},it={functional:!0,marketing:!0},ct={essential:!0,google_analytics:!0,google_ads_remarketing:!1,hotjar:!0},ut=function(){},lt=function(){return function(){return Promise.resolve({ok:!0})}},ft={error:ut,warn:ut,info:ut,debug:ut,throw:function(e){throw"string"==typeof e?new Error(e):e},json:ut,scope:function(){return ft}},dt={};He(dt,{categoryMapOverride:function(){return _t},customEventName:function(){return gt},fullConsent:function(){return pt},minimalConsent:function(){return vt}});var pt={title:"Full consent",description:"A Usercentrics onAcceptAllServices event emits a walker consent command with essential, functional, and marketing granted.",trigger:{type:"consent"},in:{event:"consent_status",type:"explicit",action:"onAcceptAllServices",ucCategory:{essential:!0,functional:!0,marketing:!0}},out:[["elb","walker consent",{essential:!0,functional:!0,marketing:!0}]]},vt={title:"Minimal consent",description:"A Usercentrics onDenyAllServices event emits a walker consent command with only essential granted.",trigger:{type:"consent"},in:{event:"consent_status",type:"explicit",action:"onDenyAllServices",ucCategory:{essential:!0,functional:!1,marketing:!1}},out:[["elb","walker consent",{essential:!0,functional:!1,marketing:!1}]]},_t={title:"Category map override",description:"Custom categoryMap remaps essential to functional and functional to analytics",trigger:{type:"consent"},in:{event:"consent_status",type:"explicit",ucCategory:{essential:!0,functional:!0,marketing:!1}},mapping:{categoryMap:{essential:"functional",functional:"analytics"}},out:[["elb","walker consent",{functional:!0,analytics:!0,marketing:!1}]]},gt={title:"Custom event name",description:"Using UC_SDK_EVENT instead of ucEvent for Usercentrics SDK v2",trigger:{type:"consent",options:{eventName:"UC_SDK_EVENT"}},in:{event:"consent_status",type:"explicit",ucCategory:{essential:!0,functional:!0,marketing:!0}},mapping:{eventName:"UC_SDK_EVENT"},out:[["elb","walker consent",{essential:!0,functional:!0,marketing:!0}]]},yt=Object.defineProperty,ht=function(e,t){for(var n in t)yt(e,n,{get:t[n],enumerable:!0})};ht({},{stepId:function(){return a}});ht({},{getDestination:function(){return s}});ht({},{Level:function(){return bt}});var mt,bt=((mt=bt||{})[mt.ERROR=0]="ERROR",mt[mt.WARN=1]="WARN",mt[mt.INFO=2]="INFO",mt[mt.DEBUG=3]="DEBUG",mt);ht({},{getTransformer:function(){return i}});ht({},{getSource:function(){return c}});ht({},{getStore:function(){return u}});var wt={merge:!0,shallow:!0,extend:!0};function kt(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:new WeakMap;if("object"!=(void 0===e?"undefined":_type_of(e))||null===e)return e;if(t.has(e))return t.get(e);var n=Object.prototype.toString.call(e);if("[object Object]"===n){var r={};for(var o in t.set(e,r),e)Object.prototype.hasOwnProperty.call(e,o)&&(r[o]=kt(e[o],t));return r}if("[object Array]"===n){var a=[];return t.set(e,a),e.forEach(function(e){a.push(kt(e,t))}),a}if("[object Date]"===n)return new Date(e.getTime());if("[object RegExp]"===n){var s=e;return new RegExp(s.source,s.flags)}return e}function jt(e){for(var t=arguments.length>2?arguments[2]:void 0,n=(arguments.length>1&&void 0!==arguments[1]?arguments[1]:"").split("."),r=e,o=0;o<n.length;o++){var a=n[o];if("*"===a&&d(r)){var s=n.slice(o+1).join("."),i=[],c=!0,u=!1,l=void 0;try{for(var f,v=r[Symbol.iterator]();!(c=(f=v.next()).done);c=!0){var g=jt(f.value,s,t);i.push(g)}}catch(e){u=!0,l=e}finally{try{c||null==v.return||v.return()}finally{if(u)throw l}}return i}if(void 0===(r=_(r)||d(r)?r[a]:void 0))break}return p(r)?r:t}var St={data:function(e){return e.data},globals:function(e){return e.globals},context:function(e){return e.context},user:function(e){return e.user},source:function(e){return e.source},event:function(e){return{entity:e.entity,action:e.action,id:e.id,timestamp:e.timestamp,name:e.name,trigger:e.trigger,timing:e.timing}}},xt=function(e,t,n,r){var o="".concat(bt[e]).concat(r.length>0?" [".concat(r.join(":"),"]"):""),a=Object.keys(n).length>0,s=0===e?console.error:1===e?console.warn:console.log;a?s(o,t,n):s(o,t)};function Ct(e){var t=e.level,n=e.handler,r=e.jsonHandler,o=e.scope,a=function(e,r,a){if(e<=t){var s=k(r,a);n?n(e,s.message,s.context,o,xt):xt(e,s.message,s.context,o)}};return{error:function(e,t){return a(0,e,t)},warn:function(e,t){return a(1,e,t)},info:function(e,t){return a(2,e,t)},debug:function(e,t){return a(3,e,t)},throw:function(e,t){var r=k(e,t);throw n?n(0,r.message,r.context,o,xt):xt(0,r.message,r.context,o),new Error(r.message)},json:function(e){r?r(e):console.log(JSON.stringify(e,null,2))},scope:function(e){return Ct({level:t,handler:n,jsonHandler:r,scope:_to_consumable_array(o).concat([e])})}}}function Ot(e){return function(e){return"boolean"==typeof e}(e)||g(e)||function(e){return"number"==typeof e&&!Number.isNaN(e)}(e)||!p(e)||d(e)&&e.every(Ot)||_(e)&&Object.values(e).every(Ot)}var Et=function(){function e(t,n){var r;return _class_call_check(this,e),(r=_call_super(this,e,[t,n])).name="FatalError",Object.setPrototypeOf(r,e.prototype),r}return _inherits(e,_wrap_native_super(Error)),e}();function At(e,t,n){return _async_to_generator(function(){return _ts_generator(this,function(r){return[2,(d(t)?t:[t]).reduce(function(t,r){return _async_to_generator(function(){var o,a,s,i,c,u,l,f,v,_,y,h,b,w,k,j,x,O,A,I,q,D;return _ts_generator(this,function(P){switch(P.label){case 0:return[4,t];case 1:return(o=P.sent())?[2,o]:(a=g(r)?{key:r}:r,Object.keys(a).length?(s=a.condition,i=a.consent,c=a.fn,u=a.key,l=a.loop,f=a.map,v=a.set,_=a.validate,y=a.value,h=_object_spread_props(_object_spread({},n),{mapping:r}),(b=s)?[4,C(s,function(e){if(_instanceof(e,Et))throw e;return h.logger.error("mapping condition failed",{event:h.event,error:e}),!1})(e,h)]:[3,3]):[2]);case 2:b=!P.sent(),P.label=3;case 3:return b?[2]:i&&!m(i,h.consent)?[2,y]:(w=p(y)?y:e,c?[4,C(c,function(e){if(_instanceof(e,Et))throw e;h.logger.error("mapping fn failed",{event:h.event,error:e})})(e,h)]:[3,5]);case 4:w=P.sent(),P.label=5;case 5:return u&&(w=jt(e,u,y)),l?(k=_sliced_to_array(l,2),j=k[0],x=k[1],"this"!==j?[3,6]:(A=[e],[3,8])):[3,11];case 6:return[4,E(e,j,h)];case 7:A=P.sent(),P.label=8;case 8:return d(O=A)?[4,Promise.all(O.map(function(e){return E(e,x,h)}))]:[3,10];case 9:w=P.sent().filter(p),P.label=10;case 10:return[3,17];case 11:return f?[4,Object.entries(f).reduce(function(t,n){var r=_sliced_to_array(n,2),o=r[0],a=r[1];return _async_to_generator(function(){var n,r;return _ts_generator(this,function(s){switch(s.label){case 0:return[4,t];case 1:return n=s.sent(),[4,E(e,a,h)];case 2:return r=s.sent(),[2,(p(r)&&(n[o]=r),n)]}})})()},Promise.resolve({}))]:[3,13];case 12:return w=P.sent(),[3,16];case 13:return(I=v)?[4,Promise.all(v.map(function(t){return At(e,t,h)}))]:[3,15];case 14:I=w=P.sent(),P.label=15;case 15:P.label=16;case 16:P.label=17;case 17:return(q=_)?[4,C(_,function(e){if(_instanceof(e,Et))throw e;return h.logger.error("mapping validate failed",{event:h.event,error:e}),!1})(w,h)]:[3,19];case 18:q=!P.sent(),P.label=19;case 19:return q&&(w=void 0),D=S(w),[2,p(D)?D:S(y)]}})})()},Promise.resolve(void 0))]})})()}function It(e){if(void 0===e||"*"===e)return function(){return!0};if("and"in e){var t=e.and.map(It);return function(e){return t.every(function(t){return t(e)})}}if("or"in e){var n=e.or.map(It);return function(e){return n.some(function(t){return t(e)})}}return function(e){var t=e.key,n=e.operator,r=e.value,o=e.not,a=function(e,t){switch(e){case"eq":return function(e){return String(null!=e?e:"")===t};case"contains":return function(e){return String(null!=e?e:"").includes(t)};case"prefix":return function(e){return String(null!=e?e:"").startsWith(t)};case"suffix":return function(e){return String(null!=e?e:"").endsWith(t)};case"regex":var n=new RegExp(t);return function(e){return n.test(String(null!=e?e:""))};case"gt":var r=Number(t);return function(e){return Number(e)>r};case"lt":var o=Number(t);return function(e){return Number(e)<o};case"exists":return function(e){return null!=e}}}(n,r);return function(e){var n=jt(e,t),r=a(n);return o?!r:r}}(e)}function qt(e){if(null!=e){if("string"==typeof e)return{type:"static",value:e};if(Array.isArray(e)){if(0===e.length)return;if(D(e))return qt({one:e});if(e.every(function(e){return"string"==typeof e}))return{type:"chain",value:e};var t=[],n=!0,r=!1,o=void 0;try{for(var a,s=e[Symbol.iterator]();!(n=(a=s.next()).done);n=!0){var i=qt(a.value);void 0!==i&&t.push(i)}}catch(e){r=!0,o=e}finally{try{n||null==s.return||s.return()}finally{if(r)throw o}}if(0===t.length)return;return{type:"sequence",value:t}}var c=e;if("next"in c&&void 0!==c.next)return c.match?{type:"gate",match:It(c.match),next:qt(c.next)}:qt(c.next);if("one"in c&&c.one){var u=P(c.one);return c.match?{type:"gate",match:It(c.match),next:{type:"one",routes:u}}:{type:"one",routes:u}}if("many"in c&&c.many){var l=P(c.many);return c.match?{type:"gate",match:It(c.match),next:{type:"many",routes:l}}:{type:"many",routes:l}}return c.match?{type:"gate",match:It(c.match)}:void 0}}var Dt=new WeakMap;function Pt(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(e){if("static"===e.type)return e.value;if("chain"===e.type)return e.value;if("gate"===e.type){if(!e.match(t))return;return Pt(e.next,t)}if("sequence"===e.type){var n=[],r=!0,o=!1,a=void 0;try{for(var s,i=e.value[Symbol.iterator]();!(r=(s=i.next()).done);r=!0){var c,u=Pt(s.value,t);void 0!==u&&(Array.isArray(u)?(c=n).push.apply(c,_to_consumable_array(u)):n.push(u))}}catch(e){o=!0,a=e}finally{try{r||null==i.return||i.return()}finally{if(o)throw a}}return n.length>0?n:void 0}if("many"===e.type){var l=[],f=!0,d=!1,p=void 0;try{for(var v,_=e.routes[Symbol.iterator]();!(f=(v=_.next()).done);f=!0){var g,y=v.value;if(y.match(t)){var h=Pt(y.next,t);void 0!==h&&(Array.isArray(h)?(g=l).push.apply(g,_to_consumable_array(h)):l.push(h))}}}catch(e){d=!0,p=e}finally{try{f||null==_.return||_.return()}finally{if(d)throw p}}return l.length>0?l:void 0}var m=!0,b=!1,w=void 0;try{for(var k,j=e.routes[Symbol.iterator]();!(m=(k=j.next()).done);m=!0){var S=k.value;if(S.match(t))return Pt(S.next,t)}}catch(e){b=!0,w=e}finally{try{m||null==j.return||j.return()}finally{if(b)throw w}}}}var Mt={Source:["code","package","import","before","next","cache","state"],Transformer:["code","package","import","before","next","cache","state","mapping"],Destination:["code","package","import","before","next","cache","state"],Store:["code","package","import","cache"]},Tt=["config","env","validate","variables","examples","disabled","id","logger","mock","chainMocks"],Nt={Source:["primary"],Transformer:[],Destination:[],Store:[]},Rt=/^[A-Za-z_$][A-Za-z0-9_$]*$/,Ut={Commands:{Action:"action",Actions:"actions",Config:"config",Consent:"consent",Context:"context",Custom:"custom",Destination:"destination",Elb:"elb",Globals:"globals",Hook:"hook",Init:"init",Link:"link",On:"on",Prefix:"data-elb",Ready:"ready",Run:"run",Session:"session",Shutdown:"shutdown",User:"user",Walker:"walker"},Utils:{Storage:{Cookie:"cookie",Local:"local",Session:"session"}}};function Gt(e,t,n,r,o,a,s){return _async_to_generator(function(){var i,c,u,f,d,p,v,_,g,y,h;return _ts_generator(this,function(m){switch(m.label){case 0:o||(o=l(null!==(i=n[0])&&void 0!==i?i:"chain")),s&&o._meta&&(o._meta.chainPath=s),c=r,u=a,f=!0,d=!1,p=void 0,m.label=1;case 1:m.trys.push([1,6,7,8]),v=function(){var r,a,i,l,f,d,p,v,_,y,h,m,b,w,k,j,S,x,O,E,A,I,q,D,P,G,K,F,X,Z,Q,ee,te,ne,re,oe,ae,se,ie,ce,ue,le,fe,de,pe,ve,_e,ge,ye,he,me,be;return _ts_generator(this,function(we){switch(we.label){case 0:return r=g.value,(v=t[r])?o&&o._meta&&o._meta.path.length>256?[2,{v:(e.logger.error("Max path length exceeded at ".concat(r)),{event:null,respond:u})}]:(o&&o._meta&&(o._meta.hops++,o._meta.path.push(r)),[4,C(Y,function(t){if(_instanceof(t,Et))throw t;return e.status.failed++,e.logger.scope("transformer:".concat(v.type||"unknown")).error("transformer init failed",{transformer:r,error:t}),!1})(e,v,r)]):(e.logger.warn("Transformer not found: ".concat(r)),[2,"continue"]);case 1:return we.sent()?s&&void 0!==(null===(i=v.config)||void 0===i||null===(a=i.chainMocks)||void 0===a?void 0:a[s])?(_=v.config.chainMocks[s],e.logger.scope("transformer:".concat(v.type||"unknown")).debug("chainMock",{chain:s}),c=_,[2,"continue"]):void 0!==(null===(l=v.config)||void 0===l?void 0:l.mock)?(e.logger.scope("transformer:".concat(v.type||"unknown")).debug("mock"),c=v.config.mock,[2,"continue"]):(null===(f=v.config)||void 0===f?void 0:f.disabled)?[2,"continue"]:(y=null===(d=v.config)||void 0===d?void 0:d.cache,h=y?N(y):void 0,m=h?V(h,e):void 0,b=(null===(p=v.config)||void 0===p?void 0:p.state)?z(v.config.state):void 0,w=null==b?void 0:b.filter(function(e){return"get"===e.mode}),k=null==b?void 0:b.filter(function(e){return"set"===e.mode}),j=function(t){return _async_to_generator(function(){return _ts_generator(this,function(n){return[2,k&&0!==k.length?L(k,function(t){return B(t,e)},t,e):t]})})()},S=void 0,h&&m?(x=T(o,c),[4,R(h,m,x)]):[3,3]):[2,{v:{event:null,respond:u}}];case 2:if("HIT"===(null==(O=we.sent())?void 0:O.status)&&O.value)return c=O.value,h.stop?[2,{v:{event:c,respond:u,stopped:!0}}]:[2,"continue"];"MISS"===(null==O?void 0:O.status)&&(S={key:O.key,ttl:O.rule.ttl}),we.label=3;case 3:return(E=v.config.before)?1!==(A=M(E,T(o,c))).length?[3,6]:(I=W(A[0],H(t))).length>0?[4,Gt(e,t,I,c,o,u,s)]:[3,5]:[3,9];case 4:if(null===(P=we.sent()).event)return[2,{v:{event:null,respond:null!==(q=P.respond)&&void 0!==q?q:u}}];if(P.stopped)return[2,{v:{event:Array.isArray(P.event)?P.event[0]:P.event,respond:null!==(D=P.respond)&&void 0!==D?D:u,stopped:!0}}];P.respond&&(u=P.respond),c=Array.isArray(P.event)?P.event[0]:P.event,we.label=5;case 5:return[3,9];case 6:return A.length>1?[4,Promise.all(A.map(function(n){return C(Gt,function(t){return e.logger.scope("transformer:many").error("many branch ".concat(n," failed"),{error:t}),{event:null,respond:void 0}})(e,t,W(n,H(t)),c,J(o,n),void 0,s)}))]:[3,8];case 7:we.sent(),we.label=8;case 8:we.label=9;case 9:return w&&w.length>0?[4,L(w,function(t){return B(t,e)},c,e)]:[3,11];case 10:c=we.sent(),we.label=11;case 11:return[4,C($,function(t){return e.logger.scope("transformer:".concat(v.type||"unknown")).error("Push failed",{error:t}),!1})(e,v,r,c,o,u)];case 12:return!1===(G=we.sent())?[2,{v:{event:null,respond:u}}]:Array.isArray(G)?(K=n.slice(n.indexOf(r)+1),[4,Promise.all(G.map(function(n){return _async_to_generator(function(){var r,a,i,l;return _ts_generator(this,function(f){switch(f.label){case 0:return[4,j(n.event||c)];case 1:return r=f.sent(),a=J(o,"unknown"),n.next?0===(i=M(n.next,T(a,r))).length?[2,{event:r,respond:u}]:1===i.length?[2,(l=W(i[0],H(t))).length>0?Gt(e,t,l,r,a,u,s):{event:r,respond:u}]:[4,Promise.all(i.map(function(n){return C(Gt,function(t){return e.logger.scope("transformer:many").error("many branch ".concat(n," failed"),{error:t}),{event:null,respond:void 0}})(e,t,W(n,H(t)),r,J(a,n),void 0,s)}))]:[3,3];case 2:return[2,f.sent().map(function(e){return{event:e.event,respond:void 0}})];case 3:return[2,K.length>0?Gt(e,t,K,r,a,u,s):{event:r,respond:u}]}})})()}))]):[3,14];case 13:F=we.sent(),X=u,Z=[],Q=!0,ee=!1,te=void 0;try{for(ne=F.flat()[Symbol.iterator]();!(Q=(re=ne.next()).done);Q=!0)if(null!==(oe=re.value))if(oe&&"object"==(void 0===oe?"undefined":_type_of(oe))&&"event"in oe){if((se=oe).respond&&(X=se.respond),null===se.event)continue;Array.isArray(se.event)?(ae=Z).push.apply(ae,_to_consumable_array(se.event)):Z.push(se.event)}else Z.push(oe)}catch(e){ee=!0,te=e}finally{try{Q||null==ne.return||ne.return()}finally{if(ee)throw te}}return[2,{v:0===Z.length?{event:null,respond:X}:1===Z.length?{event:Z[0],respond:X}:{event:Z,respond:X}}];case 14:return G&&"object"==(void 0===G?"undefined":_type_of(G))?(ie=G.event,ce=G.respond,ue=G.next,ce&&(u=ce),void 0===ue?[3,17]:[4,j(ie||c)]):[3,18];case 15:return le=we.sent(),0===(fe=M(ue,T(o,le))).length?(c=le,[2,"continue"]):1===fe.length?[2,{v:(de=W(fe[0],H(t))).length>0?Gt(e,t,de,le,o,u,s):(e.logger.warn("Branch target not found: ".concat(JSON.stringify(ue))),{event:null,respond:u})}]:(pe={},[4,Promise.all(fe.map(function(n){return C(Gt,function(t){return e.logger.scope("transformer:many").error("many branch ".concat(n," failed"),{error:t}),{event:null,respond:void 0}})(e,t,W(n,H(t)),le,J(o,n),void 0,s)}))]);case 16:return[2,(pe.v=(we.sent(),{event:null,respond:void 0}),pe)];case 17:ie&&(c=ie),we.label=18;case 18:return k&&k.length>0?[4,L(k,function(t){return B(t,e)},c,e)]:[3,20];case 19:c=we.sent(),we.label=20;case 20:return S&&m&&U(m,S.key,c,S.ttl),ve=v.config.next,_e="string"==typeof ve||Array.isArray(ve)&&ve.every(function(e){return"string"==typeof e}),ge=void 0!==ve&&!_e,G&&("object"!=(void 0===G?"undefined":_type_of(G))||G.next)||!ge?[3,24]:1===(ye=M(v.config.next,T(o,c))).length?[2,{v:(he=W(ye[0],H(t))).length>0?Gt(e,t,he,c,o,u,s):{event:c,respond:u}}]:(me={},ye.length>1?[4,Promise.all(ye.map(function(n){return C(Gt,function(t){return e.logger.scope("transformer:many").error("many branch ".concat(n," failed"),{error:t}),{event:null,respond:void 0}})(e,t,W(n,H(t)),c,J(o,n),void 0,s)}))]:[3,22]);case 21:return we.sent(),be={event:null,respond:void 0},[3,23];case 22:be={event:c,respond:u},we.label=23;case 23:return[2,(me.v=be,me)];case 24:return[2]}})},_=n[Symbol.iterator](),m.label=2;case 2:return(f=(g=_.next()).done)?[3,5]:[5,_ts_values(v())];case 3:if("object"===_type_of(y=m.sent()))return[2,y.v];m.label=4;case 4:return f=!0,[3,2];case 5:return[3,8];case 6:return h=m.sent(),d=!0,p=h,[3,8];case 7:try{f||null==_.return||_.return()}finally{if(d)throw p}return[7];case 8:return[2,{event:c,respond:u}]}})})()}var zt,Lt=new WeakMap,Kt=Object.freeze({batched:!0}),Vt=function(e){return _async_to_generator(function(){var t,n;return _ts_generator(this,function(r){return n=function(n,r){return function(n){return _async_to_generator(function(){var o,a,s;return _ts_generator(this,function(i){switch(i.label){case 0:return t?[3,2]:[4,ze(_object_spread_props(_object_spread({},e),{run:null===(o=e.run)||void 0===o||o}))];case 1:a=i.sent(),t={collector:a.collector,elb:a.elb},i.label=2;case 2:return s=(null==r?void 0:r.eventName)||"ucEvent",window.dispatchEvent(new CustomEvent(s,{detail:n})),[2]}})})()}},[2,{get flow(){return t},trigger:n}]})})()},Bt=function(e,t){if(e&&"object"===(void 0===e?"undefined":_type_of(e)))return function(){t.window.dispatchEvent(new CustomEvent("ucEvent",{detail:e}))}},Ht=function(e){return _async_to_generator(function(){var t,n,a,s,i,c,u,l,f,d,p,v,_,g,y,h,m,b,w,k,j,S,x,C,O;return _ts_generator(this,function(E){switch(E.label){case 0:return v=e.config,_=e.env,g=_.elb,y=_.logger,h=null!==(t=_.window)&&void 0!==t?t:void 0!==globalThis.window?globalThis.window:void 0,m={eventName:null!==(n=null==v||null===(u=v.settings)||void 0===u?void 0:u.eventName)&&void 0!==n?n:"ucEvent",categoryMap:null!==(a=null==v||null===(l=v.settings)||void 0===l?void 0:l.categoryMap)&&void 0!==a?a:{},explicitOnly:null===(s=null==v||null===(f=v.settings)||void 0===f?void 0:f.explicitOnly)||void 0===s||s,apiVersion:null!==(i=null==v||null===(d=v.settings)||void 0===d?void 0:d.apiVersion)&&void 0!==i?i:"auto",v3EventName:null!==(c=null==v||null===(p=v.settings)||void 0===p?void 0:p.v3EventName)&&void 0!==c?c:"UC_UI_CMP_EVENT"},b={settings:m},w=[],h?(j={window:h,elb:g,settings:m,logger:y},"v2"!==(S=null!==(k=m.apiVersion)&&void 0!==k?k:"auto")?[3,1]:(w.push(r(j)),[3,8])):[3,8];case 1:return"v3"!==S?[3,3]:(x=w.push,[4,o(j)]);case 2:return x.apply(w,[E.sent()]),[3,8];case 3:return h.__ucCmp?(C=w.push,[4,o(j)]):[3,5];case 4:return C.apply(w,[E.sent()]),[3,8];case 5:return h.UC_UI?(w.push(r(j)),[3,8]):[3,6];case 6:return w.push(r(j)),O=w.push,[4,o(j)];case 7:O.apply(w,[E.sent()]),E.label=8;case 8:return[2,{type:"usercentrics",config:b,push:g,destroy:function(){return _async_to_generator(function(){return _ts_generator(this,function(e){return w.forEach(function(e){return e()}),[2]})})()}}]}})})()},Ft=Ht;return zt=Fe,function(e,t,n,r){if(t&&"object"===(void 0===t?"undefined":_type_of(t))||"function"==typeof t){var o=!0,a=!1,s=void 0;try{for(var i,c=function(){var o=i.value;Be.call(e,o)||o===n||Le(e,o,{get:function(){return t[o]},enumerable:!(r=Ke(t,o))||r.enumerable})},u=Ve(t)[Symbol.iterator]();!(o=(i=u.next()).done);o=!0)c()}catch(e){a=!0,s=e}finally{try{o||null==u.return||u.return()}finally{if(a)throw s}}}return e}(Le({},"__esModule",{value:!0}),zt)}();
1
+ "use strict";function _array_like_to_array(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}function _array_with_holes(e){if(Array.isArray(e))return e}function asyncGeneratorStep(e,t,n,r,o,a,i){try{var u=e[a](i),l=u.value}catch(e){return void n(e)}u.done?t(l):Promise.resolve(l).then(r,o)}function _async_to_generator(e){return function(){var t=this,n=arguments;return new Promise(function(r,o){var a=e.apply(t,n);function i(e){asyncGeneratorStep(a,r,o,i,u,"next",e)}function u(e){asyncGeneratorStep(a,r,o,i,u,"throw",e)}i(void 0)})}}function _iterable_to_array_limit(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,o,a=[],i=!0,u=!1;try{for(n=n.call(e);!(i=(r=n.next()).done)&&(a.push(r.value),!t||a.length!==t);i=!0);}catch(e){u=!0,o=e}finally{try{i||null==n.return||n.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 _sliced_to_array(e,t){return _array_with_holes(e)||_iterable_to_array_limit(e,t)||_unsupported_iterable_to_array(e,t)||_non_iterable_rest()}function _type_of(e){return e&&"undefined"!=typeof Symbol&&e.constructor===Symbol?"symbol":typeof e}function _unsupported_iterable_to_array(e,t){if(e){if("string"==typeof e)return _array_like_to_array(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(n):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?_array_like_to_array(e,t):void 0}}function _ts_generator(e,t){var n,r,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:l(0)}),u(i,"throw",{value:l(1)}),u(i,"return",{value:l(2)}),"function"==typeof Symbol&&u(i,Symbol.iterator,{value:function(){return this}}),i;function l(u){return function(l){return function(u){if(n)throw new TypeError("Generator is already executing.");for(;i&&(i=0,u[0]&&(a=0)),a;)try{if(n=1,r&&(o=2&u[0]?r.return:u[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,u[1])).done)return o;switch(r=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++,r=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(e,a)}catch(e){u=[6,e],r=0}finally{n=o=0}if(5&u[0])throw u[1];return{value:u[0]?u[1]:void 0,done:!0}}([u,l])}}}var SourceUsercentrics=function(){var e=function(e,t,n){e[t]=(void 0===e[t]||Boolean(e[t]))&&n},t=function(t,n){var r,o={};return t.ucCategory&&(r=t.ucCategory,Object.values(r).every(function(e){return"boolean"==typeof e}))?Object.entries(t.ucCategory).forEach(function(t){var r,a,i=_sliced_to_array(t,2),u=i[0],l=i[1];if("boolean"==typeof l){var c=null!==(r=null===(a=n.categoryMap)||void 0===a?void 0:a[u])&&void 0!==r?r:u;e(o,c,l)}}):(t.ucCategory&&Object.entries(t.ucCategory).forEach(function(t){var r=_sliced_to_array(t,2),a=r[0],i=r[1];if("boolean"==typeof i){var u,l,c=null!==(u=null===(l=n.categoryMap)||void 0===l?void 0:l[a])&&void 0!==u?u:a;e(o,c,i)}}),Object.entries(t).forEach(function(t){var n=_sliced_to_array(t,2),r=n[0],a=n[1];if(!f.includes(r)&&"boolean"==typeof a){var i=r.toLowerCase().replace(/ /g,"_");e(o,i,a)}})),o},n=function(e){var t={};return e.forEach(function(e){var n,r,o=e.categorySlug,a=null!==(n=null===(r=e.consent)||void 0===r?void 0:r.status)&&void 0!==n&&n;t[o]=(void 0===t[o]||t[o])&&a}),t},r=function(e){var r,o,a=e.window,i=e.elb,u=e.settings,l=e.logger,c=null!==(r=u.eventName)&&void 0!==r?r:"ucEvent",s=function(e){var n;if(l.debug("event received",e),"consent_status"===e.event&&(!u.explicitOnly||"explicit"===(null===(n=e.type)||void 0===n?void 0:n.toLowerCase()))){var r=t(e,u);Object.keys(r).length>0&&i("walker consent",r)}},f=function(e){var t=e;t.detail&&s(t.detail)};a.addEventListener(c,f);var v=a.UC_UI;if((null==v||null===(o=v.isInitialized)||void 0===o?void 0:o.call(v))&&v.getServicesBaseInfo){var y=v.getServicesBaseInfo();y.length>0&&s(function(e){return{event:"consent_status",type:"implicit",ucCategory:n(e)}}(y))}return function(){a.removeEventListener(c,f)}},o=function(e){return _async_to_generator(function(){var n,r,o,a,i,u,l,c,s,f;return _ts_generator(this,function(_){switch(_.label){case 0:if(r=e.window,o=e.elb,a=e.settings,i=e.logger,u=null!==(n=a.v3EventName)&&void 0!==n?n:v,l=function(e){return _async_to_generator(function(){var n,r,u;return _ts_generator(this,function(l){switch(l.label){case 0:return[4,e.getConsentDetails()];case 1:return n=l.sent(),r=function(e){var t={};return Object.entries(e.categories).forEach(function(e){var n=_sliced_to_array(e,2),r=n[0],o=n[1];t[r]="ALL_ACCEPTED"===o.state}),{event:"consent_status",type:"EXPLICIT"===e.consent.type?"explicit":"implicit",ucCategory:t}}(n),i.debug("event received",r),a.explicitOnly&&"explicit"!==r.type?[2]:(u=t(r,a),Object.keys(u).length>0&&o("walker consent",u),[2])}})})()},c=function(e){var t=r.__ucCmp;if(t){var n=e.detail;n&&"CMP"===n.source&&n.type&&y.has(n.type)&&l(t).catch(function(){})}},r.addEventListener(u,c),!(s=r.__ucCmp))return[3,6];_.label=1;case 1:return _.trys.push([1,5,,6]),[4,s.isInitialized()];case 2:return _.sent()?[4,l(s)]:[3,4];case 3:_.sent(),_.label=4;case 4:return[3,6];case 5:return f=_.sent(),i.warn("v3 static consent read failed",f),[3,6];case 6:return[2,function(){r.removeEventListener(u,c)}]}})})()},a=Object.defineProperty,i=Object.getOwnPropertyDescriptor,u=Object.getOwnPropertyNames,l=Object.prototype.hasOwnProperty,c={};!function(e,t){for(var n in t)a(e,n,{get:t[n],enumerable:!0})}(c,{SourceUsercentrics:function(){return _},default:function(){return d},sourceUsercentrics:function(){return p}});var s,f=["action","event","type","ucCategory"],v="UC_UI_CMP_EVENT",y=new Set(["ACCEPT_ALL","DENY_ALL","SAVE"]),_={},p=function(e){return _async_to_generator(function(){var t,n,a,i,u,l,c,s,f,v,y,_,p,d,g,b,h,w,m;return _ts_generator(this,function(C){return _=e.config,p=e.env,d=p.elb,g=p.logger,b=null!==(t=p.window)&&void 0!==t?t:void 0!==globalThis.window?globalThis.window:void 0,h={eventName:null!==(n=null==_||null===(c=_.settings)||void 0===c?void 0:c.eventName)&&void 0!==n?n:"ucEvent",categoryMap:null!==(a=null==_||null===(s=_.settings)||void 0===s?void 0:s.categoryMap)&&void 0!==a?a:{},explicitOnly:null===(i=null==_||null===(f=_.settings)||void 0===f?void 0:f.explicitOnly)||void 0===i||i,apiVersion:null!==(u=null==_||null===(v=_.settings)||void 0===v?void 0:v.apiVersion)&&void 0!==u?u:"auto",v3EventName:null!==(l=null==_||null===(y=_.settings)||void 0===y?void 0:y.v3EventName)&&void 0!==l?l:"UC_UI_CMP_EVENT"},w=[],m=function(){return _async_to_generator(function(){var e,t,n,a,i,u;return _ts_generator(this,function(l){switch(l.label){case 0:return b?(t={window:b,elb:d,settings:h,logger:g},"v2"!==(n=null!==(e=h.apiVersion)&&void 0!==e?e:"auto")?[3,1]:(w.push(r(t)),[3,8])):[2];case 1:return"v3"!==n?[3,3]:(a=w.push,[4,o(t)]);case 2:return a.apply(w,[l.sent()]),[3,8];case 3:return b.__ucCmp?(i=w.push,[4,o(t)]):[3,5];case 4:return i.apply(w,[l.sent()]),[3,8];case 5:return b.UC_UI?(w.push(r(t)),[3,8]):[3,6];case 6:return w.push(r(t)),u=w.push,[4,o(t)];case 7:u.apply(w,[l.sent()]),l.label=8;case 8:return[2]}})})()},[2,{type:"usercentrics",config:{settings:h},push:d,init:m,destroy:function(){return _async_to_generator(function(){return _ts_generator(this,function(e){return w.forEach(function(e){return e()}),[2]})})()}}]})})()},d=p;return s=c,function(e,t,n,r){if(t&&"object"===(void 0===t?"undefined":_type_of(t))||"function"==typeof t){var o=!0,c=!1,s=void 0;try{for(var f,v=function(){var o=f.value;l.call(e,o)||o===n||a(e,o,{get:function(){return t[o]},enumerable:!(r=i(t,o))||r.enumerable})},y=u(t)[Symbol.iterator]();!(o=(f=y.next()).done);o=!0)v()}catch(e){c=!0,s=e}finally{try{o||null==y.return||y.return()}finally{if(c)throw s}}}return e}(a({},"__esModule",{value:!0}),s)}();
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- "use strict";var e,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,o=Object.getOwnPropertyNames,i=Object.prototype.hasOwnProperty,a=(e,n)=>{for(var o in n)t(e,o,{get:n[o],enumerable:!0})},s={};a(s,{SourceUsercentrics:()=>y,createMockElbFn:()=>S,createTrigger:()=>T,default:()=>V,fullConsent:()=>d,fullConsentCustomMapped:()=>A,fullConsentMapped:()=>k,fullConsentUpperCase:()=>w,implicitConsent:()=>C,minimalConsent:()=>m,minimalConsentMapped:()=>h,nonConsentEvent:()=>_,noopLogger:()=>M,partialConsent:()=>f,partialConsentMapped:()=>b,serviceLevelConsent:()=>E,serviceLevelMapped:()=>U,sourceUsercentrics:()=>G,step:()=>x,trigger:()=>D}),module.exports=(e=s,((e,a,s,l)=>{if(a&&"object"==typeof a||"function"==typeof a)for(let c of o(a))i.call(e,c)||c===s||t(e,c,{get:()=>a[c],enumerable:!(l=n(a,c))||l.enumerable});return e})(t({},"__esModule",{value:!0}),e));var l=["action","event","type","ucCategory"];function c(e,t,n){e[t]=(void 0===e[t]||Boolean(e[t]))&&n}function r(e,t){const n={};var o;return e.ucCategory&&(o=e.ucCategory,Object.values(o).every(e=>"boolean"==typeof e))?Object.entries(e.ucCategory).forEach(([e,o])=>{var i,a;if("boolean"!=typeof o)return;const s=null!=(a=null==(i=t.categoryMap)?void 0:i[e])?a:e;c(n,s,o)}):(e.ucCategory&&Object.entries(e.ucCategory).forEach(([e,o])=>{var i,a;if("boolean"==typeof o){const s=null!=(a=null==(i=t.categoryMap)?void 0:i[e])?a:e;c(n,s,o)}}),Object.entries(e).forEach(([e,t])=>{if(l.includes(e))return;if("boolean"!=typeof t)return;const o=e.toLowerCase().replace(/ /g,"_");c(n,o,t)})),n}function u(e){const t={};return e.forEach(e=>{var n,o;const i=e.categorySlug,a=null!=(o=null==(n=e.consent)?void 0:n.status)&&o;t[i]=(void 0===t[i]||t[i])&&a}),t}function g(e){var t,n;const{window:o,elb:i,settings:a,logger:s}=e,l=null!=(t=a.eventName)?t:"ucEvent",c=e=>{var t;if(s.debug("event received",e),"consent_status"!==e.event)return;if(a.explicitOnly&&"explicit"!==(null==(t=e.type)?void 0:t.toLowerCase()))return;const n=r(e,a);Object.keys(n).length>0&&i("walker consent",n)},g=e=>{const t=e;t.detail&&c(t.detail)};o.addEventListener(l,g);const p=o.UC_UI;if((null==(n=null==p?void 0:p.isInitialized)?void 0:n.call(p))&&p.getServicesBaseInfo){const e=p.getServicesBaseInfo();e.length>0&&c(function(e){return{event:"consent_status",type:"implicit",ucCategory:u(e)}}(e))}return()=>{o.removeEventListener(l,g)}}var p=new Set(["ACCEPT_ALL","DENY_ALL","SAVE"]);async function v(e){var t;const{window:n,elb:o,settings:i,logger:a}=e,s=null!=(t=i.v3EventName)?t:"UC_UI_CMP_EVENT",l=async e=>{const t=function(e){const t={};return Object.entries(e.categories).forEach(([e,n])=>{t[e]="ALL_ACCEPTED"===n.state}),{event:"consent_status",type:"EXPLICIT"===e.consent.type?"explicit":"implicit",ucCategory:t}}(await e.getConsentDetails());if(a.debug("event received",t),i.explicitOnly&&"explicit"!==t.type)return;const n=r(t,i);Object.keys(n).length>0&&o("walker consent",n)},c=e=>{const t=n.__ucCmp;if(!t)return;const o=e.detail;o&&"CMP"===o.source&&o.type&&p.has(o.type)&&l(t).catch(()=>{})};n.addEventListener(s,c);const u=n.__ucCmp;if(u)try{await u.isInitialized()&&await l(u)}catch(e){a.warn("v3 static consent read failed",e)}return()=>{n.removeEventListener(s,c)}}var y={},d={event:"consent_status",type:"explicit",action:"onAcceptAllServices",ucCategory:{essential:!0,functional:!0,marketing:!0},"Google Analytics":!0,"Google Ads Remarketing":!0},f={event:"consent_status",type:"explicit",action:"onUpdateServices",ucCategory:{essential:!0,functional:!0,marketing:!1},"Google Analytics":!0,"Google Ads Remarketing":!1},m={event:"consent_status",type:"explicit",action:"onDenyAllServices",ucCategory:{essential:!0,functional:!1,marketing:!1},"Google Analytics":!1,"Google Ads Remarketing":!1},C={event:"consent_status",type:"implicit",ucCategory:{essential:!0,functional:!1,marketing:!1},"Google Analytics":!1,"Google Ads Remarketing":!1},w={event:"consent_status",type:"EXPLICIT",action:"onAcceptAllServices",ucCategory:{essential:!0,functional:!0,marketing:!0}},E={event:"consent_status",type:"explicit",action:"onUpdateServices",ucCategory:{essential:!0,functional:"partial",marketing:"partial"},"Google Analytics":!0,"Google Ads Remarketing":!1,Hotjar:!0},_={event:"other_event",type:"explicit"},k={essential:!0,functional:!0,marketing:!0},b={essential:!0,functional:!0,marketing:!1},h={essential:!0,functional:!1,marketing:!1},A={functional:!0,marketing:!0},U={essential:!0,google_analytics:!0,google_ads_remarketing:!1,hotjar:!0},O=()=>{},S=()=>()=>Promise.resolve({ok:!0}),M={error:O,warn:O,info:O,debug:O,throw:e=>{throw"string"==typeof e?new Error(e):e},json:O,scope:()=>M},x={};a(x,{categoryMapOverride:()=>j,customEventName:()=>I,fullConsent:()=>L,minimalConsent:()=>N});var L={title:"Full consent",description:"A Usercentrics onAcceptAllServices event emits a walker consent command with essential, functional, and marketing granted.",trigger:{type:"consent"},in:{event:"consent_status",type:"explicit",action:"onAcceptAllServices",ucCategory:{essential:!0,functional:!0,marketing:!0}},out:[["elb","walker consent",{essential:!0,functional:!0,marketing:!0}]]},N={title:"Minimal consent",description:"A Usercentrics onDenyAllServices event emits a walker consent command with only essential granted.",trigger:{type:"consent"},in:{event:"consent_status",type:"explicit",action:"onDenyAllServices",ucCategory:{essential:!0,functional:!1,marketing:!1}},out:[["elb","walker consent",{essential:!0,functional:!1,marketing:!1}]]},j={title:"Category map override",description:"Custom categoryMap remaps essential to functional and functional to analytics",trigger:{type:"consent"},in:{event:"consent_status",type:"explicit",ucCategory:{essential:!0,functional:!0,marketing:!1}},mapping:{categoryMap:{essential:"functional",functional:"analytics"}},out:[["elb","walker consent",{functional:!0,analytics:!0,marketing:!1}]]},I={title:"Custom event name",description:"Using UC_SDK_EVENT instead of ucEvent for Usercentrics SDK v2",trigger:{type:"consent",options:{eventName:"UC_SDK_EVENT"}},in:{event:"consent_status",type:"explicit",ucCategory:{essential:!0,functional:!0,marketing:!0}},mapping:{eventName:"UC_SDK_EVENT"},out:[["elb","walker consent",{essential:!0,functional:!0,marketing:!0}]]},P=require("@walkeros/collector"),T=async e=>{let t;return{get flow(){return t},trigger:(n,o)=>async n=>{var i;if(!t){const n=await(0,P.startFlow)({...e,run:null==(i=e.run)||i});t={collector:n.collector,elb:n.elb}}const a=(null==o?void 0:o.eventName)||"ucEvent";window.dispatchEvent(new CustomEvent(a,{detail:n}))}}},D=(e,t)=>{if(e&&"object"==typeof e)return()=>{t.window.dispatchEvent(new CustomEvent("ucEvent",{detail:e}))}},G=async e=>{var t,n,o,i,a,s,l,c,r,u,p,y;const{config:d,env:f}=e,{elb:m,logger:C}=f,w=null!=(t=f.window)?t:void 0!==globalThis.window?globalThis.window:void 0,E={eventName:null!=(o=null==(n=null==d?void 0:d.settings)?void 0:n.eventName)?o:"ucEvent",categoryMap:null!=(a=null==(i=null==d?void 0:d.settings)?void 0:i.categoryMap)?a:{},explicitOnly:null==(l=null==(s=null==d?void 0:d.settings)?void 0:s.explicitOnly)||l,apiVersion:null!=(r=null==(c=null==d?void 0:d.settings)?void 0:c.apiVersion)?r:"auto",v3EventName:null!=(p=null==(u=null==d?void 0:d.settings)?void 0:u.v3EventName)?p:"UC_UI_CMP_EVENT"},_={settings:E},k=[];if(w){const e={window:w,elb:m,settings:E,logger:C},t=null!=(y=E.apiVersion)?y:"auto";"v2"===t?k.push(g(e)):"v3"===t||w.__ucCmp?k.push(await v(e)):w.UC_UI?k.push(g(e)):(k.push(g(e)),k.push(await v(e)))}return{type:"usercentrics",config:_,push:m,destroy:async()=>{k.forEach(e=>e())}}},V=G;//# sourceMappingURL=index.js.map
1
+ "use strict";var e,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,o=Object.getOwnPropertyNames,i=Object.prototype.hasOwnProperty,r={};((e,n)=>{for(var o in n)t(e,o,{get:n[o],enumerable:!0})})(r,{SourceUsercentrics:()=>p,default:()=>y,sourceUsercentrics:()=>d}),module.exports=(e=r,((e,r,c,l)=>{if(r&&"object"==typeof r||"function"==typeof r)for(let s of o(r))i.call(e,s)||s===c||t(e,s,{get:()=>r[s],enumerable:!(l=n(r,s))||l.enumerable});return e})(t({},"__esModule",{value:!0}),e));var c=["action","event","type","ucCategory"];function l(e,t,n){e[t]=(void 0===e[t]||Boolean(e[t]))&&n}function s(e,t){const n={};var o;return e.ucCategory&&(o=e.ucCategory,Object.values(o).every(e=>"boolean"==typeof e))?Object.entries(e.ucCategory).forEach(([e,o])=>{var i,r;if("boolean"!=typeof o)return;const c=null!=(r=null==(i=t.categoryMap)?void 0:i[e])?r:e;l(n,c,o)}):(e.ucCategory&&Object.entries(e.ucCategory).forEach(([e,o])=>{var i,r;if("boolean"==typeof o){const c=null!=(r=null==(i=t.categoryMap)?void 0:i[e])?r:e;l(n,c,o)}}),Object.entries(e).forEach(([e,t])=>{if(c.includes(e))return;if("boolean"!=typeof t)return;const o=e.toLowerCase().replace(/ /g,"_");l(n,o,t)})),n}function a(e){const t={};return e.forEach(e=>{var n,o;const i=e.categorySlug,r=null!=(o=null==(n=e.consent)?void 0:n.status)&&o;t[i]=(void 0===t[i]||t[i])&&r}),t}function u(e){var t,n;const{window:o,elb:i,settings:r,logger:c}=e,l=null!=(t=r.eventName)?t:"ucEvent",u=e=>{var t;if(c.debug("event received",e),"consent_status"!==e.event)return;if(r.explicitOnly&&"explicit"!==(null==(t=e.type)?void 0:t.toLowerCase()))return;const n=s(e,r);Object.keys(n).length>0&&i("walker consent",n)},v=e=>{const t=e;t.detail&&u(t.detail)};o.addEventListener(l,v);const g=o.UC_UI;if((null==(n=null==g?void 0:g.isInitialized)?void 0:n.call(g))&&g.getServicesBaseInfo){const e=g.getServicesBaseInfo();e.length>0&&u(function(e){return{event:"consent_status",type:"implicit",ucCategory:a(e)}}(e))}return()=>{o.removeEventListener(l,v)}}var v=new Set(["ACCEPT_ALL","DENY_ALL","SAVE"]);async function g(e){var t;const{window:n,elb:o,settings:i,logger:r}=e,c=null!=(t=i.v3EventName)?t:"UC_UI_CMP_EVENT",l=async e=>{const t=function(e){const t={};return Object.entries(e.categories).forEach(([e,n])=>{t[e]="ALL_ACCEPTED"===n.state}),{event:"consent_status",type:"EXPLICIT"===e.consent.type?"explicit":"implicit",ucCategory:t}}(await e.getConsentDetails());if(r.debug("event received",t),i.explicitOnly&&"explicit"!==t.type)return;const n=s(t,i);Object.keys(n).length>0&&o("walker consent",n)},a=e=>{const t=n.__ucCmp;if(!t)return;const o=e.detail;o&&"CMP"===o.source&&o.type&&v.has(o.type)&&l(t).catch(()=>{})};n.addEventListener(c,a);const u=n.__ucCmp;if(u)try{await u.isInitialized()&&await l(u)}catch(e){r.warn("v3 static consent read failed",e)}return()=>{n.removeEventListener(c,a)}}var p={},d=async e=>{var t,n,o,i,r,c,l,s,a,v,p;const{config:d,env:y}=e,{elb:f,logger:b}=y,w=null!=(t=y.window)?t:void 0!==globalThis.window?globalThis.window:void 0,C={eventName:null!=(o=null==(n=null==d?void 0:d.settings)?void 0:n.eventName)?o:"ucEvent",categoryMap:null!=(r=null==(i=null==d?void 0:d.settings)?void 0:i.categoryMap)?r:{},explicitOnly:null==(l=null==(c=null==d?void 0:d.settings)?void 0:c.explicitOnly)||l,apiVersion:null!=(a=null==(s=null==d?void 0:d.settings)?void 0:s.apiVersion)?a:"auto",v3EventName:null!=(p=null==(v=null==d?void 0:d.settings)?void 0:v.v3EventName)?p:"UC_UI_CMP_EVENT"},E=[];return{type:"usercentrics",config:{settings:C},push:f,init:async()=>{var e;if(!w)return;const t={window:w,elb:f,settings:C,logger:b},n=null!=(e=C.apiVersion)?e:"auto";"v2"===n?E.push(u(t)):"v3"===n||w.__ucCmp?E.push(await g(t)):w.UC_UI?E.push(u(t)):(E.push(u(t)),E.push(await g(t)))},destroy:async()=>{E.forEach(e=>e())}}},y=d;//# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/lib/parseConsent.ts","../src/lib/v2.ts","../src/lib/v3.ts","../src/types/index.ts","../src/examples/inputs.ts","../src/examples/outputs.ts","../src/examples/env.ts","../src/examples/step.ts","../src/examples/trigger.ts"],"sourcesContent":["import type { Source } from '@walkeros/core';\nimport type { Types, Settings } from './types';\nimport { setupV2Adapter } from './lib/v2';\nimport { setupV3Adapter } from './lib/v3';\n\n// Export types for external usage\nexport * as SourceUsercentrics from './types';\n\n// Export examples\nexport * from './examples';\n\n/**\n * Usercentrics consent management source for walkerOS.\n *\n * Listens to Usercentrics CMP events and translates consent states to\n * walkerOS consent commands. Supports both the legacy V2 API\n * (`window.UC_UI` + `ucEvent`) and the current V3 API\n * (`window.__ucCmp` + `UC_UI_CMP_EVENT`).\n *\n * @example\n * ```typescript\n * import { sourceUsercentrics } from '@walkeros/web-source-cmp-usercentrics';\n *\n * await startFlow({\n * sources: {\n * consent: {\n * code: sourceUsercentrics,\n * config: {\n * settings: {\n * eventName: 'ucEvent',\n * categoryMap: {\n * essential: 'functional',\n * functional: 'functional',\n * marketing: 'marketing',\n * },\n * },\n * },\n * },\n * },\n * });\n * ```\n */\nexport const sourceUsercentrics: Source.Init<Types> = async (context) => {\n const { config, env } = context;\n const { elb, logger } = env;\n\n // Resolve window with fallback to globalThis\n const actualWindow =\n env.window ??\n (typeof globalThis.window !== 'undefined' ? globalThis.window : undefined);\n\n // Merge user settings with defaults so adapters always see a fully-resolved Settings\n const settings: Settings = {\n eventName: config?.settings?.eventName ?? 'ucEvent',\n categoryMap: config?.settings?.categoryMap ?? {},\n explicitOnly: config?.settings?.explicitOnly ?? true,\n apiVersion: config?.settings?.apiVersion ?? 'auto',\n v3EventName: config?.settings?.v3EventName ?? 'UC_UI_CMP_EVENT',\n };\n\n const fullConfig: Source.Config<Types> = { settings };\n const cleanups: Array<() => void> = [];\n\n if (actualWindow) {\n const adapterCtx = { window: actualWindow, elb, settings, logger };\n const apiVersion = settings.apiVersion ?? 'auto';\n\n if (apiVersion === 'v2') {\n cleanups.push(setupV2Adapter(adapterCtx));\n } else if (apiVersion === 'v3') {\n cleanups.push(await setupV3Adapter(adapterCtx));\n } else {\n // auto: detect which API is present\n if (actualWindow.__ucCmp) {\n cleanups.push(await setupV3Adapter(adapterCtx));\n } else if (actualWindow.UC_UI) {\n cleanups.push(setupV2Adapter(adapterCtx));\n } else {\n // Neither loaded yet — attach both listeners so whichever loads later is caught.\n cleanups.push(setupV2Adapter(adapterCtx));\n cleanups.push(await setupV3Adapter(adapterCtx));\n }\n }\n }\n\n return {\n type: 'usercentrics',\n config: fullConfig,\n push: elb,\n destroy: async () => {\n cleanups.forEach((fn) => fn());\n },\n };\n};\n\nexport default sourceUsercentrics;\n","import type { WalkerOS } from '@walkeros/core';\nimport type { UsercentricsEventDetail, Settings } from '../types';\n\n/** Reserved keys in event.detail that are not service names */\nexport const RESERVED_KEYS = ['action', 'event', 'type', 'ucCategory'];\n\n/**\n * Determine if ucCategory represents group-level consent.\n * Group-level: all values are booleans.\n * Service-level: some values are non-boolean (e.g., 'partial').\n */\nexport function isGroupLevel(\n ucCategory: Record<string, boolean | unknown>,\n): boolean {\n return Object.values(ucCategory).every((val) => typeof val === 'boolean');\n}\n\n/**\n * Merge an incoming consent signal into the accumulating state using strict\n * AND semantics: absent key initialises from the incoming value; present key\n * becomes `true` only if both existing and incoming are `true`. Any single\n * `false` anywhere in the merge chain revokes consent for that key.\n *\n * This matches the consent rule of thumb: any deny signal denies. Permissive\n * (OR) and \"last-wins\" semantics are both unsafe for a privacy primitive.\n */\nfunction mergeConsent(\n state: WalkerOS.Consent,\n key: string,\n value: boolean,\n): void {\n state[key] = state[key] === undefined ? value : Boolean(state[key]) && value;\n}\n\n/**\n * Parse consent from Usercentrics event detail.\n *\n * Group-level: ucCategory values are all booleans → use them directly.\n * Service-level: ucCategory has non-booleans → mix boolean ucCategory entries\n * with top-level service keys from event.detail.\n *\n * categoryMap is applied in both modes to ucCategory boolean entries.\n * Strict AND: if multiple source categories map to the same target group,\n * the target is `true` only when ALL contributing sources are `true`.\n */\nexport function parseConsent(\n detail: UsercentricsEventDetail,\n settings: Settings,\n): WalkerOS.Consent {\n const state: WalkerOS.Consent = {};\n\n if (detail.ucCategory && isGroupLevel(detail.ucCategory)) {\n Object.entries(detail.ucCategory).forEach(([category, value]) => {\n if (typeof value !== 'boolean') return;\n const mapped = settings.categoryMap?.[category] ?? category;\n mergeConsent(state, mapped, value);\n });\n } else {\n if (detail.ucCategory) {\n Object.entries(detail.ucCategory).forEach(([key, value]) => {\n if (typeof value === 'boolean') {\n const mapped = settings.categoryMap?.[key] ?? key;\n mergeConsent(state, mapped, value);\n }\n });\n }\n\n Object.entries(detail).forEach(([key, value]) => {\n if (RESERVED_KEYS.includes(key)) return;\n if (typeof value !== 'boolean') return;\n const normalized = key.toLowerCase().replace(/ /g, '_');\n mergeConsent(state, normalized, value);\n });\n }\n\n return state;\n}\n","import type { Elb, Logger } from '@walkeros/core';\nimport type {\n Settings,\n UsercentricsEventDetail,\n UsercentricsV2Service,\n} from '../types';\nimport { parseConsent } from './parseConsent';\n\nexport interface V2AdapterContext {\n window: Window & typeof globalThis;\n elb: Elb.Fn;\n settings: Settings;\n logger: Logger.Instance;\n}\n\n/**\n * Aggregate V2 service array into a group-level ucCategory object using strict\n * AND logic. A category is `true` only if EVERY service in that category is\n * accepted. Any single denied service denies the whole category — this\n * matches the consent rule of thumb: any deny signal denies.\n */\nfunction aggregateByCategory(\n services: UsercentricsV2Service[],\n): Record<string, boolean> {\n const categories: Record<string, boolean> = {};\n services.forEach((service) => {\n const category = service.categorySlug;\n const status = service.consent?.status ?? false;\n categories[category] =\n categories[category] === undefined\n ? status\n : categories[category] && status;\n });\n return categories;\n}\n\n/**\n * Build a synthetic UsercentricsEventDetail from the V2 static API.\n * Marked as 'implicit' because UC_UI.isInitialized() === true does NOT prove\n * the read was user-initiated — it only proves the SDK has finished loading.\n * With settings.explicitOnly = true (the default), consumers correctly drop\n * this detail. Set explicitOnly = false to surface the static snapshot.\n */\nfunction buildDetailFromStatic(\n services: UsercentricsV2Service[],\n): UsercentricsEventDetail {\n return {\n event: 'consent_status',\n type: 'implicit',\n ucCategory: aggregateByCategory(services),\n };\n}\n\n/**\n * Set up the V2 adapter: listens on the configured event AND performs a\n * static read if UC_UI is already initialized.\n *\n * Returns a cleanup function that removes the event listener.\n */\nexport function setupV2Adapter(ctx: V2AdapterContext): () => void {\n const { window: win, elb, settings, logger } = ctx;\n const eventName = settings.eventName ?? 'ucEvent';\n\n const handleDetail = (detail: UsercentricsEventDetail) => {\n logger.debug('event received', detail);\n\n if (detail.event !== 'consent_status') return;\n if (settings.explicitOnly && detail.type?.toLowerCase() !== 'explicit')\n return;\n\n const state = parseConsent(detail, settings);\n if (Object.keys(state).length > 0) {\n elb('walker consent', state);\n }\n };\n\n const listener = (e: Event) => {\n const custom = e as CustomEvent<UsercentricsEventDetail>;\n if (custom.detail) handleDetail(custom.detail);\n };\n win.addEventListener(eventName, listener);\n\n // Static check: if UC_UI is already initialized, read current consent now.\n const api = win.UC_UI;\n if (api?.isInitialized?.() && api.getServicesBaseInfo) {\n const services = api.getServicesBaseInfo();\n if (services.length > 0) {\n handleDetail(buildDetailFromStatic(services));\n }\n }\n\n return () => {\n win.removeEventListener(eventName, listener);\n };\n}\n","import type { Elb, Logger } from '@walkeros/core';\nimport type {\n Settings,\n UsercentricsEventDetail,\n UsercentricsV3Api,\n UsercentricsV3CategoryState,\n UsercentricsV3CmpEventDetail,\n UsercentricsV3ConsentDetails,\n} from '../types';\nimport { parseConsent } from './parseConsent';\n\nexport interface V3AdapterContext {\n window: Window & typeof globalThis;\n elb: Elb.Fn;\n settings: Settings;\n logger: Logger.Instance;\n}\n\nconst V3_DEFAULT_EVENT_NAME = 'UC_UI_CMP_EVENT';\n\n/**\n * V3 CMP event types that represent a user consent decision. Presentation\n * events like `CMP_SHOWN` or `UI_INITIALIZED` must NOT trigger a consent\n * publish — they carry no user decision.\n */\nconst V3_DECISION_TYPES: ReadonlySet<string> = new Set([\n 'ACCEPT_ALL',\n 'DENY_ALL',\n 'SAVE',\n]);\n\n/**\n * Map a V3 CategoryData.state value to a walkerOS boolean using strict\n * semantics: only fully-accepted categories are `true`. Any partial or\n * denied state (including future/unknown states) resolves to `false`.\n *\n * This matches the consent rule of thumb: any deny signal denies.\n */\nfunction categoryStateToBoolean(state: UsercentricsV3CategoryState): boolean {\n return state === 'ALL_ACCEPTED';\n}\n\n/**\n * Build a synthetic UsercentricsEventDetail from V3 ConsentDetails.\n * Translates V3's structured consent state into the shape parseConsent expects.\n */\nfunction buildDetailFromV3(\n details: UsercentricsV3ConsentDetails,\n): UsercentricsEventDetail {\n const ucCategory: Record<string, boolean> = {};\n Object.entries(details.categories).forEach(([slug, category]) => {\n ucCategory[slug] = categoryStateToBoolean(category.state);\n });\n\n return {\n event: 'consent_status',\n type: details.consent.type === 'EXPLICIT' ? 'explicit' : 'implicit',\n ucCategory,\n };\n}\n\n/**\n * Set up the V3 adapter: registers a listener on the V3 consent event AND\n * (if __ucCmp is already initialized) performs a static read.\n *\n * Both paths re-fetch getConsentDetails() because the event payload does\n * not include consent state.\n *\n * Returns a cleanup function that removes the event listener.\n */\nexport async function setupV3Adapter(\n ctx: V3AdapterContext,\n): Promise<() => void> {\n const { window: win, elb, settings, logger } = ctx;\n const eventName = settings.v3EventName ?? V3_DEFAULT_EVENT_NAME;\n\n const publishConsent = async (cmp: UsercentricsV3Api): Promise<void> => {\n const details = await cmp.getConsentDetails();\n const detail = buildDetailFromV3(details);\n logger.debug('event received', detail);\n\n if (settings.explicitOnly && detail.type !== 'explicit') return;\n\n const state = parseConsent(detail, settings);\n if (Object.keys(state).length > 0) {\n elb('walker consent', state);\n }\n };\n\n const listener = (event: Event): void => {\n const cmp = win.__ucCmp;\n if (!cmp) return;\n const custom = event as CustomEvent<UsercentricsV3CmpEventDetail>;\n const detail = custom.detail;\n // Filter to decision events only: the CMP emits a broad set of events\n // (CMP_SHOWN, UI_INITIALIZED, VIEW_CHANGED, …) on this bus. Without\n // filtering, every view toggle would re-publish consent.\n if (!detail || detail.source !== 'CMP') return;\n if (!detail.type || !V3_DECISION_TYPES.has(detail.type)) return;\n publishConsent(cmp).catch(() => {\n // Swallow — a failed V3 fetch should not break the page.\n });\n };\n win.addEventListener(eventName, listener);\n\n // Static check: if __ucCmp is already initialized, fetch now.\n // Wrapped in try/catch so transient API failures during setup don't\n // reject setupV3Adapter() and tear down the whole flow — the listener\n // stays registered and will pick up the next real event.\n const cmp = win.__ucCmp;\n if (cmp) {\n try {\n const initialized = await cmp.isInitialized();\n if (initialized) {\n await publishConsent(cmp);\n }\n } catch (err) {\n logger.warn('v3 static consent read failed', err);\n }\n }\n\n return () => {\n win.removeEventListener(eventName, listener);\n };\n}\n","import type { Source, Elb } from '@walkeros/core';\n\ndeclare module '@walkeros/core' {\n interface SourceMap {\n usercentrics: { type: 'usercentrics'; platform?: 'web' };\n }\n}\n\n/**\n * Usercentrics consent event detail structure.\n *\n * Fired as event.detail on the configured window event (e.g. 'ucEvent').\n * Contains both category-level (ucCategory) and service-level consent.\n */\nexport interface UsercentricsEventDetail {\n /** Always 'consent_status' for consent events */\n event: string;\n /** 'explicit' when user actively chose, 'implicit' for page-load defaults (casing may vary) */\n type: string;\n /** Action taken: 'onAcceptAllServices', 'onDenyAllServices', 'onUpdateServices' */\n action?: string;\n /** Category-level consent booleans (e.g. { marketing: true, functional: false }) */\n ucCategory?: Record<string, boolean | unknown>;\n /** Service-level consent as top-level keys (e.g. 'Google Analytics': true) */\n [service: string]: unknown;\n}\n\ndeclare global {\n interface WindowEventMap {\n ucEvent: CustomEvent<UsercentricsEventDetail>;\n UC_UI_CMP_EVENT: CustomEvent<UsercentricsV3CmpEventDetail>;\n }\n}\n\n/**\n * Usercentrics V2 service info shape returned by `UC_UI.getServicesBaseInfo()`.\n * Only the fields we use are typed - minimal surface, not a full V2 API mirror.\n */\nexport interface UsercentricsV2Service {\n /** Category slug: 'essential' | 'functional' | 'marketing' | custom */\n categorySlug: string;\n /** Consent state for this service */\n consent: {\n status: boolean;\n };\n}\n\n/**\n * Usercentrics V2 window API (`window.UC_UI`).\n *\n * Methods are synchronous (unlike V3). All methods are optional because\n * Usercentrics does not guarantee every deployment exposes every method.\n */\nexport interface UsercentricsV2Api {\n isInitialized?: () => boolean;\n getServicesBaseInfo?: () => UsercentricsV2Service[];\n areAllConsentsAccepted?: () => boolean;\n}\n\n/**\n * Usercentrics V3 category state. The SDK may add future states; we handle\n * unknowns conservatively as non-accepting.\n */\nexport type UsercentricsV3CategoryState =\n | 'ALL_ACCEPTED'\n | 'ALL_DENIED'\n | 'SOME_ACCEPTED'\n | 'NO_STATE'\n | string;\n\n/**\n * Minimal V3 CategoryData - only fields the adapter reads.\n */\nexport interface UsercentricsV3CategoryData {\n state: UsercentricsV3CategoryState;\n name: string;\n}\n\n/**\n * Minimal V3 ConsentData - only the `type` field is used to distinguish\n * explicit vs implicit consent. Other fields (status, version, etc.) exist on\n * the real SDK but are not read by this adapter.\n */\nexport interface UsercentricsV3ConsentData {\n type: 'EXPLICIT' | 'IMPLICIT' | string;\n}\n\n/**\n * Minimal V3 ConsentDetails - only the fields the adapter reads.\n * The real SDK also exposes `services`, but the adapter currently operates\n * at category level only.\n */\nexport interface UsercentricsV3ConsentDetails {\n consent: UsercentricsV3ConsentData;\n categories: Record<string, UsercentricsV3CategoryData>;\n}\n\n/**\n * Usercentrics V3 window API (`window.__ucCmp`).\n *\n * Only the methods this adapter calls are typed - the real SDK surface is\n * much wider but we intentionally keep this narrow.\n */\nexport interface UsercentricsV3Api {\n isInitialized: () => Promise<boolean>;\n getConsentDetails: () => Promise<UsercentricsV3ConsentDetails>;\n}\n\n/**\n * V3 CMP event detail. Fired on `UC_UI_CMP_EVENT` (or custom name).\n * `source: 'CMP'` + a decision `type` tells us a user action has been taken.\n */\nexport interface UsercentricsV3CmpEventDetail {\n source?: string;\n type?: string;\n}\n\ndeclare global {\n interface Window {\n /**\n * Usercentrics V2 CMP API. Attached once the V2 Browser SDK is\n * initialized. Optional because the SDK loads asynchronously - guard\n * with a truthiness check before access.\n */\n UC_UI?: UsercentricsV2Api;\n /**\n * Usercentrics V3 CMP API. Attached once the V3 Browser SDK is\n * initialized. Optional because the SDK loads asynchronously - guard\n * with a truthiness check before access.\n */\n __ucCmp?: UsercentricsV3Api;\n }\n}\n\n/**\n * Settings for Usercentrics source\n */\nexport interface Settings {\n /**\n * Window event name to listen for.\n * Configured in Usercentrics admin under Implementation > Data Layer & Events.\n * Can also be set to 'UC_SDK_EVENT' for the built-in Browser SDK event.\n *\n * Default: 'ucEvent'\n */\n eventName?: string;\n\n /**\n * Map Usercentrics categories to walkerOS consent groups.\n * Keys: Usercentrics category names (from ucCategory)\n * Values: walkerOS consent group names\n *\n * Applied in both group-level and service-level consent modes.\n * When multiple source categories map to the same group, strict AND logic\n * applies: ALL contributing source categories must be true for the target\n * group to be true. Any single false denies consent.\n *\n * Default: {} (pass through category names as-is)\n */\n categoryMap?: Record<string, string>;\n\n /**\n * Only process explicit consent (user made a choice).\n * When true: Ignores events where type !== 'explicit'\n * When false: Processes any consent_status event including implicit/defaults\n *\n * Default: true\n */\n explicitOnly?: boolean;\n\n /**\n * Which Usercentrics API to target.\n * - 'auto' (default): detect at init. If `window.__ucCmp` is present, use V3.\n * If only `window.UC_UI` is present, use V2. If neither is present yet,\n * register listeners for both so late-loading CMPs are still caught.\n * - 'v2': force legacy `window.UC_UI` path.\n * - 'v3': force current `window.__ucCmp` path.\n */\n apiVersion?: 'auto' | 'v2' | 'v3';\n\n /**\n * V3 window event name to listen for consent changes.\n *\n * Usercentrics V3 hardcodes its built-in event names (`UC_UI_CMP_EVENT`,\n * `UC_UI_INITIALIZED`, `UC_UI_VIEW_CHANGED`, `UC_CONSENT`) - they cannot be\n * renamed. However, the Usercentrics admin dashboard (Implementation >\n * Data Layer & Events) lets admins configure an ADDITIONAL custom window\n * event. Use this setting to point at that custom event name if\n * configured; otherwise leave as default.\n *\n * Default: 'UC_UI_CMP_EVENT'\n */\n v3EventName?: string;\n}\n\n/**\n * User input settings (all optional)\n */\nexport type InitSettings = Partial<Settings>;\n\n/**\n * No mapping configuration for this source\n */\nexport interface Mapping {}\n\n/**\n * Push function type - uses elb for consent commands\n */\nexport type Push = Elb.Fn;\n\n/**\n * Environment interface for Usercentrics source\n */\nexport interface Env extends Source.BaseEnv {\n window?: Window & typeof globalThis;\n}\n\n/**\n * Types bundle for Usercentrics source\n */\nexport type Types = Source.Types<Settings, Mapping, Push, Env, InitSettings>;\n\n/**\n * Config type alias\n */\nexport type Config = Source.Config<Types>;\n","import type { UsercentricsEventDetail } from '../types';\n\n/**\n * Example Usercentrics consent event detail inputs.\n *\n * These represent real event.detail payloads from Usercentrics CMP.\n */\n\n/**\n * Full consent - user accepted all categories (explicit)\n */\nexport const fullConsent: UsercentricsEventDetail = {\n event: 'consent_status',\n type: 'explicit',\n action: 'onAcceptAllServices',\n ucCategory: {\n essential: true,\n functional: true,\n marketing: true,\n },\n 'Google Analytics': true,\n 'Google Ads Remarketing': true,\n};\n\n/**\n * Partial consent - user accepted only essential and functional (explicit)\n */\nexport const partialConsent: UsercentricsEventDetail = {\n event: 'consent_status',\n type: 'explicit',\n action: 'onUpdateServices',\n ucCategory: {\n essential: true,\n functional: true,\n marketing: false,\n },\n 'Google Analytics': true,\n 'Google Ads Remarketing': false,\n};\n\n/**\n * Minimal consent - user denied everything except essential (explicit)\n */\nexport const minimalConsent: UsercentricsEventDetail = {\n event: 'consent_status',\n type: 'explicit',\n action: 'onDenyAllServices',\n ucCategory: {\n essential: true,\n functional: false,\n marketing: false,\n },\n 'Google Analytics': false,\n 'Google Ads Remarketing': false,\n};\n\n/**\n * Implicit consent - page load with default consent state\n * (not an explicit user choice)\n */\nexport const implicitConsent: UsercentricsEventDetail = {\n event: 'consent_status',\n type: 'implicit',\n ucCategory: {\n essential: true,\n functional: false,\n marketing: false,\n },\n 'Google Analytics': false,\n 'Google Ads Remarketing': false,\n};\n\n/**\n * Explicit consent with uppercase type field (Usercentrics docs are\n * inconsistent about casing - some show 'EXPLICIT', others 'explicit')\n */\nexport const fullConsentUpperCase: UsercentricsEventDetail = {\n event: 'consent_status',\n type: 'EXPLICIT',\n action: 'onAcceptAllServices',\n ucCategory: {\n essential: true,\n functional: true,\n marketing: true,\n },\n};\n\n/**\n * Service-level consent - ucCategory has mixed types (non-boolean values\n * indicate individual service-level choice rather than group-level)\n */\nexport const serviceLevelConsent: UsercentricsEventDetail = {\n event: 'consent_status',\n type: 'explicit',\n action: 'onUpdateServices',\n ucCategory: {\n essential: true,\n functional: 'partial', // Non-boolean indicates mixed service choices\n marketing: 'partial',\n },\n 'Google Analytics': true,\n 'Google Ads Remarketing': false,\n Hotjar: true,\n};\n\n/**\n * Non-consent event (should be ignored)\n */\nexport const nonConsentEvent: UsercentricsEventDetail = {\n event: 'other_event',\n type: 'explicit',\n};\n","import type { WalkerOS } from '@walkeros/core';\n\n/**\n * Expected walkerOS consent outputs.\n *\n * These represent the consent state after parsing Usercentrics event details\n * with no category mapping configured (pass-through).\n */\n\n/**\n * Full consent - all categories true (group-level)\n */\nexport const fullConsentMapped: WalkerOS.Consent = {\n essential: true,\n functional: true,\n marketing: true,\n};\n\n/**\n * Partial consent - essential and functional true, marketing false\n */\nexport const partialConsentMapped: WalkerOS.Consent = {\n essential: true,\n functional: true,\n marketing: false,\n};\n\n/**\n * Minimal consent - only essential true\n */\nexport const minimalConsentMapped: WalkerOS.Consent = {\n essential: true,\n functional: false,\n marketing: false,\n};\n\n/**\n * Full consent with custom category mapping applied\n * (essential->functional, functional->functional, marketing->marketing)\n */\nexport const fullConsentCustomMapped: WalkerOS.Consent = {\n functional: true,\n marketing: true,\n};\n\n/**\n * Service-level consent - individual service booleans + boolean ucCategory entries\n * (services normalized: lowercase, spaces to underscores)\n * (ucCategory boolean entries mapped through categoryMap)\n */\nexport const serviceLevelMapped: WalkerOS.Consent = {\n essential: true,\n google_analytics: true,\n google_ads_remarketing: false,\n hotjar: true,\n};\n","import type { Elb, Logger } from '@walkeros/core';\n\n/**\n * Example environment configurations for Usercentrics source testing.\n */\n\nconst noop = () => {};\n\n/**\n * Create a properly typed elb/push function mock\n */\nexport const createMockElbFn = (): Elb.Fn => {\n const fn = (() =>\n Promise.resolve({\n ok: true,\n })) as Elb.Fn;\n return fn;\n};\n\n/**\n * Simple no-op logger for demo purposes\n */\nexport const noopLogger: Logger.Instance = {\n error: noop,\n warn: noop,\n info: noop,\n debug: noop,\n throw: (message: string | Error) => {\n throw typeof message === 'string' ? new Error(message) : message;\n },\n json: noop,\n scope: () => noopLogger,\n};\n","import type { Flow } from '@walkeros/core';\n\nexport const fullConsent: Flow.StepExample = {\n title: 'Full consent',\n description:\n 'A Usercentrics onAcceptAllServices event emits a walker consent command with essential, functional, and marketing granted.',\n trigger: { type: 'consent' },\n in: {\n event: 'consent_status',\n type: 'explicit',\n action: 'onAcceptAllServices',\n ucCategory: {\n essential: true,\n functional: true,\n marketing: true,\n },\n },\n out: [\n [\n 'elb',\n 'walker consent',\n {\n essential: true,\n functional: true,\n marketing: true,\n },\n ],\n ],\n};\n\nexport const minimalConsent: Flow.StepExample = {\n title: 'Minimal consent',\n description:\n 'A Usercentrics onDenyAllServices event emits a walker consent command with only essential granted.',\n trigger: { type: 'consent' },\n in: {\n event: 'consent_status',\n type: 'explicit',\n action: 'onDenyAllServices',\n ucCategory: {\n essential: true,\n functional: false,\n marketing: false,\n },\n },\n out: [\n [\n 'elb',\n 'walker consent',\n {\n essential: true,\n functional: false,\n marketing: false,\n },\n ],\n ],\n};\n\nexport const categoryMapOverride: Flow.StepExample = {\n title: 'Category map override',\n description:\n 'Custom categoryMap remaps essential to functional and functional to analytics',\n trigger: { type: 'consent' },\n in: {\n event: 'consent_status',\n type: 'explicit',\n ucCategory: {\n essential: true,\n functional: true,\n marketing: false,\n },\n },\n mapping: {\n categoryMap: { essential: 'functional', functional: 'analytics' },\n },\n out: [\n [\n 'elb',\n 'walker consent',\n {\n functional: true,\n analytics: true,\n marketing: false,\n },\n ],\n ],\n};\n\nexport const customEventName: Flow.StepExample = {\n title: 'Custom event name',\n description: 'Using UC_SDK_EVENT instead of ucEvent for Usercentrics SDK v2',\n trigger: { type: 'consent', options: { eventName: 'UC_SDK_EVENT' } },\n in: {\n event: 'consent_status',\n type: 'explicit',\n ucCategory: {\n essential: true,\n functional: true,\n marketing: true,\n },\n },\n mapping: { eventName: 'UC_SDK_EVENT' },\n out: [\n [\n 'elb',\n 'walker consent',\n {\n essential: true,\n functional: true,\n marketing: true,\n },\n ],\n ],\n};\n","import type { Trigger, Collector } from '@walkeros/core';\nimport { startFlow } from '@walkeros/collector';\n\ninterface UsercentricsContent {\n event: string;\n type: string;\n action?: string;\n ucCategory?: Record<string, boolean | unknown>;\n [service: string]: unknown;\n}\n\nconst createTrigger: Trigger.CreateFn<UsercentricsContent, void> = async (\n config: Collector.InitConfig,\n) => {\n let flow: Trigger.FlowHandle | undefined;\n\n const trigger: Trigger.Fn<UsercentricsContent, void> =\n (type?: string, opts?: unknown) => async (content: UsercentricsContent) => {\n // Lazy startFlow — source registers ucEvent listener during init\n if (!flow) {\n const result = await startFlow({ ...config, run: config.run ?? true });\n flow = { collector: result.collector, elb: result.elb };\n }\n\n // Dispatch the CMP event — source's listener catches it\n const eventName =\n (opts as { eventName?: string })?.eventName || 'ucEvent';\n window.dispatchEvent(new CustomEvent(eventName, { detail: content }));\n };\n\n return {\n get flow() {\n return flow;\n },\n trigger,\n };\n};\n\n/** Dispatches ucEvent CustomEvent after source init (post-init trigger). */\nconst trigger = (\n input: unknown,\n env: Record<string, unknown>,\n): void | (() => void) => {\n if (!input || typeof input !== 'object') return;\n return () => {\n (env.window as Window).dispatchEvent(\n new CustomEvent('ucEvent', { detail: input }),\n );\n };\n};\n\nexport { createTrigger, trigger };\n"],"mappings":"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","names":["_a","cmp","fullConsent","minimalConsent","trigger"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/lib/parseConsent.ts","../src/lib/v2.ts","../src/lib/v3.ts","../src/types/index.ts"],"sourcesContent":["import type { Source } from '@walkeros/core';\nimport type { Types, Settings } from './types';\nimport { setupV2Adapter } from './lib/v2';\nimport { setupV3Adapter } from './lib/v3';\n\n// Export types for external usage\nexport * as SourceUsercentrics from './types';\n\n/**\n * Usercentrics consent management source for walkerOS.\n *\n * Listens to Usercentrics CMP events and translates consent states to\n * walkerOS consent commands. Supports both the legacy V2 API\n * (`window.UC_UI` + `ucEvent`) and the current V3 API\n * (`window.__ucCmp` + `UC_UI_CMP_EVENT`).\n *\n * @example\n * ```typescript\n * import { sourceUsercentrics } from '@walkeros/web-source-cmp-usercentrics';\n *\n * await startFlow({\n * sources: {\n * consent: {\n * code: sourceUsercentrics,\n * config: {\n * settings: {\n * eventName: 'ucEvent',\n * categoryMap: {\n * essential: 'functional',\n * functional: 'functional',\n * marketing: 'marketing',\n * },\n * },\n * },\n * },\n * },\n * });\n * ```\n */\nexport const sourceUsercentrics: Source.Init<Types> = async (context) => {\n const { config, env } = context;\n const { elb, logger } = env;\n\n // Resolve window with fallback to globalThis\n const actualWindow =\n env.window ??\n (typeof globalThis.window !== 'undefined' ? globalThis.window : undefined);\n\n // Merge user settings with defaults so adapters always see a fully-resolved Settings\n const settings: Settings = {\n eventName: config?.settings?.eventName ?? 'ucEvent',\n categoryMap: config?.settings?.categoryMap ?? {},\n explicitOnly: config?.settings?.explicitOnly ?? true,\n apiVersion: config?.settings?.apiVersion ?? 'auto',\n v3EventName: config?.settings?.v3EventName ?? 'UC_UI_CMP_EVENT',\n };\n\n const fullConfig: Source.Config<Types> = { settings };\n const cleanups: Array<() => void> = [];\n\n // Attach the CMP listeners and perform the static consent read. Deferred to\n // init() (Pass 2 of initSources) so the factory (Pass 1) stays side-effect\n // free: no listener registration and, critically, no `elb('walker consent')`\n // emit during construction. Emitting from the factory races source merge\n // order and can leave a later `require:[\"consent\"]` source parked.\n const init = async (): Promise<void> => {\n if (!actualWindow) return;\n\n const adapterCtx = { window: actualWindow, elb, settings, logger };\n const apiVersion = settings.apiVersion ?? 'auto';\n\n if (apiVersion === 'v2') {\n cleanups.push(setupV2Adapter(adapterCtx));\n } else if (apiVersion === 'v3') {\n cleanups.push(await setupV3Adapter(adapterCtx));\n } else {\n // auto: detect which API is present\n if (actualWindow.__ucCmp) {\n cleanups.push(await setupV3Adapter(adapterCtx));\n } else if (actualWindow.UC_UI) {\n cleanups.push(setupV2Adapter(adapterCtx));\n } else {\n // Neither loaded yet — attach both listeners so whichever loads later is caught.\n cleanups.push(setupV2Adapter(adapterCtx));\n cleanups.push(await setupV3Adapter(adapterCtx));\n }\n }\n };\n\n return {\n type: 'usercentrics',\n config: fullConfig,\n push: elb,\n init,\n destroy: async () => {\n cleanups.forEach((fn) => fn());\n },\n };\n};\n\nexport default sourceUsercentrics;\n","import type { WalkerOS } from '@walkeros/core';\nimport type { UsercentricsEventDetail, Settings } from '../types';\n\n/** Reserved keys in event.detail that are not service names */\nexport const RESERVED_KEYS = ['action', 'event', 'type', 'ucCategory'];\n\n/**\n * Determine if ucCategory represents group-level consent.\n * Group-level: all values are booleans.\n * Service-level: some values are non-boolean (e.g., 'partial').\n */\nexport function isGroupLevel(\n ucCategory: Record<string, boolean | unknown>,\n): boolean {\n return Object.values(ucCategory).every((val) => typeof val === 'boolean');\n}\n\n/**\n * Merge an incoming consent signal into the accumulating state using strict\n * AND semantics: absent key initialises from the incoming value; present key\n * becomes `true` only if both existing and incoming are `true`. Any single\n * `false` anywhere in the merge chain revokes consent for that key.\n *\n * This matches the consent rule of thumb: any deny signal denies. Permissive\n * (OR) and \"last-wins\" semantics are both unsafe for a privacy primitive.\n */\nfunction mergeConsent(\n state: WalkerOS.Consent,\n key: string,\n value: boolean,\n): void {\n state[key] = state[key] === undefined ? value : Boolean(state[key]) && value;\n}\n\n/**\n * Parse consent from Usercentrics event detail.\n *\n * Group-level: ucCategory values are all booleans → use them directly.\n * Service-level: ucCategory has non-booleans → mix boolean ucCategory entries\n * with top-level service keys from event.detail.\n *\n * categoryMap is applied in both modes to ucCategory boolean entries.\n * Strict AND: if multiple source categories map to the same target group,\n * the target is `true` only when ALL contributing sources are `true`.\n */\nexport function parseConsent(\n detail: UsercentricsEventDetail,\n settings: Settings,\n): WalkerOS.Consent {\n const state: WalkerOS.Consent = {};\n\n if (detail.ucCategory && isGroupLevel(detail.ucCategory)) {\n Object.entries(detail.ucCategory).forEach(([category, value]) => {\n if (typeof value !== 'boolean') return;\n const mapped = settings.categoryMap?.[category] ?? category;\n mergeConsent(state, mapped, value);\n });\n } else {\n if (detail.ucCategory) {\n Object.entries(detail.ucCategory).forEach(([key, value]) => {\n if (typeof value === 'boolean') {\n const mapped = settings.categoryMap?.[key] ?? key;\n mergeConsent(state, mapped, value);\n }\n });\n }\n\n Object.entries(detail).forEach(([key, value]) => {\n if (RESERVED_KEYS.includes(key)) return;\n if (typeof value !== 'boolean') return;\n const normalized = key.toLowerCase().replace(/ /g, '_');\n mergeConsent(state, normalized, value);\n });\n }\n\n return state;\n}\n","import type { Elb, Logger } from '@walkeros/core';\nimport type {\n Settings,\n UsercentricsEventDetail,\n UsercentricsV2Service,\n} from '../types';\nimport { parseConsent } from './parseConsent';\n\nexport interface V2AdapterContext {\n window: Window & typeof globalThis;\n elb: Elb.Fn;\n settings: Settings;\n logger: Logger.Instance;\n}\n\n/**\n * Aggregate V2 service array into a group-level ucCategory object using strict\n * AND logic. A category is `true` only if EVERY service in that category is\n * accepted. Any single denied service denies the whole category — this\n * matches the consent rule of thumb: any deny signal denies.\n */\nfunction aggregateByCategory(\n services: UsercentricsV2Service[],\n): Record<string, boolean> {\n const categories: Record<string, boolean> = {};\n services.forEach((service) => {\n const category = service.categorySlug;\n const status = service.consent?.status ?? false;\n categories[category] =\n categories[category] === undefined\n ? status\n : categories[category] && status;\n });\n return categories;\n}\n\n/**\n * Build a synthetic UsercentricsEventDetail from the V2 static API.\n * Marked as 'implicit' because UC_UI.isInitialized() === true does NOT prove\n * the read was user-initiated — it only proves the SDK has finished loading.\n * With settings.explicitOnly = true (the default), consumers correctly drop\n * this detail. Set explicitOnly = false to surface the static snapshot.\n */\nfunction buildDetailFromStatic(\n services: UsercentricsV2Service[],\n): UsercentricsEventDetail {\n return {\n event: 'consent_status',\n type: 'implicit',\n ucCategory: aggregateByCategory(services),\n };\n}\n\n/**\n * Set up the V2 adapter: listens on the configured event AND performs a\n * static read if UC_UI is already initialized.\n *\n * Returns a cleanup function that removes the event listener.\n */\nexport function setupV2Adapter(ctx: V2AdapterContext): () => void {\n const { window: win, elb, settings, logger } = ctx;\n const eventName = settings.eventName ?? 'ucEvent';\n\n const handleDetail = (detail: UsercentricsEventDetail) => {\n logger.debug('event received', detail);\n\n if (detail.event !== 'consent_status') return;\n if (settings.explicitOnly && detail.type?.toLowerCase() !== 'explicit')\n return;\n\n const state = parseConsent(detail, settings);\n if (Object.keys(state).length > 0) {\n elb('walker consent', state);\n }\n };\n\n const listener = (e: Event) => {\n const custom = e as CustomEvent<UsercentricsEventDetail>;\n if (custom.detail) handleDetail(custom.detail);\n };\n win.addEventListener(eventName, listener);\n\n // Static check: if UC_UI is already initialized, read current consent now.\n const api = win.UC_UI;\n if (api?.isInitialized?.() && api.getServicesBaseInfo) {\n const services = api.getServicesBaseInfo();\n if (services.length > 0) {\n handleDetail(buildDetailFromStatic(services));\n }\n }\n\n return () => {\n win.removeEventListener(eventName, listener);\n };\n}\n","import type { Elb, Logger } from '@walkeros/core';\nimport type {\n Settings,\n UsercentricsEventDetail,\n UsercentricsV3Api,\n UsercentricsV3CategoryState,\n UsercentricsV3CmpEventDetail,\n UsercentricsV3ConsentDetails,\n} from '../types';\nimport { parseConsent } from './parseConsent';\n\nexport interface V3AdapterContext {\n window: Window & typeof globalThis;\n elb: Elb.Fn;\n settings: Settings;\n logger: Logger.Instance;\n}\n\nconst V3_DEFAULT_EVENT_NAME = 'UC_UI_CMP_EVENT';\n\n/**\n * V3 CMP event types that represent a user consent decision. Presentation\n * events like `CMP_SHOWN` or `UI_INITIALIZED` must NOT trigger a consent\n * publish — they carry no user decision.\n */\nconst V3_DECISION_TYPES: ReadonlySet<string> = new Set([\n 'ACCEPT_ALL',\n 'DENY_ALL',\n 'SAVE',\n]);\n\n/**\n * Map a V3 CategoryData.state value to a walkerOS boolean using strict\n * semantics: only fully-accepted categories are `true`. Any partial or\n * denied state (including future/unknown states) resolves to `false`.\n *\n * This matches the consent rule of thumb: any deny signal denies.\n */\nfunction categoryStateToBoolean(state: UsercentricsV3CategoryState): boolean {\n return state === 'ALL_ACCEPTED';\n}\n\n/**\n * Build a synthetic UsercentricsEventDetail from V3 ConsentDetails.\n * Translates V3's structured consent state into the shape parseConsent expects.\n */\nfunction buildDetailFromV3(\n details: UsercentricsV3ConsentDetails,\n): UsercentricsEventDetail {\n const ucCategory: Record<string, boolean> = {};\n Object.entries(details.categories).forEach(([slug, category]) => {\n ucCategory[slug] = categoryStateToBoolean(category.state);\n });\n\n return {\n event: 'consent_status',\n type: details.consent.type === 'EXPLICIT' ? 'explicit' : 'implicit',\n ucCategory,\n };\n}\n\n/**\n * Set up the V3 adapter: registers a listener on the V3 consent event AND\n * (if __ucCmp is already initialized) performs a static read.\n *\n * Both paths re-fetch getConsentDetails() because the event payload does\n * not include consent state.\n *\n * Returns a cleanup function that removes the event listener.\n */\nexport async function setupV3Adapter(\n ctx: V3AdapterContext,\n): Promise<() => void> {\n const { window: win, elb, settings, logger } = ctx;\n const eventName = settings.v3EventName ?? V3_DEFAULT_EVENT_NAME;\n\n const publishConsent = async (cmp: UsercentricsV3Api): Promise<void> => {\n const details = await cmp.getConsentDetails();\n const detail = buildDetailFromV3(details);\n logger.debug('event received', detail);\n\n if (settings.explicitOnly && detail.type !== 'explicit') return;\n\n const state = parseConsent(detail, settings);\n if (Object.keys(state).length > 0) {\n elb('walker consent', state);\n }\n };\n\n const listener = (event: Event): void => {\n const cmp = win.__ucCmp;\n if (!cmp) return;\n const custom = event as CustomEvent<UsercentricsV3CmpEventDetail>;\n const detail = custom.detail;\n // Filter to decision events only: the CMP emits a broad set of events\n // (CMP_SHOWN, UI_INITIALIZED, VIEW_CHANGED, …) on this bus. Without\n // filtering, every view toggle would re-publish consent.\n if (!detail || detail.source !== 'CMP') return;\n if (!detail.type || !V3_DECISION_TYPES.has(detail.type)) return;\n publishConsent(cmp).catch(() => {\n // Swallow — a failed V3 fetch should not break the page.\n });\n };\n win.addEventListener(eventName, listener);\n\n // Static check: if __ucCmp is already initialized, fetch now.\n // Wrapped in try/catch so transient API failures during setup don't\n // reject setupV3Adapter() and tear down the whole flow — the listener\n // stays registered and will pick up the next real event.\n const cmp = win.__ucCmp;\n if (cmp) {\n try {\n const initialized = await cmp.isInitialized();\n if (initialized) {\n await publishConsent(cmp);\n }\n } catch (err) {\n logger.warn('v3 static consent read failed', err);\n }\n }\n\n return () => {\n win.removeEventListener(eventName, listener);\n };\n}\n","import type { Source, Elb } from '@walkeros/core';\n\ndeclare module '@walkeros/core' {\n interface SourceMap {\n usercentrics: { type: 'usercentrics'; platform?: 'web' };\n }\n}\n\n/**\n * Usercentrics consent event detail structure.\n *\n * Fired as event.detail on the configured window event (e.g. 'ucEvent').\n * Contains both category-level (ucCategory) and service-level consent.\n */\nexport interface UsercentricsEventDetail {\n /** Always 'consent_status' for consent events */\n event: string;\n /** 'explicit' when user actively chose, 'implicit' for page-load defaults (casing may vary) */\n type: string;\n /** Action taken: 'onAcceptAllServices', 'onDenyAllServices', 'onUpdateServices' */\n action?: string;\n /** Category-level consent booleans (e.g. { marketing: true, functional: false }) */\n ucCategory?: Record<string, boolean | unknown>;\n /** Service-level consent as top-level keys (e.g. 'Google Analytics': true) */\n [service: string]: unknown;\n}\n\ndeclare global {\n interface WindowEventMap {\n ucEvent: CustomEvent<UsercentricsEventDetail>;\n UC_UI_CMP_EVENT: CustomEvent<UsercentricsV3CmpEventDetail>;\n }\n}\n\n/**\n * Usercentrics V2 service info shape returned by `UC_UI.getServicesBaseInfo()`.\n * Only the fields we use are typed - minimal surface, not a full V2 API mirror.\n */\nexport interface UsercentricsV2Service {\n /** Category slug: 'essential' | 'functional' | 'marketing' | custom */\n categorySlug: string;\n /** Consent state for this service */\n consent: {\n status: boolean;\n };\n}\n\n/**\n * Usercentrics V2 window API (`window.UC_UI`).\n *\n * Methods are synchronous (unlike V3). All methods are optional because\n * Usercentrics does not guarantee every deployment exposes every method.\n */\nexport interface UsercentricsV2Api {\n isInitialized?: () => boolean;\n getServicesBaseInfo?: () => UsercentricsV2Service[];\n areAllConsentsAccepted?: () => boolean;\n}\n\n/**\n * Usercentrics V3 category state. The SDK may add future states; we handle\n * unknowns conservatively as non-accepting.\n */\nexport type UsercentricsV3CategoryState =\n | 'ALL_ACCEPTED'\n | 'ALL_DENIED'\n | 'SOME_ACCEPTED'\n | 'NO_STATE'\n | string;\n\n/**\n * Minimal V3 CategoryData - only fields the adapter reads.\n */\nexport interface UsercentricsV3CategoryData {\n state: UsercentricsV3CategoryState;\n name: string;\n}\n\n/**\n * Minimal V3 ConsentData - only the `type` field is used to distinguish\n * explicit vs implicit consent. Other fields (status, version, etc.) exist on\n * the real SDK but are not read by this adapter.\n */\nexport interface UsercentricsV3ConsentData {\n type: 'EXPLICIT' | 'IMPLICIT' | string;\n}\n\n/**\n * Minimal V3 ConsentDetails - only the fields the adapter reads.\n * The real SDK also exposes `services`, but the adapter currently operates\n * at category level only.\n */\nexport interface UsercentricsV3ConsentDetails {\n consent: UsercentricsV3ConsentData;\n categories: Record<string, UsercentricsV3CategoryData>;\n}\n\n/**\n * Usercentrics V3 window API (`window.__ucCmp`).\n *\n * Only the methods this adapter calls are typed - the real SDK surface is\n * much wider but we intentionally keep this narrow.\n */\nexport interface UsercentricsV3Api {\n isInitialized: () => Promise<boolean>;\n getConsentDetails: () => Promise<UsercentricsV3ConsentDetails>;\n}\n\n/**\n * V3 CMP event detail. Fired on `UC_UI_CMP_EVENT` (or custom name).\n * `source: 'CMP'` + a decision `type` tells us a user action has been taken.\n */\nexport interface UsercentricsV3CmpEventDetail {\n source?: string;\n type?: string;\n}\n\ndeclare global {\n interface Window {\n /**\n * Usercentrics V2 CMP API. Attached once the V2 Browser SDK is\n * initialized. Optional because the SDK loads asynchronously - guard\n * with a truthiness check before access.\n */\n UC_UI?: UsercentricsV2Api;\n /**\n * Usercentrics V3 CMP API. Attached once the V3 Browser SDK is\n * initialized. Optional because the SDK loads asynchronously - guard\n * with a truthiness check before access.\n */\n __ucCmp?: UsercentricsV3Api;\n }\n}\n\n/**\n * Settings for Usercentrics source\n */\nexport interface Settings {\n /**\n * Window event name to listen for.\n * Configured in Usercentrics admin under Implementation > Data Layer & Events.\n * Can also be set to 'UC_SDK_EVENT' for the built-in Browser SDK event.\n *\n * Default: 'ucEvent'\n */\n eventName?: string;\n\n /**\n * Map Usercentrics categories to walkerOS consent groups.\n * Keys: Usercentrics category names (from ucCategory)\n * Values: walkerOS consent group names\n *\n * Applied in both group-level and service-level consent modes.\n * When multiple source categories map to the same group, strict AND logic\n * applies: ALL contributing source categories must be true for the target\n * group to be true. Any single false denies consent.\n *\n * Default: {} (pass through category names as-is)\n */\n categoryMap?: Record<string, string>;\n\n /**\n * Only process explicit consent (user made a choice).\n * When true: Ignores events where type !== 'explicit'\n * When false: Processes any consent_status event including implicit/defaults\n *\n * Default: true\n */\n explicitOnly?: boolean;\n\n /**\n * Which Usercentrics API to target.\n * - 'auto' (default): detect at init. If `window.__ucCmp` is present, use V3.\n * If only `window.UC_UI` is present, use V2. If neither is present yet,\n * register listeners for both so late-loading CMPs are still caught.\n * - 'v2': force legacy `window.UC_UI` path.\n * - 'v3': force current `window.__ucCmp` path.\n */\n apiVersion?: 'auto' | 'v2' | 'v3';\n\n /**\n * V3 window event name to listen for consent changes.\n *\n * Usercentrics V3 hardcodes its built-in event names (`UC_UI_CMP_EVENT`,\n * `UC_UI_INITIALIZED`, `UC_UI_VIEW_CHANGED`, `UC_CONSENT`) - they cannot be\n * renamed. However, the Usercentrics admin dashboard (Implementation >\n * Data Layer & Events) lets admins configure an ADDITIONAL custom window\n * event. Use this setting to point at that custom event name if\n * configured; otherwise leave as default.\n *\n * Default: 'UC_UI_CMP_EVENT'\n */\n v3EventName?: string;\n}\n\n/**\n * User input settings (all optional)\n */\nexport type InitSettings = Partial<Settings>;\n\n/**\n * No mapping configuration for this source\n */\nexport interface Mapping {}\n\n/**\n * Push function type - uses elb for consent commands\n */\nexport type Push = Elb.Fn;\n\n/**\n * Environment interface for Usercentrics source\n */\nexport interface Env extends Source.BaseEnv {\n window?: Window & typeof globalThis;\n}\n\n/**\n * Types bundle for Usercentrics source\n */\nexport type Types = Source.Types<Settings, Mapping, Push, Env, InitSettings>;\n\n/**\n * Config type alias\n */\nexport type Config = Source.Config<Types>;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACIO,IAAM,gBAAgB,CAAC,UAAU,SAAS,QAAQ,YAAY;AAO9D,SAAS,aACd,YACS;AACT,SAAO,OAAO,OAAO,UAAU,EAAE,MAAM,CAAC,QAAQ,OAAO,QAAQ,SAAS;AAC1E;AAWA,SAAS,aACP,OACA,KACA,OACM;AACN,QAAM,GAAG,IAAI,MAAM,GAAG,MAAM,SAAY,QAAQ,QAAQ,MAAM,GAAG,CAAC,KAAK;AACzE;AAaO,SAAS,aACd,QACA,UACkB;AAClB,QAAM,QAA0B,CAAC;AAEjC,MAAI,OAAO,cAAc,aAAa,OAAO,UAAU,GAAG;AACxD,WAAO,QAAQ,OAAO,UAAU,EAAE,QAAQ,CAAC,CAAC,UAAU,KAAK,MAAM;AApDrE;AAqDM,UAAI,OAAO,UAAU,UAAW;AAChC,YAAM,UAAS,oBAAS,gBAAT,mBAAuB,cAAvB,YAAoC;AACnD,mBAAa,OAAO,QAAQ,KAAK;AAAA,IACnC,CAAC;AAAA,EACH,OAAO;AACL,QAAI,OAAO,YAAY;AACrB,aAAO,QAAQ,OAAO,UAAU,EAAE,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM;AA3DlE;AA4DQ,YAAI,OAAO,UAAU,WAAW;AAC9B,gBAAM,UAAS,oBAAS,gBAAT,mBAAuB,SAAvB,YAA+B;AAC9C,uBAAa,OAAO,QAAQ,KAAK;AAAA,QACnC;AAAA,MACF,CAAC;AAAA,IACH;AAEA,WAAO,QAAQ,MAAM,EAAE,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM;AAC/C,UAAI,cAAc,SAAS,GAAG,EAAG;AACjC,UAAI,OAAO,UAAU,UAAW;AAChC,YAAM,aAAa,IAAI,YAAY,EAAE,QAAQ,MAAM,GAAG;AACtD,mBAAa,OAAO,YAAY,KAAK;AAAA,IACvC,CAAC;AAAA,EACH;AAEA,SAAO;AACT;;;ACvDA,SAAS,oBACP,UACyB;AACzB,QAAM,aAAsC,CAAC;AAC7C,WAAS,QAAQ,CAAC,YAAY;AAzBhC;AA0BI,UAAM,WAAW,QAAQ;AACzB,UAAM,UAAS,mBAAQ,YAAR,mBAAiB,WAAjB,YAA2B;AAC1C,eAAW,QAAQ,IACjB,WAAW,QAAQ,MAAM,SACrB,SACA,WAAW,QAAQ,KAAK;AAAA,EAChC,CAAC;AACD,SAAO;AACT;AASA,SAAS,sBACP,UACyB;AACzB,SAAO;AAAA,IACL,OAAO;AAAA,IACP,MAAM;AAAA,IACN,YAAY,oBAAoB,QAAQ;AAAA,EAC1C;AACF;AAQO,SAAS,eAAe,KAAmC;AA3DlE;AA4DE,QAAM,EAAE,QAAQ,KAAK,KAAK,UAAU,OAAO,IAAI;AAC/C,QAAM,aAAY,cAAS,cAAT,YAAsB;AAExC,QAAM,eAAe,CAAC,WAAoC;AA/D5D,QAAAA;AAgEI,WAAO,MAAM,kBAAkB,MAAM;AAErC,QAAI,OAAO,UAAU,iBAAkB;AACvC,QAAI,SAAS,kBAAgBA,MAAA,OAAO,SAAP,gBAAAA,IAAa,mBAAkB;AAC1D;AAEF,UAAM,QAAQ,aAAa,QAAQ,QAAQ;AAC3C,QAAI,OAAO,KAAK,KAAK,EAAE,SAAS,GAAG;AACjC,UAAI,kBAAkB,KAAK;AAAA,IAC7B;AAAA,EACF;AAEA,QAAM,WAAW,CAAC,MAAa;AAC7B,UAAM,SAAS;AACf,QAAI,OAAO,OAAQ,cAAa,OAAO,MAAM;AAAA,EAC/C;AACA,MAAI,iBAAiB,WAAW,QAAQ;AAGxC,QAAM,MAAM,IAAI;AAChB,QAAI,gCAAK,kBAAL,iCAA0B,IAAI,qBAAqB;AACrD,UAAM,WAAW,IAAI,oBAAoB;AACzC,QAAI,SAAS,SAAS,GAAG;AACvB,mBAAa,sBAAsB,QAAQ,CAAC;AAAA,IAC9C;AAAA,EACF;AAEA,SAAO,MAAM;AACX,QAAI,oBAAoB,WAAW,QAAQ;AAAA,EAC7C;AACF;;;AC5EA,IAAM,wBAAwB;AAO9B,IAAM,oBAAyC,oBAAI,IAAI;AAAA,EACrD;AAAA,EACA;AAAA,EACA;AACF,CAAC;AASD,SAAS,uBAAuB,OAA6C;AAC3E,SAAO,UAAU;AACnB;AAMA,SAAS,kBACP,SACyB;AACzB,QAAM,aAAsC,CAAC;AAC7C,SAAO,QAAQ,QAAQ,UAAU,EAAE,QAAQ,CAAC,CAAC,MAAM,QAAQ,MAAM;AAC/D,eAAW,IAAI,IAAI,uBAAuB,SAAS,KAAK;AAAA,EAC1D,CAAC;AAED,SAAO;AAAA,IACL,OAAO;AAAA,IACP,MAAM,QAAQ,QAAQ,SAAS,aAAa,aAAa;AAAA,IACzD;AAAA,EACF;AACF;AAWA,eAAsB,eACpB,KACqB;AAxEvB;AAyEE,QAAM,EAAE,QAAQ,KAAK,KAAK,UAAU,OAAO,IAAI;AAC/C,QAAM,aAAY,cAAS,gBAAT,YAAwB;AAE1C,QAAM,iBAAiB,OAAOC,SAA0C;AACtE,UAAM,UAAU,MAAMA,KAAI,kBAAkB;AAC5C,UAAM,SAAS,kBAAkB,OAAO;AACxC,WAAO,MAAM,kBAAkB,MAAM;AAErC,QAAI,SAAS,gBAAgB,OAAO,SAAS,WAAY;AAEzD,UAAM,QAAQ,aAAa,QAAQ,QAAQ;AAC3C,QAAI,OAAO,KAAK,KAAK,EAAE,SAAS,GAAG;AACjC,UAAI,kBAAkB,KAAK;AAAA,IAC7B;AAAA,EACF;AAEA,QAAM,WAAW,CAAC,UAAuB;AACvC,UAAMA,OAAM,IAAI;AAChB,QAAI,CAACA,KAAK;AACV,UAAM,SAAS;AACf,UAAM,SAAS,OAAO;AAItB,QAAI,CAAC,UAAU,OAAO,WAAW,MAAO;AACxC,QAAI,CAAC,OAAO,QAAQ,CAAC,kBAAkB,IAAI,OAAO,IAAI,EAAG;AACzD,mBAAeA,IAAG,EAAE,MAAM,MAAM;AAAA,IAEhC,CAAC;AAAA,EACH;AACA,MAAI,iBAAiB,WAAW,QAAQ;AAMxC,QAAM,MAAM,IAAI;AAChB,MAAI,KAAK;AACP,QAAI;AACF,YAAM,cAAc,MAAM,IAAI,cAAc;AAC5C,UAAI,aAAa;AACf,cAAM,eAAe,GAAG;AAAA,MAC1B;AAAA,IACF,SAAS,KAAK;AACZ,aAAO,KAAK,iCAAiC,GAAG;AAAA,IAClD;AAAA,EACF;AAEA,SAAO,MAAM;AACX,QAAI,oBAAoB,WAAW,QAAQ;AAAA,EAC7C;AACF;;;AC5HA;;;AJuCO,IAAM,qBAAyC,OAAO,YAAY;AAvCzE;AAwCE,QAAM,EAAE,QAAQ,IAAI,IAAI;AACxB,QAAM,EAAE,KAAK,OAAO,IAAI;AAGxB,QAAM,gBACJ,SAAI,WAAJ,YACC,OAAO,WAAW,WAAW,cAAc,WAAW,SAAS;AAGlE,QAAM,WAAqB;AAAA,IACzB,YAAW,4CAAQ,aAAR,mBAAkB,cAAlB,YAA+B;AAAA,IAC1C,cAAa,4CAAQ,aAAR,mBAAkB,gBAAlB,YAAiC,CAAC;AAAA,IAC/C,eAAc,4CAAQ,aAAR,mBAAkB,iBAAlB,YAAkC;AAAA,IAChD,aAAY,4CAAQ,aAAR,mBAAkB,eAAlB,YAAgC;AAAA,IAC5C,cAAa,4CAAQ,aAAR,mBAAkB,gBAAlB,YAAiC;AAAA,EAChD;AAEA,QAAM,aAAmC,EAAE,SAAS;AACpD,QAAM,WAA8B,CAAC;AAOrC,QAAM,OAAO,YAA2B;AAjE1C,QAAAC;AAkEI,QAAI,CAAC,aAAc;AAEnB,UAAM,aAAa,EAAE,QAAQ,cAAc,KAAK,UAAU,OAAO;AACjE,UAAM,cAAaA,MAAA,SAAS,eAAT,OAAAA,MAAuB;AAE1C,QAAI,eAAe,MAAM;AACvB,eAAS,KAAK,eAAe,UAAU,CAAC;AAAA,IAC1C,WAAW,eAAe,MAAM;AAC9B,eAAS,KAAK,MAAM,eAAe,UAAU,CAAC;AAAA,IAChD,OAAO;AAEL,UAAI,aAAa,SAAS;AACxB,iBAAS,KAAK,MAAM,eAAe,UAAU,CAAC;AAAA,MAChD,WAAW,aAAa,OAAO;AAC7B,iBAAS,KAAK,eAAe,UAAU,CAAC;AAAA,MAC1C,OAAO;AAEL,iBAAS,KAAK,eAAe,UAAU,CAAC;AACxC,iBAAS,KAAK,MAAM,eAAe,UAAU,CAAC;AAAA,MAChD;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,MAAM;AAAA,IACN;AAAA,IACA,SAAS,YAAY;AACnB,eAAS,QAAQ,CAAC,OAAO,GAAG,CAAC;AAAA,IAC/B;AAAA,EACF;AACF;AAEA,IAAO,gBAAQ;","names":["_a","cmp","_a"]}
package/dist/index.mjs CHANGED
@@ -1 +1 @@
1
- var e=Object.defineProperty,t=["action","event","type","ucCategory"];function n(e,t,n){e[t]=(void 0===e[t]||Boolean(e[t]))&&n}function i(e,i){const o={};var a;return e.ucCategory&&(a=e.ucCategory,Object.values(a).every(e=>"boolean"==typeof e))?Object.entries(e.ucCategory).forEach(([e,t])=>{var a,s;if("boolean"!=typeof t)return;const l=null!=(s=null==(a=i.categoryMap)?void 0:a[e])?s:e;n(o,l,t)}):(e.ucCategory&&Object.entries(e.ucCategory).forEach(([e,t])=>{var a,s;if("boolean"==typeof t){const l=null!=(s=null==(a=i.categoryMap)?void 0:a[e])?s:e;n(o,l,t)}}),Object.entries(e).forEach(([e,i])=>{if(t.includes(e))return;if("boolean"!=typeof i)return;const a=e.toLowerCase().replace(/ /g,"_");n(o,a,i)})),o}function o(e){const t={};return e.forEach(e=>{var n,i;const o=e.categorySlug,a=null!=(i=null==(n=e.consent)?void 0:n.status)&&i;t[o]=(void 0===t[o]||t[o])&&a}),t}function a(e){var t,n;const{window:a,elb:s,settings:l,logger:c}=e,r=null!=(t=l.eventName)?t:"ucEvent",u=e=>{var t;if(c.debug("event received",e),"consent_status"!==e.event)return;if(l.explicitOnly&&"explicit"!==(null==(t=e.type)?void 0:t.toLowerCase()))return;const n=i(e,l);Object.keys(n).length>0&&s("walker consent",n)},g=e=>{const t=e;t.detail&&u(t.detail)};a.addEventListener(r,g);const v=a.UC_UI;if((null==(n=null==v?void 0:v.isInitialized)?void 0:n.call(v))&&v.getServicesBaseInfo){const e=v.getServicesBaseInfo();e.length>0&&u(function(e){return{event:"consent_status",type:"implicit",ucCategory:o(e)}}(e))}return()=>{a.removeEventListener(r,g)}}var s=new Set(["ACCEPT_ALL","DENY_ALL","SAVE"]);async function l(e){var t;const{window:n,elb:o,settings:a,logger:l}=e,c=null!=(t=a.v3EventName)?t:"UC_UI_CMP_EVENT",r=async e=>{const t=function(e){const t={};return Object.entries(e.categories).forEach(([e,n])=>{t[e]="ALL_ACCEPTED"===n.state}),{event:"consent_status",type:"EXPLICIT"===e.consent.type?"explicit":"implicit",ucCategory:t}}(await e.getConsentDetails());if(l.debug("event received",t),a.explicitOnly&&"explicit"!==t.type)return;const n=i(t,a);Object.keys(n).length>0&&o("walker consent",n)},u=e=>{const t=n.__ucCmp;if(!t)return;const i=e.detail;i&&"CMP"===i.source&&i.type&&s.has(i.type)&&r(t).catch(()=>{})};n.addEventListener(c,u);const g=n.__ucCmp;if(g)try{await g.isInitialized()&&await r(g)}catch(e){l.warn("v3 static consent read failed",e)}return()=>{n.removeEventListener(c,u)}}var c={},r={event:"consent_status",type:"explicit",action:"onAcceptAllServices",ucCategory:{essential:!0,functional:!0,marketing:!0},"Google Analytics":!0,"Google Ads Remarketing":!0},u={event:"consent_status",type:"explicit",action:"onUpdateServices",ucCategory:{essential:!0,functional:!0,marketing:!1},"Google Analytics":!0,"Google Ads Remarketing":!1},g={event:"consent_status",type:"explicit",action:"onDenyAllServices",ucCategory:{essential:!0,functional:!1,marketing:!1},"Google Analytics":!1,"Google Ads Remarketing":!1},v={event:"consent_status",type:"implicit",ucCategory:{essential:!0,functional:!1,marketing:!1},"Google Analytics":!1,"Google Ads Remarketing":!1},p={event:"consent_status",type:"EXPLICIT",action:"onAcceptAllServices",ucCategory:{essential:!0,functional:!0,marketing:!0}},y={event:"consent_status",type:"explicit",action:"onUpdateServices",ucCategory:{essential:!0,functional:"partial",marketing:"partial"},"Google Analytics":!0,"Google Ads Remarketing":!1,Hotjar:!0},d={event:"other_event",type:"explicit"},f={essential:!0,functional:!0,marketing:!0},m={essential:!0,functional:!0,marketing:!1},C={essential:!0,functional:!1,marketing:!1},w={functional:!0,marketing:!0},E={essential:!0,google_analytics:!0,google_ads_remarketing:!1,hotjar:!0},_=()=>{},k=()=>()=>Promise.resolve({ok:!0}),b={error:_,warn:_,info:_,debug:_,throw:e=>{throw"string"==typeof e?new Error(e):e},json:_,scope:()=>b},A={};((t,n)=>{for(var i in n)e(t,i,{get:n[i],enumerable:!0})})(A,{categoryMapOverride:()=>U,customEventName:()=>x,fullConsent:()=>h,minimalConsent:()=>S});var h={title:"Full consent",description:"A Usercentrics onAcceptAllServices event emits a walker consent command with essential, functional, and marketing granted.",trigger:{type:"consent"},in:{event:"consent_status",type:"explicit",action:"onAcceptAllServices",ucCategory:{essential:!0,functional:!0,marketing:!0}},out:[["elb","walker consent",{essential:!0,functional:!0,marketing:!0}]]},S={title:"Minimal consent",description:"A Usercentrics onDenyAllServices event emits a walker consent command with only essential granted.",trigger:{type:"consent"},in:{event:"consent_status",type:"explicit",action:"onDenyAllServices",ucCategory:{essential:!0,functional:!1,marketing:!1}},out:[["elb","walker consent",{essential:!0,functional:!1,marketing:!1}]]},U={title:"Category map override",description:"Custom categoryMap remaps essential to functional and functional to analytics",trigger:{type:"consent"},in:{event:"consent_status",type:"explicit",ucCategory:{essential:!0,functional:!0,marketing:!1}},mapping:{categoryMap:{essential:"functional",functional:"analytics"}},out:[["elb","walker consent",{functional:!0,analytics:!0,marketing:!1}]]},x={title:"Custom event name",description:"Using UC_SDK_EVENT instead of ucEvent for Usercentrics SDK v2",trigger:{type:"consent",options:{eventName:"UC_SDK_EVENT"}},in:{event:"consent_status",type:"explicit",ucCategory:{essential:!0,functional:!0,marketing:!0}},mapping:{eventName:"UC_SDK_EVENT"},out:[["elb","walker consent",{essential:!0,functional:!0,marketing:!0}]]};import{startFlow as N}from"@walkeros/collector";var L=async e=>{let t;return{get flow(){return t},trigger:(n,i)=>async n=>{var o;if(!t){const n=await N({...e,run:null==(o=e.run)||o});t={collector:n.collector,elb:n.elb}}const a=(null==i?void 0:i.eventName)||"ucEvent";window.dispatchEvent(new CustomEvent(a,{detail:n}))}}},O=(e,t)=>{if(e&&"object"==typeof e)return()=>{t.window.dispatchEvent(new CustomEvent("ucEvent",{detail:e}))}},j=async e=>{var t,n,i,o,s,c,r,u,g,v,p,y;const{config:d,env:f}=e,{elb:m,logger:C}=f,w=null!=(t=f.window)?t:void 0!==globalThis.window?globalThis.window:void 0,E={eventName:null!=(i=null==(n=null==d?void 0:d.settings)?void 0:n.eventName)?i:"ucEvent",categoryMap:null!=(s=null==(o=null==d?void 0:d.settings)?void 0:o.categoryMap)?s:{},explicitOnly:null==(r=null==(c=null==d?void 0:d.settings)?void 0:c.explicitOnly)||r,apiVersion:null!=(g=null==(u=null==d?void 0:d.settings)?void 0:u.apiVersion)?g:"auto",v3EventName:null!=(p=null==(v=null==d?void 0:d.settings)?void 0:v.v3EventName)?p:"UC_UI_CMP_EVENT"},_={settings:E},k=[];if(w){const e={window:w,elb:m,settings:E,logger:C},t=null!=(y=E.apiVersion)?y:"auto";"v2"===t?k.push(a(e)):"v3"===t||w.__ucCmp?k.push(await l(e)):w.UC_UI?k.push(a(e)):(k.push(a(e)),k.push(await l(e)))}return{type:"usercentrics",config:_,push:m,destroy:async()=>{k.forEach(e=>e())}}},I=j;export{c as SourceUsercentrics,k as createMockElbFn,L as createTrigger,I as default,r as fullConsent,w as fullConsentCustomMapped,f as fullConsentMapped,p as fullConsentUpperCase,v as implicitConsent,g as minimalConsent,C as minimalConsentMapped,d as nonConsentEvent,b as noopLogger,u as partialConsent,m as partialConsentMapped,y as serviceLevelConsent,E as serviceLevelMapped,j as sourceUsercentrics,A as step,O as trigger};//# sourceMappingURL=index.mjs.map
1
+ var e=["action","event","type","ucCategory"];function t(e,t,n){e[t]=(void 0===e[t]||Boolean(e[t]))&&n}function n(n,o){const i={};var l;return n.ucCategory&&(l=n.ucCategory,Object.values(l).every(e=>"boolean"==typeof e))?Object.entries(n.ucCategory).forEach(([e,n])=>{var l,s;if("boolean"!=typeof n)return;const a=null!=(s=null==(l=o.categoryMap)?void 0:l[e])?s:e;t(i,a,n)}):(n.ucCategory&&Object.entries(n.ucCategory).forEach(([e,n])=>{var l,s;if("boolean"==typeof n){const a=null!=(s=null==(l=o.categoryMap)?void 0:l[e])?s:e;t(i,a,n)}}),Object.entries(n).forEach(([n,o])=>{if(e.includes(n))return;if("boolean"!=typeof o)return;const l=n.toLowerCase().replace(/ /g,"_");t(i,l,o)})),i}function o(e){const t={};return e.forEach(e=>{var n,o;const i=e.categorySlug,l=null!=(o=null==(n=e.consent)?void 0:n.status)&&o;t[i]=(void 0===t[i]||t[i])&&l}),t}function i(e){var t,i;const{window:l,elb:s,settings:a,logger:c}=e,r=null!=(t=a.eventName)?t:"ucEvent",u=e=>{var t;if(c.debug("event received",e),"consent_status"!==e.event)return;if(a.explicitOnly&&"explicit"!==(null==(t=e.type)?void 0:t.toLowerCase()))return;const o=n(e,a);Object.keys(o).length>0&&s("walker consent",o)},v=e=>{const t=e;t.detail&&u(t.detail)};l.addEventListener(r,v);const g=l.UC_UI;if((null==(i=null==g?void 0:g.isInitialized)?void 0:i.call(g))&&g.getServicesBaseInfo){const e=g.getServicesBaseInfo();e.length>0&&u(function(e){return{event:"consent_status",type:"implicit",ucCategory:o(e)}}(e))}return()=>{l.removeEventListener(r,v)}}var l=new Set(["ACCEPT_ALL","DENY_ALL","SAVE"]);async function s(e){var t;const{window:o,elb:i,settings:s,logger:a}=e,c=null!=(t=s.v3EventName)?t:"UC_UI_CMP_EVENT",r=async e=>{const t=function(e){const t={};return Object.entries(e.categories).forEach(([e,n])=>{t[e]="ALL_ACCEPTED"===n.state}),{event:"consent_status",type:"EXPLICIT"===e.consent.type?"explicit":"implicit",ucCategory:t}}(await e.getConsentDetails());if(a.debug("event received",t),s.explicitOnly&&"explicit"!==t.type)return;const o=n(t,s);Object.keys(o).length>0&&i("walker consent",o)},u=e=>{const t=o.__ucCmp;if(!t)return;const n=e.detail;n&&"CMP"===n.source&&n.type&&l.has(n.type)&&r(t).catch(()=>{})};o.addEventListener(c,u);const v=o.__ucCmp;if(v)try{await v.isInitialized()&&await r(v)}catch(e){a.warn("v3 static consent read failed",e)}return()=>{o.removeEventListener(c,u)}}var a={},c=async e=>{var t,n,o,l,a,c,r,u,v,g,d;const{config:p,env:y}=e,{elb:f,logger:C}=y,E=null!=(t=y.window)?t:void 0!==globalThis.window?globalThis.window:void 0,w={eventName:null!=(o=null==(n=null==p?void 0:p.settings)?void 0:n.eventName)?o:"ucEvent",categoryMap:null!=(a=null==(l=null==p?void 0:p.settings)?void 0:l.categoryMap)?a:{},explicitOnly:null==(r=null==(c=null==p?void 0:p.settings)?void 0:c.explicitOnly)||r,apiVersion:null!=(v=null==(u=null==p?void 0:p.settings)?void 0:u.apiVersion)?v:"auto",v3EventName:null!=(d=null==(g=null==p?void 0:p.settings)?void 0:g.v3EventName)?d:"UC_UI_CMP_EVENT"},_=[];return{type:"usercentrics",config:{settings:w},push:f,init:async()=>{var e;if(!E)return;const t={window:E,elb:f,settings:w,logger:C},n=null!=(e=w.apiVersion)?e:"auto";"v2"===n?_.push(i(t)):"v3"===n||E.__ucCmp?_.push(await s(t)):E.UC_UI?_.push(i(t)):(_.push(i(t)),_.push(await s(t)))},destroy:async()=>{_.forEach(e=>e())}}},r=c;export{a as SourceUsercentrics,r as default,c as sourceUsercentrics};//# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/lib/parseConsent.ts","../src/lib/v2.ts","../src/lib/v3.ts","../src/types/index.ts","../src/examples/inputs.ts","../src/examples/outputs.ts","../src/examples/env.ts","../src/examples/step.ts","../src/examples/trigger.ts","../src/index.ts"],"sourcesContent":["import type { WalkerOS } from '@walkeros/core';\nimport type { UsercentricsEventDetail, Settings } from '../types';\n\n/** Reserved keys in event.detail that are not service names */\nexport const RESERVED_KEYS = ['action', 'event', 'type', 'ucCategory'];\n\n/**\n * Determine if ucCategory represents group-level consent.\n * Group-level: all values are booleans.\n * Service-level: some values are non-boolean (e.g., 'partial').\n */\nexport function isGroupLevel(\n ucCategory: Record<string, boolean | unknown>,\n): boolean {\n return Object.values(ucCategory).every((val) => typeof val === 'boolean');\n}\n\n/**\n * Merge an incoming consent signal into the accumulating state using strict\n * AND semantics: absent key initialises from the incoming value; present key\n * becomes `true` only if both existing and incoming are `true`. Any single\n * `false` anywhere in the merge chain revokes consent for that key.\n *\n * This matches the consent rule of thumb: any deny signal denies. Permissive\n * (OR) and \"last-wins\" semantics are both unsafe for a privacy primitive.\n */\nfunction mergeConsent(\n state: WalkerOS.Consent,\n key: string,\n value: boolean,\n): void {\n state[key] = state[key] === undefined ? value : Boolean(state[key]) && value;\n}\n\n/**\n * Parse consent from Usercentrics event detail.\n *\n * Group-level: ucCategory values are all booleans → use them directly.\n * Service-level: ucCategory has non-booleans → mix boolean ucCategory entries\n * with top-level service keys from event.detail.\n *\n * categoryMap is applied in both modes to ucCategory boolean entries.\n * Strict AND: if multiple source categories map to the same target group,\n * the target is `true` only when ALL contributing sources are `true`.\n */\nexport function parseConsent(\n detail: UsercentricsEventDetail,\n settings: Settings,\n): WalkerOS.Consent {\n const state: WalkerOS.Consent = {};\n\n if (detail.ucCategory && isGroupLevel(detail.ucCategory)) {\n Object.entries(detail.ucCategory).forEach(([category, value]) => {\n if (typeof value !== 'boolean') return;\n const mapped = settings.categoryMap?.[category] ?? category;\n mergeConsent(state, mapped, value);\n });\n } else {\n if (detail.ucCategory) {\n Object.entries(detail.ucCategory).forEach(([key, value]) => {\n if (typeof value === 'boolean') {\n const mapped = settings.categoryMap?.[key] ?? key;\n mergeConsent(state, mapped, value);\n }\n });\n }\n\n Object.entries(detail).forEach(([key, value]) => {\n if (RESERVED_KEYS.includes(key)) return;\n if (typeof value !== 'boolean') return;\n const normalized = key.toLowerCase().replace(/ /g, '_');\n mergeConsent(state, normalized, value);\n });\n }\n\n return state;\n}\n","import type { Elb, Logger } from '@walkeros/core';\nimport type {\n Settings,\n UsercentricsEventDetail,\n UsercentricsV2Service,\n} from '../types';\nimport { parseConsent } from './parseConsent';\n\nexport interface V2AdapterContext {\n window: Window & typeof globalThis;\n elb: Elb.Fn;\n settings: Settings;\n logger: Logger.Instance;\n}\n\n/**\n * Aggregate V2 service array into a group-level ucCategory object using strict\n * AND logic. A category is `true` only if EVERY service in that category is\n * accepted. Any single denied service denies the whole category — this\n * matches the consent rule of thumb: any deny signal denies.\n */\nfunction aggregateByCategory(\n services: UsercentricsV2Service[],\n): Record<string, boolean> {\n const categories: Record<string, boolean> = {};\n services.forEach((service) => {\n const category = service.categorySlug;\n const status = service.consent?.status ?? false;\n categories[category] =\n categories[category] === undefined\n ? status\n : categories[category] && status;\n });\n return categories;\n}\n\n/**\n * Build a synthetic UsercentricsEventDetail from the V2 static API.\n * Marked as 'implicit' because UC_UI.isInitialized() === true does NOT prove\n * the read was user-initiated — it only proves the SDK has finished loading.\n * With settings.explicitOnly = true (the default), consumers correctly drop\n * this detail. Set explicitOnly = false to surface the static snapshot.\n */\nfunction buildDetailFromStatic(\n services: UsercentricsV2Service[],\n): UsercentricsEventDetail {\n return {\n event: 'consent_status',\n type: 'implicit',\n ucCategory: aggregateByCategory(services),\n };\n}\n\n/**\n * Set up the V2 adapter: listens on the configured event AND performs a\n * static read if UC_UI is already initialized.\n *\n * Returns a cleanup function that removes the event listener.\n */\nexport function setupV2Adapter(ctx: V2AdapterContext): () => void {\n const { window: win, elb, settings, logger } = ctx;\n const eventName = settings.eventName ?? 'ucEvent';\n\n const handleDetail = (detail: UsercentricsEventDetail) => {\n logger.debug('event received', detail);\n\n if (detail.event !== 'consent_status') return;\n if (settings.explicitOnly && detail.type?.toLowerCase() !== 'explicit')\n return;\n\n const state = parseConsent(detail, settings);\n if (Object.keys(state).length > 0) {\n elb('walker consent', state);\n }\n };\n\n const listener = (e: Event) => {\n const custom = e as CustomEvent<UsercentricsEventDetail>;\n if (custom.detail) handleDetail(custom.detail);\n };\n win.addEventListener(eventName, listener);\n\n // Static check: if UC_UI is already initialized, read current consent now.\n const api = win.UC_UI;\n if (api?.isInitialized?.() && api.getServicesBaseInfo) {\n const services = api.getServicesBaseInfo();\n if (services.length > 0) {\n handleDetail(buildDetailFromStatic(services));\n }\n }\n\n return () => {\n win.removeEventListener(eventName, listener);\n };\n}\n","import type { Elb, Logger } from '@walkeros/core';\nimport type {\n Settings,\n UsercentricsEventDetail,\n UsercentricsV3Api,\n UsercentricsV3CategoryState,\n UsercentricsV3CmpEventDetail,\n UsercentricsV3ConsentDetails,\n} from '../types';\nimport { parseConsent } from './parseConsent';\n\nexport interface V3AdapterContext {\n window: Window & typeof globalThis;\n elb: Elb.Fn;\n settings: Settings;\n logger: Logger.Instance;\n}\n\nconst V3_DEFAULT_EVENT_NAME = 'UC_UI_CMP_EVENT';\n\n/**\n * V3 CMP event types that represent a user consent decision. Presentation\n * events like `CMP_SHOWN` or `UI_INITIALIZED` must NOT trigger a consent\n * publish — they carry no user decision.\n */\nconst V3_DECISION_TYPES: ReadonlySet<string> = new Set([\n 'ACCEPT_ALL',\n 'DENY_ALL',\n 'SAVE',\n]);\n\n/**\n * Map a V3 CategoryData.state value to a walkerOS boolean using strict\n * semantics: only fully-accepted categories are `true`. Any partial or\n * denied state (including future/unknown states) resolves to `false`.\n *\n * This matches the consent rule of thumb: any deny signal denies.\n */\nfunction categoryStateToBoolean(state: UsercentricsV3CategoryState): boolean {\n return state === 'ALL_ACCEPTED';\n}\n\n/**\n * Build a synthetic UsercentricsEventDetail from V3 ConsentDetails.\n * Translates V3's structured consent state into the shape parseConsent expects.\n */\nfunction buildDetailFromV3(\n details: UsercentricsV3ConsentDetails,\n): UsercentricsEventDetail {\n const ucCategory: Record<string, boolean> = {};\n Object.entries(details.categories).forEach(([slug, category]) => {\n ucCategory[slug] = categoryStateToBoolean(category.state);\n });\n\n return {\n event: 'consent_status',\n type: details.consent.type === 'EXPLICIT' ? 'explicit' : 'implicit',\n ucCategory,\n };\n}\n\n/**\n * Set up the V3 adapter: registers a listener on the V3 consent event AND\n * (if __ucCmp is already initialized) performs a static read.\n *\n * Both paths re-fetch getConsentDetails() because the event payload does\n * not include consent state.\n *\n * Returns a cleanup function that removes the event listener.\n */\nexport async function setupV3Adapter(\n ctx: V3AdapterContext,\n): Promise<() => void> {\n const { window: win, elb, settings, logger } = ctx;\n const eventName = settings.v3EventName ?? V3_DEFAULT_EVENT_NAME;\n\n const publishConsent = async (cmp: UsercentricsV3Api): Promise<void> => {\n const details = await cmp.getConsentDetails();\n const detail = buildDetailFromV3(details);\n logger.debug('event received', detail);\n\n if (settings.explicitOnly && detail.type !== 'explicit') return;\n\n const state = parseConsent(detail, settings);\n if (Object.keys(state).length > 0) {\n elb('walker consent', state);\n }\n };\n\n const listener = (event: Event): void => {\n const cmp = win.__ucCmp;\n if (!cmp) return;\n const custom = event as CustomEvent<UsercentricsV3CmpEventDetail>;\n const detail = custom.detail;\n // Filter to decision events only: the CMP emits a broad set of events\n // (CMP_SHOWN, UI_INITIALIZED, VIEW_CHANGED, …) on this bus. Without\n // filtering, every view toggle would re-publish consent.\n if (!detail || detail.source !== 'CMP') return;\n if (!detail.type || !V3_DECISION_TYPES.has(detail.type)) return;\n publishConsent(cmp).catch(() => {\n // Swallow — a failed V3 fetch should not break the page.\n });\n };\n win.addEventListener(eventName, listener);\n\n // Static check: if __ucCmp is already initialized, fetch now.\n // Wrapped in try/catch so transient API failures during setup don't\n // reject setupV3Adapter() and tear down the whole flow — the listener\n // stays registered and will pick up the next real event.\n const cmp = win.__ucCmp;\n if (cmp) {\n try {\n const initialized = await cmp.isInitialized();\n if (initialized) {\n await publishConsent(cmp);\n }\n } catch (err) {\n logger.warn('v3 static consent read failed', err);\n }\n }\n\n return () => {\n win.removeEventListener(eventName, listener);\n };\n}\n","import type { Source, Elb } from '@walkeros/core';\n\ndeclare module '@walkeros/core' {\n interface SourceMap {\n usercentrics: { type: 'usercentrics'; platform?: 'web' };\n }\n}\n\n/**\n * Usercentrics consent event detail structure.\n *\n * Fired as event.detail on the configured window event (e.g. 'ucEvent').\n * Contains both category-level (ucCategory) and service-level consent.\n */\nexport interface UsercentricsEventDetail {\n /** Always 'consent_status' for consent events */\n event: string;\n /** 'explicit' when user actively chose, 'implicit' for page-load defaults (casing may vary) */\n type: string;\n /** Action taken: 'onAcceptAllServices', 'onDenyAllServices', 'onUpdateServices' */\n action?: string;\n /** Category-level consent booleans (e.g. { marketing: true, functional: false }) */\n ucCategory?: Record<string, boolean | unknown>;\n /** Service-level consent as top-level keys (e.g. 'Google Analytics': true) */\n [service: string]: unknown;\n}\n\ndeclare global {\n interface WindowEventMap {\n ucEvent: CustomEvent<UsercentricsEventDetail>;\n UC_UI_CMP_EVENT: CustomEvent<UsercentricsV3CmpEventDetail>;\n }\n}\n\n/**\n * Usercentrics V2 service info shape returned by `UC_UI.getServicesBaseInfo()`.\n * Only the fields we use are typed - minimal surface, not a full V2 API mirror.\n */\nexport interface UsercentricsV2Service {\n /** Category slug: 'essential' | 'functional' | 'marketing' | custom */\n categorySlug: string;\n /** Consent state for this service */\n consent: {\n status: boolean;\n };\n}\n\n/**\n * Usercentrics V2 window API (`window.UC_UI`).\n *\n * Methods are synchronous (unlike V3). All methods are optional because\n * Usercentrics does not guarantee every deployment exposes every method.\n */\nexport interface UsercentricsV2Api {\n isInitialized?: () => boolean;\n getServicesBaseInfo?: () => UsercentricsV2Service[];\n areAllConsentsAccepted?: () => boolean;\n}\n\n/**\n * Usercentrics V3 category state. The SDK may add future states; we handle\n * unknowns conservatively as non-accepting.\n */\nexport type UsercentricsV3CategoryState =\n | 'ALL_ACCEPTED'\n | 'ALL_DENIED'\n | 'SOME_ACCEPTED'\n | 'NO_STATE'\n | string;\n\n/**\n * Minimal V3 CategoryData - only fields the adapter reads.\n */\nexport interface UsercentricsV3CategoryData {\n state: UsercentricsV3CategoryState;\n name: string;\n}\n\n/**\n * Minimal V3 ConsentData - only the `type` field is used to distinguish\n * explicit vs implicit consent. Other fields (status, version, etc.) exist on\n * the real SDK but are not read by this adapter.\n */\nexport interface UsercentricsV3ConsentData {\n type: 'EXPLICIT' | 'IMPLICIT' | string;\n}\n\n/**\n * Minimal V3 ConsentDetails - only the fields the adapter reads.\n * The real SDK also exposes `services`, but the adapter currently operates\n * at category level only.\n */\nexport interface UsercentricsV3ConsentDetails {\n consent: UsercentricsV3ConsentData;\n categories: Record<string, UsercentricsV3CategoryData>;\n}\n\n/**\n * Usercentrics V3 window API (`window.__ucCmp`).\n *\n * Only the methods this adapter calls are typed - the real SDK surface is\n * much wider but we intentionally keep this narrow.\n */\nexport interface UsercentricsV3Api {\n isInitialized: () => Promise<boolean>;\n getConsentDetails: () => Promise<UsercentricsV3ConsentDetails>;\n}\n\n/**\n * V3 CMP event detail. Fired on `UC_UI_CMP_EVENT` (or custom name).\n * `source: 'CMP'` + a decision `type` tells us a user action has been taken.\n */\nexport interface UsercentricsV3CmpEventDetail {\n source?: string;\n type?: string;\n}\n\ndeclare global {\n interface Window {\n /**\n * Usercentrics V2 CMP API. Attached once the V2 Browser SDK is\n * initialized. Optional because the SDK loads asynchronously - guard\n * with a truthiness check before access.\n */\n UC_UI?: UsercentricsV2Api;\n /**\n * Usercentrics V3 CMP API. Attached once the V3 Browser SDK is\n * initialized. Optional because the SDK loads asynchronously - guard\n * with a truthiness check before access.\n */\n __ucCmp?: UsercentricsV3Api;\n }\n}\n\n/**\n * Settings for Usercentrics source\n */\nexport interface Settings {\n /**\n * Window event name to listen for.\n * Configured in Usercentrics admin under Implementation > Data Layer & Events.\n * Can also be set to 'UC_SDK_EVENT' for the built-in Browser SDK event.\n *\n * Default: 'ucEvent'\n */\n eventName?: string;\n\n /**\n * Map Usercentrics categories to walkerOS consent groups.\n * Keys: Usercentrics category names (from ucCategory)\n * Values: walkerOS consent group names\n *\n * Applied in both group-level and service-level consent modes.\n * When multiple source categories map to the same group, strict AND logic\n * applies: ALL contributing source categories must be true for the target\n * group to be true. Any single false denies consent.\n *\n * Default: {} (pass through category names as-is)\n */\n categoryMap?: Record<string, string>;\n\n /**\n * Only process explicit consent (user made a choice).\n * When true: Ignores events where type !== 'explicit'\n * When false: Processes any consent_status event including implicit/defaults\n *\n * Default: true\n */\n explicitOnly?: boolean;\n\n /**\n * Which Usercentrics API to target.\n * - 'auto' (default): detect at init. If `window.__ucCmp` is present, use V3.\n * If only `window.UC_UI` is present, use V2. If neither is present yet,\n * register listeners for both so late-loading CMPs are still caught.\n * - 'v2': force legacy `window.UC_UI` path.\n * - 'v3': force current `window.__ucCmp` path.\n */\n apiVersion?: 'auto' | 'v2' | 'v3';\n\n /**\n * V3 window event name to listen for consent changes.\n *\n * Usercentrics V3 hardcodes its built-in event names (`UC_UI_CMP_EVENT`,\n * `UC_UI_INITIALIZED`, `UC_UI_VIEW_CHANGED`, `UC_CONSENT`) - they cannot be\n * renamed. However, the Usercentrics admin dashboard (Implementation >\n * Data Layer & Events) lets admins configure an ADDITIONAL custom window\n * event. Use this setting to point at that custom event name if\n * configured; otherwise leave as default.\n *\n * Default: 'UC_UI_CMP_EVENT'\n */\n v3EventName?: string;\n}\n\n/**\n * User input settings (all optional)\n */\nexport type InitSettings = Partial<Settings>;\n\n/**\n * No mapping configuration for this source\n */\nexport interface Mapping {}\n\n/**\n * Push function type - uses elb for consent commands\n */\nexport type Push = Elb.Fn;\n\n/**\n * Environment interface for Usercentrics source\n */\nexport interface Env extends Source.BaseEnv {\n window?: Window & typeof globalThis;\n}\n\n/**\n * Types bundle for Usercentrics source\n */\nexport type Types = Source.Types<Settings, Mapping, Push, Env, InitSettings>;\n\n/**\n * Config type alias\n */\nexport type Config = Source.Config<Types>;\n","import type { UsercentricsEventDetail } from '../types';\n\n/**\n * Example Usercentrics consent event detail inputs.\n *\n * These represent real event.detail payloads from Usercentrics CMP.\n */\n\n/**\n * Full consent - user accepted all categories (explicit)\n */\nexport const fullConsent: UsercentricsEventDetail = {\n event: 'consent_status',\n type: 'explicit',\n action: 'onAcceptAllServices',\n ucCategory: {\n essential: true,\n functional: true,\n marketing: true,\n },\n 'Google Analytics': true,\n 'Google Ads Remarketing': true,\n};\n\n/**\n * Partial consent - user accepted only essential and functional (explicit)\n */\nexport const partialConsent: UsercentricsEventDetail = {\n event: 'consent_status',\n type: 'explicit',\n action: 'onUpdateServices',\n ucCategory: {\n essential: true,\n functional: true,\n marketing: false,\n },\n 'Google Analytics': true,\n 'Google Ads Remarketing': false,\n};\n\n/**\n * Minimal consent - user denied everything except essential (explicit)\n */\nexport const minimalConsent: UsercentricsEventDetail = {\n event: 'consent_status',\n type: 'explicit',\n action: 'onDenyAllServices',\n ucCategory: {\n essential: true,\n functional: false,\n marketing: false,\n },\n 'Google Analytics': false,\n 'Google Ads Remarketing': false,\n};\n\n/**\n * Implicit consent - page load with default consent state\n * (not an explicit user choice)\n */\nexport const implicitConsent: UsercentricsEventDetail = {\n event: 'consent_status',\n type: 'implicit',\n ucCategory: {\n essential: true,\n functional: false,\n marketing: false,\n },\n 'Google Analytics': false,\n 'Google Ads Remarketing': false,\n};\n\n/**\n * Explicit consent with uppercase type field (Usercentrics docs are\n * inconsistent about casing - some show 'EXPLICIT', others 'explicit')\n */\nexport const fullConsentUpperCase: UsercentricsEventDetail = {\n event: 'consent_status',\n type: 'EXPLICIT',\n action: 'onAcceptAllServices',\n ucCategory: {\n essential: true,\n functional: true,\n marketing: true,\n },\n};\n\n/**\n * Service-level consent - ucCategory has mixed types (non-boolean values\n * indicate individual service-level choice rather than group-level)\n */\nexport const serviceLevelConsent: UsercentricsEventDetail = {\n event: 'consent_status',\n type: 'explicit',\n action: 'onUpdateServices',\n ucCategory: {\n essential: true,\n functional: 'partial', // Non-boolean indicates mixed service choices\n marketing: 'partial',\n },\n 'Google Analytics': true,\n 'Google Ads Remarketing': false,\n Hotjar: true,\n};\n\n/**\n * Non-consent event (should be ignored)\n */\nexport const nonConsentEvent: UsercentricsEventDetail = {\n event: 'other_event',\n type: 'explicit',\n};\n","import type { WalkerOS } from '@walkeros/core';\n\n/**\n * Expected walkerOS consent outputs.\n *\n * These represent the consent state after parsing Usercentrics event details\n * with no category mapping configured (pass-through).\n */\n\n/**\n * Full consent - all categories true (group-level)\n */\nexport const fullConsentMapped: WalkerOS.Consent = {\n essential: true,\n functional: true,\n marketing: true,\n};\n\n/**\n * Partial consent - essential and functional true, marketing false\n */\nexport const partialConsentMapped: WalkerOS.Consent = {\n essential: true,\n functional: true,\n marketing: false,\n};\n\n/**\n * Minimal consent - only essential true\n */\nexport const minimalConsentMapped: WalkerOS.Consent = {\n essential: true,\n functional: false,\n marketing: false,\n};\n\n/**\n * Full consent with custom category mapping applied\n * (essential->functional, functional->functional, marketing->marketing)\n */\nexport const fullConsentCustomMapped: WalkerOS.Consent = {\n functional: true,\n marketing: true,\n};\n\n/**\n * Service-level consent - individual service booleans + boolean ucCategory entries\n * (services normalized: lowercase, spaces to underscores)\n * (ucCategory boolean entries mapped through categoryMap)\n */\nexport const serviceLevelMapped: WalkerOS.Consent = {\n essential: true,\n google_analytics: true,\n google_ads_remarketing: false,\n hotjar: true,\n};\n","import type { Elb, Logger } from '@walkeros/core';\n\n/**\n * Example environment configurations for Usercentrics source testing.\n */\n\nconst noop = () => {};\n\n/**\n * Create a properly typed elb/push function mock\n */\nexport const createMockElbFn = (): Elb.Fn => {\n const fn = (() =>\n Promise.resolve({\n ok: true,\n })) as Elb.Fn;\n return fn;\n};\n\n/**\n * Simple no-op logger for demo purposes\n */\nexport const noopLogger: Logger.Instance = {\n error: noop,\n warn: noop,\n info: noop,\n debug: noop,\n throw: (message: string | Error) => {\n throw typeof message === 'string' ? new Error(message) : message;\n },\n json: noop,\n scope: () => noopLogger,\n};\n","import type { Flow } from '@walkeros/core';\n\nexport const fullConsent: Flow.StepExample = {\n title: 'Full consent',\n description:\n 'A Usercentrics onAcceptAllServices event emits a walker consent command with essential, functional, and marketing granted.',\n trigger: { type: 'consent' },\n in: {\n event: 'consent_status',\n type: 'explicit',\n action: 'onAcceptAllServices',\n ucCategory: {\n essential: true,\n functional: true,\n marketing: true,\n },\n },\n out: [\n [\n 'elb',\n 'walker consent',\n {\n essential: true,\n functional: true,\n marketing: true,\n },\n ],\n ],\n};\n\nexport const minimalConsent: Flow.StepExample = {\n title: 'Minimal consent',\n description:\n 'A Usercentrics onDenyAllServices event emits a walker consent command with only essential granted.',\n trigger: { type: 'consent' },\n in: {\n event: 'consent_status',\n type: 'explicit',\n action: 'onDenyAllServices',\n ucCategory: {\n essential: true,\n functional: false,\n marketing: false,\n },\n },\n out: [\n [\n 'elb',\n 'walker consent',\n {\n essential: true,\n functional: false,\n marketing: false,\n },\n ],\n ],\n};\n\nexport const categoryMapOverride: Flow.StepExample = {\n title: 'Category map override',\n description:\n 'Custom categoryMap remaps essential to functional and functional to analytics',\n trigger: { type: 'consent' },\n in: {\n event: 'consent_status',\n type: 'explicit',\n ucCategory: {\n essential: true,\n functional: true,\n marketing: false,\n },\n },\n mapping: {\n categoryMap: { essential: 'functional', functional: 'analytics' },\n },\n out: [\n [\n 'elb',\n 'walker consent',\n {\n functional: true,\n analytics: true,\n marketing: false,\n },\n ],\n ],\n};\n\nexport const customEventName: Flow.StepExample = {\n title: 'Custom event name',\n description: 'Using UC_SDK_EVENT instead of ucEvent for Usercentrics SDK v2',\n trigger: { type: 'consent', options: { eventName: 'UC_SDK_EVENT' } },\n in: {\n event: 'consent_status',\n type: 'explicit',\n ucCategory: {\n essential: true,\n functional: true,\n marketing: true,\n },\n },\n mapping: { eventName: 'UC_SDK_EVENT' },\n out: [\n [\n 'elb',\n 'walker consent',\n {\n essential: true,\n functional: true,\n marketing: true,\n },\n ],\n ],\n};\n","import type { Trigger, Collector } from '@walkeros/core';\nimport { startFlow } from '@walkeros/collector';\n\ninterface UsercentricsContent {\n event: string;\n type: string;\n action?: string;\n ucCategory?: Record<string, boolean | unknown>;\n [service: string]: unknown;\n}\n\nconst createTrigger: Trigger.CreateFn<UsercentricsContent, void> = async (\n config: Collector.InitConfig,\n) => {\n let flow: Trigger.FlowHandle | undefined;\n\n const trigger: Trigger.Fn<UsercentricsContent, void> =\n (type?: string, opts?: unknown) => async (content: UsercentricsContent) => {\n // Lazy startFlow — source registers ucEvent listener during init\n if (!flow) {\n const result = await startFlow({ ...config, run: config.run ?? true });\n flow = { collector: result.collector, elb: result.elb };\n }\n\n // Dispatch the CMP event — source's listener catches it\n const eventName =\n (opts as { eventName?: string })?.eventName || 'ucEvent';\n window.dispatchEvent(new CustomEvent(eventName, { detail: content }));\n };\n\n return {\n get flow() {\n return flow;\n },\n trigger,\n };\n};\n\n/** Dispatches ucEvent CustomEvent after source init (post-init trigger). */\nconst trigger = (\n input: unknown,\n env: Record<string, unknown>,\n): void | (() => void) => {\n if (!input || typeof input !== 'object') return;\n return () => {\n (env.window as Window).dispatchEvent(\n new CustomEvent('ucEvent', { detail: input }),\n );\n };\n};\n\nexport { createTrigger, trigger };\n","import type { Source } from '@walkeros/core';\nimport type { Types, Settings } from './types';\nimport { setupV2Adapter } from './lib/v2';\nimport { setupV3Adapter } from './lib/v3';\n\n// Export types for external usage\nexport * as SourceUsercentrics from './types';\n\n// Export examples\nexport * from './examples';\n\n/**\n * Usercentrics consent management source for walkerOS.\n *\n * Listens to Usercentrics CMP events and translates consent states to\n * walkerOS consent commands. Supports both the legacy V2 API\n * (`window.UC_UI` + `ucEvent`) and the current V3 API\n * (`window.__ucCmp` + `UC_UI_CMP_EVENT`).\n *\n * @example\n * ```typescript\n * import { sourceUsercentrics } from '@walkeros/web-source-cmp-usercentrics';\n *\n * await startFlow({\n * sources: {\n * consent: {\n * code: sourceUsercentrics,\n * config: {\n * settings: {\n * eventName: 'ucEvent',\n * categoryMap: {\n * essential: 'functional',\n * functional: 'functional',\n * marketing: 'marketing',\n * },\n * },\n * },\n * },\n * },\n * });\n * ```\n */\nexport const sourceUsercentrics: Source.Init<Types> = async (context) => {\n const { config, env } = context;\n const { elb, logger } = env;\n\n // Resolve window with fallback to globalThis\n const actualWindow =\n env.window ??\n (typeof globalThis.window !== 'undefined' ? globalThis.window : undefined);\n\n // Merge user settings with defaults so adapters always see a fully-resolved Settings\n const settings: Settings = {\n eventName: config?.settings?.eventName ?? 'ucEvent',\n categoryMap: config?.settings?.categoryMap ?? {},\n explicitOnly: config?.settings?.explicitOnly ?? true,\n apiVersion: config?.settings?.apiVersion ?? 'auto',\n v3EventName: config?.settings?.v3EventName ?? 'UC_UI_CMP_EVENT',\n };\n\n const fullConfig: Source.Config<Types> = { settings };\n const cleanups: Array<() => void> = [];\n\n if (actualWindow) {\n const adapterCtx = { window: actualWindow, elb, settings, logger };\n const apiVersion = settings.apiVersion ?? 'auto';\n\n if (apiVersion === 'v2') {\n cleanups.push(setupV2Adapter(adapterCtx));\n } else if (apiVersion === 'v3') {\n cleanups.push(await setupV3Adapter(adapterCtx));\n } else {\n // auto: detect which API is present\n if (actualWindow.__ucCmp) {\n cleanups.push(await setupV3Adapter(adapterCtx));\n } else if (actualWindow.UC_UI) {\n cleanups.push(setupV2Adapter(adapterCtx));\n } else {\n // Neither loaded yet — attach both listeners so whichever loads later is caught.\n cleanups.push(setupV2Adapter(adapterCtx));\n cleanups.push(await setupV3Adapter(adapterCtx));\n }\n }\n }\n\n return {\n type: 'usercentrics',\n config: fullConfig,\n push: elb,\n destroy: async () => {\n cleanups.forEach((fn) => fn());\n },\n };\n};\n\nexport default sourceUsercentrics;\n"],"mappings":"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","names":["_a","cmp","fullConsent","minimalConsent","trigger"]}
1
+ {"version":3,"sources":["../src/lib/parseConsent.ts","../src/lib/v2.ts","../src/lib/v3.ts","../src/types/index.ts","../src/index.ts"],"sourcesContent":["import type { WalkerOS } from '@walkeros/core';\nimport type { UsercentricsEventDetail, Settings } from '../types';\n\n/** Reserved keys in event.detail that are not service names */\nexport const RESERVED_KEYS = ['action', 'event', 'type', 'ucCategory'];\n\n/**\n * Determine if ucCategory represents group-level consent.\n * Group-level: all values are booleans.\n * Service-level: some values are non-boolean (e.g., 'partial').\n */\nexport function isGroupLevel(\n ucCategory: Record<string, boolean | unknown>,\n): boolean {\n return Object.values(ucCategory).every((val) => typeof val === 'boolean');\n}\n\n/**\n * Merge an incoming consent signal into the accumulating state using strict\n * AND semantics: absent key initialises from the incoming value; present key\n * becomes `true` only if both existing and incoming are `true`. Any single\n * `false` anywhere in the merge chain revokes consent for that key.\n *\n * This matches the consent rule of thumb: any deny signal denies. Permissive\n * (OR) and \"last-wins\" semantics are both unsafe for a privacy primitive.\n */\nfunction mergeConsent(\n state: WalkerOS.Consent,\n key: string,\n value: boolean,\n): void {\n state[key] = state[key] === undefined ? value : Boolean(state[key]) && value;\n}\n\n/**\n * Parse consent from Usercentrics event detail.\n *\n * Group-level: ucCategory values are all booleans → use them directly.\n * Service-level: ucCategory has non-booleans → mix boolean ucCategory entries\n * with top-level service keys from event.detail.\n *\n * categoryMap is applied in both modes to ucCategory boolean entries.\n * Strict AND: if multiple source categories map to the same target group,\n * the target is `true` only when ALL contributing sources are `true`.\n */\nexport function parseConsent(\n detail: UsercentricsEventDetail,\n settings: Settings,\n): WalkerOS.Consent {\n const state: WalkerOS.Consent = {};\n\n if (detail.ucCategory && isGroupLevel(detail.ucCategory)) {\n Object.entries(detail.ucCategory).forEach(([category, value]) => {\n if (typeof value !== 'boolean') return;\n const mapped = settings.categoryMap?.[category] ?? category;\n mergeConsent(state, mapped, value);\n });\n } else {\n if (detail.ucCategory) {\n Object.entries(detail.ucCategory).forEach(([key, value]) => {\n if (typeof value === 'boolean') {\n const mapped = settings.categoryMap?.[key] ?? key;\n mergeConsent(state, mapped, value);\n }\n });\n }\n\n Object.entries(detail).forEach(([key, value]) => {\n if (RESERVED_KEYS.includes(key)) return;\n if (typeof value !== 'boolean') return;\n const normalized = key.toLowerCase().replace(/ /g, '_');\n mergeConsent(state, normalized, value);\n });\n }\n\n return state;\n}\n","import type { Elb, Logger } from '@walkeros/core';\nimport type {\n Settings,\n UsercentricsEventDetail,\n UsercentricsV2Service,\n} from '../types';\nimport { parseConsent } from './parseConsent';\n\nexport interface V2AdapterContext {\n window: Window & typeof globalThis;\n elb: Elb.Fn;\n settings: Settings;\n logger: Logger.Instance;\n}\n\n/**\n * Aggregate V2 service array into a group-level ucCategory object using strict\n * AND logic. A category is `true` only if EVERY service in that category is\n * accepted. Any single denied service denies the whole category — this\n * matches the consent rule of thumb: any deny signal denies.\n */\nfunction aggregateByCategory(\n services: UsercentricsV2Service[],\n): Record<string, boolean> {\n const categories: Record<string, boolean> = {};\n services.forEach((service) => {\n const category = service.categorySlug;\n const status = service.consent?.status ?? false;\n categories[category] =\n categories[category] === undefined\n ? status\n : categories[category] && status;\n });\n return categories;\n}\n\n/**\n * Build a synthetic UsercentricsEventDetail from the V2 static API.\n * Marked as 'implicit' because UC_UI.isInitialized() === true does NOT prove\n * the read was user-initiated — it only proves the SDK has finished loading.\n * With settings.explicitOnly = true (the default), consumers correctly drop\n * this detail. Set explicitOnly = false to surface the static snapshot.\n */\nfunction buildDetailFromStatic(\n services: UsercentricsV2Service[],\n): UsercentricsEventDetail {\n return {\n event: 'consent_status',\n type: 'implicit',\n ucCategory: aggregateByCategory(services),\n };\n}\n\n/**\n * Set up the V2 adapter: listens on the configured event AND performs a\n * static read if UC_UI is already initialized.\n *\n * Returns a cleanup function that removes the event listener.\n */\nexport function setupV2Adapter(ctx: V2AdapterContext): () => void {\n const { window: win, elb, settings, logger } = ctx;\n const eventName = settings.eventName ?? 'ucEvent';\n\n const handleDetail = (detail: UsercentricsEventDetail) => {\n logger.debug('event received', detail);\n\n if (detail.event !== 'consent_status') return;\n if (settings.explicitOnly && detail.type?.toLowerCase() !== 'explicit')\n return;\n\n const state = parseConsent(detail, settings);\n if (Object.keys(state).length > 0) {\n elb('walker consent', state);\n }\n };\n\n const listener = (e: Event) => {\n const custom = e as CustomEvent<UsercentricsEventDetail>;\n if (custom.detail) handleDetail(custom.detail);\n };\n win.addEventListener(eventName, listener);\n\n // Static check: if UC_UI is already initialized, read current consent now.\n const api = win.UC_UI;\n if (api?.isInitialized?.() && api.getServicesBaseInfo) {\n const services = api.getServicesBaseInfo();\n if (services.length > 0) {\n handleDetail(buildDetailFromStatic(services));\n }\n }\n\n return () => {\n win.removeEventListener(eventName, listener);\n };\n}\n","import type { Elb, Logger } from '@walkeros/core';\nimport type {\n Settings,\n UsercentricsEventDetail,\n UsercentricsV3Api,\n UsercentricsV3CategoryState,\n UsercentricsV3CmpEventDetail,\n UsercentricsV3ConsentDetails,\n} from '../types';\nimport { parseConsent } from './parseConsent';\n\nexport interface V3AdapterContext {\n window: Window & typeof globalThis;\n elb: Elb.Fn;\n settings: Settings;\n logger: Logger.Instance;\n}\n\nconst V3_DEFAULT_EVENT_NAME = 'UC_UI_CMP_EVENT';\n\n/**\n * V3 CMP event types that represent a user consent decision. Presentation\n * events like `CMP_SHOWN` or `UI_INITIALIZED` must NOT trigger a consent\n * publish — they carry no user decision.\n */\nconst V3_DECISION_TYPES: ReadonlySet<string> = new Set([\n 'ACCEPT_ALL',\n 'DENY_ALL',\n 'SAVE',\n]);\n\n/**\n * Map a V3 CategoryData.state value to a walkerOS boolean using strict\n * semantics: only fully-accepted categories are `true`. Any partial or\n * denied state (including future/unknown states) resolves to `false`.\n *\n * This matches the consent rule of thumb: any deny signal denies.\n */\nfunction categoryStateToBoolean(state: UsercentricsV3CategoryState): boolean {\n return state === 'ALL_ACCEPTED';\n}\n\n/**\n * Build a synthetic UsercentricsEventDetail from V3 ConsentDetails.\n * Translates V3's structured consent state into the shape parseConsent expects.\n */\nfunction buildDetailFromV3(\n details: UsercentricsV3ConsentDetails,\n): UsercentricsEventDetail {\n const ucCategory: Record<string, boolean> = {};\n Object.entries(details.categories).forEach(([slug, category]) => {\n ucCategory[slug] = categoryStateToBoolean(category.state);\n });\n\n return {\n event: 'consent_status',\n type: details.consent.type === 'EXPLICIT' ? 'explicit' : 'implicit',\n ucCategory,\n };\n}\n\n/**\n * Set up the V3 adapter: registers a listener on the V3 consent event AND\n * (if __ucCmp is already initialized) performs a static read.\n *\n * Both paths re-fetch getConsentDetails() because the event payload does\n * not include consent state.\n *\n * Returns a cleanup function that removes the event listener.\n */\nexport async function setupV3Adapter(\n ctx: V3AdapterContext,\n): Promise<() => void> {\n const { window: win, elb, settings, logger } = ctx;\n const eventName = settings.v3EventName ?? V3_DEFAULT_EVENT_NAME;\n\n const publishConsent = async (cmp: UsercentricsV3Api): Promise<void> => {\n const details = await cmp.getConsentDetails();\n const detail = buildDetailFromV3(details);\n logger.debug('event received', detail);\n\n if (settings.explicitOnly && detail.type !== 'explicit') return;\n\n const state = parseConsent(detail, settings);\n if (Object.keys(state).length > 0) {\n elb('walker consent', state);\n }\n };\n\n const listener = (event: Event): void => {\n const cmp = win.__ucCmp;\n if (!cmp) return;\n const custom = event as CustomEvent<UsercentricsV3CmpEventDetail>;\n const detail = custom.detail;\n // Filter to decision events only: the CMP emits a broad set of events\n // (CMP_SHOWN, UI_INITIALIZED, VIEW_CHANGED, …) on this bus. Without\n // filtering, every view toggle would re-publish consent.\n if (!detail || detail.source !== 'CMP') return;\n if (!detail.type || !V3_DECISION_TYPES.has(detail.type)) return;\n publishConsent(cmp).catch(() => {\n // Swallow — a failed V3 fetch should not break the page.\n });\n };\n win.addEventListener(eventName, listener);\n\n // Static check: if __ucCmp is already initialized, fetch now.\n // Wrapped in try/catch so transient API failures during setup don't\n // reject setupV3Adapter() and tear down the whole flow — the listener\n // stays registered and will pick up the next real event.\n const cmp = win.__ucCmp;\n if (cmp) {\n try {\n const initialized = await cmp.isInitialized();\n if (initialized) {\n await publishConsent(cmp);\n }\n } catch (err) {\n logger.warn('v3 static consent read failed', err);\n }\n }\n\n return () => {\n win.removeEventListener(eventName, listener);\n };\n}\n","import type { Source, Elb } from '@walkeros/core';\n\ndeclare module '@walkeros/core' {\n interface SourceMap {\n usercentrics: { type: 'usercentrics'; platform?: 'web' };\n }\n}\n\n/**\n * Usercentrics consent event detail structure.\n *\n * Fired as event.detail on the configured window event (e.g. 'ucEvent').\n * Contains both category-level (ucCategory) and service-level consent.\n */\nexport interface UsercentricsEventDetail {\n /** Always 'consent_status' for consent events */\n event: string;\n /** 'explicit' when user actively chose, 'implicit' for page-load defaults (casing may vary) */\n type: string;\n /** Action taken: 'onAcceptAllServices', 'onDenyAllServices', 'onUpdateServices' */\n action?: string;\n /** Category-level consent booleans (e.g. { marketing: true, functional: false }) */\n ucCategory?: Record<string, boolean | unknown>;\n /** Service-level consent as top-level keys (e.g. 'Google Analytics': true) */\n [service: string]: unknown;\n}\n\ndeclare global {\n interface WindowEventMap {\n ucEvent: CustomEvent<UsercentricsEventDetail>;\n UC_UI_CMP_EVENT: CustomEvent<UsercentricsV3CmpEventDetail>;\n }\n}\n\n/**\n * Usercentrics V2 service info shape returned by `UC_UI.getServicesBaseInfo()`.\n * Only the fields we use are typed - minimal surface, not a full V2 API mirror.\n */\nexport interface UsercentricsV2Service {\n /** Category slug: 'essential' | 'functional' | 'marketing' | custom */\n categorySlug: string;\n /** Consent state for this service */\n consent: {\n status: boolean;\n };\n}\n\n/**\n * Usercentrics V2 window API (`window.UC_UI`).\n *\n * Methods are synchronous (unlike V3). All methods are optional because\n * Usercentrics does not guarantee every deployment exposes every method.\n */\nexport interface UsercentricsV2Api {\n isInitialized?: () => boolean;\n getServicesBaseInfo?: () => UsercentricsV2Service[];\n areAllConsentsAccepted?: () => boolean;\n}\n\n/**\n * Usercentrics V3 category state. The SDK may add future states; we handle\n * unknowns conservatively as non-accepting.\n */\nexport type UsercentricsV3CategoryState =\n | 'ALL_ACCEPTED'\n | 'ALL_DENIED'\n | 'SOME_ACCEPTED'\n | 'NO_STATE'\n | string;\n\n/**\n * Minimal V3 CategoryData - only fields the adapter reads.\n */\nexport interface UsercentricsV3CategoryData {\n state: UsercentricsV3CategoryState;\n name: string;\n}\n\n/**\n * Minimal V3 ConsentData - only the `type` field is used to distinguish\n * explicit vs implicit consent. Other fields (status, version, etc.) exist on\n * the real SDK but are not read by this adapter.\n */\nexport interface UsercentricsV3ConsentData {\n type: 'EXPLICIT' | 'IMPLICIT' | string;\n}\n\n/**\n * Minimal V3 ConsentDetails - only the fields the adapter reads.\n * The real SDK also exposes `services`, but the adapter currently operates\n * at category level only.\n */\nexport interface UsercentricsV3ConsentDetails {\n consent: UsercentricsV3ConsentData;\n categories: Record<string, UsercentricsV3CategoryData>;\n}\n\n/**\n * Usercentrics V3 window API (`window.__ucCmp`).\n *\n * Only the methods this adapter calls are typed - the real SDK surface is\n * much wider but we intentionally keep this narrow.\n */\nexport interface UsercentricsV3Api {\n isInitialized: () => Promise<boolean>;\n getConsentDetails: () => Promise<UsercentricsV3ConsentDetails>;\n}\n\n/**\n * V3 CMP event detail. Fired on `UC_UI_CMP_EVENT` (or custom name).\n * `source: 'CMP'` + a decision `type` tells us a user action has been taken.\n */\nexport interface UsercentricsV3CmpEventDetail {\n source?: string;\n type?: string;\n}\n\ndeclare global {\n interface Window {\n /**\n * Usercentrics V2 CMP API. Attached once the V2 Browser SDK is\n * initialized. Optional because the SDK loads asynchronously - guard\n * with a truthiness check before access.\n */\n UC_UI?: UsercentricsV2Api;\n /**\n * Usercentrics V3 CMP API. Attached once the V3 Browser SDK is\n * initialized. Optional because the SDK loads asynchronously - guard\n * with a truthiness check before access.\n */\n __ucCmp?: UsercentricsV3Api;\n }\n}\n\n/**\n * Settings for Usercentrics source\n */\nexport interface Settings {\n /**\n * Window event name to listen for.\n * Configured in Usercentrics admin under Implementation > Data Layer & Events.\n * Can also be set to 'UC_SDK_EVENT' for the built-in Browser SDK event.\n *\n * Default: 'ucEvent'\n */\n eventName?: string;\n\n /**\n * Map Usercentrics categories to walkerOS consent groups.\n * Keys: Usercentrics category names (from ucCategory)\n * Values: walkerOS consent group names\n *\n * Applied in both group-level and service-level consent modes.\n * When multiple source categories map to the same group, strict AND logic\n * applies: ALL contributing source categories must be true for the target\n * group to be true. Any single false denies consent.\n *\n * Default: {} (pass through category names as-is)\n */\n categoryMap?: Record<string, string>;\n\n /**\n * Only process explicit consent (user made a choice).\n * When true: Ignores events where type !== 'explicit'\n * When false: Processes any consent_status event including implicit/defaults\n *\n * Default: true\n */\n explicitOnly?: boolean;\n\n /**\n * Which Usercentrics API to target.\n * - 'auto' (default): detect at init. If `window.__ucCmp` is present, use V3.\n * If only `window.UC_UI` is present, use V2. If neither is present yet,\n * register listeners for both so late-loading CMPs are still caught.\n * - 'v2': force legacy `window.UC_UI` path.\n * - 'v3': force current `window.__ucCmp` path.\n */\n apiVersion?: 'auto' | 'v2' | 'v3';\n\n /**\n * V3 window event name to listen for consent changes.\n *\n * Usercentrics V3 hardcodes its built-in event names (`UC_UI_CMP_EVENT`,\n * `UC_UI_INITIALIZED`, `UC_UI_VIEW_CHANGED`, `UC_CONSENT`) - they cannot be\n * renamed. However, the Usercentrics admin dashboard (Implementation >\n * Data Layer & Events) lets admins configure an ADDITIONAL custom window\n * event. Use this setting to point at that custom event name if\n * configured; otherwise leave as default.\n *\n * Default: 'UC_UI_CMP_EVENT'\n */\n v3EventName?: string;\n}\n\n/**\n * User input settings (all optional)\n */\nexport type InitSettings = Partial<Settings>;\n\n/**\n * No mapping configuration for this source\n */\nexport interface Mapping {}\n\n/**\n * Push function type - uses elb for consent commands\n */\nexport type Push = Elb.Fn;\n\n/**\n * Environment interface for Usercentrics source\n */\nexport interface Env extends Source.BaseEnv {\n window?: Window & typeof globalThis;\n}\n\n/**\n * Types bundle for Usercentrics source\n */\nexport type Types = Source.Types<Settings, Mapping, Push, Env, InitSettings>;\n\n/**\n * Config type alias\n */\nexport type Config = Source.Config<Types>;\n","import type { Source } from '@walkeros/core';\nimport type { Types, Settings } from './types';\nimport { setupV2Adapter } from './lib/v2';\nimport { setupV3Adapter } from './lib/v3';\n\n// Export types for external usage\nexport * as SourceUsercentrics from './types';\n\n/**\n * Usercentrics consent management source for walkerOS.\n *\n * Listens to Usercentrics CMP events and translates consent states to\n * walkerOS consent commands. Supports both the legacy V2 API\n * (`window.UC_UI` + `ucEvent`) and the current V3 API\n * (`window.__ucCmp` + `UC_UI_CMP_EVENT`).\n *\n * @example\n * ```typescript\n * import { sourceUsercentrics } from '@walkeros/web-source-cmp-usercentrics';\n *\n * await startFlow({\n * sources: {\n * consent: {\n * code: sourceUsercentrics,\n * config: {\n * settings: {\n * eventName: 'ucEvent',\n * categoryMap: {\n * essential: 'functional',\n * functional: 'functional',\n * marketing: 'marketing',\n * },\n * },\n * },\n * },\n * },\n * });\n * ```\n */\nexport const sourceUsercentrics: Source.Init<Types> = async (context) => {\n const { config, env } = context;\n const { elb, logger } = env;\n\n // Resolve window with fallback to globalThis\n const actualWindow =\n env.window ??\n (typeof globalThis.window !== 'undefined' ? globalThis.window : undefined);\n\n // Merge user settings with defaults so adapters always see a fully-resolved Settings\n const settings: Settings = {\n eventName: config?.settings?.eventName ?? 'ucEvent',\n categoryMap: config?.settings?.categoryMap ?? {},\n explicitOnly: config?.settings?.explicitOnly ?? true,\n apiVersion: config?.settings?.apiVersion ?? 'auto',\n v3EventName: config?.settings?.v3EventName ?? 'UC_UI_CMP_EVENT',\n };\n\n const fullConfig: Source.Config<Types> = { settings };\n const cleanups: Array<() => void> = [];\n\n // Attach the CMP listeners and perform the static consent read. Deferred to\n // init() (Pass 2 of initSources) so the factory (Pass 1) stays side-effect\n // free: no listener registration and, critically, no `elb('walker consent')`\n // emit during construction. Emitting from the factory races source merge\n // order and can leave a later `require:[\"consent\"]` source parked.\n const init = async (): Promise<void> => {\n if (!actualWindow) return;\n\n const adapterCtx = { window: actualWindow, elb, settings, logger };\n const apiVersion = settings.apiVersion ?? 'auto';\n\n if (apiVersion === 'v2') {\n cleanups.push(setupV2Adapter(adapterCtx));\n } else if (apiVersion === 'v3') {\n cleanups.push(await setupV3Adapter(adapterCtx));\n } else {\n // auto: detect which API is present\n if (actualWindow.__ucCmp) {\n cleanups.push(await setupV3Adapter(adapterCtx));\n } else if (actualWindow.UC_UI) {\n cleanups.push(setupV2Adapter(adapterCtx));\n } else {\n // Neither loaded yet — attach both listeners so whichever loads later is caught.\n cleanups.push(setupV2Adapter(adapterCtx));\n cleanups.push(await setupV3Adapter(adapterCtx));\n }\n }\n };\n\n return {\n type: 'usercentrics',\n config: fullConfig,\n push: elb,\n init,\n destroy: async () => {\n cleanups.forEach((fn) => fn());\n },\n };\n};\n\nexport default sourceUsercentrics;\n"],"mappings":"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","names":["_a","cmp","_a"]}
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$meta": {
3
3
  "package": "@walkeros/web-source-cmp-usercentrics",
4
- "version": "4.2.0-next-1780387694663",
4
+ "version": "4.2.0-next-1780420352914",
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-cmp-usercentrics",
3
3
  "description": "Usercentrics consent management source for walkerOS",
4
- "version": "4.2.0-next-1780387694663",
4
+ "version": "4.2.0-next-1780420352914",
5
5
  "license": "MIT",
6
6
  "walkerOS": {
7
7
  "type": "source",
@@ -46,8 +46,8 @@
46
46
  "update": "npx npm-check-updates -u && npm update"
47
47
  },
48
48
  "dependencies": {
49
- "@walkeros/collector": "4.2.0-next-1780387694663",
50
- "@walkeros/core": "4.2.0-next-1780387694663"
49
+ "@walkeros/collector": "4.2.0-next-1780420352914",
50
+ "@walkeros/core": "4.2.0-next-1780420352914"
51
51
  },
52
52
  "repository": {
53
53
  "url": "git+https://github.com/elbwalker/walkerOS.git",