@picked/client 0.0.1-dev.1772064704206 → 0.0.1-dev.1772073931707

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/cjs/index.js CHANGED
@@ -1,4 +1,4 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const g=require("effector"),v=require("@withease/factories"),w=require("../experience-instance-5rr_D--s.cjs"),x=require("../logger-BsmHUUw1.cjs"),b=require("../storage-Be5xWNPC.cjs"),W=require("../id-BKIWbSTy.cjs"),H=require("../object-BbFTsGh3.cjs"),S=require("../supports-YvpQZxbh.cjs"),V=g.createDomain("experience"),J=v.createFactory(({client:t,experience:e})=>{const r=V.store(e),n=g.createApi(r,{merge(p,h){return{...p,...h.experience}}}),i=r.map(p=>({name:p.name,decisionLogic:p.condition??p.decide,targetSelectors:p.targets,initializeOpenLogic:e.initializeOpen})),d=t.components.listStore.map(p=>p.find(h=>h.name===`experience:${e.id}`)||p.find(h=>h.name==="experience"),{skipVoid:!1}),l=r.map(p=>({steps:p.steps,nodes:p.nodes,edges:p.edges,conditionals:p.conditionals})),c=r.map(p=>p.fields),m=e.actions??[];return{id:e.id,configStore:i,treeStore:l,fieldsStore:c,componentStore:d,actions:m,merge:n.merge}});function G(t){return v.invoke(J,t)}const Y=v.createFactory(({client:t})=>{const e=V.store({}),r=g.createApi(e,{register(l,c){return{...l,[c.id]:c}}});function n(l){const c=e.getState()[l.id];if(c){c.merge({experience:l,strategy:"override"});return}const m=G({client:t,experience:l});r.register(m)}const i=e.map(l=>Object.values(l));function d(l){return e.map(c=>c[l],{skipVoid:!1})}return{register:n,getById:d,listStore:i}});function Q(t){return v.invoke(Y,t)}const X=(t,e)=>{e.register(t)},T=(t,e)=>{const{targetSelectors:r}=e.configStore.getState(),n=w.getTargetElements(r,e.id);n.forEach(({elements:d})=>d.forEach(l=>w.tagTargetElement(l,e.id))),w.createAppHosts(n,e.id).forEach(d=>{t.experienceInstances.spawn(e,d)})},$=async t=>{await Promise.all(t.experiences.listStore.getState().map(async e=>{await Z(t,e)&&T(t,e)}))},Z=async(t,e)=>{const{decisionLogic:r,targetSelectors:n}=e.configStore.getState();return w.getTargetElements(n,e.id).length<1||n.length===0?!1:r&&w.isRulesLogic(r)?await w.evaluateRuleLogic(t,r)===!0:!0},ee=(t,e,r)=>{const n=e.name,i=e.setup(t);if(i){const d=r[n]??{};r[n]=Object.freeze({...d,...i})}},te=g.createDomain("component"),re=v.createFactory(({client:t,component:e,name:r})=>{const n=t.frameworks.getByName(e.frameworkName);return{name:r,component:e,frameworkStore:n}});function ne(t){return v.invoke(re,t)}const se=v.createFactory(({client:t})=>{const e=te.store({}),r=g.createApi(e,{register(l,c){return{...l,[c.name]:c}}});function n(l,c){e.getState()[l]&&x.logger("warn",`Component '${l}' already registered. Registering again will override the previous registration.`);const p=ne({client:t,name:l,component:c});r.register(p)}const i=e.map(l=>Object.values(l));function d(l){return e.map(c=>c[l],{skipVoid:!1})}return{register:n,getByName:d,listStore:i}});function ie(t){return v.invoke(se,t)}const z=(t,e,r)=>{r.register(t,e)},oe=g.createDomain("framework"),ae=v.createFactory(({client:t})=>{const e=oe.store({}),r=g.createApi(e,{register(l,c){return{...l,[c.name]:c.framework}}});function n(l,c){e.getState()[l]&&x.logger("warn",`Framework '${l}' already registered. Registering again will override the previous registration.`),r.register({name:l,framework:c})}const i=e.map(l=>Object.values(l));function d(l){return e.map(c=>c[l],{skipVoid:!1})}return{register:n,getByName:d,listStore:i}});function ce(t){return v.invoke(ae,t)}const ue=(t,e)=>{e.register(t.name,t)},le=6e3,de=b.createStorageKey("last_ping","global"),pe=t=>`${t}/api/v1/ping`,ge=async t=>{try{const e=Date.now(),r=b.localStore.get(de);let n=0;if(r.isSet()&&(n=r.json()??0),n&&e-n<le)return!0;const i=pe(t.apiUrl),d={projectId:t.projectId,path:window.location.pathname},l=JSON.stringify(d),c={"Content-Type":"application/json"},p=document.getElementById("picked_script")?.dataset.verceltoken;p&&(c["x-vercel-protection-bypass"]=p);const F=(await fetch(i,{method:"POST",headers:c,body:l})).ok;return F&&r.set(e),F}catch(e){return x.logger("error",e),!1}};function L(t){const e=typeof window<"u",r={client:t,responses:t.responses.listStore.getState(),fields:t.fields.listStore.getState(),location:e?window.location:void 0,document:e?window.document:void 0,sessionStorage:e?window.sessionStorage:void 0,localStorage:e?window.localStorage:void 0};return Object.freeze(r)}const fe=g.createDomain("predicate"),me=v.createFactory(({client:t})=>{const e=fe.store({}),r=g.createApi(e,{register(c,m){return{...c,[m.name]:{name:m.name,predicate:m.predicate}}}});function n(c,m){e.getState()[c]&&x.logger("warn",`Predicate '${c}' already registered. Registering again will override the previous registration.`),r.register(Object.freeze({name:c,predicate:m}))}const i=e.map(c=>Object.values(c));function d(c){return e.map(m=>m[c]?.predicate,{skipVoid:!1})}function l(c){const m=g.createStore(()=>{},{skipVoid:!1}),p=g.createEffect(async()=>{const h=d(c).getState();if(!h)return;const F=L(t);return(...y)=>h({...F,args:y})});return g.sample({source:{responses:t.responses.listStore,fields:t.fields.listStore},target:p}),g.sample({clock:p.doneData,filter:h=>h!==void 0,target:m}),p(),m}return{register:n,getByName:d,listStore:i,getEvokablePredicate:l}});function ye(t){return v.invoke(me,t)}const he=(t,e,r)=>{r.register(t,e)},M=g.createDomain("feature"),ve=v.createFactory(({client:t})=>{const e=M.store({}),r=M.store([]),n=g.createApi(e,{register(u,s){return{...u,[s.id]:s.feature}}});function i(u,s){e.getState()[u]&&x.logger("warn",`Feature '${u}' already registered. Registering again will override the previous registration.`);const a={id:u,feature:{...s,id:u}};n.register(Object.freeze({id:u,feature:a}))}const d=g.createEffect(async({id:u,key:s,storage:o="local"})=>{const a=b.createStorageKey(`feature:${u}:${s}`,"global"),k=(o==="session"?b.sessionStore:b.localStore).get(a).boolean();return k===null?null:{id:u,key:s,bucket:k,storage:o}}),l=g.createEffect(u=>{if(!u)return null;const s=b.createStorageKey(`feature:${u.id}:${u.key}`,"global");(u.storage==="session"?b.sessionStore:b.localStore).set(s,u.bucket)}),c=new Map,m=g.attach({source:{allFeaturesStore:e,resolvedFeaturesStore:r},effect:async({allFeaturesStore:u,resolvedFeaturesStore:s},{id:o,decide:a,key:f})=>{const k=s.find(R=>R.id===o&&R.key===f);if(k)return k;const I=u[o];if(!I)throw new Error(`Feature with id '${o}' not found`);const j=c.get(`${o}:${f}`);if(j!==void 0){const R=await j;return{id:I.id,bucket:R,key:f,storage:I.feature.storage}}const A=a();c.set(`${o}:${f}`,A);const K=await A;return{id:I.id,bucket:K,key:f,storage:I.feature.storage}}});g.sample({clock:n.register,fn:u=>{const{id:s,feature:o}=u;return{id:s,key:o.feature.key,storage:o.feature.storage}},target:d}),g.sample({source:e,clock:m.doneData,fn:(u,s)=>{const{id:o,bucket:a,storage:f}=s,k=u[o]?.feature.key;return k?{key:k,id:o,bucket:a,storage:f}:null},target:l});const p=g.combine({allFeaturesStore:e,resolvedFeaturesStore:r}).map(({allFeaturesStore:u,resolvedFeaturesStore:s})=>Object.values(u).map(o=>{const a=s.find(f=>f.id===o.id&&f.key===o.feature.key);return a?{id:o.id,name:o.feature.name,key:o.feature.key,getBucket:()=>({id:o.id,bucket:a.bucket}),isResolved:!0}:{id:o.id,name:o.feature.name,key:o.feature.key,getBucket:async()=>await m(o.feature),isResolved:!1}}));g.sample({clock:m.doneData,source:{resolvedFeatures:r},filter:({resolvedFeatures:u},{id:s,key:o})=>!u.some(f=>f.id===s&&f.key===o),fn:(u,s)=>s,target:t.eventBus.prepend(u=>({type:"feature_decide",feature:u}))}),g.sample({clock:[d.doneData,m.doneData],source:r,fn:(u,s)=>!s||u.some(a=>a.id===s.id&&a.key===s.key)?u:[...u,s],target:r});function h(u){return p.map(s=>s.find(o=>o.id===u))}function F(u){return e.map(s=>s[u],{skipVoid:!1})}function y(u){const s=g.createStore(async()=>{},{skipVoid:!1}),o=g.createEffect(async()=>{const a=h(u).getState();if(a)return async()=>(await a.getBucket()).bucket});return g.sample({source:r,filter:a=>a.some(f=>f.id===u),target:o}),g.sample({clock:o.doneData,filter:a=>a!==void 0,target:s}),o(),s}return{register:i,getById:h,getByName:F,listStore:p,getEvokableFeature:y}});function Se(t){return v.invoke(ve,t)}const ke=(t,e,r)=>{r.register(t,e)},E=g.createDomain("history");function O(t,e){return{id:W.generateId(`history-entry-${Date.now()}-${Math.random()}}`),node:e,at:Date.now(),experienceId:t}}const be=v.createFactory(()=>{const t=E.store({entries:[]}),e=E.event(),r=E.event(),n=E.event(),i=E.event();t.on(e,(l,c)=>({entries:[...l.entries,O(c.experienceId,c.node)]})),t.on(r,(l,c)=>({entries:[...l.entries.slice(0,-1),O(c.experienceId,c.node)]})),t.on(i,(l,c)=>c);function d(l,c){const m={lastStepIndex:-1,secondLastStepIndex:-1};for(let p=l.length-1;p>=0;p--){const h=l[p],F=h?.node;if(!(!F||!w.isStepNode(F))&&!(c&&h?.experienceId!==c))if(m.lastStepIndex===-1)m.lastStepIndex=p;else{m.secondLastStepIndex=p;break}}return m}return t.on(n,(l,c)=>{const{secondLastStepIndex:m}=d(l.entries,c.experienceId),p=m!==-1?l.entries.slice(0,m+1):l.entries;return{...l,entries:p}}),{push:e,replace:r,back:n,restore:i,entriesStore:t.map(l=>l.entries)}});function we(){return v.invoke(be)}let Fe=0;const Ie=t=>{const e=g.createStore([]);return g.sample({clock:t,source:e,fn:(r,n)=>[...r,{id:Fe++,at:new Date,payload:n}],target:e}),e},D=g.createDomain("field");function Ae(t){return Array.isArray(t)&&t.every(e=>typeof e=="object"&&e!==null&&"id"in e&&"label"in e&&"value"in e)}function B(t,e){const r=e??{status:"idle",options:Array.isArray(t.options)?t.options:null};return{...t,...r,options:r.options??(Array.isArray(t.options)?t.options:null)}}const xe=v.createFactory(({client:t})=>{const e=D.store({}),r=g.createApi(e,{register(s,o){return{...s,[o.field.id]:o.field}}});function n(s){r.register({field:s})}function i(s,o){const a=e.getState()[s];if(!a)return;const f=Object.assign({},a,{...o});r.register({field:{...f}})}const d=D.store({}),l=g.combine(e,d,(s,o)=>Object.values(s).map(a=>B(a,o[a.id])));function c(s){return g.combine(e,d,(o,a)=>{const f=o[s];return f?B(f,a[s]):null})}function m(s){return g.combine(e,d,(o,a)=>{const f=Object.values(o).find(k=>k.name===s);return f?B(f,a[f.id]):null})}const p=D.effect(async({fieldId:s,fieldOptions:o,context:a})=>{if(t&&!Array.isArray(o)&&o!==null){const f=await w.evaluateRuleLogic(t,o,a);return Ae(f)?{fieldId:s,options:f}:{fieldId:s,options:null}}return{fieldId:s,options:Array.isArray(o)?o:null}});d.on(p,(s,{fieldId:o})=>{const a=s[o];return{...s,[o]:{status:"loading",options:a?.status==="resolved"?a.options:null}}}),d.on(p.doneData,(s,{fieldId:o,options:a})=>({...s,[o]:{status:"resolved",options:a}})),d.on(p.fail,(s,{params:{fieldId:o}})=>({...s,[o]:{status:"error",options:null,error:"Failed to resolve field options"}}));const h=g.createEvent();d.on(h,(s,o)=>({...s,[o]:{status:"waiting",options:null}}));const F=g.createEvent();t&&g.sample({clock:F,source:{states:d,fields:e},filter:({states:s},{fieldId:o,force:a})=>{if(a)return!0;const f=s[o];return!f||f.status==="idle"},fn:({fields:s},{fieldId:o,context:a})=>{const f=s[o]??null;return{fieldId:o,fieldOptions:f?.options??null,context:a}},target:p});function y(s,o){F({fieldId:s,force:o?.force,context:o?.context})}function u(s,o){for(const a of s)F({fieldId:a,force:o?.force,context:o?.context})}return{register:n,update:i,getById:c,listStore:l,getByName:m,resolve:y,resolveAll:u,setWaiting:h}});function Ee(t){return v.invoke(xe,t??{})}const je=(t,e)=>{e.register(t)},Re=g.createDomain("action"),Pe=v.createFactory(({client:t})=>{const e=Re.store({}),r=g.createApi(e,{register(c,m){return{...c,[m.name]:{name:m.name,action:m.action}}}});function n(c,m){r.register({name:c,action:m})}const i=e.map(c=>Object.values(c));function d(c){return e.map(m=>m[c],{skipVoid:!1})}function l(c){return e.map(m=>{const p=m[c];return p?p.action:void 0},{skipVoid:!1})}return{register:n,getByName:d,listStore:i,getEvokableAction:l}});function De(t){return v.invoke(Pe,t)}const Be=(t,e,r)=>{r.register(t,e)};function C(t){return typeof t>"u"||t===null||t===""||Array.isArray(t)&&!t.length}function Ce(t){return typeof t=="string"||typeof t=="number"||typeof t=="boolean"||t===null}function U(t){try{return JSON.stringify(t),!0}catch{return!1}}const $e=g.createDomain("response"),ze=v.createFactory(({client:t})=>{const e=$e.store({}),r=g.createEvent(),n=g.createEvent(),i=g.createApi(e,{register(y,u){return{...y,[u.fieldId]:u.response}},registerBatch(y,u){return{...y,...u}},clear(y,u){const{[u]:s,...o}=y;return o},clearAll(){return{}}});function d(y,u){if(typeof y=="string"){if(u===void 0)throw new Error("Response is required when registering a single field");i.register({fieldId:y,response:u})}else i.registerBatch(y)}async function l(y){const u=[];return await Promise.allSettled(Object.entries(y).map(async([s,o])=>{let a=o;const f=t.fields.getById(s).getState();if(!f){u.push({fieldId:s,userMessage:`Field '${s}' not found`,systemMessage:`No field with ID '${s}' exists. Available field IDs are: ${Object.keys(t.fields.listStore.getState()).join(",")}.`,value:a});return}if(f.multiple&&(typeof a=="string"||typeof a=="number"||typeof a=="boolean")&&(a=[a]),f.validation&&!H.isEmpty(f.validation)&&!C(a)){const k={...e.getState(),...y},I=await w.evaluateRuleLogic(t,f.validation,{$input:a,responses:k});if(typeof I=="string"){u.push({fieldId:s,userMessage:I,systemMessage:`Field validation resulted in an error: ${I}.`,value:a});return}if(I===!1){u.push({fieldId:s,userMessage:"This field is invalid",systemMessage:"Field validation resulted in an unspecified error.",value:a});return}}if(f.required&&C(a)){u.push({fieldId:s,userMessage:"This field is required",systemMessage:"Field is required.",value:a});return}if(!f.multiple&&Array.isArray(a)&&a.length>1){u.push({fieldId:s,userMessage:"This field expects a single response",systemMessage:"Field expects a single response.",value:a});return}if(f.type==="object"&&!C(a))if(f.multiple){if(!Array.isArray(a)){u.push({fieldId:s,userMessage:"This field expects multiple values",systemMessage:"Field expects an array of objects.",value:a});return}for(const k of a){if(typeof k!="object"||k===null){u.push({fieldId:s,userMessage:"This field expects object values",systemMessage:"Field expects an array of objects, but received non-object value.",value:a});return}if(!U(k)){u.push({fieldId:s,userMessage:"This field contains non-serializable data",systemMessage:"Field value contains non-JSON-serializable data (functions, circular references, etc.).",value:a});return}}}else{if(Array.isArray(a)){u.push({fieldId:s,userMessage:"This field expects a single value",systemMessage:"Field expects a single object, not an array.",value:a});return}if(typeof a!="object"||a===null){u.push({fieldId:s,userMessage:"This field expects an object value",systemMessage:"Field expects an object value.",value:a});return}if(!U(a)){u.push({fieldId:s,userMessage:"This field contains non-serializable data",systemMessage:"Field value contains non-JSON-serializable data (functions, circular references, etc.).",value:a});return}}if(Array.isArray(f.options)){const k=Array.isArray(a)?a:[a];if(f.type==="object"){const I=f.options.map(A=>JSON.stringify(A.value));k.every(A=>I.includes(JSON.stringify(A)))||u.push({fieldId:s,userMessage:"This field expects a valid option",systemMessage:"Field expects a valid option from the defined choices.",value:a})}else{const I=f.options.map(A=>A.value);k.every(A=>!Ce(A)||A===null?!1:I.includes(A))||u.push({fieldId:s,userMessage:"This field expects a valid option",systemMessage:`Field expects a valid option. Valid options are: ${I.join(", ")}`,value:a})}}})),{responsesToCommit:y,validationErrors:u}}async function c(y){const{responsesToCommit:u,validationErrors:s}=await l(y);return s.length?{errors:s}:(i.registerBatch(u),{errors:[]})}const m=e.map(y=>y),p=e.map(y=>Object.keys(y).map(s=>({fieldId:s,value:y[s]})));function h(y){const u=t.fields.getById(y),s=e.map(o=>o[y]||null);return g.combine({f:u,r:s},({f:o,r:a})=>a||(o?.defaultValue?o.defaultValue:null))}function F(y){const u=t.fields.getByName(y);return g.combine({f:u,s:e},({f:s,s:o})=>{const a=s&&o[s.id]||null;return a||(s?.defaultValue?s.defaultValue:null)})}return g.sample({clock:r,target:i.clearAll}),g.sample({clock:n,target:i.clear}),{register:d,clearAll:r,clear:n,commit:c,getResponsesToCommit:l,listStore:p,getAllStore:m,getByFieldId:h,getByFieldName:F}});function Me(t){return v.invoke(ze,t)}const Oe=()=>"0.0.1-dev.1772064704206";function Ue(){if(S.supportsDocument()){const t=[document.currentScript,document.getElementById("picked_script"),document.getElementById("picked"),document.getElementById("cvly"),document.getElementById("cvly-x")];for(const e of t)if(e?.dataset.api)return e.dataset.api}return"https://api.picked.app"}function Ve(){if(!S.supportsWindow())return{};const t=new URLSearchParams(window.location.search),e={},r=new Set;for(const[i]of t.entries())i.startsWith("picked-")&&r.add(i);for(const i of r){const d=i.replace("picked-","");e[d]=t.getAll(i)}const n=b.createStorageKey("s");if(r.size>0)b.sessionStore.set(n,e);else{const i=b.sessionStore.get(n);if(i)return i.json()||{}}return e}function Te(){if(S.supportsCryptoRandomUUID())return crypto.randomUUID();const t=Date.now().toString(36),e=Math.random().toString(36).substring(2,15),r=Math.random().toString(36).substring(2,15),n=Math.random().toString(36).substring(2,15);return`${t}-${e}-${r}-${n}`}const Le=b.createStorageKey("session","global"),Ne=()=>{const t=b.localStore.get(Le);let e;t.isSet()&&(e=t.json());const r=i=>t.set({id:i.id,isUser:i.isUser,identifiers:i.identifiers}),n={id:e?.id??Te(),isUser:e?.isUser??void 0,identifiers:e?.identifiers??void 0,setIsUser(i){this.isUser=i,r(this)},setIdentifier(i,d){this.identifiers={...this.identifiers,[i]:d},r(this)},removeIdentifier(i){this.identifiers&&(this.identifiers=Object.fromEntries(Object.entries(this.identifiers).filter(([d])=>d!==i)),this.identifiers=Object.keys(this.identifiers).length?this.identifiers:void 0,r(this))}};return r(n),n},_e=()=>S.supportsLocalStorage()?Ne():null;function N(){if(S.supportsWindow())return globalThis.window.pickedConfig}function qe(){if(!S.supportsWindow())return;const t=N(),e=t?.organizationId,r=t?.projectId;return e&&r?{organizationId:e,projectId:r}:void 0}function Ke(){if(!S.supportsDocument())return;const t=document.getElementById("picked_script")||document.querySelector("script#picked")||document.getElementById("cvly");if(!t)return;const e=t.dataset.organizationid||t.getAttribute("organization-id"),r=t.dataset.projectid||t.getAttribute("project-id");return e&&r?{organizationId:e,projectId:r}:void 0}function We(t){const{organizationId:e,projectId:r}=t;if(e&&r)return{organizationId:e,projectId:r};const n=qe();if(n)return n;const i=Ke();if(i)return i;throw new Error(`organizationId and projectId are required. You can provide them via one of:
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const f=require("effector"),v=require("@withease/factories"),w=require("../experience-instance-5rr_D--s.cjs"),x=require("../logger-BsmHUUw1.cjs"),b=require("../storage-Be5xWNPC.cjs"),W=require("../id-BKIWbSTy.cjs"),H=require("../object-BbFTsGh3.cjs"),S=require("../supports-YvpQZxbh.cjs"),V=f.createDomain("experience"),J=v.createFactory(({client:t,experience:e})=>{const r=V.store(e),n=f.createApi(r,{merge(p,h){return{...p,...h.experience}}}),i=r.map(p=>({name:p.name,decisionLogic:p.condition??p.decide,targetSelectors:p.targets,initializeOpenLogic:e.initializeOpen})),d=t.components.listStore.map(p=>p.find(h=>h.name===`experience:${e.id}`)||p.find(h=>h.name==="experience"),{skipVoid:!1}),l=r.map(p=>({steps:p.steps,nodes:p.nodes,edges:p.edges,conditionals:p.conditionals})),c=r.map(p=>p.fields),m=e.actions??[];return{id:e.id,configStore:i,treeStore:l,fieldsStore:c,componentStore:d,actions:m,merge:n.merge}});function G(t){return v.invoke(J,t)}const Y=v.createFactory(({client:t})=>{const e=V.store({}),r=f.createApi(e,{register(l,c){return{...l,[c.id]:c}}});function n(l){const c=e.getState()[l.id];if(c){c.merge({experience:l,strategy:"override"});return}const m=G({client:t,experience:l});r.register(m)}const i=e.map(l=>Object.values(l));function d(l){return e.map(c=>c[l],{skipVoid:!1})}return{register:n,getById:d,listStore:i}});function Q(t){return v.invoke(Y,t)}const X=(t,e)=>{e.register(t)},T=(t,e)=>{const{targetSelectors:r}=e.configStore.getState(),n=w.getTargetElements(r,e.id);n.forEach(({elements:d})=>d.forEach(l=>w.tagTargetElement(l,e.id))),w.createAppHosts(n,e.id).forEach(d=>{t.experienceInstances.spawn(e,d)})},$=async t=>{await Promise.all(t.experiences.listStore.getState().map(async e=>{await Z(t,e)&&T(t,e)}))},Z=async(t,e)=>{const{decisionLogic:r,targetSelectors:n}=e.configStore.getState();return w.getTargetElements(n,e.id).length<1||n.length===0?!1:r&&w.isRulesLogic(r)?await w.evaluateRuleLogic(t,r)===!0:!0},ee=(t,e,r)=>{const n=e.name,i=e.setup(t);if(i){const d=r[n]??{};r[n]=Object.freeze({...d,...i})}},te=f.createDomain("component"),re=v.createFactory(({client:t,component:e,name:r})=>{const n=t.frameworks.getByName(e.frameworkName);return{name:r,component:e,frameworkStore:n}});function ne(t){return v.invoke(re,t)}const se=v.createFactory(({client:t})=>{const e=te.store({}),r=f.createApi(e,{register(l,c){return{...l,[c.name]:c}}});function n(l,c){e.getState()[l]&&x.logger("warn",`Component '${l}' already registered. Registering again will override the previous registration.`);const p=ne({client:t,name:l,component:c});r.register(p)}const i=e.map(l=>Object.values(l));function d(l){return e.map(c=>c[l],{skipVoid:!1})}return{register:n,getByName:d,listStore:i}});function ie(t){return v.invoke(se,t)}const z=(t,e,r)=>{r.register(t,e)},oe=f.createDomain("framework"),ae=v.createFactory(({client:t})=>{const e=oe.store({}),r=f.createApi(e,{register(l,c){return{...l,[c.name]:c.framework}}});function n(l,c){e.getState()[l]&&x.logger("warn",`Framework '${l}' already registered. Registering again will override the previous registration.`),r.register({name:l,framework:c})}const i=e.map(l=>Object.values(l));function d(l){return e.map(c=>c[l],{skipVoid:!1})}return{register:n,getByName:d,listStore:i}});function ce(t){return v.invoke(ae,t)}const ue=(t,e)=>{e.register(t.name,t)},le=6e3,de=b.createStorageKey("last_ping","global"),pe=t=>`${t}/api/v1/ping`,ge=async t=>{try{const e=Date.now(),r=b.localStore.get(de);let n=0;if(r.isSet()&&(n=r.json()??0),n&&e-n<le)return!0;const i=pe(t.apiUrl),d={projectId:t.projectId,path:window.location.pathname},l=JSON.stringify(d),c={"Content-Type":"application/json"},p=document.getElementById("picked_script")?.dataset.verceltoken;p&&(c["x-vercel-protection-bypass"]=p);const F=(await fetch(i,{method:"POST",headers:c,body:l})).ok;return F&&r.set(e),F}catch(e){return x.logger("error",e),!1}};function L(t){const e=typeof window<"u",r={client:t,responses:t.responses.listStore.getState(),fields:t.fields.listStore.getState(),location:e?window.location:void 0,document:e?window.document:void 0,sessionStorage:e?window.sessionStorage:void 0,localStorage:e?window.localStorage:void 0};return Object.freeze(r)}const fe=f.createDomain("predicate"),me=v.createFactory(({client:t})=>{const e=fe.store({}),r=f.createApi(e,{register(c,m){return{...c,[m.name]:{name:m.name,predicate:m.predicate}}}});function n(c,m){e.getState()[c]&&x.logger("warn",`Predicate '${c}' already registered. Registering again will override the previous registration.`),r.register(Object.freeze({name:c,predicate:m}))}const i=e.map(c=>Object.values(c));function d(c){return e.map(m=>m[c]?.predicate,{skipVoid:!1})}function l(c){const m=f.createStore(()=>{},{skipVoid:!1}),p=f.createEffect(async()=>{const h=d(c).getState();if(!h)return;const F=L(t);return(...y)=>h({...F,args:y})});return f.sample({source:{responses:t.responses.listStore,fields:t.fields.listStore},target:p}),f.sample({clock:p.doneData,filter:h=>h!==void 0,target:m}),p(),m}return{register:n,getByName:d,listStore:i,getEvokablePredicate:l}});function ye(t){return v.invoke(me,t)}const he=(t,e,r)=>{r.register(t,e)},M=f.createDomain("feature"),ve=v.createFactory(({client:t})=>{const e=M.store({}),r=M.store([]),n=f.createApi(e,{register(u,s){return{...u,[s.id]:s.feature}}});function i(u,s){e.getState()[u]&&x.logger("warn",`Feature '${u}' already registered. Registering again will override the previous registration.`);const a={id:u,feature:{...s,id:u}};n.register(Object.freeze({id:u,feature:a}))}const d=f.createEffect(async({id:u,key:s,storage:o="local"})=>{const a=b.createStorageKey(`feature:${u}:${s}`,"global"),k=(o==="session"?b.sessionStore:b.localStore).get(a).boolean();return k===null?null:{id:u,key:s,bucket:k,storage:o}}),l=f.createEffect(u=>{if(!u)return null;const s=b.createStorageKey(`feature:${u.id}:${u.key}`,"global");(u.storage==="session"?b.sessionStore:b.localStore).set(s,u.bucket)}),c=new Map,m=f.attach({source:{allFeaturesStore:e,resolvedFeaturesStore:r},effect:async({allFeaturesStore:u,resolvedFeaturesStore:s},{id:o,decide:a,key:g})=>{const k=s.find(R=>R.id===o&&R.key===g);if(k)return k;const I=u[o];if(!I)throw new Error(`Feature with id '${o}' not found`);const j=c.get(`${o}:${g}`);if(j!==void 0){const R=await j;return{id:I.id,bucket:R,key:g,storage:I.feature.storage}}const A=a();c.set(`${o}:${g}`,A);const K=await A;return{id:I.id,bucket:K,key:g,storage:I.feature.storage}}});f.sample({clock:n.register,fn:u=>{const{id:s,feature:o}=u;return{id:s,key:o.feature.key,storage:o.feature.storage}},target:d}),f.sample({source:e,clock:m.doneData,fn:(u,s)=>{const{id:o,bucket:a,storage:g}=s,k=u[o]?.feature.key;return k?{key:k,id:o,bucket:a,storage:g}:null},target:l});const p=f.combine({allFeaturesStore:e,resolvedFeaturesStore:r}).map(({allFeaturesStore:u,resolvedFeaturesStore:s})=>Object.values(u).map(o=>{const a=s.find(g=>g.id===o.id&&g.key===o.feature.key);return a?{id:o.id,name:o.feature.name,key:o.feature.key,getBucket:()=>({id:o.id,bucket:a.bucket}),isResolved:!0}:{id:o.id,name:o.feature.name,key:o.feature.key,getBucket:async()=>await m(o.feature),isResolved:!1}}));f.sample({clock:m.doneData,source:{resolvedFeatures:r},filter:({resolvedFeatures:u},{id:s,key:o})=>!u.some(g=>g.id===s&&g.key===o),fn:(u,s)=>s,target:t.eventBus.prepend(u=>({type:"feature_decide",feature:u}))}),f.sample({clock:[d.doneData,m.doneData],source:r,fn:(u,s)=>!s||u.some(a=>a.id===s.id&&a.key===s.key)?u:[...u,s],target:r});function h(u){return p.map(s=>s.find(o=>o.id===u))}function F(u){return e.map(s=>s[u],{skipVoid:!1})}function y(u){const s=f.createStore(async()=>{},{skipVoid:!1}),o=f.createEffect(async()=>{const a=h(u).getState();if(a)return async()=>(await a.getBucket()).bucket});return f.sample({source:r,filter:a=>a.some(g=>g.id===u),target:o}),f.sample({clock:o.doneData,filter:a=>a!==void 0,target:s}),o(),s}return{register:i,getById:h,getByName:F,listStore:p,getEvokableFeature:y}});function Se(t){return v.invoke(ve,t)}const ke=(t,e,r)=>{r.register(t,e)},E=f.createDomain("history");function O(t,e){return{id:W.generateId(`history-entry-${Date.now()}-${Math.random()}}`),node:e,at:Date.now(),experienceId:t}}const be=v.createFactory(()=>{const t=E.store({entries:[]}),e=E.event(),r=E.event(),n=E.event(),i=E.event();t.on(e,(l,c)=>({entries:[...l.entries,O(c.experienceId,c.node)]})),t.on(r,(l,c)=>({entries:[...l.entries.slice(0,-1),O(c.experienceId,c.node)]})),t.on(i,(l,c)=>c);function d(l,c){const m={lastStepIndex:-1,secondLastStepIndex:-1};for(let p=l.length-1;p>=0;p--){const h=l[p],F=h?.node;if(!(!F||!w.isStepNode(F))&&!(c&&h?.experienceId!==c))if(m.lastStepIndex===-1)m.lastStepIndex=p;else{m.secondLastStepIndex=p;break}}return m}return t.on(n,(l,c)=>{const{secondLastStepIndex:m}=d(l.entries,c.experienceId),p=m!==-1?l.entries.slice(0,m+1):l.entries;return{...l,entries:p}}),{push:e,replace:r,back:n,restore:i,entriesStore:t.map(l=>l.entries)}});function we(){return v.invoke(be)}let Fe=0;const Ie=t=>{const e=f.createStore([]);return f.sample({clock:t,source:e,fn:(r,n)=>[...r,{id:Fe++,at:new Date,payload:n}],target:e}),e},D=f.createDomain("field");function Ae(t){return Array.isArray(t)&&t.every(e=>typeof e=="object"&&e!==null&&"id"in e&&"label"in e&&"value"in e)}function B(t,e){const r=e??{status:"idle",options:Array.isArray(t.options)?t.options:null};return{...t,...r,options:r.options??(Array.isArray(t.options)?t.options:null)}}const xe=v.createFactory(({client:t})=>{const e=D.store({}),r=f.createApi(e,{register(s,o){return{...s,[o.field.id]:o.field}}});function n(s){r.register({field:s})}function i(s,o){const a=e.getState()[s];if(!a)return;const g=Object.assign({},a,{...o});r.register({field:{...g}})}const d=D.store({}),l=f.combine(e,d,(s,o)=>Object.values(s).map(a=>B(a,o[a.id])));function c(s){return f.combine(e,d,(o,a)=>{const g=o[s];return g?B(g,a[s]):null})}function m(s){return f.combine(e,d,(o,a)=>{const g=Object.values(o).find(k=>k.name===s);return g?B(g,a[g.id]):null})}const p=D.effect(async({fieldId:s,fieldOptions:o,context:a})=>{if(t&&!Array.isArray(o)&&o!==null){const g=await w.evaluateRuleLogic(t,o,a);return Ae(g)?{fieldId:s,options:g}:{fieldId:s,options:null}}return{fieldId:s,options:Array.isArray(o)?o:null}});d.on(p,(s,{fieldId:o})=>{const a=s[o];return{...s,[o]:{status:"loading",options:a?.status==="resolved"?a.options:null}}}),d.on(p.doneData,(s,{fieldId:o,options:a})=>({...s,[o]:{status:"resolved",options:a}})),d.on(p.fail,(s,{params:{fieldId:o}})=>({...s,[o]:{status:"error",options:null,error:"Failed to resolve field options"}}));const h=f.createEvent();d.on(h,(s,o)=>({...s,[o]:{status:"waiting",options:null}}));const F=f.createEvent();t&&f.sample({clock:F,source:{states:d,fields:e},filter:({states:s},{fieldId:o,force:a})=>{if(a)return!0;const g=s[o];return!g||g.status==="idle"},fn:({fields:s},{fieldId:o,context:a})=>{const g=s[o]??null;return{fieldId:o,fieldOptions:g?.options??null,context:a}},target:p});function y(s,o){F({fieldId:s,force:o?.force,context:o?.context})}function u(s,o){for(const a of s)F({fieldId:a,force:o?.force,context:o?.context})}return{register:n,update:i,getById:c,listStore:l,getByName:m,resolve:y,resolveAll:u,setWaiting:h}});function Ee(t){return v.invoke(xe,t??{})}const je=(t,e)=>{e.register(t)},Re=f.createDomain("action"),Pe=v.createFactory(({client:t})=>{const e=Re.store({}),r=f.createApi(e,{register(c,m){return{...c,[m.name]:{name:m.name,action:m.action}}}});function n(c,m){r.register({name:c,action:m})}const i=e.map(c=>Object.values(c));function d(c){return e.map(m=>m[c],{skipVoid:!1})}function l(c){return e.map(m=>{const p=m[c];return p?p.action:void 0},{skipVoid:!1})}return{register:n,getByName:d,listStore:i,getEvokableAction:l}});function De(t){return v.invoke(Pe,t)}const Be=(t,e,r)=>{r.register(t,e)};function C(t){return typeof t>"u"||t===null||t===""||Array.isArray(t)&&!t.length}function Ce(t){return typeof t=="string"||typeof t=="number"||typeof t=="boolean"||t===null}function U(t){try{return JSON.stringify(t),!0}catch{return!1}}const $e=f.createDomain("response"),ze=v.createFactory(({client:t})=>{const e=$e.store({}),r=f.createEvent(),n=f.createEvent(),i=f.createApi(e,{register(y,u){return{...y,[u.fieldId]:u.response}},registerBatch(y,u){return{...y,...u}},clear(y,u){const{[u]:s,...o}=y;return o},clearAll(){return{}}});function d(y,u){if(typeof y=="string"){if(u===void 0)throw new Error("Response is required when registering a single field");i.register({fieldId:y,response:u})}else i.registerBatch(y)}async function l(y){const u=[];return await Promise.allSettled(Object.entries(y).map(async([s,o])=>{let a=o;const g=t.fields.getById(s).getState();if(!g){u.push({fieldId:s,userMessage:`Field '${s}' not found`,systemMessage:`No field with ID '${s}' exists. Available field IDs are: ${Object.keys(t.fields.listStore.getState()).join(",")}.`,value:a});return}if(g.multiple&&(typeof a=="string"||typeof a=="number"||typeof a=="boolean")&&(a=[a]),g.validation&&!H.isEmpty(g.validation)&&!C(a)){const k={...e.getState(),...y},I=await w.evaluateRuleLogic(t,g.validation,{$input:a,responses:k});if(typeof I=="string"){u.push({fieldId:s,userMessage:I,systemMessage:`Field validation resulted in an error: ${I}.`,value:a});return}if(I===!1){u.push({fieldId:s,userMessage:"This field is invalid",systemMessage:"Field validation resulted in an unspecified error.",value:a});return}}if(g.required&&C(a)){u.push({fieldId:s,userMessage:"This field is required",systemMessage:"Field is required.",value:a});return}if(!g.multiple&&Array.isArray(a)&&a.length>1){u.push({fieldId:s,userMessage:"This field expects a single response",systemMessage:"Field expects a single response.",value:a});return}if(g.type==="object"&&!C(a))if(g.multiple){if(!Array.isArray(a)){u.push({fieldId:s,userMessage:"This field expects multiple values",systemMessage:"Field expects an array of objects.",value:a});return}for(const k of a){if(typeof k!="object"||k===null){u.push({fieldId:s,userMessage:"This field expects object values",systemMessage:"Field expects an array of objects, but received non-object value.",value:a});return}if(!U(k)){u.push({fieldId:s,userMessage:"This field contains non-serializable data",systemMessage:"Field value contains non-JSON-serializable data (functions, circular references, etc.).",value:a});return}}}else{if(Array.isArray(a)){u.push({fieldId:s,userMessage:"This field expects a single value",systemMessage:"Field expects a single object, not an array.",value:a});return}if(typeof a!="object"||a===null){u.push({fieldId:s,userMessage:"This field expects an object value",systemMessage:"Field expects an object value.",value:a});return}if(!U(a)){u.push({fieldId:s,userMessage:"This field contains non-serializable data",systemMessage:"Field value contains non-JSON-serializable data (functions, circular references, etc.).",value:a});return}}if(Array.isArray(g.options)&&g.options.length>0){const k=Array.isArray(a)?a:[a];if(g.type==="object"){const I=g.options.map(A=>JSON.stringify(A.value));k.every(A=>I.includes(JSON.stringify(A)))||u.push({fieldId:s,userMessage:"This field expects a valid option",systemMessage:"Field expects a valid option from the defined choices.",value:a})}else{const I=g.options.map(A=>A.value);k.every(A=>!Ce(A)||A===null?!1:I.includes(A))||u.push({fieldId:s,userMessage:"This field expects a valid option",systemMessage:`Field expects a valid option. Valid options are: ${I.join(", ")}`,value:a})}}})),{responsesToCommit:y,validationErrors:u}}async function c(y){const{responsesToCommit:u,validationErrors:s}=await l(y);return s.length?{errors:s}:(i.registerBatch(u),{errors:[]})}const m=e.map(y=>y),p=e.map(y=>Object.keys(y).map(s=>({fieldId:s,value:y[s]})));function h(y){const u=t.fields.getById(y),s=e.map(o=>o[y]||null);return f.combine({f:u,r:s},({f:o,r:a})=>a||(o?.defaultValue?o.defaultValue:null))}function F(y){const u=t.fields.getByName(y);return f.combine({f:u,s:e},({f:s,s:o})=>{const a=s&&o[s.id]||null;return a||(s?.defaultValue?s.defaultValue:null)})}return f.sample({clock:r,target:i.clearAll}),f.sample({clock:n,target:i.clear}),{register:d,clearAll:r,clear:n,commit:c,getResponsesToCommit:l,listStore:p,getAllStore:m,getByFieldId:h,getByFieldName:F}});function Me(t){return v.invoke(ze,t)}const Oe=()=>"0.0.1-dev.1772073931707";function Ue(){if(S.supportsDocument()){const t=[document.currentScript,document.getElementById("picked_script"),document.getElementById("picked"),document.getElementById("cvly"),document.getElementById("cvly-x")];for(const e of t)if(e?.dataset.api)return e.dataset.api}return"https://api.picked.app"}function Ve(){if(!S.supportsWindow())return{};const t=new URLSearchParams(window.location.search),e={},r=new Set;for(const[i]of t.entries())i.startsWith("picked-")&&r.add(i);for(const i of r){const d=i.replace("picked-","");e[d]=t.getAll(i)}const n=b.createStorageKey("s");if(r.size>0)b.sessionStore.set(n,e);else{const i=b.sessionStore.get(n);if(i)return i.json()||{}}return e}function Te(){if(S.supportsCryptoRandomUUID())return crypto.randomUUID();const t=Date.now().toString(36),e=Math.random().toString(36).substring(2,15),r=Math.random().toString(36).substring(2,15),n=Math.random().toString(36).substring(2,15);return`${t}-${e}-${r}-${n}`}const Le=b.createStorageKey("session","global"),Ne=()=>{const t=b.localStore.get(Le);let e;t.isSet()&&(e=t.json());const r=i=>t.set({id:i.id,isUser:i.isUser,identifiers:i.identifiers}),n={id:e?.id??Te(),isUser:e?.isUser??void 0,identifiers:e?.identifiers??void 0,setIsUser(i){this.isUser=i,r(this)},setIdentifier(i,d){this.identifiers={...this.identifiers,[i]:d},r(this)},removeIdentifier(i){this.identifiers&&(this.identifiers=Object.fromEntries(Object.entries(this.identifiers).filter(([d])=>d!==i)),this.identifiers=Object.keys(this.identifiers).length?this.identifiers:void 0,r(this))}};return r(n),n},_e=()=>S.supportsLocalStorage()?Ne():null;function N(){if(S.supportsWindow())return globalThis.window.pickedConfig}function qe(){if(!S.supportsWindow())return;const t=N(),e=t?.organizationId,r=t?.projectId;return e&&r?{organizationId:e,projectId:r}:void 0}function Ke(){if(!S.supportsDocument())return;const t=document.getElementById("picked_script")||document.querySelector("script#picked")||document.getElementById("cvly");if(!t)return;const e=t.dataset.organizationid||t.getAttribute("organization-id"),r=t.dataset.projectid||t.getAttribute("project-id");return e&&r?{organizationId:e,projectId:r}:void 0}function We(t){const{organizationId:e,projectId:r}=t;if(e&&r)return{organizationId:e,projectId:r};const n=qe();if(n)return n;const i=Ke();if(i)return i;throw new Error(`organizationId and projectId are required. You can provide them via one of:
2
2
  (1) createClient({ organizationId, projectId }) options;
3
3
  (2) window.pickedConfig = { organizationId, projectId };
4
- (3) a <script> tag with id 'picked_script', 'picked', or 'cvly' that includes data-organizationid/data-projectid (or organization-id/project-id) attributes.`)}function P(t){return t==null||t===""||Number.isNaN(t)}const He={default:(t,e)=>P(t)?String(e??""):String(t),append:(t,e)=>e&&!P(t)?`${t} ${e}`:t,prepend:(t,e)=>e&&!P(t)?`${e} ${t}`:t,upper:t=>typeof t=="string"?t.toUpperCase():t,lower:t=>typeof t=="string"?t.toLowerCase():t,capitalize:t=>typeof t=="string"?t.charAt(0).toUpperCase()+t.slice(1):t,list:t=>{if(!t||typeof t!="object")return t;const e=new Intl.ListFormat("en",{style:"long",type:"conjunction"});if(Array.isArray(t))return e.format(t.map(String));if(t instanceof Map){const r=Array.from(t.entries()).map(([n,i])=>`${n}: ${i}`);return e.format(r)}return t instanceof Set?e.format(Array.from(t).map(String)):t}};function Je(t){return typeof t=="object"&&t!==null}function Ge(t,e){let r=e;for(const n of t.split("."))if(Je(r)&&n in r)r=r[n];else return;return typeof r=="function"?r():r}function Ye(t,e){const r=t.split("|").map(d=>d.trim()),n=r.shift()??"";let i=Ge(n,e);for(const d of r){const[l,...c]=d.split(":"),m=l?.trim()??"",p=c.join(":").trim().replaceAll(/(?:^['"]|['"]$)/g,""),h=He[m];h&&(i=h(i,p))}return P(i)?"":typeof i=="object"?JSON.stringify(i):String(i)}function Qe(t,e){let r="",n=0;for(;n<t.length;)if(t[n]==="{"&&t[n+1]==="{"){n+=2;let i="";for(;n<t.length;){if(t[n]==="}"&&t[n+1]==="}"){n+=2;break}i+=t[n++]}r+=Ye(i.trim(),e)}else r+=t[n++];return r}class _{static logger=x.logger;options;isReady=!1;project;plugins={};eventBus=g.createEvent();events;organizationId;projectId;apiUrl;session;precondition;condition;searchParams=Ve();history=we();components=ie({client:this});experienceInstances=w.createExperienceInstanceIndex({client:this});experiences=Q({client:this});frameworks=ce({client:this});predicates=ye({client:this});features=Se({client:this});responses=Me({client:this});fields=Ee({client:this});actions=De({client:this});constructor(e){x.logger("info","Picked client initializing."),this.events=Ie(this.eventBus);const{organizationId:r,projectId:n}=We(e);this.organizationId=r,this.projectId=n,this.options=Object.freeze(e),this.apiUrl=e.apiUrl||Ue(),this.session=_e(),this.setupPlugins(),this.setupFeatures(),this.setupPredicates(),this.setupActions(),this.precondition=e.precondition,this.condition=e.condition,this.eventBus({type:"load",version:Oe()}),x.logger("info","Picked client initialized.")}start=()=>{ge(this),(async()=>{if(!S.supportsDocument())return;let r;typeof this.precondition>"u"?r=!0:typeof this.precondition=="boolean"?r=this.precondition:r=await w.evaluateRuleLogic(this,this.precondition)===!0;let n;r&&(this.condition===void 0?n=!0:typeof this.condition=="boolean"?n=this.condition:n=await w.evaluateRuleLogic(this,this.condition)===!0);const i=r&&n===!0;if(typeof n=="boolean"&&this.session){const d=n;this.session.setIsUser(d),this.eventBus({type:"user_decide",value:d})}if(this.eventBus({type:"initialize"}),document.body&&i&&$(this),await w.domInteractive(),i&&$(this),this.eventBus({type:"ready"}),this.isReady=!0,this.session){const{id:d,isUser:l,identifiers:c}=this.session;this.eventBus({type:"session",id:d,isUser:l,identifiers:c})}})()};registerFramework=e=>{ue(e,this.frameworks)};registerComponent=(e,r)=>{z(e,r,this.components)};registerPlugin=e=>{ee(this,e,this.plugins)};registerFeature=(e,r)=>{ke(e,r,this.features)};registerPredicate=(e,r)=>{he(e,r,this.predicates)};registerField=e=>{je(e,this.fields)};registerAction=(e,r)=>{Be(e,r,this.actions)};registerExperience=e=>{e.component&&z(`experience:${e.id}`,e.component,this.components),X(e,this.experiences)};getStateSnapshot=()=>L(this);launchExperienceById=async e=>{const r=this.experiences.getById(e).getState();if(!r){x.logger("warn",`Experience with id '${e}' not found.`);return}T(this,r)};setupPlugins(){this.options.plugins?.forEach(e=>{if(Array.isArray(e)){e.forEach(n=>{this.registerPlugin(n)});return}const r=typeof e=="function"?e():e;if(Array.isArray(r)){r.forEach(n=>this.registerPlugin(n));return}this.registerPlugin(r)})}setupFeatures(){const e=this.options.features;e&&(Object.entries(e).forEach(([r,n])=>{const i=typeof n=="function"?n():n;this.registerFeature(r,i)}),this.searchParams.feature&&this.searchParams.feature.forEach(r=>{try{const[n,i]=r.split(":");if(!n||!i)return;let d=i;d==="true"&&(d=!0),d==="false"&&(d=!1),this.registerFeature(n,{key:`${d}`,name:n,decide:()=>d,storage:"session"})}catch{}}))}setupPredicates(){const e=this.options.predicates;e&&Object.entries(e).forEach(([r,n])=>{if(typeof n!="function"){x.logger("warn",`Predicate "${r}" is not a function.`);return}this.registerPredicate(r,n)})}setupActions(){const e=this.options.actions;e&&Object.entries(e).forEach(([r,n])=>{if(typeof n!="function"){x.logger("warn",`Action "${r}" is not a function.`);return}this.registerAction(r,n)})}getPluginConfig=e=>this.plugins[e]??{};renderString=(e,r)=>{const n=this.responses.listStore.getState().reduce((i,d)=>(i[d.fieldId]=d.value,i),{});return Qe(e,{...r,responses:n})}}function q(t){return Array.isArray(t.options)&&t.options.some(e=>"condition"in e)}function Xe(t){return t.some(e=>e.condition||q(e))}async function Ze(t,e,r){return e.length===0||!Xe(e)?e:(await Promise.all(e.map(async i=>{if(!(i.condition?await w.evaluateRuleLogic(t,i.condition,r):!0))return null;if(!Array.isArray(i.options)||!q(i))return i;const c=(await Promise.all(i.options.map(async p=>p.condition?await w.evaluateRuleLogic(t,p.condition,r)?p:null:p))).filter(p=>p!==null);return c.length===i.options.length?i:c.length===0?null:{...i,options:c}}))).filter(i=>i!==null)}const et=t=>{const e=new _(t);return S.bindClient(e),e};exports.evaluateRuleLogic=w.evaluateRuleLogic;exports.isPickedRoot=w.isPickedRoot;exports.createStorageKey=b.createStorageKey;exports.localStore=b.localStore;exports.sessionStore=b.sessionStore;exports.subscribe=b.subscribe;exports.supportsCookies=S.supportsCookies;exports.supportsCryptoRandomUUID=S.supportsCryptoRandomUUID;exports.supportsDocument=S.supportsDocument;exports.supportsHistory=S.supportsHistory;exports.supportsIntersectionObserver=S.supportsIntersectionObserver;exports.supportsLocalStorage=S.supportsLocalStorage;exports.supportsLocation=S.supportsLocation;exports.supportsSessionStorage=S.supportsSessionStorage;exports.supportsShadowRoot=S.supportsShadowRoot;exports.supportsWebComponents=S.supportsWebComponents;exports.supportsWindow=S.supportsWindow;exports.Picked=_;exports.createClient=et;exports.getPickedConfig=N;exports.getStepFields=Ze;
4
+ (3) a <script> tag with id 'picked_script', 'picked', or 'cvly' that includes data-organizationid/data-projectid (or organization-id/project-id) attributes.`)}function P(t){return t==null||t===""||Number.isNaN(t)}const He={default:(t,e)=>P(t)?String(e??""):String(t),append:(t,e)=>e&&!P(t)?`${t} ${e}`:t,prepend:(t,e)=>e&&!P(t)?`${e} ${t}`:t,upper:t=>typeof t=="string"?t.toUpperCase():t,lower:t=>typeof t=="string"?t.toLowerCase():t,capitalize:t=>typeof t=="string"?t.charAt(0).toUpperCase()+t.slice(1):t,list:t=>{if(!t||typeof t!="object")return t;const e=new Intl.ListFormat("en",{style:"long",type:"conjunction"});if(Array.isArray(t))return e.format(t.map(String));if(t instanceof Map){const r=Array.from(t.entries()).map(([n,i])=>`${n}: ${i}`);return e.format(r)}return t instanceof Set?e.format(Array.from(t).map(String)):t}};function Je(t){return typeof t=="object"&&t!==null}function Ge(t,e){let r=e;for(const n of t.split("."))if(Je(r)&&n in r)r=r[n];else return;return typeof r=="function"?r():r}function Ye(t,e){const r=t.split("|").map(d=>d.trim()),n=r.shift()??"";let i=Ge(n,e);for(const d of r){const[l,...c]=d.split(":"),m=l?.trim()??"",p=c.join(":").trim().replaceAll(/(?:^['"]|['"]$)/g,""),h=He[m];h&&(i=h(i,p))}return P(i)?"":typeof i=="object"?JSON.stringify(i):String(i)}function Qe(t,e){let r="",n=0;for(;n<t.length;)if(t[n]==="{"&&t[n+1]==="{"){n+=2;let i="";for(;n<t.length;){if(t[n]==="}"&&t[n+1]==="}"){n+=2;break}i+=t[n++]}r+=Ye(i.trim(),e)}else r+=t[n++];return r}class _{static logger=x.logger;options;isReady=!1;project;plugins={};eventBus=f.createEvent();events;organizationId;projectId;apiUrl;session;precondition;condition;searchParams=Ve();history=we();components=ie({client:this});experienceInstances=w.createExperienceInstanceIndex({client:this});experiences=Q({client:this});frameworks=ce({client:this});predicates=ye({client:this});features=Se({client:this});responses=Me({client:this});fields=Ee({client:this});actions=De({client:this});constructor(e){x.logger("info","Picked client initializing."),this.events=Ie(this.eventBus);const{organizationId:r,projectId:n}=We(e);this.organizationId=r,this.projectId=n,this.options=Object.freeze(e),this.apiUrl=e.apiUrl||Ue(),this.session=_e(),this.setupPlugins(),this.setupFeatures(),this.setupPredicates(),this.setupActions(),this.precondition=e.precondition,this.condition=e.condition,this.eventBus({type:"load",version:Oe()}),x.logger("info","Picked client initialized.")}start=()=>{ge(this),(async()=>{if(!S.supportsDocument())return;let r;typeof this.precondition>"u"?r=!0:typeof this.precondition=="boolean"?r=this.precondition:r=await w.evaluateRuleLogic(this,this.precondition)===!0;let n;r&&(this.condition===void 0?n=!0:typeof this.condition=="boolean"?n=this.condition:n=await w.evaluateRuleLogic(this,this.condition)===!0);const i=r&&n===!0;if(typeof n=="boolean"&&this.session){const d=n;this.session.setIsUser(d),this.eventBus({type:"user_decide",value:d})}if(this.eventBus({type:"initialize"}),document.body&&i&&$(this),await w.domInteractive(),i&&$(this),this.eventBus({type:"ready"}),this.isReady=!0,this.session){const{id:d,isUser:l,identifiers:c}=this.session;this.eventBus({type:"session",id:d,isUser:l,identifiers:c})}})()};registerFramework=e=>{ue(e,this.frameworks)};registerComponent=(e,r)=>{z(e,r,this.components)};registerPlugin=e=>{ee(this,e,this.plugins)};registerFeature=(e,r)=>{ke(e,r,this.features)};registerPredicate=(e,r)=>{he(e,r,this.predicates)};registerField=e=>{je(e,this.fields)};registerAction=(e,r)=>{Be(e,r,this.actions)};registerExperience=e=>{e.component&&z(`experience:${e.id}`,e.component,this.components),X(e,this.experiences)};getStateSnapshot=()=>L(this);launchExperienceById=async e=>{const r=this.experiences.getById(e).getState();if(!r){x.logger("warn",`Experience with id '${e}' not found.`);return}T(this,r)};setupPlugins(){this.options.plugins?.forEach(e=>{if(Array.isArray(e)){e.forEach(n=>{this.registerPlugin(n)});return}const r=typeof e=="function"?e():e;if(Array.isArray(r)){r.forEach(n=>this.registerPlugin(n));return}this.registerPlugin(r)})}setupFeatures(){const e=this.options.features;e&&(Object.entries(e).forEach(([r,n])=>{const i=typeof n=="function"?n():n;this.registerFeature(r,i)}),this.searchParams.feature&&this.searchParams.feature.forEach(r=>{try{const[n,i]=r.split(":");if(!n||!i)return;let d=i;d==="true"&&(d=!0),d==="false"&&(d=!1),this.registerFeature(n,{key:`${d}`,name:n,decide:()=>d,storage:"session"})}catch{}}))}setupPredicates(){const e=this.options.predicates;e&&Object.entries(e).forEach(([r,n])=>{if(typeof n!="function"){x.logger("warn",`Predicate "${r}" is not a function.`);return}this.registerPredicate(r,n)})}setupActions(){const e=this.options.actions;e&&Object.entries(e).forEach(([r,n])=>{if(typeof n!="function"){x.logger("warn",`Action "${r}" is not a function.`);return}this.registerAction(r,n)})}getPluginConfig=e=>this.plugins[e]??{};renderString=(e,r)=>{const n=this.responses.listStore.getState().reduce((i,d)=>(i[d.fieldId]=d.value,i),{});return Qe(e,{...r,responses:n})}}function q(t){return Array.isArray(t.options)&&t.options.some(e=>"condition"in e)}function Xe(t){return t.some(e=>e.condition||q(e))}async function Ze(t,e,r){return e.length===0||!Xe(e)?e:(await Promise.all(e.map(async i=>{if(!(i.condition?await w.evaluateRuleLogic(t,i.condition,r):!0))return null;if(!Array.isArray(i.options)||!q(i))return i;const c=(await Promise.all(i.options.map(async p=>p.condition?await w.evaluateRuleLogic(t,p.condition,r)?p:null:p))).filter(p=>p!==null);return c.length===i.options.length?i:c.length===0?null:{...i,options:c}}))).filter(i=>i!==null)}const et=t=>{const e=new _(t);return S.bindClient(e),e};exports.evaluateRuleLogic=w.evaluateRuleLogic;exports.isPickedRoot=w.isPickedRoot;exports.createStorageKey=b.createStorageKey;exports.localStore=b.localStore;exports.sessionStore=b.sessionStore;exports.subscribe=b.subscribe;exports.supportsCookies=S.supportsCookies;exports.supportsCryptoRandomUUID=S.supportsCryptoRandomUUID;exports.supportsDocument=S.supportsDocument;exports.supportsHistory=S.supportsHistory;exports.supportsIntersectionObserver=S.supportsIntersectionObserver;exports.supportsLocalStorage=S.supportsLocalStorage;exports.supportsLocation=S.supportsLocation;exports.supportsSessionStorage=S.supportsSessionStorage;exports.supportsShadowRoot=S.supportsShadowRoot;exports.supportsWebComponents=S.supportsWebComponents;exports.supportsWindow=S.supportsWindow;exports.Picked=_;exports.createClient=et;exports.getPickedConfig=N;exports.getStepFields=Ze;
package/dist/esm/index.js CHANGED
@@ -829,7 +829,7 @@ const Ze = x("response"), et = I(({ client: t }) => {
829
829
  return;
830
830
  }
831
831
  }
832
- if (Array.isArray(f.options)) {
832
+ if (Array.isArray(f.options) && f.options.length > 0) {
833
833
  const h = Array.isArray(a) ? a : [a];
834
834
  if (f.type === "object") {
835
835
  const S = f.options.map((k) => JSON.stringify(k.value));
@@ -892,7 +892,7 @@ const Ze = x("response"), et = I(({ client: t }) => {
892
892
  function tt(t) {
893
893
  return F(et, t);
894
894
  }
895
- const rt = () => "0.0.1-dev.1772064704206";
895
+ const rt = () => "0.0.1-dev.1772073931707";
896
896
  function nt() {
897
897
  if (_()) {
898
898
  const t = [
@@ -1 +1 @@
1
- {"version":3,"file":"response.d.ts","sourceRoot":"","sources":["../../../../src/entities/response/response.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyD,KAAK,KAAK,EAAE,MAAM,UAAU,CAAA;AAE5F,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAC1C,OAAO,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,EAAuB,MAAM,gBAAgB,CAAA;AA8CvF,MAAM,MAAM,cAAc,GAAG,UAAU,CAAC,OAAO,mBAAmB,CAAC,CAAA;AAInE,MAAM,MAAM,QAAQ,GAAG,UAAU,CAAA;AAGjC,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,QAAQ,GAAG,SAAS,CAAA;CAC5B;AAED,QAAA,MAAM,0BAA0B,eAA8B;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE;;kBA8BnD,KAAK,CAAC,IAAI,CAAC,YAAY,QAAQ,GAAG,IAAI;kBACtC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,aAAa,KAAK,GAAG,IAAI;;;;gCA6O5D,eAAe,KACjC,OAAO,CAAC;QAAE,MAAM,EAAE,eAAe,EAAE,CAAA;KAAE,CAAC;8CA7NpB,eAAe,KACjC,OAAO,CAAC;QAAE,iBAAiB,EAAE,eAAe,CAAC;QAAC,gBAAgB,EAAE,eAAe,EAAE,CAAA;KAAE,CAAC;;;;;;;;;kBAwPxD,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,UAAU,CAAC;SAExC,CAAC,SAAS,SAAS,WAAW,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC;;gCA6B9C,KAAK,CAAC,MAAM,CAAC;CAwChD,CAAA;AAEF,wBAAgB,mBAAmB,CAAC,CAAC,SAAS,UAAU,CAAC,OAAO,0BAA0B,CAAC,CAAC,CAAC,CAAC,EAC5F,MAAM,EAAE,CAAC,GACR,UAAU,CAAC,OAAO,0BAA0B,CAAC,CAE/C;AAED,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,UAAU,CAAC,CAAA;AAE7D,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,CAAA;IAGpB,WAAW,EAAE,MAAM,CAAA;IAGnB,aAAa,EAAE,MAAM,CAAA;IAGrB,KAAK,EAAE,UAAU,CAAA;CAClB"}
1
+ {"version":3,"file":"response.d.ts","sourceRoot":"","sources":["../../../../src/entities/response/response.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyD,KAAK,KAAK,EAAE,MAAM,UAAU,CAAA;AAE5F,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAC1C,OAAO,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,EAAuB,MAAM,gBAAgB,CAAA;AA8CvF,MAAM,MAAM,cAAc,GAAG,UAAU,CAAC,OAAO,mBAAmB,CAAC,CAAA;AAInE,MAAM,MAAM,QAAQ,GAAG,UAAU,CAAA;AAGjC,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,QAAQ,GAAG,SAAS,CAAA;CAC5B;AAED,QAAA,MAAM,0BAA0B,eAA8B;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE;;kBA8BnD,KAAK,CAAC,IAAI,CAAC,YAAY,QAAQ,GAAG,IAAI;kBACtC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,aAAa,KAAK,GAAG,IAAI;;;;gCA8O5D,eAAe,KACjC,OAAO,CAAC;QAAE,MAAM,EAAE,eAAe,EAAE,CAAA;KAAE,CAAC;8CA9NpB,eAAe,KACjC,OAAO,CAAC;QAAE,iBAAiB,EAAE,eAAe,CAAC;QAAC,gBAAgB,EAAE,eAAe,EAAE,CAAA;KAAE,CAAC;;;;;;;;;kBAyPxD,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,UAAU,CAAC;SAExC,CAAC,SAAS,SAAS,WAAW,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC;;gCA6B9C,KAAK,CAAC,MAAM,CAAC;CAwChD,CAAA;AAEF,wBAAgB,mBAAmB,CAAC,CAAC,SAAS,UAAU,CAAC,OAAO,0BAA0B,CAAC,CAAC,CAAC,CAAC,EAC5F,MAAM,EAAE,CAAC,GACR,UAAU,CAAC,OAAO,0BAA0B,CAAC,CAE/C;AAED,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,UAAU,CAAC,CAAA;AAE7D,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,CAAA;IAGpB,WAAW,EAAE,MAAM,CAAA;IAGnB,aAAa,EAAE,MAAM,CAAA;IAGrB,KAAK,EAAE,UAAU,CAAA;CAClB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@picked/client",
3
- "version": "0.0.1-dev.1772064704206",
3
+ "version": "0.0.1-dev.1772073931707",
4
4
  "dependencies": {
5
5
  "@withease/factories": "^1.0.5"
6
6
  },