@picked/client 0.0.1-dev.1769474304876 → 0.0.1-dev.1769486944066

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.
Files changed (32) hide show
  1. package/dist/cjs/index.js +2 -2
  2. package/dist/cjs/plugins/create-experience/index.js +1 -1
  3. package/dist/cjs/plugins/data-layer/index.js +1 -0
  4. package/dist/cjs/plugins/responses-browser-storage/index.js +1 -1
  5. package/dist/cjs/plugins/responses-indexeddb/index.js +1 -1
  6. package/dist/cjs/server/index.js +1 -1
  7. package/dist/esm/index.js +270 -997
  8. package/dist/esm/plugins/create-experience/index.js +251 -255
  9. package/dist/esm/plugins/data-layer/index.js +198 -0
  10. package/dist/esm/plugins/responses-browser-storage/index.js +23 -25
  11. package/dist/esm/plugins/responses-indexeddb/index.js +49 -67
  12. package/dist/esm/plugins/single-page-app/index.js +3 -3
  13. package/dist/esm/plugins/web-components/index.js +1 -1
  14. package/dist/esm/plugins/window-object/index.js +1 -1
  15. package/dist/esm/server/index.js +19 -19
  16. package/dist/experience-instance-CsMhH0DN.cjs +1 -0
  17. package/dist/{experience-instance-BstMURAM.js → experience-instance-DJCJUe0h.js} +113 -117
  18. package/dist/{supports-BjhuLJ8z.js → supports-DCSoenK6.js} +11 -11
  19. package/dist/types/plugins/data-layer/custom-event.d.ts +5 -0
  20. package/dist/types/plugins/data-layer/custom-event.d.ts.map +1 -0
  21. package/dist/types/plugins/data-layer/index.d.ts +2 -0
  22. package/dist/types/plugins/data-layer/index.d.ts.map +1 -0
  23. package/dist/types/plugins/data-layer/plugin.d.ts +55 -0
  24. package/dist/types/plugins/data-layer/plugin.d.ts.map +1 -0
  25. package/dist/types/plugins/data-layer/utils.d.ts +39 -0
  26. package/dist/types/plugins/data-layer/utils.d.ts.map +1 -0
  27. package/dist/types/utils/events.d.ts +6 -1
  28. package/dist/types/utils/events.d.ts.map +1 -1
  29. package/dist/user-session-DQh0BBTx.cjs +1 -0
  30. package/dist/user-session-XidjAPGf.js +747 -0
  31. package/package.json +11 -5
  32. package/dist/experience-instance-CqwH_Ayg.cjs +0 -1
