@picked/client 0.0.1-dev.1771981674305 → 0.0.1-dev.1772057362040
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/cjs/plugins/create-experience/index.js +1 -1
- package/dist/cjs/server/index.js +1 -1
- package/dist/esm/index.js +630 -552
- package/dist/esm/plugins/create-experience/index.js +194 -228
- package/dist/esm/server/index.js +1 -1
- package/dist/experience-instance-5rr_D--s.cjs +1 -0
- package/dist/experience-instance-CLR80xop.js +819 -0
- package/dist/types/client.d.ts +0 -10
- package/dist/types/client.d.ts.map +1 -1
- package/dist/types/entities/action/action.d.ts +5 -2
- package/dist/types/entities/action/action.d.ts.map +1 -1
- package/dist/types/entities/component/component.d.ts +1 -2
- package/dist/types/entities/component/component.d.ts.map +1 -1
- package/dist/types/entities/experience/experience.d.ts +2 -2
- package/dist/types/entities/experience/experience.d.ts.map +1 -1
- package/dist/types/entities/experience-instance/experience-instance.d.ts +3 -4
- package/dist/types/entities/experience-instance/experience-instance.d.ts.map +1 -1
- package/dist/types/entities/field/field.d.ts +51 -14
- package/dist/types/entities/field/field.d.ts.map +1 -1
- package/dist/types/entities/plugin/plugin.d.ts +1 -4
- package/dist/types/entities/plugin/plugin.d.ts.map +1 -1
- package/dist/types/entities/response/response.d.ts.map +1 -1
- package/dist/types/exports.d.ts +0 -2
- package/dist/types/exports.d.ts.map +1 -1
- package/dist/types/index.d.ts +0 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/picked.d.ts +15 -15
- package/dist/types/picked.d.ts.map +1 -1
- package/dist/types/ping.d.ts.map +1 -1
- package/dist/types/plugins/create-experience/create-experience.d.ts +25 -22
- package/dist/types/plugins/create-experience/create-experience.d.ts.map +1 -1
- package/dist/types/utils/get-step-fields.d.ts +2 -1
- package/dist/types/utils/get-step-fields.d.ts.map +1 -1
- package/dist/types/utils/rules-logic.d.ts.map +1 -1
- package/package.json +1 -7
- package/dist/api-CbXfbi_s.js +0 -19
- package/dist/api-DzSCgBQ2.cjs +0 -1
- package/dist/cjs/plugins/dynamic-experiences/index.js +0 -1
- package/dist/esm/plugins/dynamic-experiences/index.js +0 -102
- package/dist/experience-instance-CU_pYPyd.js +0 -820
- package/dist/experience-instance-D_Mwuzb4.cjs +0 -1
- package/dist/types/entities/component/lazyComponent.d.ts +0 -11
- package/dist/types/entities/component/lazyComponent.d.ts.map +0 -1
- package/dist/types/plugins/dynamic-experiences/hash.d.ts +0 -12
- package/dist/types/plugins/dynamic-experiences/hash.d.ts.map +0 -1
- package/dist/types/plugins/dynamic-experiences/index.d.ts +0 -3
- package/dist/types/plugins/dynamic-experiences/index.d.ts.map +0 -1
- package/dist/types/plugins/dynamic-experiences/plugin.d.ts +0 -23
- package/dist/types/plugins/dynamic-experiences/plugin.d.ts.map +0 -1
- package/dist/types/plugins/dynamic-experiences/types.d.ts +0 -15
- package/dist/types/plugins/dynamic-experiences/types.d.ts.map +0 -1
- package/dist/types/utils/api.d.ts +0 -3
- package/dist/types/utils/api.d.ts.map +0 -1
package/dist/cjs/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const f=require("effector"),S=require("@withease/factories"),b=require("../experience-instance-D_Mwuzb4.cjs"),F=require("../logger-BsmHUUw1.cjs"),w=require("../storage-Be5xWNPC.cjs"),q=require("../api-DzSCgBQ2.cjs"),H=require("../id-BKIWbSTy.cjs"),K=require("../object-BbFTsGh3.cjs"),k=require("../supports-YvpQZxbh.cjs"),M=f.createDomain("experience"),G=S.createFactory(({client:t,experience:e})=>{const r=M.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})),l=t.components.listStore.map(p=>p.find(h=>h.name===`experience:${e.id}`)||p.find(h=>h.name==="experience"),{skipVoid:!1}),o=r.map(p=>({steps:p.steps,nodes:p.nodes,edges:p.edges,conditionals:p.conditionals})),s=r.map(p=>p.fields),d=e.actions??[];return{id:e.id,configStore:i,treeStore:o,fieldsStore:s,componentStore:l,actions:d,merge:n.merge}});function W(t){return S.invoke(G,t)}const J=S.createFactory(({client:t})=>{const e=M.store({}),r=f.createApi(e,{register(o,s){return{...o,[s.id]:s}}});function n(o){const s=e.getState()[o.id];if(s){s.merge({experience:o,strategy:"override"});return}const d=W({client:t,experience:o});r.register(d)}const i=e.map(o=>Object.values(o));function l(o){return e.map(s=>s[o],{skipVoid:!1})}return{register:n,getById:l,listStore:i}});function Y(t){return S.invoke(J,t)}const Q=(t,e)=>{e.register(t)},U=(t,e,r)=>{const{targetSelectors:n}=e.configStore.getState(),i=b.getTargetElements(n,e.id);i.forEach(({elements:o})=>o.forEach(s=>b.tagTargetElement(s,e.id))),b.createAppHosts(i,e.id).forEach(o=>{t.experienceInstances.spawn(e,o,r)})},$=async t=>{await Promise.all(t.experiences.listStore.getState().map(async e=>{await X(t,e)&&U(t,e)}))},X=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},Z=(t,e,r)=>{const n=e.name,i=e.setup(t);if(i){const l=r[n]??{};r[n]=Object.freeze({...l,...i})}},ee=f.createDomain("component"),te=S.createFactory(({client:t,component:e,name:r})=>{const n=t.frameworks.getByName(e.frameworkName);return{name:r,component:e,frameworkStore:n}});function re(t){return S.invoke(te,t)}const ne=S.createFactory(({client:t})=>{const e=ee.store({}),r=f.createApi(e,{register(o,s){return{...o,[s.name]:s}}});function n(o,s){e.getState()[o]&&F.logger("warn",`Component '${o}' already registered. Registering again will override the previous registration.`);const p=re({client:t,name:o,component:s});r.register(p)}const i=e.map(o=>Object.values(o));function l(o){return e.map(s=>s[o],{skipVoid:!1})}return{register:n,getByName:l,listStore:i}});function se(t){return S.invoke(ne,t)}const C=(t,e,r)=>{r.register(t,e)},ie=f.createDomain("framework"),oe=S.createFactory(({client:t})=>{const e=ie.store({}),r=f.createApi(e,{register(o,s){return{...o,[s.name]:s.framework}}});function n(o,s){e.getState()[o]&&F.logger("warn",`Framework '${o}' already registered. Registering again will override the previous registration.`),r.register({name:o,framework:s})}const i=e.map(o=>Object.values(o));function l(o){return e.map(s=>s[o],{skipVoid:!1})}return{register:n,getByName:l,listStore:i}});function ae(t){return S.invoke(oe,t)}const ce=(t,e)=>{e.register(t.name,t)},ue=6e3,le=w.createStorageKey("last_ping","global"),de=async t=>{try{const e=Date.now(),r=w.localStore.get(le);let n=0;if(r.isSet()&&(n=r.json()??0),n&&e-n<ue)return!0;const i={projectId:t.projectId,path:window.location.pathname},l={},s=document.getElementById("picked_script")?.dataset.verceltoken;s&&(l["x-vercel-protection-bypass"]=s);const p=(await q.post(t.apiUrl,"ping",i,l)).ok;return p&&r.set(e),p}catch(e){return F.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 pe=f.createDomain("predicate"),ge=S.createFactory(({client:t})=>{const e=pe.store({}),r=f.createApi(e,{register(s,d){return{...s,[d.name]:{name:d.name,predicate:d.predicate}}}});function n(s,d){e.getState()[s]&&F.logger("warn",`Predicate '${s}' already registered. Registering again will override the previous registration.`),r.register(Object.freeze({name:s,predicate:d}))}const i=e.map(s=>Object.values(s));function l(s){return e.map(d=>d[s]?.predicate,{skipVoid:!1})}function o(s){const d=f.createStore(()=>{},{skipVoid:!1}),p=f.createEffect(async()=>{const h=l(s).getState();if(!h)return;const x=L(t);return(...y)=>h({...x,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:d}),p(),d}return{register:n,getByName:l,listStore:i,getEvokablePredicate:o}});function fe(t){return S.invoke(ge,t)}const me=(t,e,r)=>{r.register(t,e)},D=f.createDomain("feature"),ye=S.createFactory(({client:t})=>{const e=D.store({}),r=D.store([]),n=f.createApi(e,{register(a,c){return{...a,[c.id]:c.feature}}});function i(a,c){e.getState()[a]&&F.logger("warn",`Feature '${a}' already registered. Registering again will override the previous registration.`);const u={id:a,feature:{...c,id:a}};n.register(Object.freeze({id:a,feature:u}))}const l=f.createEffect(async({id:a,key:c,storage:g="local"})=>{const u=w.createStorageKey(`feature:${a}:${c}`,"global"),v=(g==="session"?w.sessionStore:w.localStore).get(u).boolean();return v===null?null:{id:a,key:c,bucket:v,storage:g}}),o=f.createEffect(a=>{if(!a)return null;const c=w.createStorageKey(`feature:${a.id}:${a.key}`,"global");(a.storage==="session"?w.sessionStore:w.localStore).set(c,a.bucket)}),s=new Map,d=f.attach({source:{allFeaturesStore:e,resolvedFeaturesStore:r},effect:async({allFeaturesStore:a,resolvedFeaturesStore:c},{id:g,decide:u,key:m})=>{const v=c.find(P=>P.id===g&&P.key===m);if(v)return v;const E=a[g];if(!E)throw new Error(`Feature with id '${g}' not found`);const A=s.get(`${g}:${m}`);if(A!==void 0){const P=await A;return{id:E.id,bucket:P,key:m,storage:E.feature.storage}}const I=u();s.set(`${g}:${m}`,I);const _=await I;return{id:E.id,bucket:_,key:m,storage:E.feature.storage}}});f.sample({clock:n.register,fn:a=>{const{id:c,feature:g}=a;return{id:c,key:g.feature.key,storage:g.feature.storage}},target:l}),f.sample({source:e,clock:d.doneData,fn:(a,c)=>{const{id:g,bucket:u,storage:m}=c,v=a[g]?.feature.key;return v?{key:v,id:g,bucket:u,storage:m}:null},target:o});const p=f.combine({allFeaturesStore:e,resolvedFeaturesStore:r}).map(({allFeaturesStore:a,resolvedFeaturesStore:c})=>Object.values(a).map(g=>{const u=c.find(m=>m.id===g.id&&m.key===g.feature.key);return u?{id:g.id,name:g.feature.name,key:g.feature.key,getBucket:()=>({id:g.id,bucket:u.bucket}),isResolved:!0}:{id:g.id,name:g.feature.name,key:g.feature.key,getBucket:async()=>await d(g.feature),isResolved:!1}}));f.sample({clock:d.doneData,source:{resolvedFeatures:r},filter:({resolvedFeatures:a},{id:c,key:g})=>!a.some(m=>m.id===c&&m.key===g),fn:(a,c)=>c,target:t.eventBus.prepend(a=>({type:"feature_decide",feature:a}))}),f.sample({clock:[l.doneData,d.doneData],source:r,fn:(a,c)=>!c||a.some(u=>u.id===c.id&&u.key===c.key)?a:[...a,c],target:r});function h(a){return p.map(c=>c.find(g=>g.id===a))}function x(a){return e.map(c=>c[a],{skipVoid:!1})}function y(a){const c=f.createStore(async()=>{},{skipVoid:!1}),g=f.createEffect(async()=>{const u=h(a).getState();if(u)return async()=>(await u.getBucket()).bucket});return f.sample({source:r,filter:u=>u.some(m=>m.id===a),target:g}),f.sample({clock:g.doneData,filter:u=>u!==void 0,target:c}),g(),c}return{register:i,getById:h,getByName:x,listStore:p,getEvokableFeature:y}});function he(t){return S.invoke(ye,t)}const Se=(t,e,r)=>{r.register(t,e)},j=f.createDomain("history");function z(t,e){return{id:H.generateId(`history-entry-${Date.now()}-${Math.random()}}`),node:e,at:Date.now(),experienceId:t}}const ve=S.createFactory(()=>{const t=j.store({entries:[]}),e=j.event(),r=j.event(),n=j.event(),i=j.event();t.on(e,(o,s)=>({entries:[...o.entries,z(s.experienceId,s.node)]})),t.on(r,(o,s)=>({entries:[...o.entries.slice(0,-1),z(s.experienceId,s.node)]})),t.on(i,(o,s)=>s);function l(o,s){const d={lastStepIndex:-1,secondLastStepIndex:-1};for(let p=o.length-1;p>=0;p--){const h=o[p],x=h?.node;if(!(!x||!b.isStepNode(x))&&!(s&&h?.experienceId!==s))if(d.lastStepIndex===-1)d.lastStepIndex=p;else{d.secondLastStepIndex=p;break}}return d}return t.on(n,(o,s)=>{const{secondLastStepIndex:d}=l(o.entries,s.experienceId),p=d!==-1?o.entries.slice(0,d+1):o.entries;return{...o,entries:p}}),{push:e,replace:r,back:n,restore:i,entriesStore:t.map(o=>o.entries)}});function ke(){return S.invoke(ve)}let we=0;const be=t=>{const e=f.createStore([]);return f.sample({clock:t,source:e,fn:(r,n)=>[...r,{id:we++,at:new Date,payload:n}],target:e}),e},Ie=f.createDomain("field"),Fe=S.createFactory(()=>{const t=Ie.store({}),e=f.createApi(t,{register(s,d){return{...s,[d.field.id]:d.field}}});function r(s){e.register({field:s})}function n(s,d){const p=l(s).getState();if(!p)return;const h=Object.assign({},p,{...d});e.register({field:{...h}})}const i=t.map(s=>Object.values(s));function l(s){return t.map(d=>d[s]||null)}function o(s){return t.map(d=>Object.values(d).find(p=>p.name===s)||null)}return{register:r,update:n,getById:l,listStore:i,getByName:o}});function Ee(){return S.invoke(Fe)}const xe=(t,e)=>{e.register(t)},je=f.createDomain("action"),Ae=S.createFactory(()=>{const t=je.store({}),e=f.createApi(t,{register(o,s){return{...o,[s.name]:{name:s.name,action:s.action}}}});function r(o,s){e.register({name:o,action:s})}const n=t.map(o=>Object.values(o));function i(o){return t.map(s=>s[o],{skipVoid:!1})}function l(o){return t.map(s=>{const d=s[o];return d?d.action:void 0},{skipVoid:!1})}return{register:r,getByName:i,listStore:n,getEvokableAction:l}});function Pe(){return S.invoke(Ae)}const Re=(t,e,r)=>{r.register(t,e)};function B(t){return typeof t>"u"||t===null||t===""||Array.isArray(t)&&!t.length}function Be(t){return typeof t=="string"||typeof t=="number"||typeof t=="boolean"||t===null}function O(t){try{return JSON.stringify(t),!0}catch{return!1}}const $e=f.createDomain("response"),Ce=S.createFactory(({client:t})=>{const e=$e.store({}),r=f.createEvent(),n=f.createEvent(),i=f.createApi(e,{register(y,a){return{...y,[a.fieldId]:a.response}},registerBatch(y,a){return{...y,...a}},clear(y,a){const{[a]:c,...g}=y;return g},clearAll(){return{}}});function l(y,a){if(typeof y=="string"){if(a===void 0)throw new Error("Response is required when registering a single field");i.register({fieldId:y,response:a})}else i.registerBatch(y)}async function o(y){const a=[];return await Promise.allSettled(Object.entries(y).map(async([c,g])=>{let u=g;const m=t.fields.getById(c).getState();if(!m){a.push({fieldId:c,userMessage:`Field '${c}' not found`,systemMessage:`No field with ID '${c}' exists. Available field IDs are: ${Object.keys(t.fields.listStore.getState()).join(",")}.`,value:u});return}if(m.multiple&&(typeof u=="string"||typeof u=="number"||typeof u=="boolean")&&(u=[u]),m.validation&&!K.isEmpty(m.validation)&&!B(u)){const v=await b.evaluateRuleLogic(t,m.validation,{$input:u});if(typeof v=="string"){a.push({fieldId:c,userMessage:v,systemMessage:`Field validation resulted in an error: ${v}.`,value:u});return}if(v===!1){a.push({fieldId:c,userMessage:"This field is invalid",systemMessage:"Field validation resulted in an unspecified error.",value:u});return}}if(m.required&&B(u)){a.push({fieldId:c,userMessage:"This field is required",systemMessage:"Field is required.",value:u});return}if(!m.multiple&&Array.isArray(u)&&u.length>1){a.push({fieldId:c,userMessage:"This field expects a single response",systemMessage:"Field expects a single response.",value:u});return}if(m.type==="object"&&!B(u))if(m.multiple){if(!Array.isArray(u)){a.push({fieldId:c,userMessage:"This field expects multiple values",systemMessage:"Field expects an array of objects.",value:u});return}for(const v of u){if(typeof v!="object"||v===null){a.push({fieldId:c,userMessage:"This field expects object values",systemMessage:"Field expects an array of objects, but received non-object value.",value:u});return}if(!O(v)){a.push({fieldId:c,userMessage:"This field contains non-serializable data",systemMessage:"Field value contains non-JSON-serializable data (functions, circular references, etc.).",value:u});return}}}else{if(Array.isArray(u)){a.push({fieldId:c,userMessage:"This field expects a single value",systemMessage:"Field expects a single object, not an array.",value:u});return}if(typeof u!="object"||u===null){a.push({fieldId:c,userMessage:"This field expects an object value",systemMessage:"Field expects an object value.",value:u});return}if(!O(u)){a.push({fieldId:c,userMessage:"This field contains non-serializable data",systemMessage:"Field value contains non-JSON-serializable data (functions, circular references, etc.).",value:u});return}}if(m.options){const v=Array.isArray(u)?u:[u];if(m.type==="object"){const E=m.options.map(I=>JSON.stringify(I.value));v.every(I=>E.includes(JSON.stringify(I)))||a.push({fieldId:c,userMessage:"This field expects a valid option",systemMessage:"Field expects a valid option from the defined choices.",value:u})}else{const E=m.options.map(I=>I.value);v.every(I=>!Be(I)||I===null?!1:E.includes(I))||a.push({fieldId:c,userMessage:"This field expects a valid option",systemMessage:`Field expects a valid option. Valid options are: ${E.join(", ")}`,value:u})}}})),{responsesToCommit:y,validationErrors:a}}async function s(y){const{responsesToCommit:a,validationErrors:c}=await o(y);return c.length?{errors:c}:(i.registerBatch(a),{errors:[]})}const d=e.map(y=>y),p=e.map(y=>Object.keys(y).map(c=>({fieldId:c,value:y[c]})));function h(y){const a=t.fields.getById(y),c=e.map(g=>g[y]||null);return f.combine({f:a,r:c},({f:g,r:u})=>u||(g?.defaultValue?g.defaultValue:null))}function x(y){const a=t.fields.getByName(y);return f.combine({f:a,s:e},({f:c,s:g})=>{const u=c&&g[c.id]||null;return u||(c?.defaultValue?c.defaultValue:null)})}return f.sample({clock:r,target:i.clearAll}),f.sample({clock:n,target:i.clear}),{register:l,clearAll:r,clear:n,commit:s,getResponsesToCommit:o,listStore:p,getAllStore:d,getByFieldId:h,getByFieldName:x}});function De(t){return S.invoke(Ce,t)}const ze=()=>"0.0.1-dev.1771981674305";function Oe(){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?.dataset.api)return e.dataset.api}return"https://api.picked.app"}function Me(){if(!k.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 l=i.replace("picked-","");e[l]=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 Ue(){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 Le=w.createStorageKey("session","global"),Ve=()=>{const t=w.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??Ue(),isUser:e?.isUser??void 0,identifiers:e?.identifiers??void 0,setIsUser(i){this.isUser=i,r(this)},setIdentifier(i,l){this.identifiers={...this.identifiers,[i]:l},r(this)},removeIdentifier(i){this.identifiers&&(this.identifiers=Object.fromEntries(Object.entries(this.identifiers).filter(([l])=>l!==i)),this.identifiers=Object.keys(this.identifiers).length?this.identifiers:void 0,r(this))}};return r(n),n},Te=()=>k.supportsLocalStorage()?Ve():null;function V(){if(k.supportsWindow())return globalThis.window.pickedConfig}function Ne(){if(!k.supportsWindow())return;const t=V(),e=t?.organizationId,r=t?.projectId;return e&&r?{organizationId:e,projectId:r}:void 0}function _e(){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 qe(t){const{organizationId:e,projectId:r}=t;if(e&&r)return{organizationId:e,projectId:r};const n=Ne();if(n)return n;const i=_e();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 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.1772057362040";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
|
|
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;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const f=require("../../../id-BKIWbSTy.cjs"),
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const f=require("../../../id-BKIWbSTy.cjs"),l={serialize(i){return JSON.stringify(i)},deserialize(i){return JSON.parse(i)}},z=i=>({name:"create-experience",setup:o=>{i.experiences.forEach(n=>{const t=n.serialize(),d=l.deserialize(t);d.component=n.component,o.registerExperience(d),d.fields.forEach(g=>{o.registerField(g)})})}}),m=(i,o)=>({id:f.generateId("node"),position:[0,0],experience:o,type:"action",action:i.action,addNext(t){if(!t.node)throw new Error("Cannot connect to node");const d=h({sourceNode:this,destinationNode:t.node,sourceNodeHandle:null},o);o.edges.push(d)},onSuccess(t){if(!t.node)throw new Error("Cannot connect to node");const d=h({sourceNode:this,destinationNode:t.node,sourceNodeHandle:"true"},o);o.edges.push(d)},onFail(t){if(!t.node)throw new Error("Cannot connect to node");const d=h({sourceNode:this,destinationNode:t.node,sourceNodeHandle:"false"},o);o.edges.push(d)},serialize(){return l.serialize({id:this.id,type:this.type,action:this.action,position:this.position})}}),b=i=>({id:i.id??f.generateId("step"),label:i.label,fields:i.fields??[],addField(o){const n="serialize"in o?o:N(o);return this.fields?.includes(n)||this.fields?.push(n),n}}),x=(i,o)=>{const n={id:i.id??f.generateId("step"),label:i.label,experience:o,fields:i.fields??[],node:null,nextStep(t){return this.experience.addStep(t,this)},nextConditional(t){return this.experience.addConditional(t,this)},addNextExperience(t){return this.experience.addExperience(t,this)},addField(t){return this.experience.addField(t,this)},serialize(){return l.serialize({id:this.id,label:this.label,fieldIds:this.fields.map(t=>t.id)})}};return p({step:n,type:"step"},o),n},E=()=>[0,0],p=(i,o)=>{const n={id:f.generateId("node"),position:E(),experience:o};if(i.type==="step"){const d={...n,type:"step",connectedStep:i.step,serialize(){return l.serialize({id:this.id,type:this.type,stepId:this.connectedStep.id,position:this.position,label:this.connectedStep.label})}};return d.connectedStep.node=d,d}if(i.type==="conditional"){const d={...n,type:"conditional",connectedConditional:i.conditional,serialize(){return l.serialize({id:this.id,type:this.type,conditionalId:this.connectedConditional.id,position:this.position})}};return d.connectedConditional.node=d,d}return i.type==="experience"?{...n,type:"experience",connectedExperience:i.experience,serialize(){return l.serialize({id:this.id,type:this.type,experienceId:this.connectedExperience.id,position:this.position})}}:{...n,type:"origin",serialize(){return l.serialize({id:this.id,type:this.type,position:this.position})}}},h=(i,o)=>({id:f.generateId("edge"),sourceNode:i.sourceNode,sourceNodeHandle:i.sourceNodeHandle,destinationNode:i.destinationNode,experience:o,serialize(){return l.serialize({id:this.id,sourceNodeHandle:this.sourceNodeHandle??void 0,sourceNodeId:this.sourceNode.id,destinationNodeId:this.destinationNode.id})}}),y=(i,o)=>{const n={id:f.generateId("conditional"),condition:i.condition,node:null,experience:o,addTrue(t){if(!this.node||!t.node)throw new Error("todo no node");const d=h({sourceNode:this.node,destinationNode:t.node,sourceNodeHandle:"true"},this.experience);this.experience.edges.push(d)},addFalse(t){if(!this.node||!t.node)throw new Error("todo no node");const d=h({sourceNode:this.node,destinationNode:t.node,sourceNodeHandle:"false"},this.experience);this.experience.edges.push(d)},serialize(){return l.serialize({id:this.id,condition:this.condition})}};return p({conditional:n,type:"conditional"},o),n},N=i=>({id:i.id,name:i.name,type:i.type,label:i.label,placeholder:i.placeholder,description:i.description,helpText:i.helpText,defaultValue:i.defaultValue??null,multiple:i.multiple,validation:i.validation??{},condition:i.condition,required:i.required,options:Array.isArray(i.options)?i.options.map(({id:n,...t})=>({id:n??f.generateId("option"),...t})):i.options??null,dependsOn:i.dependsOn,policies:i.policies,serialize(){const n={id:this.id,name:this.name,label:this.label,placeholder:this.placeholder,required:this.required,description:this.description,helpText:this.helpText,validation:this.validation,condition:this.condition,dependsOn:this.dependsOn,policies:this.policies},t=typeof this.defaultValue=="string"?this.defaultValue:void 0,d=typeof this.defaultValue=="number"?this.defaultValue:void 0,g=typeof this.defaultValue=="boolean"?this.defaultValue:void 0,c=e=>this.options?Array.isArray(this.options)?this.options.map(s=>({id:s.id,label:s.label,description:s.description,value:e(s.value),condition:s.condition})):this.options:null;switch(this.type){case"text":if(this.multiple){let e;if(Array.isArray(this.defaultValue)){e=[];for(const s of this.defaultValue)typeof s=="string"&&e.push(s);e.length===0&&(e=void 0)}return l.serialize({...n,type:"text",multiple:!0,defaultValue:e,options:c(s=>`${s}`)})}return l.serialize({...n,type:"text",multiple:!1,defaultValue:t,options:c(e=>`${e}`)});case"number":if(this.multiple){let e;if(Array.isArray(this.defaultValue)){e=[];for(const s of this.defaultValue)typeof s=="number"&&e.push(s);e.length===0&&(e=void 0)}return l.serialize({...n,type:"number",multiple:!0,defaultValue:e,options:c(s=>Number(s))})}return l.serialize({...n,type:"number",multiple:!1,defaultValue:d,options:c(e=>Number(e))});case"boolean":if(this.multiple){let e;if(Array.isArray(this.defaultValue)){e=[];for(const s of this.defaultValue)typeof s=="boolean"&&e.push(s);e.length===0&&(e=void 0)}return l.serialize({...n,type:"boolean",multiple:!0,defaultValue:e,options:c(s=>!!s)})}return l.serialize({...n,type:"boolean",multiple:!1,defaultValue:g,options:c(e=>!!e)});case"object":return this.multiple?l.serialize({...n,type:"object",multiple:!0,defaultValue:this.defaultValue,options:c(e=>e)}):l.serialize({...n,type:"object",multiple:!1,defaultValue:this.defaultValue,options:c(e=>e)});default:throw new Error("Unsupported field type")}}}),V=i=>{const o=[],n=[],t=[],d=[],g=[],c=i.condition??i.decide;return{id:i.id,component:i.component,name:i.name,initializeOpen:i.initializeOpen,condition:c,decide:i.decide,targets:i.targets,steps:o,nodes:n,edges:t,fields:g,conditionals:d,addStep(e,s){let r=s?.node;this.nodes.length===0&&(r=p({type:"origin"},this),this.nodes.push(r));const a="serialize"in e?e:x(e,this);if(r){if(!a.node)throw new Error("todo no node");const u=h({sourceNode:r,destinationNode:a.node,sourceNodeHandle:null},this);this.edges.push(u)}return a.fields.length>0&&a.fields.forEach(u=>{this.fields.includes(u)||this.fields.push(u)}),this.steps.includes(a)||(this.steps.push(a),a.node&&this.nodes.push(a.node)),a},addAction(e,s){let r=s?.node;this.nodes.length===0&&(r=p({type:"origin"},this),this.nodes.push(r));const a="serialize"in e?e:m(e,this);if(r){const u=h({sourceNode:r,destinationNode:a,sourceNodeHandle:null},this);this.edges.push(u)}return this.nodes.push(a),a},addConditional(e,s){let r=s?.node;this.nodes.length===0&&(r=p({type:"origin"},this),this.nodes.push(r));const a="serialize"in e?e:y(e,this);if(r){if(!a.node)throw new Error("todo no node");const u=h({sourceNode:r,destinationNode:a.node,sourceNodeHandle:null},this);this.edges.push(u)}return this.conditionals.includes(a)||(this.conditionals.push(a),a.node&&this.nodes.push(a.node)),a},addExperience(e,s){let r=s?.node;this.nodes.length===0&&(r=p({type:"origin"},this),this.nodes.push(r));const a=p({type:"experience",experience:e},this);if(this.nodes.push(a),r){const u=h({sourceNode:r,destinationNode:a,sourceNodeHandle:null},this);this.edges.push(u)}return e},addField(e,s){const r="serialize"in e?e:N(e);return s&&s.fields.push(r),this.fields.includes(r)||this.fields.push(r),r},serialize(){return l.serialize({id:this.id,component:this.component,name:this.name,initializeOpen:this.initializeOpen,condition:this.condition??this.decide,decide:this.decide,targets:this.targets,steps:this.steps.map(e=>l.deserialize(e.serialize())),nodes:this.nodes.map(e=>l.deserialize(e.serialize())),edges:this.edges.map(e=>l.deserialize(e.serialize())),conditionals:this.conditionals.map(e=>l.deserialize(e.serialize())),fields:this.fields.map(e=>l.deserialize(e.serialize()))})}}};exports.createConditional=y;exports.createEdge=h;exports.createExperience=V;exports.createExperiencePlugin=z;exports.createField=N;exports.createNode=p;exports.createStep=b;exports.serialization=l;
|
package/dist/cjs/server/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("effector"),k=require("../../experience-instance-
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("effector"),k=require("../../experience-instance-5rr_D--s.cjs");function S(){let c,i;return{promise:new Promise((t,o)=>{c=t,i=o}),resolve:t=>c(t),reject:t=>i(t)}}function C(c,i){const{promise:E,resolve:t}=S(),o=r.createEvent(),s=r.createEvent(),l=r.createEvent(),x=r.createEvent(),p=r.createEvent(),f=c.experiences.listStore.map(e=>e.map(n=>k.createExperienceInstance({client:c,experience:n}))),a=r.createStore({currentExperienceIndex:0,renderedExperiences:[],isComplete:!1}),u=r.createEffect(async({experience:e,availableRenderers:n,startRendererIndex:v=0})=>{if(!e)return null;for(let d=v;d<n.length;d++){const g=n[d],m=e.componentStore.getState();if(m&&g?.isValidComponent(m.component))return{rendered:await g.render(m.component,c,e),rendererIndex:d}}return null});a.on(l,(e,n)=>({...e,renderedExperiences:[...e.renderedExperiences,n],currentExperienceIndex:e.currentExperienceIndex+1})).on(p,e=>({...e,currentExperienceIndex:e.currentExperienceIndex+1})).on(x,e=>({...e,isComplete:!0})).reset(o),r.sample({clock:o,target:s}),r.sample({clock:s,source:{experiences:f,state:a},filter:({experiences:e,state:n})=>n.currentExperienceIndex<e.length&&!n.isComplete,fn:({experiences:e,state:n})=>({experience:e[n.currentExperienceIndex],availableRenderers:i,startRendererIndex:0}),target:u}),r.sample({clock:u.doneData,filter:e=>e!==null,fn:e=>e.rendered.body,target:l}),r.sample({clock:l,target:s}),r.sample({clock:u.doneData,filter:e=>e===null,target:p}),r.sample({clock:p,target:s}),r.sample({clock:[s,p,l],source:{experiences:f,state:a},filter:({experiences:e,state:n})=>n.currentExperienceIndex>=e.length,target:x});const I=r.attach({source:a,effect:e=>{e.isComplete&&t(e.renderedExperiences)}});return r.sample({clock:x,target:I}),o(),E}exports.render=C;
|