@spiffcommerce/core 16.8.1-rc.4 → 16.8.2

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.js CHANGED
@@ -6848,7 +6848,7 @@ class CA {
6848
6848
  if (A) {
6849
6849
  if (!a)
6850
6850
  throw new Error("Failed to generate cart preview image!");
6851
- return await ((u = this.workflowManager.getPreviewService()) == null ? void 0 : u.renderSceneScreenshot(512, a)) || "";
6851
+ return await ((u = this.workflowManager.getPreviewService()) == null ? void 0 : u.renderSceneScreenshot(e ?? 512, a)) || "";
6852
6852
  }
6853
6853
  let n = 2048;
6854
6854
  e && e <= 2048 && (n = e);
@@ -7021,7 +7021,7 @@ class CA {
7021
7021
  }),
7022
7022
  (t) => this.updateVariationRecords(t),
7023
7023
  this.workflowManager.getVariationRecords(),
7024
- (t) => e ? this.createPreviewImage(t) : Promise.resolve(void 0),
7024
+ (t) => e ? this.createPreviewImage(t, 1024) : Promise.resolve(void 0),
7025
7025
  this.workflowManager.getWorkflowMetadata()
7026
7026
  );
7027
7027
  }
@@ -1926,7 +1926,7 @@ IfnI8vaNAAAAAElFTkSuQmCC" transform="matrix(0.13 0.0141 -0.0141 0.1301 104.926 1
1926
1926
  }
1927
1927
  }
1928
1928
  }
