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