@@ -0,0 +1 @@
1
+ "use strict";const l=require("effector"),S=require("@withease/factories"),w=require("./experience-instance-CsMhH0DN.cjs"),E=require("./logger-BsmHUUw1.cjs"),F=require("./storage-YlR83AWP.cjs"),T=require("./id-BKIWbSTy.cjs"),C=require("./object-BbFTsGh3.cjs"),B=require("./supports-YvpQZxbh.cjs"),O=l.createDomain("experience"),N=S.createFactory(({client:e,experience:t})=>{const o=O.store(t),d=l.createApi(o,{merge(i,f){return{...i,...f.experience}}}),g=o.map(i=>({name:i.name,decisionLogic:i.condition??i.decide,targetSelectors:i.targets,initializeOpenLogic:t.initializeOpen})),p=e.components.listStore.map(i=>i.find(f=>f.name===`experience:${t.id}`)||i.find(f=>f.name==="experience"),{skipVoid:!1}),n=o.map(i=>({steps:i.steps,nodes:i.nodes,edges:i.edges,conditionals:i.conditionals})),r=t.actions??[];return{id:t.id,configStore:g,treeStore:n,componentStore:p,actions:r,merge:d.merge}});function U(e){return S.invoke(N,e)}const q=S.createFactory(({client:e})=>{const t=O.store({}),o=l.createApi(t,{register(n,r){return{...n,[r.id]:r}}});function d(n){const r=t.getState()[n.id];if(r){r.merge({experience:n,strategy:"override"});return}const i=U({client:e,experience:n});o.register(i)}const g=t.map(n=>Object.values(n));function p(n){return t.map(r=>r[n],{skipVoid:!1})}return{register:d,getById:p,listStore:g}});function L(e){return S.invoke(q,e)}const _=(e,t)=>{t.register(e)},P=(e,t)=>{const{targetSelectors:o}=t.configStore.getState(),d=w.getTargetElements(o,t.id);d.forEach(({elements:p})=>p.forEach(n=>w.tagTargetElement(n,t.id))),w.createAppHosts(d,t.id).forEach(p=>{e.experienceInstances.spawn(t,p)})},H=async e=>{await Promise.all(e.experiences.listStore.getState().map(async t=>{await z(e,t)&&P(e,t)}))},z=async(e,t)=>{const{decisionLogic:o,targetSelectors:d}=t.configStore.getState();return w.getTargetElements(d,t.id).length<1||d.length===0?!1:o&&w.isRulesLogic(o)?await w.evaluateRuleLogic(e,o)===!0:!0},K=l.createDomain("component"),G=S.createFactory(({client:e,component:t,name:o})=>{const d=e.frameworks.getByName(t.frameworkName);return{name:o,component:t,frameworkStore:d}});function Y(e){return S.invoke(G,e)}const J=S.createFactory(({client:e})=>{const t=K.store({}),o=l.createApi(t,{register(n,r){return{...n,[r.name]:r}}});function d(n,r){t.getState()[n]&&E.logger("warn",`Component '${n}' already registered. Registering again will override the previous registration.`);const f=Y({client:e,name:n,component:r});o.register(f)}const g=t.map(n=>Object.values(n));function p(n){return t.map(r=>r[n],{skipVoid:!1})}return{register:d,getByName:p,listStore:g}});function Q(e){return S.invoke(J,e)}const W=(e,t,o)=>{o.register(e,t)},X=l.createDomain("framework"),Z=S.createFactory(({client:e})=>{const t=X.store({}),o=l.createApi(t,{register(n,r){return{...n,[r.name]:r.framework}}});function d(n,r){t.getState()[n]&&E.logger("warn",`Framework '${n}' already registered. Registering again will override the previous registration.`),o.register({name:n,framework:r})}const g=t.map(n=>Object.values(n));function p(n){return t.map(r=>r[n],{skipVoid:!1})}return{register:d,getByName:p,listStore:g}});function ee(e){return S.invoke(Z,e)}const te=(e,t)=>{t.register(e.name,e)},re=6e3,ne=F.createStorageKey("last_ping","global"),se=e=>`${e}/api/v1/ping`,oe=async e=>{try{const t=Date.now(),o=F.localStore.get(ne);let d=0;if(o.isSet()&&(d=o.json()??0),d&&t-d<re)return!0;const g=se(e.apiUrl),p={projectId:e.projectId,path:window.location.pathname},n=JSON.stringify(p),r={"Content-Type":"application/json"},f=document.getElementById("picked_script")?.dataset.verceltoken;f&&(r["x-vercel-protection-bypass"]=f);const h=(await fetch(g,{method:"POST",headers:r,body:n})).ok;return h&&o.set(t),h}catch(t){return E.logger("error",t),!1}};function V(e){const t=typeof window<"u",o={client:e,responses:e.responses.listStore.getState(),fields:e.fields.listStore.getState(),location:t?window.location:void 0,document:t?window.document:void 0,sessionStorage:t?window.sessionStorage:void 0,localStorage:t?window.localStorage:void 0};return Object.freeze(o)}const ie=l.createDomain("predicate"),ae=S.createFactory(({client:e})=>{const t=ie.store({}),o=l.createApi(t,{register(r,i){return{...r,[i.name]:{name:i.name,predicate:i.predicate}}}});function d(r,i){t.getState()[r]&&E.logger("warn",`Predicate '${r}' already registered. Registering again will override the previous registration.`),o.register(Object.freeze({name:r,predicate:i}))}const g=t.map(r=>Object.values(r));function p(r){return t.map(i=>i[r]?.predicate,{skipVoid:!1})}function n(r){const i=l.createStore(()=>{},{skipVoid:!1}),f=l.createEffect(async()=>{const k=p(r).getState();if(!k)return;const h=V(e);return(...m)=>k({...h,args:m})});return l.sample({source:{responses:e.responses.listStore,fields:e.fields.listStore},target:f}),l.sample({clock:f.doneData,filter:k=>k!==void 0,target:i}),f(),i}return{register:d,getByName:p,listStore:g,getEvokablePredicate:n}});function ce(e){return S.invoke(ae,e)}const ue=(e,t,o)=>{o.register(e,t)},R=l.createDomain("feature"),le=S.createFactory(({client:e})=>{const t=R.store({}),o=R.store([]),d=l.createApi(t,{register(s,a){return{...s,[a.id]:a.feature}}});function g(s,a){t.getState()[s]&&E.logger("warn",`Feature '${s}' already registered. Registering again will override the previous registration.`);const c={id:s,feature:{...a,id:s}};d.register(Object.freeze({id:s,feature:c}))}const p=l.createEffect(async({id:s,key:a,storage:u="local"})=>{const c=F.createStorageKey(`feature:${s}:${a}`,"global"),v=(u==="session"?F.sessionStore:F.localStore).get(c).boolean();return v===null?null:{id:s,key:a,bucket:v,storage:u}}),n=l.createEffect(s=>{if(!s)return null;const a=F.createStorageKey(`feature:${s.id}:${s.key}`,"global");(s.storage==="session"?F.sessionStore:F.localStore).set(a,s.bucket)}),r=new Map,i=l.attach({source:{allFeaturesStore:t,resolvedFeaturesStore:o},effect:async({allFeaturesStore:s,resolvedFeaturesStore:a},{id:u,decide:c,key:y})=>{const v=a.find(D=>D.id===u&&D.key===y);if(v)return v;const b=s[u];if(!b)throw new Error(`Feature with id '${u}' not found`);const x=r.get(`${u}:${y}`);if(x!==void 0){const D=await x;return{id:b.id,bucket:D,key:y,storage:b.feature.storage}}const A=c();r.set(`${u}:${y}`,A);const M=await A;return{id:b.id,bucket:M,key:y,storage:b.feature.storage}}});l.sample({clock:d.register,fn:s=>{const{id:a,feature:u}=s;return{id:a,key:u.feature.key,storage:u.feature.storage}},target:p}),l.sample({source:t,clock:i.doneData,fn:(s,a)=>{const{id:u,bucket:c,storage:y}=a,v=s[u]?.feature.key;return v?{key:v,id:u,bucket:c,storage:y}:null},target:n});const f=l.combine({allFeaturesStore:t,resolvedFeaturesStore:o}).map(({allFeaturesStore:s,resolvedFeaturesStore:a})=>Object.values(s).map(u=>{const c=a.find(y=>y.id===u.id&&y.key===u.feature.key);return c?{id:u.id,name:u.feature.name,key:u.feature.key,getBucket:()=>({id:u.id,bucket:c.bucket}),isResolved:!0}:{id:u.id,name:u.feature.name,key:u.feature.key,getBucket:async()=>await i(u.feature),isResolved:!1}}));l.sample({clock:i.doneData,source:{resolvedFeatures:o},filter:({resolvedFeatures:s},{id:a,key:u})=>!s.some(y=>y.id===a&&y.key===u),fn:(s,a)=>a,target:e.eventBus.prepend(s=>({type:"feature_decide",feature:s}))}),l.sample({clock:[p.doneData,i.doneData],source:o,fn:(s,a)=>!a||s.some(c=>c.id===a.id&&c.key===a.key)?s:[...s,a],target:o});function k(s){return f.map(a=>a.find(u=>u.id===s))}function h(s){return t.map(a=>a[s],{skipVoid:!1})}function m(s){const a=l.createStore(async()=>{},{skipVoid:!1}),u=l.createEffect(async()=>{const c=k(s).getState();if(c)return async()=>(await c.getBucket()).bucket});return l.sample({source:o,filter:c=>c.some(y=>y.id===s),target:u}),l.sample({clock:u.doneData,filter:c=>c!==void 0,target:a}),u(),a}return{register:g,getById:k,getByName:h,listStore:f,getEvokableFeature:m}});function de(e){return S.invoke(le,e)}const ge=(e,t,o)=>{o.register(e,t)},I=l.createDomain("history");function $(e,t){return{id:T.generateId(`history-entry-${Date.now()}-${Math.random()}}`),node:t,at:Date.now(),experienceId:e}}const pe=S.createFactory(()=>{const e=I.store({entries:[]}),t=I.event(),o=I.event(),d=I.event(),g=I.event();e.on(t,(n,r)=>({entries:[...n.entries,$(r.experienceId,r.node)]})),e.on(o,(n,r)=>({entries:[...n.entries.slice(0,-1),$(r.experienceId,r.node)]})),e.on(g,(n,r)=>r);function p(n,r){const i={lastStepIndex:-1,secondLastStepIndex:-1};for(let f=n.length-1;f>=0;f--){const k=n[f],h=k?.node;if(!(!h||!w.isStepNode(h))&&!(r&&k?.experienceId!==r))if(i.lastStepIndex===-1)i.lastStepIndex=f;else{i.secondLastStepIndex=f;break}}return i}return e.on(d,(n,r)=>{const{secondLastStepIndex:i}=p(n.entries,r.experienceId),f=i!==-1?n.entries.slice(0,i+1):n.entries;return{...n,entries:f}}),{push:t,replace:o,back:d,restore:g,entriesStore:e.map(n=>n.entries)}});function fe(){return S.invoke(pe)}const me=l.createDomain("field"),ye=S.createFactory(()=>{const e=me.store({}),t=l.createApi(e,{register(r,i){return{...r,[i.field.id]:i.field}}});function o(r){t.register({field:r})}function d(r,i){const f=p(r).getState();if(!f)return;const k=Object.assign({},f,{...i});t.register({field:{...k}})}const g=e.map(r=>Object.values(r));function p(r){return e.map(i=>i[r]||null)}function n(r){return e.map(i=>Object.values(i).find(f=>f.name===r)||null)}return{register:o,update:d,getById:p,listStore:g,getByName:n}});function Se(){return S.invoke(ye)}const ve=(e,t)=>{t.register(e)},ke=l.createDomain("action"),he=S.createFactory(()=>{const e=ke.store({}),t=l.createApi(e,{register(n,r){return{...n,[r.name]:{name:r.name,action:r.action}}}});function o(n,r){t.register({name:n,action:r})}const d=e.map(n=>Object.values(n));function g(n){return e.map(r=>r[n],{skipVoid:!1})}function p(n){return e.map(r=>{const i=r[n];return i?i.action:void 0},{skipVoid:!1})}return{register:o,getByName:g,listStore:d,getEvokableAction:p}});function Fe(){return S.invoke(he)}const we=(e,t,o)=>{o.register(e,t)};function j(e){return typeof e>"u"||e===null||e===""||Array.isArray(e)&&!e.length}const be=l.createDomain("response"),xe=S.createFactory(({client:e})=>{const t=be.store({}),o=l.createEvent(),d=l.createEvent(),g=l.createApi(t,{register(m,s){return{...m,[s.fieldId]:s.response}},registerBatch(m,s){return{...m,...s}},clear(m,s){const{[s]:a,...u}=m;return u},clearAll(){return{}}});function p(m,s){if(typeof m=="string"){if(s===void 0)throw new Error("Response is required when registering a single field");g.register({fieldId:m,response:s})}else g.registerBatch(m)}async function n(m){const s=[];return await Promise.allSettled(Object.entries(m).map(async([a,u])=>{let c=u;const y=e.fields.getById(a).getState();if(!y){s.push({fieldId:a,userMessage:`Field '${a}' not found`,systemMessage:`No field with ID '${a}' exists. Available field IDs are: ${Object.keys(e.fields.listStore.getState()).join(",")}.`,value:c});return}if(y.multiple&&(typeof c=="string"||typeof c=="number"||typeof c=="boolean")&&(c=[c]),y.validation&&!C.isEmpty(y.validation)&&!j(c)){const v=await w.evaluateRuleLogic(e,y.validation,{$input:c});if(typeof v=="string"){s.push({fieldId:a,userMessage:v,systemMessage:`Field validation resulted in an error: ${v}.`,value:c});return}if(v===!1){s.push({fieldId:a,userMessage:"This field is invalid",systemMessage:"Field validation resulted in an unspecified error.",value:c});return}}if(y.required&&j(c)){s.push({fieldId:a,userMessage:"This field is required",systemMessage:"Field is required.",value:c});return}if(!y.multiple&&Array.isArray(c)&&c.length>1){s.push({fieldId:a,userMessage:"This field expects a single response",systemMessage:"Field expects a single response.",value:c});return}if(y.options){const v=y.options.map(x=>x.value),b=Array.isArray(c)?c:[c];Array.isArray(c)&&(b.every(x=>v.includes(x))||s.push({fieldId:a,userMessage:"This field expects a valid option",systemMessage:`Field expects a valid option. Valid options are: ${v.join(", ")}`,value:c}))}})),{responsesToCommit:m,validationErrors:s}}async function r(m){const{responsesToCommit:s,validationErrors:a}=await n(m);return a.length?{errors:a}:(g.registerBatch(s),{errors:[]})}const i=t.map(m=>m),f=t.map(m=>Object.keys(m).map(a=>({fieldId:a,value:m[a]})));function k(m){const s=e.fields.getById(m),a=t.map(u=>u[m]||null);return l.combine({f:s,r:a},({f:u,r:c})=>c||(u?.defaultValue?u.defaultValue:null))}function h(m){const s=e.fields.getByName(m);return l.combine({f:s,s:t},({f:a,s:u})=>{const c=a&&u[a.id]||null;return c||(a?.defaultValue?a.defaultValue:null)})}return l.sample({clock:o,target:g.clearAll}),l.sample({clock:d,target:g.clear}),{register:p,clearAll:o,clear:d,commit:r,getResponsesToCommit:n,listStore:f,getAllStore:i,getByFieldId:k,getByFieldName:h}});function Ie(e){return S.invoke(xe,e)}function Ee(){if(B.supportsCryptoRandomUUID())return crypto.randomUUID();const e=Date.now().toString(36),t=Math.random().toString(36).substring(2,15),o=Math.random().toString(36).substring(2,15),d=Math.random().toString(36).substring(2,15);return`${e}-${t}-${o}-${d}`}const De=F.createStorageKey("session","global"),Ae=()=>{const e=F.localStore.get(De);let t;e.isSet()&&(t=e.json());const o=g=>e.set({id:g.id,isUser:g.isUser,identifiers:g.identifiers}),d={id:t?.id??Ee(),isUser:t?.isUser??void 0,identifiers:t?.identifiers??void 0,setIsUser(g){this.isUser=g,o(this)},setIdentifier(g,p){this.identifiers={...this.identifiers,[g]:p},o(this)},removeIdentifier(g){this.identifiers&&(this.identifiers=Object.fromEntries(Object.entries(this.identifiers).filter(([p])=>p!==g)),this.identifiers=Object.keys(this.identifiers).length?this.identifiers:void 0,o(this))}};return o(d),d},Re=()=>B.supportsLocalStorage()?Ae():null;exports.createActionIndex=Fe;exports.createComponentIndex=Q;exports.createExperienceIndex=L;exports.createFeatureIndex=de;exports.createFieldIndex=Se;exports.createFrameworkIndex=ee;exports.createHistory=fe;exports.createPredicateIndex=ce;exports.createResponseIndex=Ie;exports.createStateSnapshot=V;exports.initialiseExperience=P;exports.initialiseExperiences=H;exports.initialiseSession=Re;exports.ping=oe;exports.setupAction=we;exports.setupComponent=W;exports.setupExperience=_;exports.setupFeature=ge;exports.setupField=ve;exports.setupFramework=te;exports.setupPredicate=ue;