@picked/client 0.0.1-dev.1770849584797 → 0.0.1-dev.1771901344537

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 (34) hide show
  1. package/dist/api-CbXfbi_s.js +19 -0
  2. package/dist/api-DzSCgBQ2.cjs +1 -0
  3. package/dist/cjs/index.js +2 -2
  4. package/dist/cjs/plugins/create-experience/index.js +1 -1
  5. package/dist/cjs/plugins/dynamic-experiences/index.js +1 -0
  6. package/dist/esm/index.js +450 -477
  7. package/dist/esm/plugins/create-experience/index.js +295 -298
  8. package/dist/esm/plugins/dynamic-experiences/index.js +102 -0
  9. package/dist/types/client.d.ts +10 -0
  10. package/dist/types/client.d.ts.map +1 -1
  11. package/dist/types/entities/field/field.d.ts +9 -30
  12. package/dist/types/entities/field/field.d.ts.map +1 -1
  13. package/dist/types/entities/plugin/plugin.d.ts +4 -1
  14. package/dist/types/entities/plugin/plugin.d.ts.map +1 -1
  15. package/dist/types/picked.d.ts +8 -3
  16. package/dist/types/picked.d.ts.map +1 -1
  17. package/dist/types/ping.d.ts.map +1 -1
  18. package/dist/types/plugins/create-experience/create-experience.d.ts +19 -14
  19. package/dist/types/plugins/create-experience/create-experience.d.ts.map +1 -1
  20. package/dist/types/plugins/create-experience/plugin.d.ts.map +1 -1
  21. package/dist/types/plugins/dynamic-experiences/hash.d.ts +12 -0
  22. package/dist/types/plugins/dynamic-experiences/hash.d.ts.map +1 -0
  23. package/dist/types/plugins/dynamic-experiences/index.d.ts +3 -0
  24. package/dist/types/plugins/dynamic-experiences/index.d.ts.map +1 -0
  25. package/dist/types/plugins/dynamic-experiences/plugin.d.ts +23 -0
  26. package/dist/types/plugins/dynamic-experiences/plugin.d.ts.map +1 -0
  27. package/dist/types/plugins/dynamic-experiences/types.d.ts +15 -0
  28. package/dist/types/plugins/dynamic-experiences/types.d.ts.map +1 -0
  29. package/dist/types/utils/api.d.ts +3 -0
  30. package/dist/types/utils/api.d.ts.map +1 -0
  31. package/dist/types/utils/events.d.ts +10 -4
  32. package/dist/types/utils/events.d.ts.map +1 -1
  33. package/dist/types/utils/get-step-fields.d.ts.map +1 -1
  34. package/package.json +18 -1
