@picked/client 0.0.73-next.2 → 0.0.73-next.3
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/dist/{api-CuP2evlQ.js → api-Bk9LpmF-.js} +1 -1
- package/dist/{api-CAX3us4Y.cjs → api-DrCI_JBL.cjs} +1 -1
- package/dist/cjs/index.js +2 -2
- package/dist/cjs/plugins/dynamic-experiences/index.js +1 -1
- package/dist/docs/_root.css +101 -0
- package/dist/docs/how-to/analytics/index.md +2 -0
- package/dist/docs/reference/pickedql/dimensions.md +10 -0
- package/dist/docs/reference/sdk/analytics-events.md +445 -0
- package/dist/esm/index.js +2 -2
- package/dist/esm/plugins/dynamic-experiences/index.js +2 -2
- package/dist/{provider-g5LsdA3I.cjs → provider-Bv4qayPb.cjs} +1 -1
- package/dist/{provider-w_5pwGgI.js → provider-y2ueV5pV.js} +1 -1
- package/dist/{registry-Cvacpz54.cjs → registry-Dj1piWTO.cjs} +1 -1
- package/dist/{registry-BnBSybzH.js → registry-Lv_Ql7Ix.js} +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
function e(e,t){return{"Picked-Client":e,"Picked-Version":t}}var t=()=>`0.0.73-next.
|
|
1
|
+
function e(e,t){return{"Picked-Client":e,"Picked-Version":t}}var t=()=>`0.0.73-next.3`,n=`v1`;function r(e,t){return new URL(`/api/${n}/${t}`,e).toString()}function i(n){return{...e(`sdk`,t()),...n}}async function a(e,t,n,a){let o=r(e,t);return fetch(o,{headers:i(n),signal:a})}async function o(e,t,n,a){let o=r(e,t);return fetch(o,{method:`POST`,headers:{"Content-Type":`application/json`,...i(a)},body:JSON.stringify(n)})}Object.defineProperty(exports,"i",{enumerable:!0,get:function(){return e}}),Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return o}}),Object.defineProperty(exports,"r",{enumerable:!0,get:function(){return t}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return a}});
|
package/dist/cjs/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../object-CIkt7Fkr.cjs"),t=require("../rules-logic-CGZIYgAI.cjs"),n=require("../logger-CSTvAyyB.cjs"),r=require("../supports-DBzjGaWD.cjs"),i=require("../dom-DlLH3FxV.cjs"),a=require("../experience-instance-Dej3P1sE.cjs"),o=require("../storage-DUw9UJ2h.cjs"),s=require("../api-CAX3us4Y.cjs"),c=require("../id-Js-62re-.cjs"),l=require("../inert-script-report-ijRHPtcY.cjs");let u=require("effector"),d=require("@withease/factories");var f=(0,u.createDomain)(`experience`),p=(0,d.createFactory)(({client:e,experience:n})=>{let r=f.store(n),o=(0,u.createApi)(r,{merge(e,t){return{...e,...t.experience}}}),s=r.map(e=>({name:e.name,decisionLogic:e.condition,targetSelectors:e.targets,initializeOpenLogic:e.initializeOpen})),c=(0,u.combine)(r,e.components.listStore,(e,t)=>(e.componentName?t.find(t=>t.name===e.componentName):void 0)||t.find(t=>t.name===`experience:${e.id}`)||t.find(e=>e.name===`experience`),{skipVoid:!1}),l=(0,u.combine)(r,e.steps.indexStore,e.conditions.indexStore,(e,t,n)=>{let r=e.nodes.filter(a.u).map(e=>t[e.stepId]).filter(e=>e!==void 0),i=e.nodes.filter(a.l).map(e=>n[e.conditionId]).filter(e=>e!==void 0);return{steps:r,nodes:e.nodes,edges:e.edges,conditions:i}}),d=n.actions??[],p,m=(0,u.attach)({source:s,effect:(t,r)=>{let a=i.i(t.targetSelectors,n.id);a.forEach(({elements:e})=>e.forEach(e=>i.s(e,n.id))),i.t(a,n.id,n.key).forEach(t=>{r?e.experienceInstances.spawn(p,t,r):e.experienceInstances.spawn(p,t)})}}),h=(0,u.combine)({preconditionPassed:e.preconditionPassedStore,isUser:e.session.store.map(e=>e.isUser,{skipVoid:!1}),config:s}),g=(0,u.attach)({source:h,effect:async({preconditionPassed:r,isUser:a,config:o})=>{if(!r||!a)return!1;let{decisionLogic:s,targetSelectors:c}=o;return c.length===0||i.i(c,n.id).length<1?!1:s===void 0||!t.n(s)||await t.t(e,s)===!0}}),_=(0,u.createEffect)(async()=>{if(!e.contentLoader)return!0;try{await e.contentLoader({id:n.id,key:n.key})}catch{`${n.id}`}return!0}),v=(0,u.createEvent)(),y=(0,u.createEvent)(),b=f.createStore(void 0,{skipVoid:!1}).on(v,(e,t)=>t).on(y,(e,t)=>t);return(0,u.sample)({clock:v,target:g}),(0,u.sample)({clock:g.doneData,source:b,filter:(e,t)=>t,fn:e=>e,target:m}),(0,u.sample)({clock:g.doneData,filter:Boolean,target:_}),(0,u.sample)({clock:y,source:b,fn:e=>e,target:m}),(0,u.sample)({clock:y,target:_}),p={id:n.id,key:n.key,name:n.name,configStore:s,treeStore:l,componentStore:c,actions:d,merge:o.merge,initialiseFx:m,shouldInitialiseFx:g,initialiseRequested:v,initialiseDirectly:y,prepareExperienceContentFx:_},p});function m(e){return(0,d.invoke)(p,e)}var h=(0,d.createFactory)(({client:e})=>{let t=f.store({}),n=(0,u.createApi)(t,{register(e,t){return{...e,[t.id]:t}}}),r=(0,u.createEvent)(),i=(0,u.createEffect)(t=>{n.register(m({client:e,experience:t}))});(0,u.sample)({clock:r,source:t,filter:(e,t)=>e[t.id]!==void 0,fn:(e,t)=>({existing:e[t.id],experience:t})}).watch(({existing:e,experience:t})=>{e?.merge({experience:t,strategy:`override`})}),(0,u.sample)({clock:r,source:t,filter:(e,t)=>e[t.id]===void 0,fn:(e,t)=>t,target:i});let a=t.map(e=>Object.values(e));function o(e){return t.map(t=>t[e],{skipVoid:!1})}function s(e){return t.map(t=>Object.values(t).find(t=>t.key===e)??t[e],{skipVoid:!1})}let c=(0,u.attach)({source:t,effect:(e,t)=>{let n=`key`in t?Object.values(e).find(e=>e.key===t.key):e[t.id];if(!n){`key`in t?`${t.key}`:`${t.id}`;return}let{options:r}=t;r?.bypassCondition?n.initialiseDirectly(r):n.initialiseRequested(r)}});return{register:r,get:o,getById:o,getByKey:s,launch:c,open:(0,u.attach)({source:{experiences:t,instances:e.experienceInstances.listStore},effect:async({experiences:e,instances:t},n)=>{let r=`key`in n?Object.values(e).find(e=>e.key===n.key):e[n.id],i=t.filter(e=>e.experienceId===r?.id);if(i.length>0){for(let e of i)e.open();return}let a=`key`in n?{key:n.key,options:{...n.options,initialiseOpen:!0}}:{id:n.id,options:{...n.options,initialiseOpen:!0}};await c(a)}}),listStore:a,initialiseExperiencesFx:(0,u.attach)({source:a,effect:e=>{for(let t of e)t.initialiseRequested(void 0)}})}});function g(e){return(0,d.invoke)(h,e)}var _=async e=>{await e.experiences.initialiseExperiencesFx()};function v(e){return(0,u.createEffect)(async()=>{await e()})}var y=(e,t,n)=>{let r=t.name,i=t.setup(e);if(i){let e=n[r]??{};n[r]=Object.freeze({...e,...i})}},b=(0,u.createDomain)(`component`),x=(0,d.createFactory)(({client:e,component:t,name:n})=>({name:n,component:t,frameworkStore:e.frameworks.getByName(t.frameworkName)}));function S(e){return(0,d.invoke)(x,e)}var C=(0,d.createFactory)(({client:e})=>{let t=b.store({}),r=(0,u.createApi)(t,{register(e,t){return{...e,[t.name]:t}}}),i=(0,u.createEvent)();(0,u.sample)({clock:i,source:t,filter:(e,{name:t})=>e[t]!==void 0,fn:(e,{name:t})=>`Component '${t}' already registered. Registering again will override the previous registration.`}).watch(e=>n.t(`warn`,e)),(0,u.sample)({clock:i,fn:({name:t,component:n})=>S({client:e,name:t,component:n}),target:r.register});let a=t.map(e=>Object.values(e));function o(e){return t.map(t=>t[e],{skipVoid:!1})}return{register:i,getByName:o,listStore:a}});function w(e){return(0,d.invoke)(C,e)}var T=(e,t,n)=>{n.register({name:e,component:t})},E=(0,u.createDomain)(`framework`),D=(0,d.createFactory)(e=>{let t=E.store({}),r=(0,u.createApi)(t,{register(e,t){return{...e,[t.name]:t.framework}}}),i=(0,u.createEvent)();(0,u.sample)({clock:i,source:t,filter:(e,{name:t})=>e[t]!==void 0,fn:(e,{name:t})=>`Framework '${t}' already registered. Registering again will override the previous registration.`}).watch(e=>n.t(`warn`,e)),(0,u.sample)({clock:i,target:r.register});let a=t.map(e=>Object.values(e));function o(e){return t.map(t=>t[e],{skipVoid:!1})}return{register:i,getByName:o,listStore:a}});function O(e){return(0,d.invoke)(D,e)}var k=(e,t)=>{t.register({name:e.name,framework:e})},A=(0,d.createFactory)(({client:e})=>{let t=`window`in globalThis,n={location:t?globalThis.location:void 0,document:t?globalThis.document:void 0,sessionStorage:t?globalThis.sessionStorage:void 0,localStorage:t?globalThis.localStorage:void 0};return(0,u.combine)(e.responses.listStore,e.fields.listStore,(t,r)=>Object.freeze({client:e,responses:t,fields:r,...n}))});function ee(e){return(0,d.invoke)(A,e)}function j(e){return typeof e==`number`&&!isNaN(e)}function M(e){return typeof e==`string`}function N(e){return Array.isArray(e)}function P(e){return e instanceof Promise}function F(e){return typeof e==`object`&&!!e&&!Array.isArray(e)&&Object.keys(e).length===1}function I(e){if(j(e))return e;let t=parseFloat(`${e}`);return isNaN(t)?0:t}function L(e){return`${e}`}var te={"==":(e,t)=>e==t,"===":(e,t)=>e===t,"!=":(e,t)=>e!=t,"!==":(e,t)=>e!==t,">":(e,t)=>I(e)>I(t),">=":(e,t)=>I(e)>=I(t),"<":(e,t,n)=>{let r=I(e),i=I(t);if(n===void 0)return r<i;let a=I(n);return r<i&&i<a},"<=":(e,t,n)=>{let r=I(e),i=I(t);if(n===void 0)return r<=i;let a=I(n);return r<=i&&i<=a},"!!":async e=>await z(e),"!":async e=>!await z(e),"%":(e,t)=>I(e)%I(t),log:e=>(console.log(e),e),in:(e,t)=>t?M(t)?t.indexOf(L(e))!==-1:N(t)?t.includes(e):!1:!1,cat:(...e)=>e.map(L).join(``),substr:(e,t,n)=>{let r=L(e),i=I(t);if(n===void 0)return r.substr(i);let a=I(n);if(a<0){let e=r.substr(i);return e.substr(0,e.length+a)}return r.substr(i,a)},"+":(...e)=>e.reduce((e,t)=>I(e)+I(t),0),"*":(...e)=>e.reduce((e,t)=>I(e)*I(t),1),"-":(e,t)=>{let n=I(e);return t===void 0?-n:n-I(t)},"/":(e,t)=>I(e)/I(t),min:(...e)=>Math.min(...e.map(I)),max:(...e)=>Math.max(...e.map(I)),merge:(...e)=>e.reduce((e,t)=>N(t)?e.concat(t):e.concat([t]),[]),var(e,t){let n=arguments.length>1?t:null;if(e===``||e===`.`||e==null)return this;if(typeof e==`number`&&Array.isArray(this))return e>=0&&e<this.length?this[e]:n;let r=L(e);if(r===``||r===`.`)return this;let i=r.split(`.`),a=this;for(let e of i){if(a==null)return n;if(Array.isArray(a)){let t=parseInt(e,10);a=isNaN(t)?a[e]:a[t]}else a=a[e]}return a===void 0?n:a},async missing(...e){let t=N(e[0])?e[0]:e,n=[];for(let e of t){let t=await R({var:e},this);(t===null||t===``)&&n.push(`${e}`)}return n},async missing_some(e,t){let n=await R({missing:t},this);if(!N(n)||!N(t))return[];let r=n.filter(M);return t.filter(M).length-r.length>=I(e)?[]:r},invoke(...e){let[t,...n]=e;return typeof t==`function`?Reflect.apply(t,null,n):null},startsWith:(e,t)=>M(e)&&M(t)&&e.startsWith(t),endsWith:(e,t)=>M(e)&&M(t)&&e.endsWith(t),regexp_matches(e,t){let n=e,r=``;if(N(e)){let[t,i]=e;n=t,r=i}return!M(n)||!M(r)?!1:new RegExp(n,r).test(L(t))},throw(e){throw Error(L(e))}};async function R(e,t){if(!e)return e;if(P(e))return R(await e,t);if(N(e))return Promise.all(e.map(e=>R(e,t)));if(!F(e))return e;let n=ne(e),r=n?e[n]??[]:[];switch(N(r)||(r=[r]),n){case`if`:case`?:`:for(let e=0;e<r.length-1;e+=2)if(await z(await R(r[e],t)))return R(r[e+1],t);return r.length%2==1?R(r[r.length-1],t):null;case`and`:{let e=null;for(let n of r)if(e=await R(n,t),!await z(e))return e;return e}case`or`:{let e=null;for(let n of r)if(e=await R(n,t),await z(e))return e;return e}case`map`:{let e=await R(r[0],t);return N(e)?await Promise.all(e.map(e=>R(r[1],e))):[]}case`filter`:{let e=await R(r[0],t);return N(e)?(await Promise.all(e.map(async e=>({item:e,shouldInclude:await z(await R(r[1],e))})))).filter(({shouldInclude:e})=>e).map(({item:e})=>e):[]}case`reduce`:{let e=await R(r[0],t);if(!N(e))return r.length>2?await R(r[2],t):null;let n=r[1],i=r.length>2?await R(r[2],t):null;for(let t of e)i=await R(n,{current:t,accumulator:i});return i}case`all`:{let e=await R(r[0],t);if(!N(e)||e.length===0)return!1;for(let t of e)if(!await z(await R(r[1],t)))return!1;return!0}case`some`:{let e=await R(r[0],t);if(!N(e))return!1;for(let t of e)if(await z(await R(r[1],t)))return!0;return!1}case`none`:{let e=await R(r[0],t);if(!N(e))return!0;for(let t of e)if(await z(await R(r[1],t)))return!1;return!0}case`catch`:try{return await R(r[0],t)}catch(e){return F(e)?await R(e,t):r[1]?await R(r[1],e):e instanceof Error?e.message:e}}let i=await Promise.all(r.map(e=>R(e,t))),a=n?te[n]:void 0;if(!a)throw Error(`Unrecognized operation ${n}`);return a.apply(t,i)}async function z(e){return P(e)?z(await e):!(Array.isArray(e)&&e.length===0)&&!!e}function ne(e){return Object.keys(e)[0]}function B(e,t,n){return new Proxy(Object.create(null),{get(r,i){if(typeof i!=`string`)return;let a=e.find(e=>e.key===i);if(a!==void 0)return async()=>!n.has(i)&&await R(a.logic,{...t,conditions:B(e,t,new Set(n).add(i))})===!0}})}var re=(0,d.createFactory)(({client:e})=>(0,u.attach)({source:{stateSnapshot:e.stateSnapshotStore,predicates:e.predicates.listStore,actions:e.actions.listStore,features:e.features.listStore,responses:e.responses.getAllStore,conditions:e.conditions.listStore},effect:async({stateSnapshot:e,predicates:t,actions:n,features:r,responses:i,conditions:a},{rule:o,context:s})=>{let c=t.reduce((t,n)=>(t[n.name]=async(...t)=>await n.predicate({...e,args:t}),t),{}),l=n.reduce((t,n)=>(t[n.key]=async(...t)=>await n.action({...e,args:t},null)??void 0,t),{}),u=r.reduce((e,t)=>(e[t.id]=async()=>{let{bucket:e}=await t.getBucket();return e},e),{}),d={responses:i,location:typeof e.location==`object`?{hash:e.location.hash,host:e.location.host,hostname:e.location.hostname,href:e.location.href,origin:e.location.origin,pathname:e.location.pathname,port:e.location.port,protocol:e.location.protocol,search:e.location.search}:void 0,predicates:c,actions:l,features:u,...s};return await R(o,{...d,conditions:B(a,d,new Set)})}}));function ie(e){return(0,d.invoke)(re,e)}var ae=6e3,oe=o.t(`last_ping`,`global`),se=async e=>{try{let t=Date.now(),n=o.n.get(oe),r=0;if(n.isSet()&&(r=n.json()??0),r&&t-r<ae)return!0;let i={projectId:e.projectId,path:window.location.pathname},a={},c=document.getElementById(`picked_script`)?.dataset.verceltoken;c&&(a[`x-vercel-protection-bypass`]=c);let l=(await s.n(e.apiUrl,`ping`,i,a)).ok;return l&&n.set(t),l}catch{return!1}},V=(0,u.createDomain)(`lifecycle`),ce=(0,d.createFactory)(({client:e})=>{let n=V.store(!1),a=(0,u.createStore)(void 0,{skipVoid:!1,domain:V}),o=(0,u.createStore)(void 0,{skipVoid:!1,domain:V}),s=V.store(`idle`),c=V.store([]),l=(0,u.createStore)(void 0,{skipVoid:!1,domain:V}),d=(0,u.createStore)(void 0,{skipVoid:!1,domain:V}),f=(0,u.createEvent)(),p=(0,u.createEvent)(),m=(0,u.createEvent)(),h=(0,u.createEvent)(),g=(0,u.createEvent)(),v=(0,u.createEvent)();c.on(h,(e,t)=>[...e,t]),l.on(g,(e,t)=>t),d.on(v,(e,t)=>t),n.on(p,()=>!0);let y=(0,u.createEffect)(()=>{se(e)}),b=(0,u.createEffect)(async()=>{await i.r()}),x=(0,u.createEffect)(async()=>{await _(e)}),S=(0,u.attach)({effect:x}),C=(0,u.attach)({source:c,effect:async e=>{for(let t of e)await t()}}),w=(0,u.attach)({source:l,effect:async n=>n===void 0?!0:typeof n==`boolean`?n:await t.t(e,n)===!0}),T=(0,u.attach)({source:d,effect:async n=>n===void 0?!0:typeof n==`boolean`?n:await t.t(e,n)===!0}),E=(0,u.sample)({clock:f,source:s,filter:e=>e===`idle`&&r.i(),fn:()=>void 0});(0,u.sample)({clock:E,fn:()=>`starting`,target:s}),(0,u.sample)({clock:E,target:y}),(0,u.sample)({clock:E,target:C}),(0,u.sample)({clock:E,target:b}),(0,u.sample)({clock:C.done,target:w}),(0,u.sample)({clock:w.doneData,target:a}),(0,u.sample)({clock:T.doneData,target:o}),(0,u.sample)({clock:w.doneData,filter:e=>e,target:T}),(0,u.sample)({clock:T.doneData,target:e.session.setIsUser}),(0,u.sample)({clock:T.doneData,fn:e=>({type:`user_decide`,value:e}),target:e.eventBus}),(0,u.sample)({clock:w.doneData,filter:e=>!e,fn:()=>void 0,target:m}),(0,u.sample)({clock:T.doneData,fn:()=>void 0,target:m}),(0,u.sample)({clock:m,fn:()=>({type:`initialize`}),target:e.eventBus});let D=(0,u.createStore)(!1).on(b.done,()=>!0),O=(0,u.createStore)(!1).on(m,()=>!0),k=(0,u.createStore)(!1).on(S.done,()=>!0),A=(0,u.combine)(a,o,(e,t)=>e===!0&&t===!0);(0,u.sample)({clock:m,source:A,filter:e=>e,fn:()=>void 0,target:x});let ee=(0,u.combine)(D,O,A,(e,t,n)=>e&&t&&n);(0,u.sample)({clock:ee,filter:e=>e,fn:()=>void 0,target:S});let j=(0,u.combine)(D,O,A,k,(e,t,n,r)=>e&&t&&(!n||r));return(0,u.sample)({clock:j,filter:e=>e,fn:()=>void 0,target:p}),(0,u.sample)({clock:p,fn:()=>`ready`,target:s}),(0,u.sample)({clock:p,fn:()=>({type:`ready`}),target:e.eventBus}),(0,u.sample)({clock:p,source:e.session.store,fn:({id:e,isUser:t,identifiers:n})=>({type:`session`,id:e,isUser:t,identifiers:n}),target:e.eventBus}),(0,u.sample)({clock:[C.fail,w.fail,T.fail,x.fail,S.fail,b.fail],fn:()=>`failed`,target:s}),{start:f,readyStore:n,preconditionPassedStore:a,conditionPassedStore:o,lifecycleStageStore:s,registerPluginStartHook:h,setPrecondition:g,setCondition:v}});function le(e){return(0,d.invoke)(ce,e)}var ue=(0,u.createDomain)(`predicate`),de=(0,d.createFactory)(({client:e})=>{let t=ue.store({}),r=(0,u.createApi)(t,{register(e,t){return{...e,[t.name]:{name:t.name,predicate:t.predicate}}}}),i=(0,u.createEvent)();(0,u.sample)({clock:i,source:t,filter:(e,{name:t})=>e[t]!==void 0,fn:(e,{name:t})=>`Predicate '${t}' already registered. Registering again will override the previous registration.`}).watch(e=>n.t(`warn`,e)),(0,u.sample)({clock:i,fn:({name:e,predicate:t})=>Object.freeze({name:e,predicate:t}),target:r.register});let a=t.map(e=>Object.values(e));function o(e){return t.map(t=>t[e]?.predicate,{skipVoid:!1})}function s(t){let n=(0,u.createStore)(()=>void 0,{skipVoid:!1}),r=(0,u.attach)({source:{predicate:o(t),snapshot:e.stateSnapshotStore},effect:({predicate:e,snapshot:t})=>{if(e)return(...n)=>e({...t,args:n})}});return(0,u.sample)({source:{responses:e.responses.listStore,fields:e.fields.listStore},target:r}),(0,u.sample)({clock:r.doneData,filter:e=>e!==void 0,target:n}),r(),n}return{register:i,getByName:o,listStore:a,getEvokablePredicate:s}});function fe(e){return(0,d.invoke)(de,e)}var pe=(e,t,n)=>{n.register({name:e,predicate:t})},H=(0,u.createDomain)(`feature`);function U(e){return e?.enabled===!1}function W(e){return e===`true`||e!==`false`&&e}var me=(0,d.createFactory)(({client:e})=>{let t=H.store({}),r=H.store([]),i=(0,u.createApi)(t,{register(e,t){return{...e,[t.id]:t.feature}}}),a=(0,u.createEvent)();(0,u.sample)({clock:a,source:t,filter:(e,{id:t})=>e[t]!==void 0,fn:(e,{id:t})=>`Feature '${t}' already registered. Registering again will override the previous registration.`}).watch(e=>n.t(`warn`,e)),(0,u.sample)({clock:a,fn:({id:e,feature:t})=>Object.freeze({id:e,feature:{id:e,feature:{...t,id:e}}}),target:i.register});let s=(0,u.createEffect)(async({id:e,key:t,storage:n=`local`,enabled:r})=>{if(r===!1)return null;let i=o.t(`feature:${e}:${t}`,`global`),a=(n===`session`?o.r:o.n).get(i).text();return a?{id:e,key:t,bucket:W(a),storage:n}:null}),c=(0,u.createEffect)(e=>{if(!e)return null;let t=o.t(`feature:${e.id}:${e.key}`,`global`);(e.storage===`session`?o.r:o.n).set(t,e.bucket)}),l=new Map,d=(0,u.attach)({source:{allFeaturesStore:t,resolvedFeaturesStore:r},effect:async({allFeaturesStore:e,resolvedFeaturesStore:t},{id:n,decide:r,key:i})=>{let a=t.find(e=>e.id===n&&e.key===i);if(a)return a;let o=e[n];if(!o)throw Error(`Feature with id '${n}' not found`);if(U(o.feature))return{id:o.id,bucket:!1,key:i,storage:o.feature.storage};let s=l.get(`${n}:${i}`);if(s!==void 0){let e=await s;return{id:o.id,bucket:e,key:i,storage:o.feature.storage}}let c=r();l.set(`${n}:${i}`,c);let u=await c;return{id:o.id,bucket:u,key:i,storage:o.feature.storage}}});(0,u.sample)({clock:i.register,fn:e=>{let{id:t,feature:n}=e;return{id:t,key:n.feature.key,storage:n.feature.storage,enabled:n.feature.enabled}},target:s}),(0,u.sample)({source:t,clock:d.doneData,filter:(e,t)=>!U(e[t.id]?.feature),fn:(e,t)=>{let{id:n,bucket:r,storage:i}=t,a=e[n]?.feature.key;return a?{key:a,id:n,bucket:r,storage:i}:null},target:c});let f=(0,u.combine)({allFeaturesStore:t,resolvedFeaturesStore:r}).map(({allFeaturesStore:e,resolvedFeaturesStore:t})=>Object.values(e).map(e=>{let n=t.find(t=>t.id===e.id&&t.key===e.feature.key);return n?{id:e.id,name:e.feature.name,key:e.feature.key,enabled:e.feature.enabled,weight:e.feature.weight,getBucket:()=>({id:e.id,bucket:n.bucket}),isResolved:!0}:{id:e.id,name:e.feature.name,key:e.feature.key,enabled:e.feature.enabled,weight:e.feature.weight,getBucket:async()=>await d(e.feature),isResolved:!1}}));(0,u.sample)({clock:d.doneData,source:{resolvedFeatures:r,allFeatures:t},filter:({resolvedFeatures:e,allFeatures:t},{id:n,key:r})=>!U(t[n]?.feature)&&!e.some(e=>e.id===n&&e.key===r),fn:(e,t)=>t,target:e.eventBus.prepend(e=>({type:`feature_decide`,feature:e}))}),(0,u.sample)({clock:[s.doneData,d.doneData],source:{resolvedFeatures:r,allFeatures:t},fn:({resolvedFeatures:e,allFeatures:t},n)=>!n||U(t[n.id]?.feature)||e.some(e=>e.id===n.id&&e.key===n.key)?e:[...e,n],target:r});function p(e){return f.map(t=>t.find(t=>t.id===e))}let m=new Map,h=new Map,g=new Map;function _(e){let t=m.get(e);if(t)return t;let n=p(e);return m.set(e,n),n}function v(e){return t.map(t=>t[e],{skipVoid:!1})}function y(e){let t=(0,u.createStore)(async()=>void 0,{skipVoid:!1}),n=_(e),r=(0,u.attach)({source:n,effect:async e=>{if(e)return async()=>(await e.getBucket()).bucket}});return(0,u.sample)({clock:n,target:r}),(0,u.sample)({clock:r.doneData,filter:e=>e!==void 0,target:t}),r(),t}function b(e){let t=h.get(e);if(t)return t;let n=y(e);return h.set(e,n),n}function x(e){let t=b(e),n=(0,u.createStore)(void 0,{skipVoid:!1}),r=(0,u.attach)({source:t,mapParams:(e,t)=>t,effect:(0,u.createEffect)(async e=>await e())});return(0,u.sample)({clock:r.doneData,fn:t=>{if(t!==void 0)return{id:e,bucket:t}},target:n}),(0,u.sample)({clock:t,target:r}),r(),n}function S(e){let t=g.get(e);if(t)return t;let n=x(e);return g.set(e,n),n}return{register:a,getById:_,getByName:v,listStore:f,getEvokableFeature:b,getFeatureResult:S}});function he(e){return(0,d.invoke)(me,e)}var ge=(e,t,n)=>{n.register({id:e,feature:t})},G=(0,u.createDomain)(`history`);function K(e,t){return{id:c.t(`history-entry-${Date.now()}-${Math.random()}}`),node:t,at:Date.now(),experienceId:e}}var _e=(0,d.createFactory)(()=>{let e=G.store({entries:[]}),t=G.event(),n=G.event(),r=G.event(),i=G.event();e.on(t,(e,t)=>({entries:[...e.entries,K(t.experienceId,t.node)]})),e.on(n,(e,t)=>({entries:[...e.entries.slice(0,-1),K(t.experienceId,t.node)]})),e.on(i,(e,t)=>t);function o(e,t){let n={lastStepIndex:-1,secondLastStepIndex:-1};for(let r=e.length-1;r>=0;r--){let i=e[r],o=i?.node;if(!(!o||!a.u(o))&&!(t&&i.experienceId!==t))if(n.lastStepIndex===-1)n.lastStepIndex=r;else{n.secondLastStepIndex=r;break}}return n}return e.on(r,(e,t)=>{let{secondLastStepIndex:n}=o(e.entries,t.experienceId),r=n===-1?e.entries:e.entries.slice(0,n+1);return{...e,entries:r}}),{push:t,replace:n,back:r,restore:i,entriesStore:e.map(e=>e.entries)}});function ve(){return(0,d.invoke)(_e)}var ye=0,be=e=>{let t=(0,u.createStore)([]);return t.on(e,(e,t)=>[...e,{id:ye++,at:new Date,payload:t}]),t},xe=(0,u.createDomain)(`field`),Se=(0,d.createFactory)(()=>{let e=xe.store({}),t=(0,u.createApi)(e,{register(e,t){return{...e,[t.field.id]:t.field}},updateByKey(e,t){let n=Object.values(e).find(e=>e.key===t.fieldKey);return n?{...e,[n.id]:Object.assign({},n,t.updates)}:e}});function n(e){t.register({field:e})}let r={};e.watch(e=>{r=e});function i(e,n){let i=Object.values(r).find(t=>t.key===e)?.key;i&&t.updateByKey({fieldKey:i,updates:n})}let a=e.map(e=>Object.values(e));function o(t){return e.map(e=>e[t]??null,{skipVoid:!1})}function s(t){return e.map(e=>Object.values(e).find(e=>e.key===t)??null,{skipVoid:!1})}function c(t){return e.map(e=>Object.values(e).find(e=>e.name===t)??null,{skipVoid:!1})}return{register:n,update:i,getById:o,getByKey:s,listStore:a,getByName:c}});function Ce(){return(0,d.invoke)(Se)}var we=(0,u.createDomain)(`step`),Te=(0,d.createFactory)(()=>{let e=we.store({}),t=(0,u.createApi)(e,{register(e,t){return{...e,[t.step.id]:t.step}}});function n(e){t.register({step:e})}let r=e.map(e=>Object.values(e));function i(t){return e.map(e=>e[t]??null,{skipVoid:!1})}function a(t){return e.map(e=>Object.values(e).find(e=>e.key===t)??null,{skipVoid:!1})}return{register:n,getById:i,getByKey:a,listStore:r,indexStore:e}});function Ee(){return(0,d.invoke)(Te)}function De(e,t){t.register(e)}var Oe=(0,u.createDomain)(`content`),ke=(0,d.createFactory)(()=>{let e=Oe.store({}),t=(0,u.createApi)(e,{register(e,t){return{...e,[t.content.id]:t.content}},patch(e,t){let n=e[t.id];if(!n)return e;let r=t.apply(n.data);return r===n.data?e:{...e,[t.id]:{...n,data:r}}}});function n(e){t.register({content:e})}function r(e,n){t.patch({id:e,apply:n})}let i=e.map(e=>Object.values(e));function a(t){return e.map(e=>e[t]??null,{skipVoid:!1})}return{register:n,patch:r,getById:a,listStore:i,indexStore:e}});function Ae(){return(0,d.invoke)(ke)}function je(e,t){t.register(e)}var Me=(0,u.createDomain)(`action`),Ne=(0,d.createFactory)(({client:e})=>{let t=Me.store({}),r=(0,u.createApi)(t,{register(e,t){return{...e,[t.key]:{key:t.key,action:t.action}}}}),i=(0,u.createEvent)();(0,u.sample)({clock:i,source:t,filter:(e,{key:t})=>e[t]!==void 0,fn:(e,{key:t})=>`Action '${t}' already registered. Registering again will override the previous registration.`}).watch(e=>n.t(`warn`,e)),(0,u.sample)({clock:i,fn:({key:e,action:t})=>Object.freeze({key:e,action:t}),target:r.register});let a=t.map(e=>Object.values(e));function o(e){return t.map(t=>t[e]?.action,{skipVoid:!1})}function s(t,n){let r=(0,u.createStore)(()=>void 0,{skipVoid:!1}),i=n?{experience:n.experience}:null,a=(0,u.attach)({source:{action:o(t),snapshot:e.stateSnapshotStore},effect:({action:e,snapshot:t})=>{if(e)return(...n)=>e({...t,args:n},i)}});return(0,u.sample)({source:{responses:e.responses.listStore,fields:e.fields.listStore},target:a}),(0,u.sample)({clock:a.doneData,filter:e=>e!==void 0,target:r}),a(),r}return{register:i,getByKey:o,listStore:a,getEvokableAction:s}});function Pe(e){return(0,d.invoke)(Ne,e)}var Fe=(e,t,n)=>{n.register({key:e,action:t})};function q(e,t,n,r){return{fieldKey:e.key,userMessage:n,systemMessage:r,value:t}}function J(e){return e===null||e===``||Array.isArray(e)&&!e.length}function Ie(e){return typeof e==`string`||typeof e==`number`||typeof e==`boolean`||e===null}function Y(e){try{return JSON.stringify(e),!0}catch{return!1}}function Le(e,t){return t.find(t=>t.key===e)??null}function Re(e,t){return e.multiple&&(typeof t==`string`||typeof t==`number`||typeof t==`boolean`)?[t]:t}function ze(e,t){if(e.type!==`object`||J(t))return null;if(e.multiple){if(!Array.isArray(t))return q(e,t,`This field expects multiple values`,`Field expects an array of objects.`);for(let n of t){if(typeof n!=`object`||!n)return q(e,t,`This field expects object values`,`Field expects an array of objects, but received non-object value.`);if(!Y(n))return q(e,t,`This field contains non-serializable data`,`Field value contains non-JSON-serializable data (functions, circular references, etc.).`)}return null}return Array.isArray(t)?q(e,t,`This field expects a single value`,`Field expects a single object, not an array.`):typeof t!=`object`||!t?q(e,t,`This field expects an object value`,`Field expects an object value.`):Y(t)?null:q(e,t,`This field contains non-serializable data`,`Field value contains non-JSON-serializable data (functions, circular references, etc.).`)}function Be(e,t){if(J(t)||!Array.isArray(e.options)||e.options.length===0)return null;let n=Array.isArray(t)?t:[t];if(e.type===`object`){let r=new Set(e.options.map(e=>JSON.stringify(e.value)));return n.every(e=>r.has(JSON.stringify(e)))?null:q(e,t,`This field expects a valid option`,`Field expects a valid option from the defined choices.`)}let r=e.options.map(e=>e.value);return n.every(e=>!Ie(e)||e===null?!1:r.includes(e))?null:q(e,t,`This field expects a valid option`,`Field expects a valid option. Valid options are: ${r.join(`, `)}`)}async function Ve(t,n,r,i){if(n.validation&&!e.t(n.validation)&&!J(r)){let e=i?{$input:r,responses:i}:{$input:r},a=await t(n.validation,e);if(typeof a==`string`)return q(n,r,a,`Field validation resulted in an error: ${a}.`);if(a===!1)return q(n,r,`This field is invalid`,`Field validation resulted in an unspecified error.`)}return n.required&&J(r)?q(n,r,`This field is required`,`Field is required.`):!n.multiple&&Array.isArray(r)&&r.length>1?q(n,r,`This field expects a single response`,`Field expects a single response.`):null}var He=(0,u.createDomain)(`response`),Ue=(0,d.createFactory)(({client:e})=>{let n=He.store({}),r=(0,u.createEvent)(),i=(0,u.createEvent)(),a=(0,u.createApi)(n,{register(e,t){return{...e,[t.fieldKey]:t.response}},registerBatch(e,t){return{...e,...t}},clear(e,t){return Object.fromEntries(Object.entries(e).filter(([e])=>e!==t))},clearAll(){return{}}});function o(e,t){if(typeof e==`string`){if(t===void 0)throw Error(`Response is required when registering a single field`);a.register({fieldKey:e,response:t})}else a.registerBatch(e)}let s=(n,r)=>t.t(e,n,r),c=(0,u.attach)({source:{allFields:e.fields.listStore,existingResponses:n},effect:async({allFields:e,existingResponses:t},n)=>{let r=[],i={},a={...t,...n},o=Object.entries(n),c=await Promise.allSettled(o.map(async([t,n])=>{let o=Le(t,e);if(!o){r.push({fieldKey:t,userMessage:`Field '${t}' not found`,systemMessage:`No field with key '${t}' exists. Available field keys are: ${e.map(e=>e.key).join(`,`)}.`,value:n});return}let c=Re(o,n),l=await Ve(s,o,c,a);if(l){r.push(l);return}let u=ze(o,c);if(u){r.push(u);return}let d=Be(o,c);if(d){r.push(d);return}i[o.key]=n}));for(let[e,t]of c.entries()){if(t.status!==`rejected`)continue;let n=o[e];if(!n)continue;let[i,a]=n,s=t.reason instanceof Error?t.reason.message:String(t.reason);r.push({fieldKey:i,userMessage:`An unexpected error occurred validating this field`,systemMessage:`Validation threw for field '${i}': ${s}`,value:a})}return{responsesToCommit:i,validationErrors:r}}});async function l(e){return c(e)}let d=(0,u.attach)({source:n,effect:async(e,t)=>{let{responsesToCommit:n,validationErrors:r}=await c(t);return r.length?{errors:r}:(a.registerBatch(n),{errors:[]})}});async function f(e){return d(e)}let p=n.map(e=>e),m=n.map(e=>Object.entries(e).map(([e,t])=>({fieldKey:e,value:t})));function h(e){return(0,u.combine)({f:e,s:n},({f:e,s:t})=>{let n=e?t[e.key]??null:null;return n===null?e?.defaultValue!==void 0&&e.defaultValue!==null?e.defaultValue:null:n})}function g(t){return h(e.fields.getById(t))}function _(t){return h(e.fields.getByKey(t))}function v(t){return h(e.fields.getByName(t))}return(0,u.sample)({clock:r,target:a.clearAll}),(0,u.sample)({clock:i,target:a.clear}),{register:o,clearAll:r,clear:i,commit:f,getResponsesToCommit:l,listStore:m,getAllStore:p,getByFieldId:g,getByFieldKey:_,getByFieldName:v}});function We(e){return(0,d.invoke)(Ue,e)}var Ge=(0,u.createDomain)(`condition`),Ke=(0,d.createFactory)(()=>{let e=Ge.store({}),t=(0,u.createApi)(e,{register(e,t){return{...e,[t.condition.id]:t.condition}}});function n(e){t.register({condition:e})}let r=e.map(e=>Object.values(e));function i(t){return e.map(e=>e[t]??null,{skipVoid:!1})}function a(t){return e.map(e=>Object.values(e).find(e=>e.key===t)??null,{skipVoid:!1})}return{register:n,getById:i,getByKey:a,listStore:r,indexStore:e}});function qe(){return(0,d.invoke)(Ke)}function Je(){if(r.i()){let e=[document.currentScript,document.getElementById(`picked_script`),document.getElementById(`picked`),document.getElementById(`cvly`),document.getElementById(`cvly-x`)];for(let t of e)if(t?.dataset.api)return t.dataset.api}return`https://api.picked.app`}function Ye(){if(!r.f())return{};let e=new URLSearchParams(window.location.search),t={},n=new Set;for(let[t]of e.entries())t.startsWith(`picked-`)&&n.add(t);for(let r of n){let n=r.replace(`picked-`,``);t[n]=e.getAll(r)}let i=o.t(`s`);if(n.size>0)o.r.set(i,t);else{let e=o.r.get(i);if(e)return e.json()||{}}return t}var Xe=o.t(`session`,`global`);function Ze(){return r.r()?crypto.randomUUID():`${Date.now().toString(36)}-${Math.random().toString(36).substring(2,15)}-${Math.random().toString(36).substring(2,15)}-${Math.random().toString(36).substring(2,15)}`}function Qe(){if(!r.s())return null;let e=o.n.get(Xe);if(!e.isSet())return null;try{return e.json()}catch{return null}}var $e=(0,d.createFactory)(()=>{let e=Qe(),t={id:e?.id??Ze()};e?.isUser!==void 0&&(t.isUser=e.isUser),e?.identifiers&&Object.keys(e.identifiers).length>0&&(t.identifiers=e.identifiers);let n=(0,u.createStore)(t),i=(0,u.createApi)(n,{setIsUser:(e,t)=>({...e,isUser:t}),setIdentifier:(e,{key:t,value:n})=>({...e,identifiers:{...e.identifiers??{},[t]:n}}),removeIdentifier:(e,t)=>{let n=e.identifiers;if(!n||!(t in n))return e;let r={};for(let[e,i]of Object.entries(n))e!==t&&(r[e]=i);let i={id:e.id};return e.isUser!==void 0&&(i.isUser=e.isUser),Object.keys(r).length>0&&(i.identifiers=r),i}}),a=(0,u.attach)({source:n,effect:e=>{if(r.s())try{o.n.get(Xe).set(e)}catch{}}});return(0,u.sample)({source:n,target:a}),{store:n,setIsUser:i.setIsUser,setIdentifier:i.setIdentifier,removeIdentifier:i.removeIdentifier}});function et(){return(0,d.invoke)($e,void 0)}function tt(){if(r.f())return globalThis.window.pickedConfig}function nt(){if(r.f())return tt()?.projectId}function rt(){if(!r.i())return;let e=document.getElementById(`picked_script`)||document.querySelector(`script#picked`)||document.getElementById(`cvly`);if(e)return e.dataset.projectid||e.getAttribute(`project-id`)||void 0}function it(e){if(e.projectId)return e.projectId;let t=nt();if(t)return t;let n=rt();if(n)return n;throw Error(`projectId is required. You can provide it via one of:
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../object-CIkt7Fkr.cjs"),t=require("../rules-logic-CGZIYgAI.cjs"),n=require("../logger-CSTvAyyB.cjs"),r=require("../supports-DBzjGaWD.cjs"),i=require("../dom-DlLH3FxV.cjs"),a=require("../experience-instance-Dej3P1sE.cjs"),o=require("../storage-DUw9UJ2h.cjs"),s=require("../api-DrCI_JBL.cjs"),c=require("../id-Js-62re-.cjs"),l=require("../inert-script-report-ijRHPtcY.cjs");let u=require("effector"),d=require("@withease/factories");var f=(0,u.createDomain)(`experience`),p=(0,d.createFactory)(({client:e,experience:n})=>{let r=f.store(n),o=(0,u.createApi)(r,{merge(e,t){return{...e,...t.experience}}}),s=r.map(e=>({name:e.name,decisionLogic:e.condition,targetSelectors:e.targets,initializeOpenLogic:e.initializeOpen})),c=(0,u.combine)(r,e.components.listStore,(e,t)=>(e.componentName?t.find(t=>t.name===e.componentName):void 0)||t.find(t=>t.name===`experience:${e.id}`)||t.find(e=>e.name===`experience`),{skipVoid:!1}),l=(0,u.combine)(r,e.steps.indexStore,e.conditions.indexStore,(e,t,n)=>{let r=e.nodes.filter(a.u).map(e=>t[e.stepId]).filter(e=>e!==void 0),i=e.nodes.filter(a.l).map(e=>n[e.conditionId]).filter(e=>e!==void 0);return{steps:r,nodes:e.nodes,edges:e.edges,conditions:i}}),d=n.actions??[],p,m=(0,u.attach)({source:s,effect:(t,r)=>{let a=i.i(t.targetSelectors,n.id);a.forEach(({elements:e})=>e.forEach(e=>i.s(e,n.id))),i.t(a,n.id,n.key).forEach(t=>{r?e.experienceInstances.spawn(p,t,r):e.experienceInstances.spawn(p,t)})}}),h=(0,u.combine)({preconditionPassed:e.preconditionPassedStore,isUser:e.session.store.map(e=>e.isUser,{skipVoid:!1}),config:s}),g=(0,u.attach)({source:h,effect:async({preconditionPassed:r,isUser:a,config:o})=>{if(!r||!a)return!1;let{decisionLogic:s,targetSelectors:c}=o;return c.length===0||i.i(c,n.id).length<1?!1:s===void 0||!t.n(s)||await t.t(e,s)===!0}}),_=(0,u.createEffect)(async()=>{if(!e.contentLoader)return!0;try{await e.contentLoader({id:n.id,key:n.key})}catch{`${n.id}`}return!0}),v=(0,u.createEvent)(),y=(0,u.createEvent)(),b=f.createStore(void 0,{skipVoid:!1}).on(v,(e,t)=>t).on(y,(e,t)=>t);return(0,u.sample)({clock:v,target:g}),(0,u.sample)({clock:g.doneData,source:b,filter:(e,t)=>t,fn:e=>e,target:m}),(0,u.sample)({clock:g.doneData,filter:Boolean,target:_}),(0,u.sample)({clock:y,source:b,fn:e=>e,target:m}),(0,u.sample)({clock:y,target:_}),p={id:n.id,key:n.key,name:n.name,configStore:s,treeStore:l,componentStore:c,actions:d,merge:o.merge,initialiseFx:m,shouldInitialiseFx:g,initialiseRequested:v,initialiseDirectly:y,prepareExperienceContentFx:_},p});function m(e){return(0,d.invoke)(p,e)}var h=(0,d.createFactory)(({client:e})=>{let t=f.store({}),n=(0,u.createApi)(t,{register(e,t){return{...e,[t.id]:t}}}),r=(0,u.createEvent)(),i=(0,u.createEffect)(t=>{n.register(m({client:e,experience:t}))});(0,u.sample)({clock:r,source:t,filter:(e,t)=>e[t.id]!==void 0,fn:(e,t)=>({existing:e[t.id],experience:t})}).watch(({existing:e,experience:t})=>{e?.merge({experience:t,strategy:`override`})}),(0,u.sample)({clock:r,source:t,filter:(e,t)=>e[t.id]===void 0,fn:(e,t)=>t,target:i});let a=t.map(e=>Object.values(e));function o(e){return t.map(t=>t[e],{skipVoid:!1})}function s(e){return t.map(t=>Object.values(t).find(t=>t.key===e)??t[e],{skipVoid:!1})}let c=(0,u.attach)({source:t,effect:(e,t)=>{let n=`key`in t?Object.values(e).find(e=>e.key===t.key):e[t.id];if(!n){`key`in t?`${t.key}`:`${t.id}`;return}let{options:r}=t;r?.bypassCondition?n.initialiseDirectly(r):n.initialiseRequested(r)}});return{register:r,get:o,getById:o,getByKey:s,launch:c,open:(0,u.attach)({source:{experiences:t,instances:e.experienceInstances.listStore},effect:async({experiences:e,instances:t},n)=>{let r=`key`in n?Object.values(e).find(e=>e.key===n.key):e[n.id],i=t.filter(e=>e.experienceId===r?.id);if(i.length>0){for(let e of i)e.open();return}let a=`key`in n?{key:n.key,options:{...n.options,initialiseOpen:!0}}:{id:n.id,options:{...n.options,initialiseOpen:!0}};await c(a)}}),listStore:a,initialiseExperiencesFx:(0,u.attach)({source:a,effect:e=>{for(let t of e)t.initialiseRequested(void 0)}})}});function g(e){return(0,d.invoke)(h,e)}var _=async e=>{await e.experiences.initialiseExperiencesFx()};function v(e){return(0,u.createEffect)(async()=>{await e()})}var y=(e,t,n)=>{let r=t.name,i=t.setup(e);if(i){let e=n[r]??{};n[r]=Object.freeze({...e,...i})}},b=(0,u.createDomain)(`component`),x=(0,d.createFactory)(({client:e,component:t,name:n})=>({name:n,component:t,frameworkStore:e.frameworks.getByName(t.frameworkName)}));function S(e){return(0,d.invoke)(x,e)}var C=(0,d.createFactory)(({client:e})=>{let t=b.store({}),r=(0,u.createApi)(t,{register(e,t){return{...e,[t.name]:t}}}),i=(0,u.createEvent)();(0,u.sample)({clock:i,source:t,filter:(e,{name:t})=>e[t]!==void 0,fn:(e,{name:t})=>`Component '${t}' already registered. Registering again will override the previous registration.`}).watch(e=>n.t(`warn`,e)),(0,u.sample)({clock:i,fn:({name:t,component:n})=>S({client:e,name:t,component:n}),target:r.register});let a=t.map(e=>Object.values(e));function o(e){return t.map(t=>t[e],{skipVoid:!1})}return{register:i,getByName:o,listStore:a}});function w(e){return(0,d.invoke)(C,e)}var T=(e,t,n)=>{n.register({name:e,component:t})},E=(0,u.createDomain)(`framework`),D=(0,d.createFactory)(e=>{let t=E.store({}),r=(0,u.createApi)(t,{register(e,t){return{...e,[t.name]:t.framework}}}),i=(0,u.createEvent)();(0,u.sample)({clock:i,source:t,filter:(e,{name:t})=>e[t]!==void 0,fn:(e,{name:t})=>`Framework '${t}' already registered. Registering again will override the previous registration.`}).watch(e=>n.t(`warn`,e)),(0,u.sample)({clock:i,target:r.register});let a=t.map(e=>Object.values(e));function o(e){return t.map(t=>t[e],{skipVoid:!1})}return{register:i,getByName:o,listStore:a}});function O(e){return(0,d.invoke)(D,e)}var k=(e,t)=>{t.register({name:e.name,framework:e})},A=(0,d.createFactory)(({client:e})=>{let t=`window`in globalThis,n={location:t?globalThis.location:void 0,document:t?globalThis.document:void 0,sessionStorage:t?globalThis.sessionStorage:void 0,localStorage:t?globalThis.localStorage:void 0};return(0,u.combine)(e.responses.listStore,e.fields.listStore,(t,r)=>Object.freeze({client:e,responses:t,fields:r,...n}))});function ee(e){return(0,d.invoke)(A,e)}function j(e){return typeof e==`number`&&!isNaN(e)}function M(e){return typeof e==`string`}function N(e){return Array.isArray(e)}function P(e){return e instanceof Promise}function F(e){return typeof e==`object`&&!!e&&!Array.isArray(e)&&Object.keys(e).length===1}function I(e){if(j(e))return e;let t=parseFloat(`${e}`);return isNaN(t)?0:t}function L(e){return`${e}`}var te={"==":(e,t)=>e==t,"===":(e,t)=>e===t,"!=":(e,t)=>e!=t,"!==":(e,t)=>e!==t,">":(e,t)=>I(e)>I(t),">=":(e,t)=>I(e)>=I(t),"<":(e,t,n)=>{let r=I(e),i=I(t);if(n===void 0)return r<i;let a=I(n);return r<i&&i<a},"<=":(e,t,n)=>{let r=I(e),i=I(t);if(n===void 0)return r<=i;let a=I(n);return r<=i&&i<=a},"!!":async e=>await z(e),"!":async e=>!await z(e),"%":(e,t)=>I(e)%I(t),log:e=>(console.log(e),e),in:(e,t)=>t?M(t)?t.indexOf(L(e))!==-1:N(t)?t.includes(e):!1:!1,cat:(...e)=>e.map(L).join(``),substr:(e,t,n)=>{let r=L(e),i=I(t);if(n===void 0)return r.substr(i);let a=I(n);if(a<0){let e=r.substr(i);return e.substr(0,e.length+a)}return r.substr(i,a)},"+":(...e)=>e.reduce((e,t)=>I(e)+I(t),0),"*":(...e)=>e.reduce((e,t)=>I(e)*I(t),1),"-":(e,t)=>{let n=I(e);return t===void 0?-n:n-I(t)},"/":(e,t)=>I(e)/I(t),min:(...e)=>Math.min(...e.map(I)),max:(...e)=>Math.max(...e.map(I)),merge:(...e)=>e.reduce((e,t)=>N(t)?e.concat(t):e.concat([t]),[]),var(e,t){let n=arguments.length>1?t:null;if(e===``||e===`.`||e==null)return this;if(typeof e==`number`&&Array.isArray(this))return e>=0&&e<this.length?this[e]:n;let r=L(e);if(r===``||r===`.`)return this;let i=r.split(`.`),a=this;for(let e of i){if(a==null)return n;if(Array.isArray(a)){let t=parseInt(e,10);a=isNaN(t)?a[e]:a[t]}else a=a[e]}return a===void 0?n:a},async missing(...e){let t=N(e[0])?e[0]:e,n=[];for(let e of t){let t=await R({var:e},this);(t===null||t===``)&&n.push(`${e}`)}return n},async missing_some(e,t){let n=await R({missing:t},this);if(!N(n)||!N(t))return[];let r=n.filter(M);return t.filter(M).length-r.length>=I(e)?[]:r},invoke(...e){let[t,...n]=e;return typeof t==`function`?Reflect.apply(t,null,n):null},startsWith:(e,t)=>M(e)&&M(t)&&e.startsWith(t),endsWith:(e,t)=>M(e)&&M(t)&&e.endsWith(t),regexp_matches(e,t){let n=e,r=``;if(N(e)){let[t,i]=e;n=t,r=i}return!M(n)||!M(r)?!1:new RegExp(n,r).test(L(t))},throw(e){throw Error(L(e))}};async function R(e,t){if(!e)return e;if(P(e))return R(await e,t);if(N(e))return Promise.all(e.map(e=>R(e,t)));if(!F(e))return e;let n=ne(e),r=n?e[n]??[]:[];switch(N(r)||(r=[r]),n){case`if`:case`?:`:for(let e=0;e<r.length-1;e+=2)if(await z(await R(r[e],t)))return R(r[e+1],t);return r.length%2==1?R(r[r.length-1],t):null;case`and`:{let e=null;for(let n of r)if(e=await R(n,t),!await z(e))return e;return e}case`or`:{let e=null;for(let n of r)if(e=await R(n,t),await z(e))return e;return e}case`map`:{let e=await R(r[0],t);return N(e)?await Promise.all(e.map(e=>R(r[1],e))):[]}case`filter`:{let e=await R(r[0],t);return N(e)?(await Promise.all(e.map(async e=>({item:e,shouldInclude:await z(await R(r[1],e))})))).filter(({shouldInclude:e})=>e).map(({item:e})=>e):[]}case`reduce`:{let e=await R(r[0],t);if(!N(e))return r.length>2?await R(r[2],t):null;let n=r[1],i=r.length>2?await R(r[2],t):null;for(let t of e)i=await R(n,{current:t,accumulator:i});return i}case`all`:{let e=await R(r[0],t);if(!N(e)||e.length===0)return!1;for(let t of e)if(!await z(await R(r[1],t)))return!1;return!0}case`some`:{let e=await R(r[0],t);if(!N(e))return!1;for(let t of e)if(await z(await R(r[1],t)))return!0;return!1}case`none`:{let e=await R(r[0],t);if(!N(e))return!0;for(let t of e)if(await z(await R(r[1],t)))return!1;return!0}case`catch`:try{return await R(r[0],t)}catch(e){return F(e)?await R(e,t):r[1]?await R(r[1],e):e instanceof Error?e.message:e}}let i=await Promise.all(r.map(e=>R(e,t))),a=n?te[n]:void 0;if(!a)throw Error(`Unrecognized operation ${n}`);return a.apply(t,i)}async function z(e){return P(e)?z(await e):!(Array.isArray(e)&&e.length===0)&&!!e}function ne(e){return Object.keys(e)[0]}function B(e,t,n){return new Proxy(Object.create(null),{get(r,i){if(typeof i!=`string`)return;let a=e.find(e=>e.key===i);if(a!==void 0)return async()=>!n.has(i)&&await R(a.logic,{...t,conditions:B(e,t,new Set(n).add(i))})===!0}})}var re=(0,d.createFactory)(({client:e})=>(0,u.attach)({source:{stateSnapshot:e.stateSnapshotStore,predicates:e.predicates.listStore,actions:e.actions.listStore,features:e.features.listStore,responses:e.responses.getAllStore,conditions:e.conditions.listStore},effect:async({stateSnapshot:e,predicates:t,actions:n,features:r,responses:i,conditions:a},{rule:o,context:s})=>{let c=t.reduce((t,n)=>(t[n.name]=async(...t)=>await n.predicate({...e,args:t}),t),{}),l=n.reduce((t,n)=>(t[n.key]=async(...t)=>await n.action({...e,args:t},null)??void 0,t),{}),u=r.reduce((e,t)=>(e[t.id]=async()=>{let{bucket:e}=await t.getBucket();return e},e),{}),d={responses:i,location:typeof e.location==`object`?{hash:e.location.hash,host:e.location.host,hostname:e.location.hostname,href:e.location.href,origin:e.location.origin,pathname:e.location.pathname,port:e.location.port,protocol:e.location.protocol,search:e.location.search}:void 0,predicates:c,actions:l,features:u,...s};return await R(o,{...d,conditions:B(a,d,new Set)})}}));function ie(e){return(0,d.invoke)(re,e)}var ae=6e3,oe=o.t(`last_ping`,`global`),se=async e=>{try{let t=Date.now(),n=o.n.get(oe),r=0;if(n.isSet()&&(r=n.json()??0),r&&t-r<ae)return!0;let i={projectId:e.projectId,path:window.location.pathname},a={},c=document.getElementById(`picked_script`)?.dataset.verceltoken;c&&(a[`x-vercel-protection-bypass`]=c);let l=(await s.n(e.apiUrl,`ping`,i,a)).ok;return l&&n.set(t),l}catch{return!1}},V=(0,u.createDomain)(`lifecycle`),ce=(0,d.createFactory)(({client:e})=>{let n=V.store(!1),a=(0,u.createStore)(void 0,{skipVoid:!1,domain:V}),o=(0,u.createStore)(void 0,{skipVoid:!1,domain:V}),s=V.store(`idle`),c=V.store([]),l=(0,u.createStore)(void 0,{skipVoid:!1,domain:V}),d=(0,u.createStore)(void 0,{skipVoid:!1,domain:V}),f=(0,u.createEvent)(),p=(0,u.createEvent)(),m=(0,u.createEvent)(),h=(0,u.createEvent)(),g=(0,u.createEvent)(),v=(0,u.createEvent)();c.on(h,(e,t)=>[...e,t]),l.on(g,(e,t)=>t),d.on(v,(e,t)=>t),n.on(p,()=>!0);let y=(0,u.createEffect)(()=>{se(e)}),b=(0,u.createEffect)(async()=>{await i.r()}),x=(0,u.createEffect)(async()=>{await _(e)}),S=(0,u.attach)({effect:x}),C=(0,u.attach)({source:c,effect:async e=>{for(let t of e)await t()}}),w=(0,u.attach)({source:l,effect:async n=>n===void 0?!0:typeof n==`boolean`?n:await t.t(e,n)===!0}),T=(0,u.attach)({source:d,effect:async n=>n===void 0?!0:typeof n==`boolean`?n:await t.t(e,n)===!0}),E=(0,u.sample)({clock:f,source:s,filter:e=>e===`idle`&&r.i(),fn:()=>void 0});(0,u.sample)({clock:E,fn:()=>`starting`,target:s}),(0,u.sample)({clock:E,target:y}),(0,u.sample)({clock:E,target:C}),(0,u.sample)({clock:E,target:b}),(0,u.sample)({clock:C.done,target:w}),(0,u.sample)({clock:w.doneData,target:a}),(0,u.sample)({clock:T.doneData,target:o}),(0,u.sample)({clock:w.doneData,filter:e=>e,target:T}),(0,u.sample)({clock:T.doneData,target:e.session.setIsUser}),(0,u.sample)({clock:T.doneData,fn:e=>({type:`user_decide`,value:e}),target:e.eventBus}),(0,u.sample)({clock:w.doneData,filter:e=>!e,fn:()=>void 0,target:m}),(0,u.sample)({clock:T.doneData,fn:()=>void 0,target:m}),(0,u.sample)({clock:m,fn:()=>({type:`initialize`}),target:e.eventBus});let D=(0,u.createStore)(!1).on(b.done,()=>!0),O=(0,u.createStore)(!1).on(m,()=>!0),k=(0,u.createStore)(!1).on(S.done,()=>!0),A=(0,u.combine)(a,o,(e,t)=>e===!0&&t===!0);(0,u.sample)({clock:m,source:A,filter:e=>e,fn:()=>void 0,target:x});let ee=(0,u.combine)(D,O,A,(e,t,n)=>e&&t&&n);(0,u.sample)({clock:ee,filter:e=>e,fn:()=>void 0,target:S});let j=(0,u.combine)(D,O,A,k,(e,t,n,r)=>e&&t&&(!n||r));return(0,u.sample)({clock:j,filter:e=>e,fn:()=>void 0,target:p}),(0,u.sample)({clock:p,fn:()=>`ready`,target:s}),(0,u.sample)({clock:p,fn:()=>({type:`ready`}),target:e.eventBus}),(0,u.sample)({clock:p,source:e.session.store,fn:({id:e,isUser:t,identifiers:n})=>({type:`session`,id:e,isUser:t,identifiers:n}),target:e.eventBus}),(0,u.sample)({clock:[C.fail,w.fail,T.fail,x.fail,S.fail,b.fail],fn:()=>`failed`,target:s}),{start:f,readyStore:n,preconditionPassedStore:a,conditionPassedStore:o,lifecycleStageStore:s,registerPluginStartHook:h,setPrecondition:g,setCondition:v}});function le(e){return(0,d.invoke)(ce,e)}var ue=(0,u.createDomain)(`predicate`),de=(0,d.createFactory)(({client:e})=>{let t=ue.store({}),r=(0,u.createApi)(t,{register(e,t){return{...e,[t.name]:{name:t.name,predicate:t.predicate}}}}),i=(0,u.createEvent)();(0,u.sample)({clock:i,source:t,filter:(e,{name:t})=>e[t]!==void 0,fn:(e,{name:t})=>`Predicate '${t}' already registered. Registering again will override the previous registration.`}).watch(e=>n.t(`warn`,e)),(0,u.sample)({clock:i,fn:({name:e,predicate:t})=>Object.freeze({name:e,predicate:t}),target:r.register});let a=t.map(e=>Object.values(e));function o(e){return t.map(t=>t[e]?.predicate,{skipVoid:!1})}function s(t){let n=(0,u.createStore)(()=>void 0,{skipVoid:!1}),r=(0,u.attach)({source:{predicate:o(t),snapshot:e.stateSnapshotStore},effect:({predicate:e,snapshot:t})=>{if(e)return(...n)=>e({...t,args:n})}});return(0,u.sample)({source:{responses:e.responses.listStore,fields:e.fields.listStore},target:r}),(0,u.sample)({clock:r.doneData,filter:e=>e!==void 0,target:n}),r(),n}return{register:i,getByName:o,listStore:a,getEvokablePredicate:s}});function fe(e){return(0,d.invoke)(de,e)}var pe=(e,t,n)=>{n.register({name:e,predicate:t})},H=(0,u.createDomain)(`feature`);function U(e){return e?.enabled===!1}function W(e){return e===`true`||e!==`false`&&e}var me=(0,d.createFactory)(({client:e})=>{let t=H.store({}),r=H.store([]),i=(0,u.createApi)(t,{register(e,t){return{...e,[t.id]:t.feature}}}),a=(0,u.createEvent)();(0,u.sample)({clock:a,source:t,filter:(e,{id:t})=>e[t]!==void 0,fn:(e,{id:t})=>`Feature '${t}' already registered. Registering again will override the previous registration.`}).watch(e=>n.t(`warn`,e)),(0,u.sample)({clock:a,fn:({id:e,feature:t})=>Object.freeze({id:e,feature:{id:e,feature:{...t,id:e}}}),target:i.register});let s=(0,u.createEffect)(async({id:e,key:t,storage:n=`local`,enabled:r})=>{if(r===!1)return null;let i=o.t(`feature:${e}:${t}`,`global`),a=(n===`session`?o.r:o.n).get(i).text();return a?{id:e,key:t,bucket:W(a),storage:n}:null}),c=(0,u.createEffect)(e=>{if(!e)return null;let t=o.t(`feature:${e.id}:${e.key}`,`global`);(e.storage===`session`?o.r:o.n).set(t,e.bucket)}),l=new Map,d=(0,u.attach)({source:{allFeaturesStore:t,resolvedFeaturesStore:r},effect:async({allFeaturesStore:e,resolvedFeaturesStore:t},{id:n,decide:r,key:i})=>{let a=t.find(e=>e.id===n&&e.key===i);if(a)return a;let o=e[n];if(!o)throw Error(`Feature with id '${n}' not found`);if(U(o.feature))return{id:o.id,bucket:!1,key:i,storage:o.feature.storage};let s=l.get(`${n}:${i}`);if(s!==void 0){let e=await s;return{id:o.id,bucket:e,key:i,storage:o.feature.storage}}let c=r();l.set(`${n}:${i}`,c);let u=await c;return{id:o.id,bucket:u,key:i,storage:o.feature.storage}}});(0,u.sample)({clock:i.register,fn:e=>{let{id:t,feature:n}=e;return{id:t,key:n.feature.key,storage:n.feature.storage,enabled:n.feature.enabled}},target:s}),(0,u.sample)({source:t,clock:d.doneData,filter:(e,t)=>!U(e[t.id]?.feature),fn:(e,t)=>{let{id:n,bucket:r,storage:i}=t,a=e[n]?.feature.key;return a?{key:a,id:n,bucket:r,storage:i}:null},target:c});let f=(0,u.combine)({allFeaturesStore:t,resolvedFeaturesStore:r}).map(({allFeaturesStore:e,resolvedFeaturesStore:t})=>Object.values(e).map(e=>{let n=t.find(t=>t.id===e.id&&t.key===e.feature.key);return n?{id:e.id,name:e.feature.name,key:e.feature.key,enabled:e.feature.enabled,weight:e.feature.weight,getBucket:()=>({id:e.id,bucket:n.bucket}),isResolved:!0}:{id:e.id,name:e.feature.name,key:e.feature.key,enabled:e.feature.enabled,weight:e.feature.weight,getBucket:async()=>await d(e.feature),isResolved:!1}}));(0,u.sample)({clock:d.doneData,source:{resolvedFeatures:r,allFeatures:t},filter:({resolvedFeatures:e,allFeatures:t},{id:n,key:r})=>!U(t[n]?.feature)&&!e.some(e=>e.id===n&&e.key===r),fn:(e,t)=>t,target:e.eventBus.prepend(e=>({type:`feature_decide`,feature:e}))}),(0,u.sample)({clock:[s.doneData,d.doneData],source:{resolvedFeatures:r,allFeatures:t},fn:({resolvedFeatures:e,allFeatures:t},n)=>!n||U(t[n.id]?.feature)||e.some(e=>e.id===n.id&&e.key===n.key)?e:[...e,n],target:r});function p(e){return f.map(t=>t.find(t=>t.id===e))}let m=new Map,h=new Map,g=new Map;function _(e){let t=m.get(e);if(t)return t;let n=p(e);return m.set(e,n),n}function v(e){return t.map(t=>t[e],{skipVoid:!1})}function y(e){let t=(0,u.createStore)(async()=>void 0,{skipVoid:!1}),n=_(e),r=(0,u.attach)({source:n,effect:async e=>{if(e)return async()=>(await e.getBucket()).bucket}});return(0,u.sample)({clock:n,target:r}),(0,u.sample)({clock:r.doneData,filter:e=>e!==void 0,target:t}),r(),t}function b(e){let t=h.get(e);if(t)return t;let n=y(e);return h.set(e,n),n}function x(e){let t=b(e),n=(0,u.createStore)(void 0,{skipVoid:!1}),r=(0,u.attach)({source:t,mapParams:(e,t)=>t,effect:(0,u.createEffect)(async e=>await e())});return(0,u.sample)({clock:r.doneData,fn:t=>{if(t!==void 0)return{id:e,bucket:t}},target:n}),(0,u.sample)({clock:t,target:r}),r(),n}function S(e){let t=g.get(e);if(t)return t;let n=x(e);return g.set(e,n),n}return{register:a,getById:_,getByName:v,listStore:f,getEvokableFeature:b,getFeatureResult:S}});function he(e){return(0,d.invoke)(me,e)}var ge=(e,t,n)=>{n.register({id:e,feature:t})},G=(0,u.createDomain)(`history`);function K(e,t){return{id:c.t(`history-entry-${Date.now()}-${Math.random()}}`),node:t,at:Date.now(),experienceId:e}}var _e=(0,d.createFactory)(()=>{let e=G.store({entries:[]}),t=G.event(),n=G.event(),r=G.event(),i=G.event();e.on(t,(e,t)=>({entries:[...e.entries,K(t.experienceId,t.node)]})),e.on(n,(e,t)=>({entries:[...e.entries.slice(0,-1),K(t.experienceId,t.node)]})),e.on(i,(e,t)=>t);function o(e,t){let n={lastStepIndex:-1,secondLastStepIndex:-1};for(let r=e.length-1;r>=0;r--){let i=e[r],o=i?.node;if(!(!o||!a.u(o))&&!(t&&i.experienceId!==t))if(n.lastStepIndex===-1)n.lastStepIndex=r;else{n.secondLastStepIndex=r;break}}return n}return e.on(r,(e,t)=>{let{secondLastStepIndex:n}=o(e.entries,t.experienceId),r=n===-1?e.entries:e.entries.slice(0,n+1);return{...e,entries:r}}),{push:t,replace:n,back:r,restore:i,entriesStore:e.map(e=>e.entries)}});function ve(){return(0,d.invoke)(_e)}var ye=0,be=e=>{let t=(0,u.createStore)([]);return t.on(e,(e,t)=>[...e,{id:ye++,at:new Date,payload:t}]),t},xe=(0,u.createDomain)(`field`),Se=(0,d.createFactory)(()=>{let e=xe.store({}),t=(0,u.createApi)(e,{register(e,t){return{...e,[t.field.id]:t.field}},updateByKey(e,t){let n=Object.values(e).find(e=>e.key===t.fieldKey);return n?{...e,[n.id]:Object.assign({},n,t.updates)}:e}});function n(e){t.register({field:e})}let r={};e.watch(e=>{r=e});function i(e,n){let i=Object.values(r).find(t=>t.key===e)?.key;i&&t.updateByKey({fieldKey:i,updates:n})}let a=e.map(e=>Object.values(e));function o(t){return e.map(e=>e[t]??null,{skipVoid:!1})}function s(t){return e.map(e=>Object.values(e).find(e=>e.key===t)??null,{skipVoid:!1})}function c(t){return e.map(e=>Object.values(e).find(e=>e.name===t)??null,{skipVoid:!1})}return{register:n,update:i,getById:o,getByKey:s,listStore:a,getByName:c}});function Ce(){return(0,d.invoke)(Se)}var we=(0,u.createDomain)(`step`),Te=(0,d.createFactory)(()=>{let e=we.store({}),t=(0,u.createApi)(e,{register(e,t){return{...e,[t.step.id]:t.step}}});function n(e){t.register({step:e})}let r=e.map(e=>Object.values(e));function i(t){return e.map(e=>e[t]??null,{skipVoid:!1})}function a(t){return e.map(e=>Object.values(e).find(e=>e.key===t)??null,{skipVoid:!1})}return{register:n,getById:i,getByKey:a,listStore:r,indexStore:e}});function Ee(){return(0,d.invoke)(Te)}function De(e,t){t.register(e)}var Oe=(0,u.createDomain)(`content`),ke=(0,d.createFactory)(()=>{let e=Oe.store({}),t=(0,u.createApi)(e,{register(e,t){return{...e,[t.content.id]:t.content}},patch(e,t){let n=e[t.id];if(!n)return e;let r=t.apply(n.data);return r===n.data?e:{...e,[t.id]:{...n,data:r}}}});function n(e){t.register({content:e})}function r(e,n){t.patch({id:e,apply:n})}let i=e.map(e=>Object.values(e));function a(t){return e.map(e=>e[t]??null,{skipVoid:!1})}return{register:n,patch:r,getById:a,listStore:i,indexStore:e}});function Ae(){return(0,d.invoke)(ke)}function je(e,t){t.register(e)}var Me=(0,u.createDomain)(`action`),Ne=(0,d.createFactory)(({client:e})=>{let t=Me.store({}),r=(0,u.createApi)(t,{register(e,t){return{...e,[t.key]:{key:t.key,action:t.action}}}}),i=(0,u.createEvent)();(0,u.sample)({clock:i,source:t,filter:(e,{key:t})=>e[t]!==void 0,fn:(e,{key:t})=>`Action '${t}' already registered. Registering again will override the previous registration.`}).watch(e=>n.t(`warn`,e)),(0,u.sample)({clock:i,fn:({key:e,action:t})=>Object.freeze({key:e,action:t}),target:r.register});let a=t.map(e=>Object.values(e));function o(e){return t.map(t=>t[e]?.action,{skipVoid:!1})}function s(t,n){let r=(0,u.createStore)(()=>void 0,{skipVoid:!1}),i=n?{experience:n.experience}:null,a=(0,u.attach)({source:{action:o(t),snapshot:e.stateSnapshotStore},effect:({action:e,snapshot:t})=>{if(e)return(...n)=>e({...t,args:n},i)}});return(0,u.sample)({source:{responses:e.responses.listStore,fields:e.fields.listStore},target:a}),(0,u.sample)({clock:a.doneData,filter:e=>e!==void 0,target:r}),a(),r}return{register:i,getByKey:o,listStore:a,getEvokableAction:s}});function Pe(e){return(0,d.invoke)(Ne,e)}var Fe=(e,t,n)=>{n.register({key:e,action:t})};function q(e,t,n,r){return{fieldKey:e.key,userMessage:n,systemMessage:r,value:t}}function J(e){return e===null||e===``||Array.isArray(e)&&!e.length}function Ie(e){return typeof e==`string`||typeof e==`number`||typeof e==`boolean`||e===null}function Y(e){try{return JSON.stringify(e),!0}catch{return!1}}function Le(e,t){return t.find(t=>t.key===e)??null}function Re(e,t){return e.multiple&&(typeof t==`string`||typeof t==`number`||typeof t==`boolean`)?[t]:t}function ze(e,t){if(e.type!==`object`||J(t))return null;if(e.multiple){if(!Array.isArray(t))return q(e,t,`This field expects multiple values`,`Field expects an array of objects.`);for(let n of t){if(typeof n!=`object`||!n)return q(e,t,`This field expects object values`,`Field expects an array of objects, but received non-object value.`);if(!Y(n))return q(e,t,`This field contains non-serializable data`,`Field value contains non-JSON-serializable data (functions, circular references, etc.).`)}return null}return Array.isArray(t)?q(e,t,`This field expects a single value`,`Field expects a single object, not an array.`):typeof t!=`object`||!t?q(e,t,`This field expects an object value`,`Field expects an object value.`):Y(t)?null:q(e,t,`This field contains non-serializable data`,`Field value contains non-JSON-serializable data (functions, circular references, etc.).`)}function Be(e,t){if(J(t)||!Array.isArray(e.options)||e.options.length===0)return null;let n=Array.isArray(t)?t:[t];if(e.type===`object`){let r=new Set(e.options.map(e=>JSON.stringify(e.value)));return n.every(e=>r.has(JSON.stringify(e)))?null:q(e,t,`This field expects a valid option`,`Field expects a valid option from the defined choices.`)}let r=e.options.map(e=>e.value);return n.every(e=>!Ie(e)||e===null?!1:r.includes(e))?null:q(e,t,`This field expects a valid option`,`Field expects a valid option. Valid options are: ${r.join(`, `)}`)}async function Ve(t,n,r,i){if(n.validation&&!e.t(n.validation)&&!J(r)){let e=i?{$input:r,responses:i}:{$input:r},a=await t(n.validation,e);if(typeof a==`string`)return q(n,r,a,`Field validation resulted in an error: ${a}.`);if(a===!1)return q(n,r,`This field is invalid`,`Field validation resulted in an unspecified error.`)}return n.required&&J(r)?q(n,r,`This field is required`,`Field is required.`):!n.multiple&&Array.isArray(r)&&r.length>1?q(n,r,`This field expects a single response`,`Field expects a single response.`):null}var He=(0,u.createDomain)(`response`),Ue=(0,d.createFactory)(({client:e})=>{let n=He.store({}),r=(0,u.createEvent)(),i=(0,u.createEvent)(),a=(0,u.createApi)(n,{register(e,t){return{...e,[t.fieldKey]:t.response}},registerBatch(e,t){return{...e,...t}},clear(e,t){return Object.fromEntries(Object.entries(e).filter(([e])=>e!==t))},clearAll(){return{}}});function o(e,t){if(typeof e==`string`){if(t===void 0)throw Error(`Response is required when registering a single field`);a.register({fieldKey:e,response:t})}else a.registerBatch(e)}let s=(n,r)=>t.t(e,n,r),c=(0,u.attach)({source:{allFields:e.fields.listStore,existingResponses:n},effect:async({allFields:e,existingResponses:t},n)=>{let r=[],i={},a={...t,...n},o=Object.entries(n),c=await Promise.allSettled(o.map(async([t,n])=>{let o=Le(t,e);if(!o){r.push({fieldKey:t,userMessage:`Field '${t}' not found`,systemMessage:`No field with key '${t}' exists. Available field keys are: ${e.map(e=>e.key).join(`,`)}.`,value:n});return}let c=Re(o,n),l=await Ve(s,o,c,a);if(l){r.push(l);return}let u=ze(o,c);if(u){r.push(u);return}let d=Be(o,c);if(d){r.push(d);return}i[o.key]=n}));for(let[e,t]of c.entries()){if(t.status!==`rejected`)continue;let n=o[e];if(!n)continue;let[i,a]=n,s=t.reason instanceof Error?t.reason.message:String(t.reason);r.push({fieldKey:i,userMessage:`An unexpected error occurred validating this field`,systemMessage:`Validation threw for field '${i}': ${s}`,value:a})}return{responsesToCommit:i,validationErrors:r}}});async function l(e){return c(e)}let d=(0,u.attach)({source:n,effect:async(e,t)=>{let{responsesToCommit:n,validationErrors:r}=await c(t);return r.length?{errors:r}:(a.registerBatch(n),{errors:[]})}});async function f(e){return d(e)}let p=n.map(e=>e),m=n.map(e=>Object.entries(e).map(([e,t])=>({fieldKey:e,value:t})));function h(e){return(0,u.combine)({f:e,s:n},({f:e,s:t})=>{let n=e?t[e.key]??null:null;return n===null?e?.defaultValue!==void 0&&e.defaultValue!==null?e.defaultValue:null:n})}function g(t){return h(e.fields.getById(t))}function _(t){return h(e.fields.getByKey(t))}function v(t){return h(e.fields.getByName(t))}return(0,u.sample)({clock:r,target:a.clearAll}),(0,u.sample)({clock:i,target:a.clear}),{register:o,clearAll:r,clear:i,commit:f,getResponsesToCommit:l,listStore:m,getAllStore:p,getByFieldId:g,getByFieldKey:_,getByFieldName:v}});function We(e){return(0,d.invoke)(Ue,e)}var Ge=(0,u.createDomain)(`condition`),Ke=(0,d.createFactory)(()=>{let e=Ge.store({}),t=(0,u.createApi)(e,{register(e,t){return{...e,[t.condition.id]:t.condition}}});function n(e){t.register({condition:e})}let r=e.map(e=>Object.values(e));function i(t){return e.map(e=>e[t]??null,{skipVoid:!1})}function a(t){return e.map(e=>Object.values(e).find(e=>e.key===t)??null,{skipVoid:!1})}return{register:n,getById:i,getByKey:a,listStore:r,indexStore:e}});function qe(){return(0,d.invoke)(Ke)}function Je(){if(r.i()){let e=[document.currentScript,document.getElementById(`picked_script`),document.getElementById(`picked`),document.getElementById(`cvly`),document.getElementById(`cvly-x`)];for(let t of e)if(t?.dataset.api)return t.dataset.api}return`https://api.picked.app`}function Ye(){if(!r.f())return{};let e=new URLSearchParams(window.location.search),t={},n=new Set;for(let[t]of e.entries())t.startsWith(`picked-`)&&n.add(t);for(let r of n){let n=r.replace(`picked-`,``);t[n]=e.getAll(r)}let i=o.t(`s`);if(n.size>0)o.r.set(i,t);else{let e=o.r.get(i);if(e)return e.json()||{}}return t}var Xe=o.t(`session`,`global`);function Ze(){return r.r()?crypto.randomUUID():`${Date.now().toString(36)}-${Math.random().toString(36).substring(2,15)}-${Math.random().toString(36).substring(2,15)}-${Math.random().toString(36).substring(2,15)}`}function Qe(){if(!r.s())return null;let e=o.n.get(Xe);if(!e.isSet())return null;try{return e.json()}catch{return null}}var $e=(0,d.createFactory)(()=>{let e=Qe(),t={id:e?.id??Ze()};e?.isUser!==void 0&&(t.isUser=e.isUser),e?.identifiers&&Object.keys(e.identifiers).length>0&&(t.identifiers=e.identifiers);let n=(0,u.createStore)(t),i=(0,u.createApi)(n,{setIsUser:(e,t)=>({...e,isUser:t}),setIdentifier:(e,{key:t,value:n})=>({...e,identifiers:{...e.identifiers??{},[t]:n}}),removeIdentifier:(e,t)=>{let n=e.identifiers;if(!n||!(t in n))return e;let r={};for(let[e,i]of Object.entries(n))e!==t&&(r[e]=i);let i={id:e.id};return e.isUser!==void 0&&(i.isUser=e.isUser),Object.keys(r).length>0&&(i.identifiers=r),i}}),a=(0,u.attach)({source:n,effect:e=>{if(r.s())try{o.n.get(Xe).set(e)}catch{}}});return(0,u.sample)({source:n,target:a}),{store:n,setIsUser:i.setIsUser,setIdentifier:i.setIdentifier,removeIdentifier:i.removeIdentifier}});function et(){return(0,d.invoke)($e,void 0)}function tt(){if(r.f())return globalThis.window.pickedConfig}function nt(){if(r.f())return tt()?.projectId}function rt(){if(!r.i())return;let e=document.getElementById(`picked_script`)||document.querySelector(`script#picked`)||document.getElementById(`cvly`);if(e)return e.dataset.projectid||e.getAttribute(`project-id`)||void 0}function it(e){if(e.projectId)return e.projectId;let t=nt();if(t)return t;let n=rt();if(n)return n;throw Error(`projectId is required. You can provide it via one of:
|
|
2
2
|
(1) createClient({ projectId }) options;
|
|
3
3
|
(2) window.pickedConfig = { projectId };
|
|
4
|
-
(3) a <script> tag with id 'picked_script', 'picked', or 'cvly' that includes a data-projectid (or project-id) attribute.`)}function X(e){return e==null||e===``||Number.isNaN(e)}var at={default:(e,t)=>X(e)?String(t??``):String(e),append:(e,t)=>t&&!X(e)?`${e} ${t}`:e,prepend:(e,t)=>t&&!X(e)?`${t} ${e}`:e,upper:e=>typeof e==`string`?e.toUpperCase():e,lower:e=>typeof e==`string`?e.toLowerCase():e,capitalize:e=>typeof e==`string`?e.charAt(0).toUpperCase()+e.slice(1):e,list:e=>{if(!e||typeof e!=`object`)return e;let t=new Intl.ListFormat(`en`,{style:`long`,type:`conjunction`});if(Array.isArray(e))return t.format(e.map(String));if(e instanceof Map){let n=Array.from(e.entries()).map(([e,t])=>`${e}: ${t}`);return t.format(n)}return e instanceof Set?t.format(Array.from(e).map(String)):e}};function ot(e){return typeof e==`object`&&!!e}function st(e,t){let n=t;for(let t of e.split(`.`))if(ot(n)&&t in n)n=n[t];else return;return typeof n==`function`?n():n}function ct(e,t){let n=e.split(`|`).map(e=>e.trim()),r=st(n.shift()??``,t);for(let e of n){let[t,...n]=e.split(`:`),i=t?.trim()??``,a=n.join(`:`).trim().replaceAll(/(?:^['"]|['"]$)/g,``),o=at[i];o&&(r=o(r,a))}return X(r)?``:typeof r==`object`?JSON.stringify(r):String(r)}function lt(e,t){let n=``,r=0;for(;r<e.length;)if(e[r]===`{`&&e[r+1]===`{`){r+=2;let i=``;for(;r<e.length;){if(e[r]===`}`&&e[r+1]===`}`){r+=2;break}i+=e[r++]}n+=ct(i.trim(),t)}else n+=e[r++];return n}var ut=`preview-token`;function dt(){return!r.f()||!r.t()?!1:!!Ye()[ut]?.[0]}var ft=class{static logger=n.t;options;dataSource=null;seededVersionId=null;versionSkew=null;contentLoader;previewEmbedderOrigins=null;plugins={};dataProviders=new Map;eventBus=(0,u.createEvent)();events;projectId;apiUrl;dashboardUrl;documentationSiteUrl;session=et();searchParams=Ye();history=ve();components=w({client:this});experienceInstances=a.n({client:this});experiences=g({client:this});frameworks=O({client:this});predicates=fe({client:this});features=he({client:this});conditions=qe();fields=Ce();responses=We({client:this});steps=Ee();contents=Ae();actions=Pe({client:this});conditionResults=a.r();stateSnapshotStore=ee({client:this});evaluateRuleLogicFx=ie({client:this});start;readyStore;preconditionPassedStore;conditionPassedStore;lifecycleStageStore;lifecycle=le({client:this});renderStringFx=(0,u.attach)({source:this.responses.listStore,effect:(e,{template:t,context:n})=>{let r={};for(let t of e)r[t.fieldKey]=t.value;return lt(t,{...n,responses:r})}});constructor(e){this.events=be(this.eventBus),this.projectId=it(e),this.options=Object.freeze(e),this.apiUrl=e.apiUrl||Je(),this.dashboardUrl=e.dashboardUrl??`https://dashboard.picked.app`,this.documentationSiteUrl=e.documentationSiteUrl??`https://docs.picked.app`,this.start=this.lifecycle.start,this.readyStore=this.lifecycle.readyStore,this.preconditionPassedStore=this.lifecycle.preconditionPassedStore,this.conditionPassedStore=this.lifecycle.conditionPassedStore,this.lifecycleStageStore=this.lifecycle.lifecycleStageStore,this.setupPlugins(),this.setupFeatures(),this.setupPredicates(),this.setupActions(),this.setupComponents(),this.lifecycle.setPrecondition(e.precondition),this.lifecycle.setCondition(e.condition),this.eventBus({type:`load`,version:s.r()}),this.maybeStartPreviewChannel()}dataProviderFor(e){let t=e??``,n=this.dataProviders.get(t);if(n)return n;let r=Promise.resolve().then(()=>require("../provider-
|
|
4
|
+
(3) a <script> tag with id 'picked_script', 'picked', or 'cvly' that includes a data-projectid (or project-id) attribute.`)}function X(e){return e==null||e===``||Number.isNaN(e)}var at={default:(e,t)=>X(e)?String(t??``):String(e),append:(e,t)=>t&&!X(e)?`${e} ${t}`:e,prepend:(e,t)=>t&&!X(e)?`${t} ${e}`:e,upper:e=>typeof e==`string`?e.toUpperCase():e,lower:e=>typeof e==`string`?e.toLowerCase():e,capitalize:e=>typeof e==`string`?e.charAt(0).toUpperCase()+e.slice(1):e,list:e=>{if(!e||typeof e!=`object`)return e;let t=new Intl.ListFormat(`en`,{style:`long`,type:`conjunction`});if(Array.isArray(e))return t.format(e.map(String));if(e instanceof Map){let n=Array.from(e.entries()).map(([e,t])=>`${e}: ${t}`);return t.format(n)}return e instanceof Set?t.format(Array.from(e).map(String)):e}};function ot(e){return typeof e==`object`&&!!e}function st(e,t){let n=t;for(let t of e.split(`.`))if(ot(n)&&t in n)n=n[t];else return;return typeof n==`function`?n():n}function ct(e,t){let n=e.split(`|`).map(e=>e.trim()),r=st(n.shift()??``,t);for(let e of n){let[t,...n]=e.split(`:`),i=t?.trim()??``,a=n.join(`:`).trim().replaceAll(/(?:^['"]|['"]$)/g,``),o=at[i];o&&(r=o(r,a))}return X(r)?``:typeof r==`object`?JSON.stringify(r):String(r)}function lt(e,t){let n=``,r=0;for(;r<e.length;)if(e[r]===`{`&&e[r+1]===`{`){r+=2;let i=``;for(;r<e.length;){if(e[r]===`}`&&e[r+1]===`}`){r+=2;break}i+=e[r++]}n+=ct(i.trim(),t)}else n+=e[r++];return n}var ut=`preview-token`;function dt(){return!r.f()||!r.t()?!1:!!Ye()[ut]?.[0]}var ft=class{static logger=n.t;options;dataSource=null;seededVersionId=null;versionSkew=null;contentLoader;previewEmbedderOrigins=null;plugins={};dataProviders=new Map;eventBus=(0,u.createEvent)();events;projectId;apiUrl;dashboardUrl;documentationSiteUrl;session=et();searchParams=Ye();history=ve();components=w({client:this});experienceInstances=a.n({client:this});experiences=g({client:this});frameworks=O({client:this});predicates=fe({client:this});features=he({client:this});conditions=qe();fields=Ce();responses=We({client:this});steps=Ee();contents=Ae();actions=Pe({client:this});conditionResults=a.r();stateSnapshotStore=ee({client:this});evaluateRuleLogicFx=ie({client:this});start;readyStore;preconditionPassedStore;conditionPassedStore;lifecycleStageStore;lifecycle=le({client:this});renderStringFx=(0,u.attach)({source:this.responses.listStore,effect:(e,{template:t,context:n})=>{let r={};for(let t of e)r[t.fieldKey]=t.value;return lt(t,{...n,responses:r})}});constructor(e){this.events=be(this.eventBus),this.projectId=it(e),this.options=Object.freeze(e),this.apiUrl=e.apiUrl||Je(),this.dashboardUrl=e.dashboardUrl??`https://dashboard.picked.app`,this.documentationSiteUrl=e.documentationSiteUrl??`https://docs.picked.app`,this.start=this.lifecycle.start,this.readyStore=this.lifecycle.readyStore,this.preconditionPassedStore=this.lifecycle.preconditionPassedStore,this.conditionPassedStore=this.lifecycle.conditionPassedStore,this.lifecycleStageStore=this.lifecycle.lifecycleStageStore,this.setupPlugins(),this.setupFeatures(),this.setupPredicates(),this.setupActions(),this.setupComponents(),this.lifecycle.setPrecondition(e.precondition),this.lifecycle.setCondition(e.condition),this.eventBus({type:`load`,version:s.r()}),this.maybeStartPreviewChannel()}dataProviderFor(e){let t=e??``,n=this.dataProviders.get(t);if(n)return n;let r=Promise.resolve().then(()=>require("../provider-Bv4qayPb.cjs")).then(t=>t.createPickedDataProvider({apiUrl:this.apiUrl,projectId:this.projectId,...e!==void 0&&{previewToken:e}}));return this.dataProviders.set(t,r),r}async getProjectConfig(e){let t=await this.dataProviderFor(e?.previewToken),n=await t.getProjectConfig();if(this.dataSource=t.meta.manifest,n===null)throw Error(`Picked could not resolve the configuration for project "${this.projectId}" from ${this.apiUrl}.`);return n}async getExperienceContent(e,t){return(await this.dataProviderFor(t?.previewToken)).getContent(e,t?.signal===void 0?void 0:{signal:t.signal})}maybeStartPreviewChannel(){dt()&&Promise.resolve().then(()=>require("../preview-channel-Cx0e6fye.cjs")).then(e=>e.initPreviewChannel(this)).catch(()=>void 0)}registerFramework=e=>{k(e,this.frameworks)};registerComponent=(e,t)=>{T(e,t,this.components)};registerPlugin=e=>{y(this,e,this.plugins);let t=this.plugins[e.name];t?.onStart&&this.lifecycle.registerPluginStartHook(t.onStart)};registerFeature=(e,t)=>{ge(e,t,this.features)};registerPredicate=(e,t)=>{pe(e,t,this.predicates)};registerCondition=e=>{this.conditions.register(e)};registerField=e=>{this.fields.register(e)};registerStep=e=>{De(e,this.steps)};registerContent=e=>{je(e,this.contents)};patchContent=(e,t)=>{this.contents.patch(e,t)};registerAction=(e,t)=>{Fe(e,t,this.actions)};registerExperience=e=>{e.component&&T(`experience:${e.id}`,e.component,this.components),this.experiences.register(e)};launchExperienceById=async(e,t)=>{this.experiences.launch({id:e,options:t})};launchExperienceByKey=async(e,t)=>{this.experiences.launch({key:e,options:t})};openExperienceById=async e=>{this.experiences.open({id:e})};openExperienceByKey=async e=>{this.experiences.open({key:e})};setupPlugins(){this.options.plugins?.forEach(e=>{if(Array.isArray(e)){e.forEach(e=>{this.registerPlugin(e)});return}let t=typeof e==`function`?e():e;if(Array.isArray(t)){t.forEach(e=>this.registerPlugin(e));return}this.registerPlugin(t)})}setupFeatures(){let e=this.options.features;e&&Object.entries(e).forEach(([e,t])=>{let n=typeof t==`function`?t():t;this.registerFeature(e,n)}),this.searchParams.feature&&this.searchParams.feature.forEach(e=>{try{let[t,n]=e.split(`:`);if(!t||!n)return;let r=W(n);this.registerFeature(t,{key:`${r}`,name:t,decide:()=>r,storage:`session`})}catch{}})}setupPredicates(){let e=this.options.predicates;e&&Object.entries(e).forEach(([e,t])=>{if(typeof t!=`function`){`${e}`;return}this.registerPredicate(e,t)})}setupActions(){let e=this.options.actions;e&&Object.entries(e).forEach(([e,t])=>{if(typeof t!=`function`){`${e}`;return}this.registerAction(e,t)})}setupComponents(){let e=this.options.components;e&&Object.entries(e).forEach(([e,t])=>{this.registerComponent(e,t)})}getPluginConfig=e=>this.plugins[e]??{}},pt=`application/picked-javascript`,mt=`application/picked-module`,ht=`data-picked-hydrated`;async function gt(e){if(!(`document`in globalThis))return;let t=`application/picked-module`,n=`data-picked-hydrated`;function r(e){try{Function(e.textContent)}catch(t){return t instanceof SyntaxError&&(console.error(`[picked] Skipped a rehydrated inline script that failed to parse.`,t),e.setAttribute(n,``),!0)}return!1}function i(e,t){let r=document.createElement(`script`);for(let t of Array.from(e.attributes))t.name!==`type`&&r.setAttribute(t.name,t.value);t&&r.setAttribute(`type`,t),r.setAttribute(n,``),e.src?r.async=!1:r.textContent=e.textContent;let i=e.src?new Promise(e=>{r.addEventListener(`load`,()=>e(),{once:!0}),r.addEventListener(`error`,()=>e(),{once:!0})}):null;return e.src?e.replaceWith(r):(globalThis.__pickedEmbedScriptRoot=e.getRootNode(),e.replaceWith(r),globalThis.__pickedEmbedScriptRoot=null),i}let a=Array.from(e.querySelectorAll(`script[type="application/picked-javascript"]:not([${n}]), script[type="${t}"]:not([${n}])`)).filter(e=>e instanceof HTMLScriptElement);for(let e of a){if(!e.isConnected)continue;let n=e.getAttribute(`type`)===t?`module`:null;if(!e.src&&n===null&&r(e))continue;let a=i(e,n);a&&await a}}function _t(){return`<script>(${gt.toString()})(document)<\/script>`}function vt(e){return typeof e==`object`&&!!e&&`id`in e&&typeof e.id==`string`&&`content`in e&&(typeof e.content==`string`||e.content===null)}function yt(e){return{$$type:`lazy-component`,load:e}}function bt(e){return typeof e==`object`&&!!e&&`$$type`in e&&e.$$type===`lazy-component`}function Z(e){return typeof e==`object`&&!!e&&!Array.isArray(e)&&`contentEntryId`in e&&typeof e.contentEntryId==`string`}function Q(e){return Z(e)?e.contentEntryId:null}function $(e){let t=Array.isArray(e)?e:[e],n=[];for(let e of t)Z(e)&&n.push(e.contentEntryId);return n}function xt(e,t){return t===null?null:e[t]??null}function St(e,t){let n=[];for(let r of t){let t=e[r];t!==void 0&&n.push(t)}return n}function Ct(e,t){if(u.is.store(t))return(0,u.combine)(t,e.indexStore,(e,t)=>xt(t,Q(e)));let n=Q(t);return e.indexStore.map(e=>xt(e,n),{skipVoid:!1})}function wt(e,t){if(u.is.store(t))return(0,u.combine)(t,e.indexStore,(e,t)=>St(t,$(e)));let n=$(t);return e.indexStore.map(e=>St(e,n),{skipVoid:!1})}var Tt=e=>{let t=new ft(e);return r.m(t),t};exports.PICKED_HYDRATED_ATTR=ht,exports.PICKED_MODULE_SCRIPT_TYPE=mt,exports.PICKED_SCRIPT_TYPE=pt,exports.PREVIEW_TOKEN_PARAM=ut,exports.Picked=ft,exports.buildRehydrateBootstrap=_t,exports.createClient=Tt,exports.createPluginEffect=v,exports.createStorageKey=o.t,exports.deriveReference=Ct,exports.deriveReferences=wt,exports.evaluateRuleLogic=t.t,exports.getPickedConfig=tt,exports.isContentReference=Z,exports.isHtmlAssetValue=vt,exports.isInsideIframe=r.t,exports.isLazyLoader=bt,exports.isPickedRoot=i.a,exports.isPreviewSession=dt,exports.lazyComponent=yt,exports.localStore=o.n,exports.onInertScriptSubtrees=l.t,exports.readReferenceId=Q,exports.readReferenceIds=$,exports.rehydrateScripts=gt,exports.reportInertScriptSubtrees=l.n,exports.resetInertScriptReport=l.r,exports.sessionStore=o.r,exports.subscribe=o.i,exports.supportsCookies=r.n,exports.supportsCryptoRandomUUID=r.r,exports.supportsDocument=r.i,exports.supportsHistory=r.a,exports.supportsIntersectionObserver=r.o,exports.supportsLocalStorage=r.s,exports.supportsLocation=r.c,exports.supportsSessionStorage=r.l,exports.supportsShadowRoot=r.u,exports.supportsWebComponents=r.d,exports.supportsWindow=r.f;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../../api-
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../../api-DrCI_JBL.cjs"),t=require("../../../plugin-DkSWIASL.cjs"),n=require("../../../registry-Dj1piWTO.cjs");exports.createClientHeaders=e.i,exports.dynamicExperiencesPlugin=t.t,exports.fetchExperienceContent=n.i,exports.fetchProject=n.a,exports.registerPickedBundle=n.n;
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Site font. Vocs 2 has no `font` config option, so Inter is declared here.
|
|
3
|
+
*/
|
|
4
|
+
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@100..900&display=swap');
|
|
5
|
+
|
|
6
|
+
:root {
|
|
7
|
+
--vocs-fontFamily-default: 'Inter', sans-serif;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
/*
|
|
11
|
+
* Embed mode — activated by the ?embed query param.
|
|
12
|
+
* Hides site chrome (gutters, top nav, sidebar, outline, footer) so the docs
|
|
13
|
+
* content can be displayed inside an iframe in the dashboard's docs panel.
|
|
14
|
+
*
|
|
15
|
+
* Every selector targets a `data-v-*` attribute. These are the hooks Vocs
|
|
16
|
+
* publishes for styling its layout, and they are what this file must use:
|
|
17
|
+
* matching on class names instead would bind to generated Tailwind utilities
|
|
18
|
+
* that carry no compatibility promise, and a rename would break the dashboard's
|
|
19
|
+
* docs panel silently — build and tests stay green while the panel renders with
|
|
20
|
+
* a sidebar and a top nav inside it.
|
|
21
|
+
*
|
|
22
|
+
* Nothing automated covers the visual result. After any Vocs upgrade, open the
|
|
23
|
+
* dashboard docs panel and look at it.
|
|
24
|
+
*/
|
|
25
|
+
|
|
26
|
+
/*
|
|
27
|
+
* Hide the gutters. These hold the top nav, the sidebar and the outline, so
|
|
28
|
+
* hiding them removes the chrome in one step.
|
|
29
|
+
*
|
|
30
|
+
* Do NOT add `[data-v-sidebar]` or `[data-v-topnav]` here. Those sit on the
|
|
31
|
+
* layout root as flags describing which regions the layout has — the root
|
|
32
|
+
* carries both — so hiding them blanks the entire page, content included.
|
|
33
|
+
*/
|
|
34
|
+
.vocs-embed [data-v-gutter-top],
|
|
35
|
+
.vocs-embed [data-v-gutter-top-left],
|
|
36
|
+
.vocs-embed [data-v-gutter-left],
|
|
37
|
+
.vocs-embed [data-v-gutter-right],
|
|
38
|
+
.vocs-embed [data-v-gutter-logo],
|
|
39
|
+
.vocs-embed [data-v-mobile-nav] {
|
|
40
|
+
display: none !important;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/* Hide the sidebar's own container and the curtains behind it */
|
|
44
|
+
.vocs-embed [data-v-sidebar-container],
|
|
45
|
+
.vocs-embed [data-v-sidebar-curtain],
|
|
46
|
+
.vocs-embed [data-v-sidebar-footer-curtain] {
|
|
47
|
+
display: none !important;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/*
|
|
51
|
+
* Hide the surface layer that paints the sidebar and top-nav backgrounds.
|
|
52
|
+
* It sits behind the chrome rather than inside it, so hiding the gutters alone
|
|
53
|
+
* leaves its fill behind as a ghost panel down the left edge.
|
|
54
|
+
*/
|
|
55
|
+
.vocs-embed [data-v-surface-bg] {
|
|
56
|
+
display: none !important;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/*
|
|
60
|
+
* Hide the "Ask AI" prompt. The dashboard embeds these pages beside its own
|
|
61
|
+
* agent, so a second assistant entry point inside the panel competes with it.
|
|
62
|
+
*/
|
|
63
|
+
.vocs-embed [data-v-ask-ai-container] {
|
|
64
|
+
display: none !important;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/*
|
|
68
|
+
* Hide the mobile outline trigger, the footer, the skip link and the bottom
|
|
69
|
+
* observer. The outline and footer render on the client rather than into the
|
|
70
|
+
* prerendered HTML, so they are covered here even though a static build of this
|
|
71
|
+
* site does not emit them.
|
|
72
|
+
*/
|
|
73
|
+
.vocs-embed [data-v-outline],
|
|
74
|
+
.vocs-embed [data-v-outline-mobile],
|
|
75
|
+
.vocs-embed [data-v-footer],
|
|
76
|
+
.vocs-embed [data-v-skip-to-content],
|
|
77
|
+
.vocs-embed [data-bottom-observer],
|
|
78
|
+
.vocs-embed footer {
|
|
79
|
+
display: none !important;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/* Reclaim the space the hidden gutters and top nav were holding */
|
|
83
|
+
.vocs-embed [data-v-main] {
|
|
84
|
+
margin-left: 0 !important;
|
|
85
|
+
padding-top: 0 !important;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/* Expand content to fill the embed viewport */
|
|
89
|
+
.vocs-embed [data-v-content] {
|
|
90
|
+
max-width: 100% !important;
|
|
91
|
+
margin-left: auto !important;
|
|
92
|
+
margin-right: auto !important;
|
|
93
|
+
padding-left: 1.25rem !important;
|
|
94
|
+
padding-right: 1.25rem !important;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/* Remove the top margin on the first child so there is no gap at the panel top */
|
|
98
|
+
.vocs-embed article > :first-child,
|
|
99
|
+
.vocs-embed [data-v-content] > :first-child {
|
|
100
|
+
margin-top: 0 !important;
|
|
101
|
+
}
|
|
@@ -311,4 +311,6 @@ WHERE project_id = '{{ your project ID }}'
|
|
|
311
311
|
- [About PickedQL](/explanation/how-pickedql-works) — what the layer expands for you.
|
|
312
312
|
- [Virtual functions](/reference/pickedql/virtual-functions) — every function.
|
|
313
313
|
- [Dimensions](/reference/pickedql/dimensions) — every dimension column.
|
|
314
|
+
- [Analytics events](/reference/sdk/analytics-events) — every `event_type` value that a
|
|
315
|
+
filter can use.
|
|
314
316
|
- [Reports](/reference/dashboard/reports) — the same data as an embedded dashboard.
|
|
@@ -80,8 +80,18 @@ These columns are on `events` directly, and they need no join:
|
|
|
80
80
|
|
|
81
81
|
`event_type`, `interaction_type`, `experience_id`, `step_id`, `event_id`, `user_canonical_id`, `session_id`, `client_local_date`, `is_purchase`, `is_cart_add`, `event_meta`.
|
|
82
82
|
|
|
83
|
+
Two of them take a name from the SDK. A filter on a name that does not exist gives an
|
|
84
|
+
empty result set and not an error:
|
|
85
|
+
|
|
86
|
+
| Column | The values that it holds |
|
|
87
|
+
|---|---|
|
|
88
|
+
| `event_type` | The name of the event, such as `step_enter` or `cart_add`. [Analytics events](/reference/sdk/analytics-events) names every one, together with the name of each custom event of your own. |
|
|
89
|
+
| `interaction_type` | The label of the element behind the event. It falls back to `event_type` when the event has no element, so it is **not** the list of interaction types. [Analytics events](/reference/sdk/analytics-events) describes both. |
|
|
90
|
+
|
|
83
91
|
## Related
|
|
84
92
|
|
|
85
93
|
- [About PickedQL](/explanation/how-pickedql-works) — why you write no join.
|
|
86
94
|
- [Data sources](/reference/pickedql/data-sources)
|
|
95
|
+
- [Analytics events](/reference/sdk/analytics-events) — every `event_type` value, and the
|
|
96
|
+
contexts behind these columns.
|
|
87
97
|
- [Analytics queries](/how-to/analytics)
|
|
@@ -0,0 +1,445 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: reference
|
|
3
|
+
layout: docs
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Analytics events
|
|
7
|
+
|
|
8
|
+
The Picked SDK sends an analytics event for each action of a visitor. This page names every
|
|
9
|
+
event type, every interaction type, and every schema that the SDK sends.
|
|
10
|
+
|
|
11
|
+
Two terms carry the page:
|
|
12
|
+
|
|
13
|
+
- An **event type** is the name of the event. It is the `event_type` column in PickedQL.
|
|
14
|
+
- A **context** is a block of data that the SDK attaches to an event. Picked makes a
|
|
15
|
+
column from each one. An example is the `product_list` context behind `dim_product`.
|
|
16
|
+
|
|
17
|
+
Every table below marks a context as **always attached** or as **attached when available**.
|
|
18
|
+
The SDK attaches a context in the second group only when it has the data at that moment.
|
|
19
|
+
An event outside an experience has no `experience` context.
|
|
20
|
+
|
|
21
|
+
:::warning
|
|
22
|
+
A PickedQL filter on a name that does not exist gives an empty result set and not an error.
|
|
23
|
+
Take each name from this page.
|
|
24
|
+
:::
|
|
25
|
+
|
|
26
|
+
## Contexts on every event
|
|
27
|
+
|
|
28
|
+
The tracker attaches two contexts to every event: `app`, with the project ID, and
|
|
29
|
+
`deployment`, with the environment of the SDK. It also attaches `cvly_x`, but only for a
|
|
30
|
+
site on Vercel.
|
|
31
|
+
|
|
32
|
+
The tables below never list `deployment` or `cvly_x`. They list `app` only where the
|
|
33
|
+
tracker of that event attaches it a second time.
|
|
34
|
+
|
|
35
|
+
## Event types
|
|
36
|
+
|
|
37
|
+
### Experience events
|
|
38
|
+
|
|
39
|
+
The analytics plugin sends these events. They come from the client SDK, and they need no
|
|
40
|
+
code of yours.
|
|
41
|
+
|
|
42
|
+
| Event type | When it fires | Always attached | Attached when available |
|
|
43
|
+
| --- | --- | --- | --- |
|
|
44
|
+
| `app_load` | The SDK loads on the page. | `feature_list`, `session` | `experience`, `step` |
|
|
45
|
+
| `app_initialize` | The SDK completes its start-up and is ready. | `feature_list`, `session` | `experience`, `step` |
|
|
46
|
+
| `experience_load` | An experience starts. | `experience`, `feature_list`, `session` | `step` |
|
|
47
|
+
| `app_open` | An experience becomes visible to the visitor. | `feature_list`, `session` | `experience`, `step` |
|
|
48
|
+
| `app_close` | An experience stops to be visible. | `feature_list`, `session` | `experience`, `step` |
|
|
49
|
+
| `feature_decide` | A feature flag gets its bucket for this visitor. | `feature_list`, `session` | `experience`, `step` |
|
|
50
|
+
|
|
51
|
+
### Step and form events
|
|
52
|
+
|
|
53
|
+
The analytics plugin sends `step_enter`, `step_submit`, `step_submit_success`,
|
|
54
|
+
`form_submit`, `form_submit_success`, `form_submit_error`, and `field_validation_error`. The
|
|
55
|
+
SDK has a tracker for `step_submit_error` and `step_complete`, but it starts neither of
|
|
56
|
+
them. Call the tracker from your own code.
|
|
57
|
+
|
|
58
|
+
| Event type | When it fires | Always attached | Attached when available |
|
|
59
|
+
| --- | --- | --- | --- |
|
|
60
|
+
| `step_enter` | The visitor arrives at a step of a flow. | `feature_list`, `session`, `step` | `experience`, `field_list` |
|
|
61
|
+
| `step_submit` | The visitor submits a step. | `feature_list`, `session`, `step` | `experience`, `field_list`, `response_list` |
|
|
62
|
+
| `step_submit_success` | The step submission is accepted. | `feature_list`, `session`, `step` | `experience`, `field_list`, `response_list` |
|
|
63
|
+
| `step_submit_error` | A step submission fails. Your code sends it. | `exception`, `feature_list`, `session`, `step` | `experience`, `field_list`, `response_list` |
|
|
64
|
+
| `step_complete` | A step reaches its end state. Your code sends it. | `feature_list`, `session`, `step` | `experience`, `field_list`, `response_list` |
|
|
65
|
+
| `form_submit` | The visitor submits a form. | `feature_list`, `form`, `session` | `experience`, `step` |
|
|
66
|
+
| `form_submit_success` | The form submission is accepted. | `feature_list`, `form`, `session` | `experience`, `step` |
|
|
67
|
+
| `form_submit_error` | The form submission fails. The reason is in `exception`. | `exception`, `feature_list`, `form`, `session` | `experience`, `step` |
|
|
68
|
+
| `field_validation_error` | A field value fails a validation rule. | `exception`, `feature_list`, `session` | `experience`, `form`, `step` |
|
|
69
|
+
|
|
70
|
+
### Ecommerce events
|
|
71
|
+
|
|
72
|
+
Three sources send these events: the template for Google Tag Manager, the Picked app for
|
|
73
|
+
Shopify, and your own code. The template for Google Tag Manager sends every event of this
|
|
74
|
+
group. "Shopify behaviour" below covers the Picked app for Shopify.
|
|
75
|
+
|
|
76
|
+
| Event type | When it fires | Always attached | Attached when available |
|
|
77
|
+
| --- | --- | --- | --- |
|
|
78
|
+
| `cart_add` | A product goes into the cart. | `app`, `feature_list`, `product_list`, `session` | `experience`, `step` |
|
|
79
|
+
| `cart_remove` | A product leaves the cart. | `app`, `feature_list`, `product_list`, `session` | `experience`, `step` |
|
|
80
|
+
| `checkout_start` | The visitor starts a checkout. | `app`, `feature_list`, `product_list`, `session` | `experience`, `step` |
|
|
81
|
+
| `checkout_complete` | The visitor completes a checkout. It is the default conversion of PickedQL. | `app`, `feature_list`, `order`, `product_list`, `session` | `experience`, `step` |
|
|
82
|
+
| `order_create` | An order becomes a record in the store. | `app`, `feature_list`, `order`, `product_list`, `session` | `experience`, `step` |
|
|
83
|
+
| `product_list_view` | The visitor sees a list of products, such as a collection. | `app`, `feature_list`, `product_list`, `session` | `experience`, `step` |
|
|
84
|
+
| `product_select` | The visitor chooses a product from a list. | `feature_list`, `product_list`, `session` | `experience`, `step` |
|
|
85
|
+
| `product_view_details` | The visitor opens the detail page of a product. | `app`, `feature_list`, `product_list`, `session` | `experience`, `step` |
|
|
86
|
+
| `search_results_list_view` | The visitor sees a list of search results. | `feature_list`, `product_list`, `session` | `experience`, `step` |
|
|
87
|
+
| `recommendation_present` | A step shows a recommendation to the visitor. | `feature_list`, `product_list`, `session` | `experience`, `step` |
|
|
88
|
+
| `wishlist_add` | A product goes onto a wishlist. | `feature_list`, `product_list`, `session` | `experience`, `step` |
|
|
89
|
+
| `waitlist_join` | The visitor joins a waitlist. | `app`, `feature_list`, `session` | `experience`, `product_list`, `step` |
|
|
90
|
+
|
|
91
|
+
`is_purchase` is 1 for `checkout_complete` and 0 for every other event. `is_cart_add` is 1
|
|
92
|
+
for `cart_add`. Both columns are on `events` and on `metrics`.
|
|
93
|
+
|
|
94
|
+
#### Shopify behaviour
|
|
95
|
+
|
|
96
|
+
The Picked app for Shopify sends a part of this group from a web pixel, and one event from
|
|
97
|
+
the server.
|
|
98
|
+
|
|
99
|
+
| Picked event | Shopify source |
|
|
100
|
+
| --- | --- |
|
|
101
|
+
| `cart_add` | The `product_added_to_cart` pixel event. The `product_list` context holds the one cart line, and not the whole cart. |
|
|
102
|
+
| `cart_remove` | The `product_removed_from_cart` pixel event, with the same one cart line. |
|
|
103
|
+
| `checkout_start` | The `checkout_started` pixel event. The `session` context also gets `shopify_checkout_token`. |
|
|
104
|
+
| `checkout_complete` | The `checkout_completed` pixel event. The `order` context is there only when the checkout has an order. |
|
|
105
|
+
| `order_create` | The `orders/create` webhook, from the server and not the browser. The event time is the creation time of the order. |
|
|
106
|
+
| `product_list_view` | The `collection_viewed` pixel event. |
|
|
107
|
+
| `product_view_details` | The `product_viewed` pixel event, for one product variant. |
|
|
108
|
+
| `page_view` | The `page_viewed` pixel event. |
|
|
109
|
+
| `identify` | The `picked:session` pixel event. |
|
|
110
|
+
|
|
111
|
+
For a Shopify store, the `session` context also holds `shopify_client_id`,
|
|
112
|
+
`shopify_customer_id`, and `shopify_checkout_token`. The `order` context holds the Shopify
|
|
113
|
+
`checkout_token` and `cart_token`. The Shopify pixel sends no other event type of this page.
|
|
114
|
+
|
|
115
|
+
### Page and session events
|
|
116
|
+
|
|
117
|
+
| Event type | When it fires | Always attached | Attached when available |
|
|
118
|
+
| --- | --- | --- | --- |
|
|
119
|
+
| `page_view` | The visitor opens a page. | `app`, `feature_list`, `session` | `experience`, `product_list`, `step` |
|
|
120
|
+
| `identify` | The SDK connects the session to a known person or store client. | `app`, `session` | `experience`, `feature_list`, `step` |
|
|
121
|
+
| `lead_capture` | The visitor gives contact details. | `feature_list`, `session` | `experience`, `step` |
|
|
122
|
+
| `modal_open` | A modal opens. | `feature_list`, `modal`, `session` | `experience`, `step` |
|
|
123
|
+
| `modal_close` | A modal closes. | `feature_list`, `modal`, `session` | `experience`, `step` |
|
|
124
|
+
|
|
125
|
+
## Custom events
|
|
126
|
+
|
|
127
|
+
A custom event takes its name from you, and not from the list above. Its `event_type` is
|
|
128
|
+
the name that you give it, so a query for it uses that name.
|
|
129
|
+
|
|
130
|
+
Two routes send one:
|
|
131
|
+
|
|
132
|
+
- A `data-picked-<interaction>` attribute on an element. An element with
|
|
133
|
+
`data-picked-click="add_to_cart"` sends an `add_to_cart` event on a click.
|
|
134
|
+
- The `custom` message of the template for Google Tag Manager, with a name of your choice.
|
|
135
|
+
|
|
136
|
+
A custom event always carries `app` and `session`. It also carries `element`, `exception`,
|
|
137
|
+
`experience`, `feature_list`, `field_list`, `form`, `modal`, `order`, `product_list`,
|
|
138
|
+
`response_list`, and `step` when the data is available.
|
|
139
|
+
|
|
140
|
+
## Interaction types
|
|
141
|
+
|
|
142
|
+
An interaction event is a DOM event of the visitor. Its name is also an `event_type` value,
|
|
143
|
+
so a query for a click reads `WHERE event_type = 'click'`.
|
|
144
|
+
|
|
145
|
+
:::warning
|
|
146
|
+
`interaction_type` in PickedQL is a different column. It holds the label of the element
|
|
147
|
+
behind the event, and it falls back to `event_type` when the event has no element. A filter
|
|
148
|
+
on `interaction_type = 'click'` therefore matches only the clicks with no label.
|
|
149
|
+
:::
|
|
150
|
+
|
|
151
|
+
### Element interactions
|
|
152
|
+
|
|
153
|
+
The SDK binds these listeners to an experience when the `enableInteractionListeners` option
|
|
154
|
+
of the analytics plugin names them. The option is off by default.
|
|
155
|
+
|
|
156
|
+
| Interaction type | When it fires | Always attached | Attached when available |
|
|
157
|
+
| --- | --- | --- | --- |
|
|
158
|
+
| `click` | The visitor clicks an element. | `element`, `feature_list`, `session` | `experience`, `step` |
|
|
159
|
+
| `rapid_click` | The visitor clicks the same element many times in a short period. | `element`, `feature_list`, `session` | `experience`, `step` |
|
|
160
|
+
| `right_click` | The visitor opens the context menu on an element. | `element`, `feature_list`, `session` | `experience`, `step` |
|
|
161
|
+
| `copy` | The visitor copies a selection. | `feature_list`, `session` | `element`, `experience`, `step` |
|
|
162
|
+
| `paste` | The visitor copies text into a field. | `feature_list`, `session` | `element`, `experience`, `step` |
|
|
163
|
+
| `drag` | The visitor drags an element. | `feature_list`, `session` | `element`, `experience`, `step` |
|
|
164
|
+
| `backspace` | The visitor deletes a character in a field. | `element`, `feature_list`, `session` | `experience`, `step` |
|
|
165
|
+
| `scroll` | The visitor scrolls. | `feature_list`, `session` | `element`, `experience`, `step` |
|
|
166
|
+
| `rapid_scroll` | The visitor scrolls up and down fast. | `feature_list`, `session` | `element`, `experience`, `step` |
|
|
167
|
+
| `mouse_shake` | The visitor moves the pointer fast from side to side. | `feature_list`, `session` | `experience`, `step` |
|
|
168
|
+
|
|
169
|
+
### Page and network interactions
|
|
170
|
+
|
|
171
|
+
The SDK binds these listeners to the document when the `enableDocumentListeners` option of
|
|
172
|
+
the analytics plugin is true. The option is off by default.
|
|
173
|
+
|
|
174
|
+
| Interaction type | When it fires | Always attached | Attached when available |
|
|
175
|
+
| --- | --- | --- | --- |
|
|
176
|
+
| `page_visible` | The page becomes visible, such as a return to the tab. | `feature_list`, `session` | `experience`, `step` |
|
|
177
|
+
| `page_hidden` | The page stops to be visible. | `feature_list`, `session` | `experience`, `step` |
|
|
178
|
+
| `page_show` | The browser shows the page, and also on a return from the cache. | `feature_list`, `session` | `experience`, `step` |
|
|
179
|
+
| `page_hide` | The browser hides the page before the visitor goes to a different page. | `feature_list`, `session` | `experience`, `step` |
|
|
180
|
+
| `offline` | The browser loses the network. | `feature_list`, `session` | `experience`, `step` |
|
|
181
|
+
| `online` | The browser gets the network back. | `feature_list`, `session` | `experience`, `step` |
|
|
182
|
+
| `resize` | The window changes size. | `feature_list`, `session` | `experience`, `step` |
|
|
183
|
+
| `unload` | The browser closes the document. | `feature_list`, `session` | `experience`, `step` |
|
|
184
|
+
|
|
185
|
+
### Interactions with no listener
|
|
186
|
+
|
|
187
|
+
The SDK declares these four types and sends none of them, because it binds no listener for
|
|
188
|
+
them. A query on one of them gives an empty result set.
|
|
189
|
+
|
|
190
|
+
| Interaction type | When it fires | Always attached | Attached when available |
|
|
191
|
+
| --- | --- | --- | --- |
|
|
192
|
+
| `back` | Nothing sends it. | `feature_list`, `session` | `experience`, `step` |
|
|
193
|
+
| `forward` | Nothing sends it. | `feature_list`, `session` | `experience`, `step` |
|
|
194
|
+
| `video_play` | Nothing sends it. | `element`, `feature_list`, `session` | `experience`, `step` |
|
|
195
|
+
| `video_pause` | Nothing sends it. | `element`, `feature_list`, `session` | `experience`, `step` |
|
|
196
|
+
|
|
197
|
+
## Schemas
|
|
198
|
+
|
|
199
|
+
Each context has a schema. Every schema also accepts a `meta` object for data of your own,
|
|
200
|
+
and keeps a property that the schema does not name. The field tables below do not repeat
|
|
201
|
+
`meta`.
|
|
202
|
+
|
|
203
|
+
| Schema | What it describes |
|
|
204
|
+
| --- | --- |
|
|
205
|
+
| `answer_list` | The responses of a visitor, under the earlier name of `response_list`. The SDK attaches `response_list`. |
|
|
206
|
+
| `app` | The Picked project that the event belongs to. |
|
|
207
|
+
| `cvly_funnel` | The version of a Convincely funnel. The SDK attaches it for no event. |
|
|
208
|
+
| `cvly_x` | The Vercel deployment behind the site. |
|
|
209
|
+
| `deployment` | The deployment and the environment of the SDK. |
|
|
210
|
+
| `element` | The HTML element behind an interaction event. |
|
|
211
|
+
| `event` | The event itself. It is not a context: it holds the event type and the `event_meta` column. |
|
|
212
|
+
| `exception` | The reason for a failure or a validation error. |
|
|
213
|
+
| `experience` | The experience that the visitor is in. |
|
|
214
|
+
| `feature_list` | Each feature flag of the session, with the bucket of the visitor. |
|
|
215
|
+
| `field_list` | The fields of the current step, with their options. |
|
|
216
|
+
| `form` | The form behind a form event. |
|
|
217
|
+
| `modal` | The modal behind a modal event. |
|
|
218
|
+
| `order` | The order behind a purchase. |
|
|
219
|
+
| `picked` | The SDK version. The SDK attaches it for no event. |
|
|
220
|
+
| `product_list` | The products that the event is about. |
|
|
221
|
+
| `question_list` | The fields of a step, under the earlier name of `field_list`. The SDK attaches `field_list`. |
|
|
222
|
+
| `recommendation_list` | A list of recommended items. The SDK attaches it for no event. |
|
|
223
|
+
| `response_list` | The response of the visitor to each field. |
|
|
224
|
+
| `session` | The session, and each identifier that Picked has for it. |
|
|
225
|
+
| `step` | The step of the flow that the visitor is on. |
|
|
226
|
+
|
|
227
|
+
### `app`
|
|
228
|
+
|
|
229
|
+
| Field | Type | Required | Description |
|
|
230
|
+
| --- | --- | --- | --- |
|
|
231
|
+
| `project_id` | `string` | Yes | The project ID. |
|
|
232
|
+
|
|
233
|
+
### `deployment`
|
|
234
|
+
|
|
235
|
+
| Field | Type | Required | Description |
|
|
236
|
+
| --- | --- | --- | --- |
|
|
237
|
+
| `env` | `string` | Yes | The environment of the deployment. |
|
|
238
|
+
| `id` | `string` or `null` | No | The deployment ID. |
|
|
239
|
+
| `sha` | `string` or `null` | No | The Git hash of the deployment. |
|
|
240
|
+
| `host` | `string` or `null` | No | The host of the deployment. |
|
|
241
|
+
|
|
242
|
+
### `cvly_x`
|
|
243
|
+
|
|
244
|
+
| Field | Type | Required | Description |
|
|
245
|
+
| --- | --- | --- | --- |
|
|
246
|
+
| `vercel_deployment_id` | `string` | Yes | The Vercel deployment ID. |
|
|
247
|
+
| `vercel_env` | `string` | Yes | The Vercel environment. |
|
|
248
|
+
| `vercel_url` | `string` | Yes | The URL of the Vercel deployment. |
|
|
249
|
+
| `git_commit_sha` | `string` or `null` | No | The Git hash of the deployment. |
|
|
250
|
+
|
|
251
|
+
### `session`
|
|
252
|
+
|
|
253
|
+
The `session` schema has no required field. A value is `null` until Picked has it.
|
|
254
|
+
|
|
255
|
+
| Field | Type | Required | Description |
|
|
256
|
+
| --- | --- | --- | --- |
|
|
257
|
+
| `id` | `string` or `null` | No | The session ID. |
|
|
258
|
+
| `is_user` | `boolean` or `null` | No | True when Picked attributes the session to a known user. |
|
|
259
|
+
| `gaid` | `string` or `null` | No | The client ID from Google Analytics. |
|
|
260
|
+
| `shopify_client_id` | `string` or `null` | No | The Shopify client ID. |
|
|
261
|
+
| `shopify_customer_id` | `string` or `null` | No | The Shopify customer ID. |
|
|
262
|
+
| `shopify_checkout_token` | `string` or `null` | No | The Shopify checkout token. |
|
|
263
|
+
| `fingerprintjs_visitor_id` | `string` or `null` | No | The FingerprintJS visitor ID. |
|
|
264
|
+
|
|
265
|
+
### `experience`
|
|
266
|
+
|
|
267
|
+
| Field | Type | Required | Description |
|
|
268
|
+
| --- | --- | --- | --- |
|
|
269
|
+
| `id` | `string` | Yes | The experience ID. |
|
|
270
|
+
| `title` | `string` | Yes | The experience title. It is `experience_title` in PickedQL. |
|
|
271
|
+
| `type` | `string` or `null` | No | The experience type. |
|
|
272
|
+
|
|
273
|
+
### `step`
|
|
274
|
+
|
|
275
|
+
| Field | Type | Required | Description |
|
|
276
|
+
| --- | --- | --- | --- |
|
|
277
|
+
| `id` | `string` | Yes | The step ID. It is `step_id` in PickedQL. |
|
|
278
|
+
| `title` | `string` | Yes | The step title. It is `step_title` in PickedQL. |
|
|
279
|
+
| `key` | `string` or `null` | No | The stable key of the step. It does not change between versions. |
|
|
280
|
+
|
|
281
|
+
### `feature_list`
|
|
282
|
+
|
|
283
|
+
`items` is a list. Each item describes one feature flag of the session.
|
|
284
|
+
|
|
285
|
+
| Field | Type | Required | Description |
|
|
286
|
+
| --- | --- | --- | --- |
|
|
287
|
+
| `items` | `array` | Yes | One entry for each feature flag. |
|
|
288
|
+
| `items[].ab_feature` | `string` | Yes | The feature ID. |
|
|
289
|
+
| `items[].ab_name` | `string` | Yes | The feature name. It is `ab_feature_name` in PickedQL. |
|
|
290
|
+
| `items[].ab_key` | `string` | Yes | The feature key. |
|
|
291
|
+
| `items[].ab_bucket` | `boolean` or `string` | Yes | The bucket of the visitor. It is `ab_feature_value` in PickedQL. |
|
|
292
|
+
|
|
293
|
+
### `field_list`
|
|
294
|
+
|
|
295
|
+
| Field | Type | Required | Description |
|
|
296
|
+
| --- | --- | --- | --- |
|
|
297
|
+
| `items` | `array` | Yes | One entry for each field of the step. |
|
|
298
|
+
| `items[].id` | `string` | Yes | The field ID. |
|
|
299
|
+
| `items[].type` | `string` | Yes | The field type. |
|
|
300
|
+
| `items[].label` | `string` | Yes | The field label. |
|
|
301
|
+
| `items[].options` | `array` or `null` | No | The options that the field gives. |
|
|
302
|
+
| `items[].options[].id` | `string` | Yes | The option ID. |
|
|
303
|
+
| `items[].options[].label` | `string` | Yes | The option label. |
|
|
304
|
+
| `items[].options[].value` | `string`, `number`, `boolean`, `object`, `array`, or `null` | Yes | The value behind the option. |
|
|
305
|
+
|
|
306
|
+
### `response_list`
|
|
307
|
+
|
|
308
|
+
| Field | Type | Required | Description |
|
|
309
|
+
| --- | --- | --- | --- |
|
|
310
|
+
| `items` | `array` | Yes | One entry for each field with a response. |
|
|
311
|
+
| `items[].field_id` | `string` | Yes | The ID of the field. |
|
|
312
|
+
| `items[].values` | `array` | Yes | The values that the visitor gave. |
|
|
313
|
+
| `items[].values[].value` | `string`, `number`, `boolean`, `object`, `array`, or `null` | Yes | One response value. |
|
|
314
|
+
|
|
315
|
+
### `form`
|
|
316
|
+
|
|
317
|
+
| Field | Type | Required | Description |
|
|
318
|
+
| --- | --- | --- | --- |
|
|
319
|
+
| `id` | `string` | Yes | The form ID. |
|
|
320
|
+
| `title` | `string` or `null` | No | The form title. |
|
|
321
|
+
|
|
322
|
+
### `modal`
|
|
323
|
+
|
|
324
|
+
| Field | Type | Required | Description |
|
|
325
|
+
| --- | --- | --- | --- |
|
|
326
|
+
| `id` | `string` | Yes | The modal ID. |
|
|
327
|
+
| `title` | `string` | Yes | The modal title. |
|
|
328
|
+
|
|
329
|
+
### `element`
|
|
330
|
+
|
|
331
|
+
| Field | Type | Required | Description |
|
|
332
|
+
| --- | --- | --- | --- |
|
|
333
|
+
| `node_type` | `string` | Yes | The HTML tag name in lower case. It is `unknown` when the event has no element. |
|
|
334
|
+
| `id` | `string` or `null` | No | The `id` attribute of the element. |
|
|
335
|
+
| `text` | `string` or `null` | No | The text content of the element, to 255 characters. |
|
|
336
|
+
| `label` | `string` or `null` | No | The label of the element. It is the source of `interaction_type` in PickedQL. |
|
|
337
|
+
|
|
338
|
+
### `exception`
|
|
339
|
+
|
|
340
|
+
| Field | Type | Required | Description |
|
|
341
|
+
| --- | --- | --- | --- |
|
|
342
|
+
| `reason` | `string` | Yes | The reason for the failure. |
|
|
343
|
+
|
|
344
|
+
### `product_list`
|
|
345
|
+
|
|
346
|
+
`items` follows the item format of GA4 Enhanced Ecommerce, so a variable in Google Tag
|
|
347
|
+
Manager maps onto it directly. Every item field accepts `null`.
|
|
348
|
+
|
|
349
|
+
| Field | Type | Required | Description |
|
|
350
|
+
| --- | --- | --- | --- |
|
|
351
|
+
| `items` | `array` | Yes | One entry for each product. |
|
|
352
|
+
| `title` | `string` or `null` | No | The title of the list. |
|
|
353
|
+
| `items[].item_id` | `string` or `null` | No | The product ID. It is `product_name` in `dim_product` together with the name. |
|
|
354
|
+
| `items[].item_name` | `string` or `null` | No | The product name. |
|
|
355
|
+
| `items[].item_brand` | `string` or `null` | No | The brand. |
|
|
356
|
+
| `items[].item_category` | `string` or `null` | No | The category. `item_category2` to `item_category5` hold the deeper levels. |
|
|
357
|
+
| `items[].item_variant` | `string` or `null` | No | The variant. |
|
|
358
|
+
| `items[].item_list_id` | `string` or `null` | No | The ID of the list that the product came from. |
|
|
359
|
+
| `items[].item_list_name` | `string` or `null` | No | The name of that list. |
|
|
360
|
+
| `items[].price` | `number` or `null` | No | The price of one item. |
|
|
361
|
+
| `items[].quantity` | `number` or `null` | No | The quantity. |
|
|
362
|
+
| `items[].discount` | `number` or `null` | No | The discount on the item. |
|
|
363
|
+
| `items[].currency` | `string` or `null` | No | The currency code. |
|
|
364
|
+
| `items[].coupon` | `string` or `null` | No | The coupon code. |
|
|
365
|
+
| `items[].affiliation` | `string` or `null` | No | The store behind the order. |
|
|
366
|
+
| `items[].index` | `number` or `null` | No | The position of the product in the list. |
|
|
367
|
+
| `items[].location_id` | `string` or `null` | No | The location of the store. |
|
|
368
|
+
| `items[].promotion_id` | `string` or `null` | No | The promotion ID. |
|
|
369
|
+
| `items[].promotion_name` | `string` or `null` | No | The promotion name. |
|
|
370
|
+
| `items[].creative_name` | `string` or `null` | No | The creative name. |
|
|
371
|
+
| `items[].creative_slot` | `string` or `null` | No | The creative slot. |
|
|
372
|
+
| `items[].in_stock` | `boolean` or `null` | No | True when the product is in stock. |
|
|
373
|
+
|
|
374
|
+
### `order`
|
|
375
|
+
|
|
376
|
+
| Field | Type | Required | Description |
|
|
377
|
+
| --- | --- | --- | --- |
|
|
378
|
+
| `id` | `string` | Yes | The order ID. It is `order_id` in PickedQL. |
|
|
379
|
+
| `customer_id` | `string` or `null` | No | The customer ID in the store. |
|
|
380
|
+
| `checkout_token` | `string` or `null` | No | The checkout token in the store. |
|
|
381
|
+
| `cart_token` | `string` or `null` | No | The cart token in the store. |
|
|
382
|
+
|
|
383
|
+
### `event`
|
|
384
|
+
|
|
385
|
+
The event schema wraps every event, and it is not a context.
|
|
386
|
+
|
|
387
|
+
| Field | Type | Required | Description |
|
|
388
|
+
| --- | --- | --- | --- |
|
|
389
|
+
| `type` | `string` | Yes | The event type. It is `event_type` in PickedQL. |
|
|
390
|
+
|
|
391
|
+
The `meta` object of this schema is the `event_meta` column in PickedQL.
|
|
392
|
+
|
|
393
|
+
### `recommendation_list`
|
|
394
|
+
|
|
395
|
+
| Field | Type | Required | Description |
|
|
396
|
+
| --- | --- | --- | --- |
|
|
397
|
+
| `title` | `string` | Yes | The title of the list. |
|
|
398
|
+
| `items` | `array` | Yes | One entry for each recommended item. |
|
|
399
|
+
| `items[].sku` | `string` | Yes | The SKU of the item. |
|
|
400
|
+
| `items[].title` | `string` | Yes | The title of the item. |
|
|
401
|
+
|
|
402
|
+
### `question_list`
|
|
403
|
+
|
|
404
|
+
`question_list` is the earlier name of `field_list`, and it has the same shape. On an item
|
|
405
|
+
and on an option, `title` takes the place of `label`.
|
|
406
|
+
|
|
407
|
+
| Field | Type | Required | Description |
|
|
408
|
+
| --- | --- | --- | --- |
|
|
409
|
+
| `items` | `array` | Yes | One entry for each question. |
|
|
410
|
+
| `items[].id` | `string` | Yes | The question ID. |
|
|
411
|
+
| `items[].type` | `string` | Yes | The question type. |
|
|
412
|
+
| `items[].title` | `string` | Yes | The question title. |
|
|
413
|
+
| `items[].options` | `array` or `null` | No | The options that the question gives. |
|
|
414
|
+
|
|
415
|
+
### `answer_list`
|
|
416
|
+
|
|
417
|
+
`answer_list` is the earlier name of `response_list`, and it has the same shape.
|
|
418
|
+
|
|
419
|
+
| Field | Type | Required | Description |
|
|
420
|
+
| --- | --- | --- | --- |
|
|
421
|
+
| `items` | `array` | Yes | One entry for each question with an answer. |
|
|
422
|
+
| `items[].question_id` | `string` | Yes | The ID of the question. |
|
|
423
|
+
| `items[].values` | `array` | Yes | The values that the visitor gave. |
|
|
424
|
+
| `items[].values[].value` | `string`, `number`, `boolean`, `object`, `array`, or `null` | Yes | One answer value. |
|
|
425
|
+
|
|
426
|
+
### `cvly_funnel`
|
|
427
|
+
|
|
428
|
+
| Field | Type | Required | Description |
|
|
429
|
+
| --- | --- | --- | --- |
|
|
430
|
+
| `version` | `string` | Yes | The version of the funnel. |
|
|
431
|
+
|
|
432
|
+
### `picked`
|
|
433
|
+
|
|
434
|
+
| Field | Type | Required | Description |
|
|
435
|
+
| --- | --- | --- | --- |
|
|
436
|
+
| `sdk_version` | `string` | Yes | The version of the SDK. |
|
|
437
|
+
|
|
438
|
+
## Related
|
|
439
|
+
|
|
440
|
+
- [Dimension columns](/reference/pickedql/dimensions) — the columns that come from these
|
|
441
|
+
contexts.
|
|
442
|
+
- [Schema](/reference/pickedql/schema) — the columns of `events` and of `metrics`.
|
|
443
|
+
- [Run an analytics query](/how-to/analytics) — a query for each common question.
|
|
444
|
+
- [Install the GTM template](/how-to/install-the-gtm-template) — how to send an ecommerce
|
|
445
|
+
event from Google Tag Manager.
|
package/dist/esm/index.js
CHANGED
|
@@ -5,7 +5,7 @@ import { a as i, c as a, d as o, f as s, i as c, l, m as u, n as d, o as f, r as
|
|
|
5
5
|
import { a as _, i as v, r as ee, s as y, t as b } from "../dom-BqcToNL0.js";
|
|
6
6
|
import { l as x, n as S, r as C, u as w } from "../experience-instance-DGk11d8a.js";
|
|
7
7
|
import { i as T, n as E, r as D, t as O } from "../storage-1MW3-_As.js";
|
|
8
|
-
import { n as te, r as ne } from "../api-
|
|
8
|
+
import { n as te, r as ne } from "../api-Bk9LpmF-.js";
|
|
9
9
|
import { t as re } from "../id-Bo4RBeOs.js";
|
|
10
10
|
import { n as ie, r as ae, t as oe } from "../inert-script-report-B_bMPRzp.js";
|
|
11
11
|
import { attach as k, combine as A, createApi as j, createDomain as M, createEffect as N, createEvent as P, createStore as F, is as se, sample as I } from "effector";
|
|
@@ -1773,7 +1773,7 @@ var Kt = class {
|
|
|
1773
1773
|
dataProviderFor(e) {
|
|
1774
1774
|
let t = e ?? "", n = this.dataProviders.get(t);
|
|
1775
1775
|
if (n) return n;
|
|
1776
|
-
let r = import("../provider-
|
|
1776
|
+
let r = import("../provider-y2ueV5pV.js").then((t) => t.createPickedDataProvider({
|
|
1777
1777
|
apiUrl: this.apiUrl,
|
|
1778
1778
|
projectId: this.projectId,
|
|
1779
1779
|
...e !== void 0 && { previewToken: e }
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { i as e } from "../../../api-
|
|
1
|
+
import { i as e } from "../../../api-Bk9LpmF-.js";
|
|
2
2
|
import { t } from "../../../plugin-DviILBha.js";
|
|
3
|
-
import { a as n, i as r, n as i } from "../../../registry-
|
|
3
|
+
import { a as n, i as r, n as i } from "../../../registry-Lv_Ql7Ix.js";
|
|
4
4
|
export { e as createClientHeaders, t as dynamicExperiencesPlugin, r as fetchExperienceContent, n as fetchProject, i as registerPickedBundle };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
require("./logger-CSTvAyyB.cjs");const e=require("./registry-
|
|
1
|
+
require("./logger-CSTvAyyB.cjs");const e=require("./registry-Dj1piWTO.cjs");var t=`bundle`,n=`api`;async function r(){try{let t=await import(`virtual:picked/data`);return e.r(t)?t:null}catch{return null}}function i(t){if(t===void 0||e.r(t))return t}function a(a){let{apiUrl:o,projectId:s,previewToken:c,signal:l}=a,u=!!c,d=u?n:a.mode,f=i(u?void 0:a.bundle),p=u?void 0:a.projectConfig,m=a.getContent,h={mode:d??n,manifest:null},g,_,v=new Map;function y(){if(d===n)return Promise.resolve(null);if(f)return Promise.resolve(f);let t=e.t();return t?Promise.resolve(t):(g??=r(),g)}function b(e){h.mode=e?t:n,h.manifest=e?e.manifestMetadata:null}async function x(){if(p)return b(await y()),p;let n=await y();return b(n),n?n.projectConfig:d===t?null:e.a(o,s,{...c!==void 0&&{previewToken:c},...l!==void 0&&{signal:l}})}async function S(n,r){let i=c===void 0?void 0:{previewToken:c};if(m)return m(n,i);let a=await y();if(b(a),a)try{return await a.experienceContent(n,i)}catch{return`${n.id}`,null}if(d===t)return null;let u=r??l;return e.i(o,s,n.id,{...c!==void 0&&{previewToken:c},...u!==void 0&&{signal:u}})}return{meta:h,getProjectConfig:()=>(_??=x(),_),getContent:(e,t)=>{let n=v.get(e.id);if(n)return n;let r=S(e,t?.signal).finally(()=>{v.delete(e.id)});return v.set(e.id,r),r}}}exports.createPickedDataProvider=a;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import "./logger-DMN6TxJJ.js";
|
|
2
|
-
import { a as e, i as t, r as n, t as r } from "./registry-
|
|
2
|
+
import { a as e, i as t, r as n, t as r } from "./registry-Lv_Ql7Ix.js";
|
|
3
3
|
//#region src/data-source/provider.ts
|
|
4
4
|
var i = "bundle", a = "api";
|
|
5
5
|
async function o() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
require("./logger-CSTvAyyB.cjs");const e=require("./api-
|
|
1
|
+
require("./logger-CSTvAyyB.cjs");const e=require("./api-DrCI_JBL.cjs");function t(e){return typeof e==`object`&&!!e}function n(e){return t(e)&&`features`in e&&Array.isArray(e.features)}function r(e){return!t(e)||!(`experienceId`in e)||!(`content`in e)?!1:Array.isArray(e.content)}function i(e){try{let t=new URL(e).hostname;return t===`localhost`||t===`127.0.0.1`||t===`::1`}catch{return!1}}function a(e){if(!t(e)||!(`cause`in e))return!1;let{cause:n}=e;return!t(n)||!(`code`in n)?!1:n.code===`ECONNREFUSED`}async function o(t,r,o){let s=o?.previewToken?`projects/${r}?preview_token=${encodeURIComponent(o.previewToken)}`:`projects/${r}`,c;try{c=await e.t(t,s,o?.headers,o?.signal)}catch(e){return i(t)&&a(e),null}if(!c.ok)return`${c.status.toString()}`,null;let l;try{l=await c.json()}catch{return null}return n(l)?l:null}async function s(t,n,o,s){let c=s?.previewToken?`projects/${n}/experiences/${o}/content?preview_token=${encodeURIComponent(s.previewToken)}`:`projects/${n}/experiences/${o}/content`,l;try{l=await e.t(t,c,s?.headers,s?.signal)}catch(e){return i(t)&&a(e)||`${o}`,null}if(!l.ok)return`${o}${l.status.toString()}`,null;let u;try{u=await l.json()}catch{return`${o}`,null}return r(u)?u:(`${o}`,null)}function c(e){if(typeof e!=`object`||!e||!(`projectConfig`in e)||!(`experienceContent`in e)||!(`manifestMetadata`in e))return!1;let{experienceContent:t}=e;return typeof t==`function`}var l=null;function u(e){c(e)&&(l=e)}function d(){return l}Object.defineProperty(exports,"a",{enumerable:!0,get:function(){return o}}),Object.defineProperty(exports,"i",{enumerable:!0,get:function(){return s}}),Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return u}}),Object.defineProperty(exports,"r",{enumerable:!0,get:function(){return c}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return d}});
|