@picked/client 0.0.60 → 0.0.61-next.1

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.
@@ -8,7 +8,7 @@ function n(n, r) {
8
8
  }
9
9
  //#endregion
10
10
  //#region src/utils/version.ts
11
- var r = () => "0.0.60", i = "v1";
11
+ var r = () => "0.0.61-next.1", i = "v1";
12
12
  function a(e, t) {
13
13
  return new URL(`/api/${i}/${t}`, e).toString();
14
14
  }
@@ -0,0 +1 @@
1
+ var e=`Picked-Client`,t=`Picked-Version`;function n(n,r){return{[e]:n,[t]:r}}var r=()=>`0.0.61-next.1`,i=`v1`;function a(e,t){return new URL(`/api/${i}/${t}`,e).toString()}function o(e){return{...n(`sdk`,r()),...e}}async function s(e,t,n){let r=a(e,t);return fetch(r,{headers:o(n)})}async function c(e,t,n,r){let i=a(e,t);return fetch(i,{method:`POST`,headers:{"Content-Type":`application/json`,...o(r)},body:JSON.stringify(n)})}Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return n}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return c}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return r}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return s}});
package/dist/cjs/index.js CHANGED
@@ -1,4 +1,4 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../rules-logic-DNLOv90w.cjs`),t=require(`../object-CUJOjanb.cjs`),n=require(`../logger-fbvQC40v.cjs`),r=require(`../supports-Dsjg-82e.cjs`),i=require(`../experience-instance-DC2gKwA6.cjs`),a=require(`../storage-B6lQtc4-.cjs`),o=require(`../api-CdXeZIE2.cjs`),s=require(`../id-Bv44ilEo.cjs`);let c=require(`effector`),l=require(`@withease/factories`);var u=(0,c.createDomain)(`experience`),d=(0,l.createFactory)(({client:e,experience:t})=>{let n=u.store(t),r=(0,c.createApi)(n,{merge(e,t){return{...e,...t.experience}}}),a=n.map(e=>({name:e.name,decisionLogic:e.condition,targetSelectors:e.targets,initializeOpenLogic:e.initializeOpen})),o=(0,c.combine)(n,e.components.listStore,(e,t)=>(e.componentName?t.find(t=>t.name===e.componentName):void 0)||t.find(t=>t.name===`experience:${e.id}`)||t.find(e=>e.name===`experience`),{skipVoid:!1}),s=(0,c.combine)(n,e.steps.indexStore,e.conditions.indexStore,(e,t,n)=>{let r=e.nodes.filter(i.i).map(e=>t[e.stepId]).filter(e=>e!==void 0),a=e.nodes.filter(i.r).map(e=>n[e.conditionId]).filter(e=>e!==void 0);return{steps:r,nodes:e.nodes,edges:e.edges,conditions:a}}),l=t.actions??[];return{id:t.id,key:t.key,name:t.name,configStore:a,treeStore:s,componentStore:o,actions:l,merge:r.merge}});function f(e){return(0,l.invoke)(d,e)}var p=(0,l.createFactory)(({client:e})=>{let t=u.store({}),n=(0,c.createApi)(t,{register(e,t){return{...e,[t.id]:t}}});function r(r){let i=t.getState()[r.id];if(i){i.merge({experience:r,strategy:`override`});return}let a=f({client:e,experience:r});n.register(a)}let i=t.map(e=>Object.values(e));function a(e){return t.map(t=>t[e],{skipVoid:!1})}function o(e){return t.map(t=>Object.values(t).find(t=>t.key===e)??t[e],{skipVoid:!1})}let s=(0,c.attach)({source:t,effect:async(t,n)=>{let r=`key`in n?Object.values(t).find(e=>e.key===n.key):t[n.id];if(!r){`key`in n?`${n.key}`:`${n.id}`;return}let{options:i}=n;if(i?.bypassCondition){h(e,r,i);return}await _(e,r)&&h(e,r,i)}});return{register:r,get:a,getById:a,getByKey:o,launch:s,open:(0,c.attach)({source:{experiences:t,instances:e.experienceInstances.listStore},effect:({experiences:e,instances:t},n)=>{let r=`key`in n?Object.values(e).find(e=>e.key===n.key):e[n.id],i=t.filter(e=>r&&e.experienceId===r.id);if(i.length>0)for(let e of i)e.open();else s(`key`in n?{key:n.key,options:{...n.options,initialiseOpen:!0}}:{id:n.id,options:{...n.options,initialiseOpen:!0}})}}),listStore:i}});function m(e){return(0,l.invoke)(p,e)}var h=(e,t,n)=>{let{targetSelectors:r}=t.configStore.getState(),a=i.s(r,t.id);a.forEach(({elements:e})=>e.forEach(e=>i.l(e,t.id))),i.a(a,t.id,t.key).forEach(r=>{n?e.experienceInstances.spawn(t,r,n):e.experienceInstances.spawn(t,r)})},g=async e=>{await Promise.all(e.experiences.listStore.getState().map(async t=>{await _(e,t)&&h(e,t)}))},_=async(t,n)=>{if(!t.preconditionPassed||!t.session?.isUser)return!1;let{decisionLogic:r,targetSelectors:a}=n.configStore.getState();return i.s(a,n.id).length<1||a.length===0?!1:r===void 0?!0:e.n(r)?await e.t(t,r)===!0:!0},v=(e,t,n)=>{let r=t.name,i=t.setup(e);if(i){let e=n[r]??{};n[r]=Object.freeze({...e,...i})}},ee=(0,c.createDomain)(`component`),y=(0,l.createFactory)(({client:e,component:t,name:n})=>({name:n,component:t,frameworkStore:e.frameworks.getByName(t.frameworkName)}));function b(e){return(0,l.invoke)(y,e)}var x=(0,l.createFactory)(({client:e})=>{let t=ee.store({}),n=(0,c.createApi)(t,{register(e,t){return{...e,[t.name]:t}}});function r(r,i){t.getState()[r]&&`${r}`;let a=b({client:e,name:r,component:i});n.register(a)}let i=t.map(e=>Object.values(e));function a(e){return t.map(t=>t[e],{skipVoid:!1})}return{register:r,getByName:a,listStore:i}});function S(e){return(0,l.invoke)(x,e)}var C=(e,t,n)=>{n.register(e,t)},te=(0,c.createDomain)(`framework`),ne=(0,l.createFactory)(({client:e})=>{let t=te.store({}),n=(0,c.createApi)(t,{register(e,t){return{...e,[t.name]:t.framework}}});function r(e,r){t.getState()[e]&&`${e}`,n.register({name:e,framework:r})}let i=t.map(e=>Object.values(e));function a(e){return t.map(t=>t[e],{skipVoid:!1})}return{register:r,getByName:a,listStore:i}});function re(e){return(0,l.invoke)(ne,e)}var ie=(e,t)=>{t.register(e.name,e)},ae=6e3,oe=a.t(`last_ping`,`global`),se=async e=>{try{let t=Date.now(),n=a.n.get(oe),r=0;if(n.isSet()&&(r=n.json()??0),r&&t-r<ae)return!0;let i={projectId:e.projectId,path:window.location.pathname},s={},c=document.getElementById(`picked_script`)?.dataset.verceltoken;c&&(s[`x-vercel-protection-bypass`]=c);let l=(await o.n(e.apiUrl,`ping`,i,s)).ok;return l&&n.set(t),l}catch{return!1}};function w(e){let t=typeof window<`u`,n={client:e,responses:e.responses.listStore.getState(),fields:e.fields.listStore.getState(),location:t?window.location:void 0,document:t?window.document:void 0,sessionStorage:t?window.sessionStorage:void 0,localStorage:t?window.localStorage:void 0};return Object.freeze(n)}var T=(0,c.createDomain)(`predicate`),E=(0,l.createFactory)(({client:e})=>{let t=T.store({}),n=(0,c.createApi)(t,{register(e,t){return{...e,[t.name]:{name:t.name,predicate:t.predicate}}}});function r(e,r){t.getState()[e]&&`${e}`,n.register(Object.freeze({name:e,predicate:r}))}let i=t.map(e=>Object.values(e));function a(e){return t.map(t=>t[e]?.predicate,{skipVoid:!1})}function o(t){let n=(0,c.createStore)(()=>void 0,{skipVoid:!1}),r=(0,c.createEffect)(async()=>{let n=a(t).getState();if(!n)return;let r=w(e);return(...e)=>n({...r,args:e})});return(0,c.sample)({source:{responses:e.responses.listStore,fields:e.fields.listStore},target:r}),(0,c.sample)({clock:r.doneData,filter:e=>e!==void 0,target:n}),r(),n}return{register:r,getByName:a,listStore:i,getEvokablePredicate:o}});function D(e){return(0,l.invoke)(E,e)}var O=(e,t,n)=>{n.register(e,t)},k=(0,c.createDomain)(`feature`),A=(0,l.createFactory)(({client:e})=>{let t=k.store({}),n=k.store([]),r=(0,c.createApi)(t,{register(e,t){return{...e,[t.id]:t.feature}}});function i(e,n){t.getState()[e]&&`${e}`;let i={id:e,feature:{...n,id:e}};r.register(Object.freeze({id:e,feature:i}))}let o=(0,c.createEffect)(async({id:e,key:t,storage:n=`local`})=>{let r=a.t(`feature:${e}:${t}`,`global`),i=(n===`session`?a.r:a.n).get(r).boolean();return i===null?null:{id:e,key:t,bucket:i,storage:n}}),s=(0,c.createEffect)(e=>{if(!e)return null;let t=a.t(`feature:${e.id}:${e.key}`,`global`);(e.storage===`session`?a.r:a.n).set(t,e.bucket)}),l=new Map,u=(0,c.attach)({source:{allFeaturesStore:t,resolvedFeaturesStore:n},effect:async({allFeaturesStore:e,resolvedFeaturesStore:t},{id:n,decide:r,key:i})=>{let a=t.find(e=>e.id===n&&e.key===i);if(a)return a;let o=e[n];if(!o)throw Error(`Feature with id '${n}' not found`);let s=l.get(`${n}:${i}`);if(s!==void 0){let e=await s;return{id:o.id,bucket:e,key:i,storage:o.feature.storage}}let c=r();l.set(`${n}:${i}`,c);let u=await c;return{id:o.id,bucket:u,key:i,storage:o.feature.storage}}});(0,c.sample)({clock:r.register,fn:e=>{let{id:t,feature:n}=e;return{id:t,key:n.feature.key,storage:n.feature.storage}},target:o}),(0,c.sample)({source:t,clock:u.doneData,fn:(e,t)=>{let{id:n,bucket:r,storage:i}=t,a=e[n]?.feature.key;return a?{key:a,id:n,bucket:r,storage:i}:null},target:s});let d=(0,c.combine)({allFeaturesStore:t,resolvedFeaturesStore:n}).map(({allFeaturesStore:e,resolvedFeaturesStore:t})=>Object.values(e).map(e=>{let n=t.find(t=>t.id===e.id&&t.key===e.feature.key);return n?{id:e.id,name:e.feature.name,key:e.feature.key,getBucket:()=>({id:e.id,bucket:n.bucket}),isResolved:!0}:{id:e.id,name:e.feature.name,key:e.feature.key,getBucket:async()=>await u(e.feature),isResolved:!1}}));(0,c.sample)({clock:u.doneData,source:{resolvedFeatures:n},filter:({resolvedFeatures:e},{id:t,key:n})=>!e.some(e=>e.id===t&&e.key===n),fn:(e,t)=>t,target:e.eventBus.prepend(e=>({type:`feature_decide`,feature:e}))}),(0,c.sample)({clock:[o.doneData,u.doneData],source:n,fn:(e,t)=>!t||e.some(e=>e.id===t.id&&e.key===t.key)?e:[...e,t],target:n});function f(e){return d.map(t=>t.find(t=>t.id===e))}function p(e){return t.map(t=>t[e],{skipVoid:!1})}function m(e){let t=(0,c.createStore)(async()=>void 0,{skipVoid:!1}),r=(0,c.createEffect)(async()=>{let t=f(e).getState();if(t)return async()=>(await t.getBucket()).bucket});return(0,c.sample)({source:n,filter:t=>t.some(t=>t.id===e),target:r}),(0,c.sample)({clock:r.doneData,filter:e=>e!==void 0,target:t}),r(),t}return{register:i,getById:f,getByName:p,listStore:d,getEvokableFeature:m}});function j(e){return(0,l.invoke)(A,e)}var M=(e,t,n)=>{n.register(e,t)},N=(0,c.createDomain)(`history`);function P(e,t){return{id:s.t(`history-entry-${Date.now()}-${Math.random()}}`),node:t,at:Date.now(),experienceId:e}}var F=(0,l.createFactory)(()=>{let e=N.store({entries:[]}),t=N.event(),n=N.event(),r=N.event(),a=N.event();e.on(t,(e,t)=>({entries:[...e.entries,P(t.experienceId,t.node)]})),e.on(n,(e,t)=>({entries:[...e.entries.slice(0,-1),P(t.experienceId,t.node)]})),e.on(a,(e,t)=>t);function o(e,t){let n={lastStepIndex:-1,secondLastStepIndex:-1};for(let r=e.length-1;r>=0;r--){let a=e[r],o=a?.node;if(!(!o||!i.i(o))&&!(t&&a.experienceId!==t))if(n.lastStepIndex===-1)n.lastStepIndex=r;else{n.secondLastStepIndex=r;break}}return n}return e.on(r,(e,t)=>{let{secondLastStepIndex:n}=o(e.entries,t.experienceId),r=n===-1?e.entries:e.entries.slice(0,n+1);return{...e,entries:r}}),{push:t,replace:n,back:r,restore:a,entriesStore:e.map(e=>e.entries)}});function I(){return(0,l.invoke)(F)}var L=0,R=e=>{let t=(0,c.createStore)([]);return(0,c.sample)({clock:e,source:t,fn:(e,t)=>[...e,{id:L++,at:new Date,payload:t}],target:t}),t},z=(0,c.createDomain)(`field`),B=(0,l.createFactory)(()=>{let e=z.store({}),t=(0,c.createApi)(e,{register(e,t){return{...e,[t.field.id]:t.field}},updateByKey(e,t){let n=Object.values(e).find(e=>e.key===t.fieldKey);return n?{...e,[n.id]:Object.assign({},n,t.updates)}:e}});function n(e){t.register({field:e})}function r(n,r){let i=e.getState(),a=Object.values(i).find(e=>e.key===n)?.key;a&&t.updateByKey({fieldKey:a,updates:r})}let i=e.map(e=>Object.values(e));function a(t){return e.map(e=>e[t]??null,{skipVoid:!1})}function o(t){return e.map(e=>Object.values(e).find(e=>e.key===t)??null,{skipVoid:!1})}function s(t){return e.map(e=>Object.values(e).find(e=>e.name===t)??null,{skipVoid:!1})}return{register:n,update:r,getById:a,getByKey:o,listStore:i,getByName:s}});function V(){return(0,l.invoke)(B)}var H=(0,c.createDomain)(`step`),U=(0,l.createFactory)(()=>{let e=H.store({}),t=(0,c.createApi)(e,{register(e,t){return{...e,[t.step.id]:t.step}}});function n(e){t.register({step:e})}let r=e.map(e=>Object.values(e));function i(t){return e.map(e=>e[t]??null,{skipVoid:!1})}function a(t){return e.map(e=>Object.values(e).find(e=>e.key===t)??null,{skipVoid:!1})}return{register:n,getById:i,getByKey:a,listStore:r,indexStore:e}});function W(){return(0,l.invoke)(U)}function G(e,t){t.register(e)}var K=(0,c.createDomain)(`action`),ce=(0,l.createFactory)(({client:e})=>{let t=K.store({}),n=(0,c.createApi)(t,{register(e,t){return{...e,[t.key]:{key:t.key,action:t.action}}}});function r(e,r){t.getState()[e]&&`${e}`,n.register(Object.freeze({key:e,action:r}))}let i=t.map(e=>Object.values(e));function a(e){return t.map(t=>t[e]?.action,{skipVoid:!1})}function o(t,n){let r=(0,c.createStore)(()=>void 0,{skipVoid:!1}),i=n?{experience:n.experience}:null,o=(0,c.createEffect)(async()=>{let n=a(t).getState();if(!n)return;let r=w(e);return(...e)=>n({...r,args:e},i)});return(0,c.sample)({source:{responses:e.responses.listStore,fields:e.fields.listStore},target:o}),(0,c.sample)({clock:o.doneData,filter:e=>e!==void 0,target:r}),o(),r}return{register:r,getByKey:a,listStore:i,getEvokableAction:o}});function le(e){return(0,l.invoke)(ce,e)}var ue=(e,t,n)=>{n.register(e,t)};function q(e,t,n,r){return{fieldKey:e.key,userMessage:n,systemMessage:r,value:t}}function J(e){return e==null||e===``||Array.isArray(e)&&!e.length}function de(e){return typeof e==`string`||typeof e==`number`||typeof e==`boolean`||e===null}function Y(e){try{return JSON.stringify(e),!0}catch{return!1}}function fe(e,t){return t.find(t=>t.key===e)??null}function pe(e,t){return e.multiple&&(typeof t==`string`||typeof t==`number`||typeof t==`boolean`)?[t]:t}function me(e,t){if(e.type!==`object`||J(t))return null;if(e.multiple){if(!Array.isArray(t))return q(e,t,`This field expects multiple values`,`Field expects an array of objects.`);for(let n of t){if(typeof n!=`object`||!n)return q(e,t,`This field expects object values`,`Field expects an array of objects, but received non-object value.`);if(!Y(n))return q(e,t,`This field contains non-serializable data`,`Field value contains non-JSON-serializable data (functions, circular references, etc.).`)}return null}return Array.isArray(t)?q(e,t,`This field expects a single value`,`Field expects a single object, not an array.`):typeof t!=`object`||!t?q(e,t,`This field expects an object value`,`Field expects an object value.`):Y(t)?null:q(e,t,`This field contains non-serializable data`,`Field value contains non-JSON-serializable data (functions, circular references, etc.).`)}function he(e,t){if(!Array.isArray(e.options)||e.options.length===0)return null;let n=Array.isArray(t)?t:[t];if(e.type===`object`){let r=e.options.map(e=>JSON.stringify(e.value));return n.every(e=>r.includes(JSON.stringify(e)))?null:q(e,t,`This field expects a valid option`,`Field expects a valid option from the defined choices.`)}let r=e.options.map(e=>e.value);return n.every(e=>!de(e)||e===null?!1:r.includes(e))?null:q(e,t,`This field expects a valid option`,`Field expects a valid option. Valid options are: ${r.join(`, `)}`)}async function ge(e,n,r,i){if(n.validation&&!t.t(n.validation)&&!J(r)){let t=i?{$input:r,responses:i}:{$input:r},a=await e(n.validation,t);if(typeof a==`string`)return q(n,r,a,`Field validation resulted in an error: ${a}.`);if(a===!1)return q(n,r,`This field is invalid`,`Field validation resulted in an unspecified error.`)}return n.required&&J(r)?q(n,r,`This field is required`,`Field is required.`):!n.multiple&&Array.isArray(r)&&r.length>1?q(n,r,`This field expects a single response`,`Field expects a single response.`):null}var _e=(0,c.createDomain)(`response`),ve=(0,l.createFactory)(({client:t})=>{let n=_e.store({}),r=(0,c.createEvent)(),i=(0,c.createEvent)(),a=(0,c.createApi)(n,{register(e,t){return{...e,[t.fieldKey]:t.response}},registerBatch(e,t){return{...e,...t}},clear(e,t){return Object.fromEntries(Object.entries(e).filter(([e])=>e!==t))},clearAll(){return{}}});function o(e,t){if(typeof e==`string`){if(t===void 0)throw Error(`Response is required when registering a single field`);a.register({fieldKey:e,response:t})}else a.registerBatch(e)}let s=(n,r)=>e.t(t,n,r),l=(0,c.attach)({source:{allFields:t.fields.listStore,existingResponses:n},effect:async({allFields:e,existingResponses:t},n)=>{let r=[],i={},a={...t,...n},o=Object.entries(n),c=await Promise.allSettled(o.map(async([t,n])=>{let o=fe(t,e);if(!o){r.push({fieldKey:t,userMessage:`Field '${t}' not found`,systemMessage:`No field with key '${t}' exists. Available field keys are: ${e.map(e=>e.key).join(`,`)}.`,value:n});return}let c=pe(o,n),l=await ge(s,o,c,a);if(l){r.push(l);return}let u=me(o,c);if(u){r.push(u);return}let d=he(o,c);if(d){r.push(d);return}i[o.key]=n}));for(let[e,t]of c.entries()){if(t.status!==`rejected`)continue;let n=o[e];if(!n)continue;let[i,a]=n,s=t.reason instanceof Error?t.reason.message:String(t.reason);r.push({fieldKey:i,userMessage:`An unexpected error occurred validating this field`,systemMessage:`Validation threw for field '${i}': ${s}`,value:a})}return{responsesToCommit:i,validationErrors:r}}});async function u(e){return l(e)}let d=(0,c.attach)({source:n,effect:async(e,t)=>{let{responsesToCommit:n,validationErrors:r}=await l(t);return r.length?{errors:r}:(a.registerBatch(n),{errors:[]})}});async function f(e){return d(e)}let p=n.map(e=>e),m=n.map(e=>Object.entries(e).map(([e,t])=>({fieldKey:e,value:t})));function h(e){return(0,c.combine)({f:e,s:n},({f:e,s:t})=>{let n=e?t[e.key]??null:null;return n===null?e?.defaultValue!==void 0&&e.defaultValue!==null?e.defaultValue:null:n})}function g(e){return h(t.fields.getById(e))}function _(e){return h(t.fields.getByKey(e))}function v(e){return h(t.fields.getByName(e))}return(0,c.sample)({clock:r,target:a.clearAll}),(0,c.sample)({clock:i,target:a.clear}),{register:o,clearAll:r,clear:i,commit:f,getResponsesToCommit:u,listStore:m,getAllStore:p,getByFieldId:g,getByFieldKey:_,getByFieldName:v}});function ye(e){return(0,l.invoke)(ve,e)}var be=(0,c.createDomain)(`condition`),xe=(0,l.createFactory)(()=>{let e=be.store({}),t=(0,c.createApi)(e,{register(e,t){return{...e,[t.condition.id]:t.condition}}});function n(e){t.register({condition:e})}let r=e.map(e=>Object.values(e));function i(t){return e.map(e=>e[t]??null,{skipVoid:!1})}function a(t){return e.map(e=>Object.values(e).find(e=>e.key===t)??null,{skipVoid:!1})}return{register:n,getById:i,getByKey:a,listStore:r,indexStore:e}});function Se(){return(0,l.invoke)(xe)}function Ce(){if(r.r()){let e=[document.currentScript,document.getElementById(`picked_script`),document.getElementById(`picked`),document.getElementById(`cvly`),document.getElementById(`cvly-x`)];for(let t of e)if(t?.dataset.api)return t.dataset.api}return`https://api.picked.app`}function we(){if(!r.d())return{};let e=new URLSearchParams(window.location.search),t={},n=new Set;for(let[t]of e.entries())t.startsWith(`picked-`)&&n.add(t);for(let r of n){let n=r.replace(`picked-`,``);t[n]=e.getAll(r)}let i=a.t(`s`);if(n.size>0)a.r.set(i,t);else{let e=a.r.get(i);if(e)return e.json()||{}}return t}function Te(){return r.n()?crypto.randomUUID():`${Date.now().toString(36)}-${Math.random().toString(36).substring(2,15)}-${Math.random().toString(36).substring(2,15)}-${Math.random().toString(36).substring(2,15)}`}var Ee=a.t(`session`,`global`),De=()=>{let e=a.n.get(Ee),t;e.isSet()&&(t=e.json());let n=t=>e.set({id:t.id,isUser:t.isUser,identifiers:t.identifiers}),r={id:t?.id??Te(),isUser:t?.isUser??void 0,identifiers:t?.identifiers??void 0,setIsUser(e){this.isUser=e,n(this)},setIdentifier(e,t){this.identifiers={...this.identifiers,[e]:t},n(this)},removeIdentifier(e){this.identifiers&&(this.identifiers=Object.fromEntries(Object.entries(this.identifiers).filter(([t])=>t!==e)),this.identifiers=Object.keys(this.identifiers).length?this.identifiers:void 0,n(this))}};return n(r),r},Oe=()=>r.o()?De():null;function X(){if(r.d())return globalThis.window.pickedConfig}function ke(){if(!r.d())return;let e=X(),t=e?.organizationId,n=e?.projectId;return t&&n?{organizationId:t,projectId:n}:void 0}function Z(){if(!r.r())return;let e=document.getElementById(`picked_script`)||document.querySelector(`script#picked`)||document.getElementById(`cvly`);if(!e)return;let t=e.dataset.organizationid||e.getAttribute(`organization-id`),n=e.dataset.projectid||e.getAttribute(`project-id`);return t&&n?{organizationId:t,projectId:n}:void 0}function Ae(e){let{organizationId:t,projectId:n}=e;if(t&&n)return{organizationId:t,projectId:n};let r=ke();if(r)return r;let i=Z();if(i)return i;throw Error(`organizationId and projectId are required. You can provide them via one of:
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../rules-logic-DNLOv90w.cjs`),t=require(`../object-CUJOjanb.cjs`),n=require(`../logger-fbvQC40v.cjs`),r=require(`../supports-Dsjg-82e.cjs`),i=require(`../experience-instance-DC2gKwA6.cjs`),a=require(`../storage-B6lQtc4-.cjs`),o=require(`../api-DlB-NTWc.cjs`),s=require(`../id-Bv44ilEo.cjs`);let c=require(`effector`),l=require(`@withease/factories`);var u=(0,c.createDomain)(`experience`),d=(0,l.createFactory)(({client:e,experience:t})=>{let n=u.store(t),r=(0,c.createApi)(n,{merge(e,t){return{...e,...t.experience}}}),a=n.map(e=>({name:e.name,decisionLogic:e.condition,targetSelectors:e.targets,initializeOpenLogic:e.initializeOpen})),o=(0,c.combine)(n,e.components.listStore,(e,t)=>(e.componentName?t.find(t=>t.name===e.componentName):void 0)||t.find(t=>t.name===`experience:${e.id}`)||t.find(e=>e.name===`experience`),{skipVoid:!1}),s=(0,c.combine)(n,e.steps.indexStore,e.conditions.indexStore,(e,t,n)=>{let r=e.nodes.filter(i.i).map(e=>t[e.stepId]).filter(e=>e!==void 0),a=e.nodes.filter(i.r).map(e=>n[e.conditionId]).filter(e=>e!==void 0);return{steps:r,nodes:e.nodes,edges:e.edges,conditions:a}}),l=t.actions??[];return{id:t.id,key:t.key,name:t.name,configStore:a,treeStore:s,componentStore:o,actions:l,merge:r.merge}});function f(e){return(0,l.invoke)(d,e)}var p=(0,l.createFactory)(({client:e})=>{let t=u.store({}),n=(0,c.createApi)(t,{register(e,t){return{...e,[t.id]:t}}});function r(r){let i=t.getState()[r.id];if(i){i.merge({experience:r,strategy:`override`});return}let a=f({client:e,experience:r});n.register(a)}let i=t.map(e=>Object.values(e));function a(e){return t.map(t=>t[e],{skipVoid:!1})}function o(e){return t.map(t=>Object.values(t).find(t=>t.key===e)??t[e],{skipVoid:!1})}let s=(0,c.attach)({source:t,effect:async(t,n)=>{let r=`key`in n?Object.values(t).find(e=>e.key===n.key):t[n.id];if(!r){`key`in n?`${n.key}`:`${n.id}`;return}let{options:i}=n;if(i?.bypassCondition){h(e,r,i);return}await _(e,r)&&h(e,r,i)}});return{register:r,get:a,getById:a,getByKey:o,launch:s,open:(0,c.attach)({source:{experiences:t,instances:e.experienceInstances.listStore},effect:({experiences:e,instances:t},n)=>{let r=`key`in n?Object.values(e).find(e=>e.key===n.key):e[n.id],i=t.filter(e=>r&&e.experienceId===r.id);if(i.length>0)for(let e of i)e.open();else s(`key`in n?{key:n.key,options:{...n.options,initialiseOpen:!0}}:{id:n.id,options:{...n.options,initialiseOpen:!0}})}}),listStore:i}});function m(e){return(0,l.invoke)(p,e)}var h=(e,t,n)=>{let{targetSelectors:r}=t.configStore.getState(),a=i.s(r,t.id);a.forEach(({elements:e})=>e.forEach(e=>i.l(e,t.id))),i.a(a,t.id,t.key).forEach(r=>{n?e.experienceInstances.spawn(t,r,n):e.experienceInstances.spawn(t,r)})},g=async e=>{await Promise.all(e.experiences.listStore.getState().map(async t=>{await _(e,t)&&h(e,t)}))},_=async(t,n)=>{if(!t.preconditionPassed||!t.session?.isUser)return!1;let{decisionLogic:r,targetSelectors:a}=n.configStore.getState();return i.s(a,n.id).length<1||a.length===0?!1:r===void 0?!0:e.n(r)?await e.t(t,r)===!0:!0},v=(e,t,n)=>{let r=t.name,i=t.setup(e);if(i){let e=n[r]??{};n[r]=Object.freeze({...e,...i})}},ee=(0,c.createDomain)(`component`),y=(0,l.createFactory)(({client:e,component:t,name:n})=>({name:n,component:t,frameworkStore:e.frameworks.getByName(t.frameworkName)}));function b(e){return(0,l.invoke)(y,e)}var x=(0,l.createFactory)(({client:e})=>{let t=ee.store({}),n=(0,c.createApi)(t,{register(e,t){return{...e,[t.name]:t}}});function r(r,i){t.getState()[r]&&`${r}`;let a=b({client:e,name:r,component:i});n.register(a)}let i=t.map(e=>Object.values(e));function a(e){return t.map(t=>t[e],{skipVoid:!1})}return{register:r,getByName:a,listStore:i}});function S(e){return(0,l.invoke)(x,e)}var C=(e,t,n)=>{n.register(e,t)},te=(0,c.createDomain)(`framework`),ne=(0,l.createFactory)(({client:e})=>{let t=te.store({}),n=(0,c.createApi)(t,{register(e,t){return{...e,[t.name]:t.framework}}});function r(e,r){t.getState()[e]&&`${e}`,n.register({name:e,framework:r})}let i=t.map(e=>Object.values(e));function a(e){return t.map(t=>t[e],{skipVoid:!1})}return{register:r,getByName:a,listStore:i}});function re(e){return(0,l.invoke)(ne,e)}var ie=(e,t)=>{t.register(e.name,e)},ae=6e3,oe=a.t(`last_ping`,`global`),se=async e=>{try{let t=Date.now(),n=a.n.get(oe),r=0;if(n.isSet()&&(r=n.json()??0),r&&t-r<ae)return!0;let i={projectId:e.projectId,path:window.location.pathname},s={},c=document.getElementById(`picked_script`)?.dataset.verceltoken;c&&(s[`x-vercel-protection-bypass`]=c);let l=(await o.n(e.apiUrl,`ping`,i,s)).ok;return l&&n.set(t),l}catch{return!1}};function w(e){let t=typeof window<`u`,n={client:e,responses:e.responses.listStore.getState(),fields:e.fields.listStore.getState(),location:t?window.location:void 0,document:t?window.document:void 0,sessionStorage:t?window.sessionStorage:void 0,localStorage:t?window.localStorage:void 0};return Object.freeze(n)}var T=(0,c.createDomain)(`predicate`),E=(0,l.createFactory)(({client:e})=>{let t=T.store({}),n=(0,c.createApi)(t,{register(e,t){return{...e,[t.name]:{name:t.name,predicate:t.predicate}}}});function r(e,r){t.getState()[e]&&`${e}`,n.register(Object.freeze({name:e,predicate:r}))}let i=t.map(e=>Object.values(e));function a(e){return t.map(t=>t[e]?.predicate,{skipVoid:!1})}function o(t){let n=(0,c.createStore)(()=>void 0,{skipVoid:!1}),r=(0,c.createEffect)(async()=>{let n=a(t).getState();if(!n)return;let r=w(e);return(...e)=>n({...r,args:e})});return(0,c.sample)({source:{responses:e.responses.listStore,fields:e.fields.listStore},target:r}),(0,c.sample)({clock:r.doneData,filter:e=>e!==void 0,target:n}),r(),n}return{register:r,getByName:a,listStore:i,getEvokablePredicate:o}});function D(e){return(0,l.invoke)(E,e)}var O=(e,t,n)=>{n.register(e,t)},k=(0,c.createDomain)(`feature`),A=(0,l.createFactory)(({client:e})=>{let t=k.store({}),n=k.store([]),r=(0,c.createApi)(t,{register(e,t){return{...e,[t.id]:t.feature}}});function i(e,n){t.getState()[e]&&`${e}`;let i={id:e,feature:{...n,id:e}};r.register(Object.freeze({id:e,feature:i}))}let o=(0,c.createEffect)(async({id:e,key:t,storage:n=`local`})=>{let r=a.t(`feature:${e}:${t}`,`global`),i=(n===`session`?a.r:a.n).get(r).boolean();return i===null?null:{id:e,key:t,bucket:i,storage:n}}),s=(0,c.createEffect)(e=>{if(!e)return null;let t=a.t(`feature:${e.id}:${e.key}`,`global`);(e.storage===`session`?a.r:a.n).set(t,e.bucket)}),l=new Map,u=(0,c.attach)({source:{allFeaturesStore:t,resolvedFeaturesStore:n},effect:async({allFeaturesStore:e,resolvedFeaturesStore:t},{id:n,decide:r,key:i})=>{let a=t.find(e=>e.id===n&&e.key===i);if(a)return a;let o=e[n];if(!o)throw Error(`Feature with id '${n}' not found`);let s=l.get(`${n}:${i}`);if(s!==void 0){let e=await s;return{id:o.id,bucket:e,key:i,storage:o.feature.storage}}let c=r();l.set(`${n}:${i}`,c);let u=await c;return{id:o.id,bucket:u,key:i,storage:o.feature.storage}}});(0,c.sample)({clock:r.register,fn:e=>{let{id:t,feature:n}=e;return{id:t,key:n.feature.key,storage:n.feature.storage}},target:o}),(0,c.sample)({source:t,clock:u.doneData,fn:(e,t)=>{let{id:n,bucket:r,storage:i}=t,a=e[n]?.feature.key;return a?{key:a,id:n,bucket:r,storage:i}:null},target:s});let d=(0,c.combine)({allFeaturesStore:t,resolvedFeaturesStore:n}).map(({allFeaturesStore:e,resolvedFeaturesStore:t})=>Object.values(e).map(e=>{let n=t.find(t=>t.id===e.id&&t.key===e.feature.key);return n?{id:e.id,name:e.feature.name,key:e.feature.key,getBucket:()=>({id:e.id,bucket:n.bucket}),isResolved:!0}:{id:e.id,name:e.feature.name,key:e.feature.key,getBucket:async()=>await u(e.feature),isResolved:!1}}));(0,c.sample)({clock:u.doneData,source:{resolvedFeatures:n},filter:({resolvedFeatures:e},{id:t,key:n})=>!e.some(e=>e.id===t&&e.key===n),fn:(e,t)=>t,target:e.eventBus.prepend(e=>({type:`feature_decide`,feature:e}))}),(0,c.sample)({clock:[o.doneData,u.doneData],source:n,fn:(e,t)=>!t||e.some(e=>e.id===t.id&&e.key===t.key)?e:[...e,t],target:n});function f(e){return d.map(t=>t.find(t=>t.id===e))}function p(e){return t.map(t=>t[e],{skipVoid:!1})}function m(e){let t=(0,c.createStore)(async()=>void 0,{skipVoid:!1}),r=(0,c.createEffect)(async()=>{let t=f(e).getState();if(t)return async()=>(await t.getBucket()).bucket});return(0,c.sample)({source:n,filter:t=>t.some(t=>t.id===e),target:r}),(0,c.sample)({clock:r.doneData,filter:e=>e!==void 0,target:t}),r(),t}return{register:i,getById:f,getByName:p,listStore:d,getEvokableFeature:m}});function j(e){return(0,l.invoke)(A,e)}var M=(e,t,n)=>{n.register(e,t)},N=(0,c.createDomain)(`history`);function P(e,t){return{id:s.t(`history-entry-${Date.now()}-${Math.random()}}`),node:t,at:Date.now(),experienceId:e}}var F=(0,l.createFactory)(()=>{let e=N.store({entries:[]}),t=N.event(),n=N.event(),r=N.event(),a=N.event();e.on(t,(e,t)=>({entries:[...e.entries,P(t.experienceId,t.node)]})),e.on(n,(e,t)=>({entries:[...e.entries.slice(0,-1),P(t.experienceId,t.node)]})),e.on(a,(e,t)=>t);function o(e,t){let n={lastStepIndex:-1,secondLastStepIndex:-1};for(let r=e.length-1;r>=0;r--){let a=e[r],o=a?.node;if(!(!o||!i.i(o))&&!(t&&a.experienceId!==t))if(n.lastStepIndex===-1)n.lastStepIndex=r;else{n.secondLastStepIndex=r;break}}return n}return e.on(r,(e,t)=>{let{secondLastStepIndex:n}=o(e.entries,t.experienceId),r=n===-1?e.entries:e.entries.slice(0,n+1);return{...e,entries:r}}),{push:t,replace:n,back:r,restore:a,entriesStore:e.map(e=>e.entries)}});function I(){return(0,l.invoke)(F)}var L=0,R=e=>{let t=(0,c.createStore)([]);return(0,c.sample)({clock:e,source:t,fn:(e,t)=>[...e,{id:L++,at:new Date,payload:t}],target:t}),t},z=(0,c.createDomain)(`field`),B=(0,l.createFactory)(()=>{let e=z.store({}),t=(0,c.createApi)(e,{register(e,t){return{...e,[t.field.id]:t.field}},updateByKey(e,t){let n=Object.values(e).find(e=>e.key===t.fieldKey);return n?{...e,[n.id]:Object.assign({},n,t.updates)}:e}});function n(e){t.register({field:e})}function r(n,r){let i=e.getState(),a=Object.values(i).find(e=>e.key===n)?.key;a&&t.updateByKey({fieldKey:a,updates:r})}let i=e.map(e=>Object.values(e));function a(t){return e.map(e=>e[t]??null,{skipVoid:!1})}function o(t){return e.map(e=>Object.values(e).find(e=>e.key===t)??null,{skipVoid:!1})}function s(t){return e.map(e=>Object.values(e).find(e=>e.name===t)??null,{skipVoid:!1})}return{register:n,update:r,getById:a,getByKey:o,listStore:i,getByName:s}});function V(){return(0,l.invoke)(B)}var H=(0,c.createDomain)(`step`),U=(0,l.createFactory)(()=>{let e=H.store({}),t=(0,c.createApi)(e,{register(e,t){return{...e,[t.step.id]:t.step}}});function n(e){t.register({step:e})}let r=e.map(e=>Object.values(e));function i(t){return e.map(e=>e[t]??null,{skipVoid:!1})}function a(t){return e.map(e=>Object.values(e).find(e=>e.key===t)??null,{skipVoid:!1})}return{register:n,getById:i,getByKey:a,listStore:r,indexStore:e}});function W(){return(0,l.invoke)(U)}function G(e,t){t.register(e)}var K=(0,c.createDomain)(`action`),ce=(0,l.createFactory)(({client:e})=>{let t=K.store({}),n=(0,c.createApi)(t,{register(e,t){return{...e,[t.key]:{key:t.key,action:t.action}}}});function r(e,r){t.getState()[e]&&`${e}`,n.register(Object.freeze({key:e,action:r}))}let i=t.map(e=>Object.values(e));function a(e){return t.map(t=>t[e]?.action,{skipVoid:!1})}function o(t,n){let r=(0,c.createStore)(()=>void 0,{skipVoid:!1}),i=n?{experience:n.experience}:null,o=(0,c.createEffect)(async()=>{let n=a(t).getState();if(!n)return;let r=w(e);return(...e)=>n({...r,args:e},i)});return(0,c.sample)({source:{responses:e.responses.listStore,fields:e.fields.listStore},target:o}),(0,c.sample)({clock:o.doneData,filter:e=>e!==void 0,target:r}),o(),r}return{register:r,getByKey:a,listStore:i,getEvokableAction:o}});function le(e){return(0,l.invoke)(ce,e)}var ue=(e,t,n)=>{n.register(e,t)};function q(e,t,n,r){return{fieldKey:e.key,userMessage:n,systemMessage:r,value:t}}function J(e){return e===null||e===``||Array.isArray(e)&&!e.length}function de(e){return typeof e==`string`||typeof e==`number`||typeof e==`boolean`||e===null}function Y(e){try{return JSON.stringify(e),!0}catch{return!1}}function fe(e,t){return t.find(t=>t.key===e)??null}function pe(e,t){return e.multiple&&(typeof t==`string`||typeof t==`number`||typeof t==`boolean`)?[t]:t}function me(e,t){if(e.type!==`object`||J(t))return null;if(e.multiple){if(!Array.isArray(t))return q(e,t,`This field expects multiple values`,`Field expects an array of objects.`);for(let n of t){if(typeof n!=`object`||!n)return q(e,t,`This field expects object values`,`Field expects an array of objects, but received non-object value.`);if(!Y(n))return q(e,t,`This field contains non-serializable data`,`Field value contains non-JSON-serializable data (functions, circular references, etc.).`)}return null}return Array.isArray(t)?q(e,t,`This field expects a single value`,`Field expects a single object, not an array.`):typeof t!=`object`||!t?q(e,t,`This field expects an object value`,`Field expects an object value.`):Y(t)?null:q(e,t,`This field contains non-serializable data`,`Field value contains non-JSON-serializable data (functions, circular references, etc.).`)}function he(e,t){if(J(t)||!Array.isArray(e.options)||e.options.length===0)return null;let n=Array.isArray(t)?t:[t];if(e.type===`object`){let r=new Set(e.options.map(e=>JSON.stringify(e.value)));return n.every(e=>r.has(JSON.stringify(e)))?null:q(e,t,`This field expects a valid option`,`Field expects a valid option from the defined choices.`)}let r=e.options.map(e=>e.value);return n.every(e=>!de(e)||e===null?!1:r.includes(e))?null:q(e,t,`This field expects a valid option`,`Field expects a valid option. Valid options are: ${r.join(`, `)}`)}async function ge(e,n,r,i){if(n.validation&&!t.t(n.validation)&&!J(r)){let t=i?{$input:r,responses:i}:{$input:r},a=await e(n.validation,t);if(typeof a==`string`)return q(n,r,a,`Field validation resulted in an error: ${a}.`);if(a===!1)return q(n,r,`This field is invalid`,`Field validation resulted in an unspecified error.`)}return n.required&&J(r)?q(n,r,`This field is required`,`Field is required.`):!n.multiple&&Array.isArray(r)&&r.length>1?q(n,r,`This field expects a single response`,`Field expects a single response.`):null}var _e=(0,c.createDomain)(`response`),ve=(0,l.createFactory)(({client:t})=>{let n=_e.store({}),r=(0,c.createEvent)(),i=(0,c.createEvent)(),a=(0,c.createApi)(n,{register(e,t){return{...e,[t.fieldKey]:t.response}},registerBatch(e,t){return{...e,...t}},clear(e,t){return Object.fromEntries(Object.entries(e).filter(([e])=>e!==t))},clearAll(){return{}}});function o(e,t){if(typeof e==`string`){if(t===void 0)throw Error(`Response is required when registering a single field`);a.register({fieldKey:e,response:t})}else a.registerBatch(e)}let s=(n,r)=>e.t(t,n,r),l=(0,c.attach)({source:{allFields:t.fields.listStore,existingResponses:n},effect:async({allFields:e,existingResponses:t},n)=>{let r=[],i={},a={...t,...n},o=Object.entries(n),c=await Promise.allSettled(o.map(async([t,n])=>{let o=fe(t,e);if(!o){r.push({fieldKey:t,userMessage:`Field '${t}' not found`,systemMessage:`No field with key '${t}' exists. Available field keys are: ${e.map(e=>e.key).join(`,`)}.`,value:n});return}let c=pe(o,n),l=await ge(s,o,c,a);if(l){r.push(l);return}let u=me(o,c);if(u){r.push(u);return}let d=he(o,c);if(d){r.push(d);return}i[o.key]=n}));for(let[e,t]of c.entries()){if(t.status!==`rejected`)continue;let n=o[e];if(!n)continue;let[i,a]=n,s=t.reason instanceof Error?t.reason.message:String(t.reason);r.push({fieldKey:i,userMessage:`An unexpected error occurred validating this field`,systemMessage:`Validation threw for field '${i}': ${s}`,value:a})}return{responsesToCommit:i,validationErrors:r}}});async function u(e){return l(e)}let d=(0,c.attach)({source:n,effect:async(e,t)=>{let{responsesToCommit:n,validationErrors:r}=await l(t);return r.length?{errors:r}:(a.registerBatch(n),{errors:[]})}});async function f(e){return d(e)}let p=n.map(e=>e),m=n.map(e=>Object.entries(e).map(([e,t])=>({fieldKey:e,value:t})));function h(e){return(0,c.combine)({f:e,s:n},({f:e,s:t})=>{let n=e?t[e.key]??null:null;return n===null?e?.defaultValue!==void 0&&e.defaultValue!==null?e.defaultValue:null:n})}function g(e){return h(t.fields.getById(e))}function _(e){return h(t.fields.getByKey(e))}function v(e){return h(t.fields.getByName(e))}return(0,c.sample)({clock:r,target:a.clearAll}),(0,c.sample)({clock:i,target:a.clear}),{register:o,clearAll:r,clear:i,commit:f,getResponsesToCommit:u,listStore:m,getAllStore:p,getByFieldId:g,getByFieldKey:_,getByFieldName:v}});function ye(e){return(0,l.invoke)(ve,e)}var be=(0,c.createDomain)(`condition`),xe=(0,l.createFactory)(()=>{let e=be.store({}),t=(0,c.createApi)(e,{register(e,t){return{...e,[t.condition.id]:t.condition}}});function n(e){t.register({condition:e})}let r=e.map(e=>Object.values(e));function i(t){return e.map(e=>e[t]??null,{skipVoid:!1})}function a(t){return e.map(e=>Object.values(e).find(e=>e.key===t)??null,{skipVoid:!1})}return{register:n,getById:i,getByKey:a,listStore:r,indexStore:e}});function Se(){return(0,l.invoke)(xe)}function Ce(){if(r.r()){let e=[document.currentScript,document.getElementById(`picked_script`),document.getElementById(`picked`),document.getElementById(`cvly`),document.getElementById(`cvly-x`)];for(let t of e)if(t?.dataset.api)return t.dataset.api}return`https://api.picked.app`}function we(){if(!r.d())return{};let e=new URLSearchParams(window.location.search),t={},n=new Set;for(let[t]of e.entries())t.startsWith(`picked-`)&&n.add(t);for(let r of n){let n=r.replace(`picked-`,``);t[n]=e.getAll(r)}let i=a.t(`s`);if(n.size>0)a.r.set(i,t);else{let e=a.r.get(i);if(e)return e.json()||{}}return t}function Te(){return r.n()?crypto.randomUUID():`${Date.now().toString(36)}-${Math.random().toString(36).substring(2,15)}-${Math.random().toString(36).substring(2,15)}-${Math.random().toString(36).substring(2,15)}`}var Ee=a.t(`session`,`global`),De=()=>{let e=a.n.get(Ee),t;e.isSet()&&(t=e.json());let n=t=>e.set({id:t.id,isUser:t.isUser,identifiers:t.identifiers}),r={id:t?.id??Te(),isUser:t?.isUser??void 0,identifiers:t?.identifiers??void 0,setIsUser(e){this.isUser=e,n(this)},setIdentifier(e,t){this.identifiers={...this.identifiers,[e]:t},n(this)},removeIdentifier(e){this.identifiers&&(this.identifiers=Object.fromEntries(Object.entries(this.identifiers).filter(([t])=>t!==e)),this.identifiers=Object.keys(this.identifiers).length?this.identifiers:void 0,n(this))}};return n(r),r},Oe=()=>r.o()?De():null;function X(){if(r.d())return globalThis.window.pickedConfig}function ke(){if(!r.d())return;let e=X(),t=e?.organizationId,n=e?.projectId;return t&&n?{organizationId:t,projectId:n}:void 0}function Z(){if(!r.r())return;let e=document.getElementById(`picked_script`)||document.querySelector(`script#picked`)||document.getElementById(`cvly`);if(!e)return;let t=e.dataset.organizationid||e.getAttribute(`organization-id`),n=e.dataset.projectid||e.getAttribute(`project-id`);return t&&n?{organizationId:t,projectId:n}:void 0}function Ae(e){let{organizationId:t,projectId:n}=e;if(t&&n)return{organizationId:t,projectId:n};let r=ke();if(r)return r;let i=Z();if(i)return i;throw 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
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 Q(e){return e==null||e===``||Number.isNaN(e)}var je={default:(e,t)=>Q(e)?String(t??``):String(e),append:(e,t)=>t&&!Q(e)?`${e} ${t}`:e,prepend:(e,t)=>t&&!Q(e)?`${t} ${e}`:e,upper:e=>typeof e==`string`?e.toUpperCase():e,lower:e=>typeof e==`string`?e.toLowerCase():e,capitalize:e=>typeof e==`string`?e.charAt(0).toUpperCase()+e.slice(1):e,list:e=>{if(!e||typeof e!=`object`)return e;let t=new Intl.ListFormat(`en`,{style:`long`,type:`conjunction`});if(Array.isArray(e))return t.format(e.map(String));if(e instanceof Map){let n=Array.from(e.entries()).map(([e,t])=>`${e}: ${t}`);return t.format(n)}return e instanceof Set?t.format(Array.from(e).map(String)):e}};function Me(e){return typeof e==`object`&&!!e}function Ne(e,t){let n=t;for(let t of e.split(`.`))if(Me(n)&&t in n)n=n[t];else return;return typeof n==`function`?n():n}function Pe(e,t){let n=e.split(`|`).map(e=>e.trim()),r=Ne(n.shift()??``,t);for(let e of n){let[t,...n]=e.split(`:`),i=t?.trim()??``,a=n.join(`:`).trim().replaceAll(/(?:^['"]|['"]$)/g,``),o=je[i];o&&(r=o(r,a))}return Q(r)?``:typeof r==`object`?JSON.stringify(r):String(r)}function Fe(e,t){let n=``,r=0;for(;r<e.length;)if(e[r]===`{`&&e[r+1]===`{`){r+=2;let i=``;for(;r<e.length;){if(e[r]===`}`&&e[r+1]===`}`){r+=2;break}i+=e[r++]}n+=Pe(i.trim(),t)}else n+=e[r++];return n}var $=class{static logger=n.t;options;isReady=!1;plugins={};pluginStartHooks=[];eventBus=(0,c.createEvent)();events;organizationId;projectId;apiUrl;dashboardUrl;documentationSiteUrl;session;precondition;condition;preconditionPassed;searchParams=we();history=I();components=S({client:this});experienceInstances=i.n({client:this});experiences=m({client:this});frameworks=re({client:this});predicates=D({client:this});features=j({client:this});conditions=Se();fields=V();responses=ye({client:this});steps=W();actions=le({client:this});constructor(e){this.events=R(this.eventBus);let{organizationId:t,projectId:n}=Ae(e);this.organizationId=t,this.projectId=n,this.options=Object.freeze(e),this.apiUrl=e.apiUrl||Ce(),this.dashboardUrl=e.dashboardUrl??`https://dashboard.picked.app`,this.documentationSiteUrl=e.documentationSiteUrl??`https://docs.picked.app`,this.session=Oe(),this.setupPlugins(),this.setupFeatures(),this.setupPredicates(),this.setupActions(),this.setupComponents(),this.precondition=e.precondition,this.condition=e.condition,this.eventBus({type:`load`,version:o.r()})}start=()=>{se(this),(async()=>{if(!r.r())return;await this.runPluginStartHooks();let e=await this.evaluateGate(this.precondition);this.preconditionPassed=e;let t;e&&(t=await this.evaluateGate(this.condition));let n=e&&t===!0;if(typeof t==`boolean`&&this.session){let e=t;this.session.setIsUser(e),this.eventBus({type:`user_decide`,value:e})}if(this.eventBus({type:`initialize`}),n&&g(this),await i.o(),n&&g(this),this.eventBus({type:`ready`}),this.isReady=!0,this.session){let{id:e,isUser:t,identifiers:n}=this.session;this.eventBus({type:`session`,id:e,isUser:t,identifiers:n})}})()};registerFramework=e=>{ie(e,this.frameworks)};registerComponent=(e,t)=>{C(e,t,this.components)};registerPlugin=e=>{v(this,e,this.plugins);let t=this.plugins[e.name];t?.onStart&&this.pluginStartHooks.push(t.onStart)};registerFeature=(e,t)=>{M(e,t,this.features)};registerPredicate=(e,t)=>{O(e,t,this.predicates)};registerCondition=e=>{this.conditions.register(e)};registerField=e=>{this.fields.register(e)};registerStep=e=>{G(e,this.steps)};registerAction=(e,t)=>{ue(e,t,this.actions)};registerExperience=e=>{e.component&&C(`experience:${e.id}`,e.component,this.components),this.experiences.register(e)};getStateSnapshot=()=>w(this);launchExperienceById=async(e,t)=>{this.experiences.launch({id:e,options:t})};launchExperienceByKey=async(e,t)=>{this.experiences.launch({key:e,options:t})};openExperienceById=async e=>{this.experiences.open({id:e})};openExperienceByKey=async e=>{this.experiences.open({key:e})};async runPluginStartHooks(){for(let e of this.pluginStartHooks)await e()}async evaluateGate(t){return t===void 0?!0:typeof t==`boolean`?t:await e.t(this,t)===!0}setupPlugins(){this.options.plugins?.forEach(e=>{if(Array.isArray(e)){e.forEach(e=>{this.registerPlugin(e)});return}let t=typeof e==`function`?e():e;if(Array.isArray(t)){t.forEach(e=>this.registerPlugin(e));return}this.registerPlugin(t)})}setupFeatures(){let e=this.options.features;e&&Object.entries(e).forEach(([e,t])=>{let n=typeof t==`function`?t():t;this.registerFeature(e,n)}),this.searchParams.feature&&this.searchParams.feature.forEach(e=>{try{let[t,n]=e.split(`:`);if(!t||!n)return;let r=n;r===`true`&&(r=!0),r===`false`&&(r=!1),this.registerFeature(t,{key:`${r}`,name:t,decide:()=>r,storage:`session`})}catch{}})}setupPredicates(){let e=this.options.predicates;e&&Object.entries(e).forEach(([e,t])=>{if(typeof t!=`function`){`${e}`;return}this.registerPredicate(e,t)})}setupActions(){let e=this.options.actions;e&&Object.entries(e).forEach(([e,t])=>{if(typeof t!=`function`){`${e}`;return}this.registerAction(e,t)})}setupComponents(){let e=this.options.components;e&&Object.entries(e).forEach(([e,t])=>{this.registerComponent(e,t)})}getPluginConfig=e=>this.plugins[e]??{};renderString=(e,t)=>{let n=this.responses.listStore.getState().reduce((e,t)=>(e[t.fieldKey]=t.value,e),{});return Fe(e,{...t,responses:n})}};function Ie(e){return{$$type:`lazy-component`,load:e}}function Le(e){return typeof e==`object`&&!!e&&`$$type`in e&&e.$$type===`lazy-component`}var Re=e=>{let t=new $(e);return r.p(t),t};exports.Picked=$,exports.createClient=Re,exports.createStorageKey=a.t,exports.evaluateRuleLogic=e.t,exports.getPickedConfig=X,exports.isLazyLoader=Le,exports.isPickedRoot=i.c,exports.lazyComponent=Ie,exports.localStore=a.n,exports.sessionStore=a.r,exports.subscribe=a.i,exports.supportsCookies=r.t,exports.supportsCryptoRandomUUID=r.n,exports.supportsDocument=r.r,exports.supportsHistory=r.i,exports.supportsIntersectionObserver=r.a,exports.supportsLocalStorage=r.o,exports.supportsLocation=r.s,exports.supportsSessionStorage=r.c,exports.supportsShadowRoot=r.l,exports.supportsWebComponents=r.u,exports.supportsWindow=r.d;
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`}),require(`../../../logger-fbvQC40v.cjs`);const e=require(`../../../api-CdXeZIE2.cjs`);function t(e){let t=2166136261;for(let n=0;n<e.length;n++)t^=e.charCodeAt(n),t=Math.imul(t,16777619);return t>>>0}function n(e){return t(e)%100}function r(e,t){return t<=0?!1:t>=100?!0:e<t}function i(e){return typeof e==`object`&&!!e&&`features`in e&&Array.isArray(e.features)}function a(e,t){if(Array.isArray(t.conditions))for(let n of t.conditions)e.registerCondition(n)}function o(e,t){e.registerExperience({id:t.id,key:t.key,name:t.name,targets:t.targets,nodes:t.nodes,edges:t.edges,condition:t.condition,initializeOpen:t.initializeOpen,componentName:t.componentName})}function s(e,t){if(Array.isArray(t.fields))for(let n of t.fields)e.registerField(n)}function c(e,t){if(!Array.isArray(t.steps))return;let n=new Map(t.fields.map(e=>[e.id,e.key]));for(let r of t.steps){let t=[];for(let e of r.fieldIds??[]){let i=n.get(e);if(i===void 0){`${r.key}${e}`;continue}t.push(i)}e.registerStep({id:r.id,key:r.key,name:r.name,fieldKeys:t,layoutName:r.layoutName})}}function l(e,t){if(Array.isArray(t.experiences))for(let n of t.experiences)o(e,n)}function u(e){let t=e.searchParams[`preview-token`];if(t&&t.length>0)return t[0]}function d(e){let t=new Set,n=e.searchParams.feature;if(!n)return t;for(let e of n){let n=e.indexOf(`:`);n>0&&t.add(e.substring(0,n))}return t}function f(e,t,r){let i=d(e),a=e.session?.id;if(!a)throw Error(`Session ID is required for feature registration`);let o=n(a);for(let n of t.features)i.has(n.id)||p(e,n,r,o)}function p(e,t,n,i){e.registerFeature(t.id,{key:`v${t.version}`,name:t.name,storage:n?`session`:`local`,decide:()=>t.enabled?r(i,t.weight):!1})}function m(){let e;try{e=__PICKED_PROJECT_CONFIG__}catch{return}if(e===void 0)return;let t;if(typeof e==`string`)try{t=JSON.parse(e)}catch{return}else t=e;if(i(t))return t}function h(e){try{let t=new URL(e).hostname;return t===`localhost`||t===`127.0.0.1`||t===`::1`}catch{return!1}}function g(e){if(typeof e!=`object`||!e||!(`cause`in e))return!1;let{cause:t}=e;return typeof t!=`object`||!t||!(`code`in t)?!1:t.code===`ECONNREFUSED`}async function _(t,n,r){let a=r?.previewToken?`projects/${n}?preview_token=${encodeURIComponent(r.previewToken)}`:`projects/${n}`,o;try{o=await e.t(t,a,r?.headers)}catch(e){return h(t)&&g(e),null}if(!o.ok)return`${o.status.toString()}`,null;let s;try{s=await o.json()}catch{return null}return i(s)?s:null}function v(e){return{name:`dynamic-experiences`,setup:t=>{let n=e?.apiUrl??t.apiUrl;return{onStart:async()=>{let r=u(t);if(r){let e=await _(n,t.projectId,{previewToken:r});e&&(f(t,e,!0),a(t,e),s(t,e),c(t,e),l(t,e));return}let i=e?.projectConfig??m();if(i){f(t,i,!1),a(t,i),s(t,i),c(t,i),l(t,i);return}let o=await _(n,t.projectId);o&&(f(t,o,!1),a(t,o),s(t,o),c(t,o),l(t,o))}}}}}exports.createClientHeaders=e.i,exports.dynamicExperiencesPlugin=v,exports.fetchProject=_;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`}),require(`../../../logger-fbvQC40v.cjs`);const e=require(`../../../api-DlB-NTWc.cjs`);function t(e){let t=2166136261;for(let n=0;n<e.length;n++)t^=e.charCodeAt(n),t=Math.imul(t,16777619);return t>>>0}function n(e){return t(e)%100}function r(e,t){return t<=0?!1:t>=100?!0:e<t}function i(e){return typeof e==`object`&&!!e&&`features`in e&&Array.isArray(e.features)}function a(e,t){if(Array.isArray(t.conditions))for(let n of t.conditions)e.registerCondition(n)}function o(e,t){e.registerExperience({id:t.id,key:t.key,name:t.name,targets:t.targets,nodes:t.nodes,edges:t.edges,condition:t.condition,initializeOpen:t.initializeOpen,componentName:t.componentName})}function s(e,t){if(Array.isArray(t.fields))for(let n of t.fields)e.registerField(n)}function c(e,t){if(!Array.isArray(t.steps))return;let n=new Map(t.fields.map(e=>[e.id,e.key]));for(let r of t.steps){let t=[];for(let e of r.fieldIds??[]){let i=n.get(e);if(i===void 0){`${r.key}${e}`;continue}t.push(i)}e.registerStep({id:r.id,key:r.key,name:r.name,fieldKeys:t,layoutName:r.layoutName})}}function l(e,t){if(Array.isArray(t.experiences))for(let n of t.experiences)o(e,n)}function u(e){let t=e.searchParams[`preview-token`];if(t&&t.length>0)return t[0]}function d(e){let t=new Set,n=e.searchParams.feature;if(!n)return t;for(let e of n){let n=e.indexOf(`:`);n>0&&t.add(e.substring(0,n))}return t}function f(e,t,r){let i=d(e),a=e.session?.id;if(!a)throw Error(`Session ID is required for feature registration`);let o=n(a);for(let n of t.features)i.has(n.id)||p(e,n,r,o)}function p(e,t,n,i){e.registerFeature(t.id,{key:`v${t.version}`,name:t.name,storage:n?`session`:`local`,decide:()=>t.enabled?r(i,t.weight):!1})}function m(){let e;try{e=__PICKED_PROJECT_CONFIG__}catch{return}if(e===void 0)return;let t;if(typeof e==`string`)try{t=JSON.parse(e)}catch{return}else t=e;if(i(t))return t}function h(e){try{let t=new URL(e).hostname;return t===`localhost`||t===`127.0.0.1`||t===`::1`}catch{return!1}}function g(e){if(typeof e!=`object`||!e||!(`cause`in e))return!1;let{cause:t}=e;return typeof t!=`object`||!t||!(`code`in t)?!1:t.code===`ECONNREFUSED`}async function _(t,n,r){let a=r?.previewToken?`projects/${n}?preview_token=${encodeURIComponent(r.previewToken)}`:`projects/${n}`,o;try{o=await e.t(t,a,r?.headers)}catch(e){return h(t)&&g(e),null}if(!o.ok)return`${o.status.toString()}`,null;let s;try{s=await o.json()}catch{return null}return i(s)?s:null}function v(e){return{name:`dynamic-experiences`,setup:t=>{let n=e?.apiUrl??t.apiUrl;return{onStart:async()=>{let r=u(t);if(r){let e=await _(n,t.projectId,{previewToken:r});e&&(f(t,e,!0),a(t,e),s(t,e),c(t,e),l(t,e));return}let i=e?.projectConfig??m();if(i){f(t,i,!1),a(t,i),s(t,i),c(t,i),l(t,i);return}let o=await _(n,t.projectId);o&&(f(t,o,!1),a(t,o),s(t,o),c(t,o),l(t,o))}}}}}exports.createClientHeaders=e.i,exports.dynamicExperiencesPlugin=v,exports.fetchProject=_;
@@ -4,7 +4,7 @@ layout: docs
4
4
 
5
5
  # Data sources
6
6
 
7
- PickedQL provides four virtual tables, each optimized for different query patterns.
7
+ PickedQL provides four virtual tables (each optimized for different query patterns) plus three reference tables describing your Picked configuration.
8
8
 
9
9
  ## `metrics` — Pre-aggregated daily data
10
10
 
@@ -110,4 +110,36 @@ Columns returned:
110
110
 
111
111
  :::note
112
112
  `experience_journey` is aggregated output. Dimension filters (`variant_type`, `device_category`, `country_code`, …) are **not** supported — if you need those, query [`events`](#events--user-level-event-data) directly and build the transitions yourself.
113
- :::
113
+ :::
114
+
115
+ ## Reference tables — `steps`, `experiences`, `projects`
116
+
117
+ Reference tables describing your Picked configuration. They serve two roles:
118
+
119
+ - **Auto-joined onto `events`** when their prefixed analyst columns (`step_title`, `experience_title`, `project_name`, `project_timezone`) are referenced.
120
+ - **Queryable directly**, with a per-table tenant filter required so you only see rows belonging to a project you have access to.
121
+
122
+ | Source | Tenant filter required |
123
+ |---|---|
124
+ | `steps` | `WHERE project_id = '<project_id>'` |
125
+ | `experiences` | `WHERE project_id = '<project_id>'` |
126
+ | `projects` | `WHERE id = '<project_id>'` |
127
+
128
+ ```sql
129
+ -- Direct query: list experiences for a project
130
+ SELECT id, title FROM experiences WHERE project_id = 'your-project-id'
131
+
132
+ -- Direct query: load metadata for one project
133
+ SELECT id, name, timezone FROM projects WHERE id = 'your-project-id'
134
+ ```
135
+
136
+ ```sql
137
+ -- Referenced from events: PickedQL auto-injects the LEFT JOINs
138
+ -- (no separate tenant filter on the reference tables — the join is scoped via fact_events)
139
+ SELECT experience_title, step_title, count(*)
140
+ FROM events
141
+ WHERE project_id = 'your-project-id'
142
+ GROUP BY experience_title, step_title
143
+ ```
144
+
145
+ See [Schema → reference tables](./schema#steps-experiences-projects) for the full column list and join keys.
@@ -15,6 +15,26 @@ Dimension columns are available on all data sources. On `metrics`, they are incl
15
15
  | `dim_geo` | `country_code`, `country_name`, `region`, `city` |
16
16
  | `dim_utm` | `utm_source`, `utm_medium`, `utm_campaign`, `utm_term`, `utm_content` |
17
17
  | `dim_product` | `product_name`, `product_category`, `product_page` |
18
+ | `steps` | `step_title` |
19
+ | `experiences` | `experience_title` |
20
+ | `projects` | `project_name`, `project_timezone` |
21
+
22
+ The `steps`, `experiences`, and `projects` sources are reference tables sourced from the operational database. They are auto-joined onto `events`/`fact_events` when their analyst-facing columns are referenced, **and** they require their own tenant filter when queried directly:
23
+
24
+ | Source | Tenant filter required |
25
+ |---|---|
26
+ | `steps`, `experiences` | `WHERE project_id = '<project_id>'` |
27
+ | `projects` | `WHERE id = '<project_id>'` (the row's `id` IS the project id) |
28
+
29
+ Analyst-facing column names are prefixed (`step_title`, `project_name`, etc.) to avoid collisions across sources — for example, `steps.title` and `experiences.title` both exist, but you reference them as `step_title` and `experience_title`.
30
+
31
+ ```sql
32
+ -- Group events by experience and step name (auto-joins both `experiences` and `steps`)
33
+ SELECT experience_title, step_title, count(*)
34
+ FROM events
35
+ WHERE project_id = 'your-project-id'
36
+ GROUP BY experience_title, step_title
37
+ ```
18
38
 
19
39
  ## Native event columns
20
40
 
@@ -138,7 +138,7 @@ ORDER BY project_local_date, device_category
138
138
  SELECT
139
139
  utm_source,
140
140
  all_users() AS users,
141
- total_purchase_users() AS purchasers
141
+ all_purchase_users() AS purchasers
142
142
  FROM metrics
143
143
  WHERE project_id = '{{ your project ID }}'
144
144
  GROUP BY utm_source
@@ -29,3 +29,25 @@ WHERE project_id = 'your-project-id'
29
29
  :::warning
30
30
  Each query can only filter on a single `project_id`. Queries that reference multiple projects will be rejected.
31
31
  :::
32
+
33
+ ## Reference tables (per-table tenant filter)
34
+
35
+ Queries against the reference tables (`steps`, `experiences`, `projects`) require their own tenant filter so you only see rows belonging to a project you have access to:
36
+
37
+ | Source | Tenant filter |
38
+ |---|---|
39
+ | `steps`, `experiences` | `WHERE project_id = '<project_id>'` |
40
+ | `projects` | `WHERE id = '<project_id>'` (the row's `id` IS the project id) |
41
+
42
+ ```sql
43
+ -- All experiences for one project
44
+ SELECT id, title FROM experiences WHERE project_id = 'your-project-id'
45
+
46
+ -- All steps for one project
47
+ SELECT id, title FROM steps WHERE project_id = 'your-project-id'
48
+
49
+ -- Metadata for one project
50
+ SELECT id, name, timezone FROM projects WHERE id = 'your-project-id'
51
+ ```
52
+
53
+ The small lookup tables (`dim_variant`, `dim_device`, `dim_geo`, `dim_utm`, `dim_product`) are still exempt — they contain no tenant data.
@@ -22,7 +22,7 @@ PickedQL handles table mapping and dimension joins automatically. You write conc
22
22
  1. **Virtual table expansion**: Table names like `metrics` map to underlying data tables
23
23
  2. **Virtual function expansion**: Shorthand functions like `control_users()` expand to full aggregate expressions
24
24
  3. **Auto dimension joins**: References to dimension columns (like `device_category` or `country_code`) trigger automatic `LEFT JOIN` clauses — you never write joins yourself
25
- 4. **Tenant isolation**: Every query must include a `project_id` filter in the `WHERE` clause. PickedQL extracts it and verifies you have permission to access that project
25
+ 4. **Tenant isolation**: Every query must include a tenant filter in the `WHERE` clause — usually `project_id`, but `projects` uses `id` (the row's `id` IS the project id). PickedQL extracts the filter and verifies you have permission to access that project
26
26
  5. **SQL passthrough**: Standard SQL (including `CASE WHEN`, window functions, and subqueries) works alongside virtual functions
27
27
 
28
28
  ## Best practices
@@ -32,4 +32,5 @@ PickedQL handles table mapping and dimension joins automatically. You write conc
32
32
  - **Use `experience_journey` for sankey / funnel charts**: One line of SQL returns `source, target, users` — the 8-CTE scaffold (dedup, top-N path ranking, lagInFrame) is handled internally; pass parameters via `WHERE`
33
33
  - **Don't write JOINs**: PickedQL injects them automatically when you reference dimension columns
34
34
  - **Group by any dimension**: Add dimension columns to `SELECT` and `GROUP BY` freely — required joins are handled for you
35
+ - **Reference table metadata for free**: Use `step_title`, `experience_title`, `project_name` directly in `events` queries — PickedQL auto-joins the `steps`, `experiences`, and `projects` reference tables
35
36
 
@@ -83,6 +83,36 @@ These columns are joined automatically when referenced — no `JOIN` syntax need
83
83
  | `product_name` | dim_product | Product name |
84
84
  | `product_category` | dim_product | Product category |
85
85
  | `product_page` | dim_product | Product page |
86
+ | `step_title` | steps | Step title (joined on `project_id` + `experience_id` + `step_id`) |
87
+ | `experience_title` | experiences | Experience title (joined on `project_id` + `experience_id`) |
88
+ | `project_name` | projects | Project name |
89
+ | `project_timezone` | projects | Project timezone |
90
+
91
+ ## `steps`, `experiences`, `projects`
92
+
93
+ Reference tables describing your Picked configuration. Auto-joined onto `events` when their analyst-facing columns are referenced; require a per-table tenant filter when queried directly.
94
+
95
+ | Source | Real Columns | Analyst Columns (when referenced from `events`) | Tenant filter (when queried directly) |
96
+ |---|---|---|---|
97
+ | `steps` | `id`, `title`, `experience_id`, `project_id`, `organization_id` | `step_title` | `project_id = '…'` |
98
+ | `experiences` | `id`, `title`, `project_id`, `organization_id` | `experience_title` | `project_id = '…'` |
99
+ | `projects` | `id`, `name`, `timezone`, `organization_id` | `project_name`, `project_timezone` | `id = '<project_id>'` |
100
+
101
+ When queried directly, use the real column names:
102
+
103
+ ```sql
104
+ -- List all experiences for a project
105
+ SELECT id, title FROM experiences WHERE project_id = 'your-project-id'
106
+ ```
107
+
108
+ When referenced from `events`, use the prefixed analyst names — joins are injected automatically:
109
+
110
+ ```sql
111
+ SELECT experience_title, step_title, count(*)
112
+ FROM events
113
+ WHERE project_id = 'your-project-id'
114
+ GROUP BY experience_title, step_title
115
+ ```
86
116
 
87
117
  ## `features`
88
118
 
@@ -21,12 +21,12 @@ Virtual functions are shorthand for aggregate expressions. They are **table-awar
21
21
 
22
22
  | Function | Description |
23
23
  |---|---|
24
- | `total_purchase_users()` | Users who completed a purchase |
24
+ | `all_purchase_users()` | Users who completed a purchase |
25
25
  | `control_purchase_users()` | Control users who purchased (`metrics` only) |
26
26
  | `variant_purchase_users()` | Variant users who purchased (`metrics` only) |
27
- | `total_purchase_sessions()` | Sessions with a purchase (`metrics` only) |
28
- | `total_purchase_orders()` | Unique order count (`metrics` only) |
29
- | `total_cart_add_users()` | Users who added to cart |
27
+ | `all_purchase_sessions()` | Sessions with a purchase (`metrics` only) |
28
+ | `all_purchase_orders()` | Unique order count (`metrics` only) |
29
+ | `all_cart_add_users()` | Users who added to cart |
30
30
 
31
31
  ## Conversion rates
32
32
 
package/dist/esm/index.js CHANGED
@@ -4,7 +4,7 @@ import { t as r } from "../logger-6z_gb4rA.js";
4
4
  import { a as i, c as a, d as o, i as s, l as c, n as l, o as u, p as d, r as f, s as p, t as m, u as h } from "../supports-0XIfd4-R.js";
5
5
  import { a as g, c as _, i as v, l as ee, n as te, o as ne, r as re, s as y } from "../experience-instance-DJaNc5Ob.js";
6
6
  import { i as ie, n as b, r as x, t as S } from "../storage-6Xk0uAxB.js";
7
- import { n as ae, r as oe } from "../api-DNo825Jr.js";
7
+ import { n as ae, r as oe } from "../api-BVKCs07k.js";
8
8
  import { t as se } from "../id-CRqy981z.js";
9
9
  import { attach as C, combine as w, createApi as T, createDomain as E, createEffect as D, createEvent as O, createStore as k, sample as A } from "effector";
10
10
  import { createFactory as j, invoke as M } from "@withease/factories";
@@ -664,7 +664,7 @@ function q(e, t, n, r) {
664
664
  };
665
665
  }
666
666
  function J(e) {
667
- return e == null || e === "" || Array.isArray(e) && !e.length;
667
+ return e === null || e === "" || Array.isArray(e) && !e.length;
668
668
  }
669
669
  function He(e) {
670
670
  return typeof e == "string" || typeof e == "number" || typeof e == "boolean" || e === null;
@@ -695,11 +695,11 @@ function Ge(e, t) {
695
695
  return Array.isArray(t) ? q(e, t, "This field expects a single value", "Field expects a single object, not an array.") : typeof t != "object" || !t ? q(e, t, "This field expects an object value", "Field expects an object value.") : Y(t) ? null : q(e, t, "This field contains non-serializable data", "Field value contains non-JSON-serializable data (functions, circular references, etc.).");
696
696
  }
697
697
  function Ke(e, t) {
698
- if (!Array.isArray(e.options) || e.options.length === 0) return null;
698
+ if (J(t) || !Array.isArray(e.options) || e.options.length === 0) return null;
699
699
  let n = Array.isArray(t) ? t : [t];
700
700
  if (e.type === "object") {
701
- let r = e.options.map((e) => JSON.stringify(e.value));
702
- return n.every((e) => r.includes(JSON.stringify(e))) ? null : q(e, t, "This field expects a valid option", "Field expects a valid option from the defined choices.");
701
+ let r = new Set(e.options.map((e) => JSON.stringify(e.value)));
702
+ return n.every((e) => r.has(JSON.stringify(e))) ? null : q(e, t, "This field expects a valid option", "Field expects a valid option from the defined choices.");
703
703
  }
704
704
  let r = e.options.map((e) => e.value);
705
705
  return n.every((e) => !He(e) || e === null ? !1 : r.includes(e)) ? null : q(e, t, "This field expects a valid option", `Field expects a valid option. Valid options are: ${r.join(", ")}`);
@@ -1,5 +1,5 @@
1
1
  import "../../../logger-6z_gb4rA.js";
2
- import { i as e, t } from "../../../api-DNo825Jr.js";
2
+ import { i as e, t } from "../../../api-BVKCs07k.js";
3
3
  //#region src/plugins/dynamic-experiences/hash.ts
4
4
  function n(e) {
5
5
  let t = 2166136261;
@@ -11,9 +11,9 @@ type RuleEvaluator = (logic: LogicRule, context?: LogicObject) => Promise<unknow
11
11
  /**
12
12
  * Resolves a field from an array by id or key.
13
13
  *
14
- * @param inputKey - The field id or key to look up.
15
- * @param allFields - All registered fields.
16
- * @returns The matching field, or null if not found.
14
+ * @param {string} inputKey - The field id or key to look up.
15
+ * @param {Field[]} allFields - All registered fields.
16
+ * @returns {Field | null} The matching field, or null if not found.
17
17
  * @example
18
18
  * ```typescript
19
19
  * resolveField('email', allFields) // Field | null
@@ -23,9 +23,9 @@ export declare function resolveField(inputKey: string, allFields: Field[]): Fiel
23
23
  /**
24
24
  * Coerces a scalar value into a single-element array when the field expects multiple values.
25
25
  *
26
- * @param field - The field definition.
27
- * @param value - The response value to coerce.
28
- * @returns The original or coerced value.
26
+ * @param {Field} field - The field definition.
27
+ * @param {FieldValue} value - The response value to coerce.
28
+ * @returns {FieldValue} The original or coerced value.
29
29
  * @example
30
30
  * ```typescript
31
31
  * coerceToArray(multipleField, 'hello') // ['hello']
@@ -35,9 +35,9 @@ export declare function coerceToArray(field: Field, value: FieldValue): FieldVal
35
35
  /**
36
36
  * Validates that an object field value has the correct shape and is JSON-serializable.
37
37
  *
38
- * @param field - The field definition.
39
- * @param value - The response value to validate.
40
- * @returns A validation error if the value is invalid, or null if valid.
38
+ * @param {Field} field - The field definition.
39
+ * @param {FieldValue} value - The response value to validate.
40
+ * @returns {ValidationError | null} A validation error if the value is invalid, or null if valid.
41
41
  * @example
42
42
  * ```typescript
43
43
  * getObjectValueError(objectField, { key: 'val' }) // null
@@ -47,9 +47,9 @@ export declare function getObjectValueError(field: Field, value: FieldValue): Va
47
47
  /**
48
48
  * Validates that a response value matches one of the field's allowed options.
49
49
  *
50
- * @param field - The field definition with options.
51
- * @param value - The response value to validate.
52
- * @returns A validation error if the value is not a valid option, or null if valid.
50
+ * @param {Field} field - The field definition with options.
51
+ * @param {FieldValue} value - The response value to validate.
52
+ * @returns {ValidationError | null} A validation error if the value is not a valid option, or null if valid.
53
53
  * @example
54
54
  * ```typescript
55
55
  * getOptionsError(fieldWithOptions, 'valid-option') // null
@@ -59,11 +59,11 @@ export declare function getOptionsError(field: Field, value: FieldValue): Valida
59
59
  /**
60
60
  * Runs field-level validation including rule-based validation, required checks, and multiplicity checks.
61
61
  *
62
- * @param evaluateRule - Callback to evaluate rule-based validation logic.
63
- * @param field - The field definition.
64
- * @param value - The response value to validate.
65
- * @param responses - All current responses for cross-field validation.
66
- * @returns A validation error if the field fails validation, or null if valid.
62
+ * @param {RuleEvaluator} evaluateRule - Callback to evaluate rule-based validation logic.
63
+ * @param {Field} field - The field definition.
64
+ * @param {FieldValue} value - The response value to validate.
65
+ * @param {Record<string, FieldValue>} [responses] - All current responses for cross-field validation.
66
+ * @returns {Promise<ValidationError | null>} A validation error if the field fails validation, or null if valid.
67
67
  * @example
68
68
  * ```typescript
69
69
  * await getFieldValidationError(evaluate, field, 'hello') // null
@@ -1 +1 @@
1
- {"version":3,"file":"response-validation.d.ts","sourceRoot":"","sources":["../../../../src/entities/response/response-validation.ts"],"names":[],"mappings":"AAAA,0GAA0G;AAC1G,OAAO,KAAK,EAAE,KAAK,EAAE,UAAU,EAAuB,MAAM,gBAAgB,CAAA;AAC5E,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAGhE,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,KAAK,CAAC,KAAK,CAAC,CAAA;IACtB,WAAW,EAAE,MAAM,CAAA;IACnB,aAAa,EAAE,MAAM,CAAA;IACrB,KAAK,EAAE,UAAU,CAAA;CAClB;AAED,qEAAqE;AACrE,KAAK,aAAa,GAAG,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;AAmFlF;;;;;;;;;;GAUG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,KAAK,GAAG,IAAI,CAE/E;AAED;;;;;;;;;;GAUG;AAEH,wBAAgB,aAAa,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,GAAG,UAAU,CASzE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,GAAG,eAAe,GAAG,IAAI,CAgE3F;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,GAAG,eAAe,GAAG,IAAI,CAsCvF;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,uBAAuB,CAC3C,YAAY,EAAE,aAAa,EAC3B,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,UAAU,EACjB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,GACrC,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAsCjC"}
1
+ {"version":3,"file":"response-validation.d.ts","sourceRoot":"","sources":["../../../../src/entities/response/response-validation.ts"],"names":[],"mappings":"AAAA,0GAA0G;AAC1G,OAAO,KAAK,EAAE,KAAK,EAAE,UAAU,EAAuB,MAAM,gBAAgB,CAAA;AAC5E,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAGhE,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,KAAK,CAAC,KAAK,CAAC,CAAA;IACtB,WAAW,EAAE,MAAM,CAAA;IACnB,aAAa,EAAE,MAAM,CAAA;IACrB,KAAK,EAAE,UAAU,CAAA;CAClB;AAED,qEAAqE;AACrE,KAAK,aAAa,GAAG,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;AA+ElF;;;;;;;;;;GAUG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,KAAK,GAAG,IAAI,CAE/E;AAED;;;;;;;;;;GAUG;AAEH,wBAAgB,aAAa,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,GAAG,UAAU,CASzE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,GAAG,eAAe,GAAG,IAAI,CAgE3F;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,GAAG,eAAe,GAAG,IAAI,CAuCvF;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,uBAAuB,CAC3C,YAAY,EAAE,aAAa,EAC3B,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,UAAU,EACjB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,GACrC,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAsCjC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@picked/client",
3
- "version": "0.0.60",
3
+ "version": "0.0.61-next.1",
4
4
  "dependencies": {
5
5
  "@withease/factories": "^1.0.5"
6
6
  },
@@ -1 +0,0 @@
1
- var e=`Picked-Client`,t=`Picked-Version`;function n(n,r){return{[e]:n,[t]:r}}var r=()=>`0.0.60`,i=`v1`;function a(e,t){return new URL(`/api/${i}/${t}`,e).toString()}function o(e){return{...n(`sdk`,r()),...e}}async function s(e,t,n){let r=a(e,t);return fetch(r,{headers:o(n)})}async function c(e,t,n,r){let i=a(e,t);return fetch(i,{method:`POST`,headers:{"Content-Type":`application/json`,...o(r)},body:JSON.stringify(n)})}Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return n}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return c}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return r}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return s}});