@picked/client 0.0.1-dev.1777594341273 → 0.0.1-dev.1777601813342
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{api-DWa-ZqA4.cjs → api-BAOO2VZv.cjs} +1 -1
- package/dist/{api-DtOVNMSX.js → api-CiR56vZg.js} +1 -1
- package/dist/cjs/form/index.js +1 -1
- package/dist/cjs/index.js +2 -2
- package/dist/cjs/plugins/dynamic-experiences/index.js +1 -1
- package/dist/cjs/plugins/experience-browser-storage/index.js +1 -1
- package/dist/cjs/plugins/history-browser-storage/index.js +1 -1
- package/dist/cjs/plugins/responses-browser-storage/index.js +1 -1
- package/dist/cjs/plugins/responses-indexeddb/index.js +1 -1
- package/dist/cjs/plugins/single-page-app/index.js +1 -1
- package/dist/cjs/plugins/web-components/index.js +1 -1
- package/dist/cjs/plugins/window-object/index.js +1 -1
- package/dist/cjs/server/index.js +1 -1
- package/dist/docs/{actions.md → actions.mdx} +7 -0
- package/dist/docs/{api-keys.md → api-keys.mdx} +7 -0
- package/dist/docs/{conditions.md → conditions.mdx} +7 -0
- package/dist/docs/{experiences.md → experiences.mdx} +7 -0
- package/dist/docs/{features.md → features.mdx} +7 -0
- package/dist/docs/{fields.md → fields.mdx} +7 -0
- package/dist/docs/flow-builder/{overview.md → overview.mdx} +7 -0
- package/dist/docs/pickedql/data-sources.md +49 -2
- package/dist/docs/pickedql/dimensions.md +40 -0
- package/dist/docs/pickedql/examples.md +41 -1
- package/dist/docs/pickedql/filtering.md +22 -0
- package/dist/docs/pickedql/index.md +2 -1
- package/dist/docs/pickedql/schema.md +34 -1
- package/dist/docs/pickedql/virtual-functions.md +67 -11
- package/dist/docs/{projects.md → projects.mdx} +7 -0
- package/dist/docs/{reports.md → reports.mdx} +7 -0
- package/dist/docs/{steps.md → steps.mdx} +7 -0
- package/dist/docs/{workspaces.md → workspaces.mdx} +8 -0
- package/dist/esm/form/index.js +21 -6
- package/dist/esm/index.js +174 -174
- package/dist/esm/plugins/dynamic-experiences/index.js +1 -1
- package/dist/esm/plugins/experience-browser-storage/index.js +20 -18
- package/dist/esm/plugins/history-browser-storage/index.js +17 -15
- package/dist/esm/plugins/responses-browser-storage/index.js +21 -19
- package/dist/esm/plugins/responses-indexeddb/index.js +37 -35
- package/dist/esm/plugins/single-page-app/index.js +88 -42
- package/dist/esm/plugins/web-components/index.js +2 -2
- package/dist/esm/plugins/window-object/index.js +1 -1
- package/dist/esm/server/index.js +1 -1
- package/dist/{experience-CNIhapU2.js → experience-CR19HpPg.js} +2 -2
- package/dist/{experience-CTEBY-it.cjs → experience-DOWnsvA1.cjs} +1 -1
- package/dist/experience-instance-C2jZU8ho.cjs +1 -0
- package/dist/{experience-instance-B0tFPMAU.js → experience-instance-CGLdwg--.js} +12 -8
- package/dist/{nodes-2fst8XKi.js → nodes-Bmzx3TP_.js} +7 -7
- package/dist/{nodes-DBK4N9YY.cjs → nodes-Dx9bxj35.cjs} +1 -1
- package/dist/{rules-logic-D7dL30U1.js → rules-logic-CvILqbhz.js} +8 -5
- package/dist/{rules-logic-DJhGFqhC.cjs → rules-logic-DV5SUr5M.cjs} +1 -1
- package/dist/supports-DFDQ6eJO.cjs +1 -0
- package/dist/{supports-B_trw6lj.js → supports-DUJbucFW.js} +18 -9
- package/dist/types/entities/action/action.d.ts +30 -4
- package/dist/types/entities/action/action.d.ts.map +1 -1
- package/dist/types/entities/experience-instance/experience-instance.d.ts +4 -2
- package/dist/types/entities/experience-instance/experience-instance.d.ts.map +1 -1
- package/dist/types/entities/framework/framework.d.ts +12 -2
- package/dist/types/entities/framework/framework.d.ts.map +1 -1
- package/dist/types/entities/response/response-validation.d.ts +17 -17
- package/dist/types/entities/response/response-validation.d.ts.map +1 -1
- package/dist/types/form/create-field-evaluator.d.ts.map +1 -1
- package/dist/types/form/create-submit-pipeline.d.ts.map +1 -1
- package/dist/types/picked.d.ts +3 -1
- package/dist/types/picked.d.ts.map +1 -1
- package/dist/types/plugins/experience-browser-storage/plugin.d.ts.map +1 -1
- package/dist/types/plugins/history-browser-storage/plugin.d.ts.map +1 -1
- package/dist/types/plugins/responses-browser-storage/plugin.d.ts.map +1 -1
- package/dist/types/plugins/responses-indexeddb/plugin.d.ts.map +1 -1
- package/dist/types/plugins/single-page-app/plugin.d.ts +64 -12
- package/dist/types/plugins/single-page-app/plugin.d.ts.map +1 -1
- package/dist/types/utils/global-obj.d.ts +5 -0
- package/dist/types/utils/global-obj.d.ts.map +1 -1
- package/dist/types/utils/supports.d.ts +113 -0
- package/dist/types/utils/supports.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/experience-instance-BN0RZG1b.cjs +0 -1
- package/dist/supports-CKSVYpQx.cjs +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
var e=`Picked-Client`,t=`Picked-Version`;function n(n,r){return{[e]:n,[t]:r}}var r=()=>`0.0.1-dev.
|
|
1
|
+
var e=`Picked-Client`,t=`Picked-Version`;function n(n,r){return{[e]:n,[t]:r}}var r=()=>`0.0.1-dev.1777601813342`,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/form/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../../rules-logic-
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../../rules-logic-DV5SUr5M.cjs`);let t=require(`effector`);function n(e,t,n){let r=e[t];if(r===void 0){e[t]=n;return}if(Array.isArray(r)&&Array.isArray(n)&&n.length>0){typeof r[0]==`string`?e[t]=[...r,...n].map(String):typeof r[0]==`number`?e[t]=[...r,...n].map(Number):typeof r[0]==`boolean`?e[t]=[...r,...n].map(e=>!!e):e[t]=n;return}e[t]=n}function r(e,t){let r=Array.from(t.entries()),i={};return e.forEach(e=>{let t=r.filter(([t])=>t===e.key);t.length===0&&(t=[[e.key,``]]),t.forEach(([,t])=>{if(t===``){n(i,e.key,null);return}switch(e.type){case`text`:case`object`:n(i,e.key,e.multiple?[String(t)]:String(t));break;case`number`:n(i,e.key,e.multiple?[Number(t)]:Number(t));break;case`boolean`:n(i,e.key,e.multiple?[t===`true`]:t===`true`);break}})}),i}function i(e){return Array.isArray(e.options)&&e.options.some(e=>`condition`in e)}function a(e){return e.some(e=>e.condition||i(e))}function o(e){return e.condition??null}async function s(t,n,r){return n.length===0||!a(n)?n:(await Promise.all(n.map(async n=>{let a=o(n);if(!(!a||await e.t(t,a,r)))return null;if(!Array.isArray(n.options)||!i(n))return n;let s=(await Promise.all(n.options.map(async n=>n.condition?await e.t(t,n.condition,r)?n:null:n))).filter(e=>e!==null);return s.length===n.options.length?n:s.length===0?null:{...n,options:s}}))).filter(e=>e!==null)}function c(e,n,r){let i=(0,t.createStore)([]),a=(0,t.attach)({source:{allFields:e.fields.listStore,fieldKeys:n,staged:r,committed:e.responses.getAllStore},effect:(0,t.createEffect)(async({allFields:t,fieldKeys:n,staged:r,committed:i})=>{let a=new Map(t.map(e=>[e.key,e]));return await s(e,n.flatMap(e=>{let t=a.get(e);return t?[t]:[]}),{responses:{...i,...r}})})});return(0,t.sample)({clock:a.doneData,target:i}),a(),(0,t.sample)({clock:[e.responses.listStore,n,e.fields.listStore,r],target:a}),{fieldsStore:i}}function l(e){return e===null||e===``||Array.isArray(e)&&e.length===0}function u(n,r,i){let a=(0,t.createEvent)(),o=(0,t.createEvent)(),s=(0,t.createEvent)(),c=(0,t.createStore)({});(0,t.sample)({clock:s,source:c,fn:(e,{fieldKey:t})=>({...e,[t]:!0}),target:c});let u=(0,t.createStore)({}),d=u.map(e=>Object.values(e).filter(e=>e!==void 0)),f=(0,t.attach)({source:{fields:r,staged:i,committed:n.responses.getAllStore},effect:async({fields:t,staged:r,committed:i},{fieldKey:a,value:o,checkRequired:s})=>{let c=t.find(e=>e.key===a);if(!c)return{fieldKey:a,error:null};if(c.validation&&Object.keys(c.validation).length>0){let t={...i,...r},s=await e.t(n,c.validation,{responses:t,$input:o});if(typeof s==`string`)return{fieldKey:a,error:{fieldKey:c.key,userMessage:s,systemMessage:s,value:o}};if(s===!1)return{fieldKey:a,error:{fieldKey:c.key,userMessage:`This field is invalid`,systemMessage:`Field validation rule returned false.`,value:o}}}return s&&c.required&&l(o)?{fieldKey:a,error:{fieldKey:c.key,userMessage:`This field is required`,systemMessage:`Field is required.`,value:o}}:{fieldKey:a,error:null}}});return(0,t.sample)({clock:a,source:c,filter:(e,{fieldKey:t})=>e[t]===!0,fn:(e,{fieldKey:t,value:n})=>({fieldKey:t,value:n,checkRequired:!1}),target:f}),(0,t.sample)({clock:o,source:c,filter:(e,{fieldKey:t})=>e[t]===!0,fn:(e,{fieldKey:t,value:n})=>({fieldKey:t,value:n,checkRequired:!1}),target:f}),(0,t.sample)({clock:s,fn:({fieldKey:e,value:t})=>({fieldKey:e,value:t,checkRequired:!0}),target:f}),i.on(a,(e,{fieldKey:t,value:n})=>({...e,[t]:n})),i.on(o,(e,{fieldKey:t,value:n})=>({...e,[t]:n})),i.on(s,(e,{fieldKey:t,value:n})=>({...e,[t]:n})),u.on(f.doneData,(e,{fieldKey:t,error:n})=>{if(n===null){let n={...e};return delete n[t],n}return{...e,[t]:n}}),{fieldInputEvent:a,fieldChangeEvent:o,fieldBlurEvent:s,touchedStore:c,fieldErrorsStore:u,formErrorsStore:d,stagedValuesStore:i}}function d(e){let n=[];return{executeFx:(0,t.createEffect)(async(...t)=>await e(n,...t)),register:e=>(n.push(e),()=>{n=n.filter(t=>t!==e)})}}function f({client:e,experienceInstance:n,formId:i,title:a,stepStore:o,fieldsStore:s,goToNextStep:c}){let l=(0,t.createEvent)(),u=(0,t.createEvent)(),f=(0,t.createEvent)(),p=(0,t.createEvent)(),m=(0,t.createEvent)(),h=(0,t.createStore)(!1),g=(0,t.createStore)(!1);g.on(p,()=>!0).on(l,()=>!1);let _=l.map(()=>void 0),v=d(async(e,t)=>{await Promise.all(e.map(e=>Promise.resolve(e(t))))}),y=d(async(e,t)=>{await Promise.all(e.map(e=>Promise.resolve(e(t))))}),b=d(async(e,t)=>{let n=t;for(let t of e){let e=await Promise.resolve(t(n));e!==void 0&&(n=e)}return n}),x=(0,t.createEffect)(async t=>({data:t,errors:(await e.responses.commit(t)).errors})),S=(0,t.attach)({source:{step:o,title:a},mapParams:(e,t)=>({step:t.step,title:t.title,data:e.data}),effect:(0,t.createEffect)(async({step:t,title:r,data:a})=>(e.eventBus({type:`form_submit_success`,form:{id:i,title:r},experience:n,step:t??void 0}),a))}),C=(0,t.attach)({source:{step:o,title:a},mapParams:(e,t)=>({step:t.step,title:t.title,errors:e.errors}),effect:(0,t.createEffect)(async({step:t,title:r,errors:a})=>(e.eventBus({type:`form_submit_error`,form:{id:i,title:r},exception:{reason:a},experience:n,step:t??void 0}),a.forEach(r=>{e.eventBus({type:`field_validation_error`,exception:{reason:[r]},experience:n,step:t??void 0})}),a))});return(0,t.sample)({clock:l,fn:()=>!0,target:h}),(0,t.sample)({clock:l,source:{step:o,title:a},fn:({step:e,title:t})=>({formId:i,title:t,step:e}),target:(0,t.createEffect)(({formId:t,title:r,step:i})=>{e.eventBus({type:`form_submit`,form:{id:t,title:r},experience:n,step:i??void 0})})}),(0,t.sample)({clock:l,source:{stepFields:s},fn:({stepFields:e},t)=>(t.preventDefault(),r(e,new FormData(t.currentTarget))),target:b.executeFx}),(0,t.sample)({clock:b.executeFx.doneData,target:x}),(0,t.split)({source:x.doneData,match:{hasErrors:({errors:e})=>e.length>0},cases:{hasErrors:C,__:S}}),(0,t.sample)({clock:S.doneData,target:u}),(0,t.sample)({clock:u,fn:e=>({data:e,stopNavigation:p}),target:v.executeFx}),(0,t.sample)({clock:v.executeFx.done,target:m}),(0,t.sample)({clock:m,source:g,filter:e=>!e,target:c}),(0,t.sample)({clock:C.doneData,target:f}),(0,t.sample)({clock:f,target:y.executeFx}),(0,t.sample)({clock:[m,y.executeFx.done,b.executeFx.fail,x.fail,S.fail,C.fail,v.executeFx.fail,y.executeFx.fail],fn:()=>!1,target:h}),{submitEvent:l,isFormSubmitting:h,onBeforeSubmit:b.register,onSuccess:v.register,onError:y.register,submitStarted:_,validationErrorsReceived:f}}function p(e){let t=e.currentTarget;if(t instanceof HTMLInputElement)return t.type===`checkbox`?t.checked:t.value;if(t instanceof HTMLSelectElement||t instanceof HTMLTextAreaElement)return t.value}function m(e,n,r,i){let{client:a,experienceInstance:o}=e,{currentStepStore:s,goToNextStep:l}=o,d=(0,t.combine)(s,o,(e,t)=>({stepId:e?.id,experienceId:t.id})),m=(0,t.createStore)({}),{fieldsStore:h}=c(a,i,m);(0,t.sample)({clock:h,source:m,fn:(e,t)=>{let n=!1,r={...e};for(let e of t)e.defaultValue!=null&&!(e.key in r)&&(r[e.key]=e.defaultValue,n=!0);return n?r:e},target:m});let{fieldInputEvent:g,fieldChangeEvent:_,fieldBlurEvent:v,touchedStore:y,fieldErrorsStore:b,formErrorsStore:x}=u(a,h,m),S=(0,t.combine)({fields:h,responses:a.responses.listStore,staged:m,fieldErrors:b,touched:y,experienceAndStepId:d},({fields:e,responses:t,staged:n,fieldErrors:r,touched:i,experienceAndStepId:a})=>e.map(e=>{let o=t=>{let n=p(t);n!==void 0&&g({fieldKey:e.key,value:n})},s=t=>{let n=p(t);n!==void 0&&_({fieldKey:e.key,value:n})},c=t=>{let n=p(t);n!==void 0&&v({fieldKey:e.key,value:n})},l=n[e.key]??t.find(t=>t.fieldKey===e.key)?.value??e.defaultValue,u=r[e.key],d=e.type===`number`?`number`:`text`,f=e.type===`boolean`?`checkbox`:d,{experienceId:m,stepId:h}=a,y=`${m}-${h??`step`}-${e.id}`;return{...e,value:l,error:u,touched:i[e.key]??!1,props:{id:y,name:e.key,key:e.key,value:l,type:f,required:e.required,placeholder:e.placeholder,oninput:o,onchange:s,onblur:c}}})),{submitEvent:C,isFormSubmitting:w,onBeforeSubmit:T,onSuccess:E,onError:D,submitStarted:O,validationErrorsReceived:k}=f({client:a,experienceInstance:o,formId:n,title:r,stepStore:s,fieldsStore:h,goToNextStep:l});return(0,t.sample)({clock:O,fn:()=>({}),target:y}),(0,t.sample)({clock:O,fn:()=>({}),target:b}),(0,t.sample)({clock:k,source:h,fn:(e,t)=>Object.fromEntries(t.map(t=>[e.find(e=>e.key===t.fieldKey)?.key??t.fieldKey,t])),target:b}),{form:{props:{onsubmit:C},errors:x,submitting:w,onBeforeSubmit:T,onSuccess:E,onError:D},fields:S}}exports.buildResponsesFromFormData=r,exports.createFieldEvaluator=c,exports.createFieldValidation=u,exports.createForm=m,exports.createSubmitPipeline=f,exports.getEventValue=p,exports.getStepFields=s;
|
package/dist/cjs/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../rules-logic-DJhGFqhC.cjs`),t=require(`../logger-CJUj90QX.cjs`),n=require(`../supports-CKSVYpQx.cjs`),r=require(`../nodes-DBK4N9YY.cjs`),i=require(`../experience-CTEBY-it.cjs`),a=require(`../storage-B6lQtc4-.cjs`),o=require(`../api-DWa-ZqA4.cjs`),s=require(`../experience-instance-BN0RZG1b.cjs`),c=require(`../id-Cg7fVl1O.cjs`);let l=require(`effector`),u=require(`@withease/factories`);var d=(e,t,n)=>{let r=t.name,i=t.setup(e);if(i){let e=n[r]??{};n[r]=Object.freeze({...e,...i})}},f=(0,l.createDomain)(`component`),p=(0,u.createFactory)(({client:e,component:t,name:n})=>({name:n,component:t,frameworkStore:e.frameworks.getByName(t.frameworkName)}));function m(e){return(0,u.invoke)(p,e)}var h=(0,u.createFactory)(({client:e})=>{let t=f.store({}),n=(0,l.createApi)(t,{register(e,t){return{...e,[t.name]:t}}});function r(r,i){t.getState()[r]&&`${r}`;let a=m({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 g(e){return(0,u.invoke)(h,e)}var _=(e,t,n)=>{n.register(e,t)},v=(0,l.createDomain)(`framework`),y=(0,u.createFactory)(({client:e})=>{let t=v.store({}),n=(0,l.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 ee(e){return(0,u.invoke)(y,e)}var b=(e,t)=>{t.register(e.name,e)},x=6e3,S=a.t(`last_ping`,`global`),C=async e=>{try{let t=Date.now(),n=a.n.get(S),r=0;if(n.isSet()&&(r=n.json()??0),r&&t-r<x)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 te=(0,l.createDomain)(`predicate`),ne=(0,u.createFactory)(({client:e})=>{let t=te.store({}),n=(0,l.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,l.createStore)(()=>void 0,{skipVoid:!1}),r=(0,l.createEffect)(async()=>{let n=a(t).getState();if(!n)return;let r=w(e);return(...e)=>n({...r,args:e})});return(0,l.sample)({source:{responses:e.responses.listStore,fields:e.fields.listStore},target:r}),(0,l.sample)({clock:r.doneData,filter:e=>e!==void 0,target:n}),r(),n}return{register:r,getByName:a,listStore:i,getEvokablePredicate:o}});function re(e){return(0,u.invoke)(ne,e)}var ie=(e,t,n)=>{n.register(e,t)},T=(0,l.createDomain)(`feature`),E=(0,u.createFactory)(({client:e})=>{let t=T.store({}),n=T.store([]),r=(0,l.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,l.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,l.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)}),c=new Map,u=(0,l.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=c.get(`${n}:${i}`);if(s!==void 0){let e=await s;return{id:o.id,bucket:e,key:i,storage:o.feature.storage}}let l=r();c.set(`${n}:${i}`,l);let u=await l;return{id:o.id,bucket:u,key:i,storage:o.feature.storage}}});(0,l.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,l.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,l.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,l.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,l.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,l.createStore)(async()=>void 0,{skipVoid:!1}),r=(0,l.createEffect)(async()=>{let t=f(e).getState();if(t)return async()=>(await t.getBucket()).bucket});return(0,l.sample)({source:n,filter:t=>t.some(t=>t.id===e),target:r}),(0,l.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 D(e){return(0,u.invoke)(E,e)}var O=(e,t,n)=>{n.register(e,t)},k=(0,l.createDomain)(`history`);function A(e,t){return{id:c.t(`history-entry-${Date.now()}-${Math.random()}}`),node:t,at:Date.now(),experienceId:e}}var j=(0,u.createFactory)(()=>{let e=k.store({entries:[]}),t=k.event(),n=k.event(),i=k.event(),a=k.event();e.on(t,(e,t)=>({entries:[...e.entries,A(t.experienceId,t.node)]})),e.on(n,(e,t)=>({entries:[...e.entries.slice(0,-1),A(t.experienceId,t.node)]})),e.on(a,(e,t)=>t);function o(e,t){let n={lastStepIndex:-1,secondLastStepIndex:-1};for(let i=e.length-1;i>=0;i--){let a=e[i],o=a?.node;if(!(!o||!r.a(o))&&!(t&&a.experienceId!==t))if(n.lastStepIndex===-1)n.lastStepIndex=i;else{n.secondLastStepIndex=i;break}}return n}return e.on(i,(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:i,restore:a,entriesStore:e.map(e=>e.entries)}});function M(){return(0,u.invoke)(j)}var N=0,P=e=>{let t=(0,l.createStore)([]);return(0,l.sample)({clock:e,source:t,fn:(e,t)=>[...e,{id:N++,at:new Date,payload:t}],target:t}),t},F=(0,l.createDomain)(`field`),I=(0,u.createFactory)(()=>{let e=F.store({}),t=(0,l.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 L(){return(0,u.invoke)(I)}var R=(0,l.createDomain)(`step`),z=(0,u.createFactory)(()=>{let e=R.store({}),t=(0,l.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 B(){return(0,u.invoke)(z)}function V(e,t){t.register(e)}var H=(0,l.createDomain)(`action`),U=(0,u.createFactory)(({client:e})=>{let t=H.store({}),n=(0,l.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){let n=(0,l.createStore)(()=>void 0,{skipVoid:!1}),r=(0,l.createEffect)(async()=>{let n=a(t).getState();if(!n)return;let r=w(e);return(...e)=>n({...r,args:e})});return(0,l.sample)({source:{responses:e.responses.listStore,fields:e.fields.listStore},target:r}),(0,l.sample)({clock:r.doneData,filter:e=>e!==void 0,target:n}),r(),n}return{register:r,getByKey:a,listStore:i,getEvokableAction:o}});function W(e){return(0,u.invoke)(U,e)}var G=(e,t,n)=>{n.register(e,t)};function K(e,t,n,r){return{fieldKey:e.key,userMessage:n,systemMessage:r,value:t}}function q(e){return e==null||e===``||Array.isArray(e)&&!e.length}function J(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 ae(e,t){return t.find(t=>t.key===e)??null}function oe(e,t){return e.multiple&&(typeof t==`string`||typeof t==`number`||typeof t==`boolean`)?[t]:t}function se(e,t){if(e.type!==`object`||q(t))return null;if(e.multiple){if(!Array.isArray(t))return K(e,t,`This field expects multiple values`,`Field expects an array of objects.`);for(let n of t){if(typeof n!=`object`||!n)return K(e,t,`This field expects object values`,`Field expects an array of objects, but received non-object value.`);if(!Y(n))return K(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)?K(e,t,`This field expects a single value`,`Field expects a single object, not an array.`):typeof t!=`object`||!t?K(e,t,`This field expects an object value`,`Field expects an object value.`):Y(t)?null:K(e,t,`This field contains non-serializable data`,`Field value contains non-JSON-serializable data (functions, circular references, etc.).`)}function ce(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:K(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=>!J(e)||e===null?!1:r.includes(e))?null:K(e,t,`This field expects a valid option`,`Field expects a valid option. Valid options are: ${r.join(`, `)}`)}async function le(t,n,r,i){if(n.validation&&!e.r(n.validation)&&!q(r)){let e=i?{$input:r,responses:i}:{$input:r},a=await t(n.validation,e);if(typeof a==`string`)return K(n,r,a,`Field validation resulted in an error: ${a}.`);if(a===!1)return K(n,r,`This field is invalid`,`Field validation resulted in an unspecified error.`)}return n.required&&q(r)?K(n,r,`This field is required`,`Field is required.`):!n.multiple&&Array.isArray(r)&&r.length>1?K(n,r,`This field expects a single response`,`Field expects a single response.`):null}var ue=(0,l.createDomain)(`response`),de=(0,u.createFactory)(({client:t})=>{let n=ue.store({}),r=(0,l.createEvent)(),i=(0,l.createEvent)(),a=(0,l.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),c=(0,l.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=ae(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=oe(o,n),l=await le(s,o,c,a);if(l){r.push(l);return}let u=se(o,c);if(u){r.push(u);return}let d=ce(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 c(e)}let d=(0,l.attach)({source:n,effect:async(e,t)=>{let{responsesToCommit:n,validationErrors:r}=await c(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,l.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,l.sample)({clock:r,target:a.clearAll}),(0,l.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 fe(e){return(0,u.invoke)(de,e)}var pe=(0,l.createDomain)(`condition`),me=(0,u.createFactory)(()=>{let e=pe.store({}),t=(0,l.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 he(){return(0,u.invoke)(me)}function ge(){if(n.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 _e(){if(!n.d())return{};let e=new URLSearchParams(window.location.search),t={},r=new Set;for(let[t]of e.entries())t.startsWith(`picked-`)&&r.add(t);for(let n of r){let r=n.replace(`picked-`,``);t[r]=e.getAll(n)}let i=a.t(`s`);if(r.size>0)a.r.set(i,t);else{let e=a.r.get(i);if(e)return e.json()||{}}return t}function ve(){return n.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 ye=a.t(`session`,`global`),be=()=>{let e=a.n.get(ye),t;e.isSet()&&(t=e.json());let n=t=>e.set({id:t.id,isUser:t.isUser,identifiers:t.identifiers}),r={id:t?.id??ve(),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},xe=()=>n.o()?be():null;function X(){if(n.d())return globalThis.window.pickedConfig}function Se(){if(!n.d())return;let e=X(),t=e?.organizationId,r=e?.projectId;return t&&r?{organizationId:t,projectId:r}:void 0}function Z(){if(!n.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`),r=e.dataset.projectid||e.getAttribute(`project-id`);return t&&r?{organizationId:t,projectId:r}:void 0}function Ce(e){let{organizationId:t,projectId:n}=e;if(t&&n)return{organizationId:t,projectId:n};let r=Se();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-DV5SUr5M.cjs`),t=require(`../logger-CJUj90QX.cjs`),n=require(`../supports-DFDQ6eJO.cjs`),r=require(`../nodes-Dx9bxj35.cjs`),i=require(`../experience-DOWnsvA1.cjs`),a=require(`../storage-B6lQtc4-.cjs`),o=require(`../api-BAOO2VZv.cjs`),s=require(`../experience-instance-C2jZU8ho.cjs`),c=require(`../id-Cg7fVl1O.cjs`);let l=require(`effector`),u=require(`@withease/factories`);var d=(e,t,n)=>{let r=t.name,i=t.setup(e);if(i){let e=n[r]??{};n[r]=Object.freeze({...e,...i})}},f=(0,l.createDomain)(`component`),p=(0,u.createFactory)(({client:e,component:t,name:n})=>({name:n,component:t,frameworkStore:e.frameworks.getByName(t.frameworkName)}));function m(e){return(0,u.invoke)(p,e)}var h=(0,u.createFactory)(({client:e})=>{let t=f.store({}),n=(0,l.createApi)(t,{register(e,t){return{...e,[t.name]:t}}});function r(r,i){t.getState()[r]&&`${r}`;let a=m({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 g(e){return(0,u.invoke)(h,e)}var _=(e,t,n)=>{n.register(e,t)},v=(0,l.createDomain)(`framework`),y=(0,u.createFactory)(({client:e})=>{let t=v.store({}),n=(0,l.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 ee(e){return(0,u.invoke)(y,e)}var b=(e,t)=>{t.register(e.name,e)},x=6e3,S=a.t(`last_ping`,`global`),C=async e=>{try{let t=Date.now(),n=a.n.get(S),r=0;if(n.isSet()&&(r=n.json()??0),r&&t-r<x)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 te=(0,l.createDomain)(`predicate`),ne=(0,u.createFactory)(({client:e})=>{let t=te.store({}),n=(0,l.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,l.createStore)(()=>void 0,{skipVoid:!1}),r=(0,l.createEffect)(async()=>{let n=a(t).getState();if(!n)return;let r=w(e);return(...e)=>n({...r,args:e})});return(0,l.sample)({source:{responses:e.responses.listStore,fields:e.fields.listStore},target:r}),(0,l.sample)({clock:r.doneData,filter:e=>e!==void 0,target:n}),r(),n}return{register:r,getByName:a,listStore:i,getEvokablePredicate:o}});function re(e){return(0,u.invoke)(ne,e)}var ie=(e,t,n)=>{n.register(e,t)},T=(0,l.createDomain)(`feature`),E=(0,u.createFactory)(({client:e})=>{let t=T.store({}),n=T.store([]),r=(0,l.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,l.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,l.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)}),c=new Map,u=(0,l.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=c.get(`${n}:${i}`);if(s!==void 0){let e=await s;return{id:o.id,bucket:e,key:i,storage:o.feature.storage}}let l=r();c.set(`${n}:${i}`,l);let u=await l;return{id:o.id,bucket:u,key:i,storage:o.feature.storage}}});(0,l.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,l.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,l.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,l.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,l.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,l.createStore)(async()=>void 0,{skipVoid:!1}),r=(0,l.createEffect)(async()=>{let t=f(e).getState();if(t)return async()=>(await t.getBucket()).bucket});return(0,l.sample)({source:n,filter:t=>t.some(t=>t.id===e),target:r}),(0,l.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 D(e){return(0,u.invoke)(E,e)}var O=(e,t,n)=>{n.register(e,t)},k=(0,l.createDomain)(`history`);function A(e,t){return{id:c.t(`history-entry-${Date.now()}-${Math.random()}}`),node:t,at:Date.now(),experienceId:e}}var j=(0,u.createFactory)(()=>{let e=k.store({entries:[]}),t=k.event(),n=k.event(),i=k.event(),a=k.event();e.on(t,(e,t)=>({entries:[...e.entries,A(t.experienceId,t.node)]})),e.on(n,(e,t)=>({entries:[...e.entries.slice(0,-1),A(t.experienceId,t.node)]})),e.on(a,(e,t)=>t);function o(e,t){let n={lastStepIndex:-1,secondLastStepIndex:-1};for(let i=e.length-1;i>=0;i--){let a=e[i],o=a?.node;if(!(!o||!r.a(o))&&!(t&&a.experienceId!==t))if(n.lastStepIndex===-1)n.lastStepIndex=i;else{n.secondLastStepIndex=i;break}}return n}return e.on(i,(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:i,restore:a,entriesStore:e.map(e=>e.entries)}});function M(){return(0,u.invoke)(j)}var N=0,P=e=>{let t=(0,l.createStore)([]);return(0,l.sample)({clock:e,source:t,fn:(e,t)=>[...e,{id:N++,at:new Date,payload:t}],target:t}),t},F=(0,l.createDomain)(`field`),I=(0,u.createFactory)(()=>{let e=F.store({}),t=(0,l.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 L(){return(0,u.invoke)(I)}var R=(0,l.createDomain)(`step`),z=(0,u.createFactory)(()=>{let e=R.store({}),t=(0,l.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 B(){return(0,u.invoke)(z)}function V(e,t){t.register(e)}var H=(0,l.createDomain)(`action`),U=(0,u.createFactory)(({client:e})=>{let t=H.store({}),n=(0,l.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,l.createStore)(()=>void 0,{skipVoid:!1}),i=n?{experience:n.experience}:null,o=(0,l.createEffect)(async()=>{let n=a(t).getState();if(!n)return;let r=w(e);return(...e)=>n({...r,args:e},i)});return(0,l.sample)({source:{responses:e.responses.listStore,fields:e.fields.listStore},target:o}),(0,l.sample)({clock:o.doneData,filter:e=>e!==void 0,target:r}),o(),r}return{register:r,getByKey:a,listStore:i,getEvokableAction:o}});function W(e){return(0,u.invoke)(U,e)}var G=(e,t,n)=>{n.register(e,t)};function K(e,t,n,r){return{fieldKey:e.key,userMessage:n,systemMessage:r,value:t}}function q(e){return e===null||e===``||Array.isArray(e)&&!e.length}function J(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 ae(e,t){return t.find(t=>t.key===e)??null}function oe(e,t){return e.multiple&&(typeof t==`string`||typeof t==`number`||typeof t==`boolean`)?[t]:t}function se(e,t){if(e.type!==`object`||q(t))return null;if(e.multiple){if(!Array.isArray(t))return K(e,t,`This field expects multiple values`,`Field expects an array of objects.`);for(let n of t){if(typeof n!=`object`||!n)return K(e,t,`This field expects object values`,`Field expects an array of objects, but received non-object value.`);if(!Y(n))return K(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)?K(e,t,`This field expects a single value`,`Field expects a single object, not an array.`):typeof t!=`object`||!t?K(e,t,`This field expects an object value`,`Field expects an object value.`):Y(t)?null:K(e,t,`This field contains non-serializable data`,`Field value contains non-JSON-serializable data (functions, circular references, etc.).`)}function ce(e,t){if(q(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:K(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=>!J(e)||e===null?!1:r.includes(e))?null:K(e,t,`This field expects a valid option`,`Field expects a valid option. Valid options are: ${r.join(`, `)}`)}async function le(t,n,r,i){if(n.validation&&!e.r(n.validation)&&!q(r)){let e=i?{$input:r,responses:i}:{$input:r},a=await t(n.validation,e);if(typeof a==`string`)return K(n,r,a,`Field validation resulted in an error: ${a}.`);if(a===!1)return K(n,r,`This field is invalid`,`Field validation resulted in an unspecified error.`)}return n.required&&q(r)?K(n,r,`This field is required`,`Field is required.`):!n.multiple&&Array.isArray(r)&&r.length>1?K(n,r,`This field expects a single response`,`Field expects a single response.`):null}var ue=(0,l.createDomain)(`response`),de=(0,u.createFactory)(({client:t})=>{let n=ue.store({}),r=(0,l.createEvent)(),i=(0,l.createEvent)(),a=(0,l.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),c=(0,l.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=ae(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=oe(o,n),l=await le(s,o,c,a);if(l){r.push(l);return}let u=se(o,c);if(u){r.push(u);return}let d=ce(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 c(e)}let d=(0,l.attach)({source:n,effect:async(e,t)=>{let{responsesToCommit:n,validationErrors:r}=await c(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,l.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,l.sample)({clock:r,target:a.clearAll}),(0,l.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 fe(e){return(0,u.invoke)(de,e)}var pe=(0,l.createDomain)(`condition`),me=(0,u.createFactory)(()=>{let e=pe.store({}),t=(0,l.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 he(){return(0,u.invoke)(me)}function ge(){if(n.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 _e(){if(!n.f())return{};let e=new URLSearchParams(window.location.search),t={},r=new Set;for(let[t]of e.entries())t.startsWith(`picked-`)&&r.add(t);for(let n of r){let r=n.replace(`picked-`,``);t[r]=e.getAll(n)}let i=a.t(`s`);if(r.size>0)a.r.set(i,t);else{let e=a.r.get(i);if(e)return e.json()||{}}return t}function ve(){return n.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 ye=a.t(`session`,`global`),be=()=>{let e=a.n.get(ye),t;e.isSet()&&(t=e.json());let n=t=>e.set({id:t.id,isUser:t.isUser,identifiers:t.identifiers}),r={id:t?.id??ve(),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},xe=()=>n.o()?be():null;function X(){if(n.f())return globalThis.window.pickedConfig}function Se(){if(!n.f())return;let e=X(),t=e?.organizationId,r=e?.projectId;return t&&r?{organizationId:t,projectId:r}:void 0}function Z(){if(!n.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`),r=e.dataset.projectid||e.getAttribute(`project-id`);return t&&r?{organizationId:t,projectId:r}:void 0}function Ce(e){let{organizationId:t,projectId:n}=e;if(t&&n)return{organizationId:t,projectId:n};let r=Se();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
|
-
(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 we={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 Te(e){return typeof e==`object`&&!!e}function Ee(e,t){let n=t;for(let t of e.split(`.`))if(Te(n)&&t in n)n=n[t];else return;return typeof n==`function`?n():n}function De(e,t){let n=e.split(`|`).map(e=>e.trim()),r=Ee(n.shift()??``,t);for(let e of n){let[t,...n]=e.split(`:`),i=t?.trim()??``,a=n.join(`:`).trim().replaceAll(/(?:^['"]|['"]$)/g,``),o=we[i];o&&(r=o(r,a))}return Q(r)?``:typeof r==`object`?JSON.stringify(r):String(r)}function Oe(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+=De(i.trim(),t)}else n+=e[r++];return n}var $=class{static logger=t.t;options;isReady=!1;plugins={};pluginStartHooks=[];eventBus=(0,l.createEvent)();events;organizationId;projectId;apiUrl;dashboardUrl;documentationSiteUrl;session;precondition;condition;preconditionPassed;searchParams=_e();history=M();components=g({client:this});experienceInstances=s.n({client:this});experiences=i.t({client:this});frameworks=ee({client:this});predicates=re({client:this});features=D({client:this});conditions=he();fields=L();responses=fe({client:this});steps=B();actions=W({client:this});constructor(e){this.events=P(this.eventBus);let{organizationId:t,projectId:n}=Ce(e);this.organizationId=t,this.projectId=n,this.options=Object.freeze(e),this.apiUrl=e.apiUrl||ge(),this.dashboardUrl=e.dashboardUrl??`https://dashboard.picked.app`,this.documentationSiteUrl=e.documentationSiteUrl??`https://docs.picked.app`,this.session=xe(),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=()=>{C(this),(async()=>{if(!n.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 a=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`}),a&&i.n(this),await r.c(),a&&i.n(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=>{b(e,this.frameworks)};registerComponent=(e,t)=>{_(e,t,this.components)};registerPlugin=e=>{d(this,e,this.plugins);let t=this.plugins[e.name];t?.onStart&&this.pluginStartHooks.push(t.onStart)};registerFeature=(e,t)=>{O(e,t,this.features)};registerPredicate=(e,t)=>{ie(e,t,this.predicates)};registerCondition=e=>{this.conditions.register(e)};registerField=e=>{this.fields.register(e)};registerStep=e=>{V(e,this.steps)};registerAction=(e,t)=>{G(e,t,this.actions)};registerExperience=e=>{e.component&&_(`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 Oe(e,{...t,responses:n})}};function ke(e){return{$$type:`lazy-component`,load:e}}function Ae(e){return typeof e==`object`&&!!e&&`$$type`in e&&e.$$type===`lazy-component`}var je=e=>{let t=new $(e);return n.
|
|
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 we={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 Te(e){return typeof e==`object`&&!!e}function Ee(e,t){let n=t;for(let t of e.split(`.`))if(Te(n)&&t in n)n=n[t];else return;return typeof n==`function`?n():n}function De(e,t){let n=e.split(`|`).map(e=>e.trim()),r=Ee(n.shift()??``,t);for(let e of n){let[t,...n]=e.split(`:`),i=t?.trim()??``,a=n.join(`:`).trim().replaceAll(/(?:^['"]|['"]$)/g,``),o=we[i];o&&(r=o(r,a))}return Q(r)?``:typeof r==`object`?JSON.stringify(r):String(r)}function Oe(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+=De(i.trim(),t)}else n+=e[r++];return n}var $=class{static logger=t.t;options;isReady=!1;plugins={};pluginStartHooks=[];eventBus=(0,l.createEvent)();events;organizationId;projectId;apiUrl;dashboardUrl;documentationSiteUrl;session;precondition;condition;preconditionPassed;searchParams=_e();history=M();components=g({client:this});experienceInstances=s.n({client:this});experiences=i.t({client:this});frameworks=ee({client:this});predicates=re({client:this});features=D({client:this});conditions=he();fields=L();responses=fe({client:this});steps=B();actions=W({client:this});constructor(e){this.events=P(this.eventBus);let{organizationId:t,projectId:n}=Ce(e);this.organizationId=t,this.projectId=n,this.options=Object.freeze(e),this.apiUrl=e.apiUrl||ge(),this.dashboardUrl=e.dashboardUrl??`https://dashboard.picked.app`,this.documentationSiteUrl=e.documentationSiteUrl??`https://docs.picked.app`,this.session=xe(),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=()=>{C(this),(async()=>{if(!n.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 a=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`}),a&&i.n(this),await r.c(),a&&i.n(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=>{b(e,this.frameworks)};registerComponent=(e,t)=>{_(e,t,this.components)};registerPlugin=e=>{d(this,e,this.plugins);let t=this.plugins[e.name];t?.onStart&&this.pluginStartHooks.push(t.onStart)};registerFeature=(e,t)=>{O(e,t,this.features)};registerPredicate=(e,t)=>{ie(e,t,this.predicates)};registerCondition=e=>{this.conditions.register(e)};registerField=e=>{this.fields.register(e)};registerStep=e=>{V(e,this.steps)};registerAction=(e,t)=>{G(e,t,this.actions)};registerExperience=e=>{e.component&&_(`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 Oe(e,{...t,responses:n})}};function ke(e){return{$$type:`lazy-component`,load:e}}function Ae(e){return typeof e==`object`&&!!e&&`$$type`in e&&e.$$type===`lazy-component`}var je=e=>{let t=new $(e);return n.m(t),t};exports.Picked=$,exports.createClient=je,exports.createStorageKey=a.t,exports.evaluateRuleLogic=e.t,exports.getPickedConfig=X,exports.isLazyLoader=Ae,exports.isPickedRoot=r.u,exports.lazyComponent=ke,exports.localStore=a.n,exports.sessionStore=a.r,exports.subscribe=a.i,exports.supportsCookies=n.t,exports.supportsCryptoRandomUUID=n.n,exports.supportsDocument=n.r,exports.supportsHistory=n.i,exports.supportsIntersectionObserver=n.a,exports.supportsLocalStorage=n.o,exports.supportsLocation=n.s,exports.supportsNavigation=n.c,exports.supportsSessionStorage=n.l,exports.supportsShadowRoot=n.u,exports.supportsWebComponents=n.d,exports.supportsWindow=n.f;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`}),require(`../../../logger-CJUj90QX.cjs`);const e=require(`../../../api-
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`}),require(`../../../logger-CJUj90QX.cjs`);const e=require(`../../../api-BAOO2VZv.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 +1 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`}),require(`../../../logger-CJUj90QX.cjs`);const e=require(`../../../storage-B6lQtc4-.cjs`);let
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`}),require(`../../../logger-CJUj90QX.cjs`);const e=require(`../../../supports-DFDQ6eJO.cjs`),t=require(`../../../storage-B6lQtc4-.cjs`);let n=require(`effector`);var r=({storage:r=`local`}={})=>({name:`experience-browser-storage-plugin`,setup:i=>{if(!e.f())return;let a=r===`local`?t.n:t.r,o=(0,n.createEffect)(async e=>{if(!e)return;let n=t.t(`open-close`,`experience`,e),r=a.get(n).boolean();e.setOpen(r??e.isOpenStore.getState())});(0,n.sample)({source:i.eventBus,filter:e=>e.type===`experience_initialize`&&`experience`in e,fn:e=>e.experience,target:o});let s=(0,n.createEffect)(async e=>{let n=t.t(`open-close`,`experience`,e),r=e.isOpenStore.getState();a.set(n,r)}),c=e=>(0,n.sample)({source:e.isOpenStore,fn:()=>e,target:s});i.experienceInstances.listStore.watch(e=>{e.forEach(e=>c(e))})}});exports.experienceBrowserStoragePlugin=r;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../../../storage-B6lQtc4-.cjs`);let
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../../../supports-DFDQ6eJO.cjs`),t=require(`../../../storage-B6lQtc4-.cjs`);let n=require(`effector`);var r=t.t(`history`,`global`),i=({storage:i=`local`}={})=>({name:`history-browser-storage-plugin`,setup:a=>{if(!e.f())return;let o=i===`local`?t.n:t.r,s=(0,n.createEffect)(async()=>{let e=o.get(r).json();e&&a.history.restore({entries:e})}),c=(0,n.createEffect)(async e=>{o.set(r,e)});(0,n.sample)({source:a.eventBus,filter:e=>e.type===`load`,target:s}),(0,n.sample)({source:a.history.entriesStore,target:c})}});exports.historyBrowserStoragePlugin=i;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../../../storage-B6lQtc4-.cjs`);let
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../../../supports-DFDQ6eJO.cjs`),t=require(`../../../storage-B6lQtc4-.cjs`);let n=require(`effector`);var r=t.t(`responses`,`global`);function i(e,t){return Object.fromEntries(Object.entries(e).flatMap(([e,n])=>t.find(t=>t.key===e)?.policies?.doNotStoreValue?[]:[[e,n]]))}var a=({storage:a=`local`}={})=>({name:`responses-browser-storage-plugin`,setup:o=>{if(!e.f())return;let s=a===`local`?t.n:t.r,c=(0,n.createEffect)(async()=>{let e=s.get(r).json();if(!e)return null;o.responses.register(e)}),l=(0,n.attach)({source:{responses:o.responses.getAllStore,fields:o.fields.listStore},effect:({responses:e,fields:t})=>{s.set(r,i(e,t))}});(0,n.sample)({source:o.eventBus,filter:e=>e.type===`load`,target:c}),(0,n.sample)({source:o.responses.getAllStore,target:l})}});exports.responsesBrowserStoragePlugin=a;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../../../supports-DFDQ6eJO.cjs`);let t=require(`effector`);var n=`picked`;async function r(e){let{storeName:t,version:r=1,keyPath:i=`id`}=e;return new Promise((e,a)=>{let o=indexedDB.open(n,r);o.onupgradeneeded=()=>{let e=o.result;e.objectStoreNames.contains(t)||e.createObjectStore(t,i?{keyPath:i}:void 0)},o.onsuccess=()=>e(o.result),o.onerror=()=>a(Error(o.error?.message))})}async function i(e,t){return new Promise((n,r)=>{let i=e.transaction(t,`readonly`).objectStore(t).getAll();i.onsuccess=()=>n(i.result),i.onerror=()=>r(Error(i.error?.message))})}async function a(e,t,n){return new Promise((r,i)=>{let a=e.transaction(t,`readwrite`).objectStore(t).put(n);a.onsuccess=()=>r(),a.onerror=()=>i(Error(a.error?.message))})}async function o(e,t,n){return new Promise((r,i)=>{let a=e.transaction(t,`readwrite`).objectStore(t).delete(n);a.onsuccess=()=>r(),a.onerror=()=>i(Error(a.error?.message))})}async function s(e,t){return new Promise((n,r)=>{let i=e.transaction(t,`readwrite`).objectStore(t).clear();i.onsuccess=()=>n(),i.onerror=()=>r(Error(i.error?.message))})}var c=`responses`,l={storeName:c,keyPath:`fieldKey`,version:2},u=()=>({name:`responses-indexdb-plugin`,setup:n=>{if(!e.f())return;let u=(0,t.createEffect)(async()=>{let e=(await i(await r(l),c)).reduce((e,{fieldKey:t,value:n})=>(e[t]=n,e),{});await n.responses.commit(e)}),d=(0,t.createEffect)(async e=>{await Promise.allSettled(e.map(async e=>{await a(await r(l),c,e)}))}),f=(0,t.createEffect)(async()=>{await s(await r(l),c)}),p=(0,t.createEffect)(async e=>{await o(await r(l),c,e)});(0,t.sample)({source:n.eventBus,filter:e=>e.type===`load`,target:u}),(0,t.sample)({clock:n.responses.listStore,source:{responses:n.responses.listStore,fields:n.fields.listStore},fn:({responses:e,fields:t})=>{let n=new Set(t.filter(e=>!e.policies?.doNotStoreValue).map(e=>e.key));return e.filter(e=>n.has(e.fieldKey)).map(e=>({fieldKey:e.fieldKey,value:e.value}))},target:d}),(0,t.sample)({clock:n.responses.clearAll,target:f}),(0,t.sample)({clock:n.responses.clear,target:p})}});exports.responsesIndexedDBPlugin=u;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../../../rules-logic-
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../../../rules-logic-DV5SUr5M.cjs`),t=require(`../../../logger-CJUj90QX.cjs`),n=require(`../../../supports-DFDQ6eJO.cjs`),r=require(`../../../experience-DOWnsvA1.cjs`);var i=n.p,a=1e3,o=150,s=new WeakMap,c=new WeakSet,l=(e={})=>{let t=d(e),r=e.instrumentHistory!==!1;return{name:`single-page-app`,setup:e=>{n.f()&&(c.has(e)||(c.add(e),h(()=>f(e,t),{fallbackToHistory:r})))}}};function u(e){n.f()&&f(e,{maxWindowMs:a,idleDebounceMs:o})}function d(e){return{maxWindowMs:e.maxWindowMs??a,idleDebounceMs:e.idleDebounceMs??o}}function f(e,t){s.get(e)?.stop();let n=p(e,t);n&&s.set(e,n)}function p(e,n){if(!m())return;let i=!1,a=!1,o=!1,s,c,l,u,d,f=()=>{i||(i=!0,u!==void 0&&(cancelAnimationFrame(u),u=void 0),d!==void 0&&(cancelAnimationFrame(d),d=void 0),s&&=(s.disconnect(),void 0),c!==void 0&&(clearTimeout(c),c=void 0),l!==void 0&&(clearTimeout(l),l=void 0))},p=()=>{if(!i){if(a){o=!0;return}a=!0,Promise.resolve(r.n(e)).catch(e=>t.t(`error`,e)).finally(()=>{a=!1,o&&!i&&(o=!1,h())})}},h=()=>{i||d!==void 0||(d=requestAnimationFrame(()=>{d=void 0,p()}))},g=()=>{l!==void 0&&clearTimeout(l),l=setTimeout(f,n.idleDebounceMs)};u=requestAnimationFrame(()=>{u=void 0,p()});let _=new MutationObserver(()=>{i||(h(),g())});return _.observe(document.body,{childList:!0,subtree:!0}),s=_,c=setTimeout(f,n.maxWindowMs),{stop:f}}function m(){return!(!n.r()||typeof MutationObserver!=`function`||typeof requestAnimationFrame!=`function`||!document.body)}function h(e,t={fallbackToHistory:!0}){if(n.c()){let t=i.navigation;if(t){let n=i.location.href;t.addEventListener(`navigatesuccess`,()=>{let t=i.location.href,r=n;n=t,r!==t&&e()});return}}t.fallbackToHistory&&g(e)}function g(t){let r=n.s()?i.location.href:void 0;if(i.addEventListener(`popstate`,()=>{let e=i.location.href,n=r;r=e,n!==e&&t()}),!n.i()||e.i(i.history.pushState)&&e.i(i.history.replaceState))return;function a(e){return function(...n){let i=n.length>2?n[2]:void 0;if(i){let a=r,o=String(i);if(r=o,a===o)return e.apply(this,n);t()}return e.apply(this,n)}}e.a(i.history,`pushState`,a),e.a(i.history,`replaceState`,a)}exports.notifyNavigation=u,exports.singlePageAppPlugin=l;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../../../supports-
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../../../supports-DFDQ6eJO.cjs`);var t=()=>({name:`web-components`,setup:t=>{if(!e.f()||!e.d())return;let n=`picked-root`;if(window.customElements.get(n))return;class r extends HTMLElement{connectedCallback(){let e=this.getAttribute(`experience-id`);t.isReady&&e&&t.experiences.launch({id:e})}}window.customElements.define(n,r)}});exports.webComponentsPlugin=t;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../../../supports-
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../../../supports-DFDQ6eJO.cjs`);var t=()=>({name:`window`,setup:t=>{e.f()&&(window.Picked=t)}});exports.windowObjectPlugin=t;
|
package/dist/cjs/server/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../../experience-instance-
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../../experience-instance-C2jZU8ho.cjs`);let t=require(`effector`);function n(){let e,t;return{promise:new Promise((n,r)=>{e=n,t=r}),resolve:t=>e(t),reject:e=>t(e)}}function r(r,i){let{promise:a,resolve:o}=n(),s=(0,t.createEvent)(),c=(0,t.createEvent)(),l=(0,t.createEvent)(),u=(0,t.createEvent)(),d=(0,t.createEvent)(),f=r.experiences.listStore.map(t=>t.map(t=>e.t({client:r,experience:t}))),p=(0,t.createStore)({currentExperienceIndex:0,renderedExperiences:[],isComplete:!1}),m=(0,t.createEffect)(async({experience:e,availableRenderers:t,startRendererIndex:n=0})=>{if(!e)return null;for(let i=n;i<t.length;i++){let n=t[i],a=e.componentStore.getState();if(a&&n?.isValidComponent(a.component))return{rendered:await n.render(a.component,r,e),rendererIndex:i}}return null});return p.on(l,(e,t)=>({...e,renderedExperiences:[...e.renderedExperiences,t],currentExperienceIndex:e.currentExperienceIndex+1})).on(d,e=>({...e,currentExperienceIndex:e.currentExperienceIndex+1})).on(u,e=>({...e,isComplete:!0})).reset(s),(0,t.sample)({clock:s,target:c}),(0,t.sample)({clock:c,source:{experiences:f,state:p},filter:({experiences:e,state:t})=>t.currentExperienceIndex<e.length&&!t.isComplete,fn:({experiences:e,state:t})=>({experience:e[t.currentExperienceIndex],availableRenderers:i,startRendererIndex:0}),target:m}),(0,t.sample)({clock:m.doneData,filter:e=>e!==null,fn:e=>e.rendered.body,target:l}),(0,t.sample)({clock:l,target:c}),(0,t.sample)({clock:m.doneData,filter:e=>e===null,target:d}),(0,t.sample)({clock:d,target:c}),(0,t.sample)({clock:[c,d,l],source:{experiences:f,state:p},filter:({experiences:e,state:t})=>t.currentExperienceIndex>=e.length,target:u}),(0,t.sample)({clock:u,target:(0,t.attach)({source:p,effect:e=>{e.isComplete&&o(e.renderedExperiences)}})}),s(),a}exports.render=r;
|
|
@@ -2,10 +2,17 @@
|
|
|
2
2
|
layout: docs
|
|
3
3
|
---
|
|
4
4
|
|
|
5
|
+
import { Screenshot } from '../../components/Screenshot'
|
|
6
|
+
|
|
5
7
|
# Actions
|
|
6
8
|
|
|
7
9
|
An action is a side effect that triggers when the flow reaches it. Use actions for tasks like tracking events, sending data to external services, or triggering webhooks.
|
|
8
10
|
|
|
11
|
+
<Screenshot
|
|
12
|
+
route="/{orgSlug}/{projectId}/workspaces/{workspaceId}/actions"
|
|
13
|
+
alt="The actions list for a workspace on the Picked dashboard"
|
|
14
|
+
/>
|
|
15
|
+
|
|
9
16
|
## Create an action
|
|
10
17
|
|
|
11
18
|
1. Open your project.
|
|
@@ -2,10 +2,17 @@
|
|
|
2
2
|
layout: docs
|
|
3
3
|
---
|
|
4
4
|
|
|
5
|
+
import { Screenshot } from '../../components/Screenshot'
|
|
6
|
+
|
|
5
7
|
# API keys
|
|
6
8
|
|
|
7
9
|
API keys let you access Picked's API programmatically. Use them for server-side integrations or CI/CD workflows.
|
|
8
10
|
|
|
11
|
+
<Screenshot
|
|
12
|
+
route="/{orgSlug}/api-keys"
|
|
13
|
+
alt="The API keys list for an organization on the Picked dashboard"
|
|
14
|
+
/>
|
|
15
|
+
|
|
9
16
|
## Create an API key
|
|
10
17
|
|
|
11
18
|
1. Open your organization.
|
|
@@ -2,10 +2,17 @@
|
|
|
2
2
|
layout: docs
|
|
3
3
|
---
|
|
4
4
|
|
|
5
|
+
import { Screenshot } from '../../components/Screenshot'
|
|
6
|
+
|
|
5
7
|
# Conditions
|
|
6
8
|
|
|
7
9
|
A condition evaluates logic and branches the flow into two paths — one for when the condition is true, another for when it's false.
|
|
8
10
|
|
|
11
|
+
<Screenshot
|
|
12
|
+
route="/{orgSlug}/{projectId}/workspaces/{workspaceId}/conditions"
|
|
13
|
+
alt="The conditions list for a workspace on the Picked dashboard"
|
|
14
|
+
/>
|
|
15
|
+
|
|
9
16
|
## Create a condition
|
|
10
17
|
|
|
11
18
|
1. Open your project.
|
|
@@ -2,10 +2,17 @@
|
|
|
2
2
|
layout: docs
|
|
3
3
|
---
|
|
4
4
|
|
|
5
|
+
import { Screenshot } from '../../components/Screenshot'
|
|
6
|
+
|
|
5
7
|
# Experiences
|
|
6
8
|
|
|
7
9
|
An experience is a personalized UI flow delivered to visitors on your site. Each experience maps to a component registered in your application.
|
|
8
10
|
|
|
11
|
+
<Screenshot
|
|
12
|
+
route="/{orgSlug}/{projectId}/workspaces/{workspaceId}/experiences"
|
|
13
|
+
alt="The experiences list for a workspace on the Picked dashboard"
|
|
14
|
+
/>
|
|
15
|
+
|
|
9
16
|
## Create an experience
|
|
10
17
|
|
|
11
18
|
1. Open your project.
|
|
@@ -2,10 +2,17 @@
|
|
|
2
2
|
layout: docs
|
|
3
3
|
---
|
|
4
4
|
|
|
5
|
+
import { Screenshot } from '../../components/Screenshot'
|
|
6
|
+
|
|
5
7
|
# Features
|
|
6
8
|
|
|
7
9
|
Features let you run A/B tests and feature flags. Control which visitors see which variant of your site without deploying code changes.
|
|
8
10
|
|
|
11
|
+
<Screenshot
|
|
12
|
+
route="/{orgSlug}/{projectId}/workspaces/{workspaceId}/features"
|
|
13
|
+
alt="The features list for a workspace on the Picked dashboard"
|
|
14
|
+
/>
|
|
15
|
+
|
|
9
16
|
## Create a feature
|
|
10
17
|
|
|
11
18
|
1. Open your project.
|
|
@@ -2,10 +2,17 @@
|
|
|
2
2
|
layout: docs
|
|
3
3
|
---
|
|
4
4
|
|
|
5
|
+
import { Screenshot } from '../../components/Screenshot'
|
|
6
|
+
|
|
5
7
|
# Fields
|
|
6
8
|
|
|
7
9
|
A field is a data input shown to visitors inside a step. Fields collect information like names, email addresses, preferences, or selections.
|
|
8
10
|
|
|
11
|
+
<Screenshot
|
|
12
|
+
route="/{orgSlug}/{projectId}/workspaces/{workspaceId}/fields"
|
|
13
|
+
alt="The fields list for a workspace on the Picked dashboard"
|
|
14
|
+
/>
|
|
15
|
+
|
|
9
16
|
## Create a field
|
|
10
17
|
|
|
11
18
|
1. Open your project.
|
|
@@ -2,10 +2,17 @@
|
|
|
2
2
|
layout: docs
|
|
3
3
|
---
|
|
4
4
|
|
|
5
|
+
import { Screenshot } from '../../../components/Screenshot'
|
|
6
|
+
|
|
5
7
|
# Flow builder
|
|
6
8
|
|
|
7
9
|
The flow builder is a visual editor for designing experience flows. You drag blocks onto a canvas, connect them with arrows, and configure each node in an inspector panel.
|
|
8
10
|
|
|
11
|
+
<Screenshot
|
|
12
|
+
route="/{orgSlug}/{projectId}/workspaces/{workspaceId}/experiences/{experienceId}"
|
|
13
|
+
alt="The flow builder with the entity browser, canvas, and inspector panels"
|
|
14
|
+
/>
|
|
15
|
+
|
|
9
16
|
## Layout
|
|
10
17
|
|
|
11
18
|
The flow builder has three panels arranged left to right.
|
|
@@ -4,7 +4,7 @@ layout: docs
|
|
|
4
4
|
|
|
5
5
|
# Data sources
|
|
6
6
|
|
|
7
|
-
PickedQL provides four virtual tables
|
|
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
|
|
|
@@ -53,6 +53,9 @@ All filters pass through the **outer `WHERE`** — PickedQL extracts them as par
|
|
|
53
53
|
| `num_nodes_after_start` | Forward window size from the starting step (card 4129 semantics). |
|
|
54
54
|
| `num_nodes_before_target` | Backward window size from the targeting step (card 2740 semantics). Requires `targeting_step`. |
|
|
55
55
|
| `top_n_path` | Keep only the top-N distinct paths by user count. |
|
|
56
|
+
| `user_cohort_event` | Restrict to users who have at least one `fact_events` row with this `event_type` (e.g., `'lead_capture'`). Useful for "paths taken by users who eventually converted". |
|
|
57
|
+
| `client_local_date` | Date filter. Supports `=`, `<`, `<=`, `>`, `>=`, `BETWEEN`; pushed into the underlying `fact_events` scan. |
|
|
58
|
+
| `event_timestamp` | Server-side timestamp filter. Same operators as `client_local_date`. |
|
|
56
59
|
|
|
57
60
|
When `num_nodes_after_start` and `num_nodes_before_target` are both set, both predicates apply (intersection).
|
|
58
61
|
|
|
@@ -63,6 +66,8 @@ WHERE project_id = 'your-project-id'
|
|
|
63
66
|
AND starting_step = 'step-start'
|
|
64
67
|
AND targeting_step = 'step-target'
|
|
65
68
|
AND num_nodes_after_start = 10
|
|
69
|
+
AND client_local_date >= '2026-04-01' -- optional date range
|
|
70
|
+
AND client_local_date <= '2026-04-30'
|
|
66
71
|
```
|
|
67
72
|
|
|
68
73
|
```sql
|
|
@@ -85,6 +90,16 @@ WHERE project_id = 'your-project-id'
|
|
|
85
90
|
AND num_nodes_after_start = 10
|
|
86
91
|
```
|
|
87
92
|
|
|
93
|
+
```sql
|
|
94
|
+
-- Cohort sankey: only users who eventually converted (card 3961 pattern)
|
|
95
|
+
SELECT source, target, users FROM experience_journey
|
|
96
|
+
WHERE project_id = 'your-project-id'
|
|
97
|
+
AND starting_step = 'step-start'
|
|
98
|
+
AND targeting_step = 'step-target'
|
|
99
|
+
AND num_nodes_after_start = 10
|
|
100
|
+
AND user_cohort_event = 'lead_capture' -- restrict to users with ≥1 lead_capture event
|
|
101
|
+
```
|
|
102
|
+
|
|
88
103
|
Columns returned:
|
|
89
104
|
|
|
90
105
|
| Column | Type | Description |
|
|
@@ -95,4 +110,36 @@ Columns returned:
|
|
|
95
110
|
|
|
96
111
|
:::note
|
|
97
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.
|
|
98
|
-
:::
|
|
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,46 @@ 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
|
+
```
|
|
38
|
+
|
|
39
|
+
Auto-joins also work inside subqueries and CTEs — reference dimension columns wherever you need them and the required `LEFT JOIN` is injected at that level:
|
|
40
|
+
|
|
41
|
+
```sql
|
|
42
|
+
-- Dimension columns inside a CTE
|
|
43
|
+
WITH per_step AS (
|
|
44
|
+
SELECT step_title, count(*) AS n
|
|
45
|
+
FROM events
|
|
46
|
+
WHERE project_id = 'your-project-id'
|
|
47
|
+
GROUP BY step_title
|
|
48
|
+
)
|
|
49
|
+
SELECT * FROM per_step ORDER BY n DESC
|
|
50
|
+
|
|
51
|
+
-- Dimension columns inside a nested SELECT
|
|
52
|
+
SELECT step_title, n FROM (
|
|
53
|
+
SELECT step_title, count(*) AS n FROM events
|
|
54
|
+
WHERE project_id = 'your-project-id'
|
|
55
|
+
GROUP BY step_title
|
|
56
|
+
) sub
|
|
57
|
+
```
|
|
18
58
|
|
|
19
59
|
## Native event columns
|
|
20
60
|
|
|
@@ -87,6 +87,46 @@ FROM events
|
|
|
87
87
|
WHERE project_id = '{{ your project ID }}'
|
|
88
88
|
```
|
|
89
89
|
|
|
90
|
+
## Custom segment with `control_users` / `variant_users`
|
|
91
|
+
|
|
92
|
+
On `events`, `control_users` / `variant_users` / `control_sessions` / `variant_sessions` accept an optional filter string to count only users/sessions matching the given expression in addition to the implicit `variant_type` filter.
|
|
93
|
+
|
|
94
|
+
```sql
|
|
95
|
+
-- Control users who fired app_initialize, broken down by step
|
|
96
|
+
SELECT
|
|
97
|
+
step_id,
|
|
98
|
+
control_users('event_type=app_initialize') AS control_initialized,
|
|
99
|
+
variant_users('event_type=app_initialize') AS variant_initialized
|
|
100
|
+
FROM events
|
|
101
|
+
WHERE project_id = '{{ your project ID }}'
|
|
102
|
+
AND client_local_date >= '2026-04-01'
|
|
103
|
+
GROUP BY step_id
|
|
104
|
+
ORDER BY control_initialized DESC
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
The named form (`filter=`) is also supported:
|
|
108
|
+
|
|
109
|
+
```sql
|
|
110
|
+
SELECT control_users(filter='event_type=form_submit AND step_id=lead-capture') FROM events
|
|
111
|
+
WHERE project_id = '{{ your project ID }}'
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
## Conversion rate from nested virtual functions
|
|
115
|
+
|
|
116
|
+
When numerator and denominator come from different segments — e.g., Control users who fired a custom event divided by **all** users (not just Control) — pass virtual function calls directly as conversion-rate args:
|
|
117
|
+
|
|
118
|
+
```sql
|
|
119
|
+
-- (Control users who fired app_initialize) / (all users, regardless of variant)
|
|
120
|
+
SELECT
|
|
121
|
+
control_conversion_rate(
|
|
122
|
+
control_users('event_type=app_initialize'),
|
|
123
|
+
all_users()
|
|
124
|
+
) AS control_initialize_rate
|
|
125
|
+
FROM events
|
|
126
|
+
WHERE project_id = '{{ your project ID }}'
|
|
127
|
+
AND client_local_date >= '2026-04-01'
|
|
128
|
+
```
|
|
129
|
+
|
|
90
130
|
## A/B test by device
|
|
91
131
|
|
|
92
132
|
```sql
|
|
@@ -138,7 +178,7 @@ ORDER BY project_local_date, device_category
|
|
|
138
178
|
SELECT
|
|
139
179
|
utm_source,
|
|
140
180
|
all_users() AS users,
|
|
141
|
-
|
|
181
|
+
all_purchase_users() AS purchasers
|
|
142
182
|
FROM metrics
|
|
143
183
|
WHERE project_id = '{{ your project ID }}'
|
|
144
184
|
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.
|