@picked/client 0.0.0-main.250901040057-ca07341 → 0.0.1-dev.1756875690387
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 +1 -2
- package/dist/cjs/plugins/create-experience/index.js +0 -1
- package/dist/cjs/plugins/experience-browserstorage-plugin/index.js +0 -1
- package/dist/cjs/plugins/history-browserstorage-plugin/index.js +0 -1
- package/dist/cjs/plugins/responses-browserstorage-plugin/index.js +0 -1
- package/dist/cjs/plugins/responses-indexeddb-plugin/index.js +0 -1
- package/dist/cjs/plugins/shopify/index.js +0 -1
- package/dist/cjs/plugins/single-page-app/index.js +0 -1
- package/dist/cjs/plugins/window-object/index.js +0 -1
- package/dist/cjs/server/index.js +0 -1
- package/dist/esm/index.js +1 -2
- package/dist/esm/plugins/create-experience/index.js +0 -1
- package/dist/esm/plugins/experience-browserstorage-plugin/index.js +0 -1
- package/dist/esm/plugins/history-browserstorage-plugin/index.js +0 -1
- package/dist/esm/plugins/responses-browserstorage-plugin/index.js +0 -1
- package/dist/esm/plugins/responses-indexeddb-plugin/index.js +0 -1
- package/dist/esm/plugins/shopify/index.js +0 -1
- package/dist/esm/plugins/single-page-app/index.js +0 -1
- package/dist/esm/plugins/window-object/index.js +0 -1
- package/dist/esm/server/index.js +0 -1
- package/dist/experience-instance-6ZKZS7dF.cjs +0 -1
- package/dist/experience-instance-BA0EXYg5.js +0 -1
- package/dist/id-BKIWbSTy.cjs +0 -1
- package/dist/id-BW-g3y32.js +0 -1
- package/dist/logger-BsmHUUw1.cjs +0 -1
- package/dist/logger-C9a75KZn.js +0 -1
- package/dist/object-BbFTsGh3.cjs +0 -1
- package/dist/object-JwZ58NOH.js +0 -1
- package/dist/storage-BPJwmlva.cjs +0 -1
- package/dist/storage-D87xFySf.js +0 -1
- package/dist/supports-BvrzQAVk.js +0 -1
- package/dist/supports-C0y3-V5V.cjs +0 -1
- package/package.json +1 -1
- package/dist/cjs/index.js.map +0 -1
- package/dist/cjs/plugins/create-experience/index.js.map +0 -1
- package/dist/cjs/plugins/experience-browserstorage-plugin/index.js.map +0 -1
- package/dist/cjs/plugins/history-browserstorage-plugin/index.js.map +0 -1
- package/dist/cjs/plugins/responses-browserstorage-plugin/index.js.map +0 -1
- package/dist/cjs/plugins/responses-indexeddb-plugin/index.js.map +0 -1
- package/dist/cjs/plugins/shopify/index.js.map +0 -1
- package/dist/cjs/plugins/single-page-app/index.js.map +0 -1
- package/dist/cjs/plugins/window-object/index.js.map +0 -1
- package/dist/cjs/server/index.js.map +0 -1
- package/dist/esm/index.js.map +0 -1
- package/dist/esm/plugins/create-experience/index.js.map +0 -1
- package/dist/esm/plugins/experience-browserstorage-plugin/index.js.map +0 -1
- package/dist/esm/plugins/history-browserstorage-plugin/index.js.map +0 -1
- package/dist/esm/plugins/responses-browserstorage-plugin/index.js.map +0 -1
- package/dist/esm/plugins/responses-indexeddb-plugin/index.js.map +0 -1
- package/dist/esm/plugins/shopify/index.js.map +0 -1
- package/dist/esm/plugins/single-page-app/index.js.map +0 -1
- package/dist/esm/plugins/window-object/index.js.map +0 -1
- package/dist/esm/server/index.js.map +0 -1
- package/dist/experience-instance-6ZKZS7dF.cjs.map +0 -1
- package/dist/experience-instance-BA0EXYg5.js.map +0 -1
- package/dist/id-BKIWbSTy.cjs.map +0 -1
- package/dist/id-BW-g3y32.js.map +0 -1
- package/dist/logger-BsmHUUw1.cjs.map +0 -1
- package/dist/logger-C9a75KZn.js.map +0 -1
- package/dist/object-BbFTsGh3.cjs.map +0 -1
- package/dist/object-JwZ58NOH.js.map +0 -1
- package/dist/storage-BPJwmlva.cjs.map +0 -1
- package/dist/storage-D87xFySf.js.map +0 -1
- package/dist/supports-BvrzQAVk.js.map +0 -1
- package/dist/supports-C0y3-V5V.cjs.map +0 -1
package/dist/cjs/index.js
CHANGED
|
@@ -1,2 +1 @@
|
|
|
1
|
-
"use strict";var L=Object.defineProperty;var V=(t,e,s)=>e in t?L(t,e,{enumerable:!0,configurable:!0,writable:!0,value:s}):t[e]=s;var h=(t,e,s)=>V(t,typeof e!="symbol"?e+"":e,s);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const f=require("effector"),S=require("@withease/factories"),w=require("../experience-instance-6ZKZS7dF.cjs"),b=require("../logger-BsmHUUw1.cjs"),v=require("../storage-BPJwmlva.cjs"),T=require("../id-BKIWbSTy.cjs"),M=require("../object-BbFTsGh3.cjs"),k=require("../supports-C0y3-V5V.cjs"),$=f.createDomain("experience"),N=S.createFactory(({client:t,experience:e})=>{const s=$.store(e),o=f.createApi(s,{merge(n,m){return{...n,...m.experience}}}),i=s.map(n=>({type:n.type,name:n.name,decisionLogic:n.decide,targetSelectors:n.targets})),u=t.components.listStore.map(n=>n.find(m=>m.name===`experience:${e.id}`)||n.find(m=>m.name==="experience"),{skipVoid:!1}),r=s.map(n=>({steps:n.steps,nodes:n.nodes,edges:n.edges,conditionals:n.conditionals}));return{id:e.id,configStore:i,treeStore:r,componentStore:u,merge:o.merge}});function z(t){return S.invoke(N,t)}const K=S.createFactory(({client:t})=>{const e=$.store({}),s=f.createApi(e,{register(r,n){return{...r,[n.id]:n}}});function o(r){const n=e.getState()[r.id];if(n){n.merge({experience:r,strategy:"override"});return}const m=z({client:t,experience:r});s.register(m)}const i=e.map(r=>Object.values(r));function u(r){return e.map(n=>n[r],{skipVoid:!1})}return{register:o,getById:u,listStore:i}});function q(t){return S.invoke(K,t)}const _=(t,e)=>{e.register(t)},O=(t,e)=>{const{targetSelectors:s}=e.configStore.getState(),o=w.getTargetElements(s,e.id);o.forEach(({elements:u})=>u.forEach(r=>w.tagTargetElement(r,e.id))),w.createAppHosts(o).forEach(u=>{t.experienceInstances.spawn(e,u)})},j=async t=>{await Promise.all(t.experiences.listStore.getState().map(async e=>{await H(t,e)&&O(t,e)}))},H=async(t,e)=>{const{type:s,decisionLogic:o,targetSelectors:i}=e.configStore.getState();return w.getTargetElements(i,e.id).length<1?!1:s==="funnel"?o?await w.evaluateRuleLogic(t,o)===!0:!1:i.length===0?!1:w.isRulesLogic(o)?await w.evaluateRuleLogic(t,o)===!0:!0},U=(t,e,s)=>{const o=e.name,i=e.setup(t);if(i){const u=s[o]??{};s[o]=Object.freeze({...u,...i})}},W=f.createDomain("component"),G=S.createFactory(({client:t,component:e,name:s})=>{const o=t.frameworks.getByName(e.frameworkName);return{name:s,component:e,frameworkStore:o}});function J(t){return S.invoke(G,t)}const Y=S.createFactory(({client:t})=>{const e=W.store({}),s=f.createApi(e,{register(r,n){return{...r,[n.name]:n}}});function o(r,n){e.getState()[r]&&b.logger("warn",`Component '${r}' already registered. Registering again will override the previous registration.`);const c=J({client:t,name:r,component:n});s.register(c)}const i=e.map(r=>Object.values(r));function u(r){return e.map(n=>n[r],{skipVoid:!1})}return{register:o,getByName:u,listStore:i}});function Q(t){return S.invoke(Y,t)}const A=(t,e,s)=>{s.register(t,e)},X=f.createDomain("framework"),Z=S.createFactory(({client:t})=>{const e=X.store({}),s=f.createApi(e,{register(r,n){return{...r,[n.name]:n.framework}}});function o(r,n){e.getState()[r]&&b.logger("warn",`Framework '${r}' already registered. Registering again will override the previous registration.`),s.register({name:r,framework:n})}const i=e.map(r=>Object.values(r));function u(r){return e.map(n=>n[r],{skipVoid:!1})}return{register:o,getByName:u,listStore:i}});function ee(t){return S.invoke(Z,t)}const te=(t,e)=>{e.register(t.name,t)},re=6e3,B=v.createStorageKey("last_ping","global"),se=t=>`${t}/api/v1/ping`,ne=async t=>{try{const e=Date.now(),s=localStorage.getItem(B);if(s&&e-parseInt(s)<re)return!0;const o=se(t.apiUrl),i={projectId:t.projectId,path:window.location.pathname},u=JSON.stringify(i),r={"Content-Type":"application/json"},n=document.getElementById("picked_script"),m=n==null?void 0:n.dataset.verceltoken;m&&(r["x-vercel-protection-bypass"]=m);const l=(await fetch(o,{method:"POST",headers:r,body:u})).ok;return l&&localStorage.setItem(B,e.toString()),l}catch(e){return b.logger("error",e),!1}};function oe(t){const e=typeof window<"u",s={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(s)}const ie=f.createDomain("predicate"),ae=S.createFactory(({client:t})=>{const e=ie.store({}),s=f.createApi(e,{register(r,n){return{...r,[n.name]:{name:n.name,predicate:n.predicate}}}});function o(r,n){e.getState()[r]&&b.logger("warn",`Predicate '${r}' already registered. Registering again will override the previous registration.`),s.register(Object.freeze({name:r,predicate:n}))}const i=e.map(r=>Object.values(r));function u(r){return e.map(n=>n[r],{skipVoid:!1})}return{register:o,getByName:u,listStore:i}});function ce(t){return S.invoke(ae,t)}const ue=(t,e,s)=>{s.register(t,e)},D=f.createDomain("feature"),le=S.createFactory(()=>{const t=D.store({}),e=D.store([]),s=f.createApi(t,{register(c,l){return{...c,[l.id]:l.feature}}});function o(c,l){t.getState()[c]&&b.logger("warn",`Feature '${c}' already registered. Registering again will override the previous registration.`);const d={id:c,feature:{...l,id:c}};s.register(Object.freeze({id:c,feature:d}))}const i=f.createEffect(async({id:c,key:l,storage:a="local"})=>{const d=v.createStorageKey(`feature:${c}:${l}`,"global"),y=(a==="session"?v.sessionStore:v.localStore).get(d).boolean();if(y!==null)return{id:c,bucket:y}}),u=f.createEffect(c=>{if(!c)return null;const l=v.createStorageKey(`feature:${c.id}:${c.key}`,"global");(c.storage==="session"?v.sessionStore:v.localStore).set(l,c.bucket)}),r=f.attach({source:{allFeaturesStore:t,resolvedFeaturesStore:e},effect:async({allFeaturesStore:c,resolvedFeaturesStore:l},{id:a,decide:d})=>{const g=l.find(F=>F.id===a);if(g)return g;const y=c[a];if(!y)throw new Error(`Feature with id '${a}' not found`);const p=await d();return{id:y.id,bucket:p,storage:y.feature.storage}}});f.sample({clock:s.register,fn:c=>{const{id:l,feature:a}=c;return{id:l,key:a.feature.key,storage:a.feature.storage}},target:i}),f.sample({source:e,clock:[i.doneData,r.doneData],fn:(c,l)=>!l||c.some(a=>a.id===l.id)?c:[...c,l],target:e}),f.sample({source:t,clock:r.doneData,fn:(c,l)=>{var p;const{id:a,bucket:d,storage:g}=l,y=(p=c[a])==null?void 0:p.feature.key;return y?{key:y,id:a,bucket:d,storage:g}:null},target:u});const n=f.combine({allFeaturesStore:t,resolvedFeaturesStore:e}).map(({allFeaturesStore:c,resolvedFeaturesStore:l})=>Object.values(c).map(a=>{const d=l.find(g=>g.id===a.id);return d?{id:a.id,name:a.feature.name,key:a.feature.key,getBucket:()=>({id:a.id,bucket:d.bucket}),isResolved:!0}:{id:a.id,name:a.feature.name,key:a.feature.key,getBucket:async()=>await r(a.feature),isResolved:!1}}));function m(c){return t.map(l=>l[c],{skipVoid:!1})}return{register:o,getByName:m,listStore:n}});function pe(){return S.invoke(le)}const ge=(t,e,s)=>{s.register(t,e)},x=f.createDomain("history");function R(t,e){return{id:T.generateId("history-entry"),node:e,at:Date.now(),experienceId:t}}const de=S.createFactory(()=>{const t=x.store({entries:[]}),e=x.event(),s=x.event(),o=x.event(),i=x.event();t.on(e,(r,n)=>({entries:[...r.entries,R(n.experienceId,n.node)]})),t.on(s,(r,n)=>({entries:[...r.entries.slice(0,-1),R(n.experienceId,n.node)]})),t.on(i,(r,n)=>n);function u(r,n){const m={lastStepIndex:-1,secondLastStepIndex:-1};for(let c=r.length-1;c>=0;c--){const l=r[c],a=l==null?void 0:l.node;if(!(!a||!w.isStepNode(a))&&!(n&&(l==null?void 0:l.experienceId)!==n))if(m.lastStepIndex===-1)m.lastStepIndex=c;else{m.secondLastStepIndex=c;break}}return m}return t.on(o,(r,n)=>{const{secondLastStepIndex:m}=u(r.entries,n.experienceId),c=m!==-1?r.entries.slice(0,m+1):r.entries;return{...r,entries:c}}),{push:e,replace:s,back:o,restore:i,entriesStore:t.map(r=>r.entries)}});function fe(){return S.invoke(de)}const me=()=>f.createEvent(),ye=f.createDomain("field"),he=S.createFactory(()=>{const t=ye.store({}),e=f.createApi(t,{register(r,n){return{...r,[n.field.id]:n.field}}});function s(r){e.register({field:r})}const o=t.map(r=>Object.values(r));function i(r){return t.map(n=>n[r]||null)}function u(r){return t.map(n=>Object.values(n).find(m=>m.name===r)||null)}return{register:s,getById:i,listStore:o,getByName:u}});function Se(){return S.invoke(he)}const ve=(t,e)=>{e.register(t)},ke=f.createDomain("response"),we=S.createFactory(({client:t})=>{const e=ke.store({}),s=f.createEvent(),o=f.createEvent(),i=f.createApi(e,{register(a,d){return{...a,[d.fieldId]:d.response}},clear(a,d){const{[d]:g,...y}=a;return y},clearAll(){return{}}});function u(a,d){i.register({fieldId:a,response:d})}async function r(a){const d=[];return await Promise.allSettled(Object.entries(a).map(async([g,y])=>{let p=y;const F=t.fields.getById(g).getState();if(!F){d.push({fieldId:g,userMessage:`Field '${g}' not found`,systemMessage:`No field with ID '${g}' exists. Available field IDs are: ${Object.keys(t.fields.listStore.getState()).join(",")}.`,value:p});return}if(F.multiple&&(typeof p=="string"||typeof p=="number"||typeof p=="boolean")&&(p=[p]),!M.isEmpty(F.validation)){const I=await w.evaluateRuleLogic(t,F.validation,{$input:p});if(typeof I=="string"){d.push({fieldId:g,userMessage:I,systemMessage:`Field validation resulted in an error: ${I}.`,value:p});return}if(I===!1){d.push({fieldId:g,userMessage:"This field is invalid",systemMessage:"Field validation resulted in an unspecified error.",value:p});return}}if(F.required&&(typeof p>"u"||p===null||p===""||Array.isArray(p)&&!p.length)){d.push({fieldId:g,userMessage:"This field is required",systemMessage:"Field is required.",value:p});return}if(!F.multiple&&Array.isArray(p)&&p.length>1){d.push({fieldId:g,userMessage:"This field expects a single response",systemMessage:"Field expects a single response.",value:p});return}if(F.options){const I=F.options.map(E=>E.value),C=Array.isArray(p)?p:[p];Array.isArray(p)&&(C.every(E=>I.includes(E))||d.push({fieldId:g,userMessage:"This field expects a valid option",systemMessage:`Field expects a valid option. Valid options are: ${I.join(", ")}`,value:p}))}})),d.length?{errors:d}:(Object.entries(a).forEach(([g,y])=>{u(g,y)}),{errors:[]})}const n=e.map(a=>a),m=e.map(a=>Object.keys(a).map(g=>({fieldId:g,value:a[g]})));function c(a){const d=t.fields.getById(a),g=e.map(y=>y[a]||null);return f.combine({f:d,r:g},({f:y,r:p})=>p||(y!=null&&y.defaultValue?y.defaultValue:null))}function l(a){const d=t.fields.getByName(a);return f.combine({f:d,s:e},({f:g,s:y})=>{const p=g&&y[g.id]||null;return p||(g!=null&&g.defaultValue?g.defaultValue:null)})}return f.sample({clock:s,target:i.clearAll}),f.sample({clock:o,target:i.clear}),{register:u,clearAll:s,clear:o,commit:r,listStore:m,getAllStore:n,getByFieldId:c,getByFieldName:l}});function Fe(t){return S.invoke(we,t)}const be=()=>"0.0.0-main.250901040057-ca07341";function Ie(){if(k.supportsDocument()){const t=[document.currentScript,document.getElementById("picked_script"),document.getElementById("picked"),document.getElementById("cvly"),document.getElementById("cvly-x")];for(const e of t)if(e!=null&&e.dataset.api)return e.dataset.api}return"https://api.picked.app"}function xe(){if(!k.supportsWindow())return{};const t=new URLSearchParams(window.location.search),e={},s=new Set;for(const[i]of t.entries())i.startsWith("picked-")&&s.add(i);for(const i of s){const u=i.replace("picked-","");e[u]=t.getAll(i)}const o=v.createStorageKey("s");if(s.size>0)v.sessionStore.set(o,e);else{const i=v.sessionStore.get(o);if(i)return i.json()||{}}return e}class P{constructor(e){h(this,"options");h(this,"isReady",!1);h(this,"project");h(this,"plugins",{});h(this,"eventBus",me());h(this,"organizationId");h(this,"projectId");h(this,"apiUrl");h(this,"searchParams",xe());h(this,"history",fe());h(this,"components",Q({client:this}));h(this,"experienceInstances",w.createExperienceInstanceIndex({client:this}));h(this,"experiences",q({client:this}));h(this,"frameworks",ee({client:this}));h(this,"predicates",ce({client:this}));h(this,"features",pe());h(this,"fields",Se());h(this,"responses",Fe({client:this}));b.logger("info","Picked client initializing."),this.organizationId=e.organizationId,this.projectId=e.projectId,this.options=Object.freeze(e),this.apiUrl=e.apiUrl||Ie(),this.setupPlugins(),this.setupFeatures(),this.setupPredicates(),this.eventBus({type:"initialized",version:be()}),b.logger("info","Picked client initialized.")}start(){ne(this),(async()=>{k.supportsDocument()&&(document.body&&await j(this),await w.domInteractive(),await j(this),this.eventBus({type:"ready"}),this.isReady=!0)})()}registerFramework(e){te(e,this.frameworks)}registerComponent(e,s){A(e,s,this.components)}registerPlugin(e){U(this,e,this.plugins)}registerFeature(e,s){ge(e,s,this.features)}registerPredicate(e,s){ue(e,s,this.predicates)}registerField(e){ve(e,this.fields)}registerExperience(e){e.component&&A(`experience:${e.id}`,e.component,this.components),_(e,this.experiences)}getStateSnapshot(){return oe(this)}async launchExperienceById(e){const s=this.experiences.getById(e).getState();if(!s){b.logger("warn",`Experience with id '${e}' not found.`);return}O(this,s)}setupPlugins(){var e;(e=this.options.plugins)==null||e.forEach(s=>{if(Array.isArray(s)){s.forEach(i=>{this.registerPlugin(i)});return}const o=typeof s=="function"?s():s;if(Array.isArray(o)){o.forEach(i=>this.registerPlugin(i));return}this.registerPlugin(o)})}setupFeatures(){const e=this.options.features;e&&(Object.entries(e).forEach(([s,o])=>{const i=typeof o=="function"?o():o;this.registerFeature(s,i)}),this.searchParams.feature&&this.searchParams.feature.forEach(s=>{try{const[o,i]=s.split(":");if(!o||!i)return;let u=i;(u==="true"||u==="false")&&(u=!!u),this.registerFeature(o,{key:"*",name:o,decide:()=>u,storage:"session"})}catch{}}))}setupPredicates(){const e=this.options.predicates;e&&Object.entries(e).forEach(([s,o])=>{if(typeof o!="function"){b.logger("warn",`Predicate "${s}" is not a function.`);return}this.registerPredicate(s,o)})}getPluginConfig(e){return this.plugins[e]??{}}}h(P,"logger",b.logger);const Ee=t=>{const e=new P(t);return k.bindClient(e),e};exports.isPickedRoot=w.isPickedRoot;exports.createStorageKey=v.createStorageKey;exports.localStore=v.localStore;exports.sessionStore=v.sessionStore;exports.subscribe=v.subscribe;exports.supportsCookies=k.supportsCookies;exports.supportsDocument=k.supportsDocument;exports.supportsHistory=k.supportsHistory;exports.supportsIntersectionObserver=k.supportsIntersectionObserver;exports.supportsLocalStorage=k.supportsLocalStorage;exports.supportsLocation=k.supportsLocation;exports.supportsSessionStorage=k.supportsSessionStorage;exports.supportsShadowRoot=k.supportsShadowRoot;exports.supportsWindow=k.supportsWindow;exports.Picked=P;exports.createClient=Ee;
|
|
2
|
-
//# sourceMappingURL=index.js.map
|
|
1
|
+
"use strict";var L=Object.defineProperty;var V=(t,e,s)=>e in t?L(t,e,{enumerable:!0,configurable:!0,writable:!0,value:s}):t[e]=s;var h=(t,e,s)=>V(t,typeof e!="symbol"?e+"":e,s);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const f=require("effector"),S=require("@withease/factories"),w=require("../experience-instance-6ZKZS7dF.cjs"),b=require("../logger-BsmHUUw1.cjs"),v=require("../storage-BPJwmlva.cjs"),T=require("../id-BKIWbSTy.cjs"),M=require("../object-BbFTsGh3.cjs"),k=require("../supports-C0y3-V5V.cjs"),$=f.createDomain("experience"),N=S.createFactory(({client:t,experience:e})=>{const s=$.store(e),o=f.createApi(s,{merge(n,m){return{...n,...m.experience}}}),i=s.map(n=>({type:n.type,name:n.name,decisionLogic:n.decide,targetSelectors:n.targets})),u=t.components.listStore.map(n=>n.find(m=>m.name===`experience:${e.id}`)||n.find(m=>m.name==="experience"),{skipVoid:!1}),r=s.map(n=>({steps:n.steps,nodes:n.nodes,edges:n.edges,conditionals:n.conditionals}));return{id:e.id,configStore:i,treeStore:r,componentStore:u,merge:o.merge}});function z(t){return S.invoke(N,t)}const K=S.createFactory(({client:t})=>{const e=$.store({}),s=f.createApi(e,{register(r,n){return{...r,[n.id]:n}}});function o(r){const n=e.getState()[r.id];if(n){n.merge({experience:r,strategy:"override"});return}const m=z({client:t,experience:r});s.register(m)}const i=e.map(r=>Object.values(r));function u(r){return e.map(n=>n[r],{skipVoid:!1})}return{register:o,getById:u,listStore:i}});function q(t){return S.invoke(K,t)}const _=(t,e)=>{e.register(t)},O=(t,e)=>{const{targetSelectors:s}=e.configStore.getState(),o=w.getTargetElements(s,e.id);o.forEach(({elements:u})=>u.forEach(r=>w.tagTargetElement(r,e.id))),w.createAppHosts(o).forEach(u=>{t.experienceInstances.spawn(e,u)})},j=async t=>{await Promise.all(t.experiences.listStore.getState().map(async e=>{await H(t,e)&&O(t,e)}))},H=async(t,e)=>{const{type:s,decisionLogic:o,targetSelectors:i}=e.configStore.getState();return w.getTargetElements(i,e.id).length<1?!1:s==="funnel"?o?await w.evaluateRuleLogic(t,o)===!0:!1:i.length===0?!1:w.isRulesLogic(o)?await w.evaluateRuleLogic(t,o)===!0:!0},U=(t,e,s)=>{const o=e.name,i=e.setup(t);if(i){const u=s[o]??{};s[o]=Object.freeze({...u,...i})}},W=f.createDomain("component"),G=S.createFactory(({client:t,component:e,name:s})=>{const o=t.frameworks.getByName(e.frameworkName);return{name:s,component:e,frameworkStore:o}});function J(t){return S.invoke(G,t)}const Y=S.createFactory(({client:t})=>{const e=W.store({}),s=f.createApi(e,{register(r,n){return{...r,[n.name]:n}}});function o(r,n){e.getState()[r]&&b.logger("warn",`Component '${r}' already registered. Registering again will override the previous registration.`);const c=J({client:t,name:r,component:n});s.register(c)}const i=e.map(r=>Object.values(r));function u(r){return e.map(n=>n[r],{skipVoid:!1})}return{register:o,getByName:u,listStore:i}});function Q(t){return S.invoke(Y,t)}const A=(t,e,s)=>{s.register(t,e)},X=f.createDomain("framework"),Z=S.createFactory(({client:t})=>{const e=X.store({}),s=f.createApi(e,{register(r,n){return{...r,[n.name]:n.framework}}});function o(r,n){e.getState()[r]&&b.logger("warn",`Framework '${r}' already registered. Registering again will override the previous registration.`),s.register({name:r,framework:n})}const i=e.map(r=>Object.values(r));function u(r){return e.map(n=>n[r],{skipVoid:!1})}return{register:o,getByName:u,listStore:i}});function ee(t){return S.invoke(Z,t)}const te=(t,e)=>{e.register(t.name,t)},re=6e3,B=v.createStorageKey("last_ping","global"),se=t=>`${t}/api/v1/ping`,ne=async t=>{try{const e=Date.now(),s=localStorage.getItem(B);if(s&&e-parseInt(s)<re)return!0;const o=se(t.apiUrl),i={projectId:t.projectId,path:window.location.pathname},u=JSON.stringify(i),r={"Content-Type":"application/json"},n=document.getElementById("picked_script"),m=n==null?void 0:n.dataset.verceltoken;m&&(r["x-vercel-protection-bypass"]=m);const l=(await fetch(o,{method:"POST",headers:r,body:u})).ok;return l&&localStorage.setItem(B,e.toString()),l}catch(e){return b.logger("error",e),!1}};function oe(t){const e=typeof window<"u",s={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(s)}const ie=f.createDomain("predicate"),ae=S.createFactory(({client:t})=>{const e=ie.store({}),s=f.createApi(e,{register(r,n){return{...r,[n.name]:{name:n.name,predicate:n.predicate}}}});function o(r,n){e.getState()[r]&&b.logger("warn",`Predicate '${r}' already registered. Registering again will override the previous registration.`),s.register(Object.freeze({name:r,predicate:n}))}const i=e.map(r=>Object.values(r));function u(r){return e.map(n=>n[r],{skipVoid:!1})}return{register:o,getByName:u,listStore:i}});function ce(t){return S.invoke(ae,t)}const ue=(t,e,s)=>{s.register(t,e)},D=f.createDomain("feature"),le=S.createFactory(()=>{const t=D.store({}),e=D.store([]),s=f.createApi(t,{register(c,l){return{...c,[l.id]:l.feature}}});function o(c,l){t.getState()[c]&&b.logger("warn",`Feature '${c}' already registered. Registering again will override the previous registration.`);const d={id:c,feature:{...l,id:c}};s.register(Object.freeze({id:c,feature:d}))}const i=f.createEffect(async({id:c,key:l,storage:a="local"})=>{const d=v.createStorageKey(`feature:${c}:${l}`,"global"),y=(a==="session"?v.sessionStore:v.localStore).get(d).boolean();if(y!==null)return{id:c,bucket:y}}),u=f.createEffect(c=>{if(!c)return null;const l=v.createStorageKey(`feature:${c.id}:${c.key}`,"global");(c.storage==="session"?v.sessionStore:v.localStore).set(l,c.bucket)}),r=f.attach({source:{allFeaturesStore:t,resolvedFeaturesStore:e},effect:async({allFeaturesStore:c,resolvedFeaturesStore:l},{id:a,decide:d})=>{const g=l.find(F=>F.id===a);if(g)return g;const y=c[a];if(!y)throw new Error(`Feature with id '${a}' not found`);const p=await d();return{id:y.id,bucket:p,storage:y.feature.storage}}});f.sample({clock:s.register,fn:c=>{const{id:l,feature:a}=c;return{id:l,key:a.feature.key,storage:a.feature.storage}},target:i}),f.sample({source:e,clock:[i.doneData,r.doneData],fn:(c,l)=>!l||c.some(a=>a.id===l.id)?c:[...c,l],target:e}),f.sample({source:t,clock:r.doneData,fn:(c,l)=>{var p;const{id:a,bucket:d,storage:g}=l,y=(p=c[a])==null?void 0:p.feature.key;return y?{key:y,id:a,bucket:d,storage:g}:null},target:u});const n=f.combine({allFeaturesStore:t,resolvedFeaturesStore:e}).map(({allFeaturesStore:c,resolvedFeaturesStore:l})=>Object.values(c).map(a=>{const d=l.find(g=>g.id===a.id);return d?{id:a.id,name:a.feature.name,key:a.feature.key,getBucket:()=>({id:a.id,bucket:d.bucket}),isResolved:!0}:{id:a.id,name:a.feature.name,key:a.feature.key,getBucket:async()=>await r(a.feature),isResolved:!1}}));function m(c){return t.map(l=>l[c],{skipVoid:!1})}return{register:o,getByName:m,listStore:n}});function pe(){return S.invoke(le)}const ge=(t,e,s)=>{s.register(t,e)},x=f.createDomain("history");function R(t,e){return{id:T.generateId("history-entry"),node:e,at:Date.now(),experienceId:t}}const de=S.createFactory(()=>{const t=x.store({entries:[]}),e=x.event(),s=x.event(),o=x.event(),i=x.event();t.on(e,(r,n)=>({entries:[...r.entries,R(n.experienceId,n.node)]})),t.on(s,(r,n)=>({entries:[...r.entries.slice(0,-1),R(n.experienceId,n.node)]})),t.on(i,(r,n)=>n);function u(r,n){const m={lastStepIndex:-1,secondLastStepIndex:-1};for(let c=r.length-1;c>=0;c--){const l=r[c],a=l==null?void 0:l.node;if(!(!a||!w.isStepNode(a))&&!(n&&(l==null?void 0:l.experienceId)!==n))if(m.lastStepIndex===-1)m.lastStepIndex=c;else{m.secondLastStepIndex=c;break}}return m}return t.on(o,(r,n)=>{const{secondLastStepIndex:m}=u(r.entries,n.experienceId),c=m!==-1?r.entries.slice(0,m+1):r.entries;return{...r,entries:c}}),{push:e,replace:s,back:o,restore:i,entriesStore:t.map(r=>r.entries)}});function fe(){return S.invoke(de)}const me=()=>f.createEvent(),ye=f.createDomain("field"),he=S.createFactory(()=>{const t=ye.store({}),e=f.createApi(t,{register(r,n){return{...r,[n.field.id]:n.field}}});function s(r){e.register({field:r})}const o=t.map(r=>Object.values(r));function i(r){return t.map(n=>n[r]||null)}function u(r){return t.map(n=>Object.values(n).find(m=>m.name===r)||null)}return{register:s,getById:i,listStore:o,getByName:u}});function Se(){return S.invoke(he)}const ve=(t,e)=>{e.register(t)},ke=f.createDomain("response"),we=S.createFactory(({client:t})=>{const e=ke.store({}),s=f.createEvent(),o=f.createEvent(),i=f.createApi(e,{register(a,d){return{...a,[d.fieldId]:d.response}},clear(a,d){const{[d]:g,...y}=a;return y},clearAll(){return{}}});function u(a,d){i.register({fieldId:a,response:d})}async function r(a){const d=[];return await Promise.allSettled(Object.entries(a).map(async([g,y])=>{let p=y;const F=t.fields.getById(g).getState();if(!F){d.push({fieldId:g,userMessage:`Field '${g}' not found`,systemMessage:`No field with ID '${g}' exists. Available field IDs are: ${Object.keys(t.fields.listStore.getState()).join(",")}.`,value:p});return}if(F.multiple&&(typeof p=="string"||typeof p=="number"||typeof p=="boolean")&&(p=[p]),!M.isEmpty(F.validation)){const I=await w.evaluateRuleLogic(t,F.validation,{$input:p});if(typeof I=="string"){d.push({fieldId:g,userMessage:I,systemMessage:`Field validation resulted in an error: ${I}.`,value:p});return}if(I===!1){d.push({fieldId:g,userMessage:"This field is invalid",systemMessage:"Field validation resulted in an unspecified error.",value:p});return}}if(F.required&&(typeof p>"u"||p===null||p===""||Array.isArray(p)&&!p.length)){d.push({fieldId:g,userMessage:"This field is required",systemMessage:"Field is required.",value:p});return}if(!F.multiple&&Array.isArray(p)&&p.length>1){d.push({fieldId:g,userMessage:"This field expects a single response",systemMessage:"Field expects a single response.",value:p});return}if(F.options){const I=F.options.map(E=>E.value),C=Array.isArray(p)?p:[p];Array.isArray(p)&&(C.every(E=>I.includes(E))||d.push({fieldId:g,userMessage:"This field expects a valid option",systemMessage:`Field expects a valid option. Valid options are: ${I.join(", ")}`,value:p}))}})),d.length?{errors:d}:(Object.entries(a).forEach(([g,y])=>{u(g,y)}),{errors:[]})}const n=e.map(a=>a),m=e.map(a=>Object.keys(a).map(g=>({fieldId:g,value:a[g]})));function c(a){const d=t.fields.getById(a),g=e.map(y=>y[a]||null);return f.combine({f:d,r:g},({f:y,r:p})=>p||(y!=null&&y.defaultValue?y.defaultValue:null))}function l(a){const d=t.fields.getByName(a);return f.combine({f:d,s:e},({f:g,s:y})=>{const p=g&&y[g.id]||null;return p||(g!=null&&g.defaultValue?g.defaultValue:null)})}return f.sample({clock:s,target:i.clearAll}),f.sample({clock:o,target:i.clear}),{register:u,clearAll:s,clear:o,commit:r,listStore:m,getAllStore:n,getByFieldId:c,getByFieldName:l}});function Fe(t){return S.invoke(we,t)}const be=()=>"0.0.1-dev.1756875690387";function Ie(){if(k.supportsDocument()){const t=[document.currentScript,document.getElementById("picked_script"),document.getElementById("picked"),document.getElementById("cvly"),document.getElementById("cvly-x")];for(const e of t)if(e!=null&&e.dataset.api)return e.dataset.api}return"https://api.picked.app"}function xe(){if(!k.supportsWindow())return{};const t=new URLSearchParams(window.location.search),e={},s=new Set;for(const[i]of t.entries())i.startsWith("picked-")&&s.add(i);for(const i of s){const u=i.replace("picked-","");e[u]=t.getAll(i)}const o=v.createStorageKey("s");if(s.size>0)v.sessionStore.set(o,e);else{const i=v.sessionStore.get(o);if(i)return i.json()||{}}return e}class P{constructor(e){h(this,"options");h(this,"isReady",!1);h(this,"project");h(this,"plugins",{});h(this,"eventBus",me());h(this,"organizationId");h(this,"projectId");h(this,"apiUrl");h(this,"searchParams",xe());h(this,"history",fe());h(this,"components",Q({client:this}));h(this,"experienceInstances",w.createExperienceInstanceIndex({client:this}));h(this,"experiences",q({client:this}));h(this,"frameworks",ee({client:this}));h(this,"predicates",ce({client:this}));h(this,"features",pe());h(this,"fields",Se());h(this,"responses",Fe({client:this}));b.logger("info","Picked client initializing."),this.organizationId=e.organizationId,this.projectId=e.projectId,this.options=Object.freeze(e),this.apiUrl=e.apiUrl||Ie(),this.setupPlugins(),this.setupFeatures(),this.setupPredicates(),this.eventBus({type:"initialized",version:be()}),b.logger("info","Picked client initialized.")}start(){ne(this),(async()=>{k.supportsDocument()&&(document.body&&await j(this),await w.domInteractive(),await j(this),this.eventBus({type:"ready"}),this.isReady=!0)})()}registerFramework(e){te(e,this.frameworks)}registerComponent(e,s){A(e,s,this.components)}registerPlugin(e){U(this,e,this.plugins)}registerFeature(e,s){ge(e,s,this.features)}registerPredicate(e,s){ue(e,s,this.predicates)}registerField(e){ve(e,this.fields)}registerExperience(e){e.component&&A(`experience:${e.id}`,e.component,this.components),_(e,this.experiences)}getStateSnapshot(){return oe(this)}async launchExperienceById(e){const s=this.experiences.getById(e).getState();if(!s){b.logger("warn",`Experience with id '${e}' not found.`);return}O(this,s)}setupPlugins(){var e;(e=this.options.plugins)==null||e.forEach(s=>{if(Array.isArray(s)){s.forEach(i=>{this.registerPlugin(i)});return}const o=typeof s=="function"?s():s;if(Array.isArray(o)){o.forEach(i=>this.registerPlugin(i));return}this.registerPlugin(o)})}setupFeatures(){const e=this.options.features;e&&(Object.entries(e).forEach(([s,o])=>{const i=typeof o=="function"?o():o;this.registerFeature(s,i)}),this.searchParams.feature&&this.searchParams.feature.forEach(s=>{try{const[o,i]=s.split(":");if(!o||!i)return;let u=i;(u==="true"||u==="false")&&(u=!!u),this.registerFeature(o,{key:"*",name:o,decide:()=>u,storage:"session"})}catch{}}))}setupPredicates(){const e=this.options.predicates;e&&Object.entries(e).forEach(([s,o])=>{if(typeof o!="function"){b.logger("warn",`Predicate "${s}" is not a function.`);return}this.registerPredicate(s,o)})}getPluginConfig(e){return this.plugins[e]??{}}}h(P,"logger",b.logger);const Ee=t=>{const e=new P(t);return k.bindClient(e),e};exports.isPickedRoot=w.isPickedRoot;exports.createStorageKey=v.createStorageKey;exports.localStore=v.localStore;exports.sessionStore=v.sessionStore;exports.subscribe=v.subscribe;exports.supportsCookies=k.supportsCookies;exports.supportsDocument=k.supportsDocument;exports.supportsHistory=k.supportsHistory;exports.supportsIntersectionObserver=k.supportsIntersectionObserver;exports.supportsLocalStorage=k.supportsLocalStorage;exports.supportsLocation=k.supportsLocation;exports.supportsSessionStorage=k.supportsSessionStorage;exports.supportsShadowRoot=k.supportsShadowRoot;exports.supportsWindow=k.supportsWindow;exports.Picked=P;exports.createClient=Ee;
|
|
@@ -1,2 +1 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const h=require("../../../id-BKIWbSTy.cjs"),o={serialize(i){return JSON.stringify(i)},deserialize(i){return JSON.parse(i)}},N=i=>({name:"create-experience",setup:a=>{i.experiences.forEach(d=>{const s=d.serialize(),l=o.deserialize(s);l.component=d.component,a.registerExperience(l),l.fields.forEach(p=>{a.registerField(p)})})}}),y=(i,a)=>{const d={id:h.generateId("step"),label:i.label,experience:a,fields:[],node:null,nextStep(s){return this.experience.addStep(s,this)},nextConditional(s){return this.experience.addConditional(s,this)},addNextExperience(s){return this.experience.addExperience(s,this)},addField(s){return this.experience.addField(s,this)},serialize(){return o.serialize({id:this.id,label:this.label,fieldIds:this.fields.map(s=>s.id)})}};return u({step:d,type:"step"},a),d},z=()=>[0,0],u=(i,a)=>{const d={id:h.generateId("node"),position:z(),experience:a};if(i.type==="step"){const l={...d,type:"step",connectedStep:i.step,serialize(){return o.serialize({id:this.id,type:this.type,stepId:this.connectedStep.id,position:this.position,label:this.connectedStep.label})}};return l.connectedStep.node=l,l}if(i.type==="conditional"){const l={...d,type:"conditional",connectedConditional:i.conditional,serialize(){return o.serialize({id:this.id,type:this.type,conditionalId:this.connectedConditional.id,position:this.position})}};return l.connectedConditional.node=l,l}return i.type==="experience"?{...d,type:"experience",connectedExperience:i.experience,serialize(){return o.serialize({id:this.id,type:this.type,experienceId:this.connectedExperience.id,position:this.position})}}:{...d,type:"origin",serialize(){return o.serialize({id:this.id,type:this.type,position:this.position})}}},c=(i,a)=>({id:h.generateId("edge"),sourceNode:i.sourceNode,sourceNodeHandle:i.sourceNodeHandle,destinationNode:i.destinationNode,experience:a,serialize(){return o.serialize({id:this.id,sourceNodeHandle:this.sourceNodeHandle??void 0,sourceNodeId:this.sourceNode.id,destinationNodeId:this.destinationNode.id})}}),m=(i,a)=>{const d={id:h.generateId("conditional"),condition:i.condition,node:null,experience:a,addTrue(s){if(!this.node||!s.node)throw new Error("todo no node");const l=c({sourceNode:this.node,destinationNode:s.node,sourceNodeHandle:"true"},this.experience);this.experience.edges.push(l)},addFalse(s){if(!this.node||!s.node)throw new Error("todo no node");const l=c({sourceNode:this.node,destinationNode:s.node,sourceNodeHandle:"false"},this.experience);this.experience.edges.push(l)},serialize(){return o.serialize({id:this.id,condition:this.condition})}};return u({conditional:d,type:"conditional"},a),d},g=i=>{var d;return{id:h.generateId("field"),name:i.name,type:i.type,label:i.label,placeholder:i.placeholder,description:i.description,helpText:i.helpText,defaultValue:i.defaultValue,multiple:i.multiple,validation:i.validation,required:i.required,options:((d=i.options)==null?void 0:d.map(s=>({...s,id:h.generateId("option")})))||null,policies:i.policies,serialize(){const s={id:this.id,name:this.name,label:this.label,placeholder:this.placeholder,required:this.required,description:this.description,helpText:this.helpText,validation:this.validation,policies:this.policies},l=typeof this.defaultValue=="string"?this.defaultValue:null,p=typeof this.defaultValue=="number"?this.defaultValue:null,n=typeof this.defaultValue=="boolean"?this.defaultValue:null;switch(this.type){case"text":if(this.multiple){let e=null;if(Array.isArray(this.defaultValue)){e=[];for(const t of this.defaultValue)typeof t=="string"&&e.push(t);e.length===0&&(e=null)}return o.serialize({...s,type:"text",multiple:!0,defaultValue:e,options:this.options?this.options.map(t=>({id:t.id,label:t.label,value:`${t.value}`})):null})}return o.serialize({...s,type:"text",multiple:!1,defaultValue:l,options:this.options?this.options.map(e=>({id:e.id,label:e.label,value:`${e.value}`})):null});case"number":if(this.multiple){let e=null;if(Array.isArray(this.defaultValue)){e=[];for(const t of this.defaultValue)typeof t=="number"&&e.push(t);e.length===0&&(e=null)}return o.serialize({...s,type:"number",multiple:!0,defaultValue:e,options:this.options?this.options.map(t=>({id:t.id,label:t.label,value:Number(t.value)})):null})}return o.serialize({...s,type:"number",multiple:!1,defaultValue:p,options:this.options?this.options.map(e=>({id:e.id,label:e.label,value:Number(e.value)})):null});case"boolean":if(this.multiple){let e=null;if(Array.isArray(this.defaultValue)){e=[];for(const t of this.defaultValue)typeof t=="boolean"&&e.push(t);e.length===0&&(e=null)}return o.serialize({...s,type:"boolean",multiple:!0,defaultValue:e,options:this.options?this.options.map(t=>({id:t.id,label:t.label,value:!!t.value})):null})}return o.serialize({...s,type:"boolean",multiple:!1,defaultValue:n,options:this.options?this.options.map(e=>({id:e.id,label:e.label,value:!!e.value})):null});default:throw new Error("Unsupported field type")}}}},b=i=>{const a=[],d=[],s=[],l=[],p=[];return{id:i.id,component:i.component,type:i.type,name:i.name,decide:i.decide,targets:i.targets,steps:a,nodes:d,edges:s,fields:p,conditionals:l,addStep(n,e){let t=e==null?void 0:e.node;this.nodes.length===0&&(t=u({type:"origin"},this),this.nodes.push(t));const r="serialize"in n?n:y(n,this);if(t){if(!r.node)throw new Error("todo no node");const f=c({sourceNode:t,destinationNode:r.node,sourceNodeHandle:null},this);this.edges.push(f)}return this.steps.includes(r)||(this.steps.push(r),r.node&&this.nodes.push(r.node)),r},addConditional(n,e){let t=e==null?void 0:e.node;this.nodes.length===0&&(t=u({type:"origin"},this),this.nodes.push(t));const r="serialize"in n?n:m(n,this);if(t){if(!r.node)throw new Error("todo no node");const f=c({sourceNode:t,destinationNode:r.node,sourceNodeHandle:null},this);this.edges.push(f)}return this.conditionals.includes(r)||(this.conditionals.push(r),r.node&&this.nodes.push(r.node)),r},addExperience(n,e){let t=e==null?void 0:e.node;this.nodes.length===0&&(t=u({type:"origin"},this),this.nodes.push(t));const r=u({type:"experience",experience:n},this);if(this.nodes.push(r),t){const f=c({sourceNode:t,destinationNode:r,sourceNodeHandle:null},this);this.edges.push(f)}return n},addField(n,e){const t="serialize"in n?n:g(n);return e&&e.fields.push(t),this.fields.includes(t)||this.fields.push(t),t},serialize(){return o.serialize({id:this.id,type:this.type,component:this.component,name:this.name,decide:this.decide,targets:this.targets,steps:this.steps.map(n=>o.deserialize(n.serialize())),nodes:this.nodes.map(n=>o.deserialize(n.serialize())),edges:this.edges.map(n=>o.deserialize(n.serialize())),conditionals:this.conditionals.map(n=>o.deserialize(n.serialize())),fields:this.fields.map(n=>o.deserialize(n.serialize()))})}}};exports.createConditional=m;exports.createEdge=c;exports.createExperience=b;exports.createExperiencePlugin=N;exports.createField=g;exports.createNode=u;exports.createStep=y;exports.serialization=o;
|
|
2
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1,2 +1 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("effector"),o=require("../../../storage-BPJwmlva.cjs"),g=require("../../../logger-BsmHUUw1.cjs"),S=({storage:i="local"}={})=>({name:"experience-browserstorage-plugin",setup:n=>{const c=i==="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),s=c.get(t).boolean();e.setOpen(s??e.isOpenStore.getState())});r.sample({source:n.eventBus,filter:e=>e.type==="experience_initialized",fn:e=>e.experienceInstance,target:a});const l=r.createEffect(async e=>{const t=o.createStorageKey("open-close","experience",e),s=e.isOpenStore.getState();c.set(t,s)}),p=e=>r.sample({source:e.isOpenStore,fn:()=>e,target:l});n.experienceInstances.listStore.watch(e=>{e.forEach(t=>p(t))})}});exports.experienceBrowserStoragePlugin=S;
|
|
2
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1,2 +1 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("effector"),o=require("../../../storage-BPJwmlva.cjs"),i=o.createStorageKey("history","global"),l=({storage:a="local"}={})=>({name:"history-browserstorage-plugin",setup:r=>{const s=a==="local"?o.localStore:o.sessionStore,n=t.createEffect(async()=>{const e=s.get(i).json();e&&r.history.restore({entries:e})}),c=t.createEffect(async e=>{s.set(i,e)});t.sample({source:r.eventBus,filter:e=>e.type==="initialized",target:n}),t.sample({source:r.history.entriesStore,target:c})}});exports.historyBrowserStoragePlugin=l;
|
|
2
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1,2 +1 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const o=require("effector"),l=require("../../../storage-BPJwmlva.cjs"),c=l.createStorageKey("responses","global"),b=({storage:i="local"}={})=>({name:"responses-browserstorage-plugin",setup:s=>{const r=i==="local"?l.localStore:l.sessionStore,p=o.createEffect(async()=>{const e=r.get(c).json();if(!e)return null;Object.entries(e).forEach(([n,t])=>{s.responses.register(n,t)})}),u=o.createEffect(async e=>{const n=r.get(c).json(),t={};Object.entries(e).forEach(([g,S])=>{const a=s.fields.getById(g).getState();!(a!=null&&a.policies.doNotStoreValue)&&(t[g]=S)});const f={...n,...t};r.set(c,f)});o.sample({source:s.eventBus,filter:e=>e.type==="initialized",target:p}),o.sample({source:s.responses.getAllStore,target:u})}});exports.responsesBrowserStoragePlugin=b;
|
|
2
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1,2 +1 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const l=require("effector"),w="picked";async function d(r){const{storeName:o,version:a=1,keyPath:n="id"}=r;return new Promise((i,t)=>{const s=indexedDB.open(w,a);s.onupgradeneeded=()=>{const e=s.result;e.objectStoreNames.contains(o)||e.createObjectStore(o,n?{keyPath:n}:void 0)},s.onsuccess=()=>i(s.result),s.onerror=()=>{var e;return t(new Error((e=s.error)==null?void 0:e.message))}})}async function g(r,o){return new Promise((a,n)=>{const s=r.transaction(o,"readonly").objectStore(o).getAll();s.onsuccess=()=>a(s.result),s.onerror=()=>{var e;return n(new Error((e=s.error)==null?void 0:e.message))}})}async function x(r,o,a){return new Promise((n,i)=>{const e=r.transaction(o,"readwrite").objectStore(o).put(a);e.onsuccess=()=>n(),e.onerror=()=>{var c;return i(new Error((c=e.error)==null?void 0:c.message))}})}async function y(r,o,a){return new Promise((n,i)=>{const e=r.transaction(o,"readwrite").objectStore(o).delete(a);e.onsuccess=()=>n(),e.onerror=()=>{var c;return i(new Error((c=e.error)==null?void 0:c.message))}})}async function b(r,o){return new Promise((a,n)=>{const s=r.transaction(o,"readwrite").objectStore(o).clear();s.onsuccess=()=>a(),s.onerror=()=>{var e;return n(new Error((e=s.error)==null?void 0:e.message))}})}const u="responses",p={storeName:u,keyPath:"fieldId"},E=()=>({name:"responses-indexdb-plugin",setup:r=>{const o=l.createEffect(async()=>{const t=await d(p),e=(await g(t,u)).reduce((c,{fieldId:f,value:m})=>(c[f]=m,c),{});await r.responses.commit(e)}),a=l.createEffect(async t=>{t.forEach(s=>{d(p).then(e=>{x(e,u,s)}).catch(e=>{console.error("Failed to store response in IndexedDB:",e)})})}),n=l.createEffect(async()=>{const t=await d(p);await b(t,u)}),i=l.createEffect(async t=>{const s=await d(p);await y(s,u,t)});l.sample({source:r.eventBus,filter:t=>t.type==="initialized",target:o}),l.sample({clock:r.responses.listStore,source:{responses:r.responses.listStore,fields:r.fields.listStore},fn:({responses:t,fields:s})=>{const e=s.filter(c=>!c.policies.doNotStoreValue);return t.filter(c=>e.some(f=>f.id===c.fieldId))},target:a}),l.sample({clock:r.responses.clearAll,target:n}),l.sample({clock:r.responses.clear,target:i})}});exports.responsesIndexedDBPlugin=E;
|
|
2
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1,2 +1 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const a={homepage:/^\/$/,productPage:/(?:^|\/)products\/(?<productHandle>[^/]+)\/?$/,collection:/^\/collections\/[^/]+\/?$/,page:/(?:^|\/)pages\/[^/]+$/,blog:/(?:^|\/)blogs\/(?<blogHandle>[^/]+)\/?$/,article:/^\/blogs\/[^/]+\/(?<article>[^/]+)\/?$/,cart:/(?:^|\/)cart\/[^/]+$/,checkout:/^\/checkout\/.+/,appProxy:/^\/(?:a|apps|community|tools)\/(?<proxyTarget>[^/]+)/,accountWildcard:/^\/account\/.+/,accountLogin:/^\/account\/login(?:\/|$)/,accountRegister:/^\/account\/register(?:\/|$)/},n=/^\/collections\/(?<collectionHandle>[^/]+)(?:\/|$)/,t=(e,c)=>c?!!e.exec(c.pathname):!1,o=(e,c)=>{if(c){const i=e.exec(c.pathname);if(i)return i[1]}},g={"is-page":({location:e})=>t(a.page,e),"get-page-handle":({location:e})=>o(a.page,e),"is-product-page":({location:e})=>t(a.productPage,e),"get-product-handle":({location:e})=>o(a.productPage,e),"is-collection-page":({location:e})=>t(a.collection,e),"get-collection-handle":({location:e})=>o(n,e),"is-blog-page":({location:e})=>t(a.blog,e),"get-blog-handle":({location:e})=>o(a.blog,e),"is-article-page":({location:e})=>t(a.article,e),"get-article-handle":({location:e})=>o(a.article,e),"is-app-proxy-page":({location:e})=>t(a.appProxy,e),"get-app-proxy-handle":({location:e})=>o(a.appProxy,e),"is-account-page":({location:e})=>t(a.accountWildcard,e),"is-login-page":({location:e})=>t(a.accountLogin,e),"is-register-page":({location:e})=>t(a.accountRegister,e),"is-cart-page":({location:e})=>t(a.cart,e),"is-checkout-page":({location:e})=>t(a.checkout,e),"is-homepage":({location:e})=>t(a.homepage,e)},l=()=>({name:"shopify",setup:e=>{Object.entries(g).forEach(([c,i])=>{e.registerPredicate(`shopify-${c}`,i)})}});exports.shopifyPlugin=l;
|
|
2
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1,2 +1 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const i=require("../../../supports-C0y3-V5V.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;
|
|
2
|
-
//# sourceMappingURL=index.js.map
|
package/dist/cjs/server/index.js
CHANGED
|
@@ -1,2 +1 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("effector"),k=require("../../experience-instance-6ZKZS7dF.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:f,resolve:t}=S(),o=r.createEvent(),s=r.createEvent(),l=r.createEvent(),u=r.createEvent(),p=r.createEvent(),g=c.experiences.listStore.map(e=>e.map(n=>k.createExperienceInstance({client:c,experience:n}))),a=r.createStore({currentExperienceIndex:0,renderedExperiences:[],isComplete:!1}),m=r.createEffect(async({experience:e,availableRenderers:n,startRendererIndex:v=0})=>{if(!e)return null;for(let d=v;d<n.length;d++){const x=n[d],E=e.componentStore.getState();if(E&&(x!=null&&x.isValidComponent(E.component)))return{rendered:await x.render(E.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(u,e=>({...e,isComplete:!0})).reset(o),r.sample({clock:o,target:s}),r.sample({clock:s,source:{experiences:g,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:m}),r.sample({clock:m.doneData,filter:e=>e!==null,fn:e=>e.rendered.body,target:l}),r.sample({clock:l,target:s}),r.sample({clock:m.doneData,filter:e=>e===null,target:p}),r.sample({clock:p,target:s}),r.sample({clock:[s,p,l],source:{experiences:g,state:a},filter:({experiences:e,state:n})=>n.currentExperienceIndex>=e.length,target:u});const I=r.attach({source:a,effect:e=>{e.isComplete&&t(e.renderedExperiences)}});return r.sample({clock:u,target:I}),o(),f}exports.render=C;
|
|
2
|
-
//# sourceMappingURL=index.js.map
|
package/dist/esm/index.js
CHANGED
|
@@ -562,7 +562,7 @@ const Ne = (t, e) => {
|
|
|
562
562
|
function Me(t) {
|
|
563
563
|
return w(Le, t);
|
|
564
564
|
}
|
|
565
|
-
const ze = () => "0.0.
|
|
565
|
+
const ze = () => "0.0.1-dev.1756875690387";
|
|
566
566
|
function _e() {
|
|
567
567
|
if (M()) {
|
|
568
568
|
const t = [
|
|
@@ -742,4 +742,3 @@ export {
|
|
|
742
742
|
pt as supportsShadowRoot,
|
|
743
743
|
re as supportsWindow
|
|
744
744
|
};
|
|
745
|
-
//# sourceMappingURL=index.js.map
|
package/dist/esm/server/index.js
CHANGED
|
@@ -1,2 +1 @@
|
|
|
1
1
|
"use strict";const i=require("effector"),O=require("@withease/factories"),T=require("./supports-C0y3-V5V.cjs"),M=require("./logger-BsmHUUw1.cjs"),ie=require("./object-BbFTsGh3.cjs");function ce(e){return typeof e=="number"&&!isNaN(e)}function B(e){return typeof e=="string"}function w(e){return Array.isArray(e)}function K(e){return e instanceof Promise}function z(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)&&Object.keys(e).length===1}function m(e){if(ce(e))return e;const t=parseFloat(`${e}`);return isNaN(t)?0:t}function A(e){return`${e}`}const ae={"==":(e,t)=>e==t,"===":(e,t)=>e===t,"!=":(e,t)=>e!=t,"!==":(e,t)=>e!==t,">":(e,t)=>m(e)>m(t),">=":(e,t)=>m(e)>=m(t),"<":(e,t,r)=>{const n=m(e),a=m(t);if(r===void 0)return n<a;const c=m(r);return n<a&&a<c},"<=":(e,t,r)=>{const n=m(e),a=m(t);if(r===void 0)return n<=a;const c=m(r);return n<=a&&a<=c},"!!":async e=>await k(e),"!":async e=>!await k(e),"%":(e,t)=>m(e)%m(t),log:e=>(console.log(e),e),in:(e,t)=>t?B(t)?t.indexOf(A(e))!==-1:w(t)?t.includes(e):!1:!1,cat:(...e)=>e.map(A).join(""),substr:(e,t,r)=>{const n=A(e),a=m(t);if(r===void 0)return n.substr(a);const c=m(r);if(c<0){const o=n.substr(a);return o.substr(0,o.length+c)}return n.substr(a,c)},"+":(...e)=>e.reduce((t,r)=>m(t)+m(r),0),"*":(...e)=>e.reduce((t,r)=>m(t)*m(r),1),"-":(e,t)=>{const r=m(e);return t===void 0?-r:r-m(t)},"/":(e,t)=>m(e)/m(t),min:(...e)=>Math.min(...e.map(m)),max:(...e)=>Math.max(...e.map(m)),merge:(...e)=>e.reduce((t,r)=>w(r)?t.concat(r):t.concat([r]),[]),var(e,t){const r=arguments.length>1?t:null;if(e===""||e==="."||e===null||e===void 0)return this;if(typeof e=="number"&&Array.isArray(this))return e>=0&&e<this.length?this[e]:r;const n=A(e);if(n===""||n===".")return this;const a=n.split(".");let c=this;for(const o of a){if(c==null)return r;if(Array.isArray(c)){const u=parseInt(o,10);isNaN(u)?c=c[o]:c=c[u]}else c=c[o]}return c!==void 0?c:r},async missing(...e){const t=w(e[0])?e[0]:e,r=[];for(const n of t){const a=await d({var:n},this);(a===null||a==="")&&r.push(`${n}`)}return r},async missing_some(e,t){const r=await d({missing:t},this);if(!w(r)||!w(t))return[];const n=r.filter(B);return t.filter(B).length-n.length>=m(e)?[]:n},invoke(e){return typeof e!="function"?null:e()},regexp_matches(e,t){let r=e,n="";if(w(e)){const[c,o]=e;r=c,n=o}return!B(r)||!B(n)?!1:new RegExp(r,n).test(A(t))},throw(e){throw new Error(A(e))}};async function d(e,t){if(!e)return e;if(K(e))return d(await e,t);if(w(e))return Promise.all(e.map(o=>d(o,t)));if(!z(e))return e;const r=ue(e);let n=r?e[r]??[]:[];switch(w(n)||(n=[n]),r){case"if":case"?:":for(let o=0;o<n.length-1;o+=2)if(await k(await d(n[o],t)))return d(n[o+1],t);return n.length%2===1?d(n[n.length-1],t):null;case"and":{let o=null;for(const u of n)if(o=await d(u,t),!await k(o))return o;return o}case"or":{let o=null;for(const u of n)if(o=await d(u,t),await k(o))return o;return o}case"map":{const o=await d(n[0],t);return w(o)?await Promise.all(o.map(u=>d(n[1],u))):[]}case"filter":{const o=await d(n[0],t);return w(o)?(await Promise.all(o.map(async f=>{const S=await k(await d(n[1],f));return{item:f,shouldInclude:S}}))).filter(({shouldInclude:f})=>f).map(({item:f})=>f):[]}case"reduce":{const o=await d(n[0],t);if(!w(o))return n.length>2?await d(n[2],t):null;const u=n[1];let S=n.length>2?await d(n[2],t):null;for(const x of o)S=await d(u,{current:x,accumulator:S});return S}case"all":{const o=await d(n[0],t);if(!w(o)||o.length===0)return!1;for(const u of o)if(!await k(await d(n[1],u)))return!1;return!0}case"some":{const o=await d(n[0],t);if(!w(o))return!1;for(const u of o)if(await k(await d(n[1],u)))return!0;return!1}case"none":{const o=await d(n[0],t);if(!w(o))return!0;for(const u of o)if(await k(await d(n[1],u)))return!1;return!0}case"catch":try{return await d(n[0],t)}catch(o){return z(o)?await d(o,t):n[1]?await d(n[1],o):o instanceof Error?o.message:o}}const a=await Promise.all(n.map(o=>d(o,t))),c=r?ae[r]:void 0;if(!c)throw new Error(`Unrecognized operation ${r}`);return c.apply(t,a)}async function k(e){return K(e)?k(await e):!(Array.isArray(e)&&e.length===0)&&!!e}function ue(e){return Object.keys(e)[0]}function fe(e){return!ie.isEmpty(e)}async function W(e,t,r){const n=e.getStateSnapshot(),a=e.predicates.listStore.getState().reduce((u,f)=>({...u,[f.name]:()=>f.predicate(n)}),{}),c=e.features.listStore.getState().reduce((u,f)=>({...u,[f.id]:async()=>{const{bucket:S}=await f.getBucket();return S}}),{}),o={...r,responses:e.responses.getAllStore.getState(),location:typeof n.location=="object"?{hash:n.location.hash,host:n.location.host,hostname:n.location.hostname,href:n.location.href,origin:n.location.origin,pathname:n.location.pathname,port:n.location.port,protocol:n.location.protocol,search:n.location.search}:void 0,predicates:a,features:c};return await d(t,o)}function pe(e){return!T.supportsWindow()||!T.supportsDocument()?[]:Array.from(window.document.querySelectorAll(e)).filter(t=>t instanceof HTMLElement)}function le(e){if(!T.supportsShadowRoot())throw new Error("Shadow DOM is not supported in this environment");return e.attachShadow({mode:"open"})}function de(){return new Promise((e,t)=>{if(!T.supportsDocument()){t();return}document.readyState!=="loading"?e():document.addEventListener("readystatechange",()=>e(),{once:!0})})}function me(e,t){const r=new MutationObserver(n=>{document.contains(e)||(r.disconnect(),t())});r.observe(document.body,{childList:!0,subtree:!0})}const J="picked-root",H="picked-target";function ge(e,t){return e.flatMap(r=>{const n=pe(r.selector).filter(a=>!ye(a,t));return{...r,elements:n}})}function he(e){return e.flatMap(t=>t.elements.map(r=>xe(r,t.placement)))}function Se(e,t){e.classList.add(H),e.classList.add(`${H}-${t}`)}function ye(e,t){return e.classList.contains(`${H}-${t}`)}function we(e){return e.classList.contains(J)}function Ee(){const e=document.createElement("div");return e.style.display="block",e.classList.add(J),e}function xe(e,t){let r;const n=Ee();if(e instanceof Document)r=e.body.appendChild(n);else{switch(t){case"replace":e.replaceWith(n);break;case"before":e.before(n);break;case"after":e.after(n);break;case"prepend":e.prepend(n);break;default:e.append(n);break}r=n}return r}function Ie(e){return e.type==="conditional"}function F(e){return e.type==="step"}function ke(e){return e.type==="experience"}function G(e){return e.type==="origin"}const Q=(e,t,r,n,a=new Set)=>a.has(r.id)?[]:(a.add(r.id),F(r)&&!n?[r]:t.filter(o=>o.sourceNodeId===r.id).flatMap(o=>{const u=e.find(f=>f.id===o.destinationNodeId);return u?Q(e,t,u,!1,a):[]})),ve=(e,t,r)=>Q(e,t,r,!0,new Set),X=(e,t,r,n,a=new Set)=>{if(a.has(r.id))return[-1,-1];a.add(r.id);const c=t.filter(f=>f.sourceNodeId===r.id);if(c.length===0)return[0,0];let o=1/0,u=-1/0;for(const f of c){const S=e.find(I=>I.id===f.destinationNodeId);if(!S)continue;const[x,y]=X(e,t,S,!1,new Set(a));x!==-1&&(o=Math.min(o,x+1),u=Math.max(u,y+1))}return o===1/0?[-1,-1]:[o,u]},Ne=(e,t,r)=>X(e,t,r,!0,new Set),Y=(e,t,r,n=new Set)=>{if(n.has(r.id))return[-1,-1];if(n.add(r.id),r.type==="origin")return[0,0];const a=t.filter(u=>u.destinationNodeId===r.id);if(a.length===0)return[-1,-1];let c=1/0,o=-1/0;for(const u of a){const f=e.find(y=>y.id===u.sourceNodeId);if(!f)continue;const[S,x]=Y(e,t,f,new Set(n));S!==-1&&(c=Math.min(c,S+1),o=Math.max(o,x+1))}return c===1/0?[-1,-1]:[c,o]},be=(e,t,r)=>Y(e,t,r,new Set),Z=e=>e.find(r=>r.type==="origin")||null,$=(e,t,r)=>{if(!e)return Z(t);const n=r.find(c=>c.sourceNodeId===e.id);if(!n)return null;const a=t.find(c=>c.id===n.destinationNodeId);return a||null};async function Ae(e,t,r,n){const a=e?"true":"false",c=n.find(o=>o.sourceNodeHandle===a&&o.sourceNodeId===t);return r.find(o=>o.id===(c==null?void 0:c.destinationNodeId))}const j=i.createDomain("experience-instance"),Fe=O.createFactory(({client:e,experience:t,target:r})=>{const n=i.createEvent(),a=i.createEvent(),c=i.createEvent(),o=i.createEvent(),u=t.componentStore,f=j.store("transitioning"),S=e.history.entriesStore.map(s=>s.filter(l=>l.experienceId===t.id)),x=S.map(s=>s.filter(l=>F(l.node))),y=S.map(s=>{var l;return((l=s[s.length-1])==null?void 0:l.node)||null}),I=i.combine(t.treeStore,y,({steps:s},l)=>s.find(g=>l&&F(l)&&g.id===l.stepId)||null),R=i.combine(t.treeStore,y,({nodes:s,edges:l},g)=>g?ve(s,l,g):[]),p=i.combine(t.treeStore,y,({nodes:s,edges:l},g)=>g?be(s,l,g):[-1,-1]),h=i.combine(t.treeStore,y,({nodes:s,edges:l},g)=>g?Ne(s,l,g):[-1,-1]),E=j.store(!0),v=i.createApi(E,{open:()=>!0,close:()=>!1,toggle:s=>!s,set:(s,l)=>l});i.sample({source:E,filter:Boolean,target:e.eventBus.prepend(()=>({type:"experience_open",experience:t}))}),i.sample({source:E,filter:s=>!s,target:e.eventBus.prepend(()=>({type:"experience_close",experience:t}))});const N=i.createEffect(async()=>{e.history.back({experienceId:t.id})}),L=i.attach({source:t.treeStore,effect:async(s,l)=>{const g=s.nodes.find(b=>F(b)&&b.stepId===l);g&&e.history.push({experienceId:t.id,node:g})}}),q=i.attach({source:y,effect:s=>{}}),D=i.attach({source:t.treeStore,effect:async({nodes:s})=>Z(s)}),P=i.attach({source:t.treeStore,effect:async({nodes:s,edges:l},g)=>$(g,s,l)}),C=i.attach({source:t.treeStore,effect:async({nodes:s,edges:l,conditionals:g},b)=>{if(!b)return;const V=g.find(se=>se.id===b.conditionalId);if(!V)return;const re=b.id,oe=await W(e,V.condition);return Ae(!!oe,re,s,l)}}),te=i.createEffect(s=>{if(s)return e.launchExperienceById(s.experienceId)}),U=i.attach({source:[y,t.treeStore],effect:async([s,{nodes:l,edges:g}])=>$(s,l,g)}),_=i.attach({source:[y,t.treeStore],effect:async([s,{nodes:l,edges:g}])=>$(s,l,g)}),ne=i.createEffect(s=>{e.history.push({experienceId:t.id,node:s})});return i.split({source:y,match:s=>s?Ie(s)?"condition":F(s)?"step":ke(s)?"launchExperience":G(s)?"origin":"other":"none",cases:{none:D,origin:P,condition:C,step:q,launchExperience:te,__:i.createEvent()}}),i.sample({clock:[C.doneData,P.doneData,D.doneData,_.doneData,U.doneData],filter:Boolean,target:ne}),i.sample({clock:a,target:_}),i.sample({clock:a,source:I,target:e.eventBus.prepend(s=>({type:"step_submit",step:s??void 0,experience:t}))}),i.sample({clock:_.done,source:I,target:e.eventBus.prepend(s=>({type:"step_submit_success",step:s??void 0,experience:t}))}),i.sample({clock:_.fail,source:I,target:e.eventBus.prepend(s=>({type:"step_submit_error",step:s??void 0,experience:t}))}),i.sample({clock:c,target:N}),i.sample({clock:c,source:I,target:e.eventBus.prepend(s=>({type:"step_submit",step:s??void 0,experience:t}))}),i.sample({clock:o,target:L}),i.sample({source:i.combine([C.pending,P.pending,D.pending,_.pending]),fn:s=>s.some(Boolean)?"transitioning":"ready",target:f}),i.sample({clock:q.doneData,source:I,target:e.eventBus.prepend(s=>({type:"step_enter",step:s??void 0,experience:t}))}),i.sample({source:y,clock:n,filter:s=>s?G(s):!0,target:U}),n(),{experienceId:t.id,configStore:t.configStore,target:r,componentStore:u,stateStore:f,isOpenStore:E,open:v.open,close:v.close,toggleOpen:v.toggle,setOpen:v.set,treeStore:t.treeStore,currentNodeStore:y,currentStepStore:I,nextReachableStepNodesStore:R,stepsToOriginStore:p,stepsToLeafStore:h,goToNextStep:a,goToPreviousStep:c,goToStepById:o,stepsHistoryStore:x}});function ee(e){return O.invoke(Fe,e)}const Le=O.createFactory(({client:e})=>{const t=j.store({}),r=i.createEvent(),n=i.createEvent(),a=i.createEvent(),c=i.createApi(t,{register(p,h){const E=[...p[h.experienceId]??[]];return E.push(h),{...p,[h.experienceId]:E}},unregister(p,h){var N;const E=h.experienceId,v=(N=p[E])==null?void 0:N.filter(L=>L!==h);return{...p,[E]:v??[]}}}),o=i.createEffect(({experience:p,target:h})=>ee({client:e,experience:p,target:h})),u=i.createEffect(p=>{c.register(p)}),f=i.createEffect(p=>{p.target&&me(p.target,()=>{a(p)})}),S=i.createEffect(p=>{c.unregister(p)}),x=i.createEffect(p=>{const h=p.componentStore.getState();if(!h){M.logger("warn","No app component registered. Skipping init.");return}const E=h.frameworkStore.getState();if(!E){M.logger("error",`No framework registered for component '${h.name}'. Skipping rendering.`);return}const v=p.target;if(!v){M.logger("error",`No target element registered for experience '${p.experienceId}'. Skipping rendering.`);return}const N=le(v);try{E.render(N,h.component,e,p)}catch(L){M.logger("error",L)}});i.sample({clock:r,target:o}),i.sample({clock:a,target:S}),i.sample({clock:o.doneData,target:[u,f,n]}),i.sample({clock:o.doneData,target:e.eventBus.prepend(p=>({type:"experience_initialized",experienceInstance:p}))}),i.sample({clock:n,target:x});function y(p,h){r({experience:p,target:h})}const I=t.map(p=>Object.values(p).flat());function R(p){return t.map(h=>h[p]||[],{skipVoid:!1})}return{spawn:y,getByExperienceId:R,listStore:I}});function _e(e){return O.invoke(Le,e)}exports.createAppHosts=he;exports.createExperienceInstance=ee;exports.createExperienceInstanceIndex=_e;exports.domInteractive=de;exports.evaluateRuleLogic=W;exports.getTargetElements=ge;exports.isPickedRoot=we;exports.isRulesLogic=fe;exports.isStepNode=F;exports.tagTargetElement=Se;
|
|
2
|
-
//# sourceMappingURL=experience-instance-6ZKZS7dF.cjs.map
|
package/dist/id-BKIWbSTy.cjs
CHANGED
package/dist/id-BW-g3y32.js
CHANGED
package/dist/logger-BsmHUUw1.cjs
CHANGED
package/dist/logger-C9a75KZn.js
CHANGED
package/dist/object-BbFTsGh3.cjs
CHANGED
|
@@ -1,2 +1 @@
|
|
|
1
1
|
"use strict";function c(t,e,n){if(!(e in t))return;const o=t[e];if(typeof o!="function")throw new Error(`Expected '${String(e)}' to be a function`);const r=n(o);p(r,o),t[e]=r}function i(t,e,n){Object.defineProperty(t,e,{enumerable:!1,value:n,writable:!0,configurable:!0})}function p(t,e){const n=e.prototype||{};t.prototype=e.prototype=n,i(t,"__picked_original",e)}function u(t){return t===void 0||typeof t=="object"&&t!==null&&t.constructor===Object&&Object.keys(t).length===0}exports.isEmpty=u;exports.patchMethod=c;
|
|
2
|
-
//# sourceMappingURL=object-BbFTsGh3.cjs.map
|
package/dist/object-JwZ58NOH.js
CHANGED
|
@@ -1,2 +1 @@
|
|
|
1
1
|
"use strict";function f(e,t="global",o){let s="picked";if(t==="experience"){if(!o)throw new Error("Experience instance is required to scope storage to an experience");s=`${s}:${o.experienceId}`}return`${s}:${e}`}function l(e,t){const o=t==="local"?localStorage:sessionStorage,s=o.getItem(e),r=o.getItem(`${e}:expires-at`);if(r){const n=new Date,i=new Date(r);if(n>i)return c(e,t),{text:()=>null,json:()=>null,boolean:()=>null}}return{text(){return s},json(){return s?JSON.parse(s):null},boolean(){return s?s==="true":null}}}function u(e,t,o,s){const r=o==="local"?localStorage:sessionStorage,n=typeof t!="string"?JSON.stringify(t):t;if(r.setItem(e,n),typeof s=="number"){const g=new Date(Date.now()+s).toISOString();r.setItem(`${e}:expires-at`,g)}}function c(e,t){const o=t==="local"?localStorage:sessionStorage;o.removeItem(e),o.removeItem(`${e}:expires-at`)}function a(e,t,o,s){const r=t==="local"?localStorage:sessionStorage;function n(i){i.storageArea===r&&i.key===e&&s(o(e))}return window.addEventListener("storage",n),function(){window.removeEventListener("storage",n)}}const S={get(e){return l(e,"session")},set(e,t,o){u(e,t,"session",o)},remove(e){c(e,"session")},subscribe(e,t){return a(e,"session",this.get,t)}},m={get(e){return l(e,"local")},set(e,t,o){u(e,t,"local",o)},remove(e){c(e,"local")},subscribe(e,t){return a(e,"local",this.get,t)}};exports.createStorageKey=f;exports.localStore=m;exports.sessionStore=S;exports.subscribe=a;
|
|
2
|
-
//# sourceMappingURL=storage-BPJwmlva.cjs.map
|
package/dist/storage-D87xFySf.js
CHANGED
|
@@ -1,2 +1 @@
|
|
|
1
1
|
"use strict";const r=Symbol("Picked"),t=globalThis,n=o=>{t[r]=o};function e(){try{return"location"in t&&!!t.location}catch{return!1}}function s(){try{return"history"in t&&!!t.history}catch{return!1}}function c(){try{return"localStorage"in t&&!!t.localStorage}catch{return!1}}function u(){try{return"sessionStorage"in t&&!!t.sessionStorage}catch{return!1}}function i(){try{return"document"in t&&"cookie"in t.document}catch{return!1}}function a(){try{return"document"in t&&"createElement"in t.document&&"attachShadow"in t.document.createElement("div")}catch{return!1}}function p(){try{return"window"in t}catch{return!1}}function l(){try{return"document"in t}catch{return!1}}function f(){try{return"IntersectionObserver"in t}catch{return!1}}exports.GLOBAL_OBJ=t;exports.bindClient=n;exports.supportsCookies=i;exports.supportsDocument=l;exports.supportsHistory=s;exports.supportsIntersectionObserver=f;exports.supportsLocalStorage=c;exports.supportsLocation=e;exports.supportsSessionStorage=u;exports.supportsShadowRoot=a;exports.supportsWindow=p;
|
|
2
|
-
//# sourceMappingURL=supports-C0y3-V5V.cjs.map
|
package/package.json
CHANGED
package/dist/cjs/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../src/entities/experience/experience.ts","../../src/entities/plugin/plugin.ts","../../src/entities/component/component.ts","../../src/entities/framework/framework.ts","../../src/ping.ts","../../src/utils/state-snaphot.ts","../../src/entities/predicate/predicate.ts","../../src/entities/feature/feature.ts","../../src/entities/history/history.ts","../../src/utils/events.ts","../../src/entities/field/field.ts","../../src/entities/response/response.ts","../../src/utils/version.ts","../../src/utils/api-url.ts","../../src/utils/search-params.ts","../../src/picked.ts","../../src/exports.ts"],"sourcesContent":["import { createApi, createDomain } from 'effector'\nimport { createFactory, invoke } from '@withease/factories'\nimport type { AdaptedComponent } from '../component/component'\nimport type { Picked } from '../../picked'\nimport { evaluateRuleLogic, isRulesLogic } from '../../utils/rules-logic'\nimport type { LogicRule } from '../../logic-engine'\nimport { createAppHosts, getTargetElements, tagTargetElement } from '../../utils/dom'\nimport type { Field } from '../field/field'\n\nexport type ExperiencesListStore = ReturnType<typeof createExperienceIndex>\nexport type ExperienceStore = ReturnType<typeof createExperience>\n\nconst experienceDomain = createDomain('experience')\n\nconst createExperienceFactory = createFactory(\n ({ client, experience }: { client: Picked; experience: Experience }) => {\n const store = experienceDomain.store<Experience>(experience)\n\n const api = createApi(store, {\n merge(experienceState, payload: { experience: Partial<Experience>; strategy: 'override' }) {\n return {\n ...experienceState,\n ...payload.experience,\n }\n },\n })\n\n const configStore = store.map((experienceState) => {\n return {\n type: experienceState.type,\n name: experienceState.name,\n decisionLogic: experienceState.decide,\n targetSelectors: experienceState.targets,\n }\n })\n\n const componentStore = client.components.listStore.map(\n (components) => {\n return (\n components.find((component) => {\n return component.name === `experience:${experience.id}`\n }) ||\n components.find((component) => {\n return component.name === 'experience'\n })\n )\n },\n { skipVoid: false },\n )\n\n const treeStore = store.map((experienceState) => {\n return {\n steps: experienceState.steps,\n nodes: experienceState.nodes,\n edges: experienceState.edges,\n conditionals: experienceState.conditionals,\n }\n })\n\n return {\n id: experience.id,\n configStore,\n treeStore,\n componentStore,\n merge: api.merge,\n }\n },\n)\nexport function createExperience<T extends Parameters<typeof createExperienceFactory>[0]>(\n params: T,\n): ReturnType<typeof createExperienceFactory> {\n return invoke(createExperienceFactory, params)\n}\n\nconst createExperienceIndexFactory = createFactory(({ client }: { client: Picked }) => {\n const store = experienceDomain.store<{\n [key: Experience['id']]: ExperienceStore\n }>({})\n\n const api = createApi(store, {\n register(experiences, experience) {\n return {\n ...experiences,\n [experience.id]: experience,\n }\n },\n })\n\n function register(experience: Experience): void {\n const existingExperience = store.getState()[experience.id]\n\n if (existingExperience) {\n existingExperience.merge({ experience, strategy: 'override' })\n return\n }\n\n const experienceStore = createExperience({ client, experience })\n api.register(experienceStore)\n }\n\n const $list = store.map((experienceIndex) => {\n return Object.values(experienceIndex)\n })\n\n function getById(id: Experience['id']) {\n return store.map((state) => state[id], { skipVoid: false })\n }\n\n return {\n register,\n getById,\n listStore: $list,\n }\n})\n\nexport function createExperienceIndex<T extends Parameters<typeof createExperienceIndexFactory>[0]>(\n params: T,\n): ReturnType<typeof createExperienceIndexFactory> {\n return invoke(createExperienceIndexFactory, params)\n}\n\nexport interface ExperienceStep {\n id: string\n label: string\n fieldIds: string[]\n}\n\nexport type ExperienceNode = StepNode | ConditionalNode | LaunchExperienceNode | OriginNode\n\nexport interface BaseNode {\n id: string\n type: string\n position: [number, number]\n}\n\nexport interface StepNode extends BaseNode {\n type: 'step'\n stepId: string\n label: string\n}\n\nexport interface ConditionalNode extends BaseNode {\n type: 'conditional'\n conditionalId: string\n}\n\nexport interface LaunchExperienceNode extends BaseNode {\n type: 'experience'\n experienceId: string\n}\n\nexport interface OriginNode extends BaseNode {\n type: 'origin'\n}\n\nexport interface ExperienceEdge {\n id: string\n sourceNodeId: string\n destinationNodeId: string\n sourceNodeHandle?: string\n}\n\nexport interface ExperienceConditional {\n id: string\n condition: LogicRule\n}\n\nexport interface ExperienceTarget {\n selector: string\n placement: 'replace' | 'append' | 'prepend' | 'before' | 'after'\n}\n\nexport interface Experience {\n id: string\n name: string\n type: string // todo: come back to 'funnel' | 'widget' | 'hello-bar'\n component?: AdaptedComponent\n conditionals: ExperienceConditional[]\n decide: LogicRule | undefined\n edges: ExperienceEdge[]\n nodes: ExperienceNode[]\n fields: Field[]\n steps: ExperienceStep[]\n targets: ExperienceTarget[]\n}\n\nexport const setupExperience = (\n experience: Experience,\n experienceStore: ExperiencesListStore,\n): void => {\n experienceStore.register(experience)\n}\n\n/**\n * Initializes an experience for each target that exists in the DOM\n *\n * @param client\n * @param experience\n */\nexport const initialiseExperience = (client: Picked, experience: ExperienceStore) => {\n const { targetSelectors } = experience.configStore.getState()\n\n const targets = getTargetElements(targetSelectors, experience.id)\n\n targets.forEach(({ elements }) =>\n elements.forEach((element) => tagTargetElement(element, experience.id)),\n )\n\n const appHosts = createAppHosts(targets)\n appHosts.forEach((target) => {\n client.experienceInstances.spawn(experience, target)\n })\n}\n\n/**\n * Conditionally initializes experiences\n *\n * @param client\n */\nexport const initialiseExperiences = async (client: Picked) => {\n await Promise.all(\n client.experiences.listStore.getState().map(async (experience) => {\n const shouldRender = await shouldInitialiseExperience(client, experience)\n if (shouldRender) {\n initialiseExperience(client, experience)\n }\n }),\n )\n}\n\n/*\nFlowchart for shouldInitialiseExperience:\n\n\n +-------------+------------------+\n | Experience type = 'funnel'? |\n +-------------+------------------+\n | Yes | No\n v v\n +---------+----------+ +--------+---------+\n |`decide` is truthy? |<-+ | `targets` exists?|\n +---------+----------+ | +--------+---------+\n | Yes | No | | Yes | No\n v v | v v\n +----+---+ +---+----+ | +------------+ +---------+\n | True | | False | | | Has decide?| | False |\n +--------+ +--------+ | +------------+ +---------+\n | | Yes | No\n +--+ v\n +----+----+\n | True |\n +---------+\n\n */\nexport const shouldInitialiseExperience = async (\n client: Picked,\n experience: ExperienceStore,\n): Promise<boolean> => {\n const { type, decisionLogic, targetSelectors } = experience.configStore.getState()\n\n const targets = getTargetElements(targetSelectors, experience.id)\n\n if (targets.length < 1) {\n return false\n }\n\n if (type === 'funnel') {\n if (!decisionLogic) {\n return false\n }\n\n const result = await evaluateRuleLogic(client, decisionLogic)\n return result === true\n }\n\n if (targetSelectors.length === 0) {\n return false\n }\n\n if (isRulesLogic(decisionLogic)) {\n const result = await evaluateRuleLogic(client, decisionLogic)\n return result === true\n }\n\n return true\n}\n","import type { Picked } from '../../picked'\n\nexport interface Plugin {\n name: string\n setup: (client: Picked) => void | PluginConfig\n}\n\nexport type PluginConfig = Record<string, unknown>\n\nexport interface PluginConfigIndex {\n [key: string]: PluginConfig\n}\n\nexport const setupPlugin = (client: Picked, plugin: Plugin, plugins: PluginConfigIndex): void => {\n const pluginName = plugin.name\n\n const pluginConfig = plugin.setup(client)\n\n if (pluginConfig) {\n const existingConfig = plugins[pluginName] ?? {}\n plugins[pluginName] = Object.freeze({ ...existingConfig, ...pluginConfig })\n }\n}\n","import type { Store } from 'effector'\nimport { createApi, createDomain } from 'effector'\nimport { createFactory, invoke } from '@withease/factories'\nimport { logger } from '../../utils/logger'\nimport type { Picked } from '../../picked'\n\nexport interface AdaptedComponentStyle {\n sheets?: string[]\n css?: string[]\n}\n\nexport interface LazyAdaptedComponent<F extends string = string, C = unknown> {\n frameworkName: F\n component: Promise<{ default: C }>\n style?: AdaptedComponentStyle\n}\n\nexport interface EagerAdaptedComponent<F extends string = string, C = unknown> {\n frameworkName: F\n component: C\n style?: AdaptedComponentStyle\n}\n\nexport type AdaptedComponent<F extends string = string, C = unknown> =\n | LazyAdaptedComponent<F, C>\n | EagerAdaptedComponent<F, C>\n\nexport interface AdaptableComponents<C = AdaptedComponent<string>> {\n experience: C\n}\n\nexport type ComponentIndex = ReturnType<typeof createComponentIndex>\nexport type Component = ReturnType<typeof createComponent>\n\nconst componentDomain = createDomain('component')\n\nconst createComponentFactory = createFactory(\n ({ client, component, name }: { client: Picked; name: string; component: AdaptedComponent }) => {\n const frameworkStore = client.frameworks.getByName(component.frameworkName)\n\n return {\n name,\n component,\n frameworkStore,\n }\n },\n)\n\nexport function createComponent<T extends Parameters<typeof createComponentFactory>[0]>(\n params: T,\n): ReturnType<typeof createComponentFactory> {\n return invoke(createComponentFactory, params)\n}\n\nconst createComponentIndexFactory = createFactory(({ client }: { client: Picked }) => {\n const store = componentDomain.store<{\n [name: string]: Component\n }>({})\n\n const api = createApi(store, {\n register(components, component: Component) {\n return {\n ...components,\n [component.name]: component,\n }\n },\n })\n\n function register(name: string, component: AdaptedComponent): void {\n const existingComponent = store.getState()[name]\n\n if (existingComponent) {\n logger(\n 'warn',\n `Component '${name}' already registered. Registering again will override the previous registration.`,\n )\n }\n\n const componentStore = createComponent({ client, name, component })\n api.register(componentStore)\n }\n\n const listStore = store.map((componentIndex) => {\n return Object.values(componentIndex)\n })\n\n function getByName(name: string): Store<\n | {\n name: string\n component: AdaptedComponent\n }\n | undefined\n > {\n return store.map((componentIndex) => componentIndex[name], { skipVoid: false })\n }\n\n return {\n register,\n getByName,\n listStore,\n }\n})\n\nexport function createComponentIndex<T extends Parameters<typeof createComponentIndexFactory>[0]>(\n params: T,\n): ReturnType<typeof createComponentIndexFactory> {\n return invoke(createComponentIndexFactory, params)\n}\n\nexport const setupComponent = (\n name: string,\n component: AdaptedComponent,\n components: ComponentIndex,\n): void => {\n components.register(name, component)\n}\n","import { createApi, createDomain } from 'effector'\nimport { createFactory, invoke } from '@withease/factories'\nimport { logger } from '../../utils/logger'\nimport type { Picked } from '../../picked'\nimport type { AdaptedComponent } from '../component/component'\nimport type { ExperienceInstance } from '../experience-instance/experience-instance'\n\nexport type FrameworksStore = ReturnType<typeof createFrameworkIndex>\n\nconst frameworkDomain = createDomain('framework')\n\nexport interface Framework {\n name: string\n render: FrameworkRender\n}\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst createFrameworkIndexFactory = createFactory(({ client }: { client: Picked }) => {\n const store = frameworkDomain.store<{\n [key: string]: Framework\n }>({})\n\n const api = createApi(store, {\n register(frameworks, payload: { name: string; framework: Framework }) {\n return {\n ...frameworks,\n [payload.name]: payload.framework,\n }\n },\n })\n\n function register(name: string, framework: Framework): void {\n const existingFramework = store.getState()[name]\n\n if (existingFramework) {\n logger(\n 'warn',\n `Framework '${name}' already registered. Registering again will override the previous registration.`,\n )\n }\n\n api.register({ name, framework })\n }\n\n const listStore = store.map((frameworkIndex) => {\n return Object.values(frameworkIndex)\n })\n\n function getByName(name: string) {\n return store.map((frameworkIndex) => frameworkIndex[name], { skipVoid: false })\n }\n\n return {\n register,\n getByName,\n listStore,\n }\n})\n\nexport function createFrameworkIndex<T extends Parameters<typeof createFrameworkIndexFactory>[0]>(\n params: T,\n): ReturnType<typeof createFrameworkIndexFactory> {\n return invoke(createFrameworkIndexFactory, params)\n}\n\nexport type FrameworkRender = (\n shadowRoot: ShadowRoot,\n component: AdaptedComponent,\n client: Picked,\n experience: ExperienceInstance,\n) => void\n\nexport const setupFramework = (framework: Framework, frameworks: FrameworksStore): void => {\n frameworks.register(framework.name, framework)\n}\n","import { logger } from './utils/logger'\nimport { createStorageKey } from './utils/storage'\nimport type { Picked } from './picked'\n\nconst PING_RATE_LIMIT = 6000 // 6 seconds\nconst STORAGE_KEY = createStorageKey('last_ping', 'global')\n\n/**\n * Gets the appropriate ping endpoint URL.\n * Uses data-api attribute if set on the script tag, otherwise defaults to production URL.\n */\nconst getPingUrl = (apiUrl: string): string => {\n return `${apiUrl}/api/v1/ping`\n}\n\n/**\n * Pings the server to track the last time the library was loaded.\n * Implements rate limiting and supports Vercel branch deployments.\n *\n * @param projectId - The project identifier\n * @returns A promise that resolves to a boolean indicating success\n */\nexport const ping = async (client: Picked): Promise<boolean> => {\n try {\n const now = Date.now()\n const lastPing = localStorage.getItem(STORAGE_KEY)\n\n // Rate limit: Do not ping more than once every 6 seconds (server limit is 5)\n if (lastPing && now - parseInt(lastPing) < PING_RATE_LIMIT) {\n return true\n }\n\n const pingUrl = getPingUrl(client.apiUrl)\n const payload = {\n projectId: client.projectId,\n path: window.location.pathname,\n }\n const payloadString = JSON.stringify(payload)\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n }\n\n // Get the Vercel protection bypass token if provided\n const scriptElement = document.getElementById('picked_script')\n const vercelToken = scriptElement?.dataset.verceltoken\n\n // Only add Vercel protection bypass if token is provided\n if (vercelToken) {\n headers['x-vercel-protection-bypass'] = vercelToken\n }\n\n const response = await fetch(pingUrl, {\n method: 'POST',\n headers,\n body: payloadString,\n })\n\n const success = response.ok\n\n if (success) {\n localStorage.setItem(STORAGE_KEY, now.toString())\n }\n\n return success\n } catch (error) {\n logger('error', error)\n return false\n }\n}\n","import type { Picked } from '../picked'\nimport type { Field, FieldValue } from '../entities/field/field'\n\nexport interface StateSnapshot {\n client: Picked\n location?: Window['location']\n document?: Window['document']\n sessionStorage?: Window['sessionStorage']\n localStorage?: Window['localStorage']\n responses: {\n fieldId: string\n value: FieldValue | undefined\n }[]\n fields: Field[]\n}\n\nexport function createStateSnapshot(client: Picked): StateSnapshot {\n const isBrowser = typeof window !== 'undefined'\n const snapshot = {\n client,\n responses: client.responses.listStore.getState(),\n fields: client.fields.listStore.getState(),\n location: isBrowser ? window.location : undefined,\n document: isBrowser ? window.document : undefined,\n sessionStorage: isBrowser ? window.sessionStorage : undefined,\n localStorage: isBrowser ? window.localStorage : undefined,\n } satisfies StateSnapshot\n return Object.freeze(snapshot)\n}\n","import { createApi, createDomain } from 'effector'\nimport { createFactory, invoke } from '@withease/factories'\nimport { logger } from '../../utils/logger'\nimport type { StateSnapshot } from '../../utils/state-snaphot'\nimport type { Picked } from '../../picked'\n\nexport type Predicate = (\n snapshot: StateSnapshot,\n) => boolean | Promise<boolean> | string | Promise<string> | undefined\n\nexport type PredicatesStore = ReturnType<typeof createPredicateIndex>\n\nexport interface PredicateIndexItem {\n name: string\n predicate: Predicate\n}\n\nconst predicateDomain = createDomain('predicate')\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst createPredicateIndexFactory = createFactory(({ client }: { client: Picked }) => {\n const store = predicateDomain.store<{\n [key: string]: {\n name: string\n predicate: Predicate\n }\n }>({})\n\n const api = createApi(store, {\n register(predicates, payload: { name: string; predicate: Predicate }) {\n return {\n ...predicates,\n [payload.name]: {\n name: payload.name,\n predicate: payload.predicate,\n },\n }\n },\n })\n\n function register(name: string, predicate: Predicate): void {\n const existingPredicate = store.getState()[name]\n\n if (existingPredicate) {\n logger(\n 'warn',\n `Predicate '${name}' already registered. Registering again will override the previous registration.`,\n )\n }\n\n api.register(Object.freeze({ name, predicate }))\n }\n\n const listStore = store.map((predicateIndex) => {\n return Object.values(predicateIndex)\n })\n\n function getByName(name: string) {\n return store.map((predicateIndex) => predicateIndex[name], { skipVoid: false })\n }\n\n return {\n register,\n getByName,\n listStore,\n }\n})\n\nexport function createPredicateIndex<T extends Parameters<typeof createPredicateIndexFactory>[0]>(\n params: T,\n): ReturnType<typeof createPredicateIndexFactory> {\n return invoke(createPredicateIndexFactory, params)\n}\n\nexport const setupPredicate = (name: string, predicate: Predicate, predicates: PredicatesStore) => {\n predicates.register(name, predicate)\n}\n","import { attach, combine, createApi, createDomain, createEffect, sample } from 'effector'\nimport { createFactory, invoke } from '@withease/factories'\nimport { createStorageKey, localStore, sessionStore } from '../../utils/storage'\nimport { logger } from '../../utils/logger'\n\nexport interface Feature {\n key: string\n name: string\n decide: () => boolean | Promise<boolean> | string | Promise<string>\n storage?: 'local' | 'session'\n}\n\nexport type FeaturesStore = ReturnType<typeof createFeatureIndex>\n\nexport interface FeatureIndexItem {\n id: string\n feature: Feature & { id: string }\n}\n\nexport interface ResolvedFeature {\n id: string\n bucket: boolean | string\n key: string\n storage?: 'local' | 'session'\n}\n\nexport interface FeatureBaseBucket {\n name: string\n key: string\n id: string\n}\n\nexport interface UnresolvedFeatureBucket extends FeatureBaseBucket {\n isResolved: false\n getBucket: () => Promise<{ id: string; bucket: string | boolean }>\n}\n\nexport interface ResolvedFeatureBucket extends FeatureBaseBucket {\n isResolved: true\n getBucket: () => { id: string; bucket: string | boolean }\n}\n\nexport type FeatureBucket = UnresolvedFeatureBucket | ResolvedFeatureBucket\n\nconst featureDomain = createDomain('feature')\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst createFeatureIndexFactory = createFactory(() => {\n const allFeaturesStore = featureDomain.store<{\n [key: string]: FeatureIndexItem\n }>({})\n\n const resolvedFeaturesStore = featureDomain.store<\n { id: string; bucket: boolean | string; storage?: 'local' | 'session' }[]\n >([])\n\n const api = createApi(allFeaturesStore, {\n register(features, payload: { id: string; feature: FeatureIndexItem }) {\n return {\n ...features,\n [payload.id]: payload.feature,\n }\n },\n })\n\n function register(id: string, feature: Feature): void {\n const existingFeature = allFeaturesStore.getState()[id]\n\n if (existingFeature) {\n logger(\n 'warn',\n `Feature '${id}' already registered. Registering again will override the previous registration.`,\n )\n }\n\n const featureIndexItem: FeatureIndexItem = {\n id,\n feature: {\n ...feature,\n id,\n },\n }\n\n api.register(\n Object.freeze({\n id,\n feature: featureIndexItem,\n }),\n )\n }\n\n const getStoreResolvedValueFx = createEffect(\n async ({\n id,\n key,\n storage = 'local',\n }: {\n id: string\n key: string | undefined\n storage?: 'local' | 'session'\n }) => {\n const storageKey = createStorageKey(`feature:${id}:${key}`, 'global')\n const browserStorage = storage === 'session' ? sessionStore : localStore\n const resolvedFeatureLocalStorage = browserStorage.get(storageKey).boolean()\n\n // If the feature is already resolved in local storage, format it to a Bucket so it can be added to the resolved store.\n if (resolvedFeatureLocalStorage !== null) {\n return { id, bucket: resolvedFeatureLocalStorage }\n }\n },\n )\n\n const setStoreResolvedValueFx = createEffect((data: ResolvedFeature | null) => {\n if (!data) {\n return null\n }\n\n const storageKey = createStorageKey(`feature:${data.id}:${data.key}`, 'global')\n const browserStorage = data.storage === 'session' ? sessionStore : localStore\n browserStorage.set(storageKey, data.bucket)\n })\n\n const getBucket = attach({\n source: { allFeaturesStore, resolvedFeaturesStore },\n effect: async (\n { allFeaturesStore: allFeatures, resolvedFeaturesStore: resolvedFeatures },\n { id: featureId, decide }: Feature & { id: string },\n ) => {\n const resolvedFeature = resolvedFeatures.find((item) => item.id === featureId)\n if (resolvedFeature) {\n return resolvedFeature\n }\n\n const feature = allFeatures[featureId]\n if (!feature) {\n throw new Error(`Feature with id '${featureId}' not found`)\n }\n\n const resolvedValue = await decide()\n\n return { id: feature.id, bucket: resolvedValue, storage: feature.feature.storage }\n },\n })\n\n // When a function is registered to the API, check if the feature is already resolved in local storage.\n sample({\n clock: api.register,\n fn: (payload) => {\n const { id, feature } = payload\n return { id, key: feature.feature.key, storage: feature.feature.storage }\n },\n target: getStoreResolvedValueFx,\n })\n\n // When a feature is resolved from local storage, or the getBucket function, add it to the resolved features store.\n sample({\n source: resolvedFeaturesStore,\n clock: [getStoreResolvedValueFx.doneData, getBucket.doneData],\n fn: (resolvedFeatures, resolvedFeature) => {\n if (!resolvedFeature) {\n return resolvedFeatures\n }\n\n if (resolvedFeatures.some((item) => item.id === resolvedFeature.id)) {\n return resolvedFeatures\n }\n\n return [...resolvedFeatures, resolvedFeature]\n },\n target: resolvedFeaturesStore,\n })\n\n // When a feature is successfully resolved, set it in the local storage.\n sample({\n source: allFeaturesStore,\n clock: getBucket.doneData,\n fn: (allFeatures, resolvedFeature): ResolvedFeature | null => {\n const { id, bucket, storage } = resolvedFeature\n const key = allFeatures[id]?.feature.key\n if (!key) {\n return null\n }\n\n return { key, id, bucket, storage }\n },\n target: setStoreResolvedValueFx,\n })\n\n const listStore = combine({ allFeaturesStore, resolvedFeaturesStore }).map(\n ({\n allFeaturesStore: allFeatures,\n resolvedFeaturesStore: resolvedFeatures,\n }): FeatureBucket[] => {\n return Object.values(allFeatures).map((feature): FeatureBucket => {\n const isResolved = resolvedFeatures.find((item) => item.id === feature.id)\n\n // Return resolved features as syncronous. For analytics, etc\n if (isResolved) {\n return {\n id: feature.id,\n name: feature.feature.name,\n key: feature.feature.key,\n getBucket: () => ({ id: feature.id, bucket: isResolved.bucket }),\n isResolved: true,\n }\n }\n\n // If unresolved, return getBucket as the function to be called when the rule is evalutated\n return {\n id: feature.id,\n name: feature.feature.name,\n key: feature.feature.key,\n getBucket: async () => await getBucket(feature.feature),\n isResolved: false,\n }\n })\n },\n )\n\n function getByName(name: string) {\n return allFeaturesStore.map((featureIndex) => featureIndex[name], { skipVoid: false })\n }\n\n return {\n register,\n getByName,\n listStore,\n }\n})\n\nexport function createFeatureIndex(): ReturnType<typeof createFeatureIndexFactory> {\n return invoke(createFeatureIndexFactory)\n}\n\nexport const setupFeature = (name: string, feature: Feature, features: FeaturesStore) => {\n features.register(name, feature)\n}\n","import { createDomain } from 'effector'\nimport { createFactory, invoke } from '@withease/factories'\nimport type { ExperienceNode } from '../experience/experience'\nimport { isStepNode } from '../../utils/nodes'\nimport { generateId } from '../../utils/id'\n\nconst historyDomain = createDomain('history')\n\nexport interface HistoryEntry {\n id: string\n node: ExperienceNode\n at: number\n experienceId: string\n}\n\nfunction createHistoryEntry(experienceId: string, node: ExperienceNode): HistoryEntry {\n return {\n id: generateId('history-entry'),\n node,\n at: Date.now(),\n experienceId,\n }\n}\n\nconst createHistoryFactory = createFactory(() => {\n // todo: store and restore from sessionStorage\n\n const historyStore = historyDomain.store<{ entries: HistoryEntry[] }>({ entries: [] })\n\n const push = historyDomain.event<{ experienceId: string; node: ExperienceNode }>()\n const replace = historyDomain.event<{ experienceId: string; node: ExperienceNode }>()\n const back = historyDomain.event<{ experienceId?: string }>()\n const restore = historyDomain.event<{ entries: HistoryEntry[] }>()\n\n historyStore.on(push, (history, payload) => ({\n entries: [...history.entries, createHistoryEntry(payload.experienceId, payload.node)],\n }))\n\n historyStore.on(replace, (history, payload) => ({\n entries: [\n ...history.entries.slice(0, -1),\n createHistoryEntry(payload.experienceId, payload.node),\n ],\n }))\n\n historyStore.on(restore, (_, payload) => payload)\n\n // Find step nodes in the history based on the provided experience id\n function findLastTwoStepIndices(entries: HistoryEntry[], experienceId?: string) {\n const indices = { lastStepIndex: -1, secondLastStepIndex: -1 }\n\n for (let i = entries.length - 1; i >= 0; i--) {\n const entry = entries[i]\n const node = entry?.node\n\n // Skip if the node doesn't exist or isn't a step node\n if (!node || !isStepNode(node)) continue\n\n // Skip if experience id is provided but doesn't match\n if (experienceId && entry?.experienceId !== experienceId) continue\n\n // Found the first step node (last in history)\n if (indices.lastStepIndex === -1) {\n indices.lastStepIndex = i\n }\n\n // Found the second step node\n else {\n indices.secondLastStepIndex = i\n break // Stop searching after finding the second step\n }\n }\n\n return indices\n }\n\n historyStore.on(back, (history, payload) => {\n // Find the indices of the last two step nodes\n const { secondLastStepIndex } = findLastTwoStepIndices(history.entries, payload.experienceId)\n\n // Create a new entries array if the second-last step was found\n const newEntries =\n secondLastStepIndex !== -1\n ? history.entries.slice(0, secondLastStepIndex + 1)\n : history.entries\n\n return {\n ...history,\n entries: newEntries,\n }\n })\n\n return {\n push,\n replace,\n back,\n restore,\n entriesStore: historyStore.map((history) => {\n return history.entries\n }),\n }\n})\n\nexport function createHistory() {\n return invoke(createHistoryFactory)\n}\n","import { createEvent } from 'effector'\nimport type { ValidationError } from '../entities/response/response'\nimport type { ExperienceStep, ExperienceStore, StepNode } from '../entities/experience/experience'\nimport type { ExperienceInstance } from '../entities/experience-instance/experience-instance'\n\nexport interface FormPayload {\n id: string\n title: string\n}\n\nexport interface PayloadMap {\n ready: never\n experience_initialized: { experienceInstance: ExperienceInstance }\n initialized: { version: string }\n experience_open: { experience: ExperienceStore }\n experience_close: { experience: ExperienceStore }\n experience_complete: { experience: ExperienceStore }\n step_enter: { step: StepNode; experience: ExperienceStore }\n step_submit: { step: StepNode; experience: ExperienceStore }\n step_submit_success: { step: StepNode; experience: ExperienceStore }\n step_submit_error: { step: StepNode; experience: ExperienceStore }\n step_complete: { step: StepNode; experience: ExperienceStore }\n form_submit: { form: FormPayload; experience: ExperienceStore; step: StepNode }\n form_submit_success: { form: FormPayload; experience: ExperienceStore; step: StepNode }\n form_submit_error: {\n form: FormPayload\n exception: { reason: ValidationError[] }\n experience: ExperienceStore\n step: StepNode\n }\n field_validation_error: {\n exception: ValidationError\n // experience: ExperienceStore\n // step: StepNode\n } // need the errored element\n}\n\nexport type PayloadValues = PayloadMap[keyof PayloadMap]\nexport type PickedEventType = keyof PayloadMap\n\nexport interface EventBusPayload {\n type: PickedEventType\n version?: string\n form?: FormPayload\n experience?: ExperienceStore\n experienceInstance?: ExperienceInstance\n step?: ExperienceStep\n exception?: ValidationError | string\n}\nexport const createEventBus = () => createEvent<EventBusPayload>()\n\nexport type EventBus = ReturnType<typeof createEventBus>\n","import { createApi, createDomain } from 'effector'\nimport { createFactory, invoke } from '@withease/factories'\nimport type { LogicRule } from '../../logic-engine'\n\nexport type FieldsStore = ReturnType<typeof createFieldIndex>\n\nconst fieldDomain = createDomain('field')\n\nexport type PrimitiveFieldValue = string | number | boolean | null\nexport type FieldValue = PrimitiveFieldValue | PrimitiveFieldValue[]\n// | object\n// | object[]\n\nexport interface FieldBase {\n id: string\n name: string\n label: string\n type: 'text' | 'number' | 'object' | 'boolean'\n multiple: boolean\n required: boolean\n defaultValue: FieldValue\n placeholder: string | null\n description: string | null\n helpText: string | null\n validation: LogicRule\n policies: {\n doNotTrackValue?: boolean\n doNotStoreValue?: boolean\n }\n options:\n | {\n id: string\n label: string\n value: PrimitiveFieldValue\n }[]\n | null\n}\n\nexport interface FieldTextSingular extends FieldBase {\n type: 'text'\n multiple: false\n defaultValue: string | null\n options:\n | {\n id: string\n label: string\n value: string\n }[]\n | null\n}\n\nexport interface FieldTextMultiple extends FieldBase {\n type: 'text'\n multiple: true\n defaultValue: string[] | null\n options:\n | {\n id: string\n label: string\n value: string\n }[]\n | null\n}\n\nexport interface FieldNumberSingular extends FieldBase {\n type: 'number'\n multiple: false\n defaultValue: number | null\n options:\n | {\n id: string\n label: string\n value: number\n }[]\n | null\n}\n\nexport interface FieldNumberMultiple extends FieldBase {\n type: 'number'\n multiple: true\n defaultValue: number[] | null\n options:\n | {\n id: string\n label: string\n value: number\n }[]\n | null\n}\n\n// export interface FieldObjectSingular extends FieldBase {\n// type: 'object'\n// multiple: false\n// defaultValue: object | null\n// options:\n// | {\n// id: string\n// label: string\n// value: object\n// }[]\n// | null\n// }\n\n// export interface FieldObjectMultiple extends FieldBase {\n// type: 'object'\n// multiple: true\n// defaultValue: object[] | null\n// options:\n// | {\n// id: string\n// label: string\n// value: object\n// }[]\n// | null\n// }\n\nexport interface FieldBooleanSingular extends FieldBase {\n type: 'boolean'\n multiple: false\n defaultValue: boolean | null\n options:\n | {\n id: string\n label: string\n value: boolean\n }[]\n | null\n}\n\nexport interface FieldBooleanMultiple extends FieldBase {\n type: 'boolean'\n multiple: true\n defaultValue: boolean[] | null\n options:\n | {\n id: string\n label: string\n value: boolean\n }[]\n | null\n}\n\nexport type Field =\n | FieldTextSingular\n | FieldTextMultiple\n | FieldNumberSingular\n | FieldNumberMultiple\n // | FieldObjectSingular\n // | FieldObjectMultiple\n | FieldBooleanSingular\n | FieldBooleanMultiple\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst createFieldIndexFactory = createFactory(() => {\n const store = fieldDomain.store<{\n [key: string]: Field\n }>({})\n\n const api = createApi(store, {\n register(fields, payload: { field: Field }) {\n return {\n ...fields,\n [payload.field.id]: payload.field,\n }\n },\n })\n\n function register(field: Field): void {\n api.register({ field })\n }\n\n const listStore = store.map((fieldIndex) => {\n return Object.values(fieldIndex)\n })\n\n function getById(id: FieldBase['id']) {\n return store.map((fieldIndex) => fieldIndex[id] || null)\n }\n\n function getByName(name: FieldBase['name']) {\n return store.map((fieldIndex) => Object.values(fieldIndex).find((f) => f.name === name) || null)\n }\n\n return {\n register,\n getById,\n listStore,\n getByName,\n }\n})\n\nexport function createFieldIndex(): ReturnType<typeof createFieldIndexFactory> {\n return invoke(createFieldIndexFactory)\n}\n\nexport const setupField = (field: Field, fields: FieldsStore): void => {\n fields.register(field)\n}\n","import { combine, createApi, createDomain, createEvent, sample } from 'effector'\nimport { createFactory, invoke } from '@withease/factories'\nimport type { Picked } from '../../picked'\nimport type { Field, FieldValue, PrimitiveFieldValue } from '../field/field'\nimport { evaluateRuleLogic } from '../../utils/rules-logic'\nimport { isEmpty } from '../../utils/object'\n\nexport type ResponsesStore = ReturnType<typeof createResponseIndex>\n\nconst responseDomain = createDomain('response')\n\nexport type Response = FieldValue\n\nconst createResponseIndexFactory = createFactory(({ client }: { client: Picked }) => {\n const store = responseDomain.store<{\n [fieldId: Field['id']]: Response\n }>({})\n\n const clearAll = createEvent()\n const clear = createEvent<Field['id']>()\n\n const api = createApi(store, {\n register(responses, payload: { fieldId: Field['id']; response: Response }) {\n return {\n ...responses,\n [payload.fieldId]: payload.response,\n }\n },\n clear(responses, fieldId: Field['id']) {\n const { [fieldId]: removed, ...remaining } = responses\n return remaining\n },\n clearAll() {\n return {}\n },\n })\n\n function register(fieldId: Field['id'], response: Response): void {\n api.register({ fieldId, response })\n }\n\n async function commit(\n responsesToCommit: CommitResponses,\n ): Promise<{ errors: ValidationError[] }> {\n const validationErrors: ValidationError[] = []\n\n await Promise.allSettled(\n Object.entries(responsesToCommit).map(async ([fieldId, response]) => {\n let responseValue: FieldValue = response\n const field = client.fields.getById(fieldId).getState()\n\n if (!field) {\n validationErrors.push({\n fieldId,\n userMessage: `Field '${fieldId}' not found`,\n systemMessage: `No field with ID '${fieldId}' exists. Available field IDs are: ${Object.keys(client.fields.listStore.getState()).join(',')}.`,\n value: responseValue,\n })\n return\n }\n\n // If the field expects multiple values, then ensure the value is an array\n if (field.multiple) {\n if (\n typeof responseValue === 'string' ||\n typeof responseValue === 'number' ||\n typeof responseValue === 'boolean'\n ) {\n responseValue = [responseValue]\n }\n }\n\n if (!isEmpty(field.validation)) {\n // perform the rule logic validation so that any custom error messages are returned\n const validationResponse = await evaluateRuleLogic(client, field.validation, {\n $input: responseValue,\n })\n\n // Did the field validation return a negative validation message?\n if (typeof validationResponse === 'string') {\n validationErrors.push({\n fieldId,\n userMessage: validationResponse,\n systemMessage: `Field validation resulted in an error: ${validationResponse}.`,\n value: responseValue,\n })\n return\n }\n\n // Did the field validation return negative validation result?\n if (validationResponse === false) {\n validationErrors.push({\n fieldId,\n userMessage: 'This field is invalid',\n systemMessage: 'Field validation resulted in an unspecified error.',\n value: responseValue,\n })\n return\n }\n }\n\n // Is the field required?\n if (\n field.required &&\n (typeof responseValue === 'undefined' ||\n responseValue === null ||\n responseValue === '' ||\n (Array.isArray(responseValue) && !responseValue.length))\n ) {\n validationErrors.push({\n fieldId,\n userMessage: 'This field is required',\n systemMessage: 'Field is required.',\n value: responseValue,\n })\n return\n }\n\n // Does the field expect a single value?\n if (!field.multiple) {\n if (Array.isArray(responseValue) && responseValue.length > 1) {\n validationErrors.push({\n fieldId,\n userMessage: 'This field expects a single response',\n systemMessage: 'Field expects a single response.',\n value: responseValue,\n })\n return\n }\n }\n\n // Does the field specify specific options?\n if (field.options) {\n const optionValues: PrimitiveFieldValue[] = field.options.map((option) => option.value)\n\n const valuesToCheck = Array.isArray(responseValue) ? responseValue : [responseValue]\n\n if (Array.isArray(responseValue)) {\n if (\n !valuesToCheck.every((value) => {\n return optionValues.includes(value)\n })\n ) {\n validationErrors.push({\n fieldId,\n userMessage: 'This field expects a valid option',\n systemMessage: `Field expects a valid option. Valid options are: ${optionValues.join(', ')}`,\n value: responseValue,\n })\n }\n }\n }\n }),\n )\n\n // If any field is invalid, then return the validation errors instead of commiting the responses\n if (validationErrors.length) {\n return { errors: validationErrors }\n }\n\n // Commit the responses to storage\n Object.entries(responsesToCommit).forEach(([fieldId, response]) => {\n register(fieldId, response)\n })\n\n return { errors: [] }\n }\n\n const getAllStore = store.map((responseIndex) => responseIndex)\n\n const listStore = store.map((fieldIndex) => {\n const fieldIds = Object.keys(fieldIndex)\n return fieldIds.map((fieldId) => {\n return {\n fieldId,\n value: fieldIndex[fieldId],\n }\n })\n })\n\n function getByFieldId(fieldId: Field['id']) {\n const field = client.fields.getById(fieldId)\n const response = store.map((responseIndex) => responseIndex[fieldId] || null)\n\n // Return the response if already provided or fall back to the field default value\n // eslint-disable-next-line sonarjs/function-return-type\n return combine({ f: field, r: response }, ({ f, r }): FieldValue => {\n if (r) {\n return r\n }\n\n if (f?.defaultValue) {\n return f.defaultValue\n }\n\n return null\n })\n }\n\n function getByFieldName(fieldName: Field['name']) {\n const field = client.fields.getByName(fieldName)\n\n // eslint-disable-next-line sonarjs/function-return-type\n return combine({ f: field, s: store }, ({ f, s }): FieldValue => {\n const response = f ? s[f.id] || null : null\n\n if (response) {\n return response\n }\n\n if (f?.defaultValue) {\n return f.defaultValue\n }\n\n return null\n })\n }\n\n sample({\n clock: clearAll,\n target: api.clearAll,\n })\n\n sample({\n clock: clear,\n target: api.clear,\n })\n\n return {\n register,\n clearAll,\n clear,\n commit,\n listStore,\n getAllStore,\n getByFieldId,\n getByFieldName,\n }\n})\n\nexport function createResponseIndex<T extends Parameters<typeof createResponseIndexFactory>[0]>(\n params: T,\n): ReturnType<typeof createResponseIndexFactory> {\n return invoke(createResponseIndexFactory, params)\n}\n\nexport type CommitResponses = Record<Field['id'], FieldValue>\n\nexport interface ValidationError {\n fieldId: Field['id']\n\n // The error message shown to the user\n userMessage: string\n\n // The error message for debugging and LLMs\n systemMessage: string\n\n // The value received by the system\n value: FieldValue\n}\n","export const getVersion = () => {\n return '__VERSION__' // the version is injected here by the build process. e.g.: '1.2.3'\n}\n","import { supportsDocument } from './supports'\n\nexport function getApiUrlFromScripts(): string {\n if (supportsDocument()) {\n const scriptTags = [\n document.currentScript,\n document.getElementById('picked_script'),\n document.getElementById('picked'),\n document.getElementById('cvly'),\n document.getElementById('cvly-x'),\n ]\n\n for (const tag of scriptTags) {\n if (tag?.dataset.api) {\n return tag.dataset.api\n }\n }\n }\n\n return 'https://api.picked.app'\n}\n","import { supportsWindow } from './supports'\nimport { createStorageKey, sessionStore } from './storage'\n\nexport interface PickedSearchParams {\n feature?: string[]\n [key: string]: string[] | undefined\n}\n\nexport function getSearchParams(): PickedSearchParams {\n if (!supportsWindow()) {\n return {}\n }\n\n // Get all search params that start with 'picked-'\n const params = new URLSearchParams(window.location.search)\n const pickedParams: Record<string, string[]> = {}\n const pickedKeys = new Set<string>()\n\n for (const [key] of params.entries()) {\n if (key.startsWith('picked-')) {\n pickedKeys.add(key)\n }\n }\n\n for (const key of pickedKeys) {\n const cleanKey = key.replace('picked-', '')\n pickedParams[cleanKey] = params.getAll(key)\n }\n\n const storageKey = createStorageKey('s')\n if (pickedKeys.size > 0) {\n sessionStore.set(storageKey, pickedParams)\n } else {\n const storedParams = sessionStore.get<PickedSearchParams>(storageKey)\n if (storedParams) {\n return storedParams.json() || {}\n }\n }\n\n return pickedParams\n}\n","import type { Project } from './entities/project/project'\nimport {\n createExperienceIndex,\n type Experience,\n initialiseExperience,\n initialiseExperiences,\n setupExperience,\n} from './entities/experience/experience'\nimport { type Plugin, type PluginConfigIndex, setupPlugin } from './entities/plugin/plugin'\nimport { type CreateClientOptions } from './client'\nimport {\n type AdaptableComponents,\n type AdaptedComponent,\n createComponentIndex,\n setupComponent,\n} from './entities/component/component'\nimport {\n createFrameworkIndex,\n type Framework,\n setupFramework,\n} from './entities/framework/framework'\nimport { logger } from './utils/logger'\nimport { ping } from './ping'\nimport { createStateSnapshot, type StateSnapshot } from './utils/state-snaphot'\nimport type { Predicate } from './entities/predicate/predicate'\nimport { createPredicateIndex, setupPredicate } from './entities/predicate/predicate'\nimport type { Feature } from './entities/feature/feature'\nimport { createFeatureIndex, setupFeature } from './entities/feature/feature'\nimport { domInteractive } from './utils/dom'\nimport { createExperienceInstanceIndex } from './entities/experience-instance/experience-instance'\nimport { createHistory } from './entities/history/history'\nimport { createEventBus } from './utils/events'\nimport type { Field } from './entities/field/field'\nimport { createFieldIndex, setupField } from './entities/field/field'\nimport { createResponseIndex } from './entities/response/response'\nimport { getVersion } from './utils/version'\nimport { getApiUrlFromScripts } from './utils/api-url'\nimport { getSearchParams } from './utils/search-params'\nimport { supportsDocument } from './utils/supports'\n\nexport class Picked {\n static readonly logger = logger\n private readonly options: CreateClientOptions\n\n isReady = false\n\n private project?: Project\n\n private readonly plugins: PluginConfigIndex = {}\n\n public readonly eventBus = createEventBus()\n readonly organizationId: string\n readonly projectId: string\n readonly apiUrl: string\n\n readonly searchParams = getSearchParams()\n\n readonly history = createHistory()\n\n readonly components = createComponentIndex({ client: this })\n readonly experienceInstances = createExperienceInstanceIndex({ client: this })\n readonly experiences = createExperienceIndex({ client: this })\n readonly frameworks = createFrameworkIndex({ client: this })\n readonly predicates = createPredicateIndex({ client: this })\n readonly features = createFeatureIndex()\n readonly fields = createFieldIndex()\n readonly responses = createResponseIndex({ client: this })\n\n constructor(options: CreateClientOptions) {\n logger('info', 'Picked client initializing.')\n\n this.organizationId = options.organizationId\n this.projectId = options.projectId\n\n this.options = Object.freeze(options)\n this.apiUrl = options.apiUrl || getApiUrlFromScripts()\n\n this.setupPlugins()\n this.setupFeatures()\n this.setupPredicates()\n this.eventBus({ type: 'initialized', version: getVersion() })\n\n logger('info', 'Picked client initialized.')\n }\n start(): void {\n void ping(this)\n\n // Initialize the experiences as soon as possible. In some cases the Picked SDK may be loaded before the DOM is\n // ready. In this scenario we attempt to initialize the experiences, wait for the DOM to be ready, and then\n // initialize the experiences again. This ensures that we don't miss initialising any experiences that are bound to\n // elements added to the DOM after the SDK has been loaded.\n const _start = async () => {\n if (!supportsDocument()) {\n return\n }\n\n // Initialize experiences immediately\n if (document.body) {\n await initialiseExperiences(this)\n }\n\n // Wait for the dom to be interactive\n await domInteractive()\n\n // Initialize experiences again\n await initialiseExperiences(this)\n\n this.eventBus({ type: 'ready' })\n this.isReady = true\n }\n\n void _start()\n }\n\n registerFramework(framework: Framework) {\n setupFramework(framework, this.frameworks)\n }\n\n registerComponent(name: keyof AdaptableComponents, component: AdaptedComponent) {\n setupComponent(name, component, this.components)\n }\n\n registerPlugin(plugin: Plugin): void {\n setupPlugin(this, plugin, this.plugins)\n }\n\n registerFeature(name: string, feature: Feature) {\n setupFeature(name, feature, this.features)\n }\n\n registerPredicate(name: string, predicate: Predicate) {\n setupPredicate(name, predicate, this.predicates)\n }\n\n registerField(field: Field) {\n setupField(field, this.fields)\n }\n\n registerExperience(experience: Experience): void {\n if (experience.component) {\n setupComponent(`experience:${experience.id}`, experience.component, this.components)\n }\n\n setupExperience(experience, this.experiences)\n }\n\n getStateSnapshot(): StateSnapshot {\n return createStateSnapshot(this)\n }\n\n async launchExperienceById(experienceId: string): Promise<void> {\n const experience = this.experiences.getById(experienceId).getState()\n\n if (!experience) {\n logger('warn', `Experience with id '${experienceId}' not found.`)\n return\n }\n\n initialiseExperience(this, experience)\n }\n\n // private async fetchProject() {\n // if (this.project) {\n // return\n // }\n //\n // // todo: fetch project\n //\n // this.project.experiences.forEach((experience) => setupExperience(experience, this.experiences))\n // }\n\n private setupPlugins() {\n /*\n The plugin array accepts any mix of:\n - Plugins\n - functions which return Plugins\n - arrays of Plugins\n - arrays of functions which return Plugins.\n */\n\n this.options.plugins?.forEach((pluginOrPlugins) => {\n if (Array.isArray(pluginOrPlugins)) {\n pluginOrPlugins.forEach((singlePlugin) => {\n this.registerPlugin(singlePlugin)\n })\n return\n }\n\n const resolvedPlugin =\n typeof pluginOrPlugins === 'function' ? pluginOrPlugins() : pluginOrPlugins\n\n if (Array.isArray(resolvedPlugin)) {\n resolvedPlugin.forEach((singlePlugin) => this.registerPlugin(singlePlugin))\n return\n }\n\n this.registerPlugin(resolvedPlugin)\n })\n }\n\n private setupFeatures() {\n const features = this.options.features\n if (!features) {\n return\n }\n\n Object.entries(features).forEach(([name, feature]) => {\n const resolvedFeature = typeof feature === 'function' ? feature() : feature\n this.registerFeature(name, resolvedFeature)\n })\n\n // register all features provided as search params\n if (this.searchParams.feature) {\n this.searchParams.feature.forEach((featureConfig) => {\n try {\n const [name, value] = featureConfig.split(':')\n if (!name || !value) {\n return\n }\n\n let bucket: boolean | string = value\n\n if (bucket === 'true' || bucket === 'false') {\n bucket = Boolean(bucket)\n }\n\n this.registerFeature(name, {\n key: '*',\n name,\n // eslint-disable-next-line sonarjs/function-return-type\n decide: (): string | boolean => {\n return bucket\n },\n storage: 'session',\n })\n } catch {\n /* empty */\n }\n })\n }\n }\n\n private setupPredicates() {\n const predicates = this.options.predicates\n if (!predicates) {\n return\n }\n\n Object.entries(predicates).forEach(([name, fn]) => {\n if (typeof fn !== 'function') {\n logger('warn', `Predicate \"${name}\" is not a function.`)\n return\n }\n\n this.registerPredicate(name, fn)\n })\n }\n\n getPluginConfig(pluginName: string): PluginConfigIndex[string] | Record<string, unknown> {\n return this.plugins[pluginName] ?? {}\n }\n}\n","import type { CreateClientOptions } from './client'\nimport { Picked } from './picked'\nimport { bindClient } from './utils/global-obj'\n\nexport { isPickedRoot } from './utils/dom'\n\nexport * from './utils/supports'\nexport * from './utils/storage'\nexport type * from './utils/storage'\n\n/**\n * Create a new Picked client instance and bind it to the window\n *\n * @param options - The client context options including organizationId and projectId\n * @returns The initialized Picked client instance\n */\nexport const createClient = (options: CreateClientOptions) => {\n const client = new Picked(options)\n bindClient(client)\n return client\n}\n"],"names":["experienceDomain","createDomain","createExperienceFactory","createFactory","client","experience","store","api","createApi","experienceState","payload","configStore","componentStore","components","component","treeStore","createExperience","params","invoke","createExperienceIndexFactory","experiences","register","existingExperience","experienceStore","$list","experienceIndex","getById","id","state","createExperienceIndex","setupExperience","initialiseExperience","targetSelectors","targets","getTargetElements","elements","element","tagTargetElement","createAppHosts","target","initialiseExperiences","shouldInitialiseExperience","type","decisionLogic","evaluateRuleLogic","isRulesLogic","setupPlugin","plugin","plugins","pluginName","pluginConfig","existingConfig","componentDomain","createComponentFactory","name","frameworkStore","createComponent","createComponentIndexFactory","logger","listStore","componentIndex","getByName","createComponentIndex","setupComponent","frameworkDomain","createFrameworkIndexFactory","frameworks","framework","frameworkIndex","createFrameworkIndex","setupFramework","PING_RATE_LIMIT","STORAGE_KEY","createStorageKey","getPingUrl","apiUrl","ping","now","lastPing","pingUrl","payloadString","headers","scriptElement","vercelToken","success","error","createStateSnapshot","isBrowser","snapshot","predicateDomain","createPredicateIndexFactory","predicates","predicate","predicateIndex","createPredicateIndex","setupPredicate","featureDomain","createFeatureIndexFactory","allFeaturesStore","resolvedFeaturesStore","features","feature","featureIndexItem","getStoreResolvedValueFx","createEffect","key","storage","storageKey","resolvedFeatureLocalStorage","sessionStore","localStore","setStoreResolvedValueFx","data","getBucket","attach","allFeatures","resolvedFeatures","featureId","decide","resolvedFeature","item","resolvedValue","sample","bucket","_a","combine","isResolved","featureIndex","createFeatureIndex","setupFeature","historyDomain","createHistoryEntry","experienceId","node","generateId","createHistoryFactory","historyStore","push","replace","back","restore","history","_","findLastTwoStepIndices","entries","indices","i","entry","isStepNode","secondLastStepIndex","newEntries","createHistory","createEventBus","createEvent","fieldDomain","createFieldIndexFactory","fields","field","fieldIndex","f","createFieldIndex","setupField","responseDomain","createResponseIndexFactory","clearAll","clear","responses","fieldId","removed","remaining","response","commit","responsesToCommit","validationErrors","responseValue","isEmpty","validationResponse","optionValues","option","valuesToCheck","value","getAllStore","responseIndex","getByFieldId","r","getByFieldName","fieldName","s","createResponseIndex","getVersion","getApiUrlFromScripts","supportsDocument","scriptTags","tag","getSearchParams","supportsWindow","pickedParams","pickedKeys","cleanKey","storedParams","Picked","options","__publicField","createExperienceInstanceIndex","domInteractive","pluginOrPlugins","singlePlugin","resolvedPlugin","featureConfig","fn","createClient","bindClient"],"mappings":"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"}
|