@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.
Files changed (77) hide show
  1. package/dist/{api-DWa-ZqA4.cjs → api-BAOO2VZv.cjs} +1 -1
  2. package/dist/{api-DtOVNMSX.js → api-CiR56vZg.js} +1 -1
  3. package/dist/cjs/form/index.js +1 -1
  4. package/dist/cjs/index.js +2 -2
  5. package/dist/cjs/plugins/dynamic-experiences/index.js +1 -1
  6. package/dist/cjs/plugins/experience-browser-storage/index.js +1 -1
  7. package/dist/cjs/plugins/history-browser-storage/index.js +1 -1
  8. package/dist/cjs/plugins/responses-browser-storage/index.js +1 -1
  9. package/dist/cjs/plugins/responses-indexeddb/index.js +1 -1
  10. package/dist/cjs/plugins/single-page-app/index.js +1 -1
  11. package/dist/cjs/plugins/web-components/index.js +1 -1
  12. package/dist/cjs/plugins/window-object/index.js +1 -1
  13. package/dist/cjs/server/index.js +1 -1
  14. package/dist/docs/{actions.md → actions.mdx} +7 -0
  15. package/dist/docs/{api-keys.md → api-keys.mdx} +7 -0
  16. package/dist/docs/{conditions.md → conditions.mdx} +7 -0
  17. package/dist/docs/{experiences.md → experiences.mdx} +7 -0
  18. package/dist/docs/{features.md → features.mdx} +7 -0
  19. package/dist/docs/{fields.md → fields.mdx} +7 -0
  20. package/dist/docs/flow-builder/{overview.md → overview.mdx} +7 -0
  21. package/dist/docs/pickedql/data-sources.md +49 -2
  22. package/dist/docs/pickedql/dimensions.md +40 -0
  23. package/dist/docs/pickedql/examples.md +41 -1
  24. package/dist/docs/pickedql/filtering.md +22 -0
  25. package/dist/docs/pickedql/index.md +2 -1
  26. package/dist/docs/pickedql/schema.md +34 -1
  27. package/dist/docs/pickedql/virtual-functions.md +67 -11
  28. package/dist/docs/{projects.md → projects.mdx} +7 -0
  29. package/dist/docs/{reports.md → reports.mdx} +7 -0
  30. package/dist/docs/{steps.md → steps.mdx} +7 -0
  31. package/dist/docs/{workspaces.md → workspaces.mdx} +8 -0
  32. package/dist/esm/form/index.js +21 -6
  33. package/dist/esm/index.js +174 -174
  34. package/dist/esm/plugins/dynamic-experiences/index.js +1 -1
  35. package/dist/esm/plugins/experience-browser-storage/index.js +20 -18
  36. package/dist/esm/plugins/history-browser-storage/index.js +17 -15
  37. package/dist/esm/plugins/responses-browser-storage/index.js +21 -19
  38. package/dist/esm/plugins/responses-indexeddb/index.js +37 -35
  39. package/dist/esm/plugins/single-page-app/index.js +88 -42
  40. package/dist/esm/plugins/web-components/index.js +2 -2
  41. package/dist/esm/plugins/window-object/index.js +1 -1
  42. package/dist/esm/server/index.js +1 -1
  43. package/dist/{experience-CNIhapU2.js → experience-CR19HpPg.js} +2 -2
  44. package/dist/{experience-CTEBY-it.cjs → experience-DOWnsvA1.cjs} +1 -1
  45. package/dist/experience-instance-C2jZU8ho.cjs +1 -0
  46. package/dist/{experience-instance-B0tFPMAU.js → experience-instance-CGLdwg--.js} +12 -8
  47. package/dist/{nodes-2fst8XKi.js → nodes-Bmzx3TP_.js} +7 -7
  48. package/dist/{nodes-DBK4N9YY.cjs → nodes-Dx9bxj35.cjs} +1 -1
  49. package/dist/{rules-logic-D7dL30U1.js → rules-logic-CvILqbhz.js} +8 -5
  50. package/dist/{rules-logic-DJhGFqhC.cjs → rules-logic-DV5SUr5M.cjs} +1 -1
  51. package/dist/supports-DFDQ6eJO.cjs +1 -0
  52. package/dist/{supports-B_trw6lj.js → supports-DUJbucFW.js} +18 -9
  53. package/dist/types/entities/action/action.d.ts +30 -4
  54. package/dist/types/entities/action/action.d.ts.map +1 -1
  55. package/dist/types/entities/experience-instance/experience-instance.d.ts +4 -2
  56. package/dist/types/entities/experience-instance/experience-instance.d.ts.map +1 -1
  57. package/dist/types/entities/framework/framework.d.ts +12 -2
  58. package/dist/types/entities/framework/framework.d.ts.map +1 -1
  59. package/dist/types/entities/response/response-validation.d.ts +17 -17
  60. package/dist/types/entities/response/response-validation.d.ts.map +1 -1
  61. package/dist/types/form/create-field-evaluator.d.ts.map +1 -1
  62. package/dist/types/form/create-submit-pipeline.d.ts.map +1 -1
  63. package/dist/types/picked.d.ts +3 -1
  64. package/dist/types/picked.d.ts.map +1 -1
  65. package/dist/types/plugins/experience-browser-storage/plugin.d.ts.map +1 -1
  66. package/dist/types/plugins/history-browser-storage/plugin.d.ts.map +1 -1
  67. package/dist/types/plugins/responses-browser-storage/plugin.d.ts.map +1 -1
  68. package/dist/types/plugins/responses-indexeddb/plugin.d.ts.map +1 -1
  69. package/dist/types/plugins/single-page-app/plugin.d.ts +64 -12
  70. package/dist/types/plugins/single-page-app/plugin.d.ts.map +1 -1
  71. package/dist/types/utils/global-obj.d.ts +5 -0
  72. package/dist/types/utils/global-obj.d.ts.map +1 -1
  73. package/dist/types/utils/supports.d.ts +113 -0
  74. package/dist/types/utils/supports.d.ts.map +1 -1
  75. package/package.json +1 -1
  76. package/dist/experience-instance-BN0RZG1b.cjs +0 -1
  77. 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.1777594341273`,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}});
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}});
@@ -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.1-dev.1777594341273", i = "v1";
11
+ var r = () => "0.0.1-dev.1777601813342", i = "v1";
12
12
  function a(e, t) {
13
13
  return new URL(`/api/${i}/${t}`, e).toString();
14
14
  }
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../../rules-logic-DJhGFqhC.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})=>await s(e,t.filter(e=>n.includes(e.key)),{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],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;
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.p(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.supportsSessionStorage=n.c,exports.supportsShadowRoot=n.l,exports.supportsWebComponents=n.u,exports.supportsWindow=n.d;
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-DWa-ZqA4.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-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 t=require(`effector`);var n=({storage:n=`local`}={})=>({name:`experience-browser-storage-plugin`,setup:r=>{let i=n===`local`?e.n:e.r,a=(0,t.createEffect)(async t=>{if(!t)return;let n=e.t(`open-close`,`experience`,t),r=i.get(n).boolean();t.setOpen(r??t.isOpenStore.getState())});(0,t.sample)({source:r.eventBus,filter:e=>e.type===`experience_initialize`&&`experience`in e,fn:e=>e.experience,target:a});let o=(0,t.createEffect)(async t=>{let n=e.t(`open-close`,`experience`,t),r=t.isOpenStore.getState();i.set(n,r)}),s=e=>(0,t.sample)({source:e.isOpenStore,fn:()=>e,target:o});r.experienceInstances.listStore.watch(e=>{e.forEach(e=>s(e))})}});exports.experienceBrowserStoragePlugin=n;
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 t=require(`effector`);var n=e.t(`history`,`global`),r=({storage:r=`local`}={})=>({name:`history-browser-storage-plugin`,setup:i=>{let a=r===`local`?e.n:e.r,o=(0,t.createEffect)(async()=>{let e=a.get(n).json();e&&i.history.restore({entries:e})}),s=(0,t.createEffect)(async e=>{a.set(n,e)});(0,t.sample)({source:i.eventBus,filter:e=>e.type===`load`,target:o}),(0,t.sample)({source:i.history.entriesStore,target:s})}});exports.historyBrowserStoragePlugin=r;
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 t=require(`effector`);var n=e.t(`responses`,`global`);function r(e,t){return Object.fromEntries(Object.entries(e).flatMap(([e,n])=>t.find(t=>t.key===e)?.policies?.doNotStoreValue?[]:[[e,n]]))}var i=({storage:i=`local`}={})=>({name:`responses-browser-storage-plugin`,setup:a=>{let o=i===`local`?e.n:e.r,s=(0,t.createEffect)(async()=>{let e=o.get(n).json();if(!e)return null;a.responses.register(e)}),c=(0,t.attach)({source:{responses:a.responses.getAllStore,fields:a.fields.listStore},effect:({responses:e,fields:t})=>{o.set(n,r(e,t))}});(0,t.sample)({source:a.eventBus,filter:e=>e.type===`load`,target:s}),(0,t.sample)({source:a.responses.getAllStore,target:c})}});exports.responsesBrowserStoragePlugin=i;
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`});let e=require(`effector`);var t=`picked`;async function n(e){let{storeName:n,version:r=1,keyPath:i=`id`}=e;return new Promise((e,a)=>{let o=indexedDB.open(t,r);o.onupgradeneeded=()=>{let e=o.result;e.objectStoreNames.contains(n)||e.createObjectStore(n,i?{keyPath:i}:void 0)},o.onsuccess=()=>e(o.result),o.onerror=()=>a(Error(o.error?.message))})}async function r(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 i(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 a(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 o(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 s=`responses`,c={storeName:s,keyPath:`fieldKey`,version:2},l=()=>({name:`responses-indexdb-plugin`,setup:t=>{let l=(0,e.createEffect)(async()=>{let e=(await r(await n(c),s)).reduce((e,{fieldKey:t,value:n})=>(e[t]=n,e),{});await t.responses.commit(e)}),u=(0,e.createEffect)(async e=>{await Promise.allSettled(e.map(async e=>{await i(await n(c),s,e)}))}),d=(0,e.createEffect)(async()=>{await o(await n(c),s)}),f=(0,e.createEffect)(async e=>{await a(await n(c),s,e)});(0,e.sample)({source:t.eventBus,filter:e=>e.type===`load`,target:l}),(0,e.sample)({clock:t.responses.listStore,source:{responses:t.responses.listStore,fields:t.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:u}),(0,e.sample)({clock:t.responses.clearAll,target:d}),(0,e.sample)({clock:t.responses.clear,target:f})}});exports.responsesIndexedDBPlugin=l;
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-DJhGFqhC.cjs`),t=require(`../../../supports-CKSVYpQx.cjs`),n=require(`../../../experience-CTEBY-it.cjs`);var r=t.f,i=1e3,a=150,o,s=new WeakMap,c=e=>({name:`single-page-app`,setup:e=>{t.d()&&f(()=>u(e))}});function l(e){t.d()&&u(e)}function u(e){s.get(e)?.stop(),s.set(e,d(e))}function d(e){let t,r,o,s=()=>{t&&=(t.disconnect(),void 0),r!==void 0&&(clearTimeout(r),r=void 0),o!==void 0&&(clearTimeout(o),o=void 0)},c=()=>{n.n(e)};requestAnimationFrame(c);let l=new MutationObserver(()=>{c(),o!==void 0&&clearTimeout(o),o=setTimeout(s,a)});return l.observe(document.body,{childList:!0,subtree:!0}),t=l,r=setTimeout(s,i),{stop:s}}function f(n){if(r.addEventListener(`popstate`,()=>{let e=r.location.href,t=o;o=e,t!==e&&n()}),!t.i())return;function i(e){return function(...t){let r=t.length>2?t[2]:void 0;if(r){let i=o,a=String(r);if(o=a,i===a)return e.apply(this,t);n()}return e.apply(this,t)}}e.i(r.history,`pushState`,i),e.i(r.history,`replaceState`,i);let a=r.history.pushState,s=r.history.replaceState;queueMicrotask(()=>{(r.history.pushState!==a||r.history.replaceState!==s)&&console.warn(`@picked/client: window.history.pushState was re-wrapped by another script after Picked's instrumentation. SPA reconciliation will not fire on route changes through that wrapper. Call notifyNavigation(picked) from your router (e.g. React Router useEffect on location, SvelteKit afterNavigate) to trigger reconciliation explicitly.`)})}exports.notifyNavigation=l,exports.singlePageAppPlugin=c;
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-CKSVYpQx.cjs`);var t=()=>({name:`web-components`,setup:t=>{if(!e.d()||!e.u())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
+ 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-CKSVYpQx.cjs`);var t=()=>({name:`window`,setup:t=>{e.d()&&(window.Picked=t)}});exports.windowObjectPlugin=t;
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;
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../../experience-instance-BN0RZG1b.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;
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, 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
 
@@ -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
- total_purchase_users() AS purchasers
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.