@picked/client 0.0.70-next.6 → 0.0.70
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{api-ahdSBQ3Y.js → api-CPy9G49C.js} +1 -1
- package/dist/api-Ce6xYI--.cjs +1 -0
- package/dist/cjs/index.js +1 -1
- package/dist/cjs/plugins/dynamic-experiences/index.js +1 -1
- package/dist/cjs/server/index.js +1 -1
- package/dist/docs/actions.mdx +38 -18
- package/dist/docs/api/authentication.md +75 -48
- package/dist/docs/api/authorization-and-scopes.md +63 -47
- package/dist/docs/api/error-handling.md +70 -54
- package/dist/docs/api/index.md +41 -22
- package/dist/docs/api/pagination.md +30 -20
- package/dist/docs/api-keys.mdx +11 -6
- package/dist/docs/chrome-extension.md +22 -5
- package/dist/docs/conditions.mdx +32 -19
- package/dist/docs/content/asset-library.mdx +65 -34
- package/dist/docs/content/content-entries.mdx +8 -2
- package/dist/docs/content/layouts.mdx +45 -29
- package/dist/docs/content/pages.mdx +29 -14
- package/dist/docs/content/sections.mdx +19 -8
- package/dist/docs/delivery-api/experience-content.md +10 -5
- package/dist/docs/delivery-api/index.md +19 -12
- package/dist/docs/delivery-api/preview-caching-crawling.md +27 -14
- package/dist/docs/delivery-api/project-config.md +6 -4
- package/dist/docs/experiences.mdx +26 -10
- package/dist/docs/features.mdx +66 -25
- package/dist/docs/fields.mdx +42 -27
- package/dist/docs/flow-builder/building-flows.md +38 -20
- package/dist/docs/flow-builder/condition-builder.md +32 -21
- package/dist/docs/flow-builder/keyboard-shortcuts.md +18 -18
- package/dist/docs/flow-builder/nodes.md +26 -13
- package/dist/docs/flow-builder/overview.mdx +28 -15
- package/dist/docs/gtm-template.md +35 -26
- package/dist/docs/guides/build-a-personalized-page.mdx +36 -18
- package/dist/docs/image-optimisation-service.md +33 -17
- package/dist/docs/index.md +28 -17
- package/dist/docs/mcp.md +46 -38
- package/dist/docs/pickedql/data-sources.md +65 -43
- package/dist/docs/pickedql/dimensions.md +27 -12
- package/dist/docs/pickedql/examples.md +38 -26
- package/dist/docs/pickedql/filtering.md +10 -6
- package/dist/docs/pickedql/index.md +32 -14
- package/dist/docs/pickedql/schema.md +85 -76
- package/dist/docs/pickedql/virtual-functions.md +62 -36
- package/dist/docs/projects.mdx +14 -7
- package/dist/docs/reports.mdx +5 -3
- package/dist/docs/sdk/actions.md +33 -17
- package/dist/docs/sdk/conditions.md +8 -5
- package/dist/docs/sdk/content-security-policy.md +5 -4
- package/dist/docs/sdk/experiences.md +29 -11
- package/dist/docs/sdk/feature-allocation.md +79 -47
- package/dist/docs/sdk/features.md +130 -76
- package/dist/docs/sdk/fields.md +66 -42
- package/dist/docs/sdk/index.md +22 -13
- package/dist/docs/sdk/plugins/create-experience.md +18 -15
- package/dist/docs/sdk/plugins/dynamic-experiences.md +42 -16
- package/dist/docs/sdk/predicates.md +53 -37
- package/dist/docs/sdk/ssr/index.md +25 -8
- package/dist/docs/sdk/ssr/rendering-and-hydration.md +37 -16
- package/dist/docs/sdk/ssr/serialize.md +38 -20
- package/dist/docs/sdk/ssr/slots-and-placements.md +28 -10
- package/dist/docs/sdk/steps.md +100 -55
- package/dist/docs/steps.mdx +20 -11
- package/dist/docs/team-management.md +17 -11
- package/dist/docs/vite-plugin.md +26 -19
- package/dist/docs/workspace-versioning.mdx +14 -8
- package/dist/docs/workspaces.mdx +55 -24
- package/dist/esm/index.js +1 -1
- package/dist/esm/plugins/dynamic-experiences/index.js +2 -2
- package/dist/esm/server/index.js +1 -1
- package/dist/{plugin-BxMR7fOV.js → plugin-ChPkTj__.js} +1 -1
- package/dist/{plugin-CASdGtTX.cjs → plugin-DHn11gn6.cjs} +1 -1
- package/package.json +1 -1
- package/dist/api-CoUkIxIr.cjs +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var e=`Picked-Client`,t=`Picked-Version`;function n(n,r){return{[e]:n,[t]:r}}var r=()=>`0.0.70`,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,r){let i=a(e,t);return fetch(i,{headers:o(n),signal:r})}async function c(e,t,n,r){let i=a(e,t);return fetch(i,{method:`POST`,headers:{"Content-Type":`application/json`,...o(r)},body:JSON.stringify(n)})}Object.defineProperty(exports,"i",{enumerable:!0,get:function(){return n}}),Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return c}}),Object.defineProperty(exports,"r",{enumerable:!0,get:function(){return r}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return s}});
|
package/dist/cjs/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../object-CIkt7Fkr.cjs"),t=require("../rules-logic-CGZIYgAI.cjs"),n=require("../logger-CSTvAyyB.cjs"),r=require("../supports-DBzjGaWD.cjs"),i=require("../dom-CDrHc_j9.cjs"),a=require("../experience-instance-DurC3pE-.cjs"),o=require("../storage-DUw9UJ2h.cjs"),s=require("../api-CoUkIxIr.cjs"),c=require("../id-Js-62re-.cjs"),l=require("../inert-script-report-ijRHPtcY.cjs");let u=require("effector"),d=require("@withease/factories");var f=(0,u.createDomain)(`experience`),p=(0,d.createFactory)(({client:e,experience:n})=>{let r=f.store(n),o=(0,u.createApi)(r,{merge(e,t){return{...e,...t.experience}}}),s=r.map(e=>({name:e.name,decisionLogic:e.condition,targetSelectors:e.targets,initializeOpenLogic:e.initializeOpen})),c=(0,u.combine)(r,e.components.listStore,(e,t)=>(e.componentName?t.find(t=>t.name===e.componentName):void 0)||t.find(t=>t.name===`experience:${e.id}`)||t.find(e=>e.name===`experience`),{skipVoid:!1}),l=(0,u.combine)(r,e.steps.indexStore,e.conditions.indexStore,(e,t,n)=>{let r=e.nodes.filter(a.u).map(e=>t[e.stepId]).filter(e=>e!==void 0),i=e.nodes.filter(a.l).map(e=>n[e.conditionId]).filter(e=>e!==void 0);return{steps:r,nodes:e.nodes,edges:e.edges,conditions:i}}),d=n.actions??[],p,m=(0,u.attach)({source:s,effect:(t,r)=>{let a=i.i(t.targetSelectors,n.id);a.forEach(({elements:e})=>e.forEach(e=>i.s(e,n.id))),i.t(a,n.id,n.key).forEach(t=>{r?e.experienceInstances.spawn(p,t,r):e.experienceInstances.spawn(p,t)})}}),h=(0,u.attach)({source:(0,u.combine)({preconditionPassed:e.preconditionPassedStore,isUser:e.session.store.map(e=>e.isUser,{skipVoid:!1}),config:s}),effect:async({preconditionPassed:r,isUser:a,config:o})=>{if(!r||!a)return!1;let{decisionLogic:s,targetSelectors:c}=o;return c.length===0||i.i(c,n.id).length<1?!1:s===void 0?!0:t.n(s)?await t.t(e,s)===!0:!0}}),g=(0,u.createEffect)(async()=>{if(!e.contentLoader)return!0;try{await e.contentLoader({id:n.id,key:n.key})}catch{`${n.id}`}return!0}),_=(0,u.createEvent)(),v=(0,u.createEvent)(),y=f.createStore(void 0,{skipVoid:!1}).on(_,(e,t)=>t).on(v,(e,t)=>t);return(0,u.sample)({clock:_,target:h}),(0,u.sample)({clock:h.doneData,source:y,filter:(e,t)=>t,fn:e=>e,target:m}),(0,u.sample)({clock:h.doneData,filter:Boolean,target:g}),(0,u.sample)({clock:v,source:y,fn:e=>e,target:m}),(0,u.sample)({clock:v,target:g}),p={id:n.id,key:n.key,name:n.name,configStore:s,treeStore:l,componentStore:c,actions:d,merge:o.merge,initialiseFx:m,shouldInitialiseFx:h,initialiseRequested:_,initialiseDirectly:v,prepareExperienceContentFx:g},p});function m(e){return(0,d.invoke)(p,e)}var h=(0,d.createFactory)(({client:e})=>{let t=f.store({}),n=(0,u.createApi)(t,{register(e,t){return{...e,[t.id]:t}}}),r=(0,u.createEvent)(),i=(0,u.createEffect)(t=>{n.register(m({client:e,experience:t}))});(0,u.sample)({clock:r,source:t,filter:(e,t)=>e[t.id]!==void 0,fn:(e,t)=>({existing:e[t.id],experience:t})}).watch(({existing:e,experience:t})=>{e?.merge({experience:t,strategy:`override`})}),(0,u.sample)({clock:r,source:t,filter:(e,t)=>e[t.id]===void 0,fn:(e,t)=>t,target:i});let a=t.map(e=>Object.values(e));function o(e){return t.map(t=>t[e],{skipVoid:!1})}function s(e){return t.map(t=>Object.values(t).find(t=>t.key===e)??t[e],{skipVoid:!1})}let c=(0,u.attach)({source:t,effect:(e,t)=>{let n=`key`in t?Object.values(e).find(e=>e.key===t.key):e[t.id];if(!n){`key`in t?`${t.key}`:`${t.id}`;return}let{options:r}=t;r?.bypassCondition?n.initialiseDirectly(r):n.initialiseRequested(r)}});return{register:r,get:o,getById:o,getByKey:s,launch:c,open:(0,u.attach)({source:{experiences:t,instances:e.experienceInstances.listStore},effect:async({experiences:e,instances:t},n)=>{let r=`key`in n?Object.values(e).find(e=>e.key===n.key):e[n.id],i=t.filter(e=>e.experienceId===r?.id);if(i.length>0){for(let e of i)e.open();return}await c(`key`in n?{key:n.key,options:{...n.options,initialiseOpen:!0}}:{id:n.id,options:{...n.options,initialiseOpen:!0}})}}),listStore:a,initialiseExperiencesFx:(0,u.attach)({source:a,effect:e=>{for(let t of e)t.initialiseRequested(void 0)}})}});function g(e){return(0,d.invoke)(h,e)}var _=async e=>{await e.experiences.initialiseExperiencesFx()};function v(e){return(0,u.createEffect)(async()=>{await e()})}var y=(e,t,n)=>{let r=t.name,i=t.setup(e);if(i){let e=n[r]??{};n[r]=Object.freeze({...e,...i})}},b=(0,u.createDomain)(`component`),x=(0,d.createFactory)(({client:e,component:t,name:n})=>({name:n,component:t,frameworkStore:e.frameworks.getByName(t.frameworkName)}));function S(e){return(0,d.invoke)(x,e)}var C=(0,d.createFactory)(({client:e})=>{let t=b.store({}),r=(0,u.createApi)(t,{register(e,t){return{...e,[t.name]:t}}}),i=(0,u.createEvent)();(0,u.sample)({clock:i,source:t,filter:(e,{name:t})=>e[t]!==void 0,fn:(e,{name:t})=>`Component '${t}' already registered. Registering again will override the previous registration.`}).watch(e=>n.t(`warn`,e)),(0,u.sample)({clock:i,fn:({name:t,component:n})=>S({client:e,name:t,component:n}),target:r.register});let a=t.map(e=>Object.values(e));function o(e){return t.map(t=>t[e],{skipVoid:!1})}return{register:i,getByName:o,listStore:a}});function w(e){return(0,d.invoke)(C,e)}var T=(e,t,n)=>{n.register({name:e,component:t})},E=(0,u.createDomain)(`framework`),D=(0,d.createFactory)(e=>{let t=E.store({}),r=(0,u.createApi)(t,{register(e,t){return{...e,[t.name]:t.framework}}}),i=(0,u.createEvent)();(0,u.sample)({clock:i,source:t,filter:(e,{name:t})=>e[t]!==void 0,fn:(e,{name:t})=>`Framework '${t}' already registered. Registering again will override the previous registration.`}).watch(e=>n.t(`warn`,e)),(0,u.sample)({clock:i,target:r.register});let a=t.map(e=>Object.values(e));function o(e){return t.map(t=>t[e],{skipVoid:!1})}return{register:i,getByName:o,listStore:a}});function O(e){return(0,d.invoke)(D,e)}var k=(e,t)=>{t.register({name:e.name,framework:e})},A=(0,d.createFactory)(({client:e})=>{let t=`window`in globalThis,n={location:t?globalThis.location:void 0,document:t?globalThis.document:void 0,sessionStorage:t?globalThis.sessionStorage:void 0,localStorage:t?globalThis.localStorage:void 0};return(0,u.combine)(e.responses.listStore,e.fields.listStore,(t,r)=>Object.freeze({client:e,responses:t,fields:r,...n}))});function ee(e){return(0,d.invoke)(A,e)}function te(e){return typeof e==`number`&&!isNaN(e)}function j(e){return typeof e==`string`}function M(e){return Array.isArray(e)}function N(e){return e instanceof Promise}function P(e){return typeof e==`object`&&!!e&&!Array.isArray(e)&&Object.keys(e).length===1}function F(e){if(te(e))return e;let t=parseFloat(`${e}`);return isNaN(t)?0:t}function I(e){return`${e}`}var ne={"==":(e,t)=>e==t,"===":(e,t)=>e===t,"!=":(e,t)=>e!=t,"!==":(e,t)=>e!==t,">":(e,t)=>F(e)>F(t),">=":(e,t)=>F(e)>=F(t),"<":(e,t,n)=>{let r=F(e),i=F(t);if(n===void 0)return r<i;let a=F(n);return r<i&&i<a},"<=":(e,t,n)=>{let r=F(e),i=F(t);if(n===void 0)return r<=i;let a=F(n);return r<=i&&i<=a},"!!":async e=>await R(e),"!":async e=>!await R(e),"%":(e,t)=>F(e)%F(t),log:e=>(console.log(e),e),in:(e,t)=>t?j(t)?t.indexOf(I(e))!==-1:M(t)?t.includes(e):!1:!1,cat:(...e)=>e.map(I).join(``),substr:(e,t,n)=>{let r=I(e),i=F(t);if(n===void 0)return r.substr(i);let a=F(n);if(a<0){let e=r.substr(i);return e.substr(0,e.length+a)}return r.substr(i,a)},"+":(...e)=>e.reduce((e,t)=>F(e)+F(t),0),"*":(...e)=>e.reduce((e,t)=>F(e)*F(t),1),"-":(e,t)=>{let n=F(e);return t===void 0?-n:n-F(t)},"/":(e,t)=>F(e)/F(t),min:(...e)=>Math.min(...e.map(F)),max:(...e)=>Math.max(...e.map(F)),merge:(...e)=>e.reduce((e,t)=>M(t)?e.concat(t):e.concat([t]),[]),var(e,t){let n=arguments.length>1?t:null;if(e===``||e===`.`||e==null)return this;if(typeof e==`number`&&Array.isArray(this))return e>=0&&e<this.length?this[e]:n;let r=I(e);if(r===``||r===`.`)return this;let i=r.split(`.`),a=this;for(let e of i){if(a==null)return n;if(Array.isArray(a)){let t=parseInt(e,10);a=isNaN(t)?a[e]:a[t]}else a=a[e]}return a===void 0?n:a},async missing(...e){let t=M(e[0])?e[0]:e,n=[];for(let e of t){let t=await L({var:e},this);(t===null||t===``)&&n.push(`${e}`)}return n},async missing_some(e,t){let n=await L({missing:t},this);if(!M(n)||!M(t))return[];let r=n.filter(j);return t.filter(j).length-r.length>=F(e)?[]:r},invoke(...e){let[t,...n]=e;return typeof t==`function`?Reflect.apply(t,null,n):null},startsWith:(e,t)=>j(e)&&j(t)&&e.startsWith(t),endsWith:(e,t)=>j(e)&&j(t)&&e.endsWith(t),regexp_matches(e,t){let n=e,r=``;if(M(e)){let[t,i]=e;n=t,r=i}return!j(n)||!j(r)?!1:new RegExp(n,r).test(I(t))},throw(e){throw Error(I(e))}};async function L(e,t){if(!e)return e;if(N(e))return L(await e,t);if(M(e))return Promise.all(e.map(e=>L(e,t)));if(!P(e))return e;let n=re(e),r=n?e[n]??[]:[];switch(M(r)||(r=[r]),n){case`if`:case`?:`:for(let e=0;e<r.length-1;e+=2)if(await R(await L(r[e],t)))return L(r[e+1],t);return r.length%2==1?L(r[r.length-1],t):null;case`and`:{let e=null;for(let n of r)if(e=await L(n,t),!await R(e))return e;return e}case`or`:{let e=null;for(let n of r)if(e=await L(n,t),await R(e))return e;return e}case`map`:{let e=await L(r[0],t);return M(e)?await Promise.all(e.map(e=>L(r[1],e))):[]}case`filter`:{let e=await L(r[0],t);return M(e)?(await Promise.all(e.map(async e=>({item:e,shouldInclude:await R(await L(r[1],e))})))).filter(({shouldInclude:e})=>e).map(({item:e})=>e):[]}case`reduce`:{let e=await L(r[0],t);if(!M(e))return r.length>2?await L(r[2],t):null;let n=r[1],i=r.length>2?await L(r[2],t):null;for(let t of e)i=await L(n,{current:t,accumulator:i});return i}case`all`:{let e=await L(r[0],t);if(!M(e)||e.length===0)return!1;for(let t of e)if(!await R(await L(r[1],t)))return!1;return!0}case`some`:{let e=await L(r[0],t);if(!M(e))return!1;for(let t of e)if(await R(await L(r[1],t)))return!0;return!1}case`none`:{let e=await L(r[0],t);if(!M(e))return!0;for(let t of e)if(await R(await L(r[1],t)))return!1;return!0}case`catch`:try{return await L(r[0],t)}catch(e){return P(e)?await L(e,t):r[1]?await L(r[1],e):e instanceof Error?e.message:e}}let i=await Promise.all(r.map(e=>L(e,t))),a=n?ne[n]:void 0;if(!a)throw Error(`Unrecognized operation ${n}`);return a.apply(t,i)}async function R(e){return N(e)?R(await e):!(Array.isArray(e)&&e.length===0)&&!!e}function re(e){return Object.keys(e)[0]}function z(e,t,n){return new Proxy(Object.create(null),{get(r,i){if(typeof i!=`string`)return;let a=e.find(e=>e.key===i);if(a!==void 0)return async()=>n.has(i)?!1:await L(a.logic,{...t,conditions:z(e,t,new Set(n).add(i))})===!0}})}var ie=(0,d.createFactory)(({client:e})=>(0,u.attach)({source:{stateSnapshot:e.stateSnapshotStore,predicates:e.predicates.listStore,actions:e.actions.listStore,features:e.features.listStore,responses:e.responses.getAllStore,conditions:e.conditions.listStore},effect:async({stateSnapshot:e,predicates:t,actions:n,features:r,responses:i,conditions:a},{rule:o,context:s})=>{let c=t.reduce((t,n)=>(t[n.name]=async(...t)=>await n.predicate({...e,args:t}),t),{}),l=n.reduce((t,n)=>(t[n.key]=async(...t)=>await n.action({...e,args:t},null)??void 0,t),{}),u=r.reduce((e,t)=>(e[t.id]=async()=>{let{bucket:e}=await t.getBucket();return e},e),{}),d={responses:i,location:typeof e.location==`object`?{hash:e.location.hash,host:e.location.host,hostname:e.location.hostname,href:e.location.href,origin:e.location.origin,pathname:e.location.pathname,port:e.location.port,protocol:e.location.protocol,search:e.location.search}:void 0,predicates:c,actions:l,features:u,...s};return await L(o,{...d,conditions:z(a,d,new Set)})}}));function ae(e){return(0,d.invoke)(ie,e)}var oe=6e3,se=o.t(`last_ping`,`global`),ce=async e=>{try{let t=Date.now(),n=o.n.get(se),r=0;if(n.isSet()&&(r=n.json()??0),r&&t-r<oe)return!0;let i={projectId:e.projectId,path:window.location.pathname},a={},c=document.getElementById(`picked_script`)?.dataset.verceltoken;c&&(a[`x-vercel-protection-bypass`]=c);let l=(await s.n(e.apiUrl,`ping`,i,a)).ok;return l&&n.set(t),l}catch{return!1}},B=(0,u.createDomain)(`lifecycle`),le=(0,d.createFactory)(({client:e})=>{let n=B.store(!1),a=(0,u.createStore)(void 0,{skipVoid:!1,domain:B}),o=(0,u.createStore)(void 0,{skipVoid:!1,domain:B}),s=B.store(`idle`),c=B.store([]),l=(0,u.createStore)(void 0,{skipVoid:!1,domain:B}),d=(0,u.createStore)(void 0,{skipVoid:!1,domain:B}),f=(0,u.createEvent)(),p=(0,u.createEvent)(),m=(0,u.createEvent)(),h=(0,u.createEvent)(),g=(0,u.createEvent)(),v=(0,u.createEvent)();c.on(h,(e,t)=>[...e,t]),l.on(g,(e,t)=>t),d.on(v,(e,t)=>t),n.on(p,()=>!0);let y=(0,u.createEffect)(()=>{ce(e)}),b=(0,u.createEffect)(async()=>{await i.r()}),x=(0,u.createEffect)(async()=>{await _(e)}),S=(0,u.attach)({effect:x}),C=(0,u.attach)({source:c,effect:async e=>{for(let t of e)await t()}}),w=(0,u.attach)({source:l,effect:async n=>n===void 0?!0:typeof n==`boolean`?n:await t.t(e,n)===!0}),T=(0,u.attach)({source:d,effect:async n=>n===void 0?!0:typeof n==`boolean`?n:await t.t(e,n)===!0}),E=(0,u.sample)({clock:f,source:s,filter:e=>e===`idle`&&r.i(),fn:()=>void 0});(0,u.sample)({clock:E,fn:()=>`starting`,target:s}),(0,u.sample)({clock:E,target:y}),(0,u.sample)({clock:E,target:C}),(0,u.sample)({clock:E,target:b}),(0,u.sample)({clock:C.done,target:w}),(0,u.sample)({clock:w.doneData,target:a}),(0,u.sample)({clock:T.doneData,target:o}),(0,u.sample)({clock:w.doneData,filter:e=>e,target:T}),(0,u.sample)({clock:T.doneData,target:e.session.setIsUser}),(0,u.sample)({clock:T.doneData,fn:e=>({type:`user_decide`,value:e}),target:e.eventBus}),(0,u.sample)({clock:w.doneData,filter:e=>!e,fn:()=>void 0,target:m}),(0,u.sample)({clock:T.doneData,fn:()=>void 0,target:m}),(0,u.sample)({clock:m,fn:()=>({type:`initialize`}),target:e.eventBus});let D=(0,u.createStore)(!1).on(b.done,()=>!0),O=(0,u.createStore)(!1).on(m,()=>!0),k=(0,u.createStore)(!1).on(S.done,()=>!0),A=(0,u.combine)(a,o,(e,t)=>e===!0&&t===!0);return(0,u.sample)({clock:m,source:A,filter:e=>e,fn:()=>void 0,target:x}),(0,u.sample)({clock:(0,u.combine)(D,O,A,(e,t,n)=>e&&t&&n),filter:e=>e,fn:()=>void 0,target:S}),(0,u.sample)({clock:(0,u.combine)(D,O,A,k,(e,t,n,r)=>e&&t&&(!n||r)),filter:e=>e,fn:()=>void 0,target:p}),(0,u.sample)({clock:p,fn:()=>`ready`,target:s}),(0,u.sample)({clock:p,fn:()=>({type:`ready`}),target:e.eventBus}),(0,u.sample)({clock:p,source:e.session.store,fn:({id:e,isUser:t,identifiers:n})=>({type:`session`,id:e,isUser:t,identifiers:n}),target:e.eventBus}),(0,u.sample)({clock:[C.fail,w.fail,T.fail,x.fail,S.fail,b.fail],fn:()=>`failed`,target:s}),{start:f,readyStore:n,preconditionPassedStore:a,conditionPassedStore:o,lifecycleStageStore:s,registerPluginStartHook:h,setPrecondition:g,setCondition:v}});function ue(e){return(0,d.invoke)(le,e)}var de=(0,u.createDomain)(`predicate`),fe=(0,d.createFactory)(({client:e})=>{let t=de.store({}),r=(0,u.createApi)(t,{register(e,t){return{...e,[t.name]:{name:t.name,predicate:t.predicate}}}}),i=(0,u.createEvent)();(0,u.sample)({clock:i,source:t,filter:(e,{name:t})=>e[t]!==void 0,fn:(e,{name:t})=>`Predicate '${t}' already registered. Registering again will override the previous registration.`}).watch(e=>n.t(`warn`,e)),(0,u.sample)({clock:i,fn:({name:e,predicate:t})=>Object.freeze({name:e,predicate:t}),target:r.register});let a=t.map(e=>Object.values(e));function o(e){return t.map(t=>t[e]?.predicate,{skipVoid:!1})}function s(t){let n=(0,u.createStore)(()=>void 0,{skipVoid:!1}),r=(0,u.attach)({source:{predicate:o(t),snapshot:e.stateSnapshotStore},effect:({predicate:e,snapshot:t})=>{if(e)return(...n)=>e({...t,args:n})}});return(0,u.sample)({source:{responses:e.responses.listStore,fields:e.fields.listStore},target:r}),(0,u.sample)({clock:r.doneData,filter:e=>e!==void 0,target:n}),r(),n}return{register:i,getByName:o,listStore:a,getEvokablePredicate:s}});function pe(e){return(0,d.invoke)(fe,e)}var me=(e,t,n)=>{n.register({name:e,predicate:t})},V=(0,u.createDomain)(`feature`);function H(e){return e?.enabled===!1}var he=(0,d.createFactory)(({client:e})=>{let t=V.store({}),r=V.store([]),i=(0,u.createApi)(t,{register(e,t){return{...e,[t.id]:t.feature}}}),a=(0,u.createEvent)();(0,u.sample)({clock:a,source:t,filter:(e,{id:t})=>e[t]!==void 0,fn:(e,{id:t})=>`Feature '${t}' already registered. Registering again will override the previous registration.`}).watch(e=>n.t(`warn`,e)),(0,u.sample)({clock:a,fn:({id:e,feature:t})=>Object.freeze({id:e,feature:{id:e,feature:{...t,id:e}}}),target:i.register});let s=(0,u.createEffect)(async({id:e,key:t,storage:n=`local`,enabled:r})=>{if(r===!1)return null;let i=o.t(`feature:${e}:${t}`,`global`),a=(n===`session`?o.r:o.n).get(i).boolean();return a===null?null:{id:e,key:t,bucket:a,storage:n}}),c=(0,u.createEffect)(e=>{if(!e)return null;let t=o.t(`feature:${e.id}:${e.key}`,`global`);(e.storage===`session`?o.r:o.n).set(t,e.bucket)}),l=new Map,d=(0,u.attach)({source:{allFeaturesStore:t,resolvedFeaturesStore:r},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`);if(H(o.feature))return{id:o.id,bucket:!1,key:i,storage:o.feature.storage};let s=l.get(`${n}:${i}`);if(s!==void 0){let e=await s;return{id:o.id,bucket:e,key:i,storage:o.feature.storage}}let c=r();l.set(`${n}:${i}`,c);let u=await c;return{id:o.id,bucket:u,key:i,storage:o.feature.storage}}});(0,u.sample)({clock:i.register,fn:e=>{let{id:t,feature:n}=e;return{id:t,key:n.feature.key,storage:n.feature.storage,enabled:n.feature.enabled}},target:s}),(0,u.sample)({source:t,clock:d.doneData,filter:(e,t)=>!H(e[t.id]?.feature),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:c});let f=(0,u.combine)({allFeaturesStore:t,resolvedFeaturesStore:r}).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,enabled:e.feature.enabled,weight:e.feature.weight,getBucket:()=>({id:e.id,bucket:n.bucket}),isResolved:!0}:{id:e.id,name:e.feature.name,key:e.feature.key,enabled:e.feature.enabled,weight:e.feature.weight,getBucket:async()=>await d(e.feature),isResolved:!1}}));(0,u.sample)({clock:d.doneData,source:{resolvedFeatures:r,allFeatures:t},filter:({resolvedFeatures:e,allFeatures:t},{id:n,key:r})=>H(t[n]?.feature)?!1:!e.some(e=>e.id===n&&e.key===r),fn:(e,t)=>t,target:e.eventBus.prepend(e=>({type:`feature_decide`,feature:e}))}),(0,u.sample)({clock:[s.doneData,d.doneData],source:{resolvedFeatures:r,allFeatures:t},fn:({resolvedFeatures:e,allFeatures:t},n)=>!n||H(t[n.id]?.feature)||e.some(e=>e.id===n.id&&e.key===n.key)?e:[...e,n],target:r});function p(e){return f.map(t=>t.find(t=>t.id===e))}function m(e){return t.map(t=>t[e],{skipVoid:!1})}function h(e){let t=(0,u.createStore)(async()=>void 0,{skipVoid:!1}),n=(0,u.attach)({source:p(e),effect:async e=>{if(e)return async()=>(await e.getBucket()).bucket}});return(0,u.sample)({source:r,filter:t=>t.some(t=>t.id===e),target:n}),(0,u.sample)({clock:n.doneData,filter:e=>e!==void 0,target:t}),n(),t}return{register:a,getById:p,getByName:m,listStore:f,getEvokableFeature:h}});function ge(e){return(0,d.invoke)(he,e)}var _e=(e,t,n)=>{n.register({id:e,feature:t})},U=(0,u.createDomain)(`history`);function W(e,t){return{id:c.t(`history-entry-${Date.now()}-${Math.random()}}`),node:t,at:Date.now(),experienceId:e}}var ve=(0,d.createFactory)(()=>{let e=U.store({entries:[]}),t=U.event(),n=U.event(),r=U.event(),i=U.event();e.on(t,(e,t)=>({entries:[...e.entries,W(t.experienceId,t.node)]})),e.on(n,(e,t)=>({entries:[...e.entries.slice(0,-1),W(t.experienceId,t.node)]})),e.on(i,(e,t)=>t);function o(e,t){let n={lastStepIndex:-1,secondLastStepIndex:-1};for(let r=e.length-1;r>=0;r--){let i=e[r],o=i?.node;if(!(!o||!a.u(o))&&!(t&&i.experienceId!==t))if(n.lastStepIndex===-1)n.lastStepIndex=r;else{n.secondLastStepIndex=r;break}}return n}return e.on(r,(e,t)=>{let{secondLastStepIndex:n}=o(e.entries,t.experienceId),r=n===-1?e.entries:e.entries.slice(0,n+1);return{...e,entries:r}}),{push:t,replace:n,back:r,restore:i,entriesStore:e.map(e=>e.entries)}});function ye(){return(0,d.invoke)(ve)}var be=0,xe=e=>{let t=(0,u.createStore)([]);return t.on(e,(e,t)=>[...e,{id:be++,at:new Date,payload:t}]),t},Se=(0,u.createDomain)(`field`),Ce=(0,d.createFactory)(()=>{let e=Se.store({}),t=(0,u.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})}let r={};e.watch(e=>{r=e});function i(e,n){let i=Object.values(r).find(t=>t.key===e)?.key;i&&t.updateByKey({fieldKey:i,updates:n})}let a=e.map(e=>Object.values(e));function o(t){return e.map(e=>e[t]??null,{skipVoid:!1})}function s(t){return e.map(e=>Object.values(e).find(e=>e.key===t)??null,{skipVoid:!1})}function c(t){return e.map(e=>Object.values(e).find(e=>e.name===t)??null,{skipVoid:!1})}return{register:n,update:i,getById:o,getByKey:s,listStore:a,getByName:c}});function we(){return(0,d.invoke)(Ce)}var Te=(0,u.createDomain)(`step`),Ee=(0,d.createFactory)(()=>{let e=Te.store({}),t=(0,u.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 De(){return(0,d.invoke)(Ee)}function Oe(e,t){t.register(e)}var ke=(0,u.createDomain)(`content`),Ae=(0,d.createFactory)(()=>{let e=ke.store({}),t=(0,u.createApi)(e,{register(e,t){return{...e,[t.content.id]:t.content}},patch(e,t){let n=e[t.id];if(!n)return e;let r=t.apply(n.data);return r===n.data?e:{...e,[t.id]:{...n,data:r}}}});function n(e){t.register({content:e})}function r(e,n){t.patch({id:e,apply:n})}let i=e.map(e=>Object.values(e));function a(t){return e.map(e=>e[t]??null,{skipVoid:!1})}return{register:n,patch:r,getById:a,listStore:i,indexStore:e}});function je(){return(0,d.invoke)(Ae)}function Me(e,t){t.register(e)}var Ne=(0,u.createDomain)(`action`),Pe=(0,d.createFactory)(({client:e})=>{let t=Ne.store({}),r=(0,u.createApi)(t,{register(e,t){return{...e,[t.key]:{key:t.key,action:t.action}}}}),i=(0,u.createEvent)();(0,u.sample)({clock:i,source:t,filter:(e,{key:t})=>e[t]!==void 0,fn:(e,{key:t})=>`Action '${t}' already registered. Registering again will override the previous registration.`}).watch(e=>n.t(`warn`,e)),(0,u.sample)({clock:i,fn:({key:e,action:t})=>Object.freeze({key:e,action:t}),target:r.register});let a=t.map(e=>Object.values(e));function o(e){return t.map(t=>t[e]?.action,{skipVoid:!1})}function s(t,n){let r=(0,u.createStore)(()=>void 0,{skipVoid:!1}),i=n?{experience:n.experience}:null,a=(0,u.attach)({source:{action:o(t),snapshot:e.stateSnapshotStore},effect:({action:e,snapshot:t})=>{if(e)return(...n)=>e({...t,args:n},i)}});return(0,u.sample)({source:{responses:e.responses.listStore,fields:e.fields.listStore},target:a}),(0,u.sample)({clock:a.doneData,filter:e=>e!==void 0,target:r}),a(),r}return{register:i,getByKey:o,listStore:a,getEvokableAction:s}});function Fe(e){return(0,d.invoke)(Pe,e)}var Ie=(e,t,n)=>{n.register({key:e,action:t})};function G(e,t,n,r){return{fieldKey:e.key,userMessage:n,systemMessage:r,value:t}}function K(e){return e===null||e===``||Array.isArray(e)&&!e.length}function Le(e){return typeof e==`string`||typeof e==`number`||typeof e==`boolean`||e===null}function q(e){try{return JSON.stringify(e),!0}catch{return!1}}function Re(e,t){return t.find(t=>t.key===e)??null}function ze(e,t){return e.multiple&&(typeof t==`string`||typeof t==`number`||typeof t==`boolean`)?[t]:t}function Be(e,t){if(e.type!==`object`||K(t))return null;if(e.multiple){if(!Array.isArray(t))return G(e,t,`This field expects multiple values`,`Field expects an array of objects.`);for(let n of t){if(typeof n!=`object`||!n)return G(e,t,`This field expects object values`,`Field expects an array of objects, but received non-object value.`);if(!q(n))return G(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)?G(e,t,`This field expects a single value`,`Field expects a single object, not an array.`):typeof t!=`object`||!t?G(e,t,`This field expects an object value`,`Field expects an object value.`):q(t)?null:G(e,t,`This field contains non-serializable data`,`Field value contains non-JSON-serializable data (functions, circular references, etc.).`)}function Ve(e,t){if(K(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:G(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=>!Le(e)||e===null?!1:r.includes(e))?null:G(e,t,`This field expects a valid option`,`Field expects a valid option. Valid options are: ${r.join(`, `)}`)}async function He(t,n,r,i){if(n.validation&&!e.t(n.validation)&&!K(r)){let e=i?{$input:r,responses:i}:{$input:r},a=await t(n.validation,e);if(typeof a==`string`)return G(n,r,a,`Field validation resulted in an error: ${a}.`);if(a===!1)return G(n,r,`This field is invalid`,`Field validation resulted in an unspecified error.`)}return n.required&&K(r)?G(n,r,`This field is required`,`Field is required.`):!n.multiple&&Array.isArray(r)&&r.length>1?G(n,r,`This field expects a single response`,`Field expects a single response.`):null}var Ue=(0,u.createDomain)(`response`),We=(0,d.createFactory)(({client:e})=>{let n=Ue.store({}),r=(0,u.createEvent)(),i=(0,u.createEvent)(),a=(0,u.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)=>t.t(e,n,r),c=(0,u.attach)({source:{allFields:e.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=Re(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=ze(o,n),l=await He(s,o,c,a);if(l){r.push(l);return}let u=Be(o,c);if(u){r.push(u);return}let d=Ve(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 l(e){return c(e)}let d=(0,u.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,u.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(t){return h(e.fields.getById(t))}function _(t){return h(e.fields.getByKey(t))}function v(t){return h(e.fields.getByName(t))}return(0,u.sample)({clock:r,target:a.clearAll}),(0,u.sample)({clock:i,target:a.clear}),{register:o,clearAll:r,clear:i,commit:f,getResponsesToCommit:l,listStore:m,getAllStore:p,getByFieldId:g,getByFieldKey:_,getByFieldName:v}});function Ge(e){return(0,d.invoke)(We,e)}var Ke=(0,u.createDomain)(`condition`),qe=(0,d.createFactory)(()=>{let e=Ke.store({}),t=(0,u.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 Je(){return(0,d.invoke)(qe)}function Ye(){if(r.i()){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 J(){if(!r.f())return{};let e=new URLSearchParams(window.location.search),t={},n=new Set;for(let[t]of e.entries())t.startsWith(`picked-`)&&n.add(t);for(let r of n){let n=r.replace(`picked-`,``);t[n]=e.getAll(r)}let i=o.t(`s`);if(n.size>0)o.r.set(i,t);else{let e=o.r.get(i);if(e)return e.json()||{}}return t}var Y=o.t(`session`,`global`);function Xe(){return r.r()?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)}`}function Ze(){if(!r.s())return null;let e=o.n.get(Y);if(!e.isSet())return null;try{return e.json()}catch{return null}}var Qe=(0,d.createFactory)(()=>{let e=Ze(),t={id:e?.id??Xe()};e?.isUser!==void 0&&(t.isUser=e.isUser),e?.identifiers&&Object.keys(e.identifiers).length>0&&(t.identifiers=e.identifiers);let n=(0,u.createStore)(t),i=(0,u.createApi)(n,{setIsUser:(e,t)=>({...e,isUser:t}),setIdentifier:(e,{key:t,value:n})=>({...e,identifiers:{...e.identifiers??{},[t]:n}}),removeIdentifier:(e,t)=>{let n=e.identifiers;if(!n||!(t in n))return e;let r={};for(let[e,i]of Object.entries(n))e!==t&&(r[e]=i);let i={id:e.id};return e.isUser!==void 0&&(i.isUser=e.isUser),Object.keys(r).length>0&&(i.identifiers=r),i}});return(0,u.sample)({source:n,target:(0,u.attach)({source:n,effect:e=>{if(r.s())try{o.n.get(Y).set(e)}catch{}}})}),{store:n,setIsUser:i.setIsUser,setIdentifier:i.setIdentifier,removeIdentifier:i.removeIdentifier}});function $e(){return(0,d.invoke)(Qe,void 0)}function X(){if(r.f())return globalThis.window.pickedConfig}function et(){if(r.f())return X()?.projectId}function tt(){if(!r.i())return;let e=document.getElementById(`picked_script`)||document.querySelector(`script#picked`)||document.getElementById(`cvly`);if(e)return e.dataset.projectid||e.getAttribute(`project-id`)||void 0}function nt(e){if(e.projectId)return e.projectId;let t=et();if(t)return t;let n=tt();if(n)return n;throw Error(`projectId is required. You can provide it via one of:
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../object-CIkt7Fkr.cjs"),t=require("../rules-logic-CGZIYgAI.cjs"),n=require("../logger-CSTvAyyB.cjs"),r=require("../supports-DBzjGaWD.cjs"),i=require("../dom-CDrHc_j9.cjs"),a=require("../experience-instance-DurC3pE-.cjs"),o=require("../storage-DUw9UJ2h.cjs"),s=require("../api-Ce6xYI--.cjs"),c=require("../id-Js-62re-.cjs"),l=require("../inert-script-report-ijRHPtcY.cjs");let u=require("effector"),d=require("@withease/factories");var f=(0,u.createDomain)(`experience`),p=(0,d.createFactory)(({client:e,experience:n})=>{let r=f.store(n),o=(0,u.createApi)(r,{merge(e,t){return{...e,...t.experience}}}),s=r.map(e=>({name:e.name,decisionLogic:e.condition,targetSelectors:e.targets,initializeOpenLogic:e.initializeOpen})),c=(0,u.combine)(r,e.components.listStore,(e,t)=>(e.componentName?t.find(t=>t.name===e.componentName):void 0)||t.find(t=>t.name===`experience:${e.id}`)||t.find(e=>e.name===`experience`),{skipVoid:!1}),l=(0,u.combine)(r,e.steps.indexStore,e.conditions.indexStore,(e,t,n)=>{let r=e.nodes.filter(a.u).map(e=>t[e.stepId]).filter(e=>e!==void 0),i=e.nodes.filter(a.l).map(e=>n[e.conditionId]).filter(e=>e!==void 0);return{steps:r,nodes:e.nodes,edges:e.edges,conditions:i}}),d=n.actions??[],p,m=(0,u.attach)({source:s,effect:(t,r)=>{let a=i.i(t.targetSelectors,n.id);a.forEach(({elements:e})=>e.forEach(e=>i.s(e,n.id))),i.t(a,n.id,n.key).forEach(t=>{r?e.experienceInstances.spawn(p,t,r):e.experienceInstances.spawn(p,t)})}}),h=(0,u.attach)({source:(0,u.combine)({preconditionPassed:e.preconditionPassedStore,isUser:e.session.store.map(e=>e.isUser,{skipVoid:!1}),config:s}),effect:async({preconditionPassed:r,isUser:a,config:o})=>{if(!r||!a)return!1;let{decisionLogic:s,targetSelectors:c}=o;return c.length===0||i.i(c,n.id).length<1?!1:s===void 0?!0:t.n(s)?await t.t(e,s)===!0:!0}}),g=(0,u.createEffect)(async()=>{if(!e.contentLoader)return!0;try{await e.contentLoader({id:n.id,key:n.key})}catch{`${n.id}`}return!0}),_=(0,u.createEvent)(),v=(0,u.createEvent)(),y=f.createStore(void 0,{skipVoid:!1}).on(_,(e,t)=>t).on(v,(e,t)=>t);return(0,u.sample)({clock:_,target:h}),(0,u.sample)({clock:h.doneData,source:y,filter:(e,t)=>t,fn:e=>e,target:m}),(0,u.sample)({clock:h.doneData,filter:Boolean,target:g}),(0,u.sample)({clock:v,source:y,fn:e=>e,target:m}),(0,u.sample)({clock:v,target:g}),p={id:n.id,key:n.key,name:n.name,configStore:s,treeStore:l,componentStore:c,actions:d,merge:o.merge,initialiseFx:m,shouldInitialiseFx:h,initialiseRequested:_,initialiseDirectly:v,prepareExperienceContentFx:g},p});function m(e){return(0,d.invoke)(p,e)}var h=(0,d.createFactory)(({client:e})=>{let t=f.store({}),n=(0,u.createApi)(t,{register(e,t){return{...e,[t.id]:t}}}),r=(0,u.createEvent)(),i=(0,u.createEffect)(t=>{n.register(m({client:e,experience:t}))});(0,u.sample)({clock:r,source:t,filter:(e,t)=>e[t.id]!==void 0,fn:(e,t)=>({existing:e[t.id],experience:t})}).watch(({existing:e,experience:t})=>{e?.merge({experience:t,strategy:`override`})}),(0,u.sample)({clock:r,source:t,filter:(e,t)=>e[t.id]===void 0,fn:(e,t)=>t,target:i});let a=t.map(e=>Object.values(e));function o(e){return t.map(t=>t[e],{skipVoid:!1})}function s(e){return t.map(t=>Object.values(t).find(t=>t.key===e)??t[e],{skipVoid:!1})}let c=(0,u.attach)({source:t,effect:(e,t)=>{let n=`key`in t?Object.values(e).find(e=>e.key===t.key):e[t.id];if(!n){`key`in t?`${t.key}`:`${t.id}`;return}let{options:r}=t;r?.bypassCondition?n.initialiseDirectly(r):n.initialiseRequested(r)}});return{register:r,get:o,getById:o,getByKey:s,launch:c,open:(0,u.attach)({source:{experiences:t,instances:e.experienceInstances.listStore},effect:async({experiences:e,instances:t},n)=>{let r=`key`in n?Object.values(e).find(e=>e.key===n.key):e[n.id],i=t.filter(e=>e.experienceId===r?.id);if(i.length>0){for(let e of i)e.open();return}await c(`key`in n?{key:n.key,options:{...n.options,initialiseOpen:!0}}:{id:n.id,options:{...n.options,initialiseOpen:!0}})}}),listStore:a,initialiseExperiencesFx:(0,u.attach)({source:a,effect:e=>{for(let t of e)t.initialiseRequested(void 0)}})}});function g(e){return(0,d.invoke)(h,e)}var _=async e=>{await e.experiences.initialiseExperiencesFx()};function v(e){return(0,u.createEffect)(async()=>{await e()})}var y=(e,t,n)=>{let r=t.name,i=t.setup(e);if(i){let e=n[r]??{};n[r]=Object.freeze({...e,...i})}},b=(0,u.createDomain)(`component`),x=(0,d.createFactory)(({client:e,component:t,name:n})=>({name:n,component:t,frameworkStore:e.frameworks.getByName(t.frameworkName)}));function S(e){return(0,d.invoke)(x,e)}var C=(0,d.createFactory)(({client:e})=>{let t=b.store({}),r=(0,u.createApi)(t,{register(e,t){return{...e,[t.name]:t}}}),i=(0,u.createEvent)();(0,u.sample)({clock:i,source:t,filter:(e,{name:t})=>e[t]!==void 0,fn:(e,{name:t})=>`Component '${t}' already registered. Registering again will override the previous registration.`}).watch(e=>n.t(`warn`,e)),(0,u.sample)({clock:i,fn:({name:t,component:n})=>S({client:e,name:t,component:n}),target:r.register});let a=t.map(e=>Object.values(e));function o(e){return t.map(t=>t[e],{skipVoid:!1})}return{register:i,getByName:o,listStore:a}});function w(e){return(0,d.invoke)(C,e)}var T=(e,t,n)=>{n.register({name:e,component:t})},E=(0,u.createDomain)(`framework`),D=(0,d.createFactory)(e=>{let t=E.store({}),r=(0,u.createApi)(t,{register(e,t){return{...e,[t.name]:t.framework}}}),i=(0,u.createEvent)();(0,u.sample)({clock:i,source:t,filter:(e,{name:t})=>e[t]!==void 0,fn:(e,{name:t})=>`Framework '${t}' already registered. Registering again will override the previous registration.`}).watch(e=>n.t(`warn`,e)),(0,u.sample)({clock:i,target:r.register});let a=t.map(e=>Object.values(e));function o(e){return t.map(t=>t[e],{skipVoid:!1})}return{register:i,getByName:o,listStore:a}});function O(e){return(0,d.invoke)(D,e)}var k=(e,t)=>{t.register({name:e.name,framework:e})},A=(0,d.createFactory)(({client:e})=>{let t=`window`in globalThis,n={location:t?globalThis.location:void 0,document:t?globalThis.document:void 0,sessionStorage:t?globalThis.sessionStorage:void 0,localStorage:t?globalThis.localStorage:void 0};return(0,u.combine)(e.responses.listStore,e.fields.listStore,(t,r)=>Object.freeze({client:e,responses:t,fields:r,...n}))});function ee(e){return(0,d.invoke)(A,e)}function te(e){return typeof e==`number`&&!isNaN(e)}function j(e){return typeof e==`string`}function M(e){return Array.isArray(e)}function N(e){return e instanceof Promise}function P(e){return typeof e==`object`&&!!e&&!Array.isArray(e)&&Object.keys(e).length===1}function F(e){if(te(e))return e;let t=parseFloat(`${e}`);return isNaN(t)?0:t}function I(e){return`${e}`}var ne={"==":(e,t)=>e==t,"===":(e,t)=>e===t,"!=":(e,t)=>e!=t,"!==":(e,t)=>e!==t,">":(e,t)=>F(e)>F(t),">=":(e,t)=>F(e)>=F(t),"<":(e,t,n)=>{let r=F(e),i=F(t);if(n===void 0)return r<i;let a=F(n);return r<i&&i<a},"<=":(e,t,n)=>{let r=F(e),i=F(t);if(n===void 0)return r<=i;let a=F(n);return r<=i&&i<=a},"!!":async e=>await R(e),"!":async e=>!await R(e),"%":(e,t)=>F(e)%F(t),log:e=>(console.log(e),e),in:(e,t)=>t?j(t)?t.indexOf(I(e))!==-1:M(t)?t.includes(e):!1:!1,cat:(...e)=>e.map(I).join(``),substr:(e,t,n)=>{let r=I(e),i=F(t);if(n===void 0)return r.substr(i);let a=F(n);if(a<0){let e=r.substr(i);return e.substr(0,e.length+a)}return r.substr(i,a)},"+":(...e)=>e.reduce((e,t)=>F(e)+F(t),0),"*":(...e)=>e.reduce((e,t)=>F(e)*F(t),1),"-":(e,t)=>{let n=F(e);return t===void 0?-n:n-F(t)},"/":(e,t)=>F(e)/F(t),min:(...e)=>Math.min(...e.map(F)),max:(...e)=>Math.max(...e.map(F)),merge:(...e)=>e.reduce((e,t)=>M(t)?e.concat(t):e.concat([t]),[]),var(e,t){let n=arguments.length>1?t:null;if(e===``||e===`.`||e==null)return this;if(typeof e==`number`&&Array.isArray(this))return e>=0&&e<this.length?this[e]:n;let r=I(e);if(r===``||r===`.`)return this;let i=r.split(`.`),a=this;for(let e of i){if(a==null)return n;if(Array.isArray(a)){let t=parseInt(e,10);a=isNaN(t)?a[e]:a[t]}else a=a[e]}return a===void 0?n:a},async missing(...e){let t=M(e[0])?e[0]:e,n=[];for(let e of t){let t=await L({var:e},this);(t===null||t===``)&&n.push(`${e}`)}return n},async missing_some(e,t){let n=await L({missing:t},this);if(!M(n)||!M(t))return[];let r=n.filter(j);return t.filter(j).length-r.length>=F(e)?[]:r},invoke(...e){let[t,...n]=e;return typeof t==`function`?Reflect.apply(t,null,n):null},startsWith:(e,t)=>j(e)&&j(t)&&e.startsWith(t),endsWith:(e,t)=>j(e)&&j(t)&&e.endsWith(t),regexp_matches(e,t){let n=e,r=``;if(M(e)){let[t,i]=e;n=t,r=i}return!j(n)||!j(r)?!1:new RegExp(n,r).test(I(t))},throw(e){throw Error(I(e))}};async function L(e,t){if(!e)return e;if(N(e))return L(await e,t);if(M(e))return Promise.all(e.map(e=>L(e,t)));if(!P(e))return e;let n=re(e),r=n?e[n]??[]:[];switch(M(r)||(r=[r]),n){case`if`:case`?:`:for(let e=0;e<r.length-1;e+=2)if(await R(await L(r[e],t)))return L(r[e+1],t);return r.length%2==1?L(r[r.length-1],t):null;case`and`:{let e=null;for(let n of r)if(e=await L(n,t),!await R(e))return e;return e}case`or`:{let e=null;for(let n of r)if(e=await L(n,t),await R(e))return e;return e}case`map`:{let e=await L(r[0],t);return M(e)?await Promise.all(e.map(e=>L(r[1],e))):[]}case`filter`:{let e=await L(r[0],t);return M(e)?(await Promise.all(e.map(async e=>({item:e,shouldInclude:await R(await L(r[1],e))})))).filter(({shouldInclude:e})=>e).map(({item:e})=>e):[]}case`reduce`:{let e=await L(r[0],t);if(!M(e))return r.length>2?await L(r[2],t):null;let n=r[1],i=r.length>2?await L(r[2],t):null;for(let t of e)i=await L(n,{current:t,accumulator:i});return i}case`all`:{let e=await L(r[0],t);if(!M(e)||e.length===0)return!1;for(let t of e)if(!await R(await L(r[1],t)))return!1;return!0}case`some`:{let e=await L(r[0],t);if(!M(e))return!1;for(let t of e)if(await R(await L(r[1],t)))return!0;return!1}case`none`:{let e=await L(r[0],t);if(!M(e))return!0;for(let t of e)if(await R(await L(r[1],t)))return!1;return!0}case`catch`:try{return await L(r[0],t)}catch(e){return P(e)?await L(e,t):r[1]?await L(r[1],e):e instanceof Error?e.message:e}}let i=await Promise.all(r.map(e=>L(e,t))),a=n?ne[n]:void 0;if(!a)throw Error(`Unrecognized operation ${n}`);return a.apply(t,i)}async function R(e){return N(e)?R(await e):!(Array.isArray(e)&&e.length===0)&&!!e}function re(e){return Object.keys(e)[0]}function z(e,t,n){return new Proxy(Object.create(null),{get(r,i){if(typeof i!=`string`)return;let a=e.find(e=>e.key===i);if(a!==void 0)return async()=>n.has(i)?!1:await L(a.logic,{...t,conditions:z(e,t,new Set(n).add(i))})===!0}})}var ie=(0,d.createFactory)(({client:e})=>(0,u.attach)({source:{stateSnapshot:e.stateSnapshotStore,predicates:e.predicates.listStore,actions:e.actions.listStore,features:e.features.listStore,responses:e.responses.getAllStore,conditions:e.conditions.listStore},effect:async({stateSnapshot:e,predicates:t,actions:n,features:r,responses:i,conditions:a},{rule:o,context:s})=>{let c=t.reduce((t,n)=>(t[n.name]=async(...t)=>await n.predicate({...e,args:t}),t),{}),l=n.reduce((t,n)=>(t[n.key]=async(...t)=>await n.action({...e,args:t},null)??void 0,t),{}),u=r.reduce((e,t)=>(e[t.id]=async()=>{let{bucket:e}=await t.getBucket();return e},e),{}),d={responses:i,location:typeof e.location==`object`?{hash:e.location.hash,host:e.location.host,hostname:e.location.hostname,href:e.location.href,origin:e.location.origin,pathname:e.location.pathname,port:e.location.port,protocol:e.location.protocol,search:e.location.search}:void 0,predicates:c,actions:l,features:u,...s};return await L(o,{...d,conditions:z(a,d,new Set)})}}));function ae(e){return(0,d.invoke)(ie,e)}var oe=6e3,se=o.t(`last_ping`,`global`),ce=async e=>{try{let t=Date.now(),n=o.n.get(se),r=0;if(n.isSet()&&(r=n.json()??0),r&&t-r<oe)return!0;let i={projectId:e.projectId,path:window.location.pathname},a={},c=document.getElementById(`picked_script`)?.dataset.verceltoken;c&&(a[`x-vercel-protection-bypass`]=c);let l=(await s.n(e.apiUrl,`ping`,i,a)).ok;return l&&n.set(t),l}catch{return!1}},B=(0,u.createDomain)(`lifecycle`),le=(0,d.createFactory)(({client:e})=>{let n=B.store(!1),a=(0,u.createStore)(void 0,{skipVoid:!1,domain:B}),o=(0,u.createStore)(void 0,{skipVoid:!1,domain:B}),s=B.store(`idle`),c=B.store([]),l=(0,u.createStore)(void 0,{skipVoid:!1,domain:B}),d=(0,u.createStore)(void 0,{skipVoid:!1,domain:B}),f=(0,u.createEvent)(),p=(0,u.createEvent)(),m=(0,u.createEvent)(),h=(0,u.createEvent)(),g=(0,u.createEvent)(),v=(0,u.createEvent)();c.on(h,(e,t)=>[...e,t]),l.on(g,(e,t)=>t),d.on(v,(e,t)=>t),n.on(p,()=>!0);let y=(0,u.createEffect)(()=>{ce(e)}),b=(0,u.createEffect)(async()=>{await i.r()}),x=(0,u.createEffect)(async()=>{await _(e)}),S=(0,u.attach)({effect:x}),C=(0,u.attach)({source:c,effect:async e=>{for(let t of e)await t()}}),w=(0,u.attach)({source:l,effect:async n=>n===void 0?!0:typeof n==`boolean`?n:await t.t(e,n)===!0}),T=(0,u.attach)({source:d,effect:async n=>n===void 0?!0:typeof n==`boolean`?n:await t.t(e,n)===!0}),E=(0,u.sample)({clock:f,source:s,filter:e=>e===`idle`&&r.i(),fn:()=>void 0});(0,u.sample)({clock:E,fn:()=>`starting`,target:s}),(0,u.sample)({clock:E,target:y}),(0,u.sample)({clock:E,target:C}),(0,u.sample)({clock:E,target:b}),(0,u.sample)({clock:C.done,target:w}),(0,u.sample)({clock:w.doneData,target:a}),(0,u.sample)({clock:T.doneData,target:o}),(0,u.sample)({clock:w.doneData,filter:e=>e,target:T}),(0,u.sample)({clock:T.doneData,target:e.session.setIsUser}),(0,u.sample)({clock:T.doneData,fn:e=>({type:`user_decide`,value:e}),target:e.eventBus}),(0,u.sample)({clock:w.doneData,filter:e=>!e,fn:()=>void 0,target:m}),(0,u.sample)({clock:T.doneData,fn:()=>void 0,target:m}),(0,u.sample)({clock:m,fn:()=>({type:`initialize`}),target:e.eventBus});let D=(0,u.createStore)(!1).on(b.done,()=>!0),O=(0,u.createStore)(!1).on(m,()=>!0),k=(0,u.createStore)(!1).on(S.done,()=>!0),A=(0,u.combine)(a,o,(e,t)=>e===!0&&t===!0);return(0,u.sample)({clock:m,source:A,filter:e=>e,fn:()=>void 0,target:x}),(0,u.sample)({clock:(0,u.combine)(D,O,A,(e,t,n)=>e&&t&&n),filter:e=>e,fn:()=>void 0,target:S}),(0,u.sample)({clock:(0,u.combine)(D,O,A,k,(e,t,n,r)=>e&&t&&(!n||r)),filter:e=>e,fn:()=>void 0,target:p}),(0,u.sample)({clock:p,fn:()=>`ready`,target:s}),(0,u.sample)({clock:p,fn:()=>({type:`ready`}),target:e.eventBus}),(0,u.sample)({clock:p,source:e.session.store,fn:({id:e,isUser:t,identifiers:n})=>({type:`session`,id:e,isUser:t,identifiers:n}),target:e.eventBus}),(0,u.sample)({clock:[C.fail,w.fail,T.fail,x.fail,S.fail,b.fail],fn:()=>`failed`,target:s}),{start:f,readyStore:n,preconditionPassedStore:a,conditionPassedStore:o,lifecycleStageStore:s,registerPluginStartHook:h,setPrecondition:g,setCondition:v}});function ue(e){return(0,d.invoke)(le,e)}var de=(0,u.createDomain)(`predicate`),fe=(0,d.createFactory)(({client:e})=>{let t=de.store({}),r=(0,u.createApi)(t,{register(e,t){return{...e,[t.name]:{name:t.name,predicate:t.predicate}}}}),i=(0,u.createEvent)();(0,u.sample)({clock:i,source:t,filter:(e,{name:t})=>e[t]!==void 0,fn:(e,{name:t})=>`Predicate '${t}' already registered. Registering again will override the previous registration.`}).watch(e=>n.t(`warn`,e)),(0,u.sample)({clock:i,fn:({name:e,predicate:t})=>Object.freeze({name:e,predicate:t}),target:r.register});let a=t.map(e=>Object.values(e));function o(e){return t.map(t=>t[e]?.predicate,{skipVoid:!1})}function s(t){let n=(0,u.createStore)(()=>void 0,{skipVoid:!1}),r=(0,u.attach)({source:{predicate:o(t),snapshot:e.stateSnapshotStore},effect:({predicate:e,snapshot:t})=>{if(e)return(...n)=>e({...t,args:n})}});return(0,u.sample)({source:{responses:e.responses.listStore,fields:e.fields.listStore},target:r}),(0,u.sample)({clock:r.doneData,filter:e=>e!==void 0,target:n}),r(),n}return{register:i,getByName:o,listStore:a,getEvokablePredicate:s}});function pe(e){return(0,d.invoke)(fe,e)}var me=(e,t,n)=>{n.register({name:e,predicate:t})},V=(0,u.createDomain)(`feature`);function H(e){return e?.enabled===!1}var he=(0,d.createFactory)(({client:e})=>{let t=V.store({}),r=V.store([]),i=(0,u.createApi)(t,{register(e,t){return{...e,[t.id]:t.feature}}}),a=(0,u.createEvent)();(0,u.sample)({clock:a,source:t,filter:(e,{id:t})=>e[t]!==void 0,fn:(e,{id:t})=>`Feature '${t}' already registered. Registering again will override the previous registration.`}).watch(e=>n.t(`warn`,e)),(0,u.sample)({clock:a,fn:({id:e,feature:t})=>Object.freeze({id:e,feature:{id:e,feature:{...t,id:e}}}),target:i.register});let s=(0,u.createEffect)(async({id:e,key:t,storage:n=`local`,enabled:r})=>{if(r===!1)return null;let i=o.t(`feature:${e}:${t}`,`global`),a=(n===`session`?o.r:o.n).get(i).boolean();return a===null?null:{id:e,key:t,bucket:a,storage:n}}),c=(0,u.createEffect)(e=>{if(!e)return null;let t=o.t(`feature:${e.id}:${e.key}`,`global`);(e.storage===`session`?o.r:o.n).set(t,e.bucket)}),l=new Map,d=(0,u.attach)({source:{allFeaturesStore:t,resolvedFeaturesStore:r},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`);if(H(o.feature))return{id:o.id,bucket:!1,key:i,storage:o.feature.storage};let s=l.get(`${n}:${i}`);if(s!==void 0){let e=await s;return{id:o.id,bucket:e,key:i,storage:o.feature.storage}}let c=r();l.set(`${n}:${i}`,c);let u=await c;return{id:o.id,bucket:u,key:i,storage:o.feature.storage}}});(0,u.sample)({clock:i.register,fn:e=>{let{id:t,feature:n}=e;return{id:t,key:n.feature.key,storage:n.feature.storage,enabled:n.feature.enabled}},target:s}),(0,u.sample)({source:t,clock:d.doneData,filter:(e,t)=>!H(e[t.id]?.feature),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:c});let f=(0,u.combine)({allFeaturesStore:t,resolvedFeaturesStore:r}).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,enabled:e.feature.enabled,weight:e.feature.weight,getBucket:()=>({id:e.id,bucket:n.bucket}),isResolved:!0}:{id:e.id,name:e.feature.name,key:e.feature.key,enabled:e.feature.enabled,weight:e.feature.weight,getBucket:async()=>await d(e.feature),isResolved:!1}}));(0,u.sample)({clock:d.doneData,source:{resolvedFeatures:r,allFeatures:t},filter:({resolvedFeatures:e,allFeatures:t},{id:n,key:r})=>H(t[n]?.feature)?!1:!e.some(e=>e.id===n&&e.key===r),fn:(e,t)=>t,target:e.eventBus.prepend(e=>({type:`feature_decide`,feature:e}))}),(0,u.sample)({clock:[s.doneData,d.doneData],source:{resolvedFeatures:r,allFeatures:t},fn:({resolvedFeatures:e,allFeatures:t},n)=>!n||H(t[n.id]?.feature)||e.some(e=>e.id===n.id&&e.key===n.key)?e:[...e,n],target:r});function p(e){return f.map(t=>t.find(t=>t.id===e))}function m(e){return t.map(t=>t[e],{skipVoid:!1})}function h(e){let t=(0,u.createStore)(async()=>void 0,{skipVoid:!1}),n=(0,u.attach)({source:p(e),effect:async e=>{if(e)return async()=>(await e.getBucket()).bucket}});return(0,u.sample)({source:r,filter:t=>t.some(t=>t.id===e),target:n}),(0,u.sample)({clock:n.doneData,filter:e=>e!==void 0,target:t}),n(),t}return{register:a,getById:p,getByName:m,listStore:f,getEvokableFeature:h}});function ge(e){return(0,d.invoke)(he,e)}var _e=(e,t,n)=>{n.register({id:e,feature:t})},U=(0,u.createDomain)(`history`);function W(e,t){return{id:c.t(`history-entry-${Date.now()}-${Math.random()}}`),node:t,at:Date.now(),experienceId:e}}var ve=(0,d.createFactory)(()=>{let e=U.store({entries:[]}),t=U.event(),n=U.event(),r=U.event(),i=U.event();e.on(t,(e,t)=>({entries:[...e.entries,W(t.experienceId,t.node)]})),e.on(n,(e,t)=>({entries:[...e.entries.slice(0,-1),W(t.experienceId,t.node)]})),e.on(i,(e,t)=>t);function o(e,t){let n={lastStepIndex:-1,secondLastStepIndex:-1};for(let r=e.length-1;r>=0;r--){let i=e[r],o=i?.node;if(!(!o||!a.u(o))&&!(t&&i.experienceId!==t))if(n.lastStepIndex===-1)n.lastStepIndex=r;else{n.secondLastStepIndex=r;break}}return n}return e.on(r,(e,t)=>{let{secondLastStepIndex:n}=o(e.entries,t.experienceId),r=n===-1?e.entries:e.entries.slice(0,n+1);return{...e,entries:r}}),{push:t,replace:n,back:r,restore:i,entriesStore:e.map(e=>e.entries)}});function ye(){return(0,d.invoke)(ve)}var be=0,xe=e=>{let t=(0,u.createStore)([]);return t.on(e,(e,t)=>[...e,{id:be++,at:new Date,payload:t}]),t},Se=(0,u.createDomain)(`field`),Ce=(0,d.createFactory)(()=>{let e=Se.store({}),t=(0,u.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})}let r={};e.watch(e=>{r=e});function i(e,n){let i=Object.values(r).find(t=>t.key===e)?.key;i&&t.updateByKey({fieldKey:i,updates:n})}let a=e.map(e=>Object.values(e));function o(t){return e.map(e=>e[t]??null,{skipVoid:!1})}function s(t){return e.map(e=>Object.values(e).find(e=>e.key===t)??null,{skipVoid:!1})}function c(t){return e.map(e=>Object.values(e).find(e=>e.name===t)??null,{skipVoid:!1})}return{register:n,update:i,getById:o,getByKey:s,listStore:a,getByName:c}});function we(){return(0,d.invoke)(Ce)}var Te=(0,u.createDomain)(`step`),Ee=(0,d.createFactory)(()=>{let e=Te.store({}),t=(0,u.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 De(){return(0,d.invoke)(Ee)}function Oe(e,t){t.register(e)}var ke=(0,u.createDomain)(`content`),Ae=(0,d.createFactory)(()=>{let e=ke.store({}),t=(0,u.createApi)(e,{register(e,t){return{...e,[t.content.id]:t.content}},patch(e,t){let n=e[t.id];if(!n)return e;let r=t.apply(n.data);return r===n.data?e:{...e,[t.id]:{...n,data:r}}}});function n(e){t.register({content:e})}function r(e,n){t.patch({id:e,apply:n})}let i=e.map(e=>Object.values(e));function a(t){return e.map(e=>e[t]??null,{skipVoid:!1})}return{register:n,patch:r,getById:a,listStore:i,indexStore:e}});function je(){return(0,d.invoke)(Ae)}function Me(e,t){t.register(e)}var Ne=(0,u.createDomain)(`action`),Pe=(0,d.createFactory)(({client:e})=>{let t=Ne.store({}),r=(0,u.createApi)(t,{register(e,t){return{...e,[t.key]:{key:t.key,action:t.action}}}}),i=(0,u.createEvent)();(0,u.sample)({clock:i,source:t,filter:(e,{key:t})=>e[t]!==void 0,fn:(e,{key:t})=>`Action '${t}' already registered. Registering again will override the previous registration.`}).watch(e=>n.t(`warn`,e)),(0,u.sample)({clock:i,fn:({key:e,action:t})=>Object.freeze({key:e,action:t}),target:r.register});let a=t.map(e=>Object.values(e));function o(e){return t.map(t=>t[e]?.action,{skipVoid:!1})}function s(t,n){let r=(0,u.createStore)(()=>void 0,{skipVoid:!1}),i=n?{experience:n.experience}:null,a=(0,u.attach)({source:{action:o(t),snapshot:e.stateSnapshotStore},effect:({action:e,snapshot:t})=>{if(e)return(...n)=>e({...t,args:n},i)}});return(0,u.sample)({source:{responses:e.responses.listStore,fields:e.fields.listStore},target:a}),(0,u.sample)({clock:a.doneData,filter:e=>e!==void 0,target:r}),a(),r}return{register:i,getByKey:o,listStore:a,getEvokableAction:s}});function Fe(e){return(0,d.invoke)(Pe,e)}var Ie=(e,t,n)=>{n.register({key:e,action:t})};function G(e,t,n,r){return{fieldKey:e.key,userMessage:n,systemMessage:r,value:t}}function K(e){return e===null||e===``||Array.isArray(e)&&!e.length}function Le(e){return typeof e==`string`||typeof e==`number`||typeof e==`boolean`||e===null}function q(e){try{return JSON.stringify(e),!0}catch{return!1}}function Re(e,t){return t.find(t=>t.key===e)??null}function ze(e,t){return e.multiple&&(typeof t==`string`||typeof t==`number`||typeof t==`boolean`)?[t]:t}function Be(e,t){if(e.type!==`object`||K(t))return null;if(e.multiple){if(!Array.isArray(t))return G(e,t,`This field expects multiple values`,`Field expects an array of objects.`);for(let n of t){if(typeof n!=`object`||!n)return G(e,t,`This field expects object values`,`Field expects an array of objects, but received non-object value.`);if(!q(n))return G(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)?G(e,t,`This field expects a single value`,`Field expects a single object, not an array.`):typeof t!=`object`||!t?G(e,t,`This field expects an object value`,`Field expects an object value.`):q(t)?null:G(e,t,`This field contains non-serializable data`,`Field value contains non-JSON-serializable data (functions, circular references, etc.).`)}function Ve(e,t){if(K(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:G(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=>!Le(e)||e===null?!1:r.includes(e))?null:G(e,t,`This field expects a valid option`,`Field expects a valid option. Valid options are: ${r.join(`, `)}`)}async function He(t,n,r,i){if(n.validation&&!e.t(n.validation)&&!K(r)){let e=i?{$input:r,responses:i}:{$input:r},a=await t(n.validation,e);if(typeof a==`string`)return G(n,r,a,`Field validation resulted in an error: ${a}.`);if(a===!1)return G(n,r,`This field is invalid`,`Field validation resulted in an unspecified error.`)}return n.required&&K(r)?G(n,r,`This field is required`,`Field is required.`):!n.multiple&&Array.isArray(r)&&r.length>1?G(n,r,`This field expects a single response`,`Field expects a single response.`):null}var Ue=(0,u.createDomain)(`response`),We=(0,d.createFactory)(({client:e})=>{let n=Ue.store({}),r=(0,u.createEvent)(),i=(0,u.createEvent)(),a=(0,u.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)=>t.t(e,n,r),c=(0,u.attach)({source:{allFields:e.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=Re(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=ze(o,n),l=await He(s,o,c,a);if(l){r.push(l);return}let u=Be(o,c);if(u){r.push(u);return}let d=Ve(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 l(e){return c(e)}let d=(0,u.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,u.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(t){return h(e.fields.getById(t))}function _(t){return h(e.fields.getByKey(t))}function v(t){return h(e.fields.getByName(t))}return(0,u.sample)({clock:r,target:a.clearAll}),(0,u.sample)({clock:i,target:a.clear}),{register:o,clearAll:r,clear:i,commit:f,getResponsesToCommit:l,listStore:m,getAllStore:p,getByFieldId:g,getByFieldKey:_,getByFieldName:v}});function Ge(e){return(0,d.invoke)(We,e)}var Ke=(0,u.createDomain)(`condition`),qe=(0,d.createFactory)(()=>{let e=Ke.store({}),t=(0,u.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 Je(){return(0,d.invoke)(qe)}function Ye(){if(r.i()){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 J(){if(!r.f())return{};let e=new URLSearchParams(window.location.search),t={},n=new Set;for(let[t]of e.entries())t.startsWith(`picked-`)&&n.add(t);for(let r of n){let n=r.replace(`picked-`,``);t[n]=e.getAll(r)}let i=o.t(`s`);if(n.size>0)o.r.set(i,t);else{let e=o.r.get(i);if(e)return e.json()||{}}return t}var Y=o.t(`session`,`global`);function Xe(){return r.r()?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)}`}function Ze(){if(!r.s())return null;let e=o.n.get(Y);if(!e.isSet())return null;try{return e.json()}catch{return null}}var Qe=(0,d.createFactory)(()=>{let e=Ze(),t={id:e?.id??Xe()};e?.isUser!==void 0&&(t.isUser=e.isUser),e?.identifiers&&Object.keys(e.identifiers).length>0&&(t.identifiers=e.identifiers);let n=(0,u.createStore)(t),i=(0,u.createApi)(n,{setIsUser:(e,t)=>({...e,isUser:t}),setIdentifier:(e,{key:t,value:n})=>({...e,identifiers:{...e.identifiers??{},[t]:n}}),removeIdentifier:(e,t)=>{let n=e.identifiers;if(!n||!(t in n))return e;let r={};for(let[e,i]of Object.entries(n))e!==t&&(r[e]=i);let i={id:e.id};return e.isUser!==void 0&&(i.isUser=e.isUser),Object.keys(r).length>0&&(i.identifiers=r),i}});return(0,u.sample)({source:n,target:(0,u.attach)({source:n,effect:e=>{if(r.s())try{o.n.get(Y).set(e)}catch{}}})}),{store:n,setIsUser:i.setIsUser,setIdentifier:i.setIdentifier,removeIdentifier:i.removeIdentifier}});function $e(){return(0,d.invoke)(Qe,void 0)}function X(){if(r.f())return globalThis.window.pickedConfig}function et(){if(r.f())return X()?.projectId}function tt(){if(!r.i())return;let e=document.getElementById(`picked_script`)||document.querySelector(`script#picked`)||document.getElementById(`cvly`);if(e)return e.dataset.projectid||e.getAttribute(`project-id`)||void 0}function nt(e){if(e.projectId)return e.projectId;let t=et();if(t)return t;let n=tt();if(n)return n;throw Error(`projectId is required. You can provide it via one of:
|
|
2
2
|
(1) createClient({ projectId }) options;
|
|
3
3
|
(2) window.pickedConfig = { projectId };
|
|
4
4
|
(3) a <script> tag with id 'picked_script', 'picked', or 'cvly' that includes a data-projectid (or project-id) attribute.`)}function Z(e){return e==null||e===``||Number.isNaN(e)}var rt={default:(e,t)=>Z(e)?String(t??``):String(e),append:(e,t)=>t&&!Z(e)?`${e} ${t}`:e,prepend:(e,t)=>t&&!Z(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 it(e){return typeof e==`object`&&!!e}function at(e,t){let n=t;for(let t of e.split(`.`))if(it(n)&&t in n)n=n[t];else return;return typeof n==`function`?n():n}function ot(e,t){let n=e.split(`|`).map(e=>e.trim()),r=at(n.shift()??``,t);for(let e of n){let[t,...n]=e.split(`:`),i=t?.trim()??``,a=n.join(`:`).trim().replaceAll(/(?:^['"]|['"]$)/g,``),o=rt[i];o&&(r=o(r,a))}return Z(r)?``:typeof r==`object`?JSON.stringify(r):String(r)}function st(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+=ot(i.trim(),t)}else n+=e[r++];return n}var Q=`preview-token`;function $(){return!r.f()||!r.t()?!1:!!J()[Q]?.[0]}var ct=class{static logger=n.t;options;dataSource=null;contentLoader;previewEmbedderOrigins=null;plugins={};eventBus=(0,u.createEvent)();events;projectId;apiUrl;dashboardUrl;documentationSiteUrl;session=$e();searchParams=J();history=ye();components=w({client:this});experienceInstances=a.n({client:this});experiences=g({client:this});frameworks=O({client:this});predicates=pe({client:this});features=ge({client:this});conditions=Je();fields=we();responses=Ge({client:this});steps=De();contents=je();actions=Fe({client:this});conditionResults=a.r();stateSnapshotStore=ee({client:this});evaluateRuleLogicFx=ae({client:this});start;readyStore;preconditionPassedStore;conditionPassedStore;lifecycleStageStore;lifecycle=ue({client:this});renderStringFx=(0,u.attach)({source:this.responses.listStore,effect:(e,{template:t,context:n})=>{let r={};for(let t of e)r[t.fieldKey]=t.value;return st(t,{...n,responses:r})}});constructor(e){this.events=xe(this.eventBus),this.projectId=nt(e),this.options=Object.freeze(e),this.apiUrl=e.apiUrl||Ye(),this.dashboardUrl=e.dashboardUrl??`https://dashboard.picked.app`,this.documentationSiteUrl=e.documentationSiteUrl??`https://docs.picked.app`,this.start=this.lifecycle.start,this.readyStore=this.lifecycle.readyStore,this.preconditionPassedStore=this.lifecycle.preconditionPassedStore,this.conditionPassedStore=this.lifecycle.conditionPassedStore,this.lifecycleStageStore=this.lifecycle.lifecycleStageStore,this.setupPlugins(),this.setupFeatures(),this.setupPredicates(),this.setupActions(),this.setupComponents(),this.lifecycle.setPrecondition(e.precondition),this.lifecycle.setCondition(e.condition),this.eventBus({type:`load`,version:s.r()}),this.maybeStartPreviewChannel()}maybeStartPreviewChannel(){$()&&Promise.resolve().then(()=>require("../preview-channel-Cx0e6fye.cjs")).then(e=>e.initPreviewChannel(this)).catch(()=>void 0)}registerFramework=e=>{k(e,this.frameworks)};registerComponent=(e,t)=>{T(e,t,this.components)};registerPlugin=e=>{y(this,e,this.plugins);let t=this.plugins[e.name];t?.onStart&&this.lifecycle.registerPluginStartHook(t.onStart)};registerFeature=(e,t)=>{_e(e,t,this.features)};registerPredicate=(e,t)=>{me(e,t,this.predicates)};registerCondition=e=>{this.conditions.register(e)};registerField=e=>{this.fields.register(e)};registerStep=e=>{Oe(e,this.steps)};registerContent=e=>{Me(e,this.contents)};patchContent=(e,t)=>{this.contents.patch(e,t)};registerAction=(e,t)=>{Ie(e,t,this.actions)};registerExperience=e=>{e.component&&T(`experience:${e.id}`,e.component,this.components),this.experiences.register(e)};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})};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]??{}},lt=`application/picked-javascript`,ut=`application/picked-module`,dt=`data-picked-hydrated`;async function ft(e){if(!(`document`in globalThis))return;let t=`application/picked-module`,n=`data-picked-hydrated`;function r(e){try{Function(e.textContent)}catch(t){return t instanceof SyntaxError?(console.error(`[picked] Skipped a rehydrated inline script that failed to parse.`,t),e.setAttribute(n,``),!0):!1}return!1}function i(e,t){let r=document.createElement(`script`);for(let t of Array.from(e.attributes))t.name!==`type`&&r.setAttribute(t.name,t.value);t&&r.setAttribute(`type`,t),r.setAttribute(n,``),e.src?r.async=!1:r.textContent=e.textContent;let i=e.src?new Promise(e=>{r.addEventListener(`load`,()=>e(),{once:!0}),r.addEventListener(`error`,()=>e(),{once:!0})}):null;return e.src?e.replaceWith(r):(globalThis.__pickedEmbedScriptRoot=e.getRootNode(),e.replaceWith(r),globalThis.__pickedEmbedScriptRoot=null),i}let a=Array.from(e.querySelectorAll(`script[type="application/picked-javascript"]:not([${n}]), script[type="${t}"]:not([${n}])`)).filter(e=>e instanceof HTMLScriptElement);for(let e of a){if(!e.isConnected)continue;let n=e.getAttribute(`type`)===t?`module`:null;if(!e.src&&n===null&&r(e))continue;let a=i(e,n);a&&await a}}function pt(){return`<script>(${ft.toString()})(document)<\/script>`}function mt(e){return typeof e==`object`&&!!e&&`id`in e&&typeof e.id==`string`&&`content`in e&&(typeof e.content==`string`||e.content===null)}function ht(e){return{$$type:`lazy-component`,load:e}}function gt(e){return typeof e==`object`&&!!e&&`$$type`in e&&e.$$type===`lazy-component`}var _t=e=>{let t=new ct(e);return r.m(t),t};exports.PICKED_HYDRATED_ATTR=dt,exports.PICKED_MODULE_SCRIPT_TYPE=ut,exports.PICKED_SCRIPT_TYPE=lt,exports.PREVIEW_TOKEN_PARAM=Q,exports.Picked=ct,exports.buildRehydrateBootstrap=pt,exports.createClient=_t,exports.createPluginEffect=v,exports.createStorageKey=o.t,exports.evaluateRuleLogic=t.t,exports.getPickedConfig=X,exports.isHtmlAssetValue=mt,exports.isInsideIframe=r.t,exports.isLazyLoader=gt,exports.isPickedRoot=i.a,exports.isPreviewSession=$,exports.lazyComponent=ht,exports.localStore=o.n,exports.onInertScriptSubtrees=l.t,exports.rehydrateScripts=ft,exports.reportInertScriptSubtrees=l.n,exports.resetInertScriptReport=l.r,exports.sessionStore=o.r,exports.subscribe=o.i,exports.supportsCookies=r.n,exports.supportsCryptoRandomUUID=r.r,exports.supportsDocument=r.i,exports.supportsHistory=r.a,exports.supportsIntersectionObserver=r.o,exports.supportsLocalStorage=r.s,exports.supportsLocation=r.c,exports.supportsSessionStorage=r.l,exports.supportsShadowRoot=r.u,exports.supportsWebComponents=r.d,exports.supportsWindow=r.f;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../../api-
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../../api-Ce6xYI--.cjs"),t=require("../../../plugin-DHn11gn6.cjs");exports.createClientHeaders=e.i,exports.dynamicExperiencesPlugin=t.t,exports.fetchExperienceContent=t.n,exports.fetchProject=t.r;
|
package/dist/cjs/server/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../experience-instance-DurC3pE-.cjs"),t=require("../../plugin-
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../experience-instance-DurC3pE-.cjs"),t=require("../../plugin-DHn11gn6.cjs");let n=require("effector");var r=1e4;function i(e){if(e?.location!==void 0)return{location:e.location}}function a(t,n){return t.nodes.filter(e.u).some(e=>n.get(e.stepId)===!0)}async function o(n,o){let{projectConfig:s}=o,c=n.session.store.getState().id;n.conditionResults.reset(),t.i(n,s,{isPreview:!1,sessionId:c});let l=i(o.attributes),u=o.timeoutMs??r,d=new Map(s.steps.map(e=>[e.id,e.layoutContentId!==void 0&&e.layoutContentId!==null])),f=[];for(let t of s.experiences)await e.o(n,{condition:t.condition},{context:l})&&f.push(t);let p=new Map;for(let e of f){if(!a(e,d))continue;let r=o.getContent?await o.getContent({id:e.id,key:e.key},{previewToken:o.previewToken}):await t.n(n.apiUrl,n.projectId,e.id,{previewToken:o.previewToken,signal:AbortSignal.timeout(u)});if(r)for(let e of r.content)p.set(e.id,e)}return{versionId:s.versionId,projectConfig:s,content:Array.from(p.values()),conditionResults:n.conditionResults.store.getState()}}function s(){let e,t;return{promise:new Promise((n,r)=>{e=n,t=r}),resolve:t=>e(t),reject:e=>t(e)}}function c(t,r){let{promise:i,resolve:a}=s(),o=(0,n.createEvent)(),c=(0,n.createEvent)(),l=(0,n.createEvent)(),u=(0,n.createEvent)(),d=(0,n.createEvent)(),f=t.experiences.listStore.map(n=>n.map(n=>e.t({client:t,experience:n}))),p=(0,n.createStore)({currentExperienceIndex:0,renderedExperiences:[],isComplete:!1}),m=(0,n.createEffect)(async e=>{let r=(0,n.attach)({source:e.experience.componentStore,effect:async(n,r)=>{let i=e.availableRenderers[r];return n&&i?.isValidComponent(n.component)?{rendered:await i.render(n.component,t,e.experience),rendererIndex:r}:null}}),i=e.startRendererIndex??0;for(let t=i;t<e.availableRenderers.length;t++){let e=await r(t);if(e)return e}return null}),h=(0,n.createEffect)(async({experience:e,availableRenderers:t,startRendererIndex:n=0})=>e?m({experience:e,availableRenderers:t,startRendererIndex:n}):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(o),(0,n.sample)({clock:o,target:c}),(0,n.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:r,startRendererIndex:0}),target:h}),(0,n.sample)({clock:h.doneData,filter:e=>e!==null,fn:e=>e.rendered.body,target:l}),(0,n.sample)({clock:l,target:c}),(0,n.sample)({clock:h.doneData,filter:e=>e===null,target:d}),(0,n.sample)({clock:d,target:c}),(0,n.sample)({clock:[c,d,l],source:{experiences:f,state:p},filter:({experiences:e,state:t})=>t.currentExperienceIndex>=e.length,target:u}),(0,n.sample)({clock:u,target:(0,n.attach)({source:p,effect:e=>{e.isComplete&&a(e.renderedExperiences)}})}),o(),i}exports.createExperienceInstance=e.t,exports.evaluateConditionMemo=e.i,exports.hashRule=e.a,exports.isExperienceActive=e.o,exports.registerProjectConfig=t.i,exports.render=c,exports.ruleReferencesAction=e.s,exports.ruleReferencesActionDeep=e.c,exports.serialize=o;
|
package/dist/docs/actions.mdx
CHANGED
|
@@ -6,7 +6,8 @@ import { Screenshot } from '../../components/Screenshot'
|
|
|
6
6
|
|
|
7
7
|
# Actions
|
|
8
8
|
|
|
9
|
-
An action is a side effect that
|
|
9
|
+
An action is a side effect that starts when the flow reaches it. Use an action to
|
|
10
|
+
track an event, to send data to an external service, or to call a webhook.
|
|
10
11
|
|
|
11
12
|
<Screenshot
|
|
12
13
|
route="/{orgSlug}/{projectId}/workspaces/{workspaceId}/actions"
|
|
@@ -18,20 +19,23 @@ An action is a side effect that triggers when the flow reaches it. Use actions f
|
|
|
18
19
|
1. Open your project.
|
|
19
20
|
2. Click **Actions** in the sidebar.
|
|
20
21
|
3. Click **New Action**.
|
|
21
|
-
4. Enter a name and key.
|
|
22
|
+
4. Enter a name and a key.
|
|
22
23
|
5. Click **Create**.
|
|
23
24
|
|
|
24
|
-
The key is a unique identifier
|
|
25
|
+
The key is a unique identifier for your application. You set it once, and you cannot
|
|
26
|
+
change it later.
|
|
25
27
|
|
|
26
|
-
##
|
|
28
|
+
## Set up an action
|
|
27
29
|
|
|
28
|
-
**Name**: The
|
|
30
|
+
**Name**: The name that the dashboard shows. Your visitors do not see it.
|
|
29
31
|
|
|
30
|
-
**Key**: The
|
|
32
|
+
**Key**: The identifier that your application uses for this action. Your visitors do
|
|
33
|
+
not see it.
|
|
31
34
|
|
|
32
35
|
## Register in your application
|
|
33
36
|
|
|
34
|
-
|
|
37
|
+
Register your actions when you create the Picked client. Pass an `actions` object.
|
|
38
|
+
Each key in it must match an action key from the dashboard:
|
|
35
39
|
|
|
36
40
|
```typescript
|
|
37
41
|
import { createClient } from '@picked/client'
|
|
@@ -47,32 +51,48 @@ const picked = createClient({
|
|
|
47
51
|
},
|
|
48
52
|
'check-eligibility': async () => {
|
|
49
53
|
const response = await fetch('/api/eligibility')
|
|
50
|
-
// Throw only when the request itself fails
|
|
54
|
+
// Throw only when the request itself fails. That takes the failure branch.
|
|
51
55
|
if (!response.ok) throw new Error('Eligibility request failed')
|
|
52
56
|
},
|
|
53
57
|
},
|
|
54
58
|
})
|
|
55
59
|
```
|
|
56
60
|
|
|
57
|
-
Each action is a function
|
|
61
|
+
Each action is a function. It takes optional parameters and it usually runs a side
|
|
62
|
+
effect. When the flow reaches an action node, the SDK calls the function that
|
|
63
|
+
matches. The SDK then takes a branch, which depends on whether the function succeeds
|
|
64
|
+
or throws. See [Success and failure branches](#success-and-failure-branches).
|
|
58
65
|
|
|
59
|
-
See [SDK Actions](/sdk/actions) for more
|
|
66
|
+
See [SDK Actions](/sdk/actions) for more detail.
|
|
60
67
|
|
|
61
68
|
## Use actions in flows
|
|
62
69
|
|
|
63
|
-
In the flow builder, drag an action from the entity browser onto the canvas. Connect
|
|
70
|
+
In the flow builder, drag an action from the entity browser onto the canvas. Connect
|
|
71
|
+
it to the point in the flow where you want it to start.
|
|
64
72
|
|
|
65
|
-
|
|
73
|
+
An action runs when the flow reaches its node. It does not interrupt your visitor. By
|
|
74
|
+
default the flow continues to the next connected node.
|
|
66
75
|
|
|
67
|
-
### Success and failure
|
|
76
|
+
### Success and failure branches
|
|
68
77
|
|
|
69
|
-
An action node can have two outgoing branches: **success** and **failure**. The SDK
|
|
78
|
+
An action node can have two outgoing branches: **success** and **failure**. The SDK
|
|
79
|
+
chooses the branch from the outcome of the action:
|
|
70
80
|
|
|
71
|
-
- **Failure** — the action throws
|
|
72
|
-
|
|
81
|
+
- **Failure** — the action throws, or its promise rejects. The flow takes the failure
|
|
82
|
+
branch.
|
|
83
|
+
- **Success** — the action resolves to any value: nothing, `true`, `false`, or a
|
|
84
|
+
string. A returned `false` is a valid response and not a failure. The flow takes
|
|
85
|
+
the success branch.
|
|
73
86
|
|
|
74
|
-
|
|
87
|
+
Keep the failure branch for a true error. Throw on the failure case, for example
|
|
88
|
+
`if (!response.ok) throw new Error(...)`. A valid negative result is _not_ a failure.
|
|
89
|
+
An API that returns `200` with `{ serviced: false }` must record that value as a
|
|
90
|
+
response. Branch on it with a condition instead of a throw.
|
|
91
|
+
|
|
92
|
+
An action node can also have one plain connection, with no success or failure branch.
|
|
93
|
+
The flow then continues through it on either outcome.
|
|
75
94
|
|
|
76
95
|
## Reuse actions
|
|
77
96
|
|
|
78
|
-
|
|
97
|
+
An action is a project-level entity. Use the same action in more than one experience
|
|
98
|
+
flow. A change to the options of an action applies at every place that uses it.
|
|
@@ -4,11 +4,15 @@ layout: docs
|
|
|
4
4
|
|
|
5
5
|
# Authentication
|
|
6
6
|
|
|
7
|
-
The Picked API supports
|
|
7
|
+
The Picked API supports four ways to authenticate. They are a session from an email
|
|
8
|
+
address and a password, an OAuth provider, a magic link, and an API key. This guide
|
|
9
|
+
covers each one. It also covers how to control a session and how to use multi-factor
|
|
10
|
+
authentication (MFA).
|
|
8
11
|
|
|
9
|
-
##
|
|
12
|
+
## Sign in with an email address and a password
|
|
10
13
|
|
|
11
|
-
The `sessionCreate` mutation authenticates a user
|
|
14
|
+
The `sessionCreate` mutation authenticates a user from an email address and a
|
|
15
|
+
password. It returns a session.
|
|
12
16
|
|
|
13
17
|
```graphql
|
|
14
18
|
mutation {
|
|
@@ -36,13 +40,16 @@ mutation {
|
|
|
36
40
|
}
|
|
37
41
|
```
|
|
38
42
|
|
|
39
|
-
|
|
43
|
+
When the user has MFA on, the response sets `requiresMfa` to `true` and returns the
|
|
44
|
+
`mfaFactors` of that user. The caller must then complete an MFA challenge before it
|
|
45
|
+
receives a full session. See [MFA](#multi-factor-authentication-mfa) below.
|
|
40
46
|
|
|
41
|
-
|
|
47
|
+
When MFA is off, the response holds a `session` with an `accessToken`, a
|
|
48
|
+
`refreshToken`, and an `expiresAt` timestamp.
|
|
42
49
|
|
|
43
|
-
##
|
|
50
|
+
## Create an account
|
|
44
51
|
|
|
45
|
-
|
|
52
|
+
The `accountCreate` mutation creates a new account:
|
|
46
53
|
|
|
47
54
|
```graphql
|
|
48
55
|
mutation {
|
|
@@ -63,11 +70,14 @@ mutation {
|
|
|
63
70
|
}
|
|
64
71
|
```
|
|
65
72
|
|
|
66
|
-
The `metadata` field is optional
|
|
73
|
+
The `metadata` field is optional. It takes any JSON, and you can hold profile
|
|
74
|
+
information in it. When the account needs email verification, the session in the
|
|
75
|
+
response is `null` until the user verifies the email address.
|
|
67
76
|
|
|
68
|
-
##
|
|
77
|
+
## Verify an email address
|
|
69
78
|
|
|
70
|
-
After account
|
|
79
|
+
After you create the account, the user receives a verification email with a token.
|
|
80
|
+
The `accountVerifyEmail` mutation completes the verification:
|
|
71
81
|
|
|
72
82
|
```graphql
|
|
73
83
|
mutation {
|
|
@@ -83,7 +93,7 @@ mutation {
|
|
|
83
93
|
}
|
|
84
94
|
```
|
|
85
95
|
|
|
86
|
-
|
|
96
|
+
To send the verification email again:
|
|
87
97
|
|
|
88
98
|
```graphql
|
|
89
99
|
mutation {
|
|
@@ -95,11 +105,11 @@ mutation {
|
|
|
95
105
|
}
|
|
96
106
|
```
|
|
97
107
|
|
|
98
|
-
## OAuth flow
|
|
108
|
+
## The OAuth flow with Google
|
|
99
109
|
|
|
100
110
|
The API supports Google as an OAuth provider. The flow has two steps.
|
|
101
111
|
|
|
102
|
-
### Step 1:
|
|
112
|
+
### Step 1: get the authorization URL
|
|
103
113
|
|
|
104
114
|
```graphql
|
|
105
115
|
mutation {
|
|
@@ -113,9 +123,11 @@ mutation {
|
|
|
113
123
|
}
|
|
114
124
|
```
|
|
115
125
|
|
|
116
|
-
The caller
|
|
126
|
+
The caller sends the user to the `url` in the response. The user authenticates with
|
|
127
|
+
Google. Google then sends the user back to a URL on the same dashboard deployment,
|
|
128
|
+
with a `code` parameter. The caller exchanges that code for a session.
|
|
117
129
|
|
|
118
|
-
### Step 2:
|
|
130
|
+
### Step 2: exchange the code for a session
|
|
119
131
|
|
|
120
132
|
```graphql
|
|
121
133
|
mutation {
|
|
@@ -134,7 +146,7 @@ mutation {
|
|
|
134
146
|
|
|
135
147
|
## Magic links
|
|
136
148
|
|
|
137
|
-
|
|
149
|
+
A magic link authenticates a user through an email address, with no password.
|
|
138
150
|
|
|
139
151
|
### Send a magic link
|
|
140
152
|
|
|
@@ -149,7 +161,7 @@ mutation {
|
|
|
149
161
|
}
|
|
150
162
|
```
|
|
151
163
|
|
|
152
|
-
The user receives an email
|
|
164
|
+
The user receives an email with a link, and the link holds a token.
|
|
153
165
|
|
|
154
166
|
### Verify the magic link
|
|
155
167
|
|
|
@@ -167,11 +179,11 @@ mutation {
|
|
|
167
179
|
}
|
|
168
180
|
```
|
|
169
181
|
|
|
170
|
-
##
|
|
182
|
+
## Passwords
|
|
171
183
|
|
|
172
|
-
### Reset a
|
|
184
|
+
### Reset a password
|
|
173
185
|
|
|
174
|
-
Send
|
|
186
|
+
Send an email to reset the password:
|
|
175
187
|
|
|
176
188
|
```graphql
|
|
177
189
|
mutation {
|
|
@@ -184,7 +196,7 @@ mutation {
|
|
|
184
196
|
}
|
|
185
197
|
```
|
|
186
198
|
|
|
187
|
-
Complete the reset with the token from
|
|
199
|
+
Complete the reset with the token from that email:
|
|
188
200
|
|
|
189
201
|
```graphql
|
|
190
202
|
mutation {
|
|
@@ -201,9 +213,9 @@ mutation {
|
|
|
201
213
|
}
|
|
202
214
|
```
|
|
203
215
|
|
|
204
|
-
###
|
|
216
|
+
### Change a password
|
|
205
217
|
|
|
206
|
-
This mutation
|
|
218
|
+
This mutation needs authentication:
|
|
207
219
|
|
|
208
220
|
```graphql
|
|
209
221
|
mutation {
|
|
@@ -218,9 +230,11 @@ mutation {
|
|
|
218
230
|
|
|
219
231
|
## Multi-factor authentication (MFA)
|
|
220
232
|
|
|
221
|
-
MFA adds a second layer of security
|
|
233
|
+
MFA adds a second layer of security, and it uses a telephone to verify the user. The
|
|
234
|
+
API can add an MFA factor, send a challenge, verify a challenge, and remove a factor.
|
|
235
|
+
Every MFA mutation needs authentication.
|
|
222
236
|
|
|
223
|
-
###
|
|
237
|
+
### Add a factor
|
|
224
238
|
|
|
225
239
|
```graphql
|
|
226
240
|
mutation {
|
|
@@ -238,7 +252,7 @@ mutation {
|
|
|
238
252
|
}
|
|
239
253
|
```
|
|
240
254
|
|
|
241
|
-
A
|
|
255
|
+
A new factor has the status `UNVERIFIED` until a challenge confirms it.
|
|
242
256
|
|
|
243
257
|
### Send a challenge
|
|
244
258
|
|
|
@@ -252,7 +266,7 @@ mutation {
|
|
|
252
266
|
}
|
|
253
267
|
```
|
|
254
268
|
|
|
255
|
-
This sends a verification code to the
|
|
269
|
+
This sends a verification code to the telephone number of the factor.
|
|
256
270
|
|
|
257
271
|
### Verify the challenge
|
|
258
272
|
|
|
@@ -272,9 +286,10 @@ mutation {
|
|
|
272
286
|
}
|
|
273
287
|
```
|
|
274
288
|
|
|
275
|
-
On success, the session
|
|
289
|
+
On success, the session moves to Authenticator Assurance Level `AAL2`. The status of
|
|
290
|
+
the factor changes to `VERIFIED`.
|
|
276
291
|
|
|
277
|
-
###
|
|
292
|
+
### Remove a factor
|
|
278
293
|
|
|
279
294
|
```graphql
|
|
280
295
|
mutation {
|
|
@@ -286,30 +301,34 @@ mutation {
|
|
|
286
301
|
}
|
|
287
302
|
```
|
|
288
303
|
|
|
289
|
-
##
|
|
304
|
+
## Use a session
|
|
290
305
|
|
|
291
|
-
After
|
|
306
|
+
After the caller has a session, it puts the access token in the `Authorization`
|
|
307
|
+
header of every request that needs authentication:
|
|
292
308
|
|
|
293
309
|
```
|
|
294
310
|
Authorization: Bearer <accessToken>
|
|
295
311
|
```
|
|
296
312
|
|
|
297
|
-
The `expiresAt` field
|
|
313
|
+
The `expiresAt` field of the session gives the time at which the access token
|
|
314
|
+
expires. The caller must refresh the session before that time.
|
|
298
315
|
|
|
299
316
|
### Authenticator assurance levels
|
|
300
317
|
|
|
301
|
-
The session
|
|
318
|
+
The session holds an `aal` field, and it gives the strength of the authentication:
|
|
302
319
|
|
|
303
320
|
| Level | Meaning |
|
|
304
321
|
|-------|---------|
|
|
305
|
-
| `AAL1` |
|
|
306
|
-
| `AAL2` |
|
|
322
|
+
| `AAL1` | One factor: an email address and a password, OAuth, or a magic link |
|
|
323
|
+
| `AAL2` | More than one factor: the user completed an MFA challenge |
|
|
307
324
|
|
|
308
|
-
Some operations
|
|
325
|
+
Some operations need `AAL2`. When a caller at `AAL1` tries one of them, the API
|
|
326
|
+
returns an authorization error.
|
|
309
327
|
|
|
310
|
-
##
|
|
328
|
+
## Refresh a session
|
|
311
329
|
|
|
312
|
-
|
|
330
|
+
An access token has a short life. The `sessionRefresh` mutation exchanges a refresh
|
|
331
|
+
token for a new session:
|
|
313
332
|
|
|
314
333
|
```graphql
|
|
315
334
|
mutation {
|
|
@@ -325,11 +344,14 @@ mutation {
|
|
|
325
344
|
}
|
|
326
345
|
```
|
|
327
346
|
|
|
328
|
-
The response
|
|
347
|
+
The response holds a new `accessToken` and a new `refreshToken`. The API invalidates
|
|
348
|
+
the earlier refresh token. This mutation needs no `Authorization` header.
|
|
329
349
|
|
|
330
350
|
## API key authentication
|
|
331
351
|
|
|
332
|
-
API
|
|
352
|
+
An API key gives access to the API for a long time, inside a set of scopes. Most
|
|
353
|
+
callers use an API key for a server-to-server integration or for an automated
|
|
354
|
+
workflow.
|
|
333
355
|
|
|
334
356
|
To authenticate with an API key, include it in the `x-api-key` header:
|
|
335
357
|
|
|
@@ -337,13 +359,16 @@ To authenticate with an API key, include it in the `x-api-key` header:
|
|
|
337
359
|
x-api-key: pk_live_abc123...
|
|
338
360
|
```
|
|
339
361
|
|
|
340
|
-
API
|
|
362
|
+
An API key belongs to an organization, and it can also belong to one project. It
|
|
363
|
+
carries a set of [authorization scopes](./authorization-and-scopes.md), and those
|
|
364
|
+
scopes decide which operations the key can do.
|
|
341
365
|
|
|
342
|
-
See [API Keys](/api-keys) for
|
|
366
|
+
See [API Keys](/api-keys) for how to control a key from the dashboard.
|
|
343
367
|
|
|
344
|
-
###
|
|
368
|
+
### Create an API key
|
|
345
369
|
|
|
346
|
-
The `apiKeyCreate` mutation creates a new API key.
|
|
370
|
+
The `apiKeyCreate` mutation creates a new API key. Only a user with a session can
|
|
371
|
+
call it. Another API key cannot:
|
|
347
372
|
|
|
348
373
|
```graphql
|
|
349
374
|
mutation {
|
|
@@ -358,11 +383,13 @@ mutation {
|
|
|
358
383
|
}
|
|
359
384
|
```
|
|
360
385
|
|
|
361
|
-
The full API key string
|
|
386
|
+
The response holds the full API key string one time only. Keep it in a secure place, because
|
|
387
|
+
you cannot read it again.
|
|
362
388
|
|
|
363
|
-
The
|
|
389
|
+
The scopes that you ask for must all be scopes of the user who creates the key. See
|
|
390
|
+
[Authorization and Scopes](./authorization-and-scopes.md) for more detail.
|
|
364
391
|
|
|
365
|
-
###
|
|
392
|
+
### Revoke an API key
|
|
366
393
|
|
|
367
394
|
```graphql
|
|
368
395
|
mutation {
|
|
@@ -373,4 +400,4 @@ mutation {
|
|
|
373
400
|
}
|
|
374
401
|
```
|
|
375
402
|
|
|
376
|
-
|
|
403
|
+
The API invalidates a revoked key immediately. No later request can use it.
|