@apostlejs/flows 0.0.4 → 0.0.6
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/index.cjs +1 -1
- package/dist/index.d.cts +1 -4
- package/package.json +2 -2
package/dist/index.cjs
CHANGED
@@ -1 +1 @@
|
|
1
|
-
"use strict";var e=require("zod-to-json-schema"),t=require("zod"),n=require("@apostlejs/whatsapp"),o=require("node:util"),a=Object.defineProperty,i={"*":["name","type","on-click-action","on-select-action","on-unselect-action","input-type","markdown","media-size","font-weight","Then","Else","Cases","children","max-file-size-kb"],Footer:["center-caption","left-caption","right-caption"],PhotoPicker:["min-uploaded-photos","max-uploaded-photos","photo-source","required"],Image:["scale-type"],TextArea:["max-length","label-variant"],TextInput:["label-variant"]},r=Object.values(i).flat(),s=t=>{const n=e.zodToJsonSchema(t,{$refStrategy:"none"}),o=(e,t=0)=>{if("object"!=typeof e||null===e)return e;const n=new Set([...r,"additionalProperties","required","enum","$schema"]),a=Object.fromEntries(Object.entries(e).filter((([e])=>!n.has(e))));if(a.properties&&"object"==typeof a.properties){const e={};for(const[n,i]of Object.entries(a.properties))e[n]=o(i,t+1);a.properties=e}a.items&&(a.items=o(a.items,t+1));const i=e.type??"object",s={string:"example",boolean:!0,number:42,integer:1,array:[],object:{}}[i]??null;return 0===t?{type:i,...a,__example__:s}:{type:i,...a}};return o(n)},l={Title:t.z.object({type:t.z.literal("Title"),id:t.z.string(),text:t.z.string()})},c=t.z.enum(["data_exchange","navigate","complete","update_data","open_url"]),p=t.z.object({name:c,payload:t.z.record(t.z.any()).optional(),next:t.z.object({type:t.z.literal("screen"),name:t.z.string()}).optional(),url:t.z.string().optional()}),d=p.extend({name:t.z.union([t.z.literal("update_data"),t.z.literal("data_exchange")])}),u=p.extend({name:t.z.literal("update_data")}),m=t.z.object({visible:t.z.boolean().optional()}),g=t.z.object({type:t.z.literal("Form"),name:t.z.string().optional(),children:t.z.array(t.z.any()).optional(),"error-messages":t.z.record(t.z.any()).optional(),"init-values":t.z.record(t.z.any()).optional()}),z=t.z.object({name:t.z.string(),required:t.z.boolean().optional(),enabled:t.z.boolean().optional(),"error-message":t.z.string().optional(),"init-value":t.z.string().optional()}).merge(m),f=t.z.object({id:t.z.string(),title:t.z.string(),description:t.z.string().optional(),metadata:t.z.string().optional(),enabled:t.z.boolean().optional(),image:t.z.string().optional(),"alt-text":t.z.string().optional(),color:t.z.string().optional(),"on-click-action":p.optional(),"on-select-action":u.optional(),"on-unselect-action":u.optional()}),b=z.merge(t.z.object({label:t.z.string(),description:t.z.string().optional(),"data-source":t.z.array(f),"media-size":t.z.enum(["regular","large"]).optional(),"on-click-action":p.optional(),"on-select-action":d.optional(),"on-unselect-action":d.optional()})),y=z.merge(t.z.object({type:t.z.literal("TextInput"),label:t.z.string(),"label-variant":t.z.enum(["large"]).optional(),"input-type":t.z.enum(["text","number","email","password","passcode","phone"]).optional(),pattern:t.z.string().optional(),"helper-text":t.z.string().optional(),"min-chars":t.z.number().optional(),"max-chars":t.z.number().optional()})),h=z.merge(t.z.object({type:t.z.literal("TextArea"),label:t.z.string(),"label-variant":t.z.enum(["large"]).optional(),"max-length":t.z.number().optional(),"helper-text":t.z.string().optional()})),x=b.merge(t.z.object({type:t.z.literal("CheckboxGroup"),"min-selected-items":t.z.number().optional(),"max-selected-items":t.z.number().optional()})),w=b.merge(t.z.object({type:t.z.literal("RadioButtonsGroup")})),v=z.merge(t.z.object({type:t.z.literal("Dropdown"),label:t.z.string(),"data-source":t.z.array(f),"on-click-action":p.optional(),"on-select-action":d.optional(),"on-unselect-action":d.optional()})),j=z.merge(t.z.object({type:t.z.literal("DatePicker"),label:t.z.string(),"min-date":t.z.string().optional(),"max-date":t.z.string().optional(),"unavailable-dates":t.z.array(t.z.string()).optional(),"helper-text":t.z.string().optional(),"on-select-action":d.optional()})),k=z.merge(t.z.object({type:t.z.literal("CalendarPicker"),title:t.z.string().optional(),description:t.z.string().optional(),label:t.z.string(),"helper-text":t.z.string().optional(),mode:t.z.enum(["single","range"]).default("single").optional(),"min-date":t.z.string().optional(),"max-date":t.z.string().optional(),"unavailable-dates":t.z.array(t.z.string()).optional(),"include-days":t.z.array(t.z.enum(["Mon","Tue","Wed","Thu","Fri","Sat","Sun"])).optional(),"min-days":t.z.number().optional(),"max-days":t.z.number().optional(),"on-select-action":d.optional()})),_=z.merge(t.z.object({type:t.z.literal("ChipsSelector"),label:t.z.string(),description:t.z.string().optional(),"data-source":t.z.array(f),"min-selected-items":t.z.number().optional(),"max-selected-items":t.z.number().optional(),"on-click-action":p.optional(),"on-select-action":d.optional(),"on-unselect-action":d.optional()})),$={Form:g,TextInput:y,TextArea:h,CheckboxGroup:x,RadioButtonsGroup:w,Dropdown:v,DatePicker:j,CalendarPicker:k,OptIn:z.omit({enabled:!0}).merge(t.z.object({type:t.z.literal("OptIn"),label:t.z.string(),"on-click-action":p.optional(),"on-select-action":d.optional(),"on-unselect-action":d.optional()})),NavigationList:t.z.object({type:t.z.literal("NavigationList"),name:t.z.string(),"list-items":t.z.array(t.z.object({id:t.z.string(),"main-content":t.z.object({title:t.z.string(),description:t.z.string().optional(),metadata:t.z.string().optional()}),end:t.z.object({title:t.z.string().optional(),description:t.z.string().optional(),metadata:t.z.string().optional()}).optional(),start:t.z.object({image:t.z.string().optional(),"alt-text":t.z.string().optional()}).optional(),badge:t.z.string().optional(),tags:t.z.array(t.z.string()).optional(),"on-click-action":p.optional()})),label:t.z.string().optional(),description:t.z.string().optional(),"media-size":t.z.enum(["regular","large"]).default("regular").optional(),"on-click-action":p.optional()}),ChipsSelector:_,PhotoPicker:z.merge(t.z.object({type:t.z.literal("PhotoPicker"),label:t.z.string(),description:t.z.string().max(300).optional(),"photo-source":t.z.enum(["camera_gallery","camera","gallery"]).default("camera_gallery").optional(),"max-file-size-kb":t.z.number().int().min(1).max(25600).default(25600).optional(),"min-uploaded-photos":t.z.number().int().min(0).max(30).default(0).optional(),"max-uploaded-photos":t.z.number().int().min(1).max(30).default(30).optional()})),DocumentPicker:z.merge(t.z.object({type:t.z.literal("DocumentPicker"),label:t.z.string(),description:t.z.string().max(300).optional(),"max-file-size-kb":t.z.number().int().min(1).max(25600).default(25600).optional(),"min-uploaded-documents":t.z.number().int().min(0).max(30).default(0).optional(),"max-uploaded-documents":t.z.number().int().min(1).max(30).default(30).optional(),"allowed-mime-types":t.z.array(t.z.enum(["application/gzip","application/msword","application/pdf","application/vnd.ms-excel","application/vnd.ms-powerpoint","application/vnd.oasis.opendocument.presentation","application/vnd.oasis.opendocument.spreadsheet","application/vnd.oasis.opendocument.text","application/vnd.openxmlformats-officedocument.presentationml.presentation","application/vnd.openxmlformats-officedocument.spreadsheetml.sheet","application/vnd.openxmlformats-officedocument.wordprocessingml.document","application/x-7z-compressed","application/zip","image/avif","image/gif","image/heic","image/heif","image/jpeg","image/png","image/tiff","image/webp","text/plain","video/mp4","video/mpeg"])).optional()}))},C={Footer:t.z.object({type:t.z.literal("Footer"),label:t.z.string(),enabled:t.z.boolean().optional(),"left-caption":t.z.string().optional(),"center-caption":t.z.string().optional(),"right-caption":t.z.string().optional(),"on-click-action":p.optional()}),If:t.z.object({type:t.z.literal("If"),condition:t.z.string(),Then:t.z.array(t.z.any()),Else:t.z.array(t.z.any()).optional()}),Switch:t.z.object({type:t.z.literal("Switch"),value:t.z.string(),Cases:t.z.record(t.z.array(t.z.any()))})},S=t.z.object({id:t.z.string(),text:t.z.string()}).merge(m),O=t.z.enum(["bold","italic","bold_italic","normal"]),T={TextHeading:t.z.object({type:t.z.literal("TextHeading")}).merge(S),TextSubheading:t.z.object({type:t.z.literal("TextSubheading"),text:t.z.string()}).merge(S),TextBody:t.z.object({type:t.z.literal("TextBody"),"font-weight":O.optional(),strikethrough:t.z.boolean().optional(),markdown:t.z.boolean().optional()}).merge(S),TextCaption:t.z.object({type:t.z.literal("TextCaption"),"font-weight":O.optional(),strikethrough:t.z.boolean().optional(),markdown:t.z.boolean().optional()}).merge(S),RichText:t.z.object({type:t.z.literal("RichText"),id:t.z.string().optional()}).merge(S),EmbeddedLink:t.z.object({type:t.z.literal("EmbeddedLink"),text:t.z.string(),"on-click-action":p.optional()}).merge(S),Image:t.z.object({type:t.z.literal("Image"),id:t.z.string(),src:t.z.string(),width:t.z.number().optional(),height:t.z.number().optional(),"scale-type":t.z.enum(["cover","contain"]).default("contain").optional(),"aspect-ratio":t.z.number().default(1).optional(),"alt-text":t.z.string().optional()}),ImageCarousel:t.z.object({type:t.z.literal("ImageCarousel"),images:t.z.array(t.z.object({src:t.z.string(),"alt-text":t.z.string()})),"scale-type":t.z.enum(["cover","contain"]).default("contain").optional(),"aspect-ratio":t.z.enum(["4:3","16:9"]).optional()})},E={...$,...C,...T,...l},I=Object.entries(E).reduce(((e,[t,n])=>(e[t]=s(n),e)),{});function F(e,t){const n={};for(const{identifier:e,type:o}of t){const t=I[o];n[e]=t?.properties?{...t,properties:Object.fromEntries(Object.entries(t.properties).map((([e,t])=>[e.replaceAll("-","_"),t])))}:t}if(e){const t=s(e).properties,o=Object.entries(t).reduce(((e,[t,n])=>{e[t]=n;const o=n=>{e[t].__example__=n};switch(e[t].type){case"number":o(0);break;case"string":default:o("");break;case"array":o([]);break;case"boolean":o(!0);break;case"object":o({})}return e}),{});Object.assign(n,o)}return n}function P(e,t){t in e&&delete e[t]}var D=["If","Switch"],N=["children","Then","Else","Cases"],q=(e,t)=>{const n=[],o=e=>{if(D.includes(e.type))return void a(e);const o=(e=>{const t=Object.keys($).includes(e.type)?"name":"id";let n="";const o="id"in e?"id":"name"in e?"name":void 0;return o||(n=e.type.toLowerCase()),o&&(n=e[o]),{value:n,key:t}})(e);if(o){Object.assign(e,{[o.key]:o.value});const{properties:t}=I[e.type];for(const n of Object.keys(t)){const t=n,a=e.type;if(i["*"].includes(t))continue;if(i[a]?.includes(t))continue;if(Object.keys(e).includes(n))continue;const r=n.replace(/-/g,"_");Object.assign(e,{[n]:`\${data.${o.value}.${r}}`})}n.push({identifier:o.value,type:e.type})}P(e,"id"),"form"===t&&(P(e,"error-message"),P(e,"init-value")),a(e)},a=e=>{for(const t of N)if(Array.isArray(e[t]))for(const n of e[t])o(n)};for(const t of e)o(t);return{parsedComponents:e,metadata:n}};function R(e){const{screens:t,...n}=e,o=[];for(const[e,n]of Object.entries(t)){const{type:t,components:a,...i}=n;let r=a;"form"===t&&(r=[{type:"Form",children:r}]);const{parsedComponents:s,metadata:l}=q(r,t),c=F(i.data,l);o.push({title:"${data.title.text}",...i,id:e,data:c,layout:{type:"SingleColumnLayout",children:s}})}return{...n,screens:o}}function A(e){const{metadata:t,preview:n,id:o,...a}=e;return JSON.parse((e=>{let t=e;return t=(e=>e.replace(/^\s*"type":\s*"string",?\n(?=\s*"const":\s*"update_data")/gm,""))(t),t=(e=>e.replaceAll(/"(Then|Else|Cases)":/g,((e,t)=>`"${t.toLowerCase()}":`)))(t),t})(JSON.stringify(a,null,2)))}var L={};function J(e){return e}function M(e,t,n,o){return"screen"===e&&t&&n&&o?`\${${e}.${t}.${n}.${o}}`:`\${${e}.${t}}`}((e,t)=>{for(var n in t)a(e,n,{get:t[n],enumerable:!0})})(L,{complete:()=>U,components:()=>Y,condition:()=>X,dynamic_action:()=>B,dynamic_navigate:()=>H,dynamic_refresh:()=>Z,form_payload:()=>W,inline:()=>K,navigate:()=>G,parseUniqueId:()=>te,screen:()=>J,state:()=>M,txt:()=>Q,uniqueId:()=>ee,zod_payload:()=>V});var B={name:"data_exchange",payload:{}},G=(e,t={})=>({name:"navigate",next:{type:"screen",name:e},payload:t});function U(e={}){return{name:"complete",payload:e}}function H(e,t={}){return{name:"data_exchange",payload:{navigate:{screen:e,data:t}}}}var W=(...e)=>e.reduce(((e,t)=>(e[t]=`\${form.${t}}`,e)),{}),V=e=>Object.keys(e.shape).reduce(((e,t)=>(e[t]=`\${form.${t}}`,e)),{});function K(e){return"`"+e+"`"}function Q(...e){return e.join("\n")}function X(e){return K(e)}function Y(e){return e}function Z(e={}){return{name:"data_exchange",payload:{refresh:e}}}var ee=e=>e+"?deduplicate="+Date.now(),te=e=>{const t=e.split("?deduplicate=");return t.length>1?t[0]:e};function ne(e){const t=(e,t)=>({navigate:{data:t??{},screen:e.toLowerCase()}}),n=t=>({data:t,screen:e.screen});return{...e,init:e=>n(e),navigate:t,first:e=>t(e),refresh:e=>n(e),error:e=>n({form:{error_messages:e}}),success:e=>({data:e??{},screen:"success"})}}function oe(e,t){const o=n.createWhatsapp();return"navigate"in e&&(e={data:e.navigate.data??{},screen:e.navigate.screen.toUpperCase()}),"screen"in e&&(e={data:e.data??{},screen:e.screen.toUpperCase()}),o.sdk.parsers.toGraph.flowResponse(t,e)}var ae=t.z.array(t.z.object({media_id:t.z.string(),cdn_url:t.z.string(),file_name:t.z.string(),encryption_metadata:t.z.object({encrypted_hash:t.z.string(),iv:t.z.string(),encryption_key:t.z.string(),hmac_key:t.z.string(),plaintext_hash:t.z.string()})}));exports.buildApiResponse=oe,exports.complete=U,exports.componentData=function(e){return Object.entries(e).reduce(((e,[t,n])=>(e[t.replaceAll("-","_")]=n,e)),{})},exports.components=Y,exports.condition=X,exports.createDevFlowJson=R,exports.createFlowContext=ne,exports.createFlowControllerPool=function(e){return e.reduce(((e,t)=>(Object.assign(e,{[t.name]:t.screenHandlers}),e)),{})},exports.createNativeFlowJson=A,exports.createStoreFactory=function(e){return function(t,n={}){return{adapterFactory:e,schema:t,defaultValue:n}}},exports.deployFlows=async function(e,t){const a=n.createWhatsapp(),{data:i}=await a.sdk.actions.flows.getMany(),r=new Map(t.map((e=>[e.metadata.name,e]))),s=new Map(e.map((e=>[e.metadata.name,e]))),l=[],c=[];for(const[e,t]of r.entries()){const n=i.find((t=>t.name===e));if(!n){l.push(R(t));continue}const a=s.get(e);if(!a){c.push({id:n.id,flow:R(t)});continue}const{preview:r,metadata:p,...d}=a,{preview:u,metadata:m,...g}=t;o.isDeepStrictEqual(r,u)&&o.isDeepStrictEqual(d,g)?console.log(`Skipping '${e}', no changes`):c.push({id:n.id,flow:R(t)})}for(const e of l){const{id:t,metadata:n,preview:o,...i}=e,{name:r}=n;console.log(`Creating and publishing flow '${r}'`);try{await a.sdk.actions.flows.create({name:n.name,categories:n.categories,endpoint_uri:n.endpoint_uri,flow_json:JSON.stringify(i),publish:!0}),console.log(`\t✔ - Successfully created and published flow '${r}'`)}catch(e){throw console.error(`✖ - Error during creation/publishing of flow '${r}':`,e),new Error(`Deployment halted at flow '${r}'`)}}for(const{id:e,flow:t}of c){const n=t.metadata.name;console.log(`Updating and publishing flow '${n}' (id: ${e})`);try{const o=await a.sdk.actions.flows.updateJson(e,A(t));if(o.validation_errors.length)throw console.error(`✖ - Error during JSON update of flow '${n}':`,o.validation_errors),new Error(`Deployment halted at flow '${n}'`);console.log("\t✔ - Successfully updated JSON"),await new Promise((e=>setTimeout(e,1e3))),await a.sdk.actions.flows.updateMetadata(e,t.metadata),console.log("\t✔ - Successfully updated metadata"),await a.sdk.actions.flows.publish(e),console.log("\t✔ - Successfully published")}catch(e){throw console.error(`✖ - Failed during update/publish of flow '${n}':`,e),new Error(`Deployment halted at flow '${n}'`)}}return[...c,...l]},exports.dispatchFlowPayload=async function(e,t){const o=((a=function(e){const t=n.createWhatsapp(),{screen:o,action:a,data:i,flow_token:r}=e,{flowName:s,flowIdentifier:l,flowParameters:c,chatId:p}=t.sdk.utils.flows.destructureFlowToken(r),d={action:"first",name:s,context:{chatId:p,screen:o,flow:s,identifier:l,parameters:c},data:i,screen:o};return"data_exchange"===a&&(d.action="submit",i.navigate&&(d.action="init",d.screen=i.navigate.screen,d.data=i.navigate.data),i.refresh&&(d.action="refresh",d.data=i.refresh)),"BACK"===a&&(d.action="back"),d}(t)).screen&&(a.screen=a.screen.toLowerCase()),a.context.screen&&(a.context.screen=a.context.screen.toLowerCase()),a);var a;let i={};if(i=o.screen?e?.[o.name]?.[o.screen]?.[o.action]:e?.[o.name]?.[o.action],!i)throw new Error(`No controller for action '${o.action}' in flow '${o.name}' for screen '${o.screen}'`);let r=await i({ctx:o.context,input:o.data,variables:o.data});if(!r)throw new Error(`No controller response for action '${o.action}' in flow '${o.name}' for screen '${o.screen}'`);if("navigate"in r){const t=r.navigate.screen,n=e[o.name][t];if(!n)throw new Error(`No screen controller for screen '${t}' in flow '${o.name}'`);const a=n.init;o.context.screen=t,r=await a({ctx:o.context,input:r.navigate.data})}return oe(r,t.flow_token)},exports.dynamic_action=B,exports.dynamic_navigate=H,exports.dynamic_refresh=Z,exports.f=L,exports.firstScreen=({define:e,store:t,middleware:n})=>async({ctx:o})=>{const a=ne(o),i=t?.adapterFactory({flow_identifier:o.identifier,chat_id:o.chatId});let r={};if(i&&t){let e=await i.stash();0===Object.keys(e).length&&(e=t.defaultValue),r=new Proxy(e,{get:Reflect.get,set:Reflect.set})}const s={...a,store:r},l=n?await n(s):s;return e(l)},exports.flow=e=>e,exports.flowController=function(e,t){return{screenHandlers:t,name:e.name}},exports.flowMediaInput=ae,exports.form_payload=W,exports.getFlowMetadata=function(e){return{name:e.metadata.name,_typings_routing:null}},exports.getScreenMetadata=e=>null,exports.inline=K,exports.navigate=G,exports.parseUniqueId=te,exports.screen=J,exports.screenController=function(e,t){const n=e=>async({ctx:n,input:o,variables:a})=>{const i=ne(n);let r={};const s=t.store?.adapterFactory({flow_identifier:n.identifier,chat_id:n.chatId});if(t.store&&s){let e=await s.stash();0===Object.keys(e).length&&(e=t.store.defaultValue),r=new Proxy(e,{get:Reflect.get,set:Reflect.set})}const l={...i,store:r},c=t.middleware?await t.middleware(l):l;let p;if("init"===e){const e=t.actions?.init;if(!e)throw new Error(`No init handler for screen '${n.screen}' in flow '${n.flow}'`);const a=await e({ctx:c,data:o});p=c.init(a)}if("back"===e){const e=t.actions.back;if(!e)throw new Error(`No back handler for screen '${n.screen}' in flow '${n.flow}'`);p=await e({ctx:c})}if("refresh"===e){const e=t.actions.refresh;if(!e)throw new Error("Refresh handler is not defined");p=await e({ctx:c,variables:a})}if("submit"===e){const e=t.actions.submit;if(!e)throw new Error("Form submit handler is not defined");if(!t.input)throw new Error("Screen input schema is not defined");const n=t.input.safeParse(o);if(n.error){const e=n.error.errors.reduce(((e,t)=>(t.path?.[0]&&(e[t.path[0]]=t.message),e)),{});p=c.error(e)}else p=await e({ctx:c,input:n.data})}return s&&await s.flush(r),p};return{init:n("init"),refresh:n("refresh"),submit:n("submit"),back:n("back")}},exports.state=M,exports.txt=Q,exports.uniqueId=ee,exports.zod_payload=V;
|
1
|
+
"use strict";var e=require("zod-to-json-schema"),t=require("zod"),n=require("@apostlejs/whatsapp"),o=require("node:util"),a=Object.defineProperty,i={"*":["name","type","on-click-action","on-select-action","on-unselect-action","input-type","markdown","media-size","font-weight","Then","Else","Cases","children","max-file-size-kb"],Footer:["center-caption","left-caption","right-caption"],PhotoPicker:["min-uploaded-photos","max-uploaded-photos","photo-source","required"],Image:["scale-type"],TextArea:["max-length","label-variant"],TextInput:["label-variant"]},r=Object.values(i).flat(),s=t=>{const n=e.zodToJsonSchema(t,{$refStrategy:"none"}),o=(e,t=0)=>{if("object"!=typeof e||null===e)return e;const n=new Set([...r,"additionalProperties","required","enum","$schema"]),a=Object.fromEntries(Object.entries(e).filter((([e])=>!n.has(e))));if(a.properties&&"object"==typeof a.properties){const e={};for(const[n,i]of Object.entries(a.properties))e[n]=o(i,t+1);a.properties=e}a.items&&(a.items=o(a.items,t+1));const i=e.type??"object",s={string:"example",boolean:!0,number:42,integer:1,array:[],object:{}}[i]??null;return 0===t?{type:i,...a,__example__:s}:{type:i,...a}};return o(n)},l={Title:t.z.object({type:t.z.literal("Title"),id:t.z.string(),text:t.z.string()})},c=t.z.enum(["data_exchange","navigate","complete","update_data","open_url"]),p=t.z.object({name:c,payload:t.z.record(t.z.any()).optional(),next:t.z.object({type:t.z.literal("screen"),name:t.z.string()}).optional(),url:t.z.string().optional()}),d=p.extend({name:t.z.union([t.z.literal("update_data"),t.z.literal("data_exchange")])}),m=p.extend({name:t.z.literal("update_data")}),u=t.z.object({visible:t.z.boolean().optional()}),g=t.z.object({type:t.z.literal("Form"),name:t.z.string().optional(),children:t.z.array(t.z.any()).optional(),"error-messages":t.z.record(t.z.any()).optional(),"init-values":t.z.record(t.z.any()).optional()}),z=t.z.object({name:t.z.string(),required:t.z.boolean().optional(),enabled:t.z.boolean().optional(),"error-message":t.z.string().optional(),"init-value":t.z.string().optional()}).merge(u),f=t.z.object({id:t.z.string(),title:t.z.string(),description:t.z.string().optional(),metadata:t.z.string().optional(),enabled:t.z.boolean().optional(),image:t.z.string().optional(),"alt-text":t.z.string().optional(),color:t.z.string().optional(),"on-click-action":p.optional(),"on-select-action":m.optional(),"on-unselect-action":m.optional()}),b=z.merge(t.z.object({label:t.z.string(),description:t.z.string().optional(),"data-source":t.z.array(f),"media-size":t.z.enum(["regular","large"]).optional(),"on-click-action":p.optional(),"on-select-action":d.optional(),"on-unselect-action":d.optional()})),h=z.merge(t.z.object({type:t.z.literal("TextInput"),label:t.z.string(),"label-variant":t.z.enum(["large"]).optional(),"input-type":t.z.enum(["text","number","email","password","passcode","phone"]).optional(),pattern:t.z.string().optional(),"helper-text":t.z.string().optional(),"min-chars":t.z.number().optional(),"max-chars":t.z.number().optional()})),y=z.merge(t.z.object({type:t.z.literal("TextArea"),label:t.z.string(),"label-variant":t.z.enum(["large"]).optional(),"max-length":t.z.number().optional(),"helper-text":t.z.string().optional()})),x=b.merge(t.z.object({type:t.z.literal("CheckboxGroup"),"min-selected-items":t.z.number().optional(),"max-selected-items":t.z.number().optional()})),w=b.merge(t.z.object({type:t.z.literal("RadioButtonsGroup")})),v=z.merge(t.z.object({type:t.z.literal("Dropdown"),label:t.z.string(),"data-source":t.z.array(f),"on-click-action":p.optional(),"on-select-action":d.optional(),"on-unselect-action":d.optional()})),j=z.merge(t.z.object({type:t.z.literal("DatePicker"),label:t.z.string(),"min-date":t.z.string().optional(),"max-date":t.z.string().optional(),"unavailable-dates":t.z.array(t.z.string()).optional(),"helper-text":t.z.string().optional(),"on-select-action":d.optional()})),k=z.merge(t.z.object({type:t.z.literal("CalendarPicker"),title:t.z.string().optional(),description:t.z.string().optional(),label:t.z.string(),"helper-text":t.z.string().optional(),mode:t.z.enum(["single","range"]).default("single").optional(),"min-date":t.z.string().optional(),"max-date":t.z.string().optional(),"unavailable-dates":t.z.array(t.z.string()).optional(),"include-days":t.z.array(t.z.enum(["Mon","Tue","Wed","Thu","Fri","Sat","Sun"])).optional(),"min-days":t.z.number().optional(),"max-days":t.z.number().optional(),"on-select-action":d.optional()})),_=z.merge(t.z.object({type:t.z.literal("ChipsSelector"),label:t.z.string(),description:t.z.string().optional(),"data-source":t.z.array(f),"min-selected-items":t.z.number().optional(),"max-selected-items":t.z.number().optional(),"on-click-action":p.optional(),"on-select-action":d.optional(),"on-unselect-action":d.optional()})),$={Form:g,TextInput:h,TextArea:y,CheckboxGroup:x,RadioButtonsGroup:w,Dropdown:v,DatePicker:j,CalendarPicker:k,OptIn:z.omit({enabled:!0}).merge(t.z.object({type:t.z.literal("OptIn"),label:t.z.string(),"on-click-action":p.optional(),"on-select-action":d.optional(),"on-unselect-action":d.optional()})),NavigationList:t.z.object({type:t.z.literal("NavigationList"),name:t.z.string(),"list-items":t.z.array(t.z.object({id:t.z.string(),"main-content":t.z.object({title:t.z.string(),description:t.z.string().optional(),metadata:t.z.string().optional()}),end:t.z.object({title:t.z.string().optional(),description:t.z.string().optional(),metadata:t.z.string().optional()}).optional(),start:t.z.object({image:t.z.string().optional(),"alt-text":t.z.string().optional()}).optional(),badge:t.z.string().optional(),tags:t.z.array(t.z.string()).optional(),"on-click-action":p.optional()})),label:t.z.string().optional(),description:t.z.string().optional(),"media-size":t.z.enum(["regular","large"]).default("regular").optional(),"on-click-action":p.optional()}),ChipsSelector:_,PhotoPicker:z.merge(t.z.object({type:t.z.literal("PhotoPicker"),label:t.z.string(),description:t.z.string().max(300).optional(),"photo-source":t.z.enum(["camera_gallery","camera","gallery"]).default("camera_gallery").optional(),"max-file-size-kb":t.z.number().int().min(1).max(25600).default(25600).optional(),"min-uploaded-photos":t.z.number().int().min(0).max(30).default(0).optional(),"max-uploaded-photos":t.z.number().int().min(1).max(30).default(30).optional()})),DocumentPicker:z.merge(t.z.object({type:t.z.literal("DocumentPicker"),label:t.z.string(),description:t.z.string().max(300).optional(),"max-file-size-kb":t.z.number().int().min(1).max(25600).default(25600).optional(),"min-uploaded-documents":t.z.number().int().min(0).max(30).default(0).optional(),"max-uploaded-documents":t.z.number().int().min(1).max(30).default(30).optional(),"allowed-mime-types":t.z.array(t.z.enum(["application/gzip","application/msword","application/pdf","application/vnd.ms-excel","application/vnd.ms-powerpoint","application/vnd.oasis.opendocument.presentation","application/vnd.oasis.opendocument.spreadsheet","application/vnd.oasis.opendocument.text","application/vnd.openxmlformats-officedocument.presentationml.presentation","application/vnd.openxmlformats-officedocument.spreadsheetml.sheet","application/vnd.openxmlformats-officedocument.wordprocessingml.document","application/x-7z-compressed","application/zip","image/avif","image/gif","image/heic","image/heif","image/jpeg","image/png","image/tiff","image/webp","text/plain","video/mp4","video/mpeg"])).optional()}))},C={Footer:t.z.object({type:t.z.literal("Footer"),label:t.z.string(),enabled:t.z.boolean().optional(),"left-caption":t.z.string().optional(),"center-caption":t.z.string().optional(),"right-caption":t.z.string().optional(),"on-click-action":p.optional()}),If:t.z.object({type:t.z.literal("If"),condition:t.z.string(),Then:t.z.array(t.z.any()),Else:t.z.array(t.z.any()).optional()}),Switch:t.z.object({type:t.z.literal("Switch"),value:t.z.string(),Cases:t.z.record(t.z.array(t.z.any()))})},O=t.z.object({id:t.z.string(),text:t.z.string()}).merge(u),T=t.z.enum(["bold","italic","bold_italic","normal"]),I={TextHeading:t.z.object({type:t.z.literal("TextHeading")}).merge(O),TextSubheading:t.z.object({type:t.z.literal("TextSubheading"),text:t.z.string()}).merge(O),TextBody:t.z.object({type:t.z.literal("TextBody"),"font-weight":T.optional(),strikethrough:t.z.boolean().optional(),markdown:t.z.boolean().optional()}).merge(O),TextCaption:t.z.object({type:t.z.literal("TextCaption"),"font-weight":T.optional(),strikethrough:t.z.boolean().optional(),markdown:t.z.boolean().optional()}).merge(O),RichText:t.z.object({type:t.z.literal("RichText"),id:t.z.string().optional()}).merge(O),EmbeddedLink:t.z.object({type:t.z.literal("EmbeddedLink"),text:t.z.string(),"on-click-action":p.optional()}).merge(O),Image:t.z.object({type:t.z.literal("Image"),id:t.z.string(),src:t.z.string(),width:t.z.number().optional(),height:t.z.number().optional(),"scale-type":t.z.enum(["cover","contain"]).default("contain").optional(),"aspect-ratio":t.z.number().default(1).optional(),"alt-text":t.z.string().optional()}),ImageCarousel:t.z.object({type:t.z.literal("ImageCarousel"),images:t.z.array(t.z.object({src:t.z.string(),"alt-text":t.z.string()})),"scale-type":t.z.enum(["cover","contain"]).default("contain").optional(),"aspect-ratio":t.z.enum(["4:3","16:9"]).optional()})},S={...$,...C,...I,...l},F=Object.entries(S).reduce(((e,[t,n])=>(e[t]=s(n),e)),{});function P(e,t){const n={};for(const{identifier:e,type:o}of t){const t=F[o];n[e]=t?.properties?{...t,properties:Object.fromEntries(Object.entries(t.properties).map((([e,t])=>[e.replaceAll("-","_"),t])))}:t}if(e){const t=s(e).properties,o=Object.entries(t).reduce(((e,[t,n])=>{e[t]=n;const o=n=>{e[t].__example__=n};switch(e[t].type){case"number":o(0);break;case"string":default:o("");break;case"array":o([]);break;case"boolean":o(!0);break;case"object":o({})}return e}),{});Object.assign(n,o)}return n}function E(e,t){t in e&&delete e[t]}var D=["If","Switch"],N=["children","Then","Else","Cases"],q=(e,t)=>{const n=[],o=e=>{if(D.includes(e.type))return void a(e);const o=(e=>{const t=Object.keys($).includes(e.type)?"name":"id";let n="";const o="id"in e?"id":"name"in e?"name":void 0;return o||(n=e.type.toLowerCase()),o&&(n=e[o]),{value:n,key:t}})(e);if(o){Object.assign(e,{[o.key]:o.value});const{properties:t}=F[e.type];for(const n of Object.keys(t)){const t=n,a=e.type;if(i["*"].includes(t))continue;if(i[a]?.includes(t))continue;if(Object.keys(e).includes(n))continue;const r=n.replace(/-/g,"_");Object.assign(e,{[n]:`\${data.${o.value}.${r}}`})}n.push({identifier:o.value,type:e.type})}E(e,"id"),"form"===t&&(E(e,"error-message"),E(e,"init-value")),a(e)},a=e=>{for(const t of N)if(Array.isArray(e[t]))for(const n of e[t])o(n)};for(const t of e)o(t);return{parsedComponents:e,metadata:n}};function R(e){const{screens:t,...n}=e,o=[];for(const[e,n]of Object.entries(t)){const{type:t,components:a,...i}=n;let r=a;"form"===t&&(r=[{type:"Form",children:r}]);const{parsedComponents:s,metadata:l}=q(r,t),c=P(i.data,l);o.push({title:"${data.title.text}",...i,id:e,data:c,layout:{type:"SingleColumnLayout",children:s}})}return{...n,screens:o}}function A(e){const{metadata:t,preview:n,id:o,...a}=e;return JSON.parse((e=>{let t=e;return t=(e=>e.replace(/^\s*"type":\s*"string",?\n(?=\s*"const":\s*"update_data")/gm,""))(t),t=(e=>e.replaceAll(/"(Then|Else|Cases)":/g,((e,t)=>`"${t.toLowerCase()}":`)))(t),t})(JSON.stringify(a,null,2)))}var L={};function J(e){return e}function M(e,t,n,o){return"screen"===e&&t&&n&&o?`\${${e}.${t}.${n}.${o}}`:`\${${e}.${t}}`}((e,t)=>{for(var n in t)a(e,n,{get:t[n],enumerable:!0})})(L,{complete:()=>U,components:()=>Y,condition:()=>X,dynamic_action:()=>B,dynamic_navigate:()=>H,dynamic_refresh:()=>Z,form_payload:()=>W,inline:()=>K,navigate:()=>G,parseUniqueId:()=>te,screen:()=>J,state:()=>M,txt:()=>Q,uniqueId:()=>ee,zod_payload:()=>V});var B={name:"data_exchange",payload:{}},G=(e,t={})=>({name:"navigate",next:{type:"screen",name:e},payload:t});function U(e={}){return{name:"complete",payload:e}}function H(e,t={}){return{name:"data_exchange",payload:{navigate:{screen:e,data:t}}}}var W=(...e)=>e.reduce(((e,t)=>(e[t]=`\${form.${t}}`,e)),{}),V=e=>Object.keys(e.shape).reduce(((e,t)=>(e[t]=`\${form.${t}}`,e)),{});function K(e){return"`"+e+"`"}function Q(...e){return e.join("\n")}function X(e){return K(e)}function Y(e){return e}function Z(e={}){return{name:"data_exchange",payload:{refresh:e}}}var ee=e=>e+"?deduplicate="+Date.now(),te=e=>{const t=e.split("?deduplicate=");return t.length>1?t[0]:e};function ne(e){const t=(e,t)=>({navigate:{data:t??{},screen:e.toLowerCase()}}),n=t=>({data:t,screen:e.screen});return{...e,init:e=>n(e),navigate:t,first:e=>t(e),refresh:e=>n(e),error:e=>n({form:{error_messages:e}}),success:e=>({data:e??{},screen:"success"})}}function oe(e,t){const o=n.createWhatsapp();return"navigate"in e&&(e={data:e.navigate.data??{},screen:e.navigate.screen.toUpperCase()}),"screen"in e&&(e={data:e.data??{},screen:e.screen.toUpperCase()}),o.sdk.parsers.toGraph.flowResponse(t,e)}var ae=t.z.array(t.z.object({media_id:t.z.string(),cdn_url:t.z.string(),file_name:t.z.string(),encryption_metadata:t.z.object({encrypted_hash:t.z.string(),iv:t.z.string(),encryption_key:t.z.string(),hmac_key:t.z.string(),plaintext_hash:t.z.string()})}));exports.buildApiResponse=oe,exports.complete=U,exports.componentData=function(e){return Object.entries(e).reduce(((e,[t,n])=>(e[t.replaceAll("-","_")]=n,e)),{})},exports.components=Y,exports.condition=X,exports.createDevFlowJson=R,exports.createFlowContext=ne,exports.createFlowControllerPool=function(e){return e.reduce(((e,t)=>(Object.assign(e,{[t.name]:t.screenHandlers}),e)),{})},exports.createNativeFlowJson=A,exports.createStoreFactory=function(e){return function(t,n={}){return{adapterFactory:e,schema:t,defaultValue:n}}},exports.deployFlows=async function(e,t){const a=n.createWhatsapp(),{data:i}=await a.sdk.actions.flows.getMany(),r=new Map(t.map((e=>[e.metadata.name,R(e)]))),s=new Map(e.map((e=>[e.metadata.name,R(e)]))),l=[],c=[];for(const[e,t]of r.entries()){const n=i.find((t=>t.name===e)),a=s.get(e);if(!n){console.log(`➤ Flow '${e}' marked for creation`),l.push(t);continue}if(!a){console.log(`➤ Flow '${e}' not found in old list, marked for update`),c.push({id:n.id,flow:t});continue}const{preview:r,metadata:p,...d}=a,{preview:m,metadata:u,...g}=t;o.isDeepStrictEqual(r,m)&&o.isDeepStrictEqual(d,g)?console.log(`✔ Skipping '${e}', no changes`):(console.log(`➤ Changes detected in flow '${e}', marked for update`),c.push({id:n.id,flow:t}))}const p=[];for(const e of l){const{name:t,endpoint_uri:n,categories:o}=e.metadata,i=A(e);console.log(`➤ Creating and publishing flow '${t}'`);try{await a.sdk.actions.flows.create({name:t,categories:o,endpoint_uri:n,flow_json:i,publish:!0}),console.log(`\t✔ Created and published '${t}'`),p.push(i)}catch(e){throw console.error(`✖ Failed to create/publish '${t}':`,e),new Error(`Deployment failed during creation of '${t}'`)}}for(const{id:e,flow:t}of c){const{name:n}=t.metadata,o=A(t);console.log(`➤ Updating and publishing flow '${n}' (ID: ${e})`);try{const i=await a.sdk.actions.flows.updateJson(e,o);if(i.validation_errors.length>0)throw console.error(`✖ JSON validation errors for '${n}':`,i.validation_errors),new Error(`Deployment failed: Invalid JSON for '${n}'`);console.log(`\t✔ JSON updated for '${n}'`),await new Promise((e=>setTimeout(e,1e3))),await a.sdk.actions.flows.updateMetadata(e,t.metadata),console.log(`\t✔ Metadata updated for '${n}'`),await a.sdk.actions.flows.publish(e),console.log(`\t✔ Published '${n}'`),p.push(o)}catch(t){throw console.error(`✖ Failed to update/publish '${n}' (ID: ${e}):`,t),new Error(`Deployment failed during update of '${n}'`)}}return p},exports.dispatchFlowPayload=async function(e,t){const o=((a=function(e){const t=n.createWhatsapp(),{screen:o,action:a,data:i,flow_token:r}=e,{flowName:s,flowIdentifier:l,flowParameters:c,chatId:p}=t.sdk.utils.flows.destructureFlowToken(r),d={action:"first",name:s,context:{chatId:p,screen:o,flow:s,identifier:l,parameters:c},data:i,screen:o};return"data_exchange"===a&&(d.action="submit",i.navigate&&(d.action="init",d.screen=i.navigate.screen,d.data=i.navigate.data),i.refresh&&(d.action="refresh",d.data=i.refresh)),"BACK"===a&&(d.action="back"),d}(t)).screen&&(a.screen=a.screen.toLowerCase()),a.context.screen&&(a.context.screen=a.context.screen.toLowerCase()),a);var a;let i={};if(i=o.screen?e?.[o.name]?.[o.screen]?.[o.action]:e?.[o.name]?.[o.action],!i)throw new Error(`No controller for action '${o.action}' in flow '${o.name}' for screen '${o.screen}'`);let r=await i({ctx:o.context,input:o.data,variables:o.data});if(!r)throw new Error(`No controller response for action '${o.action}' in flow '${o.name}' for screen '${o.screen}'`);if("navigate"in r){const t=r.navigate.screen,n=e[o.name][t];if(!n)throw new Error(`No screen controller for screen '${t}' in flow '${o.name}'`);const a=n.init;o.context.screen=t,r=await a({ctx:o.context,input:r.navigate.data})}return oe(r,t.flow_token)},exports.dynamic_action=B,exports.dynamic_navigate=H,exports.dynamic_refresh=Z,exports.f=L,exports.firstScreen=({define:e,store:t,middleware:n})=>async({ctx:o})=>{const a=ne(o),i=t?.adapterFactory({flow_identifier:o.identifier,chat_id:o.chatId});let r={};if(i&&t){let e=await i.stash();0===Object.keys(e).length&&(e=t.defaultValue),r=new Proxy(e,{get:Reflect.get,set:Reflect.set})}const s={...a,store:r},l=n?await n(s):s;return e(l)},exports.flow=e=>e,exports.flowController=function(e,t){return{screenHandlers:t,name:e.name}},exports.flowMediaInput=ae,exports.form_payload=W,exports.getFlowMetadata=function(e){return{name:e.metadata.name,_typings_routing:null}},exports.getScreenMetadata=e=>null,exports.inline=K,exports.navigate=G,exports.parseUniqueId=te,exports.screen=J,exports.screenController=function(e,t){const n=e=>async({ctx:n,input:o,variables:a})=>{const i=ne(n);let r={};const s=t.store?.adapterFactory({flow_identifier:n.identifier,chat_id:n.chatId});if(t.store&&s){let e=await s.stash();0===Object.keys(e).length&&(e=t.store.defaultValue),r=new Proxy(e,{get:Reflect.get,set:Reflect.set})}const l={...i,store:r},c=t.middleware?await t.middleware(l):l;let p;if("init"===e){const e=t.actions?.init;if(!e)throw new Error(`No init handler for screen '${n.screen}' in flow '${n.flow}'`);const a=await e({ctx:c,data:o});p=c.init(a)}if("back"===e){const e=t.actions.back;if(!e)throw new Error(`No back handler for screen '${n.screen}' in flow '${n.flow}'`);p=await e({ctx:c})}if("refresh"===e){const e=t.actions.refresh;if(!e)throw new Error("Refresh handler is not defined");p=await e({ctx:c,variables:a})}if("submit"===e){const e=t.actions.submit;if(!e)throw new Error("Form submit handler is not defined");if(!t.input)throw new Error("Screen input schema is not defined");const n=t.input.safeParse(o);if(n.error){const e=n.error.errors.reduce(((e,t)=>(t.path?.[0]&&(e[t.path[0]]=t.message),e)),{});p=c.error(e)}else p=await e({ctx:c,input:n.data})}return s&&await s.flush(r),p};return{init:n("init"),refresh:n("refresh"),submit:n("submit"),back:n("back")}},exports.state=M,exports.txt=Q,exports.uniqueId=ee,exports.zod_payload=V;
|
package/dist/index.d.cts
CHANGED
@@ -3283,9 +3283,6 @@ declare const flowMediaInput: z.ZodArray<z.ZodObject<{
|
|
3283
3283
|
}>, "many">;
|
3284
3284
|
type FlowMediaInput = z.infer<typeof flowMediaInput>;
|
3285
3285
|
|
3286
|
-
declare function deployFlows(oldFlows: TypedFlowJson[], newFlows: TypedFlowJson[]): Promise<
|
3287
|
-
id: string;
|
3288
|
-
flow: DevFlowJson;
|
3289
|
-
})[]>;
|
3286
|
+
declare function deployFlows(oldFlows: TypedFlowJson[], newFlows: TypedFlowJson[]): Promise<NativeFlowJSON[]>;
|
3290
3287
|
|
3291
3288
|
export { type AdapterFactoryFn, type DevFlowJson, type FlowController, type FlowControllerPool, type FlowDispatchableAction, type FlowHandlerBaseContext, type FlowHandlerContext, type FlowMediaInput, type NativeFlowJSON, type PickFlowComponent, type Store, type StoreAdapter, type TypedComponentData, type TypedFlowJson, type TypedFlowRouting, type TypedFlowScreen, type TypedFlowScreenComponents, type TypedFlowScreens, buildApiResponse, complete, componentData, components, condition, createDevFlowJson, createFlowContext, createFlowControllerPool, createNativeFlowJson, createStoreFactory, deployFlows, dispatchFlowPayload, dynamic_action, dynamic_navigate, dynamic_refresh, snippets as f, firstScreen, flow$1 as flow, flowController, flowMediaInput, form_payload, getFlowMetadata, getScreenMetadata, inline, navigate, parseUniqueId, screen, screenController, state, txt, uniqueId, zod_payload };
|
package/package.json
CHANGED
@@ -4,7 +4,7 @@
|
|
4
4
|
"publishConfig": {
|
5
5
|
"access": "public"
|
6
6
|
},
|
7
|
-
"version": "0.0.
|
7
|
+
"version": "0.0.6",
|
8
8
|
"type": "module",
|
9
9
|
"files": [
|
10
10
|
"dist"
|
@@ -32,7 +32,7 @@
|
|
32
32
|
"dependencies": {
|
33
33
|
"zod": "^3.24.3",
|
34
34
|
"zod-to-json-schema": "3.24.3",
|
35
|
-
"@apostlejs/whatsapp": "0.0.
|
35
|
+
"@apostlejs/whatsapp": "0.0.6"
|
36
36
|
},
|
37
37
|
"peerDependencies": {
|
38
38
|
"zod": "^3.24.3"
|