1929
- `,wa=async l=>{var t;return(t=(await R.getShadowGraphqlClient().mutate({mutation:Ba,errorPolicy:"all",fetchPolicy:"no-cache",variables:{name:l.name,layouts:l.layouts,workflowId:l.workflowId,transactionId:l.transactionId,previewImage:l.previewImage,useThreeDimPreview:l.useThreeDimPreview,metadata:l.metadata,selectedVariants:l.selectedVariants}})).data)==null?void 0:t.designCreate},Ea=async l=>{var t;return(t=(await R.getShadowGraphqlClient().mutate({mutation:da,errorPolicy:"all",fetchPolicy:"no-cache",variables:{inputs:l.map(A=>({name:A.name,layouts:A.layouts,workflowId:A.workflowId,transactionId:A.transactionId,previewImage:A.previewImage,useThreeDimPreview:A.useThreeDimPreview,metadata:A.metadata,selectedVariants:A.selectedVariants}))}})).data)==null?void 0:t.designCreateMany},je=(l,e,t)=>{const A=n=>{const i={};if(n.type==="Frame"){const o=l[n.stepName],s=n.data;if(!o||!o.image||s.hideImageInCart&&t)return i;i[`${n.stepTitle} image`]=o.image}if(n.type==="Illustration"){const o=l[n.stepName],s=n.data;if(!o||s.hideColorsInCart&&t||!o.colors)return i;if(o.colors.length>0){const r=o.colors.join(", ").toUpperCase();i[`${n.stepTitle} colors`]=r}}if(n.type==="Module"){const o=l[n.stepName],s=n.data;if(!o||o.text===void 0||o.text===null||s.hideTextInCart&&t)return i;i[`${n.stepTitle} text`]=o.text}if(n.type==="Text"){const o=l[n.stepName];if(!o)return i;const s=n.data;(!s.hideTextInCart||!t&&o.text!==void 0&&o.text!==null)&&(i[`${n.stepTitle} text`]=o.text),o.color&&(!s.hideColorInCart||!t)&&(i[`${n.stepTitle} color`]=o.color)}return i},a={};return e.steps.forEach(n=>{Object.assign(a,A(n))}),a},ha=(l,e,t,A)=>{const a={};let n;if(t){n=je(t,e,!1);for(const i of Object.keys(n))a[i]={value:n[i],priceModifier:0}}else if(A){n=A;for(const i of Object.keys(n))a[i]={value:n[i],priceModifier:0}}for(const i of Object.keys(l)){const o=l[i],s=e.steps.find(r=>r.stepTitle===i);if(o.length===1)a[`${s==null?void 0:s.stepTitle} selection`]={value:o[0].name,priceModifier:o[0].priceModifier};else if(o.length>1)for(let r=0;r<o.length;r++)a[`${s==null?void 0:s.stepTitle} selection ${r+1}`]={value:o[r].name,priceModifier:o[r].priceModifier}}return a},zt=(l,e,t,A,a,n,i,o,s,r)=>{const d=(P.getMap("transactionOwnerIds")||new Map).get(l.id),B={baseCost:t,designProductId:l.externalDesignProductId,designProductVariantId:l.externalDesignProductVariantId,event:"onComplete",exportedData:n,externalCartProductId:l.externalCartProductId,externalCartProductVariantId:l.externalCartProductVariantId,lineItemImageUrl:i||"",optionsCost:A,processExecutionId:r,transactionId:l.id,transactionOwnerId:d,weight:e.weight,workflowViewerLink:l.workflowViewerLink||"",workflowViewerReadOnlyLink:l.workflowViewerReadOnlyLink||""};return a&&(B.metadata=a),o&&(B.selectedVariants=o),s&&(B.sku=s),B},Ca=(l,e,t,A)=>{const a=(e.basePrice||0)*(l.variationsCount||0),n=l.priceModifierTotal||0,i={items:{value:l.variationsCount?`${l.variationsCount}`:"0",priceModifier:0}};return zt(l,e,a,n,void 0,i,t,void 0,void 0,A)},jt=async(l,e,t,A,a,n,i,o)=>{const s=e.basePrice||0,r=l.priceModifierTotal||0,g=ha(A,t,void 0,n);return zt(l,e,s,r,n,g,i,A,a,o)},Kt=async(l,e,t,A,a,n,i,o,s,r)=>{var y;await(async()=>{var N;if(r!==void 0)return r;await l.outstandingRequestsPromise();const S=await R.getShadowGraphqlClient().query({query:ht,variables:{ids:[a.id]},fetchPolicy:"no-cache",errorPolicy:"all"}),G=(N=S.data)==null?void 0:N.transactions[0].workflowState;return S.errors?(S.errors.forEach(v=>{S.errors&&console.log("Server Error:",v.message)}),null):G??null})()||(console.warn("State mismatch detected. Uploading known state explicitly"),console.warn("State Object:",JSON.stringify(A())),await l.updateStateWithServerImmediate(A),console.log("Server state is undefined @ Workflow completion"));const B=l.getPreviewService(),w=(y=e==null?void 0:e.finalizeStepConfig)==null?void 0:y.lookAtAnimation,h=B&&e.showModelOnFinishStep&&!!w,Q=s&&je(s,e,!0),E=s&&je(s,e,!1),m=async Y=>{const S={};let G=0;if(Object.keys(n).length>0)for(const N of Object.keys(n)){const v=n[N],j=e.steps.find(K=>K.stepName===N);for(let K=0;K<v.selections.length;++K){const V=v.selections[K];if(j&&(!Y||j.option&&(j.option.variants||[]).length>1&&!j.data.hideSelectionInCart&&!j.data.hideSelectionsInCart)){const qe=j.stepTitle;S[qe]?S[qe].push({id:V.id||"",name:V.name,priceModifier:V.priceModifier}):S[qe]=[{id:V.id||"",name:V.name,priceModifier:V.priceModifier}]}G+=V.priceModifier}}return[S,G]},[C]=await m(!0),I=Object.fromEntries(Object.keys(C).map(Y=>[Y,C[Y].map(S=>S.id)])),[F]=await m(!1),D=Object.fromEntries(Object.keys(F).map(Y=>[Y,F[Y].map(S=>S.id)])),p=await o(h);return{designDetails:(()=>{const Y={name:i,layouts:t.map(S=>({index:S.index,panelId:S.panelId})),workflowId:e.id,transactionId:a.id,useThreeDimPreview:!!h,previewImage:p};if(E){const S=[];for(const[G,N]of Object.entries(E))S.push({key:G,value:N});Y.metadata=S}if(I){const S=[];for(const[G,N]of Object.entries(D))S.push({key:G,ids:N});Y.selectedVariants=S}return Y})(),cartSelectionsWithPrices:C,cartMetadata:Q}},Vt=async(l,e,t,A,a,n,i,o,s,r,g,d,B)=>{var I,F,D;s("workflow.steps.finish.finalize.buildingLayouts");const{designDetails:w,cartSelectionsWithPrices:h,cartMetadata:Q}=await Kt(l,e,t,A,n,i,o,d,B);s("workflow.steps.finish.finalize.creatingDesign"),n.bulk&&await r(g);const E=await wa(w),m=(I=E==null?void 0:E.transaction)==null?void 0:I.previewImageLink;if(!(E!=null&&E.transaction))throw new Error("Failed to create design");s("workflow.steps.finish.finalize.updatingTransaction");const C=E.transaction;return n.bulk?Ca(C,a,m,(F=E==null?void 0:E.processExecution)==null?void 0:F.id):await jt(C,a,e,h,E==null?void 0:E.sku,Q,m,(D=E==null?void 0:E.processExecution)==null?void 0:D.id)},Qa=async(l,e)=>{e("workflow.steps.finish.finalize.buildingLayouts"),await Promise.all(l.map(async i=>{await i.workflowManager.outstandingRequestsPromise()}));const A=await(async()=>{var s;const o=await R.getShadowGraphqlClient().query({query:ht,variables:{ids:l.map(r=>r.transaction.id)},fetchPolicy:"no-cache",errorPolicy:"all"});return o.errors?(o.errors.forEach(r=>{o.errors&&console.log("Server Error:",r.message)}),null):(s=o.data)!=null&&s.transactions?o.data.transactions.map(r=>r.workflowState??null):null})(),a=await Promise.all(l.map(async(i,o)=>await Kt(i.workflowManager,i.workflow,i.layouts,i.getReducerState,i.transaction,i.workflowSelections,i.designName,()=>Promise.resolve(void 0),i.workflowMetadata,A?A[o]:void 0)));e("workflow.steps.finish.finalize.creatingDesign");const n=await Ea(a.map(i=>i.designDetails));if(!n)throw new Error("Failed to create designs");return e("workflow.steps.finish.finalize.updatingTransaction"),Promise.all(n.map(async(i,o)=>{var d;const s=l[o],r=a[o],g=i.transaction;return await jt(g,s.product,s.workflow,r.cartSelectionsWithPrices,i.sku,r.cartMetadata,void 0,(d=i.processExecution)==null?void 0:d.id)}))};class ua{constructor(){this.localPersistenceKey="designTransactions",this.storageMethod="Local",this.designSavedListeners=[]}attachSaveListener(e){this.designSavedListeners.push(e)}detachSaveListener(e){this.designSavedListeners=this.designSavedListeners.filter(t=>t!==e)}async getSavedDesigns(){if(this.storageMethod==="Local"){const e=P.get(this.localPersistenceKey);return e?JSON.parse(e):[]}throw new U("Unexpected storage method requested")}async getSavedDesignByTransaction(e){return(await this.getSavedDesigns()).find(A=>A.transactionId===e)}async addDesign(e){const A=(await this.getSavedDesigns()).filter(a=>a.transactionId!==e.transactionId);A.unshift(e),await this.setDesigns(A),this.designSavedListeners.forEach(a=>a(e))}async renameDesign(e,t){const A=await this.getSavedDesigns(),a=A.find(n=>n.transactionId===e);if(!a)throw new Error(`No saved design for transaction ${e}.`);a.title=t,await this.setDesigns(A)}async removeDesign(e){const t=await this.getSavedDesigns();await this.setDesigns(t.filter(A=>A.transactionId!==e))}async setDesigns(e){if(this.storageMethod==="Local"){P.set(this.localPersistenceKey,JSON.stringify(e));return}throw new U("Unexpected storage method requested")}}const pe=new ua;class de{constructor(e,t){var a;if(this.renderableScenes=[],this.renderableSceneCallbacks=[],this.debouncedSavedDesignUpdate=_e(async()=>{await pe.getSavedDesignByTransaction(this.getWorkflowManager().getTransaction().id)&&this.save()},2500),this.getCanvasObjectURLAsync=async n=>new Promise((i,o)=>{try{n.toBlob(s=>{if(s){const r=URL.createObjectURL(s);i(r)}})}catch(s){o(s)}}),!t.workflow)throw new Error("No Workflow ID provided.");this.client=e;const A=t.layouts;this.commandContext=new c.CommandContext,this.commandContext.initialize(A,t.reloadedState),this.isReadOnly=t.transaction.isOrdered||!!t.readOnly,this.workflowManager=new ga(t.workflow,((a=t.product.profanities)==null?void 0:a.map(n=>n.word))||[],A,this.commandContext,n=>{try{this.debouncedSavedDesignUpdate()}catch{console.error("Failed to update saved design details.")}return t.stateMutationFunc(n)},t.transaction,t.product,t.previewService,t.renderableContextService,t.reloadedState,t.readOnly,t.modelContainer,t.isReloadedTransaction,t.singleVariantsRenderable),this.workflowManager.addSelectionCallback(n=>{const i=n.traversableScenes.map(o=>{const s=o.renderableSteps.map(r=>r.stepName);return{id:o.name,title:o.title,renderableSteps:s}});this.renderableScenes=i,this.renderableSceneCallbacks.forEach(o=>o(i))})}getClient(){return this.client}getIsReadOnly(){return this.isReadOnly}getCommandContext(){return this.commandContext}getWorkflowManager(){return this.workflowManager}async updateVariationRecords(e){await R.getShadowGraphqlClient().mutate({mutation:UA,variables:{transactionId:this.workflowManager.getTransaction().id,updates:e.map(t=>({recordNumber:t.recordNumber,values:t.values.map(A=>({aspect:A.aspect,stepName:A.stepName,value:A.value}))}))}})}async createPreviewImage(e,t){var C,I;const A=this.workflowManager.getWorkflow(),a=(C=A==null?void 0:A.finalizeStepConfig)==null?void 0:C.lookAtAnimation;if(e){if(!a)throw new Error("Failed to generate cart preview image!");return await((I=this.workflowManager.getPreviewService())==null?void 0:I.renderSceneScreenshot(512,a))||""}let n=2048;t&&t<=2048&&(n=t);const i=c.createCanvas(n,n),o=this.commandContext.getAllLayouts(),s=A.defaultPreviewPanelIndex||0,r=A.panels[s],g=o.find(F=>{var D;return((D=F.layoutState)==null?void 0:D.layout.panelId)===(r==null?void 0:r.name)})||o[0],d=g.layoutState.layout.previewRegion?{x:g.layoutState.layout.previewRegion.left,y:g.layoutState.layout.previewRegion.top,width:g.layoutState.layout.previewRegion.width,height:g.layoutState.layout.previewRegion.height}:{x:0,y:0,width:g.layoutState.layout.width,height:g.layoutState.layout.height},B=this.commandContext.getLayoutById(g.layoutState.layout.id),w=i.getContext("2d");if(!w)throw new Ce("Failed to obtain 2D context for preview image creation");const h=c.getSvgElement(B.layoutState.layout,B.layoutState.elements,{renderingConfiguration:{purpose:c.LayoutRenderingPurpose.Print,region:{left:d.x,top:d.y,width:d.width,height:d.height}}}),Q=c.renderPapyrusComponentAsString(h);await(await $e.Pith.from(w,Q,{anonymousCrossOrigin:!0,ignoreDimensions:!1,createCanvas:c.createCanvas,createImage:c.loadImage,DOMParser:c.getDomParser(),fetch:c.fetch})).render();const m=await this.getCanvasObjectURLAsync(i);return i.toDataURL(m)}getStepById(e){const t=this.getWorkflowManager().getWorkflow().steps.find(A=>A.stepName===e);if(!(!t||!this.stepHasHandle(t)))return Be.get(this.getWorkflowManager(),t)}getSteps(){return this.getScenes().flatMap(e=>this.getStepsByScene(e))}getScenes(){return this.getWorkflowManager().getWorkflow().stepGroups.map(t=>({id:t.id,name:t.name,stepIds:t.stepNames}))}getSelectionPriceSubunits(){const e=this.getWorkflowManager().getWorkflowSelections();let t=0;return Object.values(e).forEach(A=>{t+=A.selections.map(a=>a.priceModifier).reduce((a,n)=>a+n)}),t}getBasePriceSubunits(){return this.getWorkflowManager().getProduct().basePrice||0}getTotalPriceSubunits(){return this.getBasePriceSubunits()+this.getSelectionPriceSubunits()}getBulkStep(){if(this.getWorkflowManager().getTransaction().bulk){const e=this.getWorkflowManager().getProduct().bulkConfiguration,t={type:c.StepType.Bulk,stepName:"Bulk",stepTitle:(e==null?void 0:e.stepTitle)??"workflow.steps.bulk.title",helpText:e==null?void 0:e.helpText,data:{aspects:He(this.getWorkflowManager().getWorkflow())},conditions:[]};return Be.get(this.getWorkflowManager(),t)}}getStepByName(e){const t=this.getWorkflowManager().getWorkflow().steps.find(A=>A.stepTitle===e);if(!(!t||!this.stepHasHandle(t)))return Be.get(this.getWorkflowManager(),t)}getStepsByType(e){return this.getWorkflowManager().getWorkflow().steps.filter(t=>t.type===e).map(t=>Be.get(this.getWorkflowManager(),t))}getStepsByScene(e){if(!this.getWorkflowManager().getWorkflow().stepGroups.find(A=>A.name===e.name))throw new Error("Given scene is not present on workflow! Be careful when persisting scenes that you only use them with the relevant workflow.");return e.stepIds.map(A=>this.getWorkflowManager().getWorkflow().steps.find(a=>a.stepName===A)).filter(A=>this.stepHasHandle(A)).map(A=>Be.get(this.getWorkflowManager(),A))}async attachCustomerDetails(e){return this.assignCustomerDetails({emailAddress:e.email})}async assignCustomerDetails(e){var a,n,i;const A=(i=(n=(a=(await R.getShadowGraphqlClient().mutate({mutation:Ht,variables:{id:this.getWorkflowManager().getTransaction().id,details:e,type:"Owner"}})).data)==null?void 0:a.transactionAddStakeholder)==null?void 0:n.stakeholders)==null?void 0:i.find(o=>{var s;return((s=o.customer)==null?void 0:s.emailAddress)===e.emailAddress});if(A!=null&&A.customer){this.getWorkflowManager().setTransactionCustomer(A.customer);const o=P.getMap("transactionCustomerIds")||new Map;o.set(this.getWorkflowManager().getTransaction().id,A.customer.id),P.setMap("transactionCustomerIds",o)}}attachRenderableSceneListener(e){this.renderableSceneCallbacks.push(e),e(this.renderableScenes)}detachRenderableSceneListener(e){this.renderableSceneCallbacks=this.renderableSceneCallbacks.filter(t=>t!==e)}async save(e){if(!this.getCommandContext().getState())throw new U("State undefined!");const a={title:await(async()=>{var s;if(e)return e;const n=this.getWorkflowManager().getTransaction().id,o=(s=(await pe.getSavedDesigns()).find(r=>r.transactionId===n))==null?void 0:s.title;return o||"My design"})(),thumbnail:await this.createPreviewImage(!1,256),transactionId:this.getWorkflowManager().getTransaction().id,productId:this.getWorkflowManager().getProduct().id,integrationProductId:this.getWorkflowManager().getTransaction().integrationProduct.id,workflowName:this.getWorkflowManager().getWorkflow().name,workflowId:this.getWorkflowManager().getWorkflow().id,lastEdited:new Date};return await pe.addDesign(a),a}async copy(){var o;const e=Ae(this.getCommandContext().getState());if(!e)throw new U("Internal state is undefined! Cannot copy experience!");const t=JSON.stringify(e.transaction),A=this.getWorkflowManager().getWorkflow(),a=new sA({}),n=(o=this.getWorkflowManager().getTransaction().integrationProduct)==null?void 0:o.id;if(!n)throw new U("Integration product id is undefined!");return await a.initFromIntegrationProduct(n),await a.getWorkflowExperience(A.id,t,void 0)}async onDesignFinished(e,t=!0){return Vt(this.workflowManager,this.workflowManager.getWorkflow(),this.workflowManager.getLayouts(),()=>this.commandContext.getState(),this.workflowManager.getProduct(),this.workflowManager.getTransaction(),this.workflowManager.getWorkflowSelections(),this.workflowManager.getWorkflow().name,e||(()=>{}),A=>this.updateVariationRecords(A),this.workflowManager.getVariationRecords(),A=>t?this.createPreviewImage(A):Promise.resolve(void 0),this.workflowManager.getWorkflowMetadata())}stepHasHandle(e){return e.type!==c.StepType.SilentIllustration&&e.type!==c.StepType.ProductOverlay}getExportedData(){var a;const e=new Map,t=this.getWorkflowManager().getWorkflowMetadata(),A=this.getWorkflowManager().getWorkflowSelections();return Object.keys(t).forEach(n=>{const i=this.workflowManager.getWorkflow().steps.find(s=>s.stepName===n);if(!i)return;e.has(i.stepTitle)||e.set(i.stepTitle,{});const o=t[n];Object.keys(o).forEach(s=>{e.get(i.stepTitle)[s]=o[s]})}),(a=Object.keys(A))==null||a.forEach(n=>{const i=this.workflowManager.getWorkflow().steps.find(o=>o.stepName===n);i&&(e.has(i.stepTitle)||e.set(i.stepTitle,{}),e.get(i.stepTitle).selection=A[n].selections[0].name)}),e}}const ma=["altGlyph","circle","ellipse","path","polygon","polyline","rect","text","textPath","tref","tspan"],Ia=async(l,e,t)=>{const A=e.data,a=t.data.baseUrl,n=A.assetUrl.replace("localhost","localstack"),i=a.slice(0,4)==="http"?"":"https://",o=new URL(i+a);o.searchParams.append("video",c.toBase64(JSON.stringify([{href:n}]))),o.pathname=o.pathname+(o.pathname.slice(-1)==="/"?"":"/");const s=o.toString(),g=`data:image/svg+xml;base64,${c.toBase64(await tt.toString(s,{type:"svg"}))}`,d=w=>{const h=l.find(E=>E.panelId===w.panelId);if(!h)throw new k(w);const Q=c.generate();return new c.CreateElementCommand({id:Q,src:g,type:c.LayoutElementType.Image,y:w.top,x:w.left,width:w.width,height:w.height,rotation:0},h)},B=t.data.regions;try{return B.map(d)}catch(w){return console.error(w),[]}},fa=async(l,e,t,A)=>{const a=t.data,n=a.assetUrl,i=await c.getPatternImageData(n);try{const o=c.getVariant(a,A.option);o&&(e[A.stepName]={selectedVariants:[o]});const s=async r=>{var Q;const g=await c.generateFrameSVG(r||{width:1,height:1},(Q=o==null?void 0:o.asset)==null?void 0:Q.fileLink),d=await c.getFrameData(g),B=c.generate(),w=l.find(E=>E.panelId===r.panelId);if(!w)throw new k(r);const h=c.calculateOffsets(i,d,{scale:a.scale,left:a.x,top:a.y});return[new c.CreateElementCommand({id:B,path:d.path,dataWidth:d.width,dataHeight:d.height,type:c.LayoutElementType.Frame,focalBlur:A.data.focalBlur,focalBlurStrength:A.data.focalBlurStrength,focalBlurRadius:A.data.focalBlurRadius,forceImageCover:A.data.forceImageCover,x:r.left,y:r.top,width:r.width,height:r.height,layer:r.layer,layerIndex:r.layerIndex,rotation:r.rotation,scaleX:r.width/d.width,scaleY:r.height/d.height,pattern:void 0},w),new c.UpdateFramePattern(B,i,h)]};return(await Promise.all(A.data.regions.map(r=>s(r)))).flat()}catch(o){return console.error(o),[]}},Da=async(l,e,t,A)=>{var D,p;const a=t.data,n=A.option;if(!n)return console.error(`No option for step ${A.stepName}.`),[];const i=((D=n.variants)==null?void 0:D.find(f=>f.id===a.illustrationVariantId))||c.getDefaultVariant(n);if(!i)return console.error(`No variant with ID: ${a.illustrationVariantId}`),[];if(!i.asset)return console.error(`No asset for variant with ID: ${a.illustrationVariantId}`),[];e[A.stepName]={selectedVariants:[i]};const o=(p=i.asset)==null?void 0:p.fileLink;if(!o)return console.error(`No asset link for variant with ID: ${a.illustrationVariantId}`),[];const s=await c.fetchAsString(o,!0),r=/<svg.*?<\/svg>/s,g=s.match(r)||[],d=(g==null?void 0:g.length)>0?g[0]:"",h=c.domParser().parseFromString(d,"image/svg+xml").firstElementChild;if(!h)return console.error("Failed to read SVG."),[];c.sanitizeSvgTree(h);const Q={};c.traverse(h,f=>{ma.includes(f.tagName)&&!f.attributes.getNamedItem("fill")&&f.setAttribute("fill","#000000");const y=f.attributes.getNamedItem("fill");if(y&&y.value!=="none"){const S=y.value,N=`spiff-fill-${S.replace(/\W/g,"")}`;f.classList.add(N),Q[N]={browserValue:S}}const Y=f.attributes.getNamedItem("stroke");if(Y&&Y.value!=="none"){const S=Y.value,N=`spiff-stroke-${S.replace(/\W/g,"")}`;f.classList.add(N),Q[N]={browserValue:S}}});const m=c.xmlSerializer().serializeToString(h),C=a.colors;if(C){for(const[f,y]of Object.entries(Q))for(const Y of Object.keys(C))if(y.browserValue===Y){Q[f]={browserValue:C[Y]};break}}const I=f=>{const y=l.find(S=>S.panelId===f.panelId);if(!y)throw new k(f);const Y=c.generate();return new c.CreateElementCommand({colors:Q,id:Y,svg:m,type:c.LayoutElementType.Illustration,y:f.top,x:f.left,rotation:f.rotation,width:f.width,height:f.height,layer:f.layer,layerIndex:f.layerIndex,immutable:f.immutable},y)},F=A.data.regions;try{return F.map(I)}catch(f){return console.error(f),[]}},pa=async(l,e,t)=>{const A=await Nt(t.data.module),a=e.data,n=(o,s)=>{const r=l.find(d=>d.panelId===s.panelId);if(!r)throw new k(s);const g=c.generate();return new c.CreateElementCommand({colors:{},id:g,svg:o,type:c.LayoutElementType.Illustration,y:s.top,x:s.left,rotation:s.rotation,width:s.width,height:s.height,layer:s.layer,layerIndex:s.layerIndex},r)},i=t.data.regions;try{return i.map(o=>n(A.svgPrint(a.text,o),o))}catch(o){return console.error(o),[]}},Fa=async(l,e,t,A)=>{var g,d;const a=t.data,n=A.option;if(!n)return console.error(`No option for step ${A.stepName}.`),[];const i=((g=n.variants)==null?void 0:g.find(B=>B.id===a.pictureVariantId))||c.getDefaultVariant(n);if(!i)return console.error(`No variant with ID: ${a.pictureVariantId}`),[];if(!i.asset)return console.error(`No asset for variant with ID: ${a.pictureVariantId}`),[];e[A.stepName]={selectedVariants:[i]};const o=(d=i.asset)==null?void 0:d.fileLink;if(!o)return console.error(`No asset link for variant with ID: ${a.pictureVariantId}`),[];const s=B=>{const w=l.find(Q=>Q.panelId===B.panelId);if(!w)throw new k(B);const h=c.generate();return new c.CreateElementCommand({id:h,src:o,type:c.LayoutElementType.Image,y:B.top,x:B.left,rotation:B.rotation,width:B.width,height:B.height,layer:B.layer,layerIndex:B.layerIndex,immutable:B.immutable,preserveAspectRatio:"none"},w)},r=A.data.regions;try{return r.map(s)}catch(B){return console.error(B),[]}},Ma=async(l,e,t,A)=>{var r;const a=t.data,n=A.option;if(!n)return console.error(`No option for step ${A.stepName}.`),[];const i=((r=n.variants)==null?void 0:r.find(g=>g.id===a.colorVariantId))||c.getDefaultVariant(n);if(!i)return console.error(`No variant with ID: ${a.colorVariantId}`),[];e[A.stepName]={selectedVariants:[i]};const o=g=>{const d=l.find(E=>E.panelId===g.panelId);if(!d)throw new k(g);const B=`
1929
+ `,wa=async l=>{var t;return(t=(await R.getShadowGraphqlClient().mutate({mutation:Ba,errorPolicy:"all",fetchPolicy:"no-cache",variables:{name:l.name,layouts:l.layouts,workflowId:l.workflowId,transactionId:l.transactionId,previewImage:l.previewImage,useThreeDimPreview:l.useThreeDimPreview,metadata:l.metadata,selectedVariants:l.selectedVariants}})).data)==null?void 0:t.designCreate},Ea=async l=>{var t;return(t=(await R.getShadowGraphqlClient().mutate({mutation:da,errorPolicy:"all",fetchPolicy:"no-cache",variables:{inputs:l.map(A=>({name:A.name,layouts:A.layouts,workflowId:A.workflowId,transactionId:A.transactionId,previewImage:A.previewImage,useThreeDimPreview:A.useThreeDimPreview,metadata:A.metadata,selectedVariants:A.selectedVariants}))}})).data)==null?void 0:t.designCreateMany},je=(l,e,t)=>{const A=n=>{const i={};if(n.type==="Frame"){const o=l[n.stepName],s=n.data;if(!o||!o.image||s.hideImageInCart&&t)return i;i[`${n.stepTitle} image`]=o.image}if(n.type==="Illustration"){const o=l[n.stepName],s=n.data;if(!o||s.hideColorsInCart&&t||!o.colors)return i;if(o.colors.length>0){const r=o.colors.join(", ").toUpperCase();i[`${n.stepTitle} colors`]=r}}if(n.type==="Module"){const o=l[n.stepName],s=n.data;if(!o||o.text===void 0||o.text===null||s.hideTextInCart&&t)return i;i[`${n.stepTitle} text`]=o.text}if(n.type==="Text"){const o=l[n.stepName];if(!o)return i;const s=n.data;(!s.hideTextInCart||!t&&o.text!==void 0&&o.text!==null)&&(i[`${n.stepTitle} text`]=o.text),o.color&&(!s.hideColorInCart||!t)&&(i[`${n.stepTitle} color`]=o.color)}return i},a={};return e.steps.forEach(n=>{Object.assign(a,A(n))}),a},ha=(l,e,t,A)=>{const a={};let n;if(t){n=je(t,e,!1);for(const i of Object.keys(n))a[i]={value:n[i],priceModifier:0}}else if(A){n=A;for(const i of Object.keys(n))a[i]={value:n[i],priceModifier:0}}for(const i of Object.keys(l)){const o=l[i],s=e.steps.find(r=>r.stepTitle===i);if(o.length===1)a[`${s==null?void 0:s.stepTitle} selection`]={value:o[0].name,priceModifier:o[0].priceModifier};else if(o.length>1)for(let r=0;r<o.length;r++)a[`${s==null?void 0:s.stepTitle} selection ${r+1}`]={value:o[r].name,priceModifier:o[r].priceModifier}}return a},zt=(l,e,t,A,a,n,i,o,s,r)=>{const d=(P.getMap("transactionOwnerIds")||new Map).get(l.id),B={baseCost:t,designProductId:l.externalDesignProductId,designProductVariantId:l.externalDesignProductVariantId,event:"onComplete",exportedData:n,externalCartProductId:l.externalCartProductId,externalCartProductVariantId:l.externalCartProductVariantId,lineItemImageUrl:i||"",optionsCost:A,processExecutionId:r,transactionId:l.id,transactionOwnerId:d,weight:e.weight,workflowViewerLink:l.workflowViewerLink||"",workflowViewerReadOnlyLink:l.workflowViewerReadOnlyLink||""};return a&&(B.metadata=a),o&&(B.selectedVariants=o),s&&(B.sku=s),B},Ca=(l,e,t,A)=>{const a=(e.basePrice||0)*(l.variationsCount||0),n=l.priceModifierTotal||0,i={items:{value:l.variationsCount?`${l.variationsCount}`:"0",priceModifier:0}};return zt(l,e,a,n,void 0,i,t,void 0,void 0,A)},jt=async(l,e,t,A,a,n,i,o)=>{const s=e.basePrice||0,r=l.priceModifierTotal||0,g=ha(A,t,void 0,n);return zt(l,e,s,r,n,g,i,A,a,o)},Kt=async(l,e,t,A,a,n,i,o,s,r)=>{var y;await(async()=>{var N;if(r!==void 0)return r;await l.outstandingRequestsPromise();const S=await R.getShadowGraphqlClient().query({query:ht,variables:{ids:[a.id]},fetchPolicy:"no-cache",errorPolicy:"all"}),G=(N=S.data)==null?void 0:N.transactions[0].workflowState;return S.errors?(S.errors.forEach(v=>{S.errors&&console.log("Server Error:",v.message)}),null):G??null})()||(console.warn("State mismatch detected. Uploading known state explicitly"),console.warn("State Object:",JSON.stringify(A())),await l.updateStateWithServerImmediate(A),console.log("Server state is undefined @ Workflow completion"));const B=l.getPreviewService(),w=(y=e==null?void 0:e.finalizeStepConfig)==null?void 0:y.lookAtAnimation,h=B&&e.showModelOnFinishStep&&!!w,Q=s&&je(s,e,!0),E=s&&je(s,e,!1),m=async Y=>{const S={};let G=0;if(Object.keys(n).length>0)for(const N of Object.keys(n)){const v=n[N],j=e.steps.find(K=>K.stepName===N);for(let K=0;K<v.selections.length;++K){const V=v.selections[K];if(j&&(!Y||j.option&&(j.option.variants||[]).length>1&&!j.data.hideSelectionInCart&&!j.data.hideSelectionsInCart)){const qe=j.stepTitle;S[qe]?S[qe].push({id:V.id||"",name:V.name,priceModifier:V.priceModifier}):S[qe]=[{id:V.id||"",name:V.name,priceModifier:V.priceModifier}]}G+=V.priceModifier}}return[S,G]},[C]=await m(!0),I=Object.fromEntries(Object.keys(C).map(Y=>[Y,C[Y].map(S=>S.id)])),[F]=await m(!1),D=Object.fromEntries(Object.keys(F).map(Y=>[Y,F[Y].map(S=>S.id)])),p=await o(h);return{designDetails:(()=>{const Y={name:i,layouts:t.map(S=>({index:S.index,panelId:S.panelId})),workflowId:e.id,transactionId:a.id,useThreeDimPreview:!!h,previewImage:p};if(E){const S=[];for(const[G,N]of Object.entries(E))S.push({key:G,value:N});Y.metadata=S}if(I){const S=[];for(const[G,N]of Object.entries(D))S.push({key:G,ids:N});Y.selectedVariants=S}return Y})(),cartSelectionsWithPrices:C,cartMetadata:Q}},Vt=async(l,e,t,A,a,n,i,o,s,r,g,d,B)=>{var I,F,D;s("workflow.steps.finish.finalize.buildingLayouts");const{designDetails:w,cartSelectionsWithPrices:h,cartMetadata:Q}=await Kt(l,e,t,A,n,i,o,d,B);s("workflow.steps.finish.finalize.creatingDesign"),n.bulk&&await r(g);const E=await wa(w),m=(I=E==null?void 0:E.transaction)==null?void 0:I.previewImageLink;if(!(E!=null&&E.transaction))throw new Error("Failed to create design");s("workflow.steps.finish.finalize.updatingTransaction");const C=E.transaction;return n.bulk?Ca(C,a,m,(F=E==null?void 0:E.processExecution)==null?void 0:F.id):await jt(C,a,e,h,E==null?void 0:E.sku,Q,m,(D=E==null?void 0:E.processExecution)==null?void 0:D.id)},Qa=async(l,e)=>{e("workflow.steps.finish.finalize.buildingLayouts"),await Promise.all(l.map(async i=>{await i.workflowManager.outstandingRequestsPromise()}));const A=await(async()=>{var s;const o=await R.getShadowGraphqlClient().query({query:ht,variables:{ids:l.map(r=>r.transaction.id)},fetchPolicy:"no-cache",errorPolicy:"all"});return o.errors?(o.errors.forEach(r=>{o.errors&&console.log("Server Error:",r.message)}),null):(s=o.data)!=null&&s.transactions?o.data.transactions.map(r=>r.workflowState??null):null})(),a=await Promise.all(l.map(async(i,o)=>await Kt(i.workflowManager,i.workflow,i.layouts,i.getReducerState,i.transaction,i.workflowSelections,i.designName,()=>Promise.resolve(void 0),i.workflowMetadata,A?A[o]:void 0)));e("workflow.steps.finish.finalize.creatingDesign");const n=await Ea(a.map(i=>i.designDetails));if(!n)throw new Error("Failed to create designs");return e("workflow.steps.finish.finalize.updatingTransaction"),Promise.all(n.map(async(i,o)=>{var d;const s=l[o],r=a[o],g=i.transaction;return await jt(g,s.product,s.workflow,r.cartSelectionsWithPrices,i.sku,r.cartMetadata,void 0,(d=i.processExecution)==null?void 0:d.id)}))};class ua{constructor(){this.localPersistenceKey="designTransactions",this.storageMethod="Local",this.designSavedListeners=[]}attachSaveListener(e){this.designSavedListeners.push(e)}detachSaveListener(e){this.designSavedListeners=this.designSavedListeners.filter(t=>t!==e)}async getSavedDesigns(){if(this.storageMethod==="Local"){const e=P.get(this.localPersistenceKey);return e?JSON.parse(e):[]}throw new U("Unexpected storage method requested")}async getSavedDesignByTransaction(e){return(await this.getSavedDesigns()).find(A=>A.transactionId===e)}async addDesign(e){const A=(await this.getSavedDesigns()).filter(a=>a.transactionId!==e.transactionId);A.unshift(e),await this.setDesigns(A),this.designSavedListeners.forEach(a=>a(e))}async renameDesign(e,t){const A=await this.getSavedDesigns(),a=A.find(n=>n.transactionId===e);if(!a)throw new Error(`No saved design for transaction ${e}.`);a.title=t,await this.setDesigns(A)}async removeDesign(e){const t=await this.getSavedDesigns();await this.setDesigns(t.filter(A=>A.transactionId!==e))}async setDesigns(e){if(this.storageMethod==="Local"){P.set(this.localPersistenceKey,JSON.stringify(e));return}throw new U("Unexpected storage method requested")}}const pe=new ua;class de{constructor(e,t){var a;if(this.renderableScenes=[],this.renderableSceneCallbacks=[],this.debouncedSavedDesignUpdate=_e(async()=>{await pe.getSavedDesignByTransaction(this.getWorkflowManager().getTransaction().id)&&this.save()},2500),this.getCanvasObjectURLAsync=async n=>new Promise((i,o)=>{try{n.toBlob(s=>{if(s){const r=URL.createObjectURL(s);i(r)}})}catch(s){o(s)}}),!t.workflow)throw new Error("No Workflow ID provided.");this.client=e;const A=t.layouts;this.commandContext=new c.CommandContext,this.commandContext.initialize(A,t.reloadedState),this.isReadOnly=t.transaction.isOrdered||!!t.readOnly,this.workflowManager=new ga(t.workflow,((a=t.product.profanities)==null?void 0:a.map(n=>n.word))||[],A,this.commandContext,n=>{try{this.debouncedSavedDesignUpdate()}catch{console.error("Failed to update saved design details.")}return t.stateMutationFunc(n)},t.transaction,t.product,t.previewService,t.renderableContextService,t.reloadedState,t.readOnly,t.modelContainer,t.isReloadedTransaction,t.singleVariantsRenderable),this.workflowManager.addSelectionCallback(n=>{const i=n.traversableScenes.map(o=>{const s=o.renderableSteps.map(r=>r.stepName);return{id:o.name,title:o.title,renderableSteps:s}});this.renderableScenes=i,this.renderableSceneCallbacks.forEach(o=>o(i))})}getClient(){return this.client}getIsReadOnly(){return this.isReadOnly}getCommandContext(){return this.commandContext}getWorkflowManager(){return this.workflowManager}async updateVariationRecords(e){await R.getShadowGraphqlClient().mutate({mutation:UA,variables:{transactionId:this.workflowManager.getTransaction().id,updates:e.map(t=>({recordNumber:t.recordNumber,values:t.values.map(A=>({aspect:A.aspect,stepName:A.stepName,value:A.value}))}))}})}async createPreviewImage(e,t){var C,I;const A=this.workflowManager.getWorkflow(),a=(C=A==null?void 0:A.finalizeStepConfig)==null?void 0:C.lookAtAnimation;if(e){if(!a)throw new Error("Failed to generate cart preview image!");return await((I=this.workflowManager.getPreviewService())==null?void 0:I.renderSceneScreenshot(t??512,a))||""}let n=2048;t&&t<=2048&&(n=t);const i=c.createCanvas(n,n),o=this.commandContext.getAllLayouts(),s=A.defaultPreviewPanelIndex||0,r=A.panels[s],g=o.find(F=>{var D;return((D=F.layoutState)==null?void 0:D.layout.panelId)===(r==null?void 0:r.name)})||o[0],d=g.layoutState.layout.previewRegion?{x:g.layoutState.layout.previewRegion.left,y:g.layoutState.layout.previewRegion.top,width:g.layoutState.layout.previewRegion.width,height:g.layoutState.layout.previewRegion.height}:{x:0,y:0,width:g.layoutState.layout.width,height:g.layoutState.layout.height},B=this.commandContext.getLayoutById(g.layoutState.layout.id),w=i.getContext("2d");if(!w)throw new Ce("Failed to obtain 2D context for preview image creation");const h=c.getSvgElement(B.layoutState.layout,B.layoutState.elements,{renderingConfiguration:{purpose:c.LayoutRenderingPurpose.Print,region:{left:d.x,top:d.y,width:d.width,height:d.height}}}),Q=c.renderPapyrusComponentAsString(h);await(await $e.Pith.from(w,Q,{anonymousCrossOrigin:!0,ignoreDimensions:!1,createCanvas:c.createCanvas,createImage:c.loadImage,DOMParser:c.getDomParser(),fetch:c.fetch})).render();const m=await this.getCanvasObjectURLAsync(i);return i.toDataURL(m)}getStepById(e){const t=this.getWorkflowManager().getWorkflow().steps.find(A=>A.stepName===e);if(!(!t||!this.stepHasHandle(t)))return Be.get(this.getWorkflowManager(),t)}getSteps(){return this.getScenes().flatMap(e=>this.getStepsByScene(e))}getScenes(){return this.getWorkflowManager().getWorkflow().stepGroups.map(t=>({id:t.id,name:t.name,stepIds:t.stepNames}))}getSelectionPriceSubunits(){const e=this.getWorkflowManager().getWorkflowSelections();let t=0;return Object.values(e).forEach(A=>{t+=A.selections.map(a=>a.priceModifier).reduce((a,n)=>a+n)}),t}getBasePriceSubunits(){return this.getWorkflowManager().getProduct().basePrice||0}getTotalPriceSubunits(){return this.getBasePriceSubunits()+this.getSelectionPriceSubunits()}getBulkStep(){if(this.getWorkflowManager().getTransaction().bulk){const e=this.getWorkflowManager().getProduct().bulkConfiguration,t={type:c.StepType.Bulk,stepName:"Bulk",stepTitle:(e==null?void 0:e.stepTitle)??"workflow.steps.bulk.title",helpText:e==null?void 0:e.helpText,data:{aspects:He(this.getWorkflowManager().getWorkflow())},conditions:[]};return Be.get(this.getWorkflowManager(),t)}}getStepByName(e){const t=this.getWorkflowManager().getWorkflow().steps.find(A=>A.stepTitle===e);if(!(!t||!this.stepHasHandle(t)))return Be.get(this.getWorkflowManager(),t)}getStepsByType(e){return this.getWorkflowManager().getWorkflow().steps.filter(t=>t.type===e).map(t=>Be.get(this.getWorkflowManager(),t))}getStepsByScene(e){if(!this.getWorkflowManager().getWorkflow().stepGroups.find(A=>A.name===e.name))throw new Error("Given scene is not present on workflow! Be careful when persisting scenes that you only use them with the relevant workflow.");return e.stepIds.map(A=>this.getWorkflowManager().getWorkflow().steps.find(a=>a.stepName===A)).filter(A=>this.stepHasHandle(A)).map(A=>Be.get(this.getWorkflowManager(),A))}async attachCustomerDetails(e){return this.assignCustomerDetails({emailAddress:e.email})}async assignCustomerDetails(e){var a,n,i;const A=(i=(n=(a=(await R.getShadowGraphqlClient().mutate({mutation:Ht,variables:{id:this.getWorkflowManager().getTransaction().id,details:e,type:"Owner"}})).data)==null?void 0:a.transactionAddStakeholder)==null?void 0:n.stakeholders)==null?void 0:i.find(o=>{var s;return((s=o.customer)==null?void 0:s.emailAddress)===e.emailAddress});if(A!=null&&A.customer){this.getWorkflowManager().setTransactionCustomer(A.customer);const o=P.getMap("transactionCustomerIds")||new Map;o.set(this.getWorkflowManager().getTransaction().id,A.customer.id),P.setMap("transactionCustomerIds",o)}}attachRenderableSceneListener(e){this.renderableSceneCallbacks.push(e),e(this.renderableScenes)}detachRenderableSceneListener(e){this.renderableSceneCallbacks=this.renderableSceneCallbacks.filter(t=>t!==e)}async save(e){if(!this.getCommandContext().getState())throw new U("State undefined!");const a={title:await(async()=>{var s;if(e)return e;const n=this.getWorkflowManager().getTransaction().id,o=(s=(await pe.getSavedDesigns()).find(r=>r.transactionId===n))==null?void 0:s.title;return o||"My design"})(),thumbnail:await this.createPreviewImage(!1,256),transactionId:this.getWorkflowManager().getTransaction().id,productId:this.getWorkflowManager().getProduct().id,integrationProductId:this.getWorkflowManager().getTransaction().integrationProduct.id,workflowName:this.getWorkflowManager().getWorkflow().name,workflowId:this.getWorkflowManager().getWorkflow().id,lastEdited:new Date};return await pe.addDesign(a),a}async copy(){var o;const e=Ae(this.getCommandContext().getState());if(!e)throw new U("Internal state is undefined! Cannot copy experience!");const t=JSON.stringify(e.transaction),A=this.getWorkflowManager().getWorkflow(),a=new sA({}),n=(o=this.getWorkflowManager().getTransaction().integrationProduct)==null?void 0:o.id;if(!n)throw new U("Integration product id is undefined!");return await a.initFromIntegrationProduct(n),await a.getWorkflowExperience(A.id,t,void 0)}async onDesignFinished(e,t=!0){return Vt(this.workflowManager,this.workflowManager.getWorkflow(),this.workflowManager.getLayouts(),()=>this.commandContext.getState(),this.workflowManager.getProduct(),this.workflowManager.getTransaction(),this.workflowManager.getWorkflowSelections(),this.workflowManager.getWorkflow().name,e||(()=>{}),A=>this.updateVariationRecords(A),this.workflowManager.getVariationRecords(),A=>t?this.createPreviewImage(A,1024):Promise.resolve(void 0),this.workflowManager.getWorkflowMetadata())}stepHasHandle(e){return e.type!==c.StepType.SilentIllustration&&e.type!==c.StepType.ProductOverlay}getExportedData(){var a;const e=new Map,t=this.getWorkflowManager().getWorkflowMetadata(),A=this.getWorkflowManager().getWorkflowSelections();return Object.keys(t).forEach(n=>{const i=this.workflowManager.getWorkflow().steps.find(s=>s.stepName===n);if(!i)return;e.has(i.stepTitle)||e.set(i.stepTitle,{});const o=t[n];Object.keys(o).forEach(s=>{e.get(i.stepTitle)[s]=o[s]})}),(a=Object.keys(A))==null||a.forEach(n=>{const i=this.workflowManager.getWorkflow().steps.find(o=>o.stepName===n);i&&(e.has(i.stepTitle)||e.set(i.stepTitle,{}),e.get(i.stepTitle).selection=A[n].selections[0].name)}),e}}const ma=["altGlyph","circle","ellipse","path","polygon","polyline","rect","text","textPath","tref","tspan"],Ia=async(l,e,t)=>{const A=e.data,a=t.data.baseUrl,n=A.assetUrl.replace("localhost","localstack"),i=a.slice(0,4)==="http"?"":"https://",o=new URL(i+a);o.searchParams.append("video",c.toBase64(JSON.stringify([{href:n}]))),o.pathname=o.pathname+(o.pathname.slice(-1)==="/"?"":"/");const s=o.toString(),g=`data:image/svg+xml;base64,${c.toBase64(await tt.toString(s,{type:"svg"}))}`,d=w=>{const h=l.find(E=>E.panelId===w.panelId);if(!h)throw new k(w);const Q=c.generate();return new c.CreateElementCommand({id:Q,src:g,type:c.LayoutElementType.Image,y:w.top,x:w.left,width:w.width,height:w.height,rotation:0},h)},B=t.data.regions;try{return B.map(d)}catch(w){return console.error(w),[]}},fa=async(l,e,t,A)=>{const a=t.data,n=a.assetUrl,i=await c.getPatternImageData(n);try{const o=c.getVariant(a,A.option);o&&(e[A.stepName]={selectedVariants:[o]});const s=async r=>{var Q;const g=await c.generateFrameSVG(r||{width:1,height:1},(Q=o==null?void 0:o.asset)==null?void 0:Q.fileLink),d=await c.getFrameData(g),B=c.generate(),w=l.find(E=>E.panelId===r.panelId);if(!w)throw new k(r);const h=c.calculateOffsets(i,d,{scale:a.scale,left:a.x,top:a.y});return[new c.CreateElementCommand({id:B,path:d.path,dataWidth:d.width,dataHeight:d.height,type:c.LayoutElementType.Frame,focalBlur:A.data.focalBlur,focalBlurStrength:A.data.focalBlurStrength,focalBlurRadius:A.data.focalBlurRadius,forceImageCover:A.data.forceImageCover,x:r.left,y:r.top,width:r.width,height:r.height,layer:r.layer,layerIndex:r.layerIndex,rotation:r.rotation,scaleX:r.width/d.width,scaleY:r.height/d.height,pattern:void 0},w),new c.UpdateFramePattern(B,i,h)]};return(await Promise.all(A.data.regions.map(r=>s(r)))).flat()}catch(o){return console.error(o),[]}},Da=async(l,e,t,A)=>{var D,p;const a=t.data,n=A.option;if(!n)return console.error(`No option for step ${A.stepName}.`),[];const i=((D=n.variants)==null?void 0:D.find(f=>f.id===a.illustrationVariantId))||c.getDefaultVariant(n);if(!i)return console.error(`No variant with ID: ${a.illustrationVariantId}`),[];if(!i.asset)return console.error(`No asset for variant with ID: ${a.illustrationVariantId}`),[];e[A.stepName]={selectedVariants:[i]};const o=(p=i.asset)==null?void 0:p.fileLink;if(!o)return console.error(`No asset link for variant with ID: ${a.illustrationVariantId}`),[];const s=await c.fetchAsString(o,!0),r=/<svg.*?<\/svg>/s,g=s.match(r)||[],d=(g==null?void 0:g.length)>0?g[0]:"",h=c.domParser().parseFromString(d,"image/svg+xml").firstElementChild;if(!h)return console.error("Failed to read SVG."),[];c.sanitizeSvgTree(h);const Q={};c.traverse(h,f=>{ma.includes(f.tagName)&&!f.attributes.getNamedItem("fill")&&f.setAttribute("fill","#000000");const y=f.attributes.getNamedItem("fill");if(y&&y.value!=="none"){const S=y.value,N=`spiff-fill-${S.replace(/\W/g,"")}`;f.classList.add(N),Q[N]={browserValue:S}}const Y=f.attributes.getNamedItem("stroke");if(Y&&Y.value!=="none"){const S=Y.value,N=`spiff-stroke-${S.replace(/\W/g,"")}`;f.classList.add(N),Q[N]={browserValue:S}}});const m=c.xmlSerializer().serializeToString(h),C=a.colors;if(C){for(const[f,y]of Object.entries(Q))for(const Y of Object.keys(C))if(y.browserValue===Y){Q[f]={browserValue:C[Y]};break}}const I=f=>{const y=l.find(S=>S.panelId===f.panelId);if(!y)throw new k(f);const Y=c.generate();return new c.CreateElementCommand({colors:Q,id:Y,svg:m,type:c.LayoutElementType.Illustration,y:f.top,x:f.left,rotation:f.rotation,width:f.width,height:f.height,layer:f.layer,layerIndex:f.layerIndex,immutable:f.immutable},y)},F=A.data.regions;try{return F.map(I)}catch(f){return console.error(f),[]}},pa=async(l,e,t)=>{const A=await Nt(t.data.module),a=e.data,n=(o,s)=>{const r=l.find(d=>d.panelId===s.panelId);if(!r)throw new k(s);const g=c.generate();return new c.CreateElementCommand({colors:{},id:g,svg:o,type:c.LayoutElementType.Illustration,y:s.top,x:s.left,rotation:s.rotation,width:s.width,height:s.height,layer:s.layer,layerIndex:s.layerIndex},r)},i=t.data.regions;try{return i.map(o=>n(A.svgPrint(a.text,o),o))}catch(o){return console.error(o),[]}},Fa=async(l,e,t,A)=>{var g,d;const a=t.data,n=A.option;if(!n)return console.error(`No option for step ${A.stepName}.`),[];const i=((g=n.variants)==null?void 0:g.find(B=>B.id===a.pictureVariantId))||c.getDefaultVariant(n);if(!i)return console.error(`No variant with ID: ${a.pictureVariantId}`),[];if(!i.asset)return console.error(`No asset for variant with ID: ${a.pictureVariantId}`),[];e[A.stepName]={selectedVariants:[i]};const o=(d=i.asset)==null?void 0:d.fileLink;if(!o)return console.error(`No asset link for variant with ID: ${a.pictureVariantId}`),[];const s=B=>{const w=l.find(Q=>Q.panelId===B.panelId);if(!w)throw new k(B);const h=c.generate();return new c.CreateElementCommand({id:h,src:o,type:c.LayoutElementType.Image,y:B.top,x:B.left,rotation:B.rotation,width:B.width,height:B.height,layer:B.layer,layerIndex:B.layerIndex,immutable:B.immutable,preserveAspectRatio:"none"},w)},r=A.data.regions;try{return r.map(s)}catch(B){return console.error(B),[]}},Ma=async(l,e,t,A)=>{var r;const a=t.data,n=A.option;if(!n)return console.error(`No option for step ${A.stepName}.`),[];const i=((r=n.variants)==null?void 0:r.find(g=>g.id===a.colorVariantId))||c.getDefaultVariant(n);if(!i)return console.error(`No variant with ID: ${a.colorVariantId}`),[];e[A.stepName]={selectedVariants:[i]};const o=g=>{const d=l.find(E=>E.panelId===g.panelId);if(!d)throw new k(g);const B=`
1930
1930
  <svg
1931
1931
  xmlns="http://www.w3.org/2000/svg"
1932
1932
  xmlnsXlink="http://www.w3.org/1999/xlink"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@spiffcommerce/core",
3
- "version": "16.8.1-rc.4",
3
+ "version": "16.8.2",
4
4
  "description": "Core client API for interacting with the Spiff Commerce backend.",
5
5
  "source": "src/index.ts",
6
6
  "main": "dist/index.umd.cjs",