@picked/client 0.0.1-dev.1773729274420 → 0.0.1-dev.1773804563218
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{api-47L967ES.cjs → api-C90ugp6M.cjs} +1 -1
- package/dist/{api-DuHeVrL4.js → api-CQ1Lb-dB.js} +1 -1
- package/dist/cjs/index.js +2 -2
- package/dist/cjs/plugins/create-experience/index.js +1 -1
- package/dist/cjs/plugins/dynamic-experiences/index.js +1 -1
- package/dist/cjs/plugins/experience-browser-storage/index.js +1 -1
- package/dist/cjs/plugins/history-browser-storage/index.js +1 -1
- package/dist/cjs/plugins/responses-browser-storage/index.js +1 -1
- package/dist/cjs/plugins/responses-indexeddb/index.js +1 -1
- package/dist/cjs/plugins/single-page-app/index.js +1 -1
- package/dist/cjs/server/index.js +1 -1
- package/dist/esm/index.js +738 -742
- package/dist/esm/plugins/create-experience/index.js +359 -286
- package/dist/esm/plugins/dynamic-experiences/index.js +146 -80
- package/dist/esm/plugins/experience-browser-storage/index.js +1 -1
- package/dist/esm/plugins/history-browser-storage/index.js +1 -1
- package/dist/esm/plugins/responses-browser-storage/index.js +1 -1
- package/dist/esm/plugins/responses-indexeddb/index.js +46 -51
- package/dist/esm/plugins/single-page-app/index.js +24 -24
- package/dist/esm/server/index.js +1 -1
- package/dist/{experience-instance-DTyL1fNb.js → experience-instance-8P1fJuPC.js} +306 -312
- package/dist/experience-instance-Bi3-1tP5.cjs +1 -0
- package/dist/object-BbFTsGh3.cjs +1 -0
- package/dist/{object-CJssU1Pm.js → object-JwZ58NOH.js} +1 -1
- package/dist/storage-Be5xWNPC.cjs +1 -0
- package/dist/{storage-B2d81EOI.js → storage-Co_LbKr_.js} +30 -35
- package/dist/types/entities/action/action.d.ts +2 -5
- package/dist/types/entities/action/action.d.ts.map +1 -1
- package/dist/types/entities/condition/condition.d.ts +17 -0
- package/dist/types/entities/condition/condition.d.ts.map +1 -0
- package/dist/types/entities/experience/experience.d.ts +46 -31
- package/dist/types/entities/experience/experience.d.ts.map +1 -1
- package/dist/types/entities/experience-instance/experience-instance.d.ts +2 -2
- package/dist/types/entities/experience-instance/experience-instance.d.ts.map +1 -1
- package/dist/types/entities/feature/feature.d.ts.map +1 -1
- package/dist/types/entities/field/field.d.ts +23 -52
- package/dist/types/entities/field/field.d.ts.map +1 -1
- package/dist/types/entities/history/history.d.ts.map +1 -1
- package/dist/types/entities/project/project.d.ts.map +1 -1
- package/dist/types/entities/response/response.d.ts +9 -7
- package/dist/types/entities/response/response.d.ts.map +1 -1
- package/dist/types/entities/step/step.d.ts +20 -0
- package/dist/types/entities/step/step.d.ts.map +1 -0
- package/dist/types/index.d.ts +2 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/logic-engine.d.ts +8 -2
- package/dist/types/logic-engine.d.ts.map +1 -1
- package/dist/types/picked.d.ts +41 -32
- package/dist/types/picked.d.ts.map +1 -1
- package/dist/types/plugins/create-experience/create-experience.d.ts +70 -43
- package/dist/types/plugins/create-experience/create-experience.d.ts.map +1 -1
- package/dist/types/plugins/create-experience/index.d.ts +1 -1
- package/dist/types/plugins/create-experience/index.d.ts.map +1 -1
- package/dist/types/plugins/create-experience/plugin.d.ts.map +1 -1
- package/dist/types/plugins/dynamic-experiences/plugin.d.ts +20 -5
- package/dist/types/plugins/dynamic-experiences/plugin.d.ts.map +1 -1
- package/dist/types/plugins/dynamic-experiences/types.d.ts +46 -0
- package/dist/types/plugins/dynamic-experiences/types.d.ts.map +1 -1
- package/dist/types/plugins/experience-browser-storage/plugin.d.ts +1 -2
- package/dist/types/plugins/experience-browser-storage/plugin.d.ts.map +1 -1
- package/dist/types/plugins/history-browser-storage/plugin.d.ts +1 -2
- package/dist/types/plugins/history-browser-storage/plugin.d.ts.map +1 -1
- package/dist/types/plugins/responses-browser-storage/plugin.d.ts +1 -2
- package/dist/types/plugins/responses-browser-storage/plugin.d.ts.map +1 -1
- package/dist/types/plugins/responses-indexeddb/plugin.d.ts.map +1 -1
- package/dist/types/plugins/single-page-app/plugin.d.ts +1 -1
- package/dist/types/plugins/single-page-app/plugin.d.ts.map +1 -1
- package/dist/types/utils/dom.d.ts +3 -0
- package/dist/types/utils/dom.d.ts.map +1 -1
- package/dist/types/utils/events.d.ts +2 -2
- package/dist/types/utils/events.d.ts.map +1 -1
- package/dist/types/utils/global-obj.d.ts +1 -0
- package/dist/types/utils/global-obj.d.ts.map +1 -1
- package/dist/types/utils/indexed-db.d.ts +1 -2
- package/dist/types/utils/indexed-db.d.ts.map +1 -1
- package/dist/types/utils/key.d.ts +12 -0
- package/dist/types/utils/key.d.ts.map +1 -0
- package/dist/types/utils/logger.d.ts.map +1 -1
- package/dist/types/utils/node-tree/min-max-steps-to-leaf.d.ts.map +1 -1
- package/dist/types/utils/node-tree/min-max-steps-to-origin.d.ts.map +1 -1
- package/dist/types/utils/node-tree/next-reachable-step-nodes.d.ts +3 -3
- package/dist/types/utils/node-tree/next-reachable-step-nodes.d.ts.map +1 -1
- package/dist/types/utils/nodes.d.ts +2 -2
- package/dist/types/utils/nodes.d.ts.map +1 -1
- package/dist/types/utils/object.d.ts +8 -0
- package/dist/types/utils/object.d.ts.map +1 -1
- package/dist/types/utils/picked-config.d.ts +1 -1
- package/dist/types/utils/picked-config.d.ts.map +1 -1
- package/dist/types/utils/rules-logic.d.ts.map +1 -1
- package/dist/types/utils/search-params.d.ts.map +1 -1
- package/dist/types/utils/storage.d.ts.map +1 -1
- package/package.json +2 -16
- package/dist/experience-instance-BX0aqKsC.cjs +0 -1
- package/dist/object-mwaxtjLG.cjs +0 -1
- package/dist/storage-58NoTSsc.cjs +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";const a="Picked-Client",d="Picked-Version";function s(e,t){return{[a]:e,[d]:t}}const o=()=>"0.0.1-dev.
|
|
1
|
+
"use strict";const a="Picked-Client",d="Picked-Version";function s(e,t){return{[a]:e,[d]:t}}const o=()=>"0.0.1-dev.1773804563218",E="v1";function c(e,t){return new URL(`/api/${E}/${t}`,e).toString()}function i(e){return{...s("sdk",o()),...e}}async function f(e,t,n){const r=c(e,t);return fetch(r,{headers:i(n)})}async function l(e,t,n,r){const u=c(e,t);return fetch(u,{method:"POST",headers:{"Content-Type":"application/json",...i(r)},body:JSON.stringify(n)})}exports.createClientHeaders=s;exports.get=f;exports.getVersion=o;exports.post=l;
|
package/dist/cjs/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const g=require("effector"),S=require("@withease/factories"),F=require("../experience-instance-BX0aqKsC.cjs"),E=require("../logger-BsmHUUw1.cjs"),w=require("../storage-58NoTSsc.cjs"),L=require("../api-47L967ES.cjs"),G=require("../id-BKIWbSTy.cjs"),W=require("../object-mwaxtjLG.cjs"),k=require("../supports-YvpQZxbh.cjs"),N=g.createDomain("experience"),J=S.createFactory(({client:t,experience:e})=>{const r=N.store(e),n=g.createApi(r,{merge(l,h){return{...l,...h.experience}}}),a=r.map(l=>({name:l.name,decisionLogic:l.condition,targetSelectors:l.targets,initializeOpenLogic:e.initializeOpen})),d=t.components.listStore.map(l=>(e.componentName?l.find(h=>h.name===e.componentName):void 0)||l.find(h=>h.name===`experience:${e.id}`)||l.find(h=>h.name==="experience"),{skipVoid:!1}),p=r.map(l=>({steps:l.steps,nodes:l.nodes,edges:l.edges,conditionals:l.conditionals})),u=r.map(l=>l.fields),f=e.actions??[];return{id:e.id,configStore:a,treeStore:p,fieldsStore:u,componentStore:d,actions:f,merge:n.merge}});function Y(t){return S.invoke(J,t)}const Q=S.createFactory(({client:t})=>{const e=N.store({}),r=g.createApi(e,{register(f,l){return{...f,[l.id]:l}}});function n(f){const l=e.getState()[f.id];if(l){l.merge({experience:f,strategy:"override"});return}const h=Y({client:t,experience:f});r.register(h)}const a=e.map(f=>Object.values(f));function d(f){return e.map(l=>l[f],{skipVoid:!1})}const p=g.attach({source:e,effect:async(f,{id:l,options:h})=>{const v=f[l];if(!v){E.logger("warn",`Experience with id '${l}' not found.`);return}if(h?.bypassCondition){z(t,v,h);return}await T(t,v)&&z(t,v,h)}}),u=g.attach({source:t.experienceInstances.listStore,effect:(f,{id:l,options:h})=>{const v=f.filter(y=>y.experienceId===l);if(v.length>0)for(const y of v)y.open();else p({id:l,options:{...h,initialiseOpen:!0}})}});return{register:n,get:d,getById:d,launch:p,open:u,listStore:a}});function X(t){return S.invoke(Q,t)}const Z=(t,e)=>{e.register(t)},z=(t,e,r)=>{const{targetSelectors:n}=e.configStore.getState(),a=F.getTargetElements(n,e.id);a.forEach(({elements:p})=>p.forEach(u=>F.tagTargetElement(u,e.id))),F.createAppHosts(a,e.id).forEach(p=>{r?t.experienceInstances.spawn(e,p,r):t.experienceInstances.spawn(e,p)})},C=async t=>{await Promise.all(t.experiences.listStore.getState().map(async e=>{await T(t,e)&&z(t,e)}))},T=async(t,e)=>{if(!t.preconditionPassed||!t.session?.isUser)return!1;const{decisionLogic:r,targetSelectors:n}=e.configStore.getState();return F.getTargetElements(n,e.id).length<1||n.length===0?!1:r===void 0?!0:F.isRulesLogic(r)?await F.evaluateRuleLogic(t,r)===!0:!0},ee=(t,e,r)=>{const n=e.name,a=e.setup(t);if(a){const d=r[n]??{};r[n]=Object.freeze({...d,...a})}},te=g.createDomain("component"),re=S.createFactory(({client:t,component:e,name:r})=>{const n=t.frameworks.getByName(e.frameworkName);return{name:r,component:e,frameworkStore:n}});function se(t){return S.invoke(re,t)}const ne=S.createFactory(({client:t})=>{const e=te.store({}),r=g.createApi(e,{register(p,u){return{...p,[u.name]:u}}});function n(p,u){e.getState()[p]&&E.logger("warn",`Component '${p}' already registered. Registering again will override the previous registration.`);const l=se({client:t,name:p,component:u});r.register(l)}const a=e.map(p=>Object.values(p));function d(p){return e.map(u=>u[p],{skipVoid:!1})}return{register:n,getByName:d,listStore:a}});function oe(t){return S.invoke(ne,t)}const M=(t,e,r)=>{r.register(t,e)},ie=g.createDomain("framework"),ae=S.createFactory(({client:t})=>{const e=ie.store({}),r=g.createApi(e,{register(p,u){return{...p,[u.name]:u.framework}}});function n(p,u){e.getState()[p]&&E.logger("warn",`Framework '${p}' already registered. Registering again will override the previous registration.`),r.register({name:p,framework:u})}const a=e.map(p=>Object.values(p));function d(p){return e.map(u=>u[p],{skipVoid:!1})}return{register:n,getByName:d,listStore:a}});function ce(t){return S.invoke(ae,t)}const ue=(t,e)=>{e.register(t.name,t)},le=6e3,de=w.createStorageKey("last_ping","global"),pe=async t=>{try{const e=Date.now(),r=w.localStore.get(de);let n=0;if(r.isSet()&&(n=r.json()??0),n&&e-n<le)return!0;const a={projectId:t.projectId,path:window.location.pathname},d={},u=document.getElementById("picked_script")?.dataset.verceltoken;u&&(d["x-vercel-protection-bypass"]=u);const l=(await L.post(t.apiUrl,"ping",a,d)).ok;return l&&r.set(e),l}catch(e){return E.logger("error",e),!1}};function _(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"),ge=S.createFactory(({client:t})=>{const e=fe.store({}),r=g.createApi(e,{register(u,f){return{...u,[f.name]:{name:f.name,predicate:f.predicate}}}});function n(u,f){e.getState()[u]&&E.logger("warn",`Predicate '${u}' already registered. Registering again will override the previous registration.`),r.register(Object.freeze({name:u,predicate:f}))}const a=e.map(u=>Object.values(u));function d(u){return e.map(f=>f[u]?.predicate,{skipVoid:!1})}function p(u){const f=g.createStore(()=>{},{skipVoid:!1}),l=g.createEffect(async()=>{const h=d(u).getState();if(!h)return;const v=_(t);return(...y)=>h({...v,args:y})});return g.sample({source:{responses:t.responses.listStore,fields:t.fields.listStore},target:l}),g.sample({clock:l.doneData,filter:h=>h!==void 0,target:f}),l(),f}return{register:n,getByName:d,listStore:a,getEvokablePredicate:p}});function me(t){return S.invoke(ge,t)}const ye=(t,e,r)=>{r.register(t,e)},O=g.createDomain("feature"),he=S.createFactory(({client:t})=>{const e=O.store({}),r=O.store([]),n=g.createApi(e,{register(c,s){return{...c,[s.id]:s.feature}}});function a(c,s){e.getState()[c]&&E.logger("warn",`Feature '${c}' already registered. Registering again will override the previous registration.`);const i={id:c,feature:{...s,id:c}};n.register(Object.freeze({id:c,feature:i}))}const d=g.createEffect(async({id:c,key:s,storage:o="local"})=>{const i=w.createStorageKey(`feature:${c}:${s}`,"global"),b=(o==="session"?w.sessionStore:w.localStore).get(i).boolean();return b===null?null:{id:c,key:s,bucket:b,storage:o}}),p=g.createEffect(c=>{if(!c)return null;const s=w.createStorageKey(`feature:${c.id}:${c.key}`,"global");(c.storage==="session"?w.sessionStore:w.localStore).set(s,c.bucket)}),u=new Map,f=g.attach({source:{allFeaturesStore:e,resolvedFeaturesStore:r},effect:async({allFeaturesStore:c,resolvedFeaturesStore:s},{id:o,decide:i,key:m})=>{const b=s.find(P=>P.id===o&&P.key===m);if(b)return b;const I=c[o];if(!I)throw new Error(`Feature with id '${o}' not found`);const A=u.get(`${o}:${m}`);if(A!==void 0){const P=await A;return{id:I.id,bucket:P,key:m,storage:I.feature.storage}}const x=i();u.set(`${o}:${m}`,x);const K=await x;return{id:I.id,bucket:K,key:m,storage:I.feature.storage}}});g.sample({clock:n.register,fn:c=>{const{id:s,feature:o}=c;return{id:s,key:o.feature.key,storage:o.feature.storage}},target:d}),g.sample({source:e,clock:f.doneData,fn:(c,s)=>{const{id:o,bucket:i,storage:m}=s,b=c[o]?.feature.key;return b?{key:b,id:o,bucket:i,storage:m}:null},target:p});const l=g.combine({allFeaturesStore:e,resolvedFeaturesStore:r}).map(({allFeaturesStore:c,resolvedFeaturesStore:s})=>Object.values(c).map(o=>{const i=s.find(m=>m.id===o.id&&m.key===o.feature.key);return i?{id:o.id,name:o.feature.name,key:o.feature.key,getBucket:()=>({id:o.id,bucket:i.bucket}),isResolved:!0}:{id:o.id,name:o.feature.name,key:o.feature.key,getBucket:async()=>await f(o.feature),isResolved:!1}}));g.sample({clock:f.doneData,source:{resolvedFeatures:r},filter:({resolvedFeatures:c},{id:s,key:o})=>!c.some(m=>m.id===s&&m.key===o),fn:(c,s)=>s,target:t.eventBus.prepend(c=>({type:"feature_decide",feature:c}))}),g.sample({clock:[d.doneData,f.doneData],source:r,fn:(c,s)=>!s||c.some(i=>i.id===s.id&&i.key===s.key)?c:[...c,s],target:r});function h(c){return l.map(s=>s.find(o=>o.id===c))}function v(c){return e.map(s=>s[c],{skipVoid:!1})}function y(c){const s=g.createStore(async()=>{},{skipVoid:!1}),o=g.createEffect(async()=>{const i=h(c).getState();if(i)return async()=>(await i.getBucket()).bucket});return g.sample({source:r,filter:i=>i.some(m=>m.id===c),target:o}),g.sample({clock:o.doneData,filter:i=>i!==void 0,target:s}),o(),s}return{register:a,getById:h,getByName:v,listStore:l,getEvokableFeature:y}});function Se(t){return S.invoke(he,t)}const ve=(t,e,r)=>{r.register(t,e)},j=g.createDomain("history");function U(t,e){return{id:G.generateId(`history-entry-${Date.now()}-${Math.random()}}`),node:e,at:Date.now(),experienceId:t}}const ke=S.createFactory(()=>{const t=j.store({entries:[]}),e=j.event(),r=j.event(),n=j.event(),a=j.event();t.on(e,(p,u)=>({entries:[...p.entries,U(u.experienceId,u.node)]})),t.on(r,(p,u)=>({entries:[...p.entries.slice(0,-1),U(u.experienceId,u.node)]})),t.on(a,(p,u)=>u);function d(p,u){const f={lastStepIndex:-1,secondLastStepIndex:-1};for(let l=p.length-1;l>=0;l--){const h=p[l],v=h?.node;if(!(!v||!F.isStepNode(v))&&!(u&&h.experienceId!==u))if(f.lastStepIndex===-1)f.lastStepIndex=l;else{f.secondLastStepIndex=l;break}}return f}return t.on(n,(p,u)=>{const{secondLastStepIndex:f}=d(p.entries,u.experienceId),l=f!==-1?p.entries.slice(0,f+1):p.entries;return{...p,entries:l}}),{push:e,replace:r,back:n,restore:a,entriesStore:t.map(p=>p.entries)}});function be(){return S.invoke(ke)}let we=0;const Ie=t=>{const e=g.createStore([]);return g.sample({clock:t,source:e,fn:(r,n)=>[...r,{id:we++,at:new Date,payload:n}],target:e}),e},$=g.createDomain("field");function Fe(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=Array.isArray(t.options)?t.options:null,n=e??{status:"idle",options:r};return{...t,...n,options:n.options??r}}const xe=S.createFactory(({client:t})=>{const e=$.store({}),r=g.createApi(e,{register(s,o){return{...s,[o.field.id]:o.field}},updateById(s,o){const i=s[o.fieldId];return i?{...s,[o.fieldId]:Object.assign({},i,o.updates)}:s}});function n(s){r.register({field:s})}function a(s,o){r.updateById({fieldId:s,updates:o})}const d=$.store({}),p=g.combine(e,d,(s,o)=>Object.values(s).map(i=>B(i,o[i.id])));function u(s){return g.combine(e,d,(o,i)=>{const m=o[s];return m?B(m,i[s]):null})}function f(s){return g.combine(e,d,(o,i)=>{const m=Object.values(o).find(b=>b.name===s);return m?B(m,i[m.id]):null})}const l=$.effect(async({fieldId:s,fieldOptions:o,context:i})=>{if(t&&!Array.isArray(o)&&o!==null){const m=await F.evaluateRuleLogic(t,o,i);return Fe(m)?{fieldId:s,options:m}:{fieldId:s,options:null}}return{fieldId:s,options:Array.isArray(o)?o:null}});d.on(l,(s,{fieldId:o})=>{const i=s[o];return{...s,[o]:{status:"loading",options:i?.status==="resolved"?i.options:null}}}),d.on(l.doneData,(s,{fieldId:o,options:i})=>({...s,[o]:{status:"resolved",options:i}})),d.on(l.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 v=g.createEvent();t&&g.sample({clock:v,source:{states:d,fields:e},filter:({states:s},{fieldId:o,force:i})=>{if(i)return!0;const m=s[o];return!m||m.status==="idle"},fn:({fields:s},{fieldId:o,context:i})=>{const m=s[o]??null;return{fieldId:o,fieldOptions:m?.options??null,context:i}},target:l});function y(s,o){v({fieldId:s,force:o?.force,context:o?.context})}function c(s,o){for(const i of s)v({fieldId:i,force:o?.force,context:o?.context})}return{register:n,update:a,getById:u,listStore:p,getByName:f,resolve:y,resolveAll:c,setWaiting:h}});function Ee(t){return S.invoke(xe,t??{})}const je=(t,e)=>{e.register(t)},Ae=g.createDomain("action"),Pe=S.createFactory(({client:t})=>{const e=Ae.store({}),r=g.createApi(e,{register(u,f){return{...u,[f.name]:{name:f.name,action:f.action}}}});function n(u,f){r.register({name:u,action:f})}const a=e.map(u=>Object.values(u));function d(u){return e.map(f=>f[u],{skipVoid:!1})}function p(u){return e.map(f=>{const l=f[u];return l?l.action:void 0},{skipVoid:!1})}return{register:n,getByName:d,listStore:a,getEvokableAction:p}});function Re(t){return S.invoke(Pe,t)}const $e=(t,e,r)=>{r.register(t,e)};function D(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 V(t){try{return JSON.stringify(t),!0}catch{return!1}}const De=g.createDomain("response"),ze=S.createFactory(({client:t})=>{const e=De.store({}),r=g.createEvent(),n=g.createEvent(),a=g.createApi(e,{register(y,c){return{...y,[c.fieldId]:c.response}},registerBatch(y,c){return{...y,...c}},clear(y,c){const{[c]:s,...o}=y;return o},clearAll(){return{}}});function d(y,c){if(typeof y=="string"){if(c===void 0)throw new Error("Response is required when registering a single field");a.register({fieldId:y,response:c})}else a.registerBatch(y)}async function p(y){const c=[];return await Promise.allSettled(Object.entries(y).map(async([s,o])=>{let i=o;const m=t.fields.getById(s).getState();if(!m){c.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:i});return}if(m.multiple&&(typeof i=="string"||typeof i=="number"||typeof i=="boolean")&&(i=[i]),m.validation&&!W.isEmpty(m.validation)&&!D(i)){const b={...e.getState(),...y},I=await F.evaluateRuleLogic(t,m.validation,{$input:i,responses:b});if(typeof I=="string"){c.push({fieldId:s,userMessage:I,systemMessage:`Field validation resulted in an error: ${I}.`,value:i});return}if(I===!1){c.push({fieldId:s,userMessage:"This field is invalid",systemMessage:"Field validation resulted in an unspecified error.",value:i});return}}if(m.required&&D(i)){c.push({fieldId:s,userMessage:"This field is required",systemMessage:"Field is required.",value:i});return}if(!m.multiple&&Array.isArray(i)&&i.length>1){c.push({fieldId:s,userMessage:"This field expects a single response",systemMessage:"Field expects a single response.",value:i});return}if(m.type==="object"&&!D(i))if(m.multiple){if(!Array.isArray(i)){c.push({fieldId:s,userMessage:"This field expects multiple values",systemMessage:"Field expects an array of objects.",value:i});return}for(const b of i){if(typeof b!="object"||b===null){c.push({fieldId:s,userMessage:"This field expects object values",systemMessage:"Field expects an array of objects, but received non-object value.",value:i});return}if(!V(b)){c.push({fieldId:s,userMessage:"This field contains non-serializable data",systemMessage:"Field value contains non-JSON-serializable data (functions, circular references, etc.).",value:i});return}}}else{if(Array.isArray(i)){c.push({fieldId:s,userMessage:"This field expects a single value",systemMessage:"Field expects a single object, not an array.",value:i});return}if(typeof i!="object"||i===null){c.push({fieldId:s,userMessage:"This field expects an object value",systemMessage:"Field expects an object value.",value:i});return}if(!V(i)){c.push({fieldId:s,userMessage:"This field contains non-serializable data",systemMessage:"Field value contains non-JSON-serializable data (functions, circular references, etc.).",value:i});return}}if(Array.isArray(m.options)&&m.options.length>0){const b=Array.isArray(i)?i:[i];if(m.type==="object"){const I=m.options.map(x=>JSON.stringify(x.value));b.every(x=>I.includes(JSON.stringify(x)))||c.push({fieldId:s,userMessage:"This field expects a valid option",systemMessage:"Field expects a valid option from the defined choices.",value:i})}else{const I=m.options.map(x=>x.value);b.every(x=>!Be(x)||x===null?!1:I.includes(x))||c.push({fieldId:s,userMessage:"This field expects a valid option",systemMessage:`Field expects a valid option. Valid options are: ${I.join(", ")}`,value:i})}}})),{responsesToCommit:y,validationErrors:c}}async function u(y){const{responsesToCommit:c,validationErrors:s}=await p(y);return s.length?{errors:s}:(a.registerBatch(c),{errors:[]})}const f=e.map(y=>y),l=e.map(y=>Object.keys(y).map(s=>({fieldId:s,value:y[s]})));function h(y){const c=t.fields.getById(y),s=e.map(o=>o[y]||null);return g.combine({f:c,r:s},({f:o,r:i})=>i||(o?.defaultValue?o.defaultValue:null))}function v(y){const c=t.fields.getByName(y);return g.combine({f:c,s:e},({f:s,s:o})=>{const i=s&&o[s.id]||null;return i||(s?.defaultValue?s.defaultValue:null)})}return g.sample({clock:r,target:a.clearAll}),g.sample({clock:n,target:a.clear}),{register:d,clearAll:r,clear:n,commit:u,getResponsesToCommit:p,listStore:l,getAllStore:f,getByFieldId:h,getByFieldName:v}});function Ce(t){return S.invoke(ze,t)}function Me(){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 Oe(){if(!k.supportsWindow())return{};const t=new URLSearchParams(window.location.search),e={},r=new Set;for(const[a]of t.entries())a.startsWith("picked-")&&r.add(a);for(const a of r){const d=a.replace("picked-","");e[d]=t.getAll(a)}const n=w.createStorageKey("s");if(r.size>0)w.sessionStore.set(n,e);else{const a=w.sessionStore.get(n);if(a)return a.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 Ve=w.createStorageKey("session","global"),Le=()=>{const t=w.localStore.get(Ve);let e;t.isSet()&&(e=t.json());const r=a=>t.set({id:a.id,isUser:a.isUser,identifiers:a.identifiers}),n={id:e?.id??Ue(),isUser:e?.isUser??void 0,identifiers:e?.identifiers??void 0,setIsUser(a){this.isUser=a,r(this)},setIdentifier(a,d){this.identifiers={...this.identifiers,[a]:d},r(this)},removeIdentifier(a){this.identifiers&&(this.identifiers=Object.fromEntries(Object.entries(this.identifiers).filter(([d])=>d!==a)),this.identifiers=Object.keys(this.identifiers).length?this.identifiers:void 0,r(this))}};return r(n),n},Ne=()=>k.supportsLocalStorage()?Le():null;function q(){if(k.supportsWindow())return globalThis.window.pickedConfig}function Te(){if(!k.supportsWindow())return;const t=q(),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=Te();if(n)return n;const a=_e();if(a)return a;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"),S=require("@withease/factories"),I=require("../experience-instance-Bi3-1tP5.cjs"),E=require("../logger-BsmHUUw1.cjs"),v=require("../storage-Be5xWNPC.cjs"),L=require("../api-C90ugp6M.cjs"),W=require("../id-BKIWbSTy.cjs"),J=require("../object-BbFTsGh3.cjs"),b=require("../supports-YvpQZxbh.cjs"),D=g.createDomain("experience"),Y=S.createFactory(({client:t,experience:e})=>{const r=D.store(e),n=g.createApi(r,{merge(f,p){return{...f,...p.experience}}}),i=r.map(f=>({name:f.name,decisionLogic:f.condition,targetSelectors:f.targets,initializeOpenLogic:e.initializeOpen})),u=e.component?{name:`experience:${e.id}`,component:e.component,frameworkStore:t.frameworks.getByName(e.component.frameworkName)}:void 0,s=t.components.listStore.map(f=>u||(e.componentName?f.find(p=>p.name===e.componentName):void 0)||f.find(p=>p.name===`experience:${e.id}`)||f.find(p=>p.name==="experience"),{skipVoid:!1}),o=r.map(f=>({steps:f.steps,nodes:f.nodes,edges:f.edges,conditions:f.conditions??f.conditionals??[]})),l=e.actions??[];return{id:e.id,key:e.key,name:e.name,configStore:i,treeStore:o,componentStore:s,actions:l,merge:n.merge}});function Q(t){return S.invoke(Y,t)}const X=S.createFactory(({client:t})=>{const e=D.store({}),r=D.store({}),n=g.createApi(e,{register(p,k){return{...p,[k.id]:k}}}),i=g.createApi(r,{register(p,{key:k,id:w}){return{...p,[k]:w}}});function u(p){const k=e.getState()[p.id];if(k){k.merge({experience:p,strategy:"override"}),p.key&&i.register({key:p.key,id:p.id});return}const w=Q({client:t,experience:p});n.register(w),p.key&&i.register({key:p.key,id:p.id})}const s=e.map(p=>Object.values(p));function o(p){return g.combine(e,r,(k,w)=>k[p]??k[w[p]??""],{skipVoid:!1})}const l=g.attach({source:{experiences:e,keys:r},effect:async({experiences:p,keys:k},{id:w,options:m})=>{const a=p[w]??p[k[w]??""];if(!a){E.logger("warn",`Experience with id '${w}' not found.`);return}if(m?.bypassCondition){$(t,a,m);return}await _(t,a)&&$(t,a,m)}}),f=g.attach({source:{instances:t.experienceInstances.listStore,keys:r},effect:({instances:p,keys:k},{id:w,options:m})=>{const a=k[w]??w,c=p.filter(d=>d.experienceId===a);if(c.length>0)for(const d of c)d.open();else l({id:a,options:{...m,initialiseOpen:!0}})}});return{register:u,get:o,getById:o,launch:l,open:f,listStore:s}});function Z(t){return S.invoke(X,t)}const ee=(t,e)=>{e.register(t)},$=(t,e,r)=>{const{targetSelectors:n}=e.configStore.getState(),i=I.getTargetElements(n,e.id);i.forEach(({elements:s})=>s.forEach(o=>I.tagTargetElement(o,e.id))),I.createAppHosts(i,e.id).forEach(s=>{r?t.experienceInstances.spawn(e,s,r):t.experienceInstances.spawn(e,s)})},M=async t=>{await Promise.all(t.experiences.listStore.getState().map(async e=>{await _(t,e)&&$(t,e)}))},_=async(t,e)=>{if(!t.preconditionPassed||!t.session?.isUser)return!1;const{decisionLogic:r,targetSelectors:n}=e.configStore.getState();return I.getTargetElements(n,e.id).length<1||n.length===0?!1:r===void 0?!0:I.isRulesLogic(r)?await I.evaluateRuleLogic(t,r)===!0:!0},te=(t,e,r)=>{const n=e.name,i=e.setup(t);if(i){const u=r[n]??{};r[n]=Object.freeze({...u,...i})}},re=g.createDomain("component"),ne=S.createFactory(({client:t,component:e,name:r})=>{const n=t.frameworks.getByName(e.frameworkName);return{name:r,component:e,frameworkStore:n}});function se(t){return S.invoke(ne,t)}const ie=S.createFactory(({client:t})=>{const e=re.store({}),r=g.createApi(e,{register(s,o){return{...s,[o.name]:o}}});function n(s,o){e.getState()[s]&&E.logger("warn",`Component '${s}' already registered. Registering again will override the previous registration.`);const f=se({client:t,name:s,component:o});r.register(f)}const i=e.map(s=>Object.values(s));function u(s){return e.map(o=>o[s],{skipVoid:!1})}return{register:n,getByName:u,listStore:i}});function oe(t){return S.invoke(ie,t)}const U=(t,e,r)=>{r.register(t,e)},ae=g.createDomain("framework"),ce=S.createFactory(({client:t})=>{const e=ae.store({}),r=g.createApi(e,{register(s,o){return{...s,[o.name]:o.framework}}});function n(s,o){e.getState()[s]&&E.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 u(s){return e.map(o=>o[s],{skipVoid:!1})}return{register:n,getByName:u,listStore:i}});function ue(t){return S.invoke(ce,t)}const de=(t,e)=>{e.register(t.name,t)},le=6e3,pe=v.createStorageKey("last_ping","global"),fe=async t=>{try{const e=Date.now(),r=v.localStore.get(pe);let n=0;if(r.isSet()&&(n=r.json()??0),n&&e-n<le)return!0;const i={projectId:t.projectId,path:window.location.pathname},u={},o=document.getElementById("picked_script")?.dataset.verceltoken;o&&(u["x-vercel-protection-bypass"]=o);const f=(await L.post(t.apiUrl,"ping",i,u)).ok;return f&&r.set(e),f}catch(e){return E.logger("error",e),!1}};function q(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 ge=g.createDomain("predicate"),me=S.createFactory(({client:t})=>{const e=ge.store({}),r=g.createApi(e,{register(o,l){return{...o,[l.name]:{name:l.name,predicate:l.predicate}}}});function n(o,l){e.getState()[o]&&E.logger("warn",`Predicate '${o}' already registered. Registering again will override the previous registration.`),r.register(Object.freeze({name:o,predicate:l}))}const i=e.map(o=>Object.values(o));function u(o){return e.map(l=>l[o]?.predicate,{skipVoid:!1})}function s(o){const l=g.createStore(()=>{},{skipVoid:!1}),f=g.createEffect(async()=>{const p=u(o).getState();if(!p)return;const k=q(t);return(...w)=>p({...k,args:w})});return g.sample({source:{responses:t.responses.listStore,fields:t.fields.listStore},target:f}),g.sample({clock:f.doneData,filter:p=>p!==void 0,target:l}),f(),l}return{register:n,getByName:u,listStore:i,getEvokablePredicate:s}});function ye(t){return S.invoke(me,t)}const he=(t,e,r)=>{r.register(t,e)},V=g.createDomain("feature"),Se=S.createFactory(({client:t})=>{const e=V.store({}),r=V.store([]),n=g.createApi(e,{register(m,a){return{...m,[a.id]:a.feature}}});function i(m,a){e.getState()[m]&&E.logger("warn",`Feature '${m}' already registered. Registering again will override the previous registration.`);const d={id:m,feature:{...a,id:m}};n.register(Object.freeze({id:m,feature:d}))}const u=g.createEffect(async({id:m,key:a,storage:c="local"})=>{const d=v.createStorageKey(`feature:${m}:${a}`,"global"),h=(c==="session"?v.sessionStore:v.localStore).get(d).boolean();return h===null?null:{id:m,key:a,bucket:h,storage:c}}),s=g.createEffect(m=>{if(!m)return null;const a=v.createStorageKey(`feature:${m.id}:${m.key}`,"global");(m.storage==="session"?v.sessionStore:v.localStore).set(a,m.bucket)}),o=new Map,l=g.attach({source:{allFeaturesStore:e,resolvedFeaturesStore:r},effect:async({allFeaturesStore:m,resolvedFeaturesStore:a},{id:c,decide:d,key:y})=>{const h=a.find(A=>A.id===c&&A.key===y);if(h)return h;const F=m[c];if(!F)throw new Error(`Feature with id '${c}' not found`);const j=o.get(`${c}:${y}`);if(j!==void 0){const A=await j;return{id:F.id,bucket:A,key:y,storage:F.feature.storage}}const x=d();o.set(`${c}:${y}`,x);const P=await x;return{id:F.id,bucket:P,key:y,storage:F.feature.storage}}});g.sample({clock:n.register,fn:m=>{const{id:a,feature:c}=m;return{id:a,key:c.feature.key,storage:c.feature.storage}},target:u}),g.sample({source:e,clock:l.doneData,fn:(m,a)=>{const{id:c,bucket:d,storage:y}=a,h=m[c]?.feature.key;return h?{key:h,id:c,bucket:d,storage:y}:null},target:s});const f=g.combine({allFeaturesStore:e,resolvedFeaturesStore:r}).map(({allFeaturesStore:m,resolvedFeaturesStore:a})=>Object.values(m).map(c=>{const d=a.find(y=>y.id===c.id&&y.key===c.feature.key);return d?{id:c.id,name:c.feature.name,key:c.feature.key,getBucket:()=>({id:c.id,bucket:d.bucket}),isResolved:!0}:{id:c.id,name:c.feature.name,key:c.feature.key,getBucket:async()=>await l(c.feature),isResolved:!1}}));g.sample({clock:l.doneData,source:{resolvedFeatures:r},filter:({resolvedFeatures:m},{id:a,key:c})=>!m.some(y=>y.id===a&&y.key===c),fn:(m,a)=>a,target:t.eventBus.prepend(m=>({type:"feature_decide",feature:m}))}),g.sample({clock:[u.doneData,l.doneData],source:r,fn:(m,a)=>!a||m.some(d=>d.id===a.id&&d.key===a.key)?m:[...m,a],target:r});function p(m){return f.map(a=>a.find(c=>c.id===m))}function k(m){return e.map(a=>a[m],{skipVoid:!1})}function w(m){const a=g.createStore(async()=>{},{skipVoid:!1}),c=g.createEffect(async()=>{const d=p(m).getState();if(d)return async()=>(await d.getBucket()).bucket});return g.sample({source:r,filter:d=>d.some(y=>y.id===m),target:c}),g.sample({clock:c.doneData,filter:d=>d!==void 0,target:a}),c(),a}return{register:i,getById:p,getByName:k,listStore:f,getEvokableFeature:w}});function ke(t){return S.invoke(Se,t)}const be=(t,e,r)=>{r.register(t,e)},C=g.createDomain("history");function N(t,e){return{id:W.generateId(`history-entry-${Date.now()}-${Math.random()}}`),node:e,at:Date.now(),experienceId:t}}const we=S.createFactory(()=>{const t=C.store({entries:[]}),e=C.event(),r=C.event(),n=C.event(),i=C.event();t.on(e,(s,o)=>({entries:[...s.entries,N(o.experienceId,o.node)]})),t.on(r,(s,o)=>({entries:[...s.entries.slice(0,-1),N(o.experienceId,o.node)]})),t.on(i,(s,o)=>o);function u(s,o){const l={lastStepIndex:-1,secondLastStepIndex:-1};for(let f=s.length-1;f>=0;f--){const p=s[f],k=p?.node;if(!(!k||!I.isStepNode(k))&&!(o&&p?.experienceId!==o))if(l.lastStepIndex===-1)l.lastStepIndex=f;else{l.secondLastStepIndex=f;break}}return l}return t.on(n,(s,o)=>{const{secondLastStepIndex:l}=u(s.entries,o.experienceId),f=l!==-1?s.entries.slice(0,l+1):s.entries;return{...s,entries:f}}),{push:e,replace:r,back:n,restore:i,entriesStore:t.map(s=>s.entries)}});function ve(){return S.invoke(we)}let Ie=0;const Fe=t=>{const e=g.createStore([]);return g.sample({clock:t,source:e,fn:(r,n)=>[...r,{id:Ie++,at:new Date,payload:n}],target:e}),e},Ee=g.createDomain("field"),je=S.createFactory(()=>{const t=Ee.store({}),e=g.createApi(t,{register(l,f){return{...l,[f.field.id]:f.field}}});function r(l){e.register({field:l})}function n(l,f){const p=t.getState()[l]??null;if(!p)return;const k=Object.assign({},p,{...f});e.register({field:{...k}})}const i=t.map(l=>Object.values(l));function u(l){return t.map(f=>f[l]??null)}function s(l){return t.map(f=>Object.values(f).find(p=>p.key===l)??null)}function o(l){return t.map(f=>Object.values(f).find(p=>p.name===l)??null)}return{register:r,update:n,getById:u,getByKey:s,listStore:i,getByName:o}});function xe(){return S.invoke(je)}const Ae=(t,e)=>{e.register(t)},Pe=g.createDomain("step"),Ce=S.createFactory(()=>{const t=Pe.store({}),e=g.createApi(t,{register(u,s){return{...u,[s.step.id]:s.step}}});function r(u){e.register({step:u})}const n=t.map(u=>Object.values(u));function i(u){return t.map(s=>s[u]??null)}return{register:r,getById:i,listStore:n}});function Be(){return S.invoke(Ce)}function De(t,e){e.register(t)}const $e=g.createDomain("action"),ze=S.createFactory(()=>{const t=$e.store({}),e=g.createApi(t,{register(s,o){return{...s,[o.name]:{name:o.name,action:o.action}}}});function r(s,o){e.register({name:s,action:o})}const n=t.map(s=>Object.values(s));function i(s){return t.map(o=>o[s],{skipVoid:!1})}function u(s){return t.map(o=>{const l=o[s];return l?l.action:void 0},{skipVoid:!1})}return{register:r,getByName:i,listStore:n,getEvokableAction:u}});function Re(){return S.invoke(ze)}const Oe=(t,e,r)=>{r.register(t,e)};function z(t){return typeof t>"u"||t===null||t===""||Array.isArray(t)&&!t.length}function Me(t){return typeof t=="string"||typeof t=="number"||typeof t=="boolean"||t===null}function T(t){try{return JSON.stringify(t),!0}catch{return!1}}function Ue(t,e){return e.find(r=>r.id===t)??e.find(r=>r.key===t)??null}function Ve(t,e){return t.multiple&&(typeof e=="string"||typeof e=="number"||typeof e=="boolean")?[e]:e}function Ne(t,e,r){if(t.type!=="object"||z(r))return null;if(t.multiple){if(!Array.isArray(r))return{fieldId:e,userMessage:"This field expects multiple values",systemMessage:"Field expects an array of objects.",value:r};for(const n of r){if(typeof n!="object"||n===null)return{fieldId:e,userMessage:"This field expects object values",systemMessage:"Field expects an array of objects, but received non-object value.",value:r};if(!T(n))return{fieldId:e,userMessage:"This field contains non-serializable data",systemMessage:"Field value contains non-JSON-serializable data (functions, circular references, etc.).",value:r}}return null}return Array.isArray(r)?{fieldId:e,userMessage:"This field expects a single value",systemMessage:"Field expects a single object, not an array.",value:r}:typeof r!="object"||r===null?{fieldId:e,userMessage:"This field expects an object value",systemMessage:"Field expects an object value.",value:r}:T(r)?null:{fieldId:e,userMessage:"This field contains non-serializable data",systemMessage:"Field value contains non-JSON-serializable data (functions, circular references, etc.).",value:r}}function Te(t,e,r){if(!Array.isArray(t.options)||t.options.length===0)return null;const n=Array.isArray(r)?r:[r];if(t.type==="object"){const s=t.options.map(l=>JSON.stringify(l.value));return n.every(l=>s.includes(JSON.stringify(l)))?null:{fieldId:e,userMessage:"This field expects a valid option",systemMessage:"Field expects a valid option from the defined choices.",value:r}}const i=t.options.map(s=>s.value);return n.every(s=>!Me(s)||s===null?!1:i.includes(s))?null:{fieldId:e,userMessage:"This field expects a valid option",systemMessage:`Field expects a valid option. Valid options are: ${i.join(", ")}`,value:r}}const Le=g.createDomain("response"),_e=S.createFactory(({client:t})=>{const e=Le.store({}),r=g.createEvent(),n=g.createEvent(),i=g.createApi(e,{register(a,c){return{...a,[c.fieldId]:c.response}},registerBatch(a,c){return{...a,...c}},clear(a,c){return Object.fromEntries(Object.entries(a).filter(([d])=>d!==c))},clearAll(){return{}}});function u(a,c){if(typeof a=="string"){if(c===void 0)throw new Error("Response is required when registering a single field");i.register({fieldId:a,response:c})}else i.registerBatch(a)}async function s(a,c,d){if(a.validation&&!J.isEmpty(a.validation)&&!z(d)){const y=await I.evaluateRuleLogic(t,a.validation,{$input:d});if(typeof y=="string")return{fieldId:c,userMessage:y,systemMessage:`Field validation resulted in an error: ${y}.`,value:d};if(y===!1)return{fieldId:c,userMessage:"This field is invalid",systemMessage:"Field validation resulted in an unspecified error.",value:d}}return a.required&&z(d)?{fieldId:c,userMessage:"This field is required",systemMessage:"Field is required.",value:d}:!a.multiple&&Array.isArray(d)&&d.length>1?{fieldId:c,userMessage:"This field expects a single response",systemMessage:"Field expects a single response.",value:d}:null}async function o(a){const c=[],d={},y=t.fields.listStore.getState();return await Promise.allSettled(Object.entries(a).map(async([h,F])=>{const j=Ue(h,y);if(!j){c.push({fieldId:h,userMessage:`Field '${h}' not found`,systemMessage:`No field with ID or key '${h}' exists. Available field IDs are: ${y.map(G=>G.id).join(",")}.`,value:F});return}const x=j.id,P=Ve(j,F),A=await s(j,x,P);if(A){c.push(A);return}const R=Ne(j,x,P);if(R){c.push(R);return}const O=Te(j,x,P);O&&c.push(O),d[x]=F})),{responsesToCommit:d,validationErrors:c}}async function l(a){const{responsesToCommit:c,validationErrors:d}=await o(a);return d.length?{errors:d}:(i.registerBatch(c),{errors:[]})}const f=e.map(a=>a),p=g.combine({responses:e,fields:t.fields.listStore},({responses:a,fields:c})=>Object.entries(a).map(([d,y])=>{const h=c.find(F=>F.id===d);return{fieldId:d,fieldKey:h?.key??d,value:y}}));function k(a){const c=t.fields.listStore.map(y=>y.find(h=>h.id===a)??null),d=e.map(y=>y[a]??null);return g.combine({f:c,r:d},({f:y,r:h})=>h!==null?h:y?.defaultValue?y.defaultValue:null)}function w(a){const c=t.fields.getByKey(a);return g.combine({f:c,s:e},({f:d,s:y})=>{const h=d?y[d.id]??null:null;return h||(d?.defaultValue?d.defaultValue:null)})}function m(a){const c=t.fields.getByName(a);return g.combine({f:c,s:e},({f:d,s:y})=>{const h=d&&y[d.id]||null;return h||(d?.defaultValue?d.defaultValue:null)})}return g.sample({clock:r,target:i.clearAll}),g.sample({clock:n,target:i.clear}),{register:u,clearAll:r,clear:n,commit:l,getResponsesToCommit:o,listStore:p,getAllStore:f,getByFieldId:k,getByFieldKey:w,getByFieldName:m}});function qe(t){return S.invoke(_e,t)}const He=g.createDomain("condition"),Ke=S.createFactory(()=>{const t=He.store({}),e=g.createApi(t,{register(s,o){return{...s,[o.condition.id]:o.condition}}});function r(s){e.register({condition:s})}const n=t.map(s=>Object.values(s));function i(s){return t.map(o=>o[s]??null)}function u(s){return t.map(o=>Object.values(o).find(l=>l.key===s)??null)}return{register:r,getById:i,getByKey:u,listStore:n}});function Ge(){return S.invoke(Ke)}function We(){if(b.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 Je(){if(!b.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 u=i.replace("picked-","");e[u]=t.getAll(i)}const n=v.createStorageKey("s");if(r.size>0)v.sessionStore.set(n,e);else{const i=v.sessionStore.get(n);if(i)return i.json()||{}}return e}function Ye(){if(b.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 Qe=v.createStorageKey("session","global"),Xe=()=>{const t=v.localStore.get(Qe);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??Ye(),isUser:e?.isUser??void 0,identifiers:e?.identifiers??void 0,setIsUser(i){this.isUser=i,r(this)},setIdentifier(i,u){this.identifiers={...this.identifiers,[i]:u},r(this)},removeIdentifier(i){this.identifiers&&(this.identifiers=Object.fromEntries(Object.entries(this.identifiers).filter(([u])=>u!==i)),this.identifiers=Object.keys(this.identifiers).length?this.identifiers:void 0,r(this))}};return r(n),n},Ze=()=>b.supportsLocalStorage()?Xe():null;function H(){if(b.supportsWindow())return globalThis.window.pickedConfig}function et(){if(!b.supportsWindow())return;const t=H(),e=t?.organizationId,r=t?.projectId;return e&&r?{organizationId:e,projectId:r}:void 0}function tt(){if(!b.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 rt(t){const{organizationId:e,projectId:r}=t;if(e&&r)return{organizationId:e,projectId:r};const n=et();if(n)return n;const i=tt();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 B(t){return t==null||t===""||Number.isNaN(t)}const nt={default:(t,e)=>B(t)?String(e??""):String(t),append:(t,e)=>e&&!B(t)?`${t} ${e}`:t,prepend:(t,e)=>e&&!B(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 st(t){return typeof t=="object"&&t!==null}function it(t,e){let r=e;for(const n of t.split("."))if(st(r)&&n in r)r=r[n];else return;return typeof r=="function"?r():r}function ot(t,e){const r=t.split("|").map(u=>u.trim()),n=r.shift()??"";let i=it(n,e);for(const u of r){const[s,...o]=u.split(":"),l=s?.trim()??"",f=o.join(":").trim().replaceAll(/(?:^['"]|['"]$)/g,""),p=nt[l];p&&(i=p(i,f))}return B(i)?"":typeof i=="object"?JSON.stringify(i):String(i)}function at(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+=ot(i.trim(),e)}else r+=t[n++];return r}class K{static logger=E.logger;options;isReady=!1;project;plugins={};pluginStartHooks=[];eventBus=g.createEvent();events;organizationId;projectId;apiUrl;dashboardUrl;documentationSiteUrl;session;precondition;condition;preconditionPassed;searchParams=Je();history=ve();components=oe({client:this});experienceInstances=I.createExperienceInstanceIndex({client:this});experiences=Z({client:this});frameworks=ue({client:this});predicates=ye({client:this});features=ke({client:this});conditions=Ge();fields=xe();responses=qe({client:this});steps=Be();actions=Re();constructor(e){E.logger("info","Picked client initializing."),this.events=Fe(this.eventBus);const{organizationId:r,projectId:n}=rt(e);this.organizationId=r,this.projectId=n,this.options=Object.freeze(e),this.apiUrl=e.apiUrl||We(),this.dashboardUrl=e.dashboardUrl??"https://dashboard.picked.app",this.documentationSiteUrl=e.documentationSiteUrl??"https://docs.picked.app",this.session=Ze(),this.setupPlugins(),this.setupFeatures(),this.setupPredicates(),this.setupActions(),this.setupComponents(),this.precondition=e.precondition,this.condition=e.condition,this.eventBus({type:"load",version:L.getVersion()}),E.logger("info","Picked client initialized.")}start=()=>{fe(this),(async()=>{if(!b.supportsDocument())return;await this.runPluginStartHooks();const r=await this.evaluateGate(this.precondition);this.preconditionPassed=r;let n;r&&(n=await this.evaluateGate(this.condition));const i=r&&n===!0;if(typeof n=="boolean"&&this.session){const u=n;this.session.setIsUser(u),this.eventBus({type:"user_decide",value:u})}if(this.eventBus({type:"initialize"}),i&&M(this),await I.domInteractive(),i&&M(this),this.eventBus({type:"ready"}),this.isReady=!0,this.session){const{id:u,isUser:s,identifiers:o}=this.session;this.eventBus({type:"session",id:u,isUser:s,identifiers:o})}})()};registerFramework=e=>{de(e,this.frameworks)};registerComponent=(e,r)=>{U(e,r,this.components)};registerPlugin=e=>{te(this,e,this.plugins);const r=this.plugins[e.name];r?.onStart&&this.pluginStartHooks.push(r.onStart)};registerFeature=(e,r)=>{be(e,r,this.features)};registerPredicate=(e,r)=>{he(e,r,this.predicates)};registerCondition=e=>{this.conditions.register(e)};registerField=e=>{Ae(e,this.fields)};registerStep=e=>{De(e,this.steps)};registerAction=(e,r)=>{Oe(e,r,this.actions)};registerExperience=e=>{e.component&&U(`experience:${e.id}`,e.component,this.components),ee(e,this.experiences)};getStateSnapshot=()=>q(this);launchExperienceById=async(e,r)=>{this.experiences.launch({id:e,options:r})};openExperienceById=async e=>{this.experiences.open({id:e})};async runPluginStartHooks(){for(const e of this.pluginStartHooks)await e()}async evaluateGate(e){return e===void 0?!0:typeof e=="boolean"?e:await I.evaluateRuleLogic(this,e)===!0}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 u=i;u==="true"&&(u=!0),u==="false"&&(u=!1),this.registerFeature(n,{key:`${u}`,name:n,decide:()=>u,storage:"session"})}catch{}}))}setupPredicates(){const e=this.options.predicates;e&&Object.entries(e).forEach(([r,n])=>{if(typeof n!="function"){E.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"){E.logger("warn",`Action "${r}" is not a function.`);return}this.registerAction(r,n)})}setupComponents(){const e=this.options.components;e&&Object.entries(e).forEach(([r,n])=>{this.registerComponent(r,n)})}getPluginConfig=e=>this.plugins[e]??{};renderString=(e,r)=>{const n=this.responses.listStore.getState().reduce((i,u)=>(i[u.fieldId]=u.value,i),{});return at(e,{...r,responses:n})}}function ct(t){return{$$type:"lazy-component",load:t}}function ut(t){return typeof t=="object"&&t!==null&&"$$type"in t&&t.$$type==="lazy-component"}const dt=t=>{const e=new K(t);return b.bindClient(e),e};exports.evaluateRuleLogic=I.evaluateRuleLogic;exports.isPickedRoot=I.isPickedRoot;exports.createStorageKey=v.createStorageKey;exports.localStore=v.localStore;exports.sessionStore=v.sessionStore;exports.subscribe=v.subscribe;exports.supportsCookies=b.supportsCookies;exports.supportsCryptoRandomUUID=b.supportsCryptoRandomUUID;exports.supportsDocument=b.supportsDocument;exports.supportsHistory=b.supportsHistory;exports.supportsIntersectionObserver=b.supportsIntersectionObserver;exports.supportsLocalStorage=b.supportsLocalStorage;exports.supportsLocation=b.supportsLocation;exports.supportsSessionStorage=b.supportsSessionStorage;exports.supportsShadowRoot=b.supportsShadowRoot;exports.supportsWebComponents=b.supportsWebComponents;exports.supportsWindow=b.supportsWindow;exports.Picked=K;exports.createClient=dt;exports.getPickedConfig=H;exports.isLazyLoader=ut;exports.lazyComponent=ct;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const f=require("../../../id-BKIWbSTy.cjs"),N=require("../../../logger-BsmHUUw1.cjs"),a={serialize(i){return JSON.stringify(i)},deserialize(i){return JSON.parse(i)}},z=i=>({name:"create-experience",setup:s=>{i.experiences.forEach(l=>{l.fields.forEach(r=>{s.registerField(a.deserialize(r.serialize()))}),l.steps.forEach(r=>{s.registerStep(a.deserialize(r.serialize()))});const o=l.serialize(),n=a.deserialize(o);n.component=l.component,s.registerExperience(n)})}});function m(i){return i.toLowerCase().replaceAll(/[^a-z0-9\s-]/g,"").trim().replaceAll(/\s+/g,"-")}const b=(i,s)=>({id:f.generateId("node"),experience:s,type:"action",action:i.action,addNext(o){if(!o.node)throw new Error("Cannot connect to node");const n=h({sourceNode:this,destinationNode:o.node,sourceNodeHandle:null},s);s.edges.push(n)},onSuccess(o){if(!o.node)throw new Error("Cannot connect to node");const n=h({sourceNode:this,destinationNode:o.node,sourceNodeHandle:"true"},s);s.edges.push(n)},onFail(o){if(!o.node)throw new Error("Cannot connect to node");const n=h({sourceNode:this,destinationNode:o.node,sourceNodeHandle:"false"},s);s.edges.push(n)},serialize(){return a.serialize({id:this.id,type:this.type,action:this.action})}}),v=i=>{const s=i.name??i.label??"",l=i.key??i.id??m(s);return{id:i.id??f.generateId("step"),name:s,key:l,label:s,fields:i.fields??[],addField(o){const n="serialize"in o?o:g(o);return this.fields.includes(n)||this.fields.push(n),n}}},x=(i,s)=>{const l=i.name??i.label??"",o=i.key??i.id??m(l),n={id:i.id??f.generateId("step"),name:l,key:o,label:l,experience:s,fields:i.fields??[],node:null,nextStep(r){return this.experience.addStep(r,this)},nextCondition(r){return this.experience.addCondition(r,this)},nextConditional(r){return this.experience.addCondition(r,this)},addNextExperience(r){return this.experience.addExperience(r,this)},addField(r){return this.experience.addField(r,this)},serialize(){return a.serialize({id:this.id,name:this.name,key:this.key,label:this.name,fieldKeys:this.fields.map(r=>r.key),fieldIds:this.fields.map(r=>r.id)})}};return p({step:n,type:"step"},s),n},p=(i,s)=>{const l={id:f.generateId("node"),experience:s};if(i.type==="step"){const n={...l,type:"step",connectedStep:i.step,serialize(){return a.serialize({id:this.id,type:this.type,stepKey:this.connectedStep.key,name:this.connectedStep.name,label:this.connectedStep.name})}};return n.connectedStep.node=n,n}if(i.type==="conditional"){const n={...l,type:"conditional",connectedCondition:i.conditional,serialize(){return a.serialize({id:this.id,type:this.type,conditionId:this.connectedCondition.id})}};return n.connectedCondition.node=n,n}return i.type==="experience"?{...l,type:"experience",connectedExperience:i.experience,serialize(){return a.serialize({id:this.id,type:this.type,experienceId:this.connectedExperience.id})}}:{...l,type:"origin",serialize(){return a.serialize({id:this.id,type:this.type})}}},h=(i,s)=>({id:f.generateId("edge"),sourceNode:i.sourceNode,sourceNodeHandle:i.sourceNodeHandle,destinationNode:i.destinationNode,experience:s,serialize(){return a.serialize({id:this.id,sourceNodeHandle:this.sourceNodeHandle??void 0,sourceNodeId:this.sourceNode.id,destinationNodeId:this.destinationNode.id})}}),y=(i,s)=>{const l={id:f.generateId("conditional"),label:i.label,condition:i.condition,node:null,experience:s,addTrue(o){if(!this.node||!o.node)throw new Error("todo no node");const n=h({sourceNode:this.node,destinationNode:o.node,sourceNodeHandle:"true"},this.experience);this.experience.edges.push(n)},addFalse(o){if(!this.node||!o.node)throw new Error("todo no node");const n=h({sourceNode:this.node,destinationNode:o.node,sourceNodeHandle:"false"},this.experience);this.experience.edges.push(n)},serialize(){return a.serialize({id:this.id,label:this.label,condition:this.condition})}};return p({conditional:l,type:"conditional"},s),l};function E(...i){return y(...i)}const g=i=>{const s=i.key??i.id??m(i.name);return i.id!==void 0&&N.logger("warn",`createField: 'id' is deprecated. Use 'key' instead of id="${i.id}". The field key "${s}" will be used for lookups.`),{id:i.id??f.generateId("field"),key:s,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:i.options?.map(n=>({id:"id"in n?n.id:f.generateId("option"),...n}))??null,policies:i.policies,serialize(){const n={id:this.id,key:this.key,name:this.name,label:this.label,placeholder:this.placeholder,required:this.required,description:this.description,helpText:this.helpText,validation:this.validation,condition:this.condition,policies:this.policies},r=typeof this.defaultValue=="string"?this.defaultValue:void 0,d=typeof this.defaultValue=="number"?this.defaultValue:void 0,c=typeof this.defaultValue=="boolean"?this.defaultValue:void 0;switch(this.type){case"text":if(this.multiple){let e;if(Array.isArray(this.defaultValue)){e=[];for(const t of this.defaultValue)typeof t=="string"&&e.push(t);e.length===0&&(e=void 0)}return a.serialize({...n,type:"text",multiple:!0,defaultValue:e,options:this.options?this.options.map(t=>({id:t.id,label:t.label,value:`${t.value}`,condition:t.condition})):null})}return a.serialize({...n,type:"text",multiple:!1,defaultValue:r,options:this.options?this.options.map(e=>({id:e.id,label:e.label,value:`${e.value}`,condition:e.condition})):null});case"number":if(this.multiple){let e;if(Array.isArray(this.defaultValue)){e=[];for(const t of this.defaultValue)typeof t=="number"&&e.push(t);e.length===0&&(e=void 0)}return a.serialize({...n,type:"number",multiple:!0,defaultValue:e,options:this.options?this.options.map(t=>({id:t.id,label:t.label,value:Number(t.value),condition:t.condition})):null})}return a.serialize({...n,type:"number",multiple:!1,defaultValue:d,options:this.options?this.options.map(e=>({id:e.id,label:e.label,value:Number(e.value),condition:e.condition})):null});case"boolean":if(this.multiple){let e;if(Array.isArray(this.defaultValue)){e=[];for(const t of this.defaultValue)typeof t=="boolean"&&e.push(t);e.length===0&&(e=void 0)}return a.serialize({...n,type:"boolean",multiple:!0,defaultValue:e,options:this.options?this.options.map(t=>({id:t.id,label:t.label,value:!!t.value,condition:t.condition})):null})}return a.serialize({...n,type:"boolean",multiple:!1,defaultValue:c,options:this.options?this.options.map(e=>({id:e.id,label:e.label,value:!!e.value,condition:e.condition})):null});case"object":return this.multiple?a.serialize({...n,type:"object",multiple:!0,defaultValue:this.defaultValue,options:this.options?this.options.map(e=>({id:e.id,label:e.label,description:e.description,value:e.value,condition:e.condition})):null}):a.serialize({...n,type:"object",multiple:!1,defaultValue:this.defaultValue,options:this.options?this.options.map(e=>({id:e.id,label:e.label,description:e.description,value:e.value,condition:e.condition})):null});default:throw new Error("Unsupported field type")}}}},V=i=>{const s=[],l=[],o=[],n=[],r=[];return{id:i.id,component:i.component,name:i.name,initializeOpen:i.initializeOpen,condition:i.condition,targets:i.targets,steps:s,nodes:l,edges:o,fields:r,conditions:n,get conditionals(){return this.conditions},addStep(d,c){let e=c?.node;this.nodes.length===0&&(e=p({type:"origin"},this),this.nodes.push(e));const t="serialize"in d?d:x(d,this);if(e){if(!t.node)throw new Error("todo no node");const u=h({sourceNode:e,destinationNode:t.node,sourceNodeHandle:null},this);this.edges.push(u)}return t.fields.length>0&&t.fields.forEach(u=>{this.fields.includes(u)||this.fields.push(u)}),this.steps.includes(t)||(this.steps.push(t),t.node&&this.nodes.push(t.node)),t},addAction(d,c){let e=c?.node;this.nodes.length===0&&(e=p({type:"origin"},this),this.nodes.push(e));const t="serialize"in d?d:b(d,this);if(e){const u=h({sourceNode:e,destinationNode:t,sourceNodeHandle:null},this);this.edges.push(u)}return this.nodes.push(t),t},addCondition(d,c){let e=c?.node;this.nodes.length===0&&(e=p({type:"origin"},this),this.nodes.push(e));const t="serialize"in d?d:y(d,this);if(e){if(!t.node)throw new Error("todo no node");const u=h({sourceNode:e,destinationNode:t.node,sourceNodeHandle:null},this);this.edges.push(u)}return this.conditions.includes(t)||(this.conditions.push(t),t.node&&this.nodes.push(t.node)),t},addConditional(d,c){return this.addCondition(d,c)},addExperience(d,c){let e=c?.node;this.nodes.length===0&&(e=p({type:"origin"},this),this.nodes.push(e));const t=p({type:"experience",experience:d},this);if(this.nodes.push(t),e){const u=h({sourceNode:e,destinationNode:t,sourceNodeHandle:null},this);this.edges.push(u)}return d},addField(d,c){const e="serialize"in d?d:g(d);return c&&c.fields.push(e),this.fields.includes(e)||this.fields.push(e),e},serialize(){return a.serialize({id:this.id,component:this.component,name:this.name,initializeOpen:this.initializeOpen,condition:this.condition,targets:this.targets,steps:this.steps.map(d=>d.id),nodes:this.nodes.map(d=>a.deserialize(d.serialize())),edges:this.edges.map(d=>a.deserialize(d.serialize())),conditions:this.conditions.map(d=>a.deserialize(d.serialize()))})}}};exports.createCondition=y;exports.createConditional=E;exports.createEdge=h;exports.createExperience=V;exports.createExperiencePlugin=z;exports.createField=g;exports.createNode=p;exports.createStep=v;exports.serialization=a;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const p=require("../../../api-C90ugp6M.cjs"),a=require("../../../logger-BsmHUUw1.cjs");function m(n){let e=2166136261;for(let t=0;t<n.length;t++)e^=n.charCodeAt(t),e=Math.imul(e,16777619);return e>>>0}function h(n){return m(n)%100}function w(n,e){return e<=0?!1:e>=100?!0:n<e}function v(n){return typeof n!="object"||n===null||!("id"in n&&"name"in n&&"enabled"in n&&"weight"in n&&"version"in n)?!1:typeof n.id=="string"&&typeof n.name=="string"&&typeof n.enabled=="boolean"&&typeof n.weight=="number"&&typeof n.version=="number"}function y(n){return typeof n!="object"||n===null||!("features"in n)||!Array.isArray(n.features)?!1:n.features.every(v)}function j(n){return typeof n!="object"||n===null?!1:"id"in n&&"name"in n&&"nodes"in n&&"edges"in n&&typeof n.id=="string"&&typeof n.name=="string"&&Array.isArray(n.nodes)&&Array.isArray(n.edges)}function C(n,e){const t=new Set,o=[];for(const r of n){if(r.type!=="conditional")continue;const i=r.conditionId??r.conditionalId;if(!i||t.has(i))continue;t.add(i);const s=e.get(i);if(!s){a.logger("warn",`Condition with id '${i}' not found in project conditions`);continue}o.push({id:s.id,label:s.name,condition:s.condition})}return o}function c(n,e){if(e.conditions)for(const t of e.conditions)n.registerCondition(t)}function b(n,e,t){if(!j(e)){a.logger("warn",`Skipping invalid experience payload: ${JSON.stringify(e)}`);return}const o=e.componentName?n.components.listStore.getState().find(r=>r.name===e.componentName)?.component:void 0;n.registerExperience({id:e.id,key:e.key,name:e.name,targets:e.targets??[],steps:e.nodes.filter(r=>r.type==="step").map(r=>r.stepKey),nodes:e.nodes,edges:e.edges,conditions:C(e.nodes,t),actions:e.actions,condition:e.condition,initializeOpen:e.initializeOpen,component:o})}function f(n,e){if(e.fields)for(const t of e.fields)n.registerField(t)}function u(n,e){if(e.steps)for(const t of e.steps)n.registerStep(t)}function d(n,e){const t=new Map;if(e.conditions)for(const o of e.conditions)t.set(o.id,o);if(e.experiences)for(const o of e.experiences)b(n,o,t)}function S(n){const e=n.searchParams["preview-token"];if(e&&e.length>0)return e[0]}function P(n){const e=new Set,t=n.searchParams.feature;if(!t)return e;for(const o of t){const r=o.indexOf(":");r>0&&e.add(o.substring(0,r))}return e}function l(n,e,t){const o=P(n),r=n.session?.id;if(!r)throw new Error("Session ID is required for feature registration");const i=h(r);for(const s of e.features)o.has(s.id)||k(n,s,t,i)}function k(n,e,t,o){n.registerFeature(e.id,{key:`v${e.version}`,name:e.name,storage:t?"session":"local",decide:()=>e.enabled?w(o,e.weight):!1})}function I(){let n;try{n=__PICKED_PROJECT_CONFIG__}catch{return}if(n===void 0)return;let e;if(typeof n=="string")try{e=JSON.parse(n)}catch{a.logger("warn","Build-time project config is not valid JSON");return}else e=n;if(y(e))return e;a.logger("warn","Build-time project config has invalid shape, falling back to runtime fetch")}function E(n){try{const e=new URL(n).hostname;return e==="localhost"||e==="127.0.0.1"||e==="::1"}catch{return!1}}function F(n){if(typeof n!="object"||n===null||!("cause"in n))return!1;const{cause:e}=n;return typeof e!="object"||e===null||!("code"in e)?!1:e.code==="ECONNREFUSED"}async function g(n,e,t){const o=t?.previewToken?`projects/${e}?preview_token=${encodeURIComponent(t.previewToken)}`:`projects/${e}`;let r;try{r=await p.get(n,o,t?.headers)}catch(s){return E(n)&&F(s)||a.logger("warn","Failed to fetch project config",s),null}if(!r.ok)return a.logger("warn",`Project config request failed with status ${r.status.toString()}`),null;let i;try{i=await r.json()}catch{return a.logger("warn","Failed to parse project config response"),null}return y(i)?i:(a.logger("warn","Invalid project config response shape"),null)}function O(n){return{name:"dynamic-experiences",setup:e=>{const t=n?.apiUrl??e.apiUrl;return{onStart:async()=>{const o=S(e);if(o){const s=await g(t,e.projectId,{previewToken:o});s&&(l(e,s,!0),c(e,s),f(e,s),u(e,s),d(e,s));return}const r=n?.projectConfig??I();if(r){l(e,r,!1),c(e,r),f(e,r),u(e,r),d(e,r);return}const i=await g(t,e.projectId);i&&(l(e,i,!1),c(e,i),f(e,i),u(e,i),d(e,i))}}}}}exports.createClientHeaders=p.createClientHeaders;exports.dynamicExperiencesPlugin=O;exports.fetchProject=g;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("effector"),o=require("../../../storage-
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("effector"),o=require("../../../storage-Be5xWNPC.cjs"),g=require("../../../logger-BsmHUUw1.cjs"),S=({storage:c="local"}={})=>({name:"experience-browser-storage-plugin",setup:s=>{const i=c==="local"?o.localStore:o.sessionStore,a=r.createEffect(async e=>{if(!e){g.logger("warn","No experience instance provided to loadExperienceVisiblityFx.");return}const t=o.createStorageKey("open-close","experience",e),n=i.get(t).boolean();e.setOpen(n??e.isOpenStore.getState())});r.sample({source:s.eventBus,filter:e=>e.type==="experience_initialize"&&"experience"in e,fn:e=>e.experience,target:a});const l=r.createEffect(async e=>{const t=o.createStorageKey("open-close","experience",e),n=e.isOpenStore.getState();i.set(t,n)}),p=e=>r.sample({source:e.isOpenStore,fn:()=>e,target:l});s.experienceInstances.listStore.watch(e=>{e.forEach(t=>p(t))})}});exports.experienceBrowserStoragePlugin=S;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("effector"),o=require("../../../storage-
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("effector"),o=require("../../../storage-Be5xWNPC.cjs"),a=o.createStorageKey("history","global"),l=({storage:i="local"}={})=>({name:"history-browser-storage-plugin",setup:r=>{const s=i==="local"?o.localStore:o.sessionStore,n=t.createEffect(async()=>{const e=s.get(a).json();e&&r.history.restore({entries:e})}),c=t.createEffect(async e=>{s.set(a,e)});t.sample({source:r.eventBus,filter:e=>e.type==="load",target:n}),t.sample({source:r.history.entriesStore,target:c})}});exports.historyBrowserStoragePlugin=l;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("effector"),c=require("../../../storage-
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("effector"),c=require("../../../storage-Be5xWNPC.cjs"),p=c.createStorageKey("responses","global"),u=(n,e)=>{const o={};return Object.entries(n).forEach(([r,l])=>{!e.find(a=>a.id===r)?.policies?.doNotStoreValue&&(o[r]=l)}),o},g=({storage:n="local"}={})=>({name:"responses-browser-storage-plugin",setup:e=>{const o=n==="local"?c.localStore:c.sessionStore,r=t.createEffect(async()=>{const s=o.get(p).json();if(!s)return null;e.responses.register(s)}),l=t.attach({source:{responses:e.responses.getAllStore,fields:e.fields.listStore},effect:({responses:s,fields:i})=>{const a=u(s,i);o.set(p,a)}});t.sample({source:e.eventBus,filter:s=>s.type==="load",target:r}),t.sample({source:e.responses.getAllStore,target:l})}});exports.responsesBrowserStoragePlugin=g;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const i=require("effector"),w="picked";async function d(r){const{storeName:o,version:c=1,keyPath:n="id"}=r;return new Promise((a,t)=>{const e=indexedDB.open(w,c);e.onupgradeneeded=()=>{const s=e.result;s.objectStoreNames.contains(o)||s.createObjectStore(o,n?{keyPath:n}:void 0)},e.onsuccess=()=>a(e.result),e.onerror=()=>t(new Error(e.error?.message))})}async function g(r,o){return new Promise((c,n)=>{const e=r.transaction(o,"readonly").objectStore(o).getAll();e.onsuccess=()=>c(e.result),e.onerror=()=>n(new Error(e.error?.message))})}async function x(r,o,c){return new Promise((n,a)=>{const s=r.transaction(o,"readwrite").objectStore(o).put(c);s.onsuccess=()=>n(),s.onerror=()=>a(new Error(s.error?.message))})}async function y(r,o,c){return new Promise((n,a)=>{const s=r.transaction(o,"readwrite").objectStore(o).delete(c);s.onsuccess=()=>n(),s.onerror=()=>a(new Error(s.error?.message))})}async function b(r,o){return new Promise((c,n)=>{const e=r.transaction(o,"readwrite").objectStore(o).clear();e.onsuccess=()=>c(),e.onerror=()=>n(new Error(e.error?.message))})}const u="responses",p={storeName:u,keyPath:"fieldId"},E=()=>({name:"responses-indexdb-plugin",setup:r=>{const o=i.createEffect(async()=>{const t=await d(p),s=(await g(t,u)).reduce((l,{fieldId:f,value:m})=>(l[f]=m,l),{});await r.responses.commit(s)}),c=i.createEffect(async t=>{t.forEach(e=>{d(p).then(s=>{x(s,u,e)}).catch(s=>{console.error("Failed to store response in IndexedDB:",s)})})}),n=i.createEffect(async()=>{const t=await d(p);await b(t,u)}),a=i.createEffect(async t=>{const e=await d(p);await y(e,u,t)});i.sample({source:r.eventBus,filter:t=>t.type==="load",target:o}),i.sample({clock:r.responses.listStore,source:{responses:r.responses.listStore,fields:r.fields.listStore},fn:({responses:t,fields:e})=>{const s=e.filter(l=>!l.policies?.doNotStoreValue);return t.filter(l=>s.some(f=>f.id===l.fieldId))},target:c}),i.sample({clock:r.responses.clearAll,target:n}),i.sample({clock:r.responses.clear,target:a})}});exports.responsesIndexedDBPlugin=E;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const i=require("../../../supports-YvpQZxbh.cjs"),
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const i=require("../../../supports-YvpQZxbh.cjs"),c=require("../../../object-BbFTsGh3.cjs"),o=i.GLOBAL_OBJ;let s;const l=n=>({name:"single-page-app",setup:r=>{n.instrumentHistory&&i.supportsWindow()&&f(()=>{requestAnimationFrame(()=>{r.start()})})}});function f(n){if(o.addEventListener("popstate",()=>{const e=o.location.href,t=s;s=e,t!==e&&n()}),!i.supportsHistory())return;function r(e){return function(...t){const p=t.length>2?t[2]:void 0;if(p){const a=s,u=String(p);if(s=u,a===u)return e.apply(this,t);n()}return e.apply(this,t)}}c.patchMethod(o.history,"pushState",r),c.patchMethod(o.history,"replaceState",r)}exports.singlePageAppPlugin=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-Bi3-1tP5.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;
|