@@ -0,0 +1,19 @@
1
+ function o(t, n) {
2
+ return new URL(`/api/v1/${n}`, t).toString();
3
+ }
4
+ async function s(t, n) {
5
+ const e = o(t, n);
6
+ return fetch(e);
7
+ }
8
+ async function i(t, n, e, r) {
9
+ const c = o(t, n);
10
+ return fetch(c, {
11
+ method: "POST",
12
+ headers: { "Content-Type": "application/json", ...r },
13
+ body: JSON.stringify(e)
14
+ });
15
+ }
16
+ export {
17
+ s as g,
18
+ i as p
19
+ };
@@ -0,0 +1 @@
1
+ "use strict";function o(t,n){return new URL(`/api/v1/${n}`,t).toString()}async function s(t,n){const e=o(t,n);return fetch(e)}async function i(t,n,e,r){const c=o(t,n);return fetch(c,{method:"POST",headers:{"Content-Type":"application/json",...r},body:JSON.stringify(e)})}exports.get=s;exports.post=i;
package/dist/cjs/index.js CHANGED
@@ -1,4 +1,4 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const m=require("effector"),S=require("@withease/factories"),b=require("../experience-instance-D8RtqKEZ.cjs"),E=require("../logger-BsmHUUw1.cjs"),w=require("../storage-Be5xWNPC.cjs"),K=require("../id-BKIWbSTy.cjs"),J=require("../object-BbFTsGh3.cjs"),k=require("../supports-YvpQZxbh.cjs"),V=m.createDomain("experience"),W=S.createFactory(({client:t,experience:e})=>{const r=V.store(e),s=m.createApi(r,{merge(p,h){return{...p,...h.experience}}}),i=r.map(p=>({name:p.name,decisionLogic:p.condition??p.decide,targetSelectors:p.targets,initializeOpenLogic:e.initializeOpen})),d=t.components.listStore.map(p=>p.find(h=>h.name===`experience:${e.id}`)||p.find(h=>h.name==="experience"),{skipVoid:!1}),o=r.map(p=>({steps:p.steps,nodes:p.nodes,edges:p.edges,conditionals:p.conditionals})),a=r.map(p=>p.fields),g=e.actions??[];return{id:e.id,configStore:i,treeStore:o,fieldsStore:a,componentStore:d,actions:g,merge:s.merge}});function H(t){return S.invoke(W,t)}const G=S.createFactory(({client:t})=>{const e=V.store({}),r=m.createApi(e,{register(o,a){return{...o,[a.id]:a}}});function s(o){const a=e.getState()[o.id];if(a){a.merge({experience:o,strategy:"override"});return}const g=H({client:t,experience:o});r.register(g)}const i=e.map(o=>Object.values(o));function d(o){return e.map(a=>a[o],{skipVoid:!1})}return{register:s,getById:d,listStore:i}});function Y(t){return S.invoke(G,t)}const Q=(t,e)=>{e.register(t)},T=(t,e)=>{const{targetSelectors:r}=e.configStore.getState(),s=b.getTargetElements(r,e.id);s.forEach(({elements:d})=>d.forEach(o=>b.tagTargetElement(o,e.id))),b.createAppHosts(s,e.id).forEach(d=>{t.experienceInstances.spawn(e,d)})},C=async t=>{await Promise.all(t.experiences.listStore.getState().map(async e=>{await X(t,e)&&T(t,e)}))},X=async(t,e)=>{const{decisionLogic:r,targetSelectors:s}=e.configStore.getState();return b.getTargetElements(s,e.id).length<1||s.length===0?!1:r&&b.isRulesLogic(r)?await b.evaluateRuleLogic(t,r)===!0:!0},Z=(t,e,r)=>{const s=e.name,i=e.setup(t);if(i){const d=r[s]??{};r[s]=Object.freeze({...d,...i})}},ee=m.createDomain("component"),te=S.createFactory(({client:t,component:e,name:r})=>{const s=t.frameworks.getByName(e.frameworkName);return{name:r,component:e,frameworkStore:s}});function re(t){return S.invoke(te,t)}const se=S.createFactory(({client:t})=>{const e=ee.store({}),r=m.createApi(e,{register(o,a){return{...o,[a.name]:a}}});function s(o,a){e.getState()[o]&&E.logger("warn",`Component '${o}' already registered. Registering again will override the previous registration.`);const p=re({client:t,name:o,component:a});r.register(p)}const i=e.map(o=>Object.values(o));function d(o){return e.map(a=>a[o],{skipVoid:!1})}return{register:s,getByName:d,listStore:i}});function ne(t){return S.invoke(se,t)}const $=(t,e,r)=>{r.register(t,e)},ie=m.createDomain("framework"),oe=S.createFactory(({client:t})=>{const e=ie.store({}),r=m.createApi(e,{register(o,a){return{...o,[a.name]:a.framework}}});function s(o,a){e.getState()[o]&&E.logger("warn",`Framework '${o}' already registered. Registering again will override the previous registration.`),r.register({name:o,framework:a})}const i=e.map(o=>Object.values(o));function d(o){return e.map(a=>a[o],{skipVoid:!1})}return{register:s,getByName:d,listStore:i}});function ae(t){return S.invoke(oe,t)}const ce=(t,e)=>{e.register(t.name,t)},ue=6e3,le=w.createStorageKey("last_ping","global"),de=t=>`${t}/api/v1/ping`,pe=async t=>{try{const e=Date.now(),r=w.localStore.get(le);let s=0;if(r.isSet()&&(s=r.json()??0),s&&e-s<ue)return!0;const i=de(t.apiUrl),d={projectId:t.projectId,path:window.location.pathname},o=JSON.stringify(d),a={"Content-Type":"application/json"},p=document.getElementById("picked_script")?.dataset.verceltoken;p&&(a["x-vercel-protection-bypass"]=p);const F=(await fetch(i,{method:"POST",headers:a,body:o})).ok;return F&&r.set(e),F}catch(e){return E.logger("error",e),!1}};function U(t){const e=typeof window<"u",r={client:t,responses:t.responses.listStore.getState(),fields:t.fields.listStore.getState(),location:e?window.location:void 0,document:e?window.document:void 0,sessionStorage:e?window.sessionStorage:void 0,localStorage:e?window.localStorage:void 0};return Object.freeze(r)}const fe=m.createDomain("predicate"),ge=S.createFactory(({client:t})=>{const e=fe.store({}),r=m.createApi(e,{register(a,g){return{...a,[g.name]:{name:g.name,predicate:g.predicate}}}});function s(a,g){e.getState()[a]&&E.logger("warn",`Predicate '${a}' already registered. Registering again will override the previous registration.`),r.register(Object.freeze({name:a,predicate:g}))}const i=e.map(a=>Object.values(a));function d(a){return e.map(g=>g[a]?.predicate,{skipVoid:!1})}function o(a){const g=m.createStore(()=>{},{skipVoid:!1}),p=m.createEffect(async()=>{const h=d(a).getState();if(!h)return;const F=U(t);return(...l)=>h({...F,args:l})});return m.sample({source:{responses:t.responses.listStore,fields:t.fields.listStore},target:p}),m.sample({clock:p.doneData,filter:h=>h!==void 0,target:g}),p(),g}return{register:s,getByName:d,listStore:i,getEvokablePredicate:o}});function me(t){return S.invoke(ge,t)}const ye=(t,e,r)=>{r.register(t,e)},O=m.createDomain("feature"),he=S.createFactory(({client:t})=>{const e=O.store({}),r=O.store([]),s=m.createApi(e,{register(n,c){return{...n,[c.id]:c.feature}}});function i(n,c){e.getState()[n]&&E.logger("warn",`Feature '${n}' already registered. Registering again will override the previous registration.`);const u={id:n,feature:{...c,id:n}};s.register(Object.freeze({id:n,feature:u}))}const d=m.createEffect(async({id:n,key:c,storage:f="local"})=>{const u=w.createStorageKey(`feature:${n}:${c}`,"global"),v=(f==="session"?w.sessionStore:w.localStore).get(u).boolean();return v===null?null:{id:n,key:c,bucket:v,storage:f}}),o=m.createEffect(n=>{if(!n)return null;const c=w.createStorageKey(`feature:${n.id}:${n.key}`,"global");(n.storage==="session"?w.sessionStore:w.localStore).set(c,n.bucket)}),a=new Map,g=m.attach({source:{allFeaturesStore:e,resolvedFeaturesStore:r},effect:async({allFeaturesStore:n,resolvedFeaturesStore:c},{id:f,decide:u,key:y})=>{const v=c.find(P=>P.id===f&&P.key===y);if(v)return v;const j=n[f];if(!j)throw new Error(`Feature with id '${f}' not found`);const A=a.get(`${f}:${y}`);if(A!==void 0){const P=await A;return{id:j.id,bucket:P,key:y,storage:j.feature.storage}}const I=u();a.set(`${f}:${y}`,I);const q=await I;return{id:j.id,bucket:q,key:y,storage:j.feature.storage}}});m.sample({clock:s.register,fn:n=>{const{id:c,feature:f}=n;return{id:c,key:f.feature.key,storage:f.feature.storage}},target:d}),m.sample({source:e,clock:g.doneData,fn:(n,c)=>{const{id:f,bucket:u,storage:y}=c,v=n[f]?.feature.key;return v?{key:v,id:f,bucket:u,storage:y}:null},target:o});const p=m.combine({allFeaturesStore:e,resolvedFeaturesStore:r}).map(({allFeaturesStore:n,resolvedFeaturesStore:c})=>Object.values(n).map(f=>{const u=c.find(y=>y.id===f.id&&y.key===f.feature.key);return u?{id:f.id,name:f.feature.name,key:f.feature.key,getBucket:()=>({id:f.id,bucket:u.bucket}),isResolved:!0}:{id:f.id,name:f.feature.name,key:f.feature.key,getBucket:async()=>await g(f.feature),isResolved:!1}}));m.sample({clock:g.doneData,source:{resolvedFeatures:r},filter:({resolvedFeatures:n},{id:c,key:f})=>!n.some(y=>y.id===c&&y.key===f),fn:(n,c)=>c,target:t.eventBus.prepend(n=>({type:"feature_decide",feature:n}))}),m.sample({clock:[d.doneData,g.doneData],source:r,fn:(n,c)=>!c||n.some(u=>u.id===c.id&&u.key===c.key)?n:[...n,c],target:r});function h(n){return p.map(c=>c.find(f=>f.id===n))}function F(n){return e.map(c=>c[n],{skipVoid:!1})}function l(n){const c=m.createStore(async()=>{},{skipVoid:!1}),f=m.createEffect(async()=>{const u=h(n).getState();if(u)return async()=>(await u.getBucket()).bucket});return m.sample({source:r,filter:u=>u.some(y=>y.id===n),target:f}),m.sample({clock:f.doneData,filter:u=>u!==void 0,target:c}),f(),c}return{register:i,getById:h,getByName:F,listStore:p,getEvokableFeature:l}});function Se(t){return S.invoke(he,t)}const ve=(t,e,r)=>{r.register(t,e)},x=m.createDomain("history");function z(t,e){return{id:K.generateId(`history-entry-${Date.now()}-${Math.random()}}`),node:e,at:Date.now(),experienceId:t}}const ke=S.createFactory(()=>{const t=x.store({entries:[]}),e=x.event(),r=x.event(),s=x.event(),i=x.event();t.on(e,(o,a)=>({entries:[...o.entries,z(a.experienceId,a.node)]})),t.on(r,(o,a)=>({entries:[...o.entries.slice(0,-1),z(a.experienceId,a.node)]})),t.on(i,(o,a)=>a);function d(o,a){const g={lastStepIndex:-1,secondLastStepIndex:-1};for(let p=o.length-1;p>=0;p--){const h=o[p],F=h?.node;if(!(!F||!b.isStepNode(F))&&!(a&&h?.experienceId!==a))if(g.lastStepIndex===-1)g.lastStepIndex=p;else{g.secondLastStepIndex=p;break}}return g}return t.on(s,(o,a)=>{const{secondLastStepIndex:g}=d(o.entries,a.experienceId),p=g!==-1?o.entries.slice(0,g+1):o.entries;return{...o,entries:p}}),{push:e,replace:r,back:s,restore:i,entriesStore:t.map(o=>o.entries)}});function we(){return S.invoke(ke)}const be=()=>m.createEvent(),B=m.createDomain("field"),Fe=S.createFactory(({client:t})=>{const e=B.store({}),r=m.createApi(e,{register(l,n){return{...l,[n.field.id]:n.field}}});function s(l){r.register({field:l})}function i(l,n){const c=o(l).getState();if(!c)return;const f=Object.assign({},c,{...n});r.register({field:{...f}})}const d=e.map(l=>Object.values(l));function o(l){return e.map(n=>n[l]||null)}function a(l){return e.map(n=>Object.values(n).find(c=>c.name===l)||null)}const g=B.store({}),p=B.effect(async l=>{const n=o(l).getState();if(!n||n.options==null)return{fieldId:l,options:null};if(typeof n.options!="function")return{fieldId:l,options:n.options};if(!t)return{fieldId:l,options:null};const c=t.responses.listStore.getState(),f={};for(const y of c)y.value!==void 0&&(f[y.fieldId]=y.value);const u=await Promise.resolve(n.options({responses:f}));return{fieldId:l,options:u}});g.on(p,(l,n)=>({...l,[n]:{status:"loading",options:null}})),g.on(p.doneData,(l,{fieldId:n,options:c})=>({...l,[n]:{status:"resolved",options:c}})),g.on(p.fail,(l,{params:n})=>({...l,[n]:{status:"error",options:null,error:"Failed to resolve field options"}}));function h(l){const n=g.getState()[l];n&&n.status!=="idle"||p(l)}function F(l){return g.map(n=>n[l]??{status:"idle",options:null})}return{register:s,update:i,getById:o,listStore:d,getByName:a,resolve:h,getByFieldId:F}});function Ie(t){return S.invoke(Fe,t??{})}const Ee=(t,e)=>{e.register(t)},je=m.createDomain("action"),xe=S.createFactory(()=>{const t=je.store({}),e=m.createApi(t,{register(o,a){return{...o,[a.name]:{name:a.name,action:a.action}}}});function r(o,a){e.register({name:o,action:a})}const s=t.map(o=>Object.values(o));function i(o){return t.map(a=>a[o],{skipVoid:!1})}function d(o){return t.map(a=>{const g=a[o];return g?g.action:void 0},{skipVoid:!1})}return{register:r,getByName:i,listStore:s,getEvokableAction:d}});function Ae(){return S.invoke(xe)}const Pe=(t,e,r)=>{r.register(t,e)};function D(t){return typeof t>"u"||t===null||t===""||Array.isArray(t)&&!t.length}function Re(t){return typeof t=="string"||typeof t=="number"||typeof t=="boolean"||t===null}function M(t){try{return JSON.stringify(t),!0}catch{return!1}}const Be=m.createDomain("response"),De=S.createFactory(({client:t})=>{const e=Be.store({}),r=m.createEvent(),s=m.createEvent(),i=m.createApi(e,{register(l,n){return{...l,[n.fieldId]:n.response}},registerBatch(l,n){return{...l,...n}},clear(l,n){const{[n]:c,...f}=l;return f},clearAll(){return{}}});function d(l,n){if(typeof l=="string"){if(n===void 0)throw new Error("Response is required when registering a single field");i.register({fieldId:l,response:n})}else i.registerBatch(l)}async function o(l){const n=[];return await Promise.allSettled(Object.entries(l).map(async([c,f])=>{let u=f;const y=t.fields.getById(c).getState();if(!y){n.push({fieldId:c,userMessage:`Field '${c}' not found`,systemMessage:`No field with ID '${c}' exists. Available field IDs are: ${Object.keys(t.fields.listStore.getState()).join(",")}.`,value:u});return}if(y.multiple&&(typeof u=="string"||typeof u=="number"||typeof u=="boolean")&&(u=[u]),y.validation&&!J.isEmpty(y.validation)&&!D(u)){const v=await b.evaluateRuleLogic(t,y.validation,{$input:u});if(typeof v=="string"){n.push({fieldId:c,userMessage:v,systemMessage:`Field validation resulted in an error: ${v}.`,value:u});return}if(v===!1){n.push({fieldId:c,userMessage:"This field is invalid",systemMessage:"Field validation resulted in an unspecified error.",value:u});return}}if(y.required&&D(u)){n.push({fieldId:c,userMessage:"This field is required",systemMessage:"Field is required.",value:u});return}if(!y.multiple&&Array.isArray(u)&&u.length>1){n.push({fieldId:c,userMessage:"This field expects a single response",systemMessage:"Field expects a single response.",value:u});return}if(y.type==="object"&&!D(u))if(y.multiple){if(!Array.isArray(u)){n.push({fieldId:c,userMessage:"This field expects multiple values",systemMessage:"Field expects an array of objects.",value:u});return}for(const v of u){if(typeof v!="object"||v===null){n.push({fieldId:c,userMessage:"This field expects object values",systemMessage:"Field expects an array of objects, but received non-object value.",value:u});return}if(!M(v)){n.push({fieldId:c,userMessage:"This field contains non-serializable data",systemMessage:"Field value contains non-JSON-serializable data (functions, circular references, etc.).",value:u});return}}}else{if(Array.isArray(u)){n.push({fieldId:c,userMessage:"This field expects a single value",systemMessage:"Field expects a single object, not an array.",value:u});return}if(typeof u!="object"||u===null){n.push({fieldId:c,userMessage:"This field expects an object value",systemMessage:"Field expects an object value.",value:u});return}if(!M(u)){n.push({fieldId:c,userMessage:"This field contains non-serializable data",systemMessage:"Field value contains non-JSON-serializable data (functions, circular references, etc.).",value:u});return}}if(y.options&&typeof y.options!="function"){const v=Array.isArray(u)?u:[u];if(y.type==="object"){const j=y.options.map(I=>JSON.stringify(I.value));v.every(I=>j.includes(JSON.stringify(I)))||n.push({fieldId:c,userMessage:"This field expects a valid option",systemMessage:"Field expects a valid option from the defined choices.",value:u})}else{const j=y.options.map(I=>I.value);v.every(I=>!Re(I)||I===null?!1:j.includes(I))||n.push({fieldId:c,userMessage:"This field expects a valid option",systemMessage:`Field expects a valid option. Valid options are: ${j.join(", ")}`,value:u})}}})),{responsesToCommit:l,validationErrors:n}}async function a(l){const{responsesToCommit:n,validationErrors:c}=await o(l);return c.length?{errors:c}:(i.registerBatch(n),{errors:[]})}const g=e.map(l=>l),p=e.map(l=>Object.keys(l).map(c=>({fieldId:c,value:l[c]})));function h(l){const n=t.fields.getById(l),c=e.map(f=>f[l]||null);return m.combine({f:n,r:c},({f,r:u})=>u||(f?.defaultValue?f.defaultValue:null))}function F(l){const n=t.fields.getByName(l);return m.combine({f:n,s:e},({f:c,s:f})=>{const u=c&&f[c.id]||null;return u||(c?.defaultValue?c.defaultValue:null)})}return m.sample({clock:r,target:i.clearAll}),m.sample({clock:s,target:i.clear}),{register:d,clearAll:r,clear:s,commit:a,getResponsesToCommit:o,listStore:p,getAllStore:g,getByFieldId:h,getByFieldName:F}});function Ce(t){return S.invoke(De,t)}const $e=()=>"0.0.1-dev.1770849584797";function Oe(){if(k.supportsDocument()){const t=[document.currentScript,document.getElementById("picked_script"),document.getElementById("picked"),document.getElementById("cvly"),document.getElementById("cvly-x")];for(const e of t)if(e?.dataset.api)return e.dataset.api}return"https://api.picked.app"}function ze(){if(!k.supportsWindow())return{};const t=new URLSearchParams(window.location.search),e={},r=new Set;for(const[i]of t.entries())i.startsWith("picked-")&&r.add(i);for(const i of r){const d=i.replace("picked-","");e[d]=t.getAll(i)}const s=w.createStorageKey("s");if(r.size>0)w.sessionStore.set(s,e);else{const i=w.sessionStore.get(s);if(i)return i.json()||{}}return e}function Me(){if(k.supportsCryptoRandomUUID())return crypto.randomUUID();const t=Date.now().toString(36),e=Math.random().toString(36).substring(2,15),r=Math.random().toString(36).substring(2,15),s=Math.random().toString(36).substring(2,15);return`${t}-${e}-${r}-${s}`}const Ve=w.createStorageKey("session","global"),Te=()=>{const t=w.localStore.get(Ve);let e;t.isSet()&&(e=t.json());const r=i=>t.set({id:i.id,isUser:i.isUser,identifiers:i.identifiers}),s={id:e?.id??Me(),isUser:e?.isUser??void 0,identifiers:e?.identifiers??void 0,setIsUser(i){this.isUser=i,r(this)},setIdentifier(i,d){this.identifiers={...this.identifiers,[i]:d},r(this)},removeIdentifier(i){this.identifiers&&(this.identifiers=Object.fromEntries(Object.entries(this.identifiers).filter(([d])=>d!==i)),this.identifiers=Object.keys(this.identifiers).length?this.identifiers:void 0,r(this))}};return r(s),s},Ue=()=>k.supportsLocalStorage()?Te():null;function L(){if(k.supportsWindow())return globalThis.window.pickedConfig}function Le(){if(!k.supportsWindow())return;const t=L(),e=t?.organizationId,r=t?.projectId;return e&&r?{organizationId:e,projectId:r}:void 0}function Ne(){if(!k.supportsDocument())return;const t=document.getElementById("picked_script")||document.querySelector("script#picked")||document.getElementById("cvly");if(!t)return;const e=t.dataset.organizationid||t.getAttribute("organization-id"),r=t.dataset.projectid||t.getAttribute("project-id");return e&&r?{organizationId:e,projectId:r}:void 0}function _e(t){const{organizationId:e,projectId:r}=t;if(e&&r)return{organizationId:e,projectId:r};const s=Le();if(s)return s;const i=Ne();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 f=require("effector"),S=require("@withease/factories"),b=require("../experience-instance-D8RtqKEZ.cjs"),I=require("../logger-BsmHUUw1.cjs"),w=require("../storage-Be5xWNPC.cjs"),q=require("../api-DzSCgBQ2.cjs"),H=require("../id-BKIWbSTy.cjs"),K=require("../object-BbFTsGh3.cjs"),k=require("../supports-YvpQZxbh.cjs"),O=f.createDomain("experience"),G=S.createFactory(({client:t,experience:e})=>{const r=O.store(e),s=f.createApi(r,{merge(p,h){return{...p,...h.experience}}}),i=r.map(p=>({name:p.name,decisionLogic:p.condition??p.decide,targetSelectors:p.targets,initializeOpenLogic:e.initializeOpen})),l=t.components.listStore.map(p=>p.find(h=>h.name===`experience:${e.id}`)||p.find(h=>h.name==="experience"),{skipVoid:!1}),o=r.map(p=>({steps:p.steps,nodes:p.nodes,edges:p.edges,conditionals:p.conditionals})),n=r.map(p=>p.fields),d=e.actions??[];return{id:e.id,configStore:i,treeStore:o,fieldsStore:n,componentStore:l,actions:d,merge:s.merge}});function W(t){return S.invoke(G,t)}const J=S.createFactory(({client:t})=>{const e=O.store({}),r=f.createApi(e,{register(o,n){return{...o,[n.id]:n}}});function s(o){const n=e.getState()[o.id];if(n){n.merge({experience:o,strategy:"override"});return}const d=W({client:t,experience:o});r.register(d)}const i=e.map(o=>Object.values(o));function l(o){return e.map(n=>n[o],{skipVoid:!1})}return{register:s,getById:l,listStore:i}});function Y(t){return S.invoke(J,t)}const Q=(t,e)=>{e.register(t)},U=(t,e)=>{const{targetSelectors:r}=e.configStore.getState(),s=b.getTargetElements(r,e.id);s.forEach(({elements:l})=>l.forEach(o=>b.tagTargetElement(o,e.id))),b.createAppHosts(s,e.id).forEach(l=>{t.experienceInstances.spawn(e,l)})},B=async t=>{await Promise.all(t.experiences.listStore.getState().map(async e=>{await X(t,e)&&U(t,e)}))},X=async(t,e)=>{const{decisionLogic:r,targetSelectors:s}=e.configStore.getState();return b.getTargetElements(s,e.id).length<1||s.length===0?!1:r&&b.isRulesLogic(r)?await b.evaluateRuleLogic(t,r)===!0:!0},Z=(t,e,r)=>{const s=e.name,i=e.setup(t);if(i){const l=r[s]??{};r[s]=Object.freeze({...l,...i})}},ee=f.createDomain("component"),te=S.createFactory(({client:t,component:e,name:r})=>{const s=t.frameworks.getByName(e.frameworkName);return{name:r,component:e,frameworkStore:s}});function re(t){return S.invoke(te,t)}const se=S.createFactory(({client:t})=>{const e=ee.store({}),r=f.createApi(e,{register(o,n){return{...o,[n.name]:n}}});function s(o,n){e.getState()[o]&&I.logger("warn",`Component '${o}' already registered. Registering again will override the previous registration.`);const p=re({client:t,name:o,component:n});r.register(p)}const i=e.map(o=>Object.values(o));function l(o){return e.map(n=>n[o],{skipVoid:!1})}return{register:s,getByName:l,listStore:i}});function ne(t){return S.invoke(se,t)}const C=(t,e,r)=>{r.register(t,e)},ie=f.createDomain("framework"),oe=S.createFactory(({client:t})=>{const e=ie.store({}),r=f.createApi(e,{register(o,n){return{...o,[n.name]:n.framework}}});function s(o,n){e.getState()[o]&&I.logger("warn",`Framework '${o}' already registered. Registering again will override the previous registration.`),r.register({name:o,framework:n})}const i=e.map(o=>Object.values(o));function l(o){return e.map(n=>n[o],{skipVoid:!1})}return{register:s,getByName:l,listStore:i}});function ae(t){return S.invoke(oe,t)}const ce=(t,e)=>{e.register(t.name,t)},ue=6e3,le=w.createStorageKey("last_ping","global"),de=async t=>{try{const e=Date.now(),r=w.localStore.get(le);let s=0;if(r.isSet()&&(s=r.json()??0),s&&e-s<ue)return!0;const i={projectId:t.projectId,path:window.location.pathname},l={},n=document.getElementById("picked_script")?.dataset.verceltoken;n&&(l["x-vercel-protection-bypass"]=n);const p=(await q.post(t.apiUrl,"ping",i,l)).ok;return p&&r.set(e),p}catch(e){return I.logger("error",e),!1}};function V(t){const e=typeof window<"u",r={client:t,responses:t.responses.listStore.getState(),fields:t.fields.listStore.getState(),location:e?window.location:void 0,document:e?window.document:void 0,sessionStorage:e?window.sessionStorage:void 0,localStorage:e?window.localStorage:void 0};return Object.freeze(r)}const pe=f.createDomain("predicate"),ge=S.createFactory(({client:t})=>{const e=pe.store({}),r=f.createApi(e,{register(n,d){return{...n,[d.name]:{name:d.name,predicate:d.predicate}}}});function s(n,d){e.getState()[n]&&I.logger("warn",`Predicate '${n}' already registered. Registering again will override the previous registration.`),r.register(Object.freeze({name:n,predicate:d}))}const i=e.map(n=>Object.values(n));function l(n){return e.map(d=>d[n]?.predicate,{skipVoid:!1})}function o(n){const d=f.createStore(()=>{},{skipVoid:!1}),p=f.createEffect(async()=>{const h=l(n).getState();if(!h)return;const j=V(t);return(...y)=>h({...j,args:y})});return f.sample({source:{responses:t.responses.listStore,fields:t.fields.listStore},target:p}),f.sample({clock:p.doneData,filter:h=>h!==void 0,target:d}),p(),d}return{register:s,getByName:l,listStore:i,getEvokablePredicate:o}});function fe(t){return S.invoke(ge,t)}const me=(t,e,r)=>{r.register(t,e)},$=f.createDomain("feature"),ye=S.createFactory(({client:t})=>{const e=$.store({}),r=$.store([]),s=f.createApi(e,{register(a,c){return{...a,[c.id]:c.feature}}});function i(a,c){e.getState()[a]&&I.logger("warn",`Feature '${a}' already registered. Registering again will override the previous registration.`);const u={id:a,feature:{...c,id:a}};s.register(Object.freeze({id:a,feature:u}))}const l=f.createEffect(async({id:a,key:c,storage:g="local"})=>{const u=w.createStorageKey(`feature:${a}:${c}`,"global"),v=(g==="session"?w.sessionStore:w.localStore).get(u).boolean();return v===null?null:{id:a,key:c,bucket:v,storage:g}}),o=f.createEffect(a=>{if(!a)return null;const c=w.createStorageKey(`feature:${a.id}:${a.key}`,"global");(a.storage==="session"?w.sessionStore:w.localStore).set(c,a.bucket)}),n=new Map,d=f.attach({source:{allFeaturesStore:e,resolvedFeaturesStore:r},effect:async({allFeaturesStore:a,resolvedFeaturesStore:c},{id:g,decide:u,key:m})=>{const v=c.find(P=>P.id===g&&P.key===m);if(v)return v;const E=a[g];if(!E)throw new Error(`Feature with id '${g}' not found`);const A=n.get(`${g}:${m}`);if(A!==void 0){const P=await A;return{id:E.id,bucket:P,key:m,storage:E.feature.storage}}const F=u();n.set(`${g}:${m}`,F);const _=await F;return{id:E.id,bucket:_,key:m,storage:E.feature.storage}}});f.sample({clock:s.register,fn:a=>{const{id:c,feature:g}=a;return{id:c,key:g.feature.key,storage:g.feature.storage}},target:l}),f.sample({source:e,clock:d.doneData,fn:(a,c)=>{const{id:g,bucket:u,storage:m}=c,v=a[g]?.feature.key;return v?{key:v,id:g,bucket:u,storage:m}:null},target:o});const p=f.combine({allFeaturesStore:e,resolvedFeaturesStore:r}).map(({allFeaturesStore:a,resolvedFeaturesStore:c})=>Object.values(a).map(g=>{const u=c.find(m=>m.id===g.id&&m.key===g.feature.key);return u?{id:g.id,name:g.feature.name,key:g.feature.key,getBucket:()=>({id:g.id,bucket:u.bucket}),isResolved:!0}:{id:g.id,name:g.feature.name,key:g.feature.key,getBucket:async()=>await d(g.feature),isResolved:!1}}));f.sample({clock:d.doneData,source:{resolvedFeatures:r},filter:({resolvedFeatures:a},{id:c,key:g})=>!a.some(m=>m.id===c&&m.key===g),fn:(a,c)=>c,target:t.eventBus.prepend(a=>({type:"feature_decide",feature:a}))}),f.sample({clock:[l.doneData,d.doneData],source:r,fn:(a,c)=>!c||a.some(u=>u.id===c.id&&u.key===c.key)?a:[...a,c],target:r});function h(a){return p.map(c=>c.find(g=>g.id===a))}function j(a){return e.map(c=>c[a],{skipVoid:!1})}function y(a){const c=f.createStore(async()=>{},{skipVoid:!1}),g=f.createEffect(async()=>{const u=h(a).getState();if(u)return async()=>(await u.getBucket()).bucket});return f.sample({source:r,filter:u=>u.some(m=>m.id===a),target:g}),f.sample({clock:g.doneData,filter:u=>u!==void 0,target:c}),g(),c}return{register:i,getById:h,getByName:j,listStore:p,getEvokableFeature:y}});function he(t){return S.invoke(ye,t)}const Se=(t,e,r)=>{r.register(t,e)},x=f.createDomain("history");function z(t,e){return{id:H.generateId(`history-entry-${Date.now()}-${Math.random()}}`),node:e,at:Date.now(),experienceId:t}}const ve=S.createFactory(()=>{const t=x.store({entries:[]}),e=x.event(),r=x.event(),s=x.event(),i=x.event();t.on(e,(o,n)=>({entries:[...o.entries,z(n.experienceId,n.node)]})),t.on(r,(o,n)=>({entries:[...o.entries.slice(0,-1),z(n.experienceId,n.node)]})),t.on(i,(o,n)=>n);function l(o,n){const d={lastStepIndex:-1,secondLastStepIndex:-1};for(let p=o.length-1;p>=0;p--){const h=o[p],j=h?.node;if(!(!j||!b.isStepNode(j))&&!(n&&h?.experienceId!==n))if(d.lastStepIndex===-1)d.lastStepIndex=p;else{d.secondLastStepIndex=p;break}}return d}return t.on(s,(o,n)=>{const{secondLastStepIndex:d}=l(o.entries,n.experienceId),p=d!==-1?o.entries.slice(0,d+1):o.entries;return{...o,entries:p}}),{push:e,replace:r,back:s,restore:i,entriesStore:t.map(o=>o.entries)}});function ke(){return S.invoke(ve)}let we=0;const be=t=>{const e=f.createStore([]);return f.sample({clock:t,source:e,fn:(r,s)=>[...r,{id:we++,at:new Date,payload:s}],target:e}),e},Fe=f.createDomain("field"),Ie=S.createFactory(()=>{const t=Fe.store({}),e=f.createApi(t,{register(n,d){return{...n,[d.field.id]:d.field}}});function r(n){e.register({field:n})}function s(n,d){const p=l(n).getState();if(!p)return;const h=Object.assign({},p,{...d});e.register({field:{...h}})}const i=t.map(n=>Object.values(n));function l(n){return t.map(d=>d[n]||null)}function o(n){return t.map(d=>Object.values(d).find(p=>p.name===n)||null)}return{register:r,update:s,getById:l,listStore:i,getByName:o}});function Ee(){return S.invoke(Ie)}const je=(t,e)=>{e.register(t)},xe=f.createDomain("action"),Ae=S.createFactory(()=>{const t=xe.store({}),e=f.createApi(t,{register(o,n){return{...o,[n.name]:{name:n.name,action:n.action}}}});function r(o,n){e.register({name:o,action:n})}const s=t.map(o=>Object.values(o));function i(o){return t.map(n=>n[o],{skipVoid:!1})}function l(o){return t.map(n=>{const d=n[o];return d?d.action:void 0},{skipVoid:!1})}return{register:r,getByName:i,listStore:s,getEvokableAction:l}});function Pe(){return S.invoke(Ae)}const Re=(t,e,r)=>{r.register(t,e)};function D(t){return typeof t>"u"||t===null||t===""||Array.isArray(t)&&!t.length}function De(t){return typeof t=="string"||typeof t=="number"||typeof t=="boolean"||t===null}function M(t){try{return JSON.stringify(t),!0}catch{return!1}}const Be=f.createDomain("response"),Ce=S.createFactory(({client:t})=>{const e=Be.store({}),r=f.createEvent(),s=f.createEvent(),i=f.createApi(e,{register(y,a){return{...y,[a.fieldId]:a.response}},registerBatch(y,a){return{...y,...a}},clear(y,a){const{[a]:c,...g}=y;return g},clearAll(){return{}}});function l(y,a){if(typeof y=="string"){if(a===void 0)throw new Error("Response is required when registering a single field");i.register({fieldId:y,response:a})}else i.registerBatch(y)}async function o(y){const a=[];return await Promise.allSettled(Object.entries(y).map(async([c,g])=>{let u=g;const m=t.fields.getById(c).getState();if(!m){a.push({fieldId:c,userMessage:`Field '${c}' not found`,systemMessage:`No field with ID '${c}' exists. Available field IDs are: ${Object.keys(t.fields.listStore.getState()).join(",")}.`,value:u});return}if(m.multiple&&(typeof u=="string"||typeof u=="number"||typeof u=="boolean")&&(u=[u]),m.validation&&!K.isEmpty(m.validation)&&!D(u)){const v=await b.evaluateRuleLogic(t,m.validation,{$input:u});if(typeof v=="string"){a.push({fieldId:c,userMessage:v,systemMessage:`Field validation resulted in an error: ${v}.`,value:u});return}if(v===!1){a.push({fieldId:c,userMessage:"This field is invalid",systemMessage:"Field validation resulted in an unspecified error.",value:u});return}}if(m.required&&D(u)){a.push({fieldId:c,userMessage:"This field is required",systemMessage:"Field is required.",value:u});return}if(!m.multiple&&Array.isArray(u)&&u.length>1){a.push({fieldId:c,userMessage:"This field expects a single response",systemMessage:"Field expects a single response.",value:u});return}if(m.type==="object"&&!D(u))if(m.multiple){if(!Array.isArray(u)){a.push({fieldId:c,userMessage:"This field expects multiple values",systemMessage:"Field expects an array of objects.",value:u});return}for(const v of u){if(typeof v!="object"||v===null){a.push({fieldId:c,userMessage:"This field expects object values",systemMessage:"Field expects an array of objects, but received non-object value.",value:u});return}if(!M(v)){a.push({fieldId:c,userMessage:"This field contains non-serializable data",systemMessage:"Field value contains non-JSON-serializable data (functions, circular references, etc.).",value:u});return}}}else{if(Array.isArray(u)){a.push({fieldId:c,userMessage:"This field expects a single value",systemMessage:"Field expects a single object, not an array.",value:u});return}if(typeof u!="object"||u===null){a.push({fieldId:c,userMessage:"This field expects an object value",systemMessage:"Field expects an object value.",value:u});return}if(!M(u)){a.push({fieldId:c,userMessage:"This field contains non-serializable data",systemMessage:"Field value contains non-JSON-serializable data (functions, circular references, etc.).",value:u});return}}if(m.options){const v=Array.isArray(u)?u:[u];if(m.type==="object"){const E=m.options.map(F=>JSON.stringify(F.value));v.every(F=>E.includes(JSON.stringify(F)))||a.push({fieldId:c,userMessage:"This field expects a valid option",systemMessage:"Field expects a valid option from the defined choices.",value:u})}else{const E=m.options.map(F=>F.value);v.every(F=>!De(F)||F===null?!1:E.includes(F))||a.push({fieldId:c,userMessage:"This field expects a valid option",systemMessage:`Field expects a valid option. Valid options are: ${E.join(", ")}`,value:u})}}})),{responsesToCommit:y,validationErrors:a}}async function n(y){const{responsesToCommit:a,validationErrors:c}=await o(y);return c.length?{errors:c}:(i.registerBatch(a),{errors:[]})}const d=e.map(y=>y),p=e.map(y=>Object.keys(y).map(c=>({fieldId:c,value:y[c]})));function h(y){const a=t.fields.getById(y),c=e.map(g=>g[y]||null);return f.combine({f:a,r:c},({f:g,r:u})=>u||(g?.defaultValue?g.defaultValue:null))}function j(y){const a=t.fields.getByName(y);return f.combine({f:a,s:e},({f:c,s:g})=>{const u=c&&g[c.id]||null;return u||(c?.defaultValue?c.defaultValue:null)})}return f.sample({clock:r,target:i.clearAll}),f.sample({clock:s,target:i.clear}),{register:l,clearAll:r,clear:s,commit:n,getResponsesToCommit:o,listStore:p,getAllStore:d,getByFieldId:h,getByFieldName:j}});function $e(t){return S.invoke(Ce,t)}const ze=()=>"0.0.1-dev.1771901344537";function Me(){if(k.supportsDocument()){const t=[document.currentScript,document.getElementById("picked_script"),document.getElementById("picked"),document.getElementById("cvly"),document.getElementById("cvly-x")];for(const e of t)if(e?.dataset.api)return e.dataset.api}return"https://api.picked.app"}function Oe(){if(!k.supportsWindow())return{};const t=new URLSearchParams(window.location.search),e={},r=new Set;for(const[i]of t.entries())i.startsWith("picked-")&&r.add(i);for(const i of r){const l=i.replace("picked-","");e[l]=t.getAll(i)}const s=w.createStorageKey("s");if(r.size>0)w.sessionStore.set(s,e);else{const i=w.sessionStore.get(s);if(i)return i.json()||{}}return e}function Ue(){if(k.supportsCryptoRandomUUID())return crypto.randomUUID();const t=Date.now().toString(36),e=Math.random().toString(36).substring(2,15),r=Math.random().toString(36).substring(2,15),s=Math.random().toString(36).substring(2,15);return`${t}-${e}-${r}-${s}`}const Ve=w.createStorageKey("session","global"),Te=()=>{const t=w.localStore.get(Ve);let e;t.isSet()&&(e=t.json());const r=i=>t.set({id:i.id,isUser:i.isUser,identifiers:i.identifiers}),s={id:e?.id??Ue(),isUser:e?.isUser??void 0,identifiers:e?.identifiers??void 0,setIsUser(i){this.isUser=i,r(this)},setIdentifier(i,l){this.identifiers={...this.identifiers,[i]:l},r(this)},removeIdentifier(i){this.identifiers&&(this.identifiers=Object.fromEntries(Object.entries(this.identifiers).filter(([l])=>l!==i)),this.identifiers=Object.keys(this.identifiers).length?this.identifiers:void 0,r(this))}};return r(s),s},Le=()=>k.supportsLocalStorage()?Te():null;function T(){if(k.supportsWindow())return globalThis.window.pickedConfig}function Ne(){if(!k.supportsWindow())return;const t=T(),e=t?.organizationId,r=t?.projectId;return e&&r?{organizationId:e,projectId:r}:void 0}function _e(){if(!k.supportsDocument())return;const t=document.getElementById("picked_script")||document.querySelector("script#picked")||document.getElementById("cvly");if(!t)return;const e=t.dataset.organizationid||t.getAttribute("organization-id"),r=t.dataset.projectid||t.getAttribute("project-id");return e&&r?{organizationId:e,projectId:r}:void 0}function qe(t){const{organizationId:e,projectId:r}=t;if(e&&r)return{organizationId:e,projectId:r};const s=Ne();if(s)return s;const i=_e();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 R(t){return t==null||t===""||Number.isNaN(t)}const qe={default:(t,e)=>R(t)?String(e??""):String(t),append:(t,e)=>e&&!R(t)?`${t} ${e}`:t,prepend:(t,e)=>e&&!R(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(([s,i])=>`${s}: ${i}`);return e.format(r)}return t instanceof Set?e.format(Array.from(t).map(String)):t}};function Ke(t){return typeof t=="object"&&t!==null}function Je(t,e){let r=e;for(const s of t.split("."))if(Ke(r)&&s in r)r=r[s];else return;return typeof r=="function"?r():r}function We(t,e){const r=t.split("|").map(d=>d.trim()),s=r.shift()??"";let i=Je(s,e);for(const d of r){const[o,...a]=d.split(":"),g=o?.trim()??"",p=a.join(":").trim().replaceAll(/(?:^['"]|['"]$)/g,""),h=qe[g];h&&(i=h(i,p))}return R(i)?"":typeof i=="object"?JSON.stringify(i):String(i)}function He(t,e){let r="",s=0;for(;s<t.length;)if(t[s]==="{"&&t[s+1]==="{"){s+=2;let i="";for(;s<t.length;){if(t[s]==="}"&&t[s+1]==="}"){s+=2;break}i+=t[s++]}r+=We(i.trim(),e)}else r+=t[s++];return r}class N{static logger=E.logger;options;isReady=!1;project;plugins={};eventBus=be();organizationId;projectId;apiUrl;session;precondition;condition;searchParams=ze();history=we();components=ne({client:this});experienceInstances=b.createExperienceInstanceIndex({client:this});experiences=Y({client:this});frameworks=ae({client:this});predicates=me({client:this});features=Se({client:this});responses=Ce({client:this});fields=Ie({client:this});actions=Ae();constructor(e){E.logger("info","Picked client initializing.");const{organizationId:r,projectId:s}=_e(e);this.organizationId=r,this.projectId=s,this.options=Object.freeze(e),this.apiUrl=e.apiUrl||Oe(),this.session=Ue(),this.setupPlugins(),this.setupFeatures(),this.setupPredicates(),this.setupActions(),this.precondition=e.precondition,this.condition=e.condition,this.eventBus({type:"load",version:$e()}),E.logger("info","Picked client initialized.")}start=()=>{pe(this),(async()=>{if(!k.supportsDocument())return;let r;typeof this.precondition>"u"?r=!0:typeof this.precondition=="boolean"?r=this.precondition:r=await b.evaluateRuleLogic(this,this.precondition)===!0;let s;r&&(this.condition===void 0?s=!0:typeof this.condition=="boolean"?s=this.condition:s=await b.evaluateRuleLogic(this,this.condition)===!0);const i=r&&s===!0;if(typeof s=="boolean"&&this.session){const d=s;this.session.setIsUser(d),this.eventBus({type:"user_decide",value:d})}this.eventBus({type:"initialize"}),document.body&&i&&C(this),await b.domInteractive(),i&&C(this),this.eventBus({type:"ready"}),this.isReady=!0,this.session&&this.eventBus({type:"session",...this.session})})()};registerFramework=e=>{ce(e,this.frameworks)};registerComponent=(e,r)=>{$(e,r,this.components)};registerPlugin=e=>{Z(this,e,this.plugins)};registerFeature=(e,r)=>{ve(e,r,this.features)};registerPredicate=(e,r)=>{ye(e,r,this.predicates)};registerField=e=>{Ee(e,this.fields)};registerAction=(e,r)=>{Pe(e,r,this.actions)};registerExperience=e=>{e.component&&$(`experience:${e.id}`,e.component,this.components),Q(e,this.experiences)};getStateSnapshot=()=>U(this);launchExperienceById=async e=>{const r=this.experiences.getById(e).getState();if(!r){E.logger("warn",`Experience with id '${e}' not found.`);return}T(this,r)};setupPlugins(){this.options.plugins?.forEach(e=>{if(Array.isArray(e)){e.forEach(s=>{this.registerPlugin(s)});return}const r=typeof e=="function"?e():e;if(Array.isArray(r)){r.forEach(s=>this.registerPlugin(s));return}this.registerPlugin(r)})}setupFeatures(){const e=this.options.features;e&&(Object.entries(e).forEach(([r,s])=>{const i=typeof s=="function"?s():s;this.registerFeature(r,i)}),this.searchParams.feature&&this.searchParams.feature.forEach(r=>{try{const[s,i]=r.split(":");if(!s||!i)return;let d=i;d==="true"&&(d=!0),d==="false"&&(d=!1),this.registerFeature(s,{key:`${d}`,name:s,decide:()=>d,storage:"session"})}catch{}}))}setupPredicates(){const e=this.options.predicates;e&&Object.entries(e).forEach(([r,s])=>{if(typeof s!="function"){E.logger("warn",`Predicate "${r}" is not a function.`);return}this.registerPredicate(r,s)})}setupActions(){const e=this.options.actions;e&&Object.entries(e).forEach(([r,s])=>{if(typeof s!="function"){E.logger("warn",`Action "${r}" is not a function.`);return}this.registerAction(r,s)})}getPluginConfig=e=>this.plugins[e]??{};renderString=(e,r)=>{const s=this.responses.listStore.getState().reduce((i,d)=>(i[d.fieldId]=d.value,i),{});return He(e,{...r,responses:s})}}function _(t){return Array.isArray(t.options)&&t.options.some(e=>"condition"in e)}function Ge(t){return t.some(e=>e.condition||_(e))}async function Ye(t,e){return e.length===0?e:(await Promise.all(e.map(async s=>{let i=s;if(s.options&&typeof s.options=="function")try{const p=s.options,h=await Promise.resolve(p());i={...s,options:h}}catch{i={...s,options:null}}if(!Ge([i]))return i;if(!(i.condition?await b.evaluateRuleLogic(t,i.condition):!0))return null;if(!i.options||!_(i)||!Array.isArray(i.options))return i;const a=(await Promise.all(i.options.map(async p=>p.condition?await b.evaluateRuleLogic(t,p.condition)?p:null:p))).filter(p=>p!==null);return a.length===i.options.length?i:a.length===0?null:{...i,options:a}}))).filter(s=>s!==null)}const Qe=t=>{const e=new N(t);return k.bindClient(e),e};exports.evaluateRuleLogic=b.evaluateRuleLogic;exports.isPickedRoot=b.isPickedRoot;exports.createStorageKey=w.createStorageKey;exports.localStore=w.localStore;exports.sessionStore=w.sessionStore;exports.subscribe=w.subscribe;exports.supportsCookies=k.supportsCookies;exports.supportsCryptoRandomUUID=k.supportsCryptoRandomUUID;exports.supportsDocument=k.supportsDocument;exports.supportsHistory=k.supportsHistory;exports.supportsIntersectionObserver=k.supportsIntersectionObserver;exports.supportsLocalStorage=k.supportsLocalStorage;exports.supportsLocation=k.supportsLocation;exports.supportsSessionStorage=k.supportsSessionStorage;exports.supportsShadowRoot=k.supportsShadowRoot;exports.supportsWebComponents=k.supportsWebComponents;exports.supportsWindow=k.supportsWindow;exports.Picked=N;exports.createClient=Qe;exports.getPickedConfig=L;exports.getStepFields=Ye;
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 R(t){return t==null||t===""||Number.isNaN(t)}const He={default:(t,e)=>R(t)?String(e??""):String(t),append:(t,e)=>e&&!R(t)?`${t} ${e}`:t,prepend:(t,e)=>e&&!R(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(([s,i])=>`${s}: ${i}`);return e.format(r)}return t instanceof Set?e.format(Array.from(t).map(String)):t}};function Ke(t){return typeof t=="object"&&t!==null}function Ge(t,e){let r=e;for(const s of t.split("."))if(Ke(r)&&s in r)r=r[s];else return;return typeof r=="function"?r():r}function We(t,e){const r=t.split("|").map(l=>l.trim()),s=r.shift()??"";let i=Ge(s,e);for(const l of r){const[o,...n]=l.split(":"),d=o?.trim()??"",p=n.join(":").trim().replaceAll(/(?:^['"]|['"]$)/g,""),h=He[d];h&&(i=h(i,p))}return R(i)?"":typeof i=="object"?JSON.stringify(i):String(i)}function Je(t,e){let r="",s=0;for(;s<t.length;)if(t[s]==="{"&&t[s+1]==="{"){s+=2;let i="";for(;s<t.length;){if(t[s]==="}"&&t[s+1]==="}"){s+=2;break}i+=t[s++]}r+=We(i.trim(),e)}else r+=t[s++];return r}class L{static logger=I.logger;options;isReady=!1;project;plugins={};pluginStartHooks=[];eventBus=f.createEvent();events;organizationId;projectId;apiUrl;dashboardUrl;documentationSiteUrl;session;precondition;condition;searchParams=Oe();history=ke();components=ne({client:this});experienceInstances=b.createExperienceInstanceIndex({client:this});experiences=Y({client:this});frameworks=ae({client:this});predicates=fe({client:this});features=he({client:this});responses=$e({client:this});fields=Ee();actions=Pe();constructor(e){I.logger("info","Picked client initializing."),this.events=be(this.eventBus);const{organizationId:r,projectId:s}=qe(e);this.organizationId=r,this.projectId=s,this.options=Object.freeze(e),this.apiUrl=e.apiUrl||Me(),this.dashboardUrl=e.dashboardUrl??"https://dashboard.picked.app",this.documentationSiteUrl=e.documentationSiteUrl??"https://docs.picked.app",this.session=Le(),this.setupPlugins(),this.setupFeatures(),this.setupPredicates(),this.setupActions(),this.precondition=e.precondition,this.condition=e.condition,this.eventBus({type:"load",version:ze()}),I.logger("info","Picked client initialized.")}start=()=>{de(this),(async()=>{if(!k.supportsDocument())return;await this.runPluginStartHooks();const r=await this.evaluateGate(this.precondition);let s;r&&(s=await this.evaluateGate(this.condition));const i=r&&s===!0;if(typeof s=="boolean"&&this.session){const l=s;this.session.setIsUser(l),this.eventBus({type:"user_decide",value:l})}if(this.eventBus({type:"initialize"}),i&&B(this),await b.domInteractive(),i&&B(this),this.eventBus({type:"ready"}),this.isReady=!0,this.session){const{id:l,isUser:o,identifiers:n}=this.session;this.eventBus({type:"session",id:l,isUser:o,identifiers:n})}})()};registerFramework=e=>{ce(e,this.frameworks)};registerComponent=(e,r)=>{C(e,r,this.components)};registerPlugin=e=>{Z(this,e,this.plugins);const r=this.plugins[e.name];r?.onStart&&this.pluginStartHooks.push(r.onStart)};registerFeature=(e,r)=>{Se(e,r,this.features)};registerPredicate=(e,r)=>{me(e,r,this.predicates)};registerField=e=>{je(e,this.fields)};registerAction=(e,r)=>{Re(e,r,this.actions)};registerExperience=e=>{e.component&&C(`experience:${e.id}`,e.component,this.components),Q(e,this.experiences)};getStateSnapshot=()=>V(this);launchExperienceById=async e=>{const r=this.experiences.getById(e).getState();if(!r){I.logger("warn",`Experience with id '${e}' not found.`);return}U(this,r)};async runPluginStartHooks(){for(const e of this.pluginStartHooks)await e()}async evaluateGate(e){return e===void 0?!0:typeof e=="boolean"?e:await b.evaluateRuleLogic(this,e)===!0}setupPlugins(){this.options.plugins?.forEach(e=>{if(Array.isArray(e)){e.forEach(s=>{this.registerPlugin(s)});return}const r=typeof e=="function"?e():e;if(Array.isArray(r)){r.forEach(s=>this.registerPlugin(s));return}this.registerPlugin(r)})}setupFeatures(){const e=this.options.features;e&&(Object.entries(e).forEach(([r,s])=>{const i=typeof s=="function"?s():s;this.registerFeature(r,i)}),this.searchParams.feature&&this.searchParams.feature.forEach(r=>{try{const[s,i]=r.split(":");if(!s||!i)return;let l=i;l==="true"&&(l=!0),l==="false"&&(l=!1),this.registerFeature(s,{key:`${l}`,name:s,decide:()=>l,storage:"session"})}catch{}}))}setupPredicates(){const e=this.options.predicates;e&&Object.entries(e).forEach(([r,s])=>{if(typeof s!="function"){I.logger("warn",`Predicate "${r}" is not a function.`);return}this.registerPredicate(r,s)})}setupActions(){const e=this.options.actions;e&&Object.entries(e).forEach(([r,s])=>{if(typeof s!="function"){I.logger("warn",`Action "${r}" is not a function.`);return}this.registerAction(r,s)})}getPluginConfig=e=>this.plugins[e]??{};renderString=(e,r)=>{const s=this.responses.listStore.getState().reduce((i,l)=>(i[l.fieldId]=l.value,i),{});return Je(e,{...r,responses:s})}}function N(t){return t.options?.some(e=>"condition"in e)??!1}function Ye(t){return t.some(e=>e.condition||N(e))}async function Qe(t,e){return e.length===0||!Ye(e)?e:(await Promise.all(e.map(async s=>{if(!(s.condition?await b.evaluateRuleLogic(t,s.condition):!0))return null;if(!s.options||!N(s))return s;const o=(await Promise.all(s.options.map(async d=>d.condition?await b.evaluateRuleLogic(t,d.condition)?d:null:d))).filter(d=>d!==null);return o.length===s.options.length?s:o.length===0?null:{...s,options:o}}))).filter(s=>s!==null)}const Xe=t=>{const e=new L(t);return k.bindClient(e),e};exports.evaluateRuleLogic=b.evaluateRuleLogic;exports.isPickedRoot=b.isPickedRoot;exports.createStorageKey=w.createStorageKey;exports.localStore=w.localStore;exports.sessionStore=w.sessionStore;exports.subscribe=w.subscribe;exports.supportsCookies=k.supportsCookies;exports.supportsCryptoRandomUUID=k.supportsCryptoRandomUUID;exports.supportsDocument=k.supportsDocument;exports.supportsHistory=k.supportsHistory;exports.supportsIntersectionObserver=k.supportsIntersectionObserver;exports.supportsLocalStorage=k.supportsLocalStorage;exports.supportsLocation=k.supportsLocation;exports.supportsSessionStorage=k.supportsSessionStorage;exports.supportsShadowRoot=k.supportsShadowRoot;exports.supportsWebComponents=k.supportsWebComponents;exports.supportsWindow=k.supportsWindow;exports.Picked=L;exports.createClient=Xe;exports.getPickedConfig=T;exports.getStepFields=Qe;
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const g=require("../../../id-BKIWbSTy.cjs"),l={serialize(e){return JSON.stringify(e)},deserialize(e){return JSON.parse(e)}},m=e=>({name:"create-experience",setup:s=>{Promise.all(e.experiences.map(async d=>{const n=d.serialize(),r=l.deserialize(n);r.component=d.component,s.registerExperience(r),r.fields.forEach(p=>{const f=d.fields.find(t=>t.id===p.id);f&&typeof f.options=="function"&&(p.options=f.options),s.registerField(p)})})).catch(d=>{throw new Error(`Failed to create experiences: ${d}`)})}}),b=(e,s)=>({id:g.generateId("node"),position:[0,0],experience:s,type:"action",action:e.action,addNext(n){if(!n.node)throw new Error("Cannot connect to node");const r=u({sourceNode:this,destinationNode:n.node,sourceNodeHandle:null},s);s.edges.push(r)},onSuccess(n){if(!n.node)throw new Error("Cannot connect to node");const r=u({sourceNode:this,destinationNode:n.node,sourceNodeHandle:"true"},s);s.edges.push(r)},onFail(n){if(!n.node)throw new Error("Cannot connect to node");const r=u({sourceNode:this,destinationNode:n.node,sourceNodeHandle:"false"},s);s.edges.push(r)},serialize(){return l.serialize({id:this.id,type:this.type,action:this.action,position:this.position})}}),x=e=>({id:e.id??g.generateId("step"),label:e.label,fields:e.fields??[],addField(s){const d="serialize"in s?s:N(s);return this.fields?.includes(d)||this.fields?.push(d),d}}),E=(e,s)=>{const d={id:e.id??g.generateId("step"),label:e.label,experience:s,fields:e.fields??[],node:null,nextStep(n){return this.experience.addStep(n,this)},nextConditional(n){return this.experience.addConditional(n,this)},addNextExperience(n){return this.experience.addExperience(n,this)},addField(n){return this.experience.addField(n,this)},serialize(){return l.serialize({id:this.id,label:this.label,fieldIds:this.fields.map(n=>n.id)})}};return h({step:d,type:"step"},s),d},V=()=>[0,0],h=(e,s)=>{const d={id:g.generateId("node"),position:V(),experience:s};if(e.type==="step"){const r={...d,type:"step",connectedStep:e.step,serialize(){return l.serialize({id:this.id,type:this.type,stepId:this.connectedStep.id,position:this.position,label:this.connectedStep.label})}};return r.connectedStep.node=r,r}if(e.type==="conditional"){const r={...d,type:"conditional",connectedConditional:e.conditional,serialize(){return l.serialize({id:this.id,type:this.type,conditionalId:this.connectedConditional.id,position:this.position})}};return r.connectedConditional.node=r,r}return e.type==="experience"?{...d,type:"experience",connectedExperience:e.experience,serialize(){return l.serialize({id:this.id,type:this.type,experienceId:this.connectedExperience.id,position:this.position})}}:{...d,type:"origin",serialize(){return l.serialize({id:this.id,type:this.type,position:this.position})}}},u=(e,s)=>({id:g.generateId("edge"),sourceNode:e.sourceNode,sourceNodeHandle:e.sourceNodeHandle,destinationNode:e.destinationNode,experience:s,serialize(){return l.serialize({id:this.id,sourceNodeHandle:this.sourceNodeHandle??void 0,sourceNodeId:this.sourceNode.id,destinationNodeId:this.destinationNode.id})}}),z=(e,s)=>{const d={id:g.generateId("conditional"),condition:e.condition,node:null,experience:s,addTrue(n){if(!this.node||!n.node)throw new Error("todo no node");const r=u({sourceNode:this.node,destinationNode:n.node,sourceNodeHandle:"true"},this.experience);this.experience.edges.push(r)},addFalse(n){if(!this.node||!n.node)throw new Error("todo no node");const r=u({sourceNode:this.node,destinationNode:n.node,sourceNodeHandle:"false"},this.experience);this.experience.edges.push(r)},serialize(){return l.serialize({id:this.id,condition:this.condition})}};return h({conditional:d,type:"conditional"},s),d};function y(e,s){if(e===null)return null;if(typeof e=="function"){const d=e;return async()=>(await Promise.resolve(d())).map(s)}return e.map(s)}const N=e=>{const s=typeof e.options=="function";return{id:e.id,name:e.name,type:e.type,label:e.label,placeholder:e.placeholder,description:e.description,helpText:e.helpText,defaultValue:e.defaultValue??null,multiple:e.multiple,validation:e.validation??{},condition:e.condition,required:e.required,options:s?e.options:e.options?e.options.map(n=>({...n})):null,policies:e.policies,serialize(){const n={id:this.id,name:this.name,label:this.label,placeholder:this.placeholder,required:this.required,description:this.description,helpText:this.helpText,validation:this.validation,condition:this.condition,policies:this.policies},r=typeof this.defaultValue=="string"?this.defaultValue:void 0,p=typeof this.defaultValue=="number"?this.defaultValue:void 0,f=typeof this.defaultValue=="boolean"?this.defaultValue:void 0;switch(this.type){case"text":{const t=y(this.options,i=>({id:i.id,label:i.label,value:`${i.value}`,condition:i.condition}));if(this.multiple){let i;if(Array.isArray(this.defaultValue)){i=[];for(const o of this.defaultValue)typeof o=="string"&&i.push(o);i.length===0&&(i=void 0)}return l.serialize({...n,type:"text",multiple:!0,defaultValue:i,options:t})}return l.serialize({...n,type:"text",multiple:!1,defaultValue:r,options:t})}case"number":{const t=y(this.options,i=>({id:i.id,label:i.label,value:Number(i.value),condition:i.condition}));if(this.multiple){let i;if(Array.isArray(this.defaultValue)){i=[];for(const o of this.defaultValue)typeof o=="number"&&i.push(o);i.length===0&&(i=void 0)}return l.serialize({...n,type:"number",multiple:!0,defaultValue:i,options:t})}return l.serialize({...n,type:"number",multiple:!1,defaultValue:p,options:t})}case"boolean":{const t=y(this.options,i=>({id:i.id,label:i.label,value:!!i.value,condition:i.condition}));if(this.multiple){let i;if(Array.isArray(this.defaultValue)){i=[];for(const o of this.defaultValue)typeof o=="boolean"&&i.push(o);i.length===0&&(i=void 0)}return l.serialize({...n,type:"boolean",multiple:!0,defaultValue:i,options:t})}return l.serialize({...n,type:"boolean",multiple:!1,defaultValue:f,options:t})}case"object":{const t=y(this.options,i=>({id:i.id,label:i.label,description:i.description,value:i.value,condition:i.condition}));return this.multiple?l.serialize({...n,type:"object",multiple:!0,defaultValue:this.defaultValue,options:t}):l.serialize({...n,type:"object",multiple:!1,defaultValue:this.defaultValue,options:t})}default:throw new Error("Unsupported field type")}}}},v=e=>{const s=[],d=[],n=[],r=[],p=[],f=e.condition??e.decide;return{id:e.id,component:e.component,name:e.name,initializeOpen:e.initializeOpen,condition:f,decide:e.decide,targets:e.targets,steps:s,nodes:d,edges:n,fields:p,conditionals:r,addStep(t,i){let o=i?.node;this.nodes.length===0&&(o=h({type:"origin"},this),this.nodes.push(o));const a="serialize"in t?t:E(t,this);if(o){if(!a.node)throw new Error("todo no node");const c=u({sourceNode:o,destinationNode:a.node,sourceNodeHandle:null},this);this.edges.push(c)}return a.fields.length>0&&a.fields.forEach(c=>{this.fields.includes(c)||this.fields.push(c)}),this.steps.includes(a)||(this.steps.push(a),a.node&&this.nodes.push(a.node)),a},addAction(t,i){let o=i?.node;this.nodes.length===0&&(o=h({type:"origin"},this),this.nodes.push(o));const a="serialize"in t?t:b(t,this);if(o){const c=u({sourceNode:o,destinationNode:a,sourceNodeHandle:null},this);this.edges.push(c)}return this.nodes.push(a),a},addConditional(t,i){let o=i?.node;this.nodes.length===0&&(o=h({type:"origin"},this),this.nodes.push(o));const a="serialize"in t?t:z(t,this);if(o){if(!a.node)throw new Error("todo no node");const c=u({sourceNode:o,destinationNode:a.node,sourceNodeHandle:null},this);this.edges.push(c)}return this.conditionals.includes(a)||(this.conditionals.push(a),a.node&&this.nodes.push(a.node)),a},addExperience(t,i){let o=i?.node;this.nodes.length===0&&(o=h({type:"origin"},this),this.nodes.push(o));const a=h({type:"experience",experience:t},this);if(this.nodes.push(a),o){const c=u({sourceNode:o,destinationNode:a,sourceNodeHandle:null},this);this.edges.push(c)}return t},addField(t,i){const o="serialize"in t?t:N(t);return i&&i.fields.push(o),this.fields.includes(o)||this.fields.push(o),o},serialize(){return l.serialize({id:this.id,component:this.component,name:this.name,initializeOpen:this.initializeOpen,condition:this.condition??this.decide,decide:this.decide,targets:this.targets,steps:this.steps.map(t=>l.deserialize(t.serialize())),nodes:this.nodes.map(t=>l.deserialize(t.serialize())),edges:this.edges.map(t=>l.deserialize(t.serialize())),conditionals:this.conditionals.map(t=>l.deserialize(t.serialize())),fields:this.fields.map(t=>l.deserialize(t.serialize()))})}}};exports.createConditional=z;exports.createEdge=u;exports.createExperience=v;exports.createExperiencePlugin=m;exports.createField=N;exports.createNode=h;exports.createStep=x;exports.serialization=l;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const f=require("../../../id-BKIWbSTy.cjs"),r={serialize(e){return JSON.stringify(e)},deserialize(e){return JSON.parse(e)}},y=e=>({name:"create-experience",setup:o=>{e.experiences.forEach(s=>{const n=s.serialize(),d=r.deserialize(n);d.component=s.component,o.registerExperience(d),d.fields.forEach(g=>{o.registerField(g)})})}}),z=(e,o)=>({id:f.generateId("node"),position:[0,0],experience:o,type:"action",action:e.action,addNext(n){if(!n.node)throw new Error("Cannot connect to node");const d=h({sourceNode:this,destinationNode:n.node,sourceNodeHandle:null},o);o.edges.push(d)},onSuccess(n){if(!n.node)throw new Error("Cannot connect to node");const d=h({sourceNode:this,destinationNode:n.node,sourceNodeHandle:"true"},o);o.edges.push(d)},onFail(n){if(!n.node)throw new Error("Cannot connect to node");const d=h({sourceNode:this,destinationNode:n.node,sourceNodeHandle:"false"},o);o.edges.push(d)},serialize(){return r.serialize({id:this.id,type:this.type,action:this.action,position:this.position})}}),b=e=>({id:e.id??f.generateId("step"),label:e.label,fields:e.fields??[],addField(o){const s="serialize"in o?o:N(o);return this.fields?.includes(s)||this.fields?.push(s),s}}),v=(e,o)=>{const s={id:e.id??f.generateId("step"),label:e.label,experience:o,fields:e.fields??[],node:null,nextStep(n){return this.experience.addStep(n,this)},nextConditional(n){return this.experience.addConditional(n,this)},addNextExperience(n){return this.experience.addExperience(n,this)},addField(n){return this.experience.addField(n,this)},serialize(){return r.serialize({id:this.id,label:this.label,fieldIds:this.fields.map(n=>n.id)})}};return p({step:s,type:"step"},o),s},x=()=>[0,0],p=(e,o)=>{const s={id:f.generateId("node"),position:x(),experience:o};if(e.type==="step"){const d={...s,type:"step",connectedStep:e.step,serialize(){return r.serialize({id:this.id,type:this.type,stepId:this.connectedStep.id,position:this.position,label:this.connectedStep.label})}};return d.connectedStep.node=d,d}if(e.type==="conditional"){const d={...s,type:"conditional",connectedConditional:e.conditional,serialize(){return r.serialize({id:this.id,type:this.type,conditionalId:this.connectedConditional.id,position:this.position})}};return d.connectedConditional.node=d,d}return e.type==="experience"?{...s,type:"experience",connectedExperience:e.experience,serialize(){return r.serialize({id:this.id,type:this.type,experienceId:this.connectedExperience.id,position:this.position})}}:{...s,type:"origin",serialize(){return r.serialize({id:this.id,type:this.type,position:this.position})}}},h=(e,o)=>({id:f.generateId("edge"),sourceNode:e.sourceNode,sourceNodeHandle:e.sourceNodeHandle,destinationNode:e.destinationNode,experience:o,serialize(){return r.serialize({id:this.id,sourceNodeHandle:this.sourceNodeHandle??void 0,sourceNodeId:this.sourceNode.id,destinationNodeId:this.destinationNode.id})}}),m=(e,o)=>{const s={id:f.generateId("conditional"),condition:e.condition,node:null,experience:o,addTrue(n){if(!this.node||!n.node)throw new Error("todo no node");const d=h({sourceNode:this.node,destinationNode:n.node,sourceNodeHandle:"true"},this.experience);this.experience.edges.push(d)},addFalse(n){if(!this.node||!n.node)throw new Error("todo no node");const d=h({sourceNode:this.node,destinationNode:n.node,sourceNodeHandle:"false"},this.experience);this.experience.edges.push(d)},serialize(){return r.serialize({id:this.id,condition:this.condition})}};return p({conditional:s,type:"conditional"},o),s},N=e=>({id:e.id,name:e.name,type:e.type,label:e.label,placeholder:e.placeholder,description:e.description,helpText:e.helpText,defaultValue:e.defaultValue??null,multiple:e.multiple,validation:e.validation??{},condition:e.condition,required:e.required,options:e.options?.map(s=>({id:"id"in s?s.id:f.generateId("option"),...s}))??null,policies:e.policies,serialize(){const s={id:this.id,name:this.name,label:this.label,placeholder:this.placeholder,required:this.required,description:this.description,helpText:this.helpText,validation:this.validation,condition:this.condition,policies:this.policies},n=typeof this.defaultValue=="string"?this.defaultValue:void 0,d=typeof this.defaultValue=="number"?this.defaultValue:void 0,g=typeof this.defaultValue=="boolean"?this.defaultValue:void 0;switch(this.type){case"text":if(this.multiple){let t;if(Array.isArray(this.defaultValue)){t=[];for(const i of this.defaultValue)typeof i=="string"&&t.push(i);t.length===0&&(t=void 0)}return r.serialize({...s,type:"text",multiple:!0,defaultValue:t,options:this.options?this.options.map(i=>({id:i.id,label:i.label,value:`${i.value}`,condition:i.condition})):null})}return r.serialize({...s,type:"text",multiple:!1,defaultValue:n,options:this.options?this.options.map(t=>({id:t.id,label:t.label,value:`${t.value}`,condition:t.condition})):null});case"number":if(this.multiple){let t;if(Array.isArray(this.defaultValue)){t=[];for(const i of this.defaultValue)typeof i=="number"&&t.push(i);t.length===0&&(t=void 0)}return r.serialize({...s,type:"number",multiple:!0,defaultValue:t,options:this.options?this.options.map(i=>({id:i.id,label:i.label,value:Number(i.value),condition:i.condition})):null})}return r.serialize({...s,type:"number",multiple:!1,defaultValue:d,options:this.options?this.options.map(t=>({id:t.id,label:t.label,value:Number(t.value),condition:t.condition})):null});case"boolean":if(this.multiple){let t;if(Array.isArray(this.defaultValue)){t=[];for(const i of this.defaultValue)typeof i=="boolean"&&t.push(i);t.length===0&&(t=void 0)}return r.serialize({...s,type:"boolean",multiple:!0,defaultValue:t,options:this.options?this.options.map(i=>({id:i.id,label:i.label,value:!!i.value,condition:i.condition})):null})}return r.serialize({...s,type:"boolean",multiple:!1,defaultValue:g,options:this.options?this.options.map(t=>({id:t.id,label:t.label,value:!!t.value,condition:t.condition})):null});case"object":return this.multiple?r.serialize({...s,type:"object",multiple:!0,defaultValue:this.defaultValue,options:this.options?this.options.map(t=>({id:t.id,label:t.label,description:t.description,value:t.value,condition:t.condition})):null}):r.serialize({...s,type:"object",multiple:!1,defaultValue:this.defaultValue,options:this.options?this.options.map(t=>({id:t.id,label:t.label,description:t.description,value:t.value,condition:t.condition})):null});default:throw new Error("Unsupported field type")}}}),E=e=>{const o=[],s=[],n=[],d=[],g=[],t=e.condition??e.decide;return{id:e.id,component:e.component,name:e.name,initializeOpen:e.initializeOpen,condition:t,decide:e.decide,targets:e.targets,steps:o,nodes:s,edges:n,fields:g,conditionals:d,addStep(i,u){let l=u?.node;this.nodes.length===0&&(l=p({type:"origin"},this),this.nodes.push(l));const a="serialize"in i?i:v(i,this);if(l){if(!a.node)throw new Error("todo no node");const c=h({sourceNode:l,destinationNode:a.node,sourceNodeHandle:null},this);this.edges.push(c)}return a.fields.length>0&&a.fields.forEach(c=>{this.fields.includes(c)||this.fields.push(c)}),this.steps.includes(a)||(this.steps.push(a),a.node&&this.nodes.push(a.node)),a},addAction(i,u){let l=u?.node;this.nodes.length===0&&(l=p({type:"origin"},this),this.nodes.push(l));const a="serialize"in i?i:z(i,this);if(l){const c=h({sourceNode:l,destinationNode:a,sourceNodeHandle:null},this);this.edges.push(c)}return this.nodes.push(a),a},addConditional(i,u){let l=u?.node;this.nodes.length===0&&(l=p({type:"origin"},this),this.nodes.push(l));const a="serialize"in i?i:m(i,this);if(l){if(!a.node)throw new Error("todo no node");const c=h({sourceNode:l,destinationNode:a.node,sourceNodeHandle:null},this);this.edges.push(c)}return this.conditionals.includes(a)||(this.conditionals.push(a),a.node&&this.nodes.push(a.node)),a},addExperience(i,u){let l=u?.node;this.nodes.length===0&&(l=p({type:"origin"},this),this.nodes.push(l));const a=p({type:"experience",experience:i},this);if(this.nodes.push(a),l){const c=h({sourceNode:l,destinationNode:a,sourceNodeHandle:null},this);this.edges.push(c)}return i},addField(i,u){const l="serialize"in i?i:N(i);return u&&u.fields.push(l),this.fields.includes(l)||this.fields.push(l),l},serialize(){return r.serialize({id:this.id,component:this.component,name:this.name,initializeOpen:this.initializeOpen,condition:this.condition??this.decide,decide:this.decide,targets:this.targets,steps:this.steps.map(i=>r.deserialize(i.serialize())),nodes:this.nodes.map(i=>r.deserialize(i.serialize())),edges:this.edges.map(i=>r.deserialize(i.serialize())),conditionals:this.conditionals.map(i=>r.deserialize(i.serialize())),fields:this.fields.map(i=>r.deserialize(i.serialize()))})}}};exports.createConditional=m;exports.createEdge=h;exports.createExperience=E;exports.createExperiencePlugin=y;exports.createField=N;exports.createNode=p;exports.createStep=b;exports.serialization=r;
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const l=require("../../../api-DzSCgBQ2.cjs"),s=require("../../../logger-BsmHUUw1.cjs");function g(e){let r=2166136261;for(let n=0;n<e.length;n++)r^=e.charCodeAt(n),r=Math.imul(r,16777619);return r>>>0}function d(e,r,n,t){return t<=0?!1:t>=100?!0:g(`${e}:${r}:${n}`)%100<t}function p(e){return typeof e!="object"||e===null||!("id"in e&&"name"in e&&"enabled"in e&&"weight"in e&&"version"in e)?!1:typeof e.id=="string"&&typeof e.name=="string"&&typeof e.enabled=="boolean"&&typeof e.weight=="number"&&typeof e.version=="number"}function f(e){return typeof e!="object"||e===null||!("features"in e)||!Array.isArray(e.features)?!1:e.features.every(p)}function h(e){const r=e.searchParams["preview-token"];if(r&&r.length>0)return r[0]}function _(e){const r=new Set,n=e.searchParams.feature;if(!n)return r;for(const t of n){const i=t.indexOf(":");i>0&&r.add(t.substring(0,i))}return r}function u(e,r,n){const t=_(e),i=e.session?.id;if(!i)throw new Error("Session ID is required for feature registration");for(const o of r.features)t.has(o.id)||m(e,o,n,i)}function m(e,r,n,t){e.registerFeature(r.id,{key:`v${r.version}`,name:r.name,storage:n?"session":"local",decide:()=>r.enabled?d(t,r.id,r.version,r.weight):!1})}function y(){if(typeof __PICKED_PROJECT_CONFIG__>"u")return;let e;if(typeof __PICKED_PROJECT_CONFIG__=="string"?e=JSON.parse(__PICKED_PROJECT_CONFIG__):e=__PICKED_PROJECT_CONFIG__,f(e))return e;s.logger("warn","Build-time project config has invalid shape, falling back to runtime fetch")}async function c(e,r,n){const t=n?`projects/${r}?preview_token=${encodeURIComponent(n)}`:`projects/${r}`;let i;try{i=await l.get(e,t)}catch(a){return s.logger("warn","Failed to fetch project config",a),null}if(!i.ok)return s.logger("warn",`Project config request failed with status ${i.status.toString()}`),null;let o;try{o=await i.json()}catch{return s.logger("warn","Failed to parse project config response"),null}return f(o)?o:(s.logger("warn","Invalid project config response shape"),null)}function P(e){return{name:"dynamic-experiences",setup:r=>{const n=e?.apiUrl??r.apiUrl;return{onStart:async()=>{const t=h(r);if(t){const a=await c(n,r.projectId,t);a&&u(r,a,!0);return}const i=e?.projectConfig??y();if(i){u(r,i,!1);return}const o=await c(n,r.projectId);o&&u(r,o,!1)}}}}}exports.dynamicExperiencesPlugin=P;exports.fetchProject=c;