@picked/client 0.0.1-dev.1773804563218 → 0.0.1-dev.1773807602703
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{api-CQ1Lb-dB.js → api-GlH9T8_1.js} +1 -1
- package/dist/{api-C90ugp6M.cjs → api-GvmToTw0.cjs} +1 -1
- package/dist/cjs/index.js +2 -2
- package/dist/cjs/plugins/create-experience/index.js +1 -1
- package/dist/cjs/plugins/dynamic-experiences/index.js +1 -1
- package/dist/cjs/server/index.js +1 -1
- package/dist/esm/index.js +26 -25
- package/dist/esm/plugins/create-experience/index.js +1 -0
- package/dist/esm/plugins/dynamic-experiences/index.js +56 -55
- package/dist/esm/server/index.js +7 -7
- package/dist/experience-instance-CxiOyYPf.cjs +1 -0
- package/dist/{experience-instance-8P1fJuPC.js → experience-instance-DCknHRkX.js} +214 -229
- package/dist/nodes-DQt4TfuO.js +26 -0
- package/dist/nodes-DsL8kMSX.cjs +1 -0
- package/dist/types/entities/experience/experience.d.ts +2 -0
- package/dist/types/entities/experience/experience.d.ts.map +1 -1
- package/dist/types/entities/experience-instance/experience-instance.d.ts.map +1 -1
- package/dist/types/plugins/create-experience/create-experience.d.ts.map +1 -1
- package/dist/types/plugins/dynamic-experiences/plugin.d.ts.map +1 -1
- package/dist/types/utils/nodes.d.ts +5 -0
- package/dist/types/utils/nodes.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/experience-instance-Bi3-1tP5.cjs +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";const a="Picked-Client",d="Picked-Version";function s(e,t){return{[a]:e,[d]:t}}const o=()=>"0.0.1-dev.
|
|
1
|
+
"use strict";const a="Picked-Client",d="Picked-Version";function s(e,t){return{[a]:e,[d]:t}}const o=()=>"0.0.1-dev.1773807602703",E="v1";function c(e,t){return new URL(`/api/${E}/${t}`,e).toString()}function i(e){return{...s("sdk",o()),...e}}async function f(e,t,n){const r=c(e,t);return fetch(r,{headers:i(n)})}async function l(e,t,n,r){const u=c(e,t);return fetch(u,{method:"POST",headers:{"Content-Type":"application/json",...i(r)},body:JSON.stringify(n)})}exports.createClientHeaders=s;exports.get=f;exports.getVersion=o;exports.post=l;
|
package/dist/cjs/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const g=require("effector"),S=require("@withease/factories"),I=require("../experience-instance-Bi3-1tP5.cjs"),E=require("../logger-BsmHUUw1.cjs"),v=require("../storage-Be5xWNPC.cjs"),L=require("../api-C90ugp6M.cjs"),W=require("../id-BKIWbSTy.cjs"),J=require("../object-BbFTsGh3.cjs"),b=require("../supports-YvpQZxbh.cjs"),D=g.createDomain("experience"),Y=S.createFactory(({client:t,experience:e})=>{const r=D.store(e),n=g.createApi(r,{merge(f,p){return{...f,...p.experience}}}),i=r.map(f=>({name:f.name,decisionLogic:f.condition,targetSelectors:f.targets,initializeOpenLogic:e.initializeOpen})),u=e.component?{name:`experience:${e.id}`,component:e.component,frameworkStore:t.frameworks.getByName(e.component.frameworkName)}:void 0,s=t.components.listStore.map(f=>u||(e.componentName?f.find(p=>p.name===e.componentName):void 0)||f.find(p=>p.name===`experience:${e.id}`)||f.find(p=>p.name==="experience"),{skipVoid:!1}),o=r.map(f=>({steps:f.steps,nodes:f.nodes,edges:f.edges,conditions:f.conditions??f.conditionals??[]})),l=e.actions??[];return{id:e.id,key:e.key,name:e.name,configStore:i,treeStore:o,componentStore:s,actions:l,merge:n.merge}});function Q(t){return S.invoke(Y,t)}const X=S.createFactory(({client:t})=>{const e=D.store({}),r=D.store({}),n=g.createApi(e,{register(p,k){return{...p,[k.id]:k}}}),i=g.createApi(r,{register(p,{key:k,id:w}){return{...p,[k]:w}}});function u(p){const k=e.getState()[p.id];if(k){k.merge({experience:p,strategy:"override"}),p.key&&i.register({key:p.key,id:p.id});return}const w=Q({client:t,experience:p});n.register(w),p.key&&i.register({key:p.key,id:p.id})}const s=e.map(p=>Object.values(p));function o(p){return g.combine(e,r,(k,w)=>k[p]??k[w[p]??""],{skipVoid:!1})}const l=g.attach({source:{experiences:e,keys:r},effect:async({experiences:p,keys:k},{id:w,options:m})=>{const a=p[w]??p[k[w]??""];if(!a){E.logger("warn",`Experience with id '${w}' not found.`);return}if(m?.bypassCondition){$(t,a,m);return}await _(t,a)&&$(t,a,m)}}),f=g.attach({source:{instances:t.experienceInstances.listStore,keys:r},effect:({instances:p,keys:k},{id:w,options:m})=>{const a=k[w]??w,c=p.filter(d=>d.experienceId===a);if(c.length>0)for(const d of c)d.open();else l({id:a,options:{...m,initialiseOpen:!0}})}});return{register:u,get:o,getById:o,launch:l,open:f,listStore:s}});function Z(t){return S.invoke(X,t)}const ee=(t,e)=>{e.register(t)},$=(t,e,r)=>{const{targetSelectors:n}=e.configStore.getState(),i=I.getTargetElements(n,e.id);i.forEach(({elements:s})=>s.forEach(o=>I.tagTargetElement(o,e.id))),I.createAppHosts(i,e.id).forEach(s=>{r?t.experienceInstances.spawn(e,s,r):t.experienceInstances.spawn(e,s)})},M=async t=>{await Promise.all(t.experiences.listStore.getState().map(async e=>{await _(t,e)&&$(t,e)}))},_=async(t,e)=>{if(!t.preconditionPassed||!t.session?.isUser)return!1;const{decisionLogic:r,targetSelectors:n}=e.configStore.getState();return I.getTargetElements(n,e.id).length<1||n.length===0?!1:r===void 0?!0:I.isRulesLogic(r)?await I.evaluateRuleLogic(t,r)===!0:!0},te=(t,e,r)=>{const n=e.name,i=e.setup(t);if(i){const u=r[n]??{};r[n]=Object.freeze({...u,...i})}},re=g.createDomain("component"),ne=S.createFactory(({client:t,component:e,name:r})=>{const n=t.frameworks.getByName(e.frameworkName);return{name:r,component:e,frameworkStore:n}});function se(t){return S.invoke(ne,t)}const ie=S.createFactory(({client:t})=>{const e=re.store({}),r=g.createApi(e,{register(s,o){return{...s,[o.name]:o}}});function n(s,o){e.getState()[s]&&E.logger("warn",`Component '${s}' already registered. Registering again will override the previous registration.`);const f=se({client:t,name:s,component:o});r.register(f)}const i=e.map(s=>Object.values(s));function u(s){return e.map(o=>o[s],{skipVoid:!1})}return{register:n,getByName:u,listStore:i}});function oe(t){return S.invoke(ie,t)}const U=(t,e,r)=>{r.register(t,e)},ae=g.createDomain("framework"),ce=S.createFactory(({client:t})=>{const e=ae.store({}),r=g.createApi(e,{register(s,o){return{...s,[o.name]:o.framework}}});function n(s,o){e.getState()[s]&&E.logger("warn",`Framework '${s}' already registered. Registering again will override the previous registration.`),r.register({name:s,framework:o})}const i=e.map(s=>Object.values(s));function u(s){return e.map(o=>o[s],{skipVoid:!1})}return{register:n,getByName:u,listStore:i}});function ue(t){return S.invoke(ce,t)}const de=(t,e)=>{e.register(t.name,t)},le=6e3,pe=v.createStorageKey("last_ping","global"),fe=async t=>{try{const e=Date.now(),r=v.localStore.get(pe);let n=0;if(r.isSet()&&(n=r.json()??0),n&&e-n<le)return!0;const i={projectId:t.projectId,path:window.location.pathname},u={},o=document.getElementById("picked_script")?.dataset.verceltoken;o&&(u["x-vercel-protection-bypass"]=o);const f=(await L.post(t.apiUrl,"ping",i,u)).ok;return f&&r.set(e),f}catch(e){return E.logger("error",e),!1}};function q(t){const e=typeof window<"u",r={client:t,responses:t.responses.listStore.getState(),fields:t.fields.listStore.getState(),location:e?window.location:void 0,document:e?window.document:void 0,sessionStorage:e?window.sessionStorage:void 0,localStorage:e?window.localStorage:void 0};return Object.freeze(r)}const ge=g.createDomain("predicate"),me=S.createFactory(({client:t})=>{const e=ge.store({}),r=g.createApi(e,{register(o,l){return{...o,[l.name]:{name:l.name,predicate:l.predicate}}}});function n(o,l){e.getState()[o]&&E.logger("warn",`Predicate '${o}' already registered. Registering again will override the previous registration.`),r.register(Object.freeze({name:o,predicate:l}))}const i=e.map(o=>Object.values(o));function u(o){return e.map(l=>l[o]?.predicate,{skipVoid:!1})}function s(o){const l=g.createStore(()=>{},{skipVoid:!1}),f=g.createEffect(async()=>{const p=u(o).getState();if(!p)return;const k=q(t);return(...w)=>p({...k,args:w})});return g.sample({source:{responses:t.responses.listStore,fields:t.fields.listStore},target:f}),g.sample({clock:f.doneData,filter:p=>p!==void 0,target:l}),f(),l}return{register:n,getByName:u,listStore:i,getEvokablePredicate:s}});function ye(t){return S.invoke(me,t)}const he=(t,e,r)=>{r.register(t,e)},V=g.createDomain("feature"),Se=S.createFactory(({client:t})=>{const e=V.store({}),r=V.store([]),n=g.createApi(e,{register(m,a){return{...m,[a.id]:a.feature}}});function i(m,a){e.getState()[m]&&E.logger("warn",`Feature '${m}' already registered. Registering again will override the previous registration.`);const d={id:m,feature:{...a,id:m}};n.register(Object.freeze({id:m,feature:d}))}const u=g.createEffect(async({id:m,key:a,storage:c="local"})=>{const d=v.createStorageKey(`feature:${m}:${a}`,"global"),h=(c==="session"?v.sessionStore:v.localStore).get(d).boolean();return h===null?null:{id:m,key:a,bucket:h,storage:c}}),s=g.createEffect(m=>{if(!m)return null;const a=v.createStorageKey(`feature:${m.id}:${m.key}`,"global");(m.storage==="session"?v.sessionStore:v.localStore).set(a,m.bucket)}),o=new Map,l=g.attach({source:{allFeaturesStore:e,resolvedFeaturesStore:r},effect:async({allFeaturesStore:m,resolvedFeaturesStore:a},{id:c,decide:d,key:y})=>{const h=a.find(A=>A.id===c&&A.key===y);if(h)return h;const F=m[c];if(!F)throw new Error(`Feature with id '${c}' not found`);const j=o.get(`${c}:${y}`);if(j!==void 0){const A=await j;return{id:F.id,bucket:A,key:y,storage:F.feature.storage}}const x=d();o.set(`${c}:${y}`,x);const P=await x;return{id:F.id,bucket:P,key:y,storage:F.feature.storage}}});g.sample({clock:n.register,fn:m=>{const{id:a,feature:c}=m;return{id:a,key:c.feature.key,storage:c.feature.storage}},target:u}),g.sample({source:e,clock:l.doneData,fn:(m,a)=>{const{id:c,bucket:d,storage:y}=a,h=m[c]?.feature.key;return h?{key:h,id:c,bucket:d,storage:y}:null},target:s});const f=g.combine({allFeaturesStore:e,resolvedFeaturesStore:r}).map(({allFeaturesStore:m,resolvedFeaturesStore:a})=>Object.values(m).map(c=>{const d=a.find(y=>y.id===c.id&&y.key===c.feature.key);return d?{id:c.id,name:c.feature.name,key:c.feature.key,getBucket:()=>({id:c.id,bucket:d.bucket}),isResolved:!0}:{id:c.id,name:c.feature.name,key:c.feature.key,getBucket:async()=>await l(c.feature),isResolved:!1}}));g.sample({clock:l.doneData,source:{resolvedFeatures:r},filter:({resolvedFeatures:m},{id:a,key:c})=>!m.some(y=>y.id===a&&y.key===c),fn:(m,a)=>a,target:t.eventBus.prepend(m=>({type:"feature_decide",feature:m}))}),g.sample({clock:[u.doneData,l.doneData],source:r,fn:(m,a)=>!a||m.some(d=>d.id===a.id&&d.key===a.key)?m:[...m,a],target:r});function p(m){return f.map(a=>a.find(c=>c.id===m))}function k(m){return e.map(a=>a[m],{skipVoid:!1})}function w(m){const a=g.createStore(async()=>{},{skipVoid:!1}),c=g.createEffect(async()=>{const d=p(m).getState();if(d)return async()=>(await d.getBucket()).bucket});return g.sample({source:r,filter:d=>d.some(y=>y.id===m),target:c}),g.sample({clock:c.doneData,filter:d=>d!==void 0,target:a}),c(),a}return{register:i,getById:p,getByName:k,listStore:f,getEvokableFeature:w}});function ke(t){return S.invoke(Se,t)}const be=(t,e,r)=>{r.register(t,e)},C=g.createDomain("history");function N(t,e){return{id:W.generateId(`history-entry-${Date.now()}-${Math.random()}}`),node:e,at:Date.now(),experienceId:t}}const we=S.createFactory(()=>{const t=C.store({entries:[]}),e=C.event(),r=C.event(),n=C.event(),i=C.event();t.on(e,(s,o)=>({entries:[...s.entries,N(o.experienceId,o.node)]})),t.on(r,(s,o)=>({entries:[...s.entries.slice(0,-1),N(o.experienceId,o.node)]})),t.on(i,(s,o)=>o);function u(s,o){const l={lastStepIndex:-1,secondLastStepIndex:-1};for(let f=s.length-1;f>=0;f--){const p=s[f],k=p?.node;if(!(!k||!I.isStepNode(k))&&!(o&&p?.experienceId!==o))if(l.lastStepIndex===-1)l.lastStepIndex=f;else{l.secondLastStepIndex=f;break}}return l}return t.on(n,(s,o)=>{const{secondLastStepIndex:l}=u(s.entries,o.experienceId),f=l!==-1?s.entries.slice(0,l+1):s.entries;return{...s,entries:f}}),{push:e,replace:r,back:n,restore:i,entriesStore:t.map(s=>s.entries)}});function ve(){return S.invoke(we)}let Ie=0;const Fe=t=>{const e=g.createStore([]);return g.sample({clock:t,source:e,fn:(r,n)=>[...r,{id:Ie++,at:new Date,payload:n}],target:e}),e},Ee=g.createDomain("field"),je=S.createFactory(()=>{const t=Ee.store({}),e=g.createApi(t,{register(l,f){return{...l,[f.field.id]:f.field}}});function r(l){e.register({field:l})}function n(l,f){const p=t.getState()[l]??null;if(!p)return;const k=Object.assign({},p,{...f});e.register({field:{...k}})}const i=t.map(l=>Object.values(l));function u(l){return t.map(f=>f[l]??null)}function s(l){return t.map(f=>Object.values(f).find(p=>p.key===l)??null)}function o(l){return t.map(f=>Object.values(f).find(p=>p.name===l)??null)}return{register:r,update:n,getById:u,getByKey:s,listStore:i,getByName:o}});function xe(){return S.invoke(je)}const Ae=(t,e)=>{e.register(t)},Pe=g.createDomain("step"),Ce=S.createFactory(()=>{const t=Pe.store({}),e=g.createApi(t,{register(u,s){return{...u,[s.step.id]:s.step}}});function r(u){e.register({step:u})}const n=t.map(u=>Object.values(u));function i(u){return t.map(s=>s[u]??null)}return{register:r,getById:i,listStore:n}});function Be(){return S.invoke(Ce)}function De(t,e){e.register(t)}const $e=g.createDomain("action"),ze=S.createFactory(()=>{const t=$e.store({}),e=g.createApi(t,{register(s,o){return{...s,[o.name]:{name:o.name,action:o.action}}}});function r(s,o){e.register({name:s,action:o})}const n=t.map(s=>Object.values(s));function i(s){return t.map(o=>o[s],{skipVoid:!1})}function u(s){return t.map(o=>{const l=o[s];return l?l.action:void 0},{skipVoid:!1})}return{register:r,getByName:i,listStore:n,getEvokableAction:u}});function Re(){return S.invoke(ze)}const Oe=(t,e,r)=>{r.register(t,e)};function z(t){return typeof t>"u"||t===null||t===""||Array.isArray(t)&&!t.length}function Me(t){return typeof t=="string"||typeof t=="number"||typeof t=="boolean"||t===null}function T(t){try{return JSON.stringify(t),!0}catch{return!1}}function Ue(t,e){return e.find(r=>r.id===t)??e.find(r=>r.key===t)??null}function Ve(t,e){return t.multiple&&(typeof e=="string"||typeof e=="number"||typeof e=="boolean")?[e]:e}function Ne(t,e,r){if(t.type!=="object"||z(r))return null;if(t.multiple){if(!Array.isArray(r))return{fieldId:e,userMessage:"This field expects multiple values",systemMessage:"Field expects an array of objects.",value:r};for(const n of r){if(typeof n!="object"||n===null)return{fieldId:e,userMessage:"This field expects object values",systemMessage:"Field expects an array of objects, but received non-object value.",value:r};if(!T(n))return{fieldId:e,userMessage:"This field contains non-serializable data",systemMessage:"Field value contains non-JSON-serializable data (functions, circular references, etc.).",value:r}}return null}return Array.isArray(r)?{fieldId:e,userMessage:"This field expects a single value",systemMessage:"Field expects a single object, not an array.",value:r}:typeof r!="object"||r===null?{fieldId:e,userMessage:"This field expects an object value",systemMessage:"Field expects an object value.",value:r}:T(r)?null:{fieldId:e,userMessage:"This field contains non-serializable data",systemMessage:"Field value contains non-JSON-serializable data (functions, circular references, etc.).",value:r}}function Te(t,e,r){if(!Array.isArray(t.options)||t.options.length===0)return null;const n=Array.isArray(r)?r:[r];if(t.type==="object"){const s=t.options.map(l=>JSON.stringify(l.value));return n.every(l=>s.includes(JSON.stringify(l)))?null:{fieldId:e,userMessage:"This field expects a valid option",systemMessage:"Field expects a valid option from the defined choices.",value:r}}const i=t.options.map(s=>s.value);return n.every(s=>!Me(s)||s===null?!1:i.includes(s))?null:{fieldId:e,userMessage:"This field expects a valid option",systemMessage:`Field expects a valid option. Valid options are: ${i.join(", ")}`,value:r}}const Le=g.createDomain("response"),_e=S.createFactory(({client:t})=>{const e=Le.store({}),r=g.createEvent(),n=g.createEvent(),i=g.createApi(e,{register(a,c){return{...a,[c.fieldId]:c.response}},registerBatch(a,c){return{...a,...c}},clear(a,c){return Object.fromEntries(Object.entries(a).filter(([d])=>d!==c))},clearAll(){return{}}});function u(a,c){if(typeof a=="string"){if(c===void 0)throw new Error("Response is required when registering a single field");i.register({fieldId:a,response:c})}else i.registerBatch(a)}async function s(a,c,d){if(a.validation&&!J.isEmpty(a.validation)&&!z(d)){const y=await I.evaluateRuleLogic(t,a.validation,{$input:d});if(typeof y=="string")return{fieldId:c,userMessage:y,systemMessage:`Field validation resulted in an error: ${y}.`,value:d};if(y===!1)return{fieldId:c,userMessage:"This field is invalid",systemMessage:"Field validation resulted in an unspecified error.",value:d}}return a.required&&z(d)?{fieldId:c,userMessage:"This field is required",systemMessage:"Field is required.",value:d}:!a.multiple&&Array.isArray(d)&&d.length>1?{fieldId:c,userMessage:"This field expects a single response",systemMessage:"Field expects a single response.",value:d}:null}async function o(a){const c=[],d={},y=t.fields.listStore.getState();return await Promise.allSettled(Object.entries(a).map(async([h,F])=>{const j=Ue(h,y);if(!j){c.push({fieldId:h,userMessage:`Field '${h}' not found`,systemMessage:`No field with ID or key '${h}' exists. Available field IDs are: ${y.map(G=>G.id).join(",")}.`,value:F});return}const x=j.id,P=Ve(j,F),A=await s(j,x,P);if(A){c.push(A);return}const R=Ne(j,x,P);if(R){c.push(R);return}const O=Te(j,x,P);O&&c.push(O),d[x]=F})),{responsesToCommit:d,validationErrors:c}}async function l(a){const{responsesToCommit:c,validationErrors:d}=await o(a);return d.length?{errors:d}:(i.registerBatch(c),{errors:[]})}const f=e.map(a=>a),p=g.combine({responses:e,fields:t.fields.listStore},({responses:a,fields:c})=>Object.entries(a).map(([d,y])=>{const h=c.find(F=>F.id===d);return{fieldId:d,fieldKey:h?.key??d,value:y}}));function k(a){const c=t.fields.listStore.map(y=>y.find(h=>h.id===a)??null),d=e.map(y=>y[a]??null);return g.combine({f:c,r:d},({f:y,r:h})=>h!==null?h:y?.defaultValue?y.defaultValue:null)}function w(a){const c=t.fields.getByKey(a);return g.combine({f:c,s:e},({f:d,s:y})=>{const h=d?y[d.id]??null:null;return h||(d?.defaultValue?d.defaultValue:null)})}function m(a){const c=t.fields.getByName(a);return g.combine({f:c,s:e},({f:d,s:y})=>{const h=d&&y[d.id]||null;return h||(d?.defaultValue?d.defaultValue:null)})}return g.sample({clock:r,target:i.clearAll}),g.sample({clock:n,target:i.clear}),{register:u,clearAll:r,clear:n,commit:l,getResponsesToCommit:o,listStore:p,getAllStore:f,getByFieldId:k,getByFieldKey:w,getByFieldName:m}});function qe(t){return S.invoke(_e,t)}const He=g.createDomain("condition"),Ke=S.createFactory(()=>{const t=He.store({}),e=g.createApi(t,{register(s,o){return{...s,[o.condition.id]:o.condition}}});function r(s){e.register({condition:s})}const n=t.map(s=>Object.values(s));function i(s){return t.map(o=>o[s]??null)}function u(s){return t.map(o=>Object.values(o).find(l=>l.key===s)??null)}return{register:r,getById:i,getByKey:u,listStore:n}});function Ge(){return S.invoke(Ke)}function We(){if(b.supportsDocument()){const t=[document.currentScript,document.getElementById("picked_script"),document.getElementById("picked"),document.getElementById("cvly"),document.getElementById("cvly-x")];for(const e of t)if(e?.dataset.api)return e.dataset.api}return"https://api.picked.app"}function Je(){if(!b.supportsWindow())return{};const t=new URLSearchParams(window.location.search),e={},r=new Set;for(const[i]of t.entries())i.startsWith("picked-")&&r.add(i);for(const i of r){const u=i.replace("picked-","");e[u]=t.getAll(i)}const n=v.createStorageKey("s");if(r.size>0)v.sessionStore.set(n,e);else{const i=v.sessionStore.get(n);if(i)return i.json()||{}}return e}function Ye(){if(b.supportsCryptoRandomUUID())return crypto.randomUUID();const t=Date.now().toString(36),e=Math.random().toString(36).substring(2,15),r=Math.random().toString(36).substring(2,15),n=Math.random().toString(36).substring(2,15);return`${t}-${e}-${r}-${n}`}const Qe=v.createStorageKey("session","global"),Xe=()=>{const t=v.localStore.get(Qe);let e;t.isSet()&&(e=t.json());const r=i=>t.set({id:i.id,isUser:i.isUser,identifiers:i.identifiers}),n={id:e?.id??Ye(),isUser:e?.isUser??void 0,identifiers:e?.identifiers??void 0,setIsUser(i){this.isUser=i,r(this)},setIdentifier(i,u){this.identifiers={...this.identifiers,[i]:u},r(this)},removeIdentifier(i){this.identifiers&&(this.identifiers=Object.fromEntries(Object.entries(this.identifiers).filter(([u])=>u!==i)),this.identifiers=Object.keys(this.identifiers).length?this.identifiers:void 0,r(this))}};return r(n),n},Ze=()=>b.supportsLocalStorage()?Xe():null;function H(){if(b.supportsWindow())return globalThis.window.pickedConfig}function et(){if(!b.supportsWindow())return;const t=H(),e=t?.organizationId,r=t?.projectId;return e&&r?{organizationId:e,projectId:r}:void 0}function tt(){if(!b.supportsDocument())return;const t=document.getElementById("picked_script")||document.querySelector("script#picked")||document.getElementById("cvly");if(!t)return;const e=t.dataset.organizationid||t.getAttribute("organization-id"),r=t.dataset.projectid||t.getAttribute("project-id");return e&&r?{organizationId:e,projectId:r}:void 0}function rt(t){const{organizationId:e,projectId:r}=t;if(e&&r)return{organizationId:e,projectId:r};const n=et();if(n)return n;const i=tt();if(i)return i;throw new Error(`organizationId and projectId are required. You can provide them via one of:
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const g=require("effector"),S=require("@withease/factories"),I=require("../experience-instance-CxiOyYPf.cjs"),E=require("../logger-BsmHUUw1.cjs"),v=require("../storage-Be5xWNPC.cjs"),L=require("../api-GvmToTw0.cjs"),W=require("../nodes-DsL8kMSX.cjs"),J=require("../id-BKIWbSTy.cjs"),Y=require("../object-BbFTsGh3.cjs"),b=require("../supports-YvpQZxbh.cjs"),D=g.createDomain("experience"),Q=S.createFactory(({client:t,experience:e})=>{const r=D.store(e),n=g.createApi(r,{merge(f,p){return{...f,...p.experience}}}),i=r.map(f=>({name:f.name,decisionLogic:f.condition,targetSelectors:f.targets,initializeOpenLogic:e.initializeOpen})),u=e.component?{name:`experience:${e.id}`,component:e.component,frameworkStore:t.frameworks.getByName(e.component.frameworkName)}:void 0,s=t.components.listStore.map(f=>u||(e.componentName?f.find(p=>p.name===e.componentName):void 0)||f.find(p=>p.name===`experience:${e.id}`)||f.find(p=>p.name==="experience"),{skipVoid:!1}),o=r.map(f=>({steps:f.steps,nodes:f.nodes,edges:f.edges,conditions:f.conditions??f.conditionals??[]})),l=e.actions??[];return{id:e.id,key:e.key,name:e.name,configStore:i,treeStore:o,componentStore:s,actions:l,merge:n.merge}});function X(t){return S.invoke(Q,t)}const Z=S.createFactory(({client:t})=>{const e=D.store({}),r=D.store({}),n=g.createApi(e,{register(p,k){return{...p,[k.id]:k}}}),i=g.createApi(r,{register(p,{key:k,id:w}){return{...p,[k]:w}}});function u(p){const k=e.getState()[p.id];if(k){k.merge({experience:p,strategy:"override"}),p.key&&i.register({key:p.key,id:p.id});return}const w=X({client:t,experience:p});n.register(w),p.key&&i.register({key:p.key,id:p.id})}const s=e.map(p=>Object.values(p));function o(p){return g.combine(e,r,(k,w)=>k[p]??k[w[p]??""],{skipVoid:!1})}const l=g.attach({source:{experiences:e,keys:r},effect:async({experiences:p,keys:k},{id:w,options:m})=>{const a=p[w]??p[k[w]??""];if(!a){E.logger("warn",`Experience with id '${w}' not found.`);return}if(m?.bypassCondition){$(t,a,m);return}await q(t,a)&&$(t,a,m)}}),f=g.attach({source:{instances:t.experienceInstances.listStore,keys:r},effect:({instances:p,keys:k},{id:w,options:m})=>{const a=k[w]??w,c=p.filter(d=>d.experienceId===a);if(c.length>0)for(const d of c)d.open();else l({id:a,options:{...m,initialiseOpen:!0}})}});return{register:u,get:o,getById:o,launch:l,open:f,listStore:s}});function ee(t){return S.invoke(Z,t)}const te=(t,e)=>{e.register(t)},$=(t,e,r)=>{const{targetSelectors:n}=e.configStore.getState(),i=I.getTargetElements(n,e.id);i.forEach(({elements:s})=>s.forEach(o=>I.tagTargetElement(o,e.id))),I.createAppHosts(i,e.id).forEach(s=>{r?t.experienceInstances.spawn(e,s,r):t.experienceInstances.spawn(e,s)})},M=async t=>{await Promise.all(t.experiences.listStore.getState().map(async e=>{await q(t,e)&&$(t,e)}))},q=async(t,e)=>{if(!t.preconditionPassed||!t.session?.isUser)return!1;const{decisionLogic:r,targetSelectors:n}=e.configStore.getState();return I.getTargetElements(n,e.id).length<1||n.length===0?!1:r===void 0?!0:I.isRulesLogic(r)?await I.evaluateRuleLogic(t,r)===!0:!0},re=(t,e,r)=>{const n=e.name,i=e.setup(t);if(i){const u=r[n]??{};r[n]=Object.freeze({...u,...i})}},ne=g.createDomain("component"),se=S.createFactory(({client:t,component:e,name:r})=>{const n=t.frameworks.getByName(e.frameworkName);return{name:r,component:e,frameworkStore:n}});function ie(t){return S.invoke(se,t)}const oe=S.createFactory(({client:t})=>{const e=ne.store({}),r=g.createApi(e,{register(s,o){return{...s,[o.name]:o}}});function n(s,o){e.getState()[s]&&E.logger("warn",`Component '${s}' already registered. Registering again will override the previous registration.`);const f=ie({client:t,name:s,component:o});r.register(f)}const i=e.map(s=>Object.values(s));function u(s){return e.map(o=>o[s],{skipVoid:!1})}return{register:n,getByName:u,listStore:i}});function ae(t){return S.invoke(oe,t)}const U=(t,e,r)=>{r.register(t,e)},ce=g.createDomain("framework"),ue=S.createFactory(({client:t})=>{const e=ce.store({}),r=g.createApi(e,{register(s,o){return{...s,[o.name]:o.framework}}});function n(s,o){e.getState()[s]&&E.logger("warn",`Framework '${s}' already registered. Registering again will override the previous registration.`),r.register({name:s,framework:o})}const i=e.map(s=>Object.values(s));function u(s){return e.map(o=>o[s],{skipVoid:!1})}return{register:n,getByName:u,listStore:i}});function de(t){return S.invoke(ue,t)}const le=(t,e)=>{e.register(t.name,t)},pe=6e3,fe=v.createStorageKey("last_ping","global"),ge=async t=>{try{const e=Date.now(),r=v.localStore.get(fe);let n=0;if(r.isSet()&&(n=r.json()??0),n&&e-n<pe)return!0;const i={projectId:t.projectId,path:window.location.pathname},u={},o=document.getElementById("picked_script")?.dataset.verceltoken;o&&(u["x-vercel-protection-bypass"]=o);const f=(await L.post(t.apiUrl,"ping",i,u)).ok;return f&&r.set(e),f}catch(e){return E.logger("error",e),!1}};function _(t){const e=typeof window<"u",r={client:t,responses:t.responses.listStore.getState(),fields:t.fields.listStore.getState(),location:e?window.location:void 0,document:e?window.document:void 0,sessionStorage:e?window.sessionStorage:void 0,localStorage:e?window.localStorage:void 0};return Object.freeze(r)}const me=g.createDomain("predicate"),ye=S.createFactory(({client:t})=>{const e=me.store({}),r=g.createApi(e,{register(o,l){return{...o,[l.name]:{name:l.name,predicate:l.predicate}}}});function n(o,l){e.getState()[o]&&E.logger("warn",`Predicate '${o}' already registered. Registering again will override the previous registration.`),r.register(Object.freeze({name:o,predicate:l}))}const i=e.map(o=>Object.values(o));function u(o){return e.map(l=>l[o]?.predicate,{skipVoid:!1})}function s(o){const l=g.createStore(()=>{},{skipVoid:!1}),f=g.createEffect(async()=>{const p=u(o).getState();if(!p)return;const k=_(t);return(...w)=>p({...k,args:w})});return g.sample({source:{responses:t.responses.listStore,fields:t.fields.listStore},target:f}),g.sample({clock:f.doneData,filter:p=>p!==void 0,target:l}),f(),l}return{register:n,getByName:u,listStore:i,getEvokablePredicate:s}});function he(t){return S.invoke(ye,t)}const Se=(t,e,r)=>{r.register(t,e)},V=g.createDomain("feature"),ke=S.createFactory(({client:t})=>{const e=V.store({}),r=V.store([]),n=g.createApi(e,{register(m,a){return{...m,[a.id]:a.feature}}});function i(m,a){e.getState()[m]&&E.logger("warn",`Feature '${m}' already registered. Registering again will override the previous registration.`);const d={id:m,feature:{...a,id:m}};n.register(Object.freeze({id:m,feature:d}))}const u=g.createEffect(async({id:m,key:a,storage:c="local"})=>{const d=v.createStorageKey(`feature:${m}:${a}`,"global"),h=(c==="session"?v.sessionStore:v.localStore).get(d).boolean();return h===null?null:{id:m,key:a,bucket:h,storage:c}}),s=g.createEffect(m=>{if(!m)return null;const a=v.createStorageKey(`feature:${m.id}:${m.key}`,"global");(m.storage==="session"?v.sessionStore:v.localStore).set(a,m.bucket)}),o=new Map,l=g.attach({source:{allFeaturesStore:e,resolvedFeaturesStore:r},effect:async({allFeaturesStore:m,resolvedFeaturesStore:a},{id:c,decide:d,key:y})=>{const h=a.find(A=>A.id===c&&A.key===y);if(h)return h;const F=m[c];if(!F)throw new Error(`Feature with id '${c}' not found`);const j=o.get(`${c}:${y}`);if(j!==void 0){const A=await j;return{id:F.id,bucket:A,key:y,storage:F.feature.storage}}const x=d();o.set(`${c}:${y}`,x);const P=await x;return{id:F.id,bucket:P,key:y,storage:F.feature.storage}}});g.sample({clock:n.register,fn:m=>{const{id:a,feature:c}=m;return{id:a,key:c.feature.key,storage:c.feature.storage}},target:u}),g.sample({source:e,clock:l.doneData,fn:(m,a)=>{const{id:c,bucket:d,storage:y}=a,h=m[c]?.feature.key;return h?{key:h,id:c,bucket:d,storage:y}:null},target:s});const f=g.combine({allFeaturesStore:e,resolvedFeaturesStore:r}).map(({allFeaturesStore:m,resolvedFeaturesStore:a})=>Object.values(m).map(c=>{const d=a.find(y=>y.id===c.id&&y.key===c.feature.key);return d?{id:c.id,name:c.feature.name,key:c.feature.key,getBucket:()=>({id:c.id,bucket:d.bucket}),isResolved:!0}:{id:c.id,name:c.feature.name,key:c.feature.key,getBucket:async()=>await l(c.feature),isResolved:!1}}));g.sample({clock:l.doneData,source:{resolvedFeatures:r},filter:({resolvedFeatures:m},{id:a,key:c})=>!m.some(y=>y.id===a&&y.key===c),fn:(m,a)=>a,target:t.eventBus.prepend(m=>({type:"feature_decide",feature:m}))}),g.sample({clock:[u.doneData,l.doneData],source:r,fn:(m,a)=>!a||m.some(d=>d.id===a.id&&d.key===a.key)?m:[...m,a],target:r});function p(m){return f.map(a=>a.find(c=>c.id===m))}function k(m){return e.map(a=>a[m],{skipVoid:!1})}function w(m){const a=g.createStore(async()=>{},{skipVoid:!1}),c=g.createEffect(async()=>{const d=p(m).getState();if(d)return async()=>(await d.getBucket()).bucket});return g.sample({source:r,filter:d=>d.some(y=>y.id===m),target:c}),g.sample({clock:c.doneData,filter:d=>d!==void 0,target:a}),c(),a}return{register:i,getById:p,getByName:k,listStore:f,getEvokableFeature:w}});function be(t){return S.invoke(ke,t)}const we=(t,e,r)=>{r.register(t,e)},C=g.createDomain("history");function N(t,e){return{id:J.generateId(`history-entry-${Date.now()}-${Math.random()}}`),node:e,at:Date.now(),experienceId:t}}const ve=S.createFactory(()=>{const t=C.store({entries:[]}),e=C.event(),r=C.event(),n=C.event(),i=C.event();t.on(e,(s,o)=>({entries:[...s.entries,N(o.experienceId,o.node)]})),t.on(r,(s,o)=>({entries:[...s.entries.slice(0,-1),N(o.experienceId,o.node)]})),t.on(i,(s,o)=>o);function u(s,o){const l={lastStepIndex:-1,secondLastStepIndex:-1};for(let f=s.length-1;f>=0;f--){const p=s[f],k=p?.node;if(!(!k||!W.isStepNode(k))&&!(o&&p?.experienceId!==o))if(l.lastStepIndex===-1)l.lastStepIndex=f;else{l.secondLastStepIndex=f;break}}return l}return t.on(n,(s,o)=>{const{secondLastStepIndex:l}=u(s.entries,o.experienceId),f=l!==-1?s.entries.slice(0,l+1):s.entries;return{...s,entries:f}}),{push:e,replace:r,back:n,restore:i,entriesStore:t.map(s=>s.entries)}});function Ie(){return S.invoke(ve)}let Fe=0;const Ee=t=>{const e=g.createStore([]);return g.sample({clock:t,source:e,fn:(r,n)=>[...r,{id:Fe++,at:new Date,payload:n}],target:e}),e},je=g.createDomain("field"),xe=S.createFactory(()=>{const t=je.store({}),e=g.createApi(t,{register(l,f){return{...l,[f.field.id]:f.field}}});function r(l){e.register({field:l})}function n(l,f){const p=t.getState()[l]??null;if(!p)return;const k=Object.assign({},p,{...f});e.register({field:{...k}})}const i=t.map(l=>Object.values(l));function u(l){return t.map(f=>f[l]??null)}function s(l){return t.map(f=>Object.values(f).find(p=>p.key===l)??null)}function o(l){return t.map(f=>Object.values(f).find(p=>p.name===l)??null)}return{register:r,update:n,getById:u,getByKey:s,listStore:i,getByName:o}});function Ae(){return S.invoke(xe)}const Pe=(t,e)=>{e.register(t)},Ce=g.createDomain("step"),Be=S.createFactory(()=>{const t=Ce.store({}),e=g.createApi(t,{register(u,s){return{...u,[s.step.id]:s.step}}});function r(u){e.register({step:u})}const n=t.map(u=>Object.values(u));function i(u){return t.map(s=>s[u]??null)}return{register:r,getById:i,listStore:n}});function De(){return S.invoke(Be)}function $e(t,e){e.register(t)}const ze=g.createDomain("action"),Re=S.createFactory(()=>{const t=ze.store({}),e=g.createApi(t,{register(s,o){return{...s,[o.name]:{name:o.name,action:o.action}}}});function r(s,o){e.register({name:s,action:o})}const n=t.map(s=>Object.values(s));function i(s){return t.map(o=>o[s],{skipVoid:!1})}function u(s){return t.map(o=>{const l=o[s];return l?l.action:void 0},{skipVoid:!1})}return{register:r,getByName:i,listStore:n,getEvokableAction:u}});function Oe(){return S.invoke(Re)}const Me=(t,e,r)=>{r.register(t,e)};function z(t){return typeof t>"u"||t===null||t===""||Array.isArray(t)&&!t.length}function Ue(t){return typeof t=="string"||typeof t=="number"||typeof t=="boolean"||t===null}function T(t){try{return JSON.stringify(t),!0}catch{return!1}}function Ve(t,e){return e.find(r=>r.id===t)??e.find(r=>r.key===t)??null}function Ne(t,e){return t.multiple&&(typeof e=="string"||typeof e=="number"||typeof e=="boolean")?[e]:e}function Te(t,e,r){if(t.type!=="object"||z(r))return null;if(t.multiple){if(!Array.isArray(r))return{fieldId:e,userMessage:"This field expects multiple values",systemMessage:"Field expects an array of objects.",value:r};for(const n of r){if(typeof n!="object"||n===null)return{fieldId:e,userMessage:"This field expects object values",systemMessage:"Field expects an array of objects, but received non-object value.",value:r};if(!T(n))return{fieldId:e,userMessage:"This field contains non-serializable data",systemMessage:"Field value contains non-JSON-serializable data (functions, circular references, etc.).",value:r}}return null}return Array.isArray(r)?{fieldId:e,userMessage:"This field expects a single value",systemMessage:"Field expects a single object, not an array.",value:r}:typeof r!="object"||r===null?{fieldId:e,userMessage:"This field expects an object value",systemMessage:"Field expects an object value.",value:r}:T(r)?null:{fieldId:e,userMessage:"This field contains non-serializable data",systemMessage:"Field value contains non-JSON-serializable data (functions, circular references, etc.).",value:r}}function Le(t,e,r){if(!Array.isArray(t.options)||t.options.length===0)return null;const n=Array.isArray(r)?r:[r];if(t.type==="object"){const s=t.options.map(l=>JSON.stringify(l.value));return n.every(l=>s.includes(JSON.stringify(l)))?null:{fieldId:e,userMessage:"This field expects a valid option",systemMessage:"Field expects a valid option from the defined choices.",value:r}}const i=t.options.map(s=>s.value);return n.every(s=>!Ue(s)||s===null?!1:i.includes(s))?null:{fieldId:e,userMessage:"This field expects a valid option",systemMessage:`Field expects a valid option. Valid options are: ${i.join(", ")}`,value:r}}const qe=g.createDomain("response"),_e=S.createFactory(({client:t})=>{const e=qe.store({}),r=g.createEvent(),n=g.createEvent(),i=g.createApi(e,{register(a,c){return{...a,[c.fieldId]:c.response}},registerBatch(a,c){return{...a,...c}},clear(a,c){return Object.fromEntries(Object.entries(a).filter(([d])=>d!==c))},clearAll(){return{}}});function u(a,c){if(typeof a=="string"){if(c===void 0)throw new Error("Response is required when registering a single field");i.register({fieldId:a,response:c})}else i.registerBatch(a)}async function s(a,c,d){if(a.validation&&!Y.isEmpty(a.validation)&&!z(d)){const y=await I.evaluateRuleLogic(t,a.validation,{$input:d});if(typeof y=="string")return{fieldId:c,userMessage:y,systemMessage:`Field validation resulted in an error: ${y}.`,value:d};if(y===!1)return{fieldId:c,userMessage:"This field is invalid",systemMessage:"Field validation resulted in an unspecified error.",value:d}}return a.required&&z(d)?{fieldId:c,userMessage:"This field is required",systemMessage:"Field is required.",value:d}:!a.multiple&&Array.isArray(d)&&d.length>1?{fieldId:c,userMessage:"This field expects a single response",systemMessage:"Field expects a single response.",value:d}:null}async function o(a){const c=[],d={},y=t.fields.listStore.getState();return await Promise.allSettled(Object.entries(a).map(async([h,F])=>{const j=Ve(h,y);if(!j){c.push({fieldId:h,userMessage:`Field '${h}' not found`,systemMessage:`No field with ID or key '${h}' exists. Available field IDs are: ${y.map(G=>G.id).join(",")}.`,value:F});return}const x=j.id,P=Ne(j,F),A=await s(j,x,P);if(A){c.push(A);return}const R=Te(j,x,P);if(R){c.push(R);return}const O=Le(j,x,P);O&&c.push(O),d[x]=F})),{responsesToCommit:d,validationErrors:c}}async function l(a){const{responsesToCommit:c,validationErrors:d}=await o(a);return d.length?{errors:d}:(i.registerBatch(c),{errors:[]})}const f=e.map(a=>a),p=g.combine({responses:e,fields:t.fields.listStore},({responses:a,fields:c})=>Object.entries(a).map(([d,y])=>{const h=c.find(F=>F.id===d);return{fieldId:d,fieldKey:h?.key??d,value:y}}));function k(a){const c=t.fields.listStore.map(y=>y.find(h=>h.id===a)??null),d=e.map(y=>y[a]??null);return g.combine({f:c,r:d},({f:y,r:h})=>h!==null?h:y?.defaultValue?y.defaultValue:null)}function w(a){const c=t.fields.getByKey(a);return g.combine({f:c,s:e},({f:d,s:y})=>{const h=d?y[d.id]??null:null;return h||(d?.defaultValue?d.defaultValue:null)})}function m(a){const c=t.fields.getByName(a);return g.combine({f:c,s:e},({f:d,s:y})=>{const h=d&&y[d.id]||null;return h||(d?.defaultValue?d.defaultValue:null)})}return g.sample({clock:r,target:i.clearAll}),g.sample({clock:n,target:i.clear}),{register:u,clearAll:r,clear:n,commit:l,getResponsesToCommit:o,listStore:p,getAllStore:f,getByFieldId:k,getByFieldKey:w,getByFieldName:m}});function He(t){return S.invoke(_e,t)}const Ke=g.createDomain("condition"),Ge=S.createFactory(()=>{const t=Ke.store({}),e=g.createApi(t,{register(s,o){return{...s,[o.condition.id]:o.condition}}});function r(s){e.register({condition:s})}const n=t.map(s=>Object.values(s));function i(s){return t.map(o=>o[s]??null)}function u(s){return t.map(o=>Object.values(o).find(l=>l.key===s)??null)}return{register:r,getById:i,getByKey:u,listStore:n}});function We(){return S.invoke(Ge)}function Je(){if(b.supportsDocument()){const t=[document.currentScript,document.getElementById("picked_script"),document.getElementById("picked"),document.getElementById("cvly"),document.getElementById("cvly-x")];for(const e of t)if(e?.dataset.api)return e.dataset.api}return"https://api.picked.app"}function Ye(){if(!b.supportsWindow())return{};const t=new URLSearchParams(window.location.search),e={},r=new Set;for(const[i]of t.entries())i.startsWith("picked-")&&r.add(i);for(const i of r){const u=i.replace("picked-","");e[u]=t.getAll(i)}const n=v.createStorageKey("s");if(r.size>0)v.sessionStore.set(n,e);else{const i=v.sessionStore.get(n);if(i)return i.json()||{}}return e}function Qe(){if(b.supportsCryptoRandomUUID())return crypto.randomUUID();const t=Date.now().toString(36),e=Math.random().toString(36).substring(2,15),r=Math.random().toString(36).substring(2,15),n=Math.random().toString(36).substring(2,15);return`${t}-${e}-${r}-${n}`}const Xe=v.createStorageKey("session","global"),Ze=()=>{const t=v.localStore.get(Xe);let e;t.isSet()&&(e=t.json());const r=i=>t.set({id:i.id,isUser:i.isUser,identifiers:i.identifiers}),n={id:e?.id??Qe(),isUser:e?.isUser??void 0,identifiers:e?.identifiers??void 0,setIsUser(i){this.isUser=i,r(this)},setIdentifier(i,u){this.identifiers={...this.identifiers,[i]:u},r(this)},removeIdentifier(i){this.identifiers&&(this.identifiers=Object.fromEntries(Object.entries(this.identifiers).filter(([u])=>u!==i)),this.identifiers=Object.keys(this.identifiers).length?this.identifiers:void 0,r(this))}};return r(n),n},et=()=>b.supportsLocalStorage()?Ze():null;function H(){if(b.supportsWindow())return globalThis.window.pickedConfig}function tt(){if(!b.supportsWindow())return;const t=H(),e=t?.organizationId,r=t?.projectId;return e&&r?{organizationId:e,projectId:r}:void 0}function rt(){if(!b.supportsDocument())return;const t=document.getElementById("picked_script")||document.querySelector("script#picked")||document.getElementById("cvly");if(!t)return;const e=t.dataset.organizationid||t.getAttribute("organization-id"),r=t.dataset.projectid||t.getAttribute("project-id");return e&&r?{organizationId:e,projectId:r}:void 0}function nt(t){const{organizationId:e,projectId:r}=t;if(e&&r)return{organizationId:e,projectId:r};const n=tt();if(n)return n;const i=rt();if(i)return i;throw new Error(`organizationId and projectId are required. You can provide them via one of:
|
|
2
2
|
(1) createClient({ organizationId, projectId }) options;
|
|
3
3
|
(2) window.pickedConfig = { organizationId, projectId };
|
|
4
|
-
(3) a <script> tag with id 'picked_script', 'picked', or 'cvly' that includes data-organizationid/data-projectid (or organization-id/project-id) attributes.`)}function B(t){return t==null||t===""||Number.isNaN(t)}const
|
|
4
|
+
(3) a <script> tag with id 'picked_script', 'picked', or 'cvly' that includes data-organizationid/data-projectid (or organization-id/project-id) attributes.`)}function B(t){return t==null||t===""||Number.isNaN(t)}const st={default:(t,e)=>B(t)?String(e??""):String(t),append:(t,e)=>e&&!B(t)?`${t} ${e}`:t,prepend:(t,e)=>e&&!B(t)?`${e} ${t}`:t,upper:t=>typeof t=="string"?t.toUpperCase():t,lower:t=>typeof t=="string"?t.toLowerCase():t,capitalize:t=>typeof t=="string"?t.charAt(0).toUpperCase()+t.slice(1):t,list:t=>{if(!t||typeof t!="object")return t;const e=new Intl.ListFormat("en",{style:"long",type:"conjunction"});if(Array.isArray(t))return e.format(t.map(String));if(t instanceof Map){const r=Array.from(t.entries()).map(([n,i])=>`${n}: ${i}`);return e.format(r)}return t instanceof Set?e.format(Array.from(t).map(String)):t}};function it(t){return typeof t=="object"&&t!==null}function ot(t,e){let r=e;for(const n of t.split("."))if(it(r)&&n in r)r=r[n];else return;return typeof r=="function"?r():r}function at(t,e){const r=t.split("|").map(u=>u.trim()),n=r.shift()??"";let i=ot(n,e);for(const u of r){const[s,...o]=u.split(":"),l=s?.trim()??"",f=o.join(":").trim().replaceAll(/(?:^['"]|['"]$)/g,""),p=st[l];p&&(i=p(i,f))}return B(i)?"":typeof i=="object"?JSON.stringify(i):String(i)}function ct(t,e){let r="",n=0;for(;n<t.length;)if(t[n]==="{"&&t[n+1]==="{"){n+=2;let i="";for(;n<t.length;){if(t[n]==="}"&&t[n+1]==="}"){n+=2;break}i+=t[n++]}r+=at(i.trim(),e)}else r+=t[n++];return r}class K{static logger=E.logger;options;isReady=!1;project;plugins={};pluginStartHooks=[];eventBus=g.createEvent();events;organizationId;projectId;apiUrl;dashboardUrl;documentationSiteUrl;session;precondition;condition;preconditionPassed;searchParams=Ye();history=Ie();components=ae({client:this});experienceInstances=I.createExperienceInstanceIndex({client:this});experiences=ee({client:this});frameworks=de({client:this});predicates=he({client:this});features=be({client:this});conditions=We();fields=Ae();responses=He({client:this});steps=De();actions=Oe();constructor(e){E.logger("info","Picked client initializing."),this.events=Ee(this.eventBus);const{organizationId:r,projectId:n}=nt(e);this.organizationId=r,this.projectId=n,this.options=Object.freeze(e),this.apiUrl=e.apiUrl||Je(),this.dashboardUrl=e.dashboardUrl??"https://dashboard.picked.app",this.documentationSiteUrl=e.documentationSiteUrl??"https://docs.picked.app",this.session=et(),this.setupPlugins(),this.setupFeatures(),this.setupPredicates(),this.setupActions(),this.setupComponents(),this.precondition=e.precondition,this.condition=e.condition,this.eventBus({type:"load",version:L.getVersion()}),E.logger("info","Picked client initialized.")}start=()=>{ge(this),(async()=>{if(!b.supportsDocument())return;await this.runPluginStartHooks();const r=await this.evaluateGate(this.precondition);this.preconditionPassed=r;let n;r&&(n=await this.evaluateGate(this.condition));const i=r&&n===!0;if(typeof n=="boolean"&&this.session){const u=n;this.session.setIsUser(u),this.eventBus({type:"user_decide",value:u})}if(this.eventBus({type:"initialize"}),i&&M(this),await I.domInteractive(),i&&M(this),this.eventBus({type:"ready"}),this.isReady=!0,this.session){const{id:u,isUser:s,identifiers:o}=this.session;this.eventBus({type:"session",id:u,isUser:s,identifiers:o})}})()};registerFramework=e=>{le(e,this.frameworks)};registerComponent=(e,r)=>{U(e,r,this.components)};registerPlugin=e=>{re(this,e,this.plugins);const r=this.plugins[e.name];r?.onStart&&this.pluginStartHooks.push(r.onStart)};registerFeature=(e,r)=>{we(e,r,this.features)};registerPredicate=(e,r)=>{Se(e,r,this.predicates)};registerCondition=e=>{this.conditions.register(e)};registerField=e=>{Pe(e,this.fields)};registerStep=e=>{$e(e,this.steps)};registerAction=(e,r)=>{Me(e,r,this.actions)};registerExperience=e=>{e.component&&U(`experience:${e.id}`,e.component,this.components),te(e,this.experiences)};getStateSnapshot=()=>_(this);launchExperienceById=async(e,r)=>{this.experiences.launch({id:e,options:r})};openExperienceById=async e=>{this.experiences.open({id:e})};async runPluginStartHooks(){for(const e of this.pluginStartHooks)await e()}async evaluateGate(e){return e===void 0?!0:typeof e=="boolean"?e:await I.evaluateRuleLogic(this,e)===!0}setupPlugins(){this.options.plugins?.forEach(e=>{if(Array.isArray(e)){e.forEach(n=>{this.registerPlugin(n)});return}const r=typeof e=="function"?e():e;if(Array.isArray(r)){r.forEach(n=>this.registerPlugin(n));return}this.registerPlugin(r)})}setupFeatures(){const e=this.options.features;e&&(Object.entries(e).forEach(([r,n])=>{const i=typeof n=="function"?n():n;this.registerFeature(r,i)}),this.searchParams.feature&&this.searchParams.feature.forEach(r=>{try{const[n,i]=r.split(":");if(!n||!i)return;let u=i;u==="true"&&(u=!0),u==="false"&&(u=!1),this.registerFeature(n,{key:`${u}`,name:n,decide:()=>u,storage:"session"})}catch{}}))}setupPredicates(){const e=this.options.predicates;e&&Object.entries(e).forEach(([r,n])=>{if(typeof n!="function"){E.logger("warn",`Predicate "${r}" is not a function.`);return}this.registerPredicate(r,n)})}setupActions(){const e=this.options.actions;e&&Object.entries(e).forEach(([r,n])=>{if(typeof n!="function"){E.logger("warn",`Action "${r}" is not a function.`);return}this.registerAction(r,n)})}setupComponents(){const e=this.options.components;e&&Object.entries(e).forEach(([r,n])=>{this.registerComponent(r,n)})}getPluginConfig=e=>this.plugins[e]??{};renderString=(e,r)=>{const n=this.responses.listStore.getState().reduce((i,u)=>(i[u.fieldId]=u.value,i),{});return ct(e,{...r,responses:n})}}function ut(t){return{$$type:"lazy-component",load:t}}function dt(t){return typeof t=="object"&&t!==null&&"$$type"in t&&t.$$type==="lazy-component"}const lt=t=>{const e=new K(t);return b.bindClient(e),e};exports.evaluateRuleLogic=I.evaluateRuleLogic;exports.isPickedRoot=I.isPickedRoot;exports.createStorageKey=v.createStorageKey;exports.localStore=v.localStore;exports.sessionStore=v.sessionStore;exports.subscribe=v.subscribe;exports.supportsCookies=b.supportsCookies;exports.supportsCryptoRandomUUID=b.supportsCryptoRandomUUID;exports.supportsDocument=b.supportsDocument;exports.supportsHistory=b.supportsHistory;exports.supportsIntersectionObserver=b.supportsIntersectionObserver;exports.supportsLocalStorage=b.supportsLocalStorage;exports.supportsLocation=b.supportsLocation;exports.supportsSessionStorage=b.supportsSessionStorage;exports.supportsShadowRoot=b.supportsShadowRoot;exports.supportsWebComponents=b.supportsWebComponents;exports.supportsWindow=b.supportsWindow;exports.Picked=K;exports.createClient=lt;exports.getPickedConfig=H;exports.isLazyLoader=dt;exports.lazyComponent=ut;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const f=require("../../../id-BKIWbSTy.cjs"),N=require("../../../logger-BsmHUUw1.cjs"),a={serialize(i){return JSON.stringify(i)},deserialize(i){return JSON.parse(i)}},z=i=>({name:"create-experience",setup:s=>{i.experiences.forEach(l=>{l.fields.forEach(r=>{s.registerField(a.deserialize(r.serialize()))}),l.steps.forEach(r=>{s.registerStep(a.deserialize(r.serialize()))});const o=l.serialize(),n=a.deserialize(o);n.component=l.component,s.registerExperience(n)})}});function
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const f=require("../../../id-BKIWbSTy.cjs"),N=require("../../../logger-BsmHUUw1.cjs"),a={serialize(i){return JSON.stringify(i)},deserialize(i){return JSON.parse(i)}},z=i=>({name:"create-experience",setup:s=>{i.experiences.forEach(l=>{l.fields.forEach(r=>{s.registerField(a.deserialize(r.serialize()))}),l.steps.forEach(r=>{s.registerStep(a.deserialize(r.serialize()))});const o=l.serialize(),n=a.deserialize(o);n.component=l.component,s.registerExperience(n)})}});function y(i){return i.toLowerCase().replaceAll(/[^a-z0-9\s-]/g,"").trim().replaceAll(/\s+/g,"-")}const b=(i,s)=>({id:f.generateId("node"),experience:s,type:"action",action:i.action,addNext(o){if(!o.node)throw new Error("Cannot connect to node");const n=h({sourceNode:this,destinationNode:o.node,sourceNodeHandle:null},s);s.edges.push(n)},onSuccess(o){if(!o.node)throw new Error("Cannot connect to node");const n=h({sourceNode:this,destinationNode:o.node,sourceNodeHandle:"true"},s);s.edges.push(n)},onFail(o){if(!o.node)throw new Error("Cannot connect to node");const n=h({sourceNode:this,destinationNode:o.node,sourceNodeHandle:"false"},s);s.edges.push(n)},serialize(){return a.serialize({id:this.id,type:this.type,action:this.action})}}),v=i=>{const s=i.name??i.label??"",l=i.key??i.id??y(s);return{id:i.id??f.generateId("step"),name:s,key:l,label:s,fields:i.fields??[],addField(o){const n="serialize"in o?o:g(o);return this.fields.includes(n)||this.fields.push(n),n}}},x=(i,s)=>{const l=i.name??i.label??"",o=i.key??i.id??y(l),n={id:i.id??f.generateId("step"),name:l,key:o,label:l,experience:s,fields:i.fields??[],node:null,nextStep(r){return this.experience.addStep(r,this)},nextCondition(r){return this.experience.addCondition(r,this)},nextConditional(r){return this.experience.addCondition(r,this)},addNextExperience(r){return this.experience.addExperience(r,this)},addField(r){return this.experience.addField(r,this)},serialize(){return a.serialize({id:this.id,name:this.name,key:this.key,label:this.name,fieldKeys:this.fields.map(r=>r.key),fieldIds:this.fields.map(r=>r.id)})}};return p({step:n,type:"step"},s),n},p=(i,s)=>{const l={id:f.generateId("node"),experience:s};if(i.type==="step"){const n={...l,type:"step",connectedStep:i.step,serialize(){return a.serialize({id:this.id,type:this.type,stepKey:this.connectedStep.key,stepId:this.connectedStep.key,name:this.connectedStep.name,label:this.connectedStep.name})}};return n.connectedStep.node=n,n}if(i.type==="conditional"){const n={...l,type:"conditional",connectedCondition:i.conditional,serialize(){return a.serialize({id:this.id,type:this.type,conditionId:this.connectedCondition.id})}};return n.connectedCondition.node=n,n}return i.type==="experience"?{...l,type:"experience",connectedExperience:i.experience,serialize(){return a.serialize({id:this.id,type:this.type,experienceId:this.connectedExperience.id})}}:{...l,type:"origin",serialize(){return a.serialize({id:this.id,type:this.type})}}},h=(i,s)=>({id:f.generateId("edge"),sourceNode:i.sourceNode,sourceNodeHandle:i.sourceNodeHandle,destinationNode:i.destinationNode,experience:s,serialize(){return a.serialize({id:this.id,sourceNodeHandle:this.sourceNodeHandle??void 0,sourceNodeId:this.sourceNode.id,destinationNodeId:this.destinationNode.id})}}),m=(i,s)=>{const l={id:f.generateId("conditional"),label:i.label,condition:i.condition,node:null,experience:s,addTrue(o){if(!this.node||!o.node)throw new Error("todo no node");const n=h({sourceNode:this.node,destinationNode:o.node,sourceNodeHandle:"true"},this.experience);this.experience.edges.push(n)},addFalse(o){if(!this.node||!o.node)throw new Error("todo no node");const n=h({sourceNode:this.node,destinationNode:o.node,sourceNodeHandle:"false"},this.experience);this.experience.edges.push(n)},serialize(){return a.serialize({id:this.id,label:this.label,condition:this.condition})}};return p({conditional:l,type:"conditional"},s),l};function E(...i){return m(...i)}const g=i=>{const s=i.key??i.id??y(i.name);return i.id!==void 0&&N.logger("warn",`createField: 'id' is deprecated. Use 'key' instead of id="${i.id}". The field key "${s}" will be used for lookups.`),{id:i.id??f.generateId("field"),key:s,name:i.name,type:i.type,label:i.label,placeholder:i.placeholder,description:i.description,helpText:i.helpText,defaultValue:i.defaultValue??null,multiple:i.multiple,validation:i.validation??{},condition:i.condition,required:i.required,options:i.options?.map(n=>({id:"id"in n?n.id:f.generateId("option"),...n}))??null,policies:i.policies,serialize(){const n={id:this.id,key:this.key,name:this.name,label:this.label,placeholder:this.placeholder,required:this.required,description:this.description,helpText:this.helpText,validation:this.validation,condition:this.condition,policies:this.policies},r=typeof this.defaultValue=="string"?this.defaultValue:void 0,d=typeof this.defaultValue=="number"?this.defaultValue:void 0,c=typeof this.defaultValue=="boolean"?this.defaultValue:void 0;switch(this.type){case"text":if(this.multiple){let e;if(Array.isArray(this.defaultValue)){e=[];for(const t of this.defaultValue)typeof t=="string"&&e.push(t);e.length===0&&(e=void 0)}return a.serialize({...n,type:"text",multiple:!0,defaultValue:e,options:this.options?this.options.map(t=>({id:t.id,label:t.label,value:`${t.value}`,condition:t.condition})):null})}return a.serialize({...n,type:"text",multiple:!1,defaultValue:r,options:this.options?this.options.map(e=>({id:e.id,label:e.label,value:`${e.value}`,condition:e.condition})):null});case"number":if(this.multiple){let e;if(Array.isArray(this.defaultValue)){e=[];for(const t of this.defaultValue)typeof t=="number"&&e.push(t);e.length===0&&(e=void 0)}return a.serialize({...n,type:"number",multiple:!0,defaultValue:e,options:this.options?this.options.map(t=>({id:t.id,label:t.label,value:Number(t.value),condition:t.condition})):null})}return a.serialize({...n,type:"number",multiple:!1,defaultValue:d,options:this.options?this.options.map(e=>({id:e.id,label:e.label,value:Number(e.value),condition:e.condition})):null});case"boolean":if(this.multiple){let e;if(Array.isArray(this.defaultValue)){e=[];for(const t of this.defaultValue)typeof t=="boolean"&&e.push(t);e.length===0&&(e=void 0)}return a.serialize({...n,type:"boolean",multiple:!0,defaultValue:e,options:this.options?this.options.map(t=>({id:t.id,label:t.label,value:!!t.value,condition:t.condition})):null})}return a.serialize({...n,type:"boolean",multiple:!1,defaultValue:c,options:this.options?this.options.map(e=>({id:e.id,label:e.label,value:!!e.value,condition:e.condition})):null});case"object":return this.multiple?a.serialize({...n,type:"object",multiple:!0,defaultValue:this.defaultValue,options:this.options?this.options.map(e=>({id:e.id,label:e.label,description:e.description,value:e.value,condition:e.condition})):null}):a.serialize({...n,type:"object",multiple:!1,defaultValue:this.defaultValue,options:this.options?this.options.map(e=>({id:e.id,label:e.label,description:e.description,value:e.value,condition:e.condition})):null});default:throw new Error("Unsupported field type")}}}},V=i=>{const s=[],l=[],o=[],n=[],r=[];return{id:i.id,component:i.component,name:i.name,initializeOpen:i.initializeOpen,condition:i.condition,targets:i.targets,steps:s,nodes:l,edges:o,fields:r,conditions:n,get conditionals(){return this.conditions},addStep(d,c){let e=c?.node;this.nodes.length===0&&(e=p({type:"origin"},this),this.nodes.push(e));const t="serialize"in d?d:x(d,this);if(e){if(!t.node)throw new Error("todo no node");const u=h({sourceNode:e,destinationNode:t.node,sourceNodeHandle:null},this);this.edges.push(u)}return t.fields.length>0&&t.fields.forEach(u=>{this.fields.includes(u)||this.fields.push(u)}),this.steps.includes(t)||(this.steps.push(t),t.node&&this.nodes.push(t.node)),t},addAction(d,c){let e=c?.node;this.nodes.length===0&&(e=p({type:"origin"},this),this.nodes.push(e));const t="serialize"in d?d:b(d,this);if(e){const u=h({sourceNode:e,destinationNode:t,sourceNodeHandle:null},this);this.edges.push(u)}return this.nodes.push(t),t},addCondition(d,c){let e=c?.node;this.nodes.length===0&&(e=p({type:"origin"},this),this.nodes.push(e));const t="serialize"in d?d:m(d,this);if(e){if(!t.node)throw new Error("todo no node");const u=h({sourceNode:e,destinationNode:t.node,sourceNodeHandle:null},this);this.edges.push(u)}return this.conditions.includes(t)||(this.conditions.push(t),t.node&&this.nodes.push(t.node)),t},addConditional(d,c){return this.addCondition(d,c)},addExperience(d,c){let e=c?.node;this.nodes.length===0&&(e=p({type:"origin"},this),this.nodes.push(e));const t=p({type:"experience",experience:d},this);if(this.nodes.push(t),e){const u=h({sourceNode:e,destinationNode:t,sourceNodeHandle:null},this);this.edges.push(u)}return d},addField(d,c){const e="serialize"in d?d:g(d);return c&&c.fields.push(e),this.fields.includes(e)||this.fields.push(e),e},serialize(){return a.serialize({id:this.id,component:this.component,name:this.name,initializeOpen:this.initializeOpen,condition:this.condition,targets:this.targets,steps:this.steps.map(d=>d.id),nodes:this.nodes.map(d=>a.deserialize(d.serialize())),edges:this.edges.map(d=>a.deserialize(d.serialize())),conditions:this.conditions.map(d=>a.deserialize(d.serialize()))})}}};exports.createCondition=m;exports.createConditional=E;exports.createEdge=h;exports.createExperience=V;exports.createExperiencePlugin=z;exports.createField=g;exports.createNode=p;exports.createStep=v;exports.serialization=a;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const p=require("../../../api-
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const p=require("../../../api-GvmToTw0.cjs"),a=require("../../../logger-BsmHUUw1.cjs"),m=require("../../../nodes-DsL8kMSX.cjs");function h(n){let e=2166136261;for(let t=0;t<n.length;t++)e^=n.charCodeAt(t),e=Math.imul(e,16777619);return e>>>0}function w(n){return h(n)%100}function v(n,e){return e<=0?!1:e>=100?!0:n<e}function j(n){return typeof n!="object"||n===null||!("id"in n&&"name"in n&&"enabled"in n&&"weight"in n&&"version"in n)?!1:typeof n.id=="string"&&typeof n.name=="string"&&typeof n.enabled=="boolean"&&typeof n.weight=="number"&&typeof n.version=="number"}function y(n){return typeof n!="object"||n===null||!("features"in n)||!Array.isArray(n.features)?!1:n.features.every(j)}function C(n){return typeof n!="object"||n===null?!1:"id"in n&&"name"in n&&"nodes"in n&&"edges"in n&&typeof n.id=="string"&&typeof n.name=="string"&&Array.isArray(n.nodes)&&Array.isArray(n.edges)}function S(n,e){const t=new Set,o=[];for(const r of n){if(r.type!=="conditional")continue;const i=r.conditionId??r.conditionalId;if(!i||t.has(i))continue;t.add(i);const s=e.get(i);if(!s){a.logger("warn",`Condition with id '${i}' not found in project conditions`);continue}o.push({id:s.id,label:s.name,condition:s.condition})}return o}function c(n,e){if(e.conditions)for(const t of e.conditions)n.registerCondition(t)}function b(n,e,t){if(!C(e)){a.logger("warn",`Skipping invalid experience payload: ${JSON.stringify(e)}`);return}const o=e.componentName?n.components.listStore.getState().find(r=>r.name===e.componentName)?.component:void 0;n.registerExperience({id:e.id,key:e.key,name:e.name,targets:e.targets??[],steps:e.nodes.filter(r=>r.type==="step").map(r=>m.resolveStepKey(r)),nodes:e.nodes,edges:e.edges,conditions:S(e.nodes,t),actions:e.actions,condition:e.condition,initializeOpen:e.initializeOpen,component:o})}function f(n,e){if(e.fields)for(const t of e.fields)n.registerField(t)}function u(n,e){if(e.steps)for(const t of e.steps)n.registerStep(t)}function d(n,e){const t=new Map;if(e.conditions)for(const o of e.conditions)t.set(o.id,o);if(e.experiences)for(const o of e.experiences)b(n,o,t)}function P(n){const e=n.searchParams["preview-token"];if(e&&e.length>0)return e[0]}function k(n){const e=new Set,t=n.searchParams.feature;if(!t)return e;for(const o of t){const r=o.indexOf(":");r>0&&e.add(o.substring(0,r))}return e}function l(n,e,t){const o=k(n),r=n.session?.id;if(!r)throw new Error("Session ID is required for feature registration");const i=w(r);for(const s of e.features)o.has(s.id)||I(n,s,t,i)}function I(n,e,t,o){n.registerFeature(e.id,{key:`v${e.version}`,name:e.name,storage:t?"session":"local",decide:()=>e.enabled?v(o,e.weight):!1})}function E(){let n;try{n=__PICKED_PROJECT_CONFIG__}catch{return}if(n===void 0)return;let e;if(typeof n=="string")try{e=JSON.parse(n)}catch{a.logger("warn","Build-time project config is not valid JSON");return}else e=n;if(y(e))return e;a.logger("warn","Build-time project config has invalid shape, falling back to runtime fetch")}function F(n){try{const e=new URL(n).hostname;return e==="localhost"||e==="127.0.0.1"||e==="::1"}catch{return!1}}function O(n){if(typeof n!="object"||n===null||!("cause"in n))return!1;const{cause:e}=n;return typeof e!="object"||e===null||!("code"in e)?!1:e.code==="ECONNREFUSED"}async function g(n,e,t){const o=t?.previewToken?`projects/${e}?preview_token=${encodeURIComponent(t.previewToken)}`:`projects/${e}`;let r;try{r=await p.get(n,o,t?.headers)}catch(s){return F(n)&&O(s)||a.logger("warn","Failed to fetch project config",s),null}if(!r.ok)return a.logger("warn",`Project config request failed with status ${r.status.toString()}`),null;let i;try{i=await r.json()}catch{return a.logger("warn","Failed to parse project config response"),null}return y(i)?i:(a.logger("warn","Invalid project config response shape"),null)}function A(n){return{name:"dynamic-experiences",setup:e=>{const t=n?.apiUrl??e.apiUrl;return{onStart:async()=>{const o=P(e);if(o){const s=await g(t,e.projectId,{previewToken:o});s&&(l(e,s,!0),c(e,s),f(e,s),u(e,s),d(e,s));return}const r=n?.projectConfig??E();if(r){l(e,r,!1),c(e,r),f(e,r),u(e,r),d(e,r);return}const i=await g(t,e.projectId);i&&(l(e,i,!1),c(e,i),f(e,i),u(e,i),d(e,i))}}}}}exports.createClientHeaders=p.createClientHeaders;exports.dynamicExperiencesPlugin=A;exports.fetchProject=g;
|
package/dist/cjs/server/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("effector"),k=require("../../experience-instance-
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("effector"),k=require("../../experience-instance-CxiOyYPf.cjs");function S(){let c,i;return{promise:new Promise((t,o)=>{c=t,i=o}),resolve:t=>c(t),reject:t=>i(t)}}function C(c,i){const{promise:E,resolve:t}=S(),o=r.createEvent(),s=r.createEvent(),l=r.createEvent(),x=r.createEvent(),p=r.createEvent(),f=c.experiences.listStore.map(e=>e.map(n=>k.createExperienceInstance({client:c,experience:n}))),a=r.createStore({currentExperienceIndex:0,renderedExperiences:[],isComplete:!1}),u=r.createEffect(async({experience:e,availableRenderers:n,startRendererIndex:v=0})=>{if(!e)return null;for(let d=v;d<n.length;d++){const g=n[d],m=e.componentStore.getState();if(m&&g?.isValidComponent(m.component))return{rendered:await g.render(m.component,c,e),rendererIndex:d}}return null});a.on(l,(e,n)=>({...e,renderedExperiences:[...e.renderedExperiences,n],currentExperienceIndex:e.currentExperienceIndex+1})).on(p,e=>({...e,currentExperienceIndex:e.currentExperienceIndex+1})).on(x,e=>({...e,isComplete:!0})).reset(o),r.sample({clock:o,target:s}),r.sample({clock:s,source:{experiences:f,state:a},filter:({experiences:e,state:n})=>n.currentExperienceIndex<e.length&&!n.isComplete,fn:({experiences:e,state:n})=>({experience:e[n.currentExperienceIndex],availableRenderers:i,startRendererIndex:0}),target:u}),r.sample({clock:u.doneData,filter:e=>e!==null,fn:e=>e.rendered.body,target:l}),r.sample({clock:l,target:s}),r.sample({clock:u.doneData,filter:e=>e===null,target:p}),r.sample({clock:p,target:s}),r.sample({clock:[s,p,l],source:{experiences:f,state:a},filter:({experiences:e,state:n})=>n.currentExperienceIndex>=e.length,target:x});const I=r.attach({source:a,effect:e=>{e.isComplete&&t(e.renderedExperiences)}});return r.sample({clock:x,target:I}),o(),E}exports.render=C;
|
package/dist/esm/index.js
CHANGED
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
import { createDomain as j, createApi as w, attach as V, combine as A, createStore as L, createEffect as C, sample as v, createEvent as D } from "effector";
|
|
2
2
|
import { createFactory as k, invoke as b } from "@withease/factories";
|
|
3
|
-
import { g as Z, t as ne, c as se, i as ie, e as _, a as oe,
|
|
4
|
-
import {
|
|
3
|
+
import { g as Z, t as ne, c as se, i as ie, e as _, a as oe, d as ae } from "../experience-instance-DCknHRkX.js";
|
|
4
|
+
import { b as Gt } from "../experience-instance-DCknHRkX.js";
|
|
5
5
|
import { l as F } from "../logger-C9a75KZn.js";
|
|
6
6
|
import { c as z, l as R, s as M } from "../storage-Co_LbKr_.js";
|
|
7
|
-
import { a as
|
|
8
|
-
import { p as
|
|
7
|
+
import { a as qt } from "../storage-Co_LbKr_.js";
|
|
8
|
+
import { p as ce, g as ue } from "../api-GlH9T8_1.js";
|
|
9
|
+
import { i as de } from "../nodes-DQt4TfuO.js";
|
|
9
10
|
import { g as le } from "../id-BW-g3y32.js";
|
|
10
11
|
import { i as fe } from "../object-JwZ58NOH.js";
|
|
11
12
|
import { s as H, a as G, b as pe, c as ge, d as me } from "../supports-8YT4QKI7.js";
|
|
12
|
-
import { e as
|
|
13
|
+
import { e as Wt, f as Yt, g as Qt, h as Xt, i as Zt, j as er, k as tr } from "../supports-8YT4QKI7.js";
|
|
13
14
|
const U = j("experience"), ye = k(
|
|
14
15
|
({ client: t, experience: e }) => {
|
|
15
16
|
const r = U.store(e), n = w(r, {
|
|
@@ -234,7 +235,7 @@ const Be = (t, e) => {
|
|
|
234
235
|
path: window.location.pathname
|
|
235
236
|
}, u = {}, o = document.getElementById("picked_script")?.dataset.verceltoken;
|
|
236
237
|
o && (u["x-vercel-protection-bypass"] = o);
|
|
237
|
-
const p = (await
|
|
238
|
+
const p = (await ce(t.apiUrl, "ping", i, u)).ok;
|
|
238
239
|
return p && r.set(e), p;
|
|
239
240
|
} catch (e) {
|
|
240
241
|
return F("error", e), !1;
|
|
@@ -491,7 +492,7 @@ const Te = k(() => {
|
|
|
491
492
|
const l = { lastStepIndex: -1, secondLastStepIndex: -1 };
|
|
492
493
|
for (let p = s.length - 1; p >= 0; p--) {
|
|
493
494
|
const f = s[p], h = f?.node;
|
|
494
|
-
if (!(!h || !
|
|
495
|
+
if (!(!h || !de(h)) && !(o && f?.experienceId !== o))
|
|
495
496
|
if (l.lastStepIndex === -1)
|
|
496
497
|
l.lastStepIndex = p;
|
|
497
498
|
else {
|
|
@@ -1095,7 +1096,7 @@ class At {
|
|
|
1095
1096
|
searchParams = mt();
|
|
1096
1097
|
history = Le();
|
|
1097
1098
|
components = Ee({ client: this });
|
|
1098
|
-
experienceInstances =
|
|
1099
|
+
experienceInstances = oe({ client: this });
|
|
1099
1100
|
experiences = ke({ client: this });
|
|
1100
1101
|
frameworks = Ae({ client: this });
|
|
1101
1102
|
predicates = Me({ client: this });
|
|
@@ -1108,7 +1109,7 @@ class At {
|
|
|
1108
1109
|
constructor(e) {
|
|
1109
1110
|
F("info", "Picked client initializing."), this.events = He(this.eventBus);
|
|
1110
1111
|
const { organizationId: r, projectId: n } = vt(e);
|
|
1111
|
-
this.organizationId = r, this.projectId = n, this.options = Object.freeze(e), this.apiUrl = e.apiUrl || gt(), this.dashboardUrl = e.dashboardUrl ?? "https://dashboard.picked.app", this.documentationSiteUrl = e.documentationSiteUrl ?? "https://docs.picked.app", this.session = kt(), this.setupPlugins(), this.setupFeatures(), this.setupPredicates(), this.setupActions(), this.setupComponents(), this.precondition = e.precondition, this.condition = e.condition, this.eventBus({ type: "load", version:
|
|
1112
|
+
this.organizationId = r, this.projectId = n, this.options = Object.freeze(e), this.apiUrl = e.apiUrl || gt(), this.dashboardUrl = e.dashboardUrl ?? "https://dashboard.picked.app", this.documentationSiteUrl = e.documentationSiteUrl ?? "https://docs.picked.app", this.session = kt(), this.setupPlugins(), this.setupFeatures(), this.setupPredicates(), this.setupActions(), this.setupComponents(), this.precondition = e.precondition, this.condition = e.condition, this.eventBus({ type: "load", version: ue() }), F("info", "Picked client initialized.");
|
|
1112
1113
|
}
|
|
1113
1114
|
start = () => {
|
|
1114
1115
|
Ce(this), (async () => {
|
|
@@ -1124,7 +1125,7 @@ class At {
|
|
|
1124
1125
|
const u = n;
|
|
1125
1126
|
this.session.setIsUser(u), this.eventBus({ type: "user_decide", value: u });
|
|
1126
1127
|
}
|
|
1127
|
-
if (this.eventBus({ type: "initialize" }), i && K(this), await
|
|
1128
|
+
if (this.eventBus({ type: "initialize" }), i && K(this), await ae(), i && K(this), this.eventBus({ type: "ready" }), this.isReady = !0, this.session) {
|
|
1128
1129
|
const { id: u, isUser: s, identifiers: o } = this.session;
|
|
1129
1130
|
this.eventBus({ type: "session", id: u, isUser: s, identifiers: o });
|
|
1130
1131
|
}
|
|
@@ -1294,40 +1295,40 @@ class At {
|
|
|
1294
1295
|
});
|
|
1295
1296
|
};
|
|
1296
1297
|
}
|
|
1297
|
-
function
|
|
1298
|
+
function Nt(t) {
|
|
1298
1299
|
return {
|
|
1299
1300
|
$$type: "lazy-component",
|
|
1300
1301
|
load: t
|
|
1301
1302
|
};
|
|
1302
1303
|
}
|
|
1303
|
-
function
|
|
1304
|
+
function Tt(t) {
|
|
1304
1305
|
return typeof t == "object" && t !== null && "$$type" in t && t.$$type === "lazy-component";
|
|
1305
1306
|
}
|
|
1306
|
-
const
|
|
1307
|
+
const Lt = (t) => {
|
|
1307
1308
|
const e = new At(t);
|
|
1308
1309
|
return me(e), e;
|
|
1309
1310
|
};
|
|
1310
1311
|
export {
|
|
1311
1312
|
At as Picked,
|
|
1312
|
-
|
|
1313
|
+
Lt as createClient,
|
|
1313
1314
|
z as createStorageKey,
|
|
1314
1315
|
_ as evaluateRuleLogic,
|
|
1315
1316
|
bt as getPickedConfig,
|
|
1316
|
-
|
|
1317
|
-
|
|
1318
|
-
|
|
1317
|
+
Tt as isLazyLoader,
|
|
1318
|
+
Gt as isPickedRoot,
|
|
1319
|
+
Nt as lazyComponent,
|
|
1319
1320
|
R as localStore,
|
|
1320
1321
|
M as sessionStore,
|
|
1321
|
-
|
|
1322
|
-
|
|
1322
|
+
qt as subscribe,
|
|
1323
|
+
Wt as supportsCookies,
|
|
1323
1324
|
ge as supportsCryptoRandomUUID,
|
|
1324
1325
|
H as supportsDocument,
|
|
1325
|
-
|
|
1326
|
-
|
|
1326
|
+
Yt as supportsHistory,
|
|
1327
|
+
Qt as supportsIntersectionObserver,
|
|
1327
1328
|
pe as supportsLocalStorage,
|
|
1328
|
-
|
|
1329
|
-
|
|
1330
|
-
|
|
1331
|
-
|
|
1329
|
+
Xt as supportsLocation,
|
|
1330
|
+
Zt as supportsSessionStorage,
|
|
1331
|
+
er as supportsShadowRoot,
|
|
1332
|
+
tr as supportsWebComponents,
|
|
1332
1333
|
G as supportsWindow
|
|
1333
1334
|
};
|
|
@@ -1,44 +1,45 @@
|
|
|
1
|
-
import { a as m } from "../../../api-
|
|
2
|
-
import { c as
|
|
1
|
+
import { a as m } from "../../../api-GlH9T8_1.js";
|
|
2
|
+
import { c as U } from "../../../api-GlH9T8_1.js";
|
|
3
3
|
import { l as a } from "../../../logger-C9a75KZn.js";
|
|
4
|
-
|
|
4
|
+
import { r as y } from "../../../nodes-DQt4TfuO.js";
|
|
5
|
+
function h(n) {
|
|
5
6
|
let e = 2166136261;
|
|
6
7
|
for (let t = 0; t < n.length; t++)
|
|
7
8
|
e ^= n.charCodeAt(t), e = Math.imul(e, 16777619);
|
|
8
9
|
return e >>> 0;
|
|
9
10
|
}
|
|
10
|
-
function
|
|
11
|
-
return
|
|
11
|
+
function w(n) {
|
|
12
|
+
return h(n) % 100;
|
|
12
13
|
}
|
|
13
|
-
function
|
|
14
|
+
function v(n, e) {
|
|
14
15
|
return e <= 0 ? !1 : e >= 100 ? !0 : n < e;
|
|
15
16
|
}
|
|
16
|
-
function
|
|
17
|
+
function j(n) {
|
|
17
18
|
return typeof n != "object" || n === null || !("id" in n && "name" in n && "enabled" in n && "weight" in n && "version" in n) ? !1 : typeof n.id == "string" && typeof n.name == "string" && typeof n.enabled == "boolean" && typeof n.weight == "number" && typeof n.version == "number";
|
|
18
19
|
}
|
|
19
20
|
function g(n) {
|
|
20
|
-
return typeof n != "object" || n === null || !("features" in n) || !Array.isArray(n.features) ? !1 : n.features.every(
|
|
21
|
+
return typeof n != "object" || n === null || !("features" in n) || !Array.isArray(n.features) ? !1 : n.features.every(j);
|
|
21
22
|
}
|
|
22
|
-
function
|
|
23
|
+
function C(n) {
|
|
23
24
|
return typeof n != "object" || n === null ? !1 : "id" in n && "name" in n && "nodes" in n && "edges" in n && typeof n.id == "string" && typeof n.name == "string" && Array.isArray(n.nodes) && Array.isArray(n.edges);
|
|
24
25
|
}
|
|
25
|
-
function
|
|
26
|
-
const t = /* @__PURE__ */ new Set(),
|
|
26
|
+
function S(n, e) {
|
|
27
|
+
const t = /* @__PURE__ */ new Set(), r = [];
|
|
27
28
|
for (const o of n) {
|
|
28
29
|
if (o.type !== "conditional")
|
|
29
30
|
continue;
|
|
30
|
-
const
|
|
31
|
-
if (!
|
|
31
|
+
const i = o.conditionId ?? o.conditionalId;
|
|
32
|
+
if (!i || t.has(i))
|
|
32
33
|
continue;
|
|
33
|
-
t.add(
|
|
34
|
-
const s = e.get(
|
|
34
|
+
t.add(i);
|
|
35
|
+
const s = e.get(i);
|
|
35
36
|
if (!s) {
|
|
36
|
-
a("warn", `Condition with id '${
|
|
37
|
+
a("warn", `Condition with id '${i}' not found in project conditions`);
|
|
37
38
|
continue;
|
|
38
39
|
}
|
|
39
|
-
|
|
40
|
+
r.push({ id: s.id, label: s.name, condition: s.condition });
|
|
40
41
|
}
|
|
41
|
-
return
|
|
42
|
+
return r;
|
|
42
43
|
}
|
|
43
44
|
function c(n, e) {
|
|
44
45
|
if (e.conditions)
|
|
@@ -46,24 +47,24 @@ function c(n, e) {
|
|
|
46
47
|
n.registerCondition(t);
|
|
47
48
|
}
|
|
48
49
|
function b(n, e, t) {
|
|
49
|
-
if (!
|
|
50
|
+
if (!C(e)) {
|
|
50
51
|
a("warn", `Skipping invalid experience payload: ${JSON.stringify(e)}`);
|
|
51
52
|
return;
|
|
52
53
|
}
|
|
53
|
-
const
|
|
54
|
+
const r = e.componentName ? n.components.listStore.getState().find((o) => o.name === e.componentName)?.component : void 0;
|
|
54
55
|
n.registerExperience({
|
|
55
56
|
id: e.id,
|
|
56
57
|
key: e.key,
|
|
57
58
|
name: e.name,
|
|
58
59
|
targets: e.targets ?? [],
|
|
59
|
-
steps: e.nodes.filter((o) => o.type === "step").map((o) => o
|
|
60
|
+
steps: e.nodes.filter((o) => o.type === "step").map((o) => y(o)),
|
|
60
61
|
nodes: e.nodes,
|
|
61
62
|
edges: e.edges,
|
|
62
|
-
conditions:
|
|
63
|
+
conditions: S(e.nodes, t),
|
|
63
64
|
actions: e.actions,
|
|
64
65
|
condition: e.condition,
|
|
65
66
|
initializeOpen: e.initializeOpen,
|
|
66
|
-
component:
|
|
67
|
+
component: r
|
|
67
68
|
});
|
|
68
69
|
}
|
|
69
70
|
function f(n, e) {
|
|
@@ -79,44 +80,44 @@ function u(n, e) {
|
|
|
79
80
|
function d(n, e) {
|
|
80
81
|
const t = /* @__PURE__ */ new Map();
|
|
81
82
|
if (e.conditions)
|
|
82
|
-
for (const
|
|
83
|
-
t.set(
|
|
83
|
+
for (const r of e.conditions)
|
|
84
|
+
t.set(r.id, r);
|
|
84
85
|
if (e.experiences)
|
|
85
|
-
for (const
|
|
86
|
-
b(n,
|
|
86
|
+
for (const r of e.experiences)
|
|
87
|
+
b(n, r, t);
|
|
87
88
|
}
|
|
88
|
-
function
|
|
89
|
+
function k(n) {
|
|
89
90
|
const e = n.searchParams["preview-token"];
|
|
90
91
|
if (e && e.length > 0)
|
|
91
92
|
return e[0];
|
|
92
93
|
}
|
|
93
|
-
function
|
|
94
|
+
function I(n) {
|
|
94
95
|
const e = /* @__PURE__ */ new Set(), t = n.searchParams.feature;
|
|
95
96
|
if (!t)
|
|
96
97
|
return e;
|
|
97
|
-
for (const
|
|
98
|
-
const o =
|
|
99
|
-
o > 0 && e.add(
|
|
98
|
+
for (const r of t) {
|
|
99
|
+
const o = r.indexOf(":");
|
|
100
|
+
o > 0 && e.add(r.substring(0, o));
|
|
100
101
|
}
|
|
101
102
|
return e;
|
|
102
103
|
}
|
|
103
104
|
function l(n, e, t) {
|
|
104
|
-
const
|
|
105
|
+
const r = I(n), o = n.session?.id;
|
|
105
106
|
if (!o)
|
|
106
107
|
throw new Error("Session ID is required for feature registration");
|
|
107
|
-
const
|
|
108
|
+
const i = w(o);
|
|
108
109
|
for (const s of e.features)
|
|
109
|
-
|
|
110
|
+
r.has(s.id) || P(n, s, t, i);
|
|
110
111
|
}
|
|
111
|
-
function
|
|
112
|
+
function P(n, e, t, r) {
|
|
112
113
|
n.registerFeature(e.id, {
|
|
113
114
|
key: `v${e.version}`,
|
|
114
115
|
name: e.name,
|
|
115
116
|
storage: t ? "session" : "local",
|
|
116
|
-
decide: () => e.enabled ?
|
|
117
|
+
decide: () => e.enabled ? v(r, e.weight) : !1
|
|
117
118
|
});
|
|
118
119
|
}
|
|
119
|
-
function
|
|
120
|
+
function F() {
|
|
120
121
|
let n;
|
|
121
122
|
try {
|
|
122
123
|
n = __PICKED_PROJECT_CONFIG__;
|
|
@@ -139,7 +140,7 @@ function P() {
|
|
|
139
140
|
return e;
|
|
140
141
|
a("warn", "Build-time project config has invalid shape, falling back to runtime fetch");
|
|
141
142
|
}
|
|
142
|
-
function
|
|
143
|
+
function E(n) {
|
|
143
144
|
try {
|
|
144
145
|
const e = new URL(n).hostname;
|
|
145
146
|
return e === "localhost" || e === "127.0.0.1" || e === "::1";
|
|
@@ -147,57 +148,57 @@ function F(n) {
|
|
|
147
148
|
return !1;
|
|
148
149
|
}
|
|
149
150
|
}
|
|
150
|
-
function
|
|
151
|
+
function O(n) {
|
|
151
152
|
if (typeof n != "object" || n === null || !("cause" in n))
|
|
152
153
|
return !1;
|
|
153
154
|
const { cause: e } = n;
|
|
154
155
|
return typeof e != "object" || e === null || !("code" in e) ? !1 : e.code === "ECONNREFUSED";
|
|
155
156
|
}
|
|
156
157
|
async function p(n, e, t) {
|
|
157
|
-
const
|
|
158
|
+
const r = t?.previewToken ? `projects/${e}?preview_token=${encodeURIComponent(t.previewToken)}` : `projects/${e}`;
|
|
158
159
|
let o;
|
|
159
160
|
try {
|
|
160
|
-
o = await m(n,
|
|
161
|
+
o = await m(n, r, t?.headers);
|
|
161
162
|
} catch (s) {
|
|
162
|
-
return
|
|
163
|
+
return E(n) && O(s) || a("warn", "Failed to fetch project config", s), null;
|
|
163
164
|
}
|
|
164
165
|
if (!o.ok)
|
|
165
166
|
return a("warn", `Project config request failed with status ${o.status.toString()}`), null;
|
|
166
|
-
let
|
|
167
|
+
let i;
|
|
167
168
|
try {
|
|
168
|
-
|
|
169
|
+
i = await o.json();
|
|
169
170
|
} catch {
|
|
170
171
|
return a("warn", "Failed to parse project config response"), null;
|
|
171
172
|
}
|
|
172
|
-
return g(
|
|
173
|
+
return g(i) ? i : (a("warn", "Invalid project config response shape"), null);
|
|
173
174
|
}
|
|
174
|
-
function
|
|
175
|
+
function T(n) {
|
|
175
176
|
return {
|
|
176
177
|
name: "dynamic-experiences",
|
|
177
178
|
setup: (e) => {
|
|
178
179
|
const t = n?.apiUrl ?? e.apiUrl;
|
|
179
180
|
return {
|
|
180
181
|
onStart: async () => {
|
|
181
|
-
const
|
|
182
|
-
if (
|
|
183
|
-
const s = await p(t, e.projectId, { previewToken:
|
|
182
|
+
const r = k(e);
|
|
183
|
+
if (r) {
|
|
184
|
+
const s = await p(t, e.projectId, { previewToken: r });
|
|
184
185
|
s && (l(e, s, !0), c(e, s), f(e, s), u(e, s), d(e, s));
|
|
185
186
|
return;
|
|
186
187
|
}
|
|
187
|
-
const o = n?.projectConfig ??
|
|
188
|
+
const o = n?.projectConfig ?? F();
|
|
188
189
|
if (o) {
|
|
189
190
|
l(e, o, !1), c(e, o), f(e, o), u(e, o), d(e, o);
|
|
190
191
|
return;
|
|
191
192
|
}
|
|
192
|
-
const
|
|
193
|
-
|
|
193
|
+
const i = await p(t, e.projectId);
|
|
194
|
+
i && (l(e, i, !1), c(e, i), f(e, i), u(e, i), d(e, i));
|
|
194
195
|
}
|
|
195
196
|
};
|
|
196
197
|
}
|
|
197
198
|
};
|
|
198
199
|
}
|
|
199
200
|
export {
|
|
200
|
-
|
|
201
|
-
|
|
201
|
+
U as createClientHeaders,
|
|
202
|
+
T as dynamicExperiencesPlugin,
|
|
202
203
|
p as fetchProject
|
|
203
204
|
};
|