@picked/client 0.0.1-dev.1764728988965 → 0.0.1-dev.1764739911676

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 +1 @@
1
- "use strict";var N=Object.defineProperty;var _=(t,e,r)=>e in t?N(t,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[e]=r;var y=(t,e,r)=>_(t,typeof e!="symbol"?e+"":e,r);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const p=require("effector"),h=require("@withease/factories"),b=require("../experience-instance-DjjpHk0t.cjs"),I=require("../logger-BsmHUUw1.cjs"),F=require("../storage-DuRlyFaY.cjs"),q=require("../id-BKIWbSTy.cjs"),K=require("../object-BbFTsGh3.cjs"),k=require("../supports-YvpQZxbh.cjs"),L=p.createDomain("experience"),H=h.createFactory(({client:t,experience:e})=>{const r=L.store(e),n=p.createApi(r,{merge(c,m){return{...c,...m.experience}}}),u=r.map(c=>({name:c.name,decisionLogic:c.condition??c.decide,targetSelectors:c.targets,initializeOpenLogic:e.initializeOpen})),g=t.components.listStore.map(c=>c.find(m=>m.name===`experience:${e.id}`)||c.find(m=>m.name==="experience"),{skipVoid:!1}),s=r.map(c=>({steps:c.steps,nodes:c.nodes,edges:c.edges,conditionals:c.conditionals})),o=e.actions??[];return{id:e.id,configStore:u,treeStore:s,componentStore:g,actions:o,merge:n.merge}});function W(t){return h.invoke(H,t)}const G=h.createFactory(({client:t})=>{const e=L.store({}),r=p.createApi(e,{register(s,o){return{...s,[o.id]:o}}});function n(s){const o=e.getState()[s.id];if(o){o.merge({experience:s,strategy:"override"});return}const c=W({client:t,experience:s});r.register(c)}const u=e.map(s=>Object.values(s));function g(s){return e.map(o=>o[s],{skipVoid:!1})}return{register:n,getById:g,listStore:u}});function Y(t){return h.invoke(G,t)}const J=(t,e)=>{e.register(t)},V=(t,e)=>{const{targetSelectors:r}=e.configStore.getState(),n=b.getTargetElements(r,e.id);n.forEach(({elements:g})=>g.forEach(s=>b.tagTargetElement(s,e.id))),b.createAppHosts(n,e.id).forEach(g=>{t.experienceInstances.spawn(e,g)})},B=async t=>{await Promise.all(t.experiences.listStore.getState().map(async e=>{await Q(t,e)&&V(t,e)}))},Q=async(t,e)=>{const{decisionLogic:r,targetSelectors:n}=e.configStore.getState();return b.getTargetElements(n,e.id).length<1||n.length===0?!1:r&&b.isRulesLogic(r)?await b.evaluateRuleLogic(t,r)===!0:!0},X=(t,e,r)=>{const n=e.name,u=e.setup(t);if(u){const g=r[n]??{};r[n]=Object.freeze({...g,...u})}},Z=p.createDomain("component"),ee=h.createFactory(({client:t,component:e,name:r})=>{const n=t.frameworks.getByName(e.frameworkName);return{name:r,component:e,frameworkStore:n}});function te(t){return h.invoke(ee,t)}const re=h.createFactory(({client:t})=>{const e=Z.store({}),r=p.createApi(e,{register(s,o){return{...s,[o.name]:o}}});function n(s,o){e.getState()[s]&&I.logger("warn",`Component '${s}' already registered. Registering again will override the previous registration.`);const m=te({client:t,name:s,component:o});r.register(m)}const u=e.map(s=>Object.values(s));function g(s){return e.map(o=>o[s],{skipVoid:!1})}return{register:n,getByName:g,listStore:u}});function se(t){return h.invoke(re,t)}const j=(t,e,r)=>{r.register(t,e)},ne=p.createDomain("framework"),oe=h.createFactory(({client:t})=>{const e=ne.store({}),r=p.createApi(e,{register(s,o){return{...s,[o.name]:o.framework}}});function n(s,o){e.getState()[s]&&I.logger("warn",`Framework '${s}' already registered. Registering again will override the previous registration.`),r.register({name:s,framework:o})}const u=e.map(s=>Object.values(s));function g(s){return e.map(o=>o[s],{skipVoid:!1})}return{register:n,getByName:g,listStore:u}});function ie(t){return h.invoke(oe,t)}const ae=(t,e)=>{e.register(t.name,t)},ce=6e3,$=F.createStorageKey("last_ping","global"),ue=t=>`${t}/api/v1/ping`,le=async t=>{try{const e=Date.now(),r=localStorage.getItem($);if(r&&e-parseInt(r)<ce)return!0;const n=ue(t.apiUrl),u={projectId:t.projectId,path:window.location.pathname},g=JSON.stringify(u),s={"Content-Type":"application/json"},o=document.getElementById("picked_script"),c=o==null?void 0:o.dataset.verceltoken;c&&(s["x-vercel-protection-bypass"]=c);const v=(await fetch(n,{method:"POST",headers:s,body:g})).ok;return v&&localStorage.setItem($,e.toString()),v}catch(e){return I.logger("error",e),!1}};function M(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 de=p.createDomain("predicate"),pe=h.createFactory(({client:t})=>{const e=de.store({}),r=p.createApi(e,{register(o,c){return{...o,[c.name]:{name:c.name,predicate:c.predicate}}}});function n(o,c){e.getState()[o]&&I.logger("warn",`Predicate '${o}' already registered. Registering again will override the previous registration.`),r.register(Object.freeze({name:o,predicate:c}))}const u=e.map(o=>Object.values(o));function g(o){return e.map(c=>{var m;return(m=c[o])==null?void 0:m.predicate},{skipVoid:!1})}function s(o){const c=p.createStore(()=>{},{skipVoid:!1}),m=p.createEffect(async()=>{const v=g(o).getState();if(!v)return;const E=M(t);return()=>v(E)});return p.sample({source:{responses:t.responses.listStore,fields:t.fields.listStore},target:m}),p.sample({clock:m.doneData,filter:v=>v!==void 0,target:c}),m(),c}return{register:n,getByName:g,listStore:u,getEvokablePredicate:s}});function ge(t){return h.invoke(pe,t)}const fe=(t,e,r)=>{r.register(t,e)},C=p.createDomain("feature"),me=h.createFactory(({client:t})=>{const e=C.store({}),r=C.store([]),n=p.createApi(e,{register(i,l){return{...i,[l.id]:l.feature}}});function u(i,l){e.getState()[i]&&I.logger("warn",`Feature '${i}' already registered. Registering again will override the previous registration.`);const f={id:i,feature:{...l,id:i}};n.register(Object.freeze({id:i,feature:f}))}const g=p.createEffect(async({id:i,key:l,storage:a="local"})=>{const f=F.createStorageKey(`feature:${i}:${l}`,"global"),S=(a==="session"?F.sessionStore:F.localStore).get(f).boolean();return S===null?null:{id:i,key:l,bucket:S,storage:a}}),s=p.createEffect(i=>{if(!i)return null;const l=F.createStorageKey(`feature:${i.id}:${i.key}`,"global");(i.storage==="session"?F.sessionStore:F.localStore).set(l,i.bucket)}),o=new Map,c=p.attach({source:{allFeaturesStore:e,resolvedFeaturesStore:r},effect:async({allFeaturesStore:i,resolvedFeaturesStore:l},{id:a,decide:f,key:d})=>{const S=l.find(A=>A.id===a&&A.key===d);if(S)return S;const w=i[a];if(!w)throw new Error(`Feature with id '${a}' not found`);const P=o.get(`${a}:${d}`);if(P!==void 0){const A=await P;return{id:w.id,bucket:A,key:d,storage:w.feature.storage}}const x=f();o.set(`${a}:${d}`,x);const z=await x;return{id:w.id,bucket:z,key:d,storage:w.feature.storage}}});p.sample({clock:n.register,fn:i=>{const{id:l,feature:a}=i;return{id:l,key:a.feature.key,storage:a.feature.storage}},target:g}),p.sample({source:e,clock:c.doneData,fn:(i,l)=>{var w;const{id:a,bucket:f,storage:d}=l,S=(w=i[a])==null?void 0:w.feature.key;return S?{key:S,id:a,bucket:f,storage:d}:null},target:s});const m=p.combine({allFeaturesStore:e,resolvedFeaturesStore:r}).map(({allFeaturesStore:i,resolvedFeaturesStore:l})=>Object.values(i).map(a=>{const f=l.find(d=>d.id===a.id&&d.key===a.feature.key);return f?{id:a.id,name:a.feature.name,key:a.feature.key,getBucket:()=>({id:a.id,bucket:f.bucket}),isResolved:!0}:{id:a.id,name:a.feature.name,key:a.feature.key,getBucket:async()=>await c(a.feature),isResolved:!1}}));p.sample({clock:c.doneData,source:{resolvedFeatures:r},filter:({resolvedFeatures:i},{id:l,key:a})=>!i.some(d=>d.id===l&&d.key===a),fn:(i,l)=>l,target:t.eventBus.prepend(i=>({type:"feature_decide",feature:i}))}),p.sample({clock:[g.doneData,c.doneData],source:r,fn:(i,l)=>!l||i.some(f=>f.id===l.id&&f.key===l.key)?i:[...i,l],target:r});function v(i){return m.map(l=>l.find(a=>a.id===i))}function E(i){const l=p.createStore(async()=>{},{skipVoid:!1}),a=p.createEffect(async()=>{const f=v(i).getState();if(f)return async()=>(await f.getBucket()).bucket});return p.sample({source:r,filter:f=>f.some(d=>d.id===i),target:a}),p.sample({clock:a.doneData,filter:f=>f!==void 0,target:l}),a(),l}return{register:u,getById:v,listStore:m,getEvokableFeature:E}});function ye(t){return h.invoke(me,t)}const he=(t,e,r)=>{r.register(t,e)},R=p.createDomain("history");function O(t,e){return{id:q.generateId(`history-entry-${Date.now()}-${Math.random()}}`),node:e,at:Date.now(),experienceId:t}}const ve=h.createFactory(()=>{const t=R.store({entries:[]}),e=R.event(),r=R.event(),n=R.event(),u=R.event();t.on(e,(s,o)=>({entries:[...s.entries,O(o.experienceId,o.node)]})),t.on(r,(s,o)=>({entries:[...s.entries.slice(0,-1),O(o.experienceId,o.node)]})),t.on(u,(s,o)=>o);function g(s,o){const c={lastStepIndex:-1,secondLastStepIndex:-1};for(let m=s.length-1;m>=0;m--){const v=s[m],E=v==null?void 0:v.node;if(!(!E||!b.isStepNode(E))&&!(o&&(v==null?void 0:v.experienceId)!==o))if(c.lastStepIndex===-1)c.lastStepIndex=m;else{c.secondLastStepIndex=m;break}}return c}return t.on(n,(s,o)=>{const{secondLastStepIndex:c}=g(s.entries,o.experienceId),m=c!==-1?s.entries.slice(0,c+1):s.entries;return{...s,entries:m}}),{push:e,replace:r,back:n,restore:u,entriesStore:t.map(s=>s.entries)}});function Se(){return h.invoke(ve)}const ke=()=>p.createEvent(),we=p.createDomain("field"),Fe=h.createFactory(()=>{const t=we.store({}),e=p.createApi(t,{register(s,o){return{...s,[o.field.id]:o.field}}});function r(s){e.register({field:s})}const n=t.map(s=>Object.values(s));function u(s){return t.map(o=>o[s]||null)}function g(s){return t.map(o=>Object.values(o).find(c=>c.name===s)||null)}return{register:r,getById:u,listStore:n,getByName:g}});function be(){return h.invoke(Fe)}const Ie=(t,e)=>{e.register(t)},Ee=p.createDomain("action"),xe=h.createFactory(()=>{const t=Ee.store({}),e=p.createApi(t,{register(s,o){return{...s,[o.name]:{name:o.name,action:o.action}}}});function r(s,o){e.register({name:s,action:o})}const n=t.map(s=>Object.values(s));function u(s){return t.map(o=>o[s],{skipVoid:!1})}function g(s){return t.map(o=>{const c=o[s];return c?c.action:void 0},{skipVoid:!1})}return{register:r,getByName:u,listStore:n,getEvokableAction:g}});function Re(){return h.invoke(xe)}const Pe=(t,e,r)=>{r.register(t,e)};function U(t){return typeof t>"u"||t===null||t===""||Array.isArray(t)&&!t.length}const Ae=p.createDomain("response"),De=h.createFactory(({client:t})=>{const e=Ae.store({}),r=p.createEvent(),n=p.createEvent(),u=p.createApi(e,{register(i,l){return{...i,[l.fieldId]:l.response}},registerBatch(i,l){return{...i,...l}},clear(i,l){const{[l]:a,...f}=i;return f},clearAll(){return{}}});function g(i,l){if(typeof i=="string"){if(l===void 0)throw new Error("Response is required when registering a single field");u.register({fieldId:i,response:l})}else u.registerBatch(i)}async function s(i){const l=[];return await Promise.allSettled(Object.entries(i).map(async([a,f])=>{let d=f;const S=t.fields.getById(a).getState();if(!S){l.push({fieldId:a,userMessage:`Field '${a}' not found`,systemMessage:`No field with ID '${a}' exists. Available field IDs are: ${Object.keys(t.fields.listStore.getState()).join(",")}.`,value:d});return}if(S.multiple&&(typeof d=="string"||typeof d=="number"||typeof d=="boolean")&&(d=[d]),S.validation&&!K.isEmpty(S.validation)&&!U(d)){const w=await b.evaluateRuleLogic(t,S.validation,{$input:d});if(typeof w=="string"){l.push({fieldId:a,userMessage:w,systemMessage:`Field validation resulted in an error: ${w}.`,value:d});return}if(w===!1){l.push({fieldId:a,userMessage:"This field is invalid",systemMessage:"Field validation resulted in an unspecified error.",value:d});return}}if(S.required&&U(d)){l.push({fieldId:a,userMessage:"This field is required",systemMessage:"Field is required.",value:d});return}if(!S.multiple&&Array.isArray(d)&&d.length>1){l.push({fieldId:a,userMessage:"This field expects a single response",systemMessage:"Field expects a single response.",value:d});return}if(S.options){const w=S.options.map(x=>x.value),P=Array.isArray(d)?d:[d];Array.isArray(d)&&(P.every(x=>w.includes(x))||l.push({fieldId:a,userMessage:"This field expects a valid option",systemMessage:`Field expects a valid option. Valid options are: ${w.join(", ")}`,value:d}))}})),{responsesToCommit:i,validationErrors:l}}async function o(i){const{responsesToCommit:l,validationErrors:a}=await s(i);return a.length?{errors:a}:(u.registerBatch(l),{errors:[]})}const c=e.map(i=>i),m=e.map(i=>Object.keys(i).map(a=>({fieldId:a,value:i[a]})));function v(i){const l=t.fields.getById(i),a=e.map(f=>f[i]||null);return p.combine({f:l,r:a},({f,r:d})=>d||(f!=null&&f.defaultValue?f.defaultValue:null))}function E(i){const l=t.fields.getByName(i);return p.combine({f:l,s:e},({f:a,s:f})=>{const d=a&&f[a.id]||null;return d||(a!=null&&a.defaultValue?a.defaultValue:null)})}return p.sample({clock:r,target:u.clearAll}),p.sample({clock:n,target:u.clear}),{register:g,clearAll:r,clear:n,commit:o,getResponsesToCommit:s,listStore:m,getAllStore:c,getByFieldId:v,getByFieldName:E}});function Be(t){return h.invoke(De,t)}const je=()=>"0.0.1-dev.1764728988965";function $e(){if(k.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!=null&&e.dataset.api)return e.dataset.api}return"https://api.picked.app"}function Ce(){if(!k.supportsWindow())return{};const t=new URLSearchParams(window.location.search),e={},r=new Set;for(const[u]of t.entries())u.startsWith("picked-")&&r.add(u);for(const u of r){const g=u.replace("picked-","");e[g]=t.getAll(u)}const n=F.createStorageKey("s");if(r.size>0)F.sessionStore.set(n,e);else{const u=F.sessionStore.get(n);if(u)return u.json()||{}}return e}function Oe(){if(k.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 Ue=F.createStorageKey("session","global"),Le=()=>{const t=F.localStore.get(Ue);let e;t.isSet()&&(e=t.json());const r=u=>t.set({id:u.id,isUser:u.isUser}),n={id:(e==null?void 0:e.id)??Oe(),isUser:(e==null?void 0:e.isUser)??void 0,setIsUser(u){this.isUser=u,r(this)}};return r(n),n},Ve=()=>k.supportsLocalStorage()?Le():null;class D{constructor(e){y(this,"options");y(this,"isReady",!1);y(this,"project");y(this,"plugins",{});y(this,"eventBus",ke());y(this,"organizationId");y(this,"projectId");y(this,"apiUrl");y(this,"session");y(this,"precondition");y(this,"condition");y(this,"searchParams",Ce());y(this,"history",Se());y(this,"components",se({client:this}));y(this,"experienceInstances",b.createExperienceInstanceIndex({client:this}));y(this,"experiences",Y({client:this}));y(this,"frameworks",ie({client:this}));y(this,"predicates",ge({client:this}));y(this,"features",ye({client:this}));y(this,"responses",Be({client:this}));y(this,"fields",be());y(this,"actions",Re());I.logger("info","Picked client initializing."),this.organizationId=e.organizationId,this.projectId=e.projectId,this.options=Object.freeze(e),this.apiUrl=e.apiUrl||$e(),this.session=Ve(),this.setupPlugins(),this.setupFeatures(),this.setupPredicates(),this.setupActions(),this.precondition=e.precondition,this.condition=e.condition,this.eventBus({type:"load",version:je()}),I.logger("info","Picked client initialized.")}start(){le(this),(async()=>{if(!k.supportsDocument())return;let r=!0,n;this.precondition!==void 0&&await b.evaluateRuleLogic(this,this.precondition)===!1&&(n=!1,r=!1),this.condition!==void 0&&n!==!1&&await b.evaluateRuleLogic(this,this.condition)===!1&&(r=!1),this.session&&this.session.setIsUser(r),this.eventBus({type:"initialize"}),this.eventBus({type:"user_decide",value:r}),document.body&&r&&B(this),await b.domInteractive(),r&&B(this),this.eventBus({type:"ready"}),this.isReady=!0,this.session&&this.eventBus({type:"session",...this.session})})()}registerFramework(e){ae(e,this.frameworks)}registerComponent(e,r){j(e,r,this.components)}registerPlugin(e){X(this,e,this.plugins)}registerFeature(e,r){he(e,r,this.features)}registerPredicate(e,r){fe(e,r,this.predicates)}registerField(e){Ie(e,this.fields)}registerAction(e,r){Pe(e,r,this.actions)}registerExperience(e){e.component&&j(`experience:${e.id}`,e.component,this.components),J(e,this.experiences)}getStateSnapshot(){return M(this)}async launchExperienceById(e){const r=this.experiences.getById(e).getState();if(!r){I.logger("warn",`Experience with id '${e}' not found.`);return}V(this,r)}setupPlugins(){var e;(e=this.options.plugins)==null||e.forEach(r=>{if(Array.isArray(r)){r.forEach(u=>{this.registerPlugin(u)});return}const n=typeof r=="function"?r():r;if(Array.isArray(n)){n.forEach(u=>this.registerPlugin(u));return}this.registerPlugin(n)})}setupFeatures(){const e=this.options.features;e&&(Object.entries(e).forEach(([r,n])=>{const u=typeof n=="function"?n():n;this.registerFeature(r,u)}),this.searchParams.feature&&this.searchParams.feature.forEach(r=>{try{const[n,u]=r.split(":");if(!n||!u)return;let g=u;g==="true"&&(g=!0),g==="false"&&(g=!1),this.registerFeature(n,{key:`${g}`,name:n,decide:()=>g,storage:"session"})}catch{}}))}setupPredicates(){const e=this.options.predicates;e&&Object.entries(e).forEach(([r,n])=>{if(typeof n!="function"){I.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"){I.logger("warn",`Action "${r}" is not a function.`);return}this.registerAction(r,n)})}getPluginConfig(e){return this.plugins[e]??{}}}y(D,"logger",I.logger);function T(t){var e;return((e=t.options)==null?void 0:e.some(r=>"condition"in r))??!1}function Me(t){return t.some(e=>e.condition||T(e))}async function Te(t,e){return e.length===0||!Me(e)?e:(await Promise.all(e.map(async n=>{if(!(n.condition?await b.evaluateRuleLogic(t,n.condition):!0))return null;if(!n.options||!T(n))return n;const s=(await Promise.all(n.options.map(async c=>c.condition?await b.evaluateRuleLogic(t,c.condition)?c:null:c))).filter(c=>c!==null);return s.length===n.options.length?n:s.length===0?null:{...n,options:s}}))).filter(n=>n!==null)}const ze=t=>{const e=new D(t);return k.bindClient(e),e};exports.evaluateRuleLogic=b.evaluateRuleLogic;exports.isPickedRoot=b.isPickedRoot;exports.createStorageKey=F.createStorageKey;exports.localStore=F.localStore;exports.sessionStore=F.sessionStore;exports.subscribe=F.subscribe;exports.supportsCookies=k.supportsCookies;exports.supportsCryptoRandomUUID=k.supportsCryptoRandomUUID;exports.supportsDocument=k.supportsDocument;exports.supportsHistory=k.supportsHistory;exports.supportsIntersectionObserver=k.supportsIntersectionObserver;exports.supportsLocalStorage=k.supportsLocalStorage;exports.supportsLocation=k.supportsLocation;exports.supportsSessionStorage=k.supportsSessionStorage;exports.supportsShadowRoot=k.supportsShadowRoot;exports.supportsWebComponents=k.supportsWebComponents;exports.supportsWindow=k.supportsWindow;exports.Picked=D;exports.createClient=ze;exports.getStepFields=Te;
1
+ "use strict";var N=Object.defineProperty;var _=(t,e,r)=>e in t?N(t,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[e]=r;var y=(t,e,r)=>_(t,typeof e!="symbol"?e+"":e,r);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const p=require("effector"),h=require("@withease/factories"),b=require("../experience-instance-DjjpHk0t.cjs"),I=require("../logger-BsmHUUw1.cjs"),F=require("../storage-DuRlyFaY.cjs"),q=require("../id-BKIWbSTy.cjs"),K=require("../object-BbFTsGh3.cjs"),k=require("../supports-YvpQZxbh.cjs"),L=p.createDomain("experience"),H=h.createFactory(({client:t,experience:e})=>{const r=L.store(e),n=p.createApi(r,{merge(c,m){return{...c,...m.experience}}}),u=r.map(c=>({name:c.name,decisionLogic:c.condition??c.decide,targetSelectors:c.targets,initializeOpenLogic:e.initializeOpen})),g=t.components.listStore.map(c=>c.find(m=>m.name===`experience:${e.id}`)||c.find(m=>m.name==="experience"),{skipVoid:!1}),s=r.map(c=>({steps:c.steps,nodes:c.nodes,edges:c.edges,conditionals:c.conditionals})),o=e.actions??[];return{id:e.id,configStore:u,treeStore:s,componentStore:g,actions:o,merge:n.merge}});function W(t){return h.invoke(H,t)}const G=h.createFactory(({client:t})=>{const e=L.store({}),r=p.createApi(e,{register(s,o){return{...s,[o.id]:o}}});function n(s){const o=e.getState()[s.id];if(o){o.merge({experience:s,strategy:"override"});return}const c=W({client:t,experience:s});r.register(c)}const u=e.map(s=>Object.values(s));function g(s){return e.map(o=>o[s],{skipVoid:!1})}return{register:n,getById:g,listStore:u}});function Y(t){return h.invoke(G,t)}const J=(t,e)=>{e.register(t)},V=(t,e)=>{const{targetSelectors:r}=e.configStore.getState(),n=b.getTargetElements(r,e.id);n.forEach(({elements:g})=>g.forEach(s=>b.tagTargetElement(s,e.id))),b.createAppHosts(n,e.id).forEach(g=>{t.experienceInstances.spawn(e,g)})},B=async t=>{await Promise.all(t.experiences.listStore.getState().map(async e=>{await Q(t,e)&&V(t,e)}))},Q=async(t,e)=>{const{decisionLogic:r,targetSelectors:n}=e.configStore.getState();return b.getTargetElements(n,e.id).length<1||n.length===0?!1:r&&b.isRulesLogic(r)?await b.evaluateRuleLogic(t,r)===!0:!0},X=(t,e,r)=>{const n=e.name,u=e.setup(t);if(u){const g=r[n]??{};r[n]=Object.freeze({...g,...u})}},Z=p.createDomain("component"),ee=h.createFactory(({client:t,component:e,name:r})=>{const n=t.frameworks.getByName(e.frameworkName);return{name:r,component:e,frameworkStore:n}});function te(t){return h.invoke(ee,t)}const re=h.createFactory(({client:t})=>{const e=Z.store({}),r=p.createApi(e,{register(s,o){return{...s,[o.name]:o}}});function n(s,o){e.getState()[s]&&I.logger("warn",`Component '${s}' already registered. Registering again will override the previous registration.`);const m=te({client:t,name:s,component:o});r.register(m)}const u=e.map(s=>Object.values(s));function g(s){return e.map(o=>o[s],{skipVoid:!1})}return{register:n,getByName:g,listStore:u}});function se(t){return h.invoke(re,t)}const j=(t,e,r)=>{r.register(t,e)},ne=p.createDomain("framework"),oe=h.createFactory(({client:t})=>{const e=ne.store({}),r=p.createApi(e,{register(s,o){return{...s,[o.name]:o.framework}}});function n(s,o){e.getState()[s]&&I.logger("warn",`Framework '${s}' already registered. Registering again will override the previous registration.`),r.register({name:s,framework:o})}const u=e.map(s=>Object.values(s));function g(s){return e.map(o=>o[s],{skipVoid:!1})}return{register:n,getByName:g,listStore:u}});function ie(t){return h.invoke(oe,t)}const ae=(t,e)=>{e.register(t.name,t)},ce=6e3,$=F.createStorageKey("last_ping","global"),ue=t=>`${t}/api/v1/ping`,le=async t=>{try{const e=Date.now(),r=localStorage.getItem($);if(r&&e-parseInt(r)<ce)return!0;const n=ue(t.apiUrl),u={projectId:t.projectId,path:window.location.pathname},g=JSON.stringify(u),s={"Content-Type":"application/json"},o=document.getElementById("picked_script"),c=o==null?void 0:o.dataset.verceltoken;c&&(s["x-vercel-protection-bypass"]=c);const v=(await fetch(n,{method:"POST",headers:s,body:g})).ok;return v&&localStorage.setItem($,e.toString()),v}catch(e){return I.logger("error",e),!1}};function M(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 de=p.createDomain("predicate"),pe=h.createFactory(({client:t})=>{const e=de.store({}),r=p.createApi(e,{register(o,c){return{...o,[c.name]:{name:c.name,predicate:c.predicate}}}});function n(o,c){e.getState()[o]&&I.logger("warn",`Predicate '${o}' already registered. Registering again will override the previous registration.`),r.register(Object.freeze({name:o,predicate:c}))}const u=e.map(o=>Object.values(o));function g(o){return e.map(c=>{var m;return(m=c[o])==null?void 0:m.predicate},{skipVoid:!1})}function s(o){const c=p.createStore(()=>{},{skipVoid:!1}),m=p.createEffect(async()=>{const v=g(o).getState();if(!v)return;const E=M(t);return()=>v(E)});return p.sample({source:{responses:t.responses.listStore,fields:t.fields.listStore},target:m}),p.sample({clock:m.doneData,filter:v=>v!==void 0,target:c}),m(),c}return{register:n,getByName:g,listStore:u,getEvokablePredicate:s}});function ge(t){return h.invoke(pe,t)}const fe=(t,e,r)=>{r.register(t,e)},C=p.createDomain("feature"),me=h.createFactory(({client:t})=>{const e=C.store({}),r=C.store([]),n=p.createApi(e,{register(i,l){return{...i,[l.id]:l.feature}}});function u(i,l){e.getState()[i]&&I.logger("warn",`Feature '${i}' already registered. Registering again will override the previous registration.`);const f={id:i,feature:{...l,id:i}};n.register(Object.freeze({id:i,feature:f}))}const g=p.createEffect(async({id:i,key:l,storage:a="local"})=>{const f=F.createStorageKey(`feature:${i}:${l}`,"global"),S=(a==="session"?F.sessionStore:F.localStore).get(f).boolean();return S===null?null:{id:i,key:l,bucket:S,storage:a}}),s=p.createEffect(i=>{if(!i)return null;const l=F.createStorageKey(`feature:${i.id}:${i.key}`,"global");(i.storage==="session"?F.sessionStore:F.localStore).set(l,i.bucket)}),o=new Map,c=p.attach({source:{allFeaturesStore:e,resolvedFeaturesStore:r},effect:async({allFeaturesStore:i,resolvedFeaturesStore:l},{id:a,decide:f,key:d})=>{const S=l.find(A=>A.id===a&&A.key===d);if(S)return S;const w=i[a];if(!w)throw new Error(`Feature with id '${a}' not found`);const P=o.get(`${a}:${d}`);if(P!==void 0){const A=await P;return{id:w.id,bucket:A,key:d,storage:w.feature.storage}}const x=f();o.set(`${a}:${d}`,x);const z=await x;return{id:w.id,bucket:z,key:d,storage:w.feature.storage}}});p.sample({clock:n.register,fn:i=>{const{id:l,feature:a}=i;return{id:l,key:a.feature.key,storage:a.feature.storage}},target:g}),p.sample({source:e,clock:c.doneData,fn:(i,l)=>{var w;const{id:a,bucket:f,storage:d}=l,S=(w=i[a])==null?void 0:w.feature.key;return S?{key:S,id:a,bucket:f,storage:d}:null},target:s});const m=p.combine({allFeaturesStore:e,resolvedFeaturesStore:r}).map(({allFeaturesStore:i,resolvedFeaturesStore:l})=>Object.values(i).map(a=>{const f=l.find(d=>d.id===a.id&&d.key===a.feature.key);return f?{id:a.id,name:a.feature.name,key:a.feature.key,getBucket:()=>({id:a.id,bucket:f.bucket}),isResolved:!0}:{id:a.id,name:a.feature.name,key:a.feature.key,getBucket:async()=>await c(a.feature),isResolved:!1}}));p.sample({clock:c.doneData,source:{resolvedFeatures:r},filter:({resolvedFeatures:i},{id:l,key:a})=>!i.some(d=>d.id===l&&d.key===a),fn:(i,l)=>l,target:t.eventBus.prepend(i=>({type:"feature_decide",feature:i}))}),p.sample({clock:[g.doneData,c.doneData],source:r,fn:(i,l)=>!l||i.some(f=>f.id===l.id&&f.key===l.key)?i:[...i,l],target:r});function v(i){return m.map(l=>l.find(a=>a.id===i))}function E(i){const l=p.createStore(async()=>{},{skipVoid:!1}),a=p.createEffect(async()=>{const f=v(i).getState();if(f)return async()=>(await f.getBucket()).bucket});return p.sample({source:r,filter:f=>f.some(d=>d.id===i),target:a}),p.sample({clock:a.doneData,filter:f=>f!==void 0,target:l}),a(),l}return{register:u,getById:v,listStore:m,getEvokableFeature:E}});function ye(t){return h.invoke(me,t)}const he=(t,e,r)=>{r.register(t,e)},R=p.createDomain("history");function O(t,e){return{id:q.generateId(`history-entry-${Date.now()}-${Math.random()}}`),node:e,at:Date.now(),experienceId:t}}const ve=h.createFactory(()=>{const t=R.store({entries:[]}),e=R.event(),r=R.event(),n=R.event(),u=R.event();t.on(e,(s,o)=>({entries:[...s.entries,O(o.experienceId,o.node)]})),t.on(r,(s,o)=>({entries:[...s.entries.slice(0,-1),O(o.experienceId,o.node)]})),t.on(u,(s,o)=>o);function g(s,o){const c={lastStepIndex:-1,secondLastStepIndex:-1};for(let m=s.length-1;m>=0;m--){const v=s[m],E=v==null?void 0:v.node;if(!(!E||!b.isStepNode(E))&&!(o&&(v==null?void 0:v.experienceId)!==o))if(c.lastStepIndex===-1)c.lastStepIndex=m;else{c.secondLastStepIndex=m;break}}return c}return t.on(n,(s,o)=>{const{secondLastStepIndex:c}=g(s.entries,o.experienceId),m=c!==-1?s.entries.slice(0,c+1):s.entries;return{...s,entries:m}}),{push:e,replace:r,back:n,restore:u,entriesStore:t.map(s=>s.entries)}});function Se(){return h.invoke(ve)}const ke=()=>p.createEvent(),we=p.createDomain("field"),Fe=h.createFactory(()=>{const t=we.store({}),e=p.createApi(t,{register(s,o){return{...s,[o.field.id]:o.field}}});function r(s){e.register({field:s})}const n=t.map(s=>Object.values(s));function u(s){return t.map(o=>o[s]||null)}function g(s){return t.map(o=>Object.values(o).find(c=>c.name===s)||null)}return{register:r,getById:u,listStore:n,getByName:g}});function be(){return h.invoke(Fe)}const Ie=(t,e)=>{e.register(t)},Ee=p.createDomain("action"),xe=h.createFactory(()=>{const t=Ee.store({}),e=p.createApi(t,{register(s,o){return{...s,[o.name]:{name:o.name,action:o.action}}}});function r(s,o){e.register({name:s,action:o})}const n=t.map(s=>Object.values(s));function u(s){return t.map(o=>o[s],{skipVoid:!1})}function g(s){return t.map(o=>{const c=o[s];return c?c.action:void 0},{skipVoid:!1})}return{register:r,getByName:u,listStore:n,getEvokableAction:g}});function Re(){return h.invoke(xe)}const Pe=(t,e,r)=>{r.register(t,e)};function U(t){return typeof t>"u"||t===null||t===""||Array.isArray(t)&&!t.length}const Ae=p.createDomain("response"),De=h.createFactory(({client:t})=>{const e=Ae.store({}),r=p.createEvent(),n=p.createEvent(),u=p.createApi(e,{register(i,l){return{...i,[l.fieldId]:l.response}},registerBatch(i,l){return{...i,...l}},clear(i,l){const{[l]:a,...f}=i;return f},clearAll(){return{}}});function g(i,l){if(typeof i=="string"){if(l===void 0)throw new Error("Response is required when registering a single field");u.register({fieldId:i,response:l})}else u.registerBatch(i)}async function s(i){const l=[];return await Promise.allSettled(Object.entries(i).map(async([a,f])=>{let d=f;const S=t.fields.getById(a).getState();if(!S){l.push({fieldId:a,userMessage:`Field '${a}' not found`,systemMessage:`No field with ID '${a}' exists. Available field IDs are: ${Object.keys(t.fields.listStore.getState()).join(",")}.`,value:d});return}if(S.multiple&&(typeof d=="string"||typeof d=="number"||typeof d=="boolean")&&(d=[d]),S.validation&&!K.isEmpty(S.validation)&&!U(d)){const w=await b.evaluateRuleLogic(t,S.validation,{$input:d});if(typeof w=="string"){l.push({fieldId:a,userMessage:w,systemMessage:`Field validation resulted in an error: ${w}.`,value:d});return}if(w===!1){l.push({fieldId:a,userMessage:"This field is invalid",systemMessage:"Field validation resulted in an unspecified error.",value:d});return}}if(S.required&&U(d)){l.push({fieldId:a,userMessage:"This field is required",systemMessage:"Field is required.",value:d});return}if(!S.multiple&&Array.isArray(d)&&d.length>1){l.push({fieldId:a,userMessage:"This field expects a single response",systemMessage:"Field expects a single response.",value:d});return}if(S.options){const w=S.options.map(x=>x.value),P=Array.isArray(d)?d:[d];Array.isArray(d)&&(P.every(x=>w.includes(x))||l.push({fieldId:a,userMessage:"This field expects a valid option",systemMessage:`Field expects a valid option. Valid options are: ${w.join(", ")}`,value:d}))}})),{responsesToCommit:i,validationErrors:l}}async function o(i){const{responsesToCommit:l,validationErrors:a}=await s(i);return a.length?{errors:a}:(u.registerBatch(l),{errors:[]})}const c=e.map(i=>i),m=e.map(i=>Object.keys(i).map(a=>({fieldId:a,value:i[a]})));function v(i){const l=t.fields.getById(i),a=e.map(f=>f[i]||null);return p.combine({f:l,r:a},({f,r:d})=>d||(f!=null&&f.defaultValue?f.defaultValue:null))}function E(i){const l=t.fields.getByName(i);return p.combine({f:l,s:e},({f:a,s:f})=>{const d=a&&f[a.id]||null;return d||(a!=null&&a.defaultValue?a.defaultValue:null)})}return p.sample({clock:r,target:u.clearAll}),p.sample({clock:n,target:u.clear}),{register:g,clearAll:r,clear:n,commit:o,getResponsesToCommit:s,listStore:m,getAllStore:c,getByFieldId:v,getByFieldName:E}});function Be(t){return h.invoke(De,t)}const je=()=>"0.0.1-dev.1764739911676";function $e(){if(k.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!=null&&e.dataset.api)return e.dataset.api}return"https://api.picked.app"}function Ce(){if(!k.supportsWindow())return{};const t=new URLSearchParams(window.location.search),e={},r=new Set;for(const[u]of t.entries())u.startsWith("picked-")&&r.add(u);for(const u of r){const g=u.replace("picked-","");e[g]=t.getAll(u)}const n=F.createStorageKey("s");if(r.size>0)F.sessionStore.set(n,e);else{const u=F.sessionStore.get(n);if(u)return u.json()||{}}return e}function Oe(){if(k.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 Ue=F.createStorageKey("session","global"),Le=()=>{const t=F.localStore.get(Ue);let e;t.isSet()&&(e=t.json());const r=u=>t.set({id:u.id,isUser:u.isUser}),n={id:(e==null?void 0:e.id)??Oe(),isUser:(e==null?void 0:e.isUser)??void 0,setIsUser(u){this.isUser=u,r(this)}};return r(n),n},Ve=()=>k.supportsLocalStorage()?Le():null;class D{constructor(e){y(this,"options");y(this,"isReady",!1);y(this,"project");y(this,"plugins",{});y(this,"eventBus",ke());y(this,"organizationId");y(this,"projectId");y(this,"apiUrl");y(this,"session");y(this,"precondition");y(this,"condition");y(this,"searchParams",Ce());y(this,"history",Se());y(this,"components",se({client:this}));y(this,"experienceInstances",b.createExperienceInstanceIndex({client:this}));y(this,"experiences",Y({client:this}));y(this,"frameworks",ie({client:this}));y(this,"predicates",ge({client:this}));y(this,"features",ye({client:this}));y(this,"responses",Be({client:this}));y(this,"fields",be());y(this,"actions",Re());I.logger("info","Picked client initializing."),this.organizationId=e.organizationId,this.projectId=e.projectId,this.options=Object.freeze(e),this.apiUrl=e.apiUrl||$e(),this.session=Ve(),this.setupPlugins(),this.setupFeatures(),this.setupPredicates(),this.setupActions(),this.precondition=e.precondition,this.condition=e.condition,this.eventBus({type:"load",version:je()}),I.logger("info","Picked client initialized.")}start(){le(this),(async()=>{if(!k.supportsDocument())return;let r=!0,n;this.precondition!==void 0&&await b.evaluateRuleLogic(this,this.precondition)===!1&&(n=!1,r=!1),this.condition!==void 0&&n!==!1&&await b.evaluateRuleLogic(this,this.condition)===!1&&(r=!1),this.session&&this.session.setIsUser(r),this.eventBus({type:"initialize"}),this.eventBus({type:"user_decide",value:r}),document.body&&r&&B(this),await b.domInteractive(),r&&B(this),this.eventBus({type:"ready"}),this.isReady=!0,this.session&&this.eventBus({type:"session",...this.session})})()}registerFramework(e){ae(e,this.frameworks)}registerComponent(e,r){j(e,r,this.components)}registerPlugin(e){X(this,e,this.plugins)}registerFeature(e,r){he(e,r,this.features)}registerPredicate(e,r){fe(e,r,this.predicates)}registerField(e){Ie(e,this.fields)}registerAction(e,r){Pe(e,r,this.actions)}registerExperience(e){e.component&&j(`experience:${e.id}`,e.component,this.components),J(e,this.experiences)}getStateSnapshot(){return M(this)}async launchExperienceById(e){const r=this.experiences.getById(e).getState();if(!r){I.logger("warn",`Experience with id '${e}' not found.`);return}V(this,r)}setupPlugins(){var e;(e=this.options.plugins)==null||e.forEach(r=>{if(Array.isArray(r)){r.forEach(u=>{this.registerPlugin(u)});return}const n=typeof r=="function"?r():r;if(Array.isArray(n)){n.forEach(u=>this.registerPlugin(u));return}this.registerPlugin(n)})}setupFeatures(){const e=this.options.features;e&&(Object.entries(e).forEach(([r,n])=>{const u=typeof n=="function"?n():n;this.registerFeature(r,u)}),this.searchParams.feature&&this.searchParams.feature.forEach(r=>{try{const[n,u]=r.split(":");if(!n||!u)return;let g=u;g==="true"&&(g=!0),g==="false"&&(g=!1),this.registerFeature(n,{key:`${g}`,name:n,decide:()=>g,storage:"session"})}catch{}}))}setupPredicates(){const e=this.options.predicates;e&&Object.entries(e).forEach(([r,n])=>{if(typeof n!="function"){I.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"){I.logger("warn",`Action "${r}" is not a function.`);return}this.registerAction(r,n)})}getPluginConfig(e){return this.plugins[e]??{}}}y(D,"logger",I.logger);function T(t){var e;return((e=t.options)==null?void 0:e.some(r=>"condition"in r))??!1}function Me(t){return t.some(e=>e.condition||T(e))}async function Te(t,e){return e.length===0||!Me(e)?e:(await Promise.all(e.map(async n=>{if(!(n.condition?await b.evaluateRuleLogic(t,n.condition):!0))return null;if(!n.options||!T(n))return n;const s=(await Promise.all(n.options.map(async c=>c.condition?await b.evaluateRuleLogic(t,c.condition)?c:null:c))).filter(c=>c!==null);return s.length===n.options.length?n:s.length===0?null:{...n,options:s}}))).filter(n=>n!==null)}const ze=t=>{const e=new D(t);return k.bindClient(e),e};exports.evaluateRuleLogic=b.evaluateRuleLogic;exports.isPickedRoot=b.isPickedRoot;exports.createStorageKey=F.createStorageKey;exports.localStore=F.localStore;exports.sessionStore=F.sessionStore;exports.subscribe=F.subscribe;exports.supportsCookies=k.supportsCookies;exports.supportsCryptoRandomUUID=k.supportsCryptoRandomUUID;exports.supportsDocument=k.supportsDocument;exports.supportsHistory=k.supportsHistory;exports.supportsIntersectionObserver=k.supportsIntersectionObserver;exports.supportsLocalStorage=k.supportsLocalStorage;exports.supportsLocation=k.supportsLocation;exports.supportsSessionStorage=k.supportsSessionStorage;exports.supportsShadowRoot=k.supportsShadowRoot;exports.supportsWebComponents=k.supportsWebComponents;exports.supportsWindow=k.supportsWindow;exports.Picked=D;exports.createClient=ze;exports.getStepFields=Te;
package/dist/esm/index.js CHANGED
@@ -691,7 +691,7 @@ const Je = F("response"), Qe = k(({ client: t }) => {
691
691
  function Xe(t) {
692
692
  return w(Qe, t);
693
693
  }
694
- const Ze = () => "0.0.1-dev.1764728988965";
694
+ const Ze = () => "0.0.1-dev.1764739911676";
695
695
  function et() {
696
696
  if (q()) {
697
697
  const t = [
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@picked/client",
3
- "version": "0.0.1-dev.1764728988965",
3
+ "version": "0.0.1-dev.1764739911676",
4
4
  "dependencies": {
5
5
  "@withease/factories": "^1.0.5"
6
6
  },