@spiffcommerce/core 11.1.1 → 11.1.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/module.js CHANGED
@@ -1099,5 +1099,5 @@ import{CommandContext as A,AssetType as t,BringForwardCommand as e,BringToFrontC
1099
1099
  }
1100
1100
  }
1101
1101
  }
1102
- `,ta=async A=>{const t=(await mt.getShadowGraphqlClient().query({query:Vi,errorPolicy:"all",fetchPolicy:"no-cache",variables:{id:A}})).data.workflow;return t.steps.forEach((A=>{delete A.data.__typename})),t},ea=(A,t)=>{const e=A.workflowState,n=e?JSON.parse(e):void 0;return n?Object.values(n.layouts).map((A=>A.layout)):t.panels.sort(((A,t)=>A.index-t.index)).map((A=>({id:F(),panelId:A.name,name:A.name,index:A.index,createdAt:new Date,updatedAt:new Date,transparentBackground:A.transparentBackground,height:A.height,width:A.width,previewRegion:A.previewRegion,useEditableArea:A.useEditableArea,editableArea:A.editableArea})))};class na{constructor(A){var t;Ki(this,"options",void 0),Ki(this,"initialized",void 0),Ki(this,"experienceOptions",void 0),Ki(this,"currencyCode",void 0),Ki(this,"customer",void 0),Ki(this,"updateTransactionState",(async A=>{try{return mt.getShadowGraphqlClient().mutate({...A,mutation:Nn})}catch(A){throw console.error(A),new rt("Critical - Unable to synchronize workflow state with server.")}})),this.initialized=!1,this.options=A,this.options.applicationKey&&(t=this.options.applicationKey,Dt=t)}getAssetManager(){return vt}getCurrencyCode(){if(void 0===this.currencyCode)throw new Error("No currency code set.");return this.currencyCode}async authenticateTransactionFromLocalStorage(A){const t=mt.getShadowGraphqlClient(),e=await t.query({query:Wi,errorPolicy:"all",fetchPolicy:"no-cache",variables:{id:A}});if(!e.data.transactions||0===e.data.transactions.length)throw new Error(`Transaction not found: ${A}`);const n=e.data.transactions[0],i=n.product?.partner?.id;if(!i)throw new Error(`Unable to read transaction: ${A}`);if(n.isOrdered)return Promise.resolve({success:!1,transactionReadOnly:!0});const a=lt.getMap("transactionOwnerIds");if(a?.has(A)){const t=a.get(A);return Qt(t),Promise.resolve({success:!0,stakeholderType:ee.Owner})}const o=lt.getMap("transactionCustomerIds");if(o?.has(A)){const t=o.get(A);if(t){if(await this.authenticateCustomerId(t)){const t=this.customer?.stakeholders?.find((t=>t.transaction?.id===A));if(t)return Promise.resolve({success:!0,stakeholderType:t.type})}}}const r=(await t.query({query:Xi,errorPolicy:"all",variables:{id:n.workflowId}})).data.workflow;if(!r)throw new Error(`Unable to read workflow: ${n.workflowId}`);return Promise.resolve({success:!1,theme:r.overrideTheme,customLogoLink:n.customLogoLink})}clearCustomer(){this.customer=void 0}clearCustomerForTransaction(A){const t=lt.getMap("transactionCustomerIds");t?.has(A)&&(t.delete(A),lt.setMap("transactionCustomerIds",t))}getStakeholderTypeForTransaction(A){const t=this.customer?.stakeholders?.find((t=>t.transaction?.id===A));if(t)return t.type}async getOrCreateCustomer(A){this.customer=void 0;const t=mt.getShadowGraphqlClient(),e=(await t.query({query:qi,errorPolicy:"all",fetchPolicy:"no-cache",variables:{emailAddress:A}})).data.customer;if(!e.id){const e=(await t.mutate({mutation:Zi,errorPolicy:"all",fetchPolicy:"no-cache",variables:{details:{emailAddress:A}}})).data?.customerCreate;if(!e)throw new Error("Unable to create customer.");return this.customer=e,{customer:e,isAuthenticated:!1}}const n=await this.authenticateCustomerId(e.id);return{customer:this.customer||e,isAuthenticated:n}}async authenticateCustomerId(A){const t=mt.getShadowGraphqlClient(),e=lt.getMap("customerTokens");if(!e?.has(A))return!1;const n=e.get(A);if(!n)return!1;const i=(await t.mutate({mutation:$i,errorPolicy:"all",fetchPolicy:"no-cache",variables:{loginToken:n}})).data?.customerAuthenticate;return!!i&&(ut(n),this.customer=i,!0)}async generateVerificationCode(A){await mt.getShadowGraphqlClient().mutate({mutation:_i,variables:{emailAddress:A}})}async verifyCode(A,t){const e=await mt.getShadowGraphqlClient().mutate({mutation:Aa,errorPolicy:"all",fetchPolicy:"no-cache",variables:{emailAddress:A,verificationCode:t}});if(e.data?.customerVerifyCode.loginToken){if(!e.data.customerVerifyCode.partner?.id)throw new Error(`Unable to find customer: ${A}`);const t=lt.getMap("customerTokens")||new Map;return t.set(e.data.customerVerifyCode.id,e.data.customerVerifyCode.loginToken),lt.setMap("customerTokens",t),ut(e.data.customerVerifyCode.loginToken),this.customer={...e.data.customerVerifyCode,loginToken:void 0},!0}return!1}async getWorkflowExperience(A,t,e,n){if(!n)return await this.getWorkflowExperienceDeprecated(A,t,e);const i=async A=>{for(const t in A.layouts){const e=A.layouts[t].elements.filter((A=>A.type===E.Illustration));for(let A=0;A<e.length;++A){const t=e[A];t.src&&t.svg&&(t.cachedObjectURL=await dA(t.svg))}const n=A.layouts[t].elements.filter((A=>A.type===E.Textbox));for(let A=0;A<n.length;++A){const t=n[A];t.fontData?.assetUrl&&U(t.fontData.assetUrl)}}},{transaction:a,workflow:o,readOnly:r}=await(async()=>{const A=mt.getShadowGraphqlClient();if(await A.resetStore(),"transaction"===n.type){const{transactionId:t,readOnly:e}=n,i=await A.query({query:vn,variables:{id:t},errorPolicy:"all"});if(!i.data?.transactions||0===i.data.transactions.length)throw new rt("Existing transaction not found.");const a=i.data?.transactions[0];if(!a.workflowId)throw new rt("Existing transaction has no workflow ID.");const o=await ta(a.workflowId);if(!a.product)throw new rt("Failed to load transaction, product not available.");return{transaction:a,workflow:o,readOnly:e}}if("integration"===n.type||"external"===n.type){const t=async()=>{const t="integration"===n.type?{integrationProductId:n.integrationProductId}:{externalIntegrationId:n.externalIntegrationId,externalProductId:n.externalProductId},e=await A.mutate({mutation:xn,variables:{...t,bulk:n.bulk,workflowId:n.workflowId,claim:!0},errorPolicy:"all",fetchPolicy:"no-cache",context:this.options.applicationKey?{headers:{"X-Application-Key":this.options.applicationKey}}:void 0});if(!e.data||!e.data.transactionCreate)throw new rt("Failed to create transaction!");const i=e.data.transactionCreate;if(!i.product)throw new rt("Failed to create transaction, product not available.");return i},e=ta(n.workflowId),[i,a]=await Promise.all([t(),e]);return{transaction:i,workflow:a}}throw new rt("No workflow ID provided.")})();if(this.currencyCode=a.product.partner?.currencyCode,this.experienceOptions={product:a.product,transaction:a,layouts:[],stateMutationFunc:r?async()=>{throw new at("State mutation is forbidden in read only mode!")}:this.updateTransactionState,readOnly:r,workflow:o},"transaction"===n.type&&a.workflowState){const A=JSON.parse(a.workflowState);this.experienceOptions.layouts=Object.values(A.layouts).map((A=>A.layout)),await v(A),await i(A),this.experienceOptions.reloadedState=A}else if(!r&&n.workflowState){const A=JSON.parse(n.workflowState);this.experienceOptions.layouts=Object.values(A.layouts).map((A=>A.layout)),await v(A),await i(A),this.experienceOptions.reloadedState=A}else this.experienceOptions.layouts=ea(this.experienceOptions.transaction,this.experienceOptions.workflow);if(this.experienceOptions.previewService=e&&e(o),this.experienceOptions.renderableContextService=new Dn(this.experienceOptions.layouts),this.experienceOptions.product?.modelUrl&&this.experienceOptions.previewService?.initialize(this.experienceOptions.product.modelUrl,this.experienceOptions.renderableContextService),"transaction"!==n.type){const A=lt.getMap("transactionOwnerIds")||new Map;A.set(a.id,a.transactionOwnerId),Qt(a.transactionOwnerId||""),lt.setMap("transactionOwnerIds",A)}this.initialized=!0;const s=new ji(this,this.experienceOptions);return await s.getWorkflowManager().getInitializationPromise(),"transaction"!==n.type&&this.customer&&await s.attachCustomerDetails({email:this.customer.emailAddress}),s}async initFromIntegrationProduct(A){if(""===A)throw new rt("No integration product ID provided.");const t=mt.getShadowGraphqlClient();await t.resetStore();const e=await t.mutate({mutation:xn,variables:{integrationProductId:A,bulk:this.options.bulk||!1,claim:!0},errorPolicy:"all",fetchPolicy:"no-cache",context:this.options.applicationKey?{headers:{"X-Application-Key":this.options.applicationKey}}:void 0});if(!e.data||!e.data.transactionCreate)throw new rt("Failed to create transaction!");const n=e.data.transactionCreate;if(!n.product)throw new rt("Failed to create transaction, product not available.");this.currencyCode=n.product.partner?.currencyCode;const i=lt.getMap("transactionOwnerIds")||new Map;i.set(n.id,n.transactionOwnerId),Qt(n.transactionOwnerId||""),lt.setMap("transactionOwnerIds",i),this.experienceOptions={product:n.product,transaction:n,layouts:[],stateMutationFunc:this.updateTransactionState},this.initialized=!0}async initFromTransaction(A,t=!1){if(""===A)throw new rt("No transaction ID provided.");const e=mt.getShadowGraphqlClient();await e.resetStore();if(t)return await(async()=>{const n=(await e.query({query:vn,variables:{id:A},errorPolicy:"all"})).data?.transactions[0];if(!n)throw new rt("Failed to read transaction.");if(!n.product)throw new rt("Failed to load transaction, product not available.");this.currencyCode=n.product.partner?.currencyCode,this.experienceOptions={product:n.product,transaction:n,layouts:[],stateMutationFunc:async()=>{throw new at("State mutation is forbidden in read only mode!")},readOnly:t},this.initialized=!0})();const n=lt.getMap("transactionOwnerIds")||new Map,i=n.get(A);if(i){Qt(i);const n=(await e.query({query:vn,variables:{id:A},errorPolicy:"all"})).data?.transactions[0];if(!n)throw new rt("Failed to read transaction.");if(!n.product)throw new rt("Failed to load transaction, product not available.");return this.currencyCode=n.product.partner?.currencyCode,this.experienceOptions={product:n.product,transaction:n,layouts:[],stateMutationFunc:this.updateTransactionState,readOnly:t},void(this.initialized=!0)}try{const i=(await e.mutate({mutation:Sn,variables:{id:A},errorPolicy:"all"})).data?.transactionClaim;if(!i)throw new rt("Failed to read transaction.");if(!i.product)throw new rt("Failed to load transaction, product not available.");this.currencyCode=i.product.partner?.currencyCode,i.transactionOwnerId&&(n.set(i.id,i.transactionOwnerId),Qt(i.transactionOwnerId),lt.setMap("transactionOwnerIds",n)),this.experienceOptions={product:i.product,transaction:i,layouts:[],stateMutationFunc:this.updateTransactionState,readOnly:t},this.initialized=!0}catch{throw new rt("Attempted to access a transaction that isn't available.")}}async getWorkflowExperienceDeprecated(A,t,e){if(!this.initialized||!this.experienceOptions)throw new rt("Cannot launch experience: Not initialized.");const n=async A=>{for(const t in A.layouts){const e=A.layouts[t].elements.filter((A=>A.type===E.Illustration));for(let A=0;A<e.length;++A){const t=e[A];t.src&&t.svg&&(t.cachedObjectURL=await dA(t.svg))}const n=A.layouts[t].elements.filter((A=>A.type===E.Textbox));for(let A=0;A<n.length;++A){const t=n[A];t.fontData?.assetUrl&&U(t.fontData.assetUrl)}}};if(this.experienceOptions.transaction.workflowId){const A=await ta(this.experienceOptions.transaction.workflowId);if(this.experienceOptions.workflow=A,this.experienceOptions.transaction.workflowState){const A=JSON.parse(this.experienceOptions.transaction.workflowState);this.experienceOptions.layouts=Object.values(A.layouts).map((A=>A.layout)),await v(A),await n(A),this.experienceOptions.reloadedState=A}this.experienceOptions.previewService=e&&e(A),this.experienceOptions.renderableContextService=new Dn(this.experienceOptions.layouts),this.experienceOptions.product?.modelUrl&&this.experienceOptions.previewService?.initialize(this.experienceOptions.product.modelUrl,this.experienceOptions.renderableContextService);const t=new ji(this,this.experienceOptions);return await t.getWorkflowManager().getInitializationPromise(),t}if(A){const i=mt.getShadowGraphqlClient().mutate({mutation:Rn,variables:{workflowId:A,id:this.experienceOptions.transaction.id}}),a=ta(A);if(await Promise.all([i,a]),this.experienceOptions.workflow=await a,t){const A=JSON.parse(t);this.experienceOptions.layouts=Object.values(A.layouts).map((A=>A.layout)),await v(A),await n(A),this.experienceOptions.reloadedState=A}else this.experienceOptions.layouts=ea(this.experienceOptions.transaction,this.experienceOptions.workflow);this.experienceOptions.previewService=e&&e(await a),this.experienceOptions.renderableContextService=new Dn(this.experienceOptions.layouts),this.experienceOptions.product?.modelUrl&&this.experienceOptions.previewService?.initialize(this.experienceOptions.product.modelUrl,this.experienceOptions.renderableContextService);const o=new ji(this,this.experienceOptions);return await o.getWorkflowManager().getInitializationPromise(),o}throw new rt("No workflow ID provided.")}getPreviewService(){return this.experienceOptions?.previewService}getProduct(){if(!this.initialized||!this.experienceOptions)throw new rt("Cannot get product: Not initialized.");return this.experienceOptions.product}getTransaction(){if(!this.initialized||!this.experienceOptions)throw new rt("Cannot get transaction: Not initialized.");return this.experienceOptions.transaction}}function ia(A,t,e){return(t=function(A){var t=function(A,t){if("object"!=typeof A||null===A)return A;var e=A[Symbol.toPrimitive];if(void 0!==e){var n=e.call(A,t||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(A)}(A,"string");return"symbol"==typeof t?t:String(t)}(t))in A?Object.defineProperty(A,t,{value:e,enumerable:!0,configurable:!0,writable:!0}):A[t]=e,A}class aa{constructor(){ia(this,"getProduct",void 0),ia(this,"getCommandContext",void 0),ia(this,"getAllLayoutData",void 0),ia(this,"getMetadata",void 0),ia(this,"getWorkflowMetadata",void 0),ia(this,"getStepStorage",void 0),ia(this,"getUpdatesPending",void 0)}getInitializationPromise(){return Promise.resolve()}isInitialized(){return!0}getInformationResults(){return[]}getVariationRecords(){return[]}async reset(){}updateStateWithServer(A){}addVariationRecord(A){return{recordNumber:0,transactionId:"",values:[]}}getCurrentVariationRecord(){}removeVariationRecord(A){return[]}async outstandingRequestsPromise(){}async updateStateWithServerImmediate(A){}addPoller(A){}addConfirmCallback(A){}addCurrentVariationCallback(A){}addEditedCallback(A){}addElementsCallback(A){}addInformationResultCallback(A){}addInitCallback(A){}addMakingAdjustmentsCallback(A){}addMandatoryCallback(A){}addMetadataCallback(A){}addSelectionCallback(A){}addStepSpecificStorageCallback(A,t){}addStorageCallback(A){}addVariationRecordsCallback(A){}getCommandDispatcher(){return A=>{}}getLayouts(){return[]}getLayoutPreviewService(){return{getAll:()=>new Map}}getPreviewService(){}getProfanities(){return[]}getRegionElements(A){return[]}getSerializedStep(A,t){}getStepSpecificServices(A){}getTransaction(){return{id:""}}getTransactionCustomer(){}setTransactionCustomer(){}setTransactionCustomerDetails(){}getWorkflow(){return{id:"",name:"",panels:[],steps:[],showModelOnFinishStep:!1,allowProofDownload:!1,introduction:"",stepGroups:[]}}markStepsAsInitialised(A){}markUpdateCompleted(A){}markUpdatePending(){return"123"}getWorkflowSelections(){return{}}setCurrentAdjustingStepId(A){}setCurrentVariationRecord(A){}setEditedStatus(A,t){}setInformationResults(A){}setMandatoryFulfilled(A,t){}async setSelectionsAndElements(A,t,e){}setVariationRecords(A){}toggleDesignConfirmed(){}updateMetadata(A,t){}async updateStorage(A,t){}}function oa(A,t,e){return(t=function(A){var t=function(A,t){if("object"!=typeof A||null===A)return A;var e=A[Symbol.toPrimitive];if(void 0!==e){var n=e.call(A,t||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(A)}(A,"string");return"symbol"==typeof t?t:String(t)}(t))in A?Object.defineProperty(A,t,{value:e,enumerable:!0,configurable:!0,writable:!0}):A[t]=e,A}let ra;var sa;(sa=ra||(ra={})).SelectFrame="SelectFrame",sa.SelectImage="SelectImage",sa.Position="Position";class ca extends pi{constructor(A,t){super(A,t),oa(this,"frameService",this.manager.getStepSpecificServices(this.getId())?.frameService)}selectVariant(A){const t=this.manager.getRegionElements(this.step.stepName);return ti.selectVariant(this.step,A.getResource(),t,this.manager,(A=>this.setUpdateState(A)))}onFrameDataChanged(A){this.frameService&&this.frameService.onFrameDataChanged((t=>{t&&A(t)}))}selectImage(A){return ti.selectImage(this.step,A,this.manager)}getImageData(){if(this.frameService)return this.frameService.getImageData()}getCurrentFrameStep(A,t,e,n){return n&&n.length>1&&void 0===A?ra.SelectFrame:t||e||this.getImageData()?ra.Position:ra.SelectImage}getFrameService(){return this.frameService}hasOverlayImageKey(){return this.step.data.overlayImageKey}hasOverlayImageUrl(){return this.step.data.overlayImageUrl}hasVaryingUpload(){return this.step.data.varyUpload}hasVaryingSelection(){return this.step.data.varySelection}}const ga=A=>{const t=kA(null),e=kA(void 0),[n,i]=NA(void 0),{addEvent:a,removeEvent:o,updateEvent:r,eventCache:s}=Gt(),[c,g]=NA(!1),[B,l]=NA(!1),{state:w,uiDispatcher:d}=Vt(),E=RA((A=>{const t=A;d(new Kt({zoom:Math.max(.1,Math.min(t,w.maxZoom))}))}),[d,w.maxZoom]),h=RA((A=>{o(A),1===s.length&&(e.current=void 0),2===s.length&&i(void 0);"touch"===A.pointerType&&s.length>1&&s.length-1==1&&(l(!1),g(!1))}),[o,s.length]),Q=RA((A=>{a(A);"touch"===A.pointerType&&1===s.length&&(d(new Kt({selectedElement:void 0})),l(!0),g(!0))}),[a,s.length,d]),C=RA((A=>{r(A);const t=1===s.length&&"touch"!==s[0].pointerType,a=2===s.length&&"touch"===s[0].pointerType;if(c&&a){const[A,t]=s,e=Math.abs(A.clientX-t.clientX),a=n;a&&E(w.zoom-.0055*(a-e)),i(e)}if(B&&(t||a)&&A.isPrimary){const t=(e?.current?.x||A.screenX)-A.screenX,n=(e?.current?.y||A.screenY)-A.screenY;d(new Kt({selectedElement:void 0,xTranslation:w.xTranslation-t/w.zoom,yTranslation:w.yTranslation-n/w.zoom}))}A.isPrimary&&(e.current={x:A.screenX,y:A.screenY})}),[r,s,c,B,n,E,w.zoom,w.xTranslation,w.yTranslation,d]),u=RA((A=>{c&&E(w.zoom-.035*Math.sign(A.deltaY))}),[E,w.zoom,c]);UA((()=>{if(!t.current||0===s.length)return;const A=s[0].pointerId,e=t.current.hasPointerCapture(A);B&&!e&&t.current.setPointerCapture(A),!B&&e&&t.current.releasePointerCapture(A)}),[t,B,s]),Pe([" "],(()=>{l(!0),d(new Kt({selectedElement:void 0}))}),(()=>l(!1))),Pe(["Control"],(()=>g(!0)),(()=>g(!1)));const D=GA((()=>({cursor:B&&0===s.length?"grab":B&&1===s.length?"grabbing":c?"zoom-in":void 0,width:"100%",height:"100%",overflow:"clip"})),[B,c,s]);return bA("div",{ref:t,className:"transform-wrapper",onWheel:u,onPointerDown:Q,onPointerUp:h,onPointerCancel:h,onPointerLeave:h,onPointerMove:C,style:D,children:A.children})};export{na as SpiffCommerceClient,A as CommandContext,dt as spiffCoreConfiguration,Je as PromiseQueue,be as QueueablePromise,aa as MockWorkflowManager,Ei as InformationMessageType,pi as StepHandle,Ri as TextStepHandle,ca as FrameStepHandle,Mi as BulkStepHandle,Ni as ShapeStepHandle,Fi as IllustrationStepHandle,Yi as MaterialStepHandle,xi as ModelStepHandle,Si as PictureStepHandle,vi as QuestionStepHandle,qt as BulkPriceCalculationStrategy,Di as Variant,_A as OptionNotFoundError,At as LayoutNotFoundError,tt as AssetNotFoundError,et as ResourceNotFoundError,nt as MisconfigurationError,ot as ParseError,at as UnhandledBehaviorError,vt as assetService,Ti as designService,Ji as createDesign,Ut as optionService,lt as persistenceService,mt as graphQlManager,oe as toast,Vn as FrameService,jn as getBoundedOffsets,ti as frameStepService,ii as modelStepService,ni as materialStepService,si as shapeStepService,ri as questionStepService,_n as digitalContentStepService,ai as moduleStepService,oi as pictureStepService,wi as textStepService,ei as illustrationStepService,Wt as ProductCameraRig,ra as FrameStep,$t as ConversionLocation,Ae as ConversionDataType,ta as getWorkflow,t as AssetType,e as BringForwardCommand,n as BringToFrontCommand,i as BringToBackCommand,a as CanvasCommand,o as CreateElementCommand,r as CreateLayoutCommand,s as DeleteElementCommand,c as FontAlignmentCommand,g as FontColorCommand,B as FontSizeCommand,l as FontSourceCommand,w as GroupCommand,d as LayoutElementFactory,E as LayoutElementType,h as MoveCommand,Q as ResizeCommand,C as RotateCommand,u as SendBackwardsCommand,ee as StakeholderType,D as StepAspectType,m as StepType,p as TextChangeCommand,I as UnitOfMeasurement,f as dataUrlFromExternalUrl,y as findElement,M as frameDataCache,F as generate,Y as getAxisAlignedBoundingBox,x as generateSVGWithUnknownColors,S as getAttributesFromArrayBuffer,v as rehydrateSerializedLayout,N as getFrameData,R as getSvgElement,H as loadFontFromDataUrl,U as loadFontFromExternalUrl,P as determineCorrectFontSizeAndLines,G as patternImageDataCache,Cn as generateCommands,k as registerJSDOM,Re as minZoom,Yn as AdvancedEditor,ga as TransformWrapper,Fn as EditorCore,kt as useLayouts,Vt as useEditorState,Ue as useEditorInteraction,Pe as useShortcutCombination,Tt as commandReducer,Ot as getDefaultState,Pt as CommandContextContext,jt as AdvancedEditorStateProvider,zt as AdvancedEditorContext,Kt as UICommand,Jt as EditorSubMenu,re as ElementEventType,ce as KeyEvent,Gn as gatherVaryingStepAspects};
1102
+ `,ta=async A=>{const t=(await mt.getShadowGraphqlClient().query({query:Vi,errorPolicy:"all",fetchPolicy:"no-cache",variables:{id:A}})).data.workflow;return t.steps.forEach((A=>{delete A.data.__typename})),t},ea=(A,t)=>{const e=A.workflowState,n=e?JSON.parse(e):void 0;return n?Object.values(n.layouts).map((A=>A.layout)):t.panels.sort(((A,t)=>A.index-t.index)).map((A=>({id:F(),panelId:A.name,name:A.name,index:A.index,createdAt:new Date,updatedAt:new Date,transparentBackground:A.transparentBackground,height:A.height,width:A.width,previewRegion:A.previewRegion,useEditableArea:A.useEditableArea,editableArea:A.editableArea})))};class na{constructor(A){var t;Ki(this,"options",void 0),Ki(this,"initialized",void 0),Ki(this,"experienceOptions",void 0),Ki(this,"currencyCode",void 0),Ki(this,"customer",void 0),Ki(this,"updateTransactionState",(async A=>{try{return mt.getShadowGraphqlClient().mutate({...A,mutation:Nn})}catch(A){throw console.error(A),new rt("Critical - Unable to synchronize workflow state with server.")}})),this.initialized=!1,this.options=A,this.options.applicationKey&&(t=this.options.applicationKey,Dt=t)}getAssetManager(){return vt}getCurrencyCode(){if(void 0===this.currencyCode)throw new Error("No currency code set.");return this.currencyCode}async authenticateTransactionFromLocalStorage(A){const t=mt.getShadowGraphqlClient(),e=await t.query({query:Wi,errorPolicy:"all",fetchPolicy:"no-cache",variables:{id:A}});if(!e.data.transactions||0===e.data.transactions.length)throw new Error(`Transaction not found: ${A}`);const n=e.data.transactions[0],i=n.product?.partner?.id;if(!i)throw new Error(`Unable to read transaction: ${A}`);if(n.isOrdered)return Promise.resolve({success:!1,transactionReadOnly:!0});const a=lt.getMap("transactionOwnerIds");if(a?.has(A)){const t=a.get(A);return Qt(t),Promise.resolve({success:!0,stakeholderType:ee.Owner})}const o=lt.getMap("transactionCustomerIds");if(o?.has(A)){const t=o.get(A);if(t){if(await this.authenticateCustomerId(t)){const t=this.customer?.stakeholders?.find((t=>t.transaction?.id===A));if(t)return Promise.resolve({success:!0,stakeholderType:t.type})}}}const r=(await t.query({query:Xi,errorPolicy:"all",variables:{id:n.workflowId}})).data.workflow;if(!r)throw new Error(`Unable to read workflow: ${n.workflowId}`);return Promise.resolve({success:!1,theme:r.overrideTheme,customLogoLink:n.customLogoLink})}clearCustomer(){this.customer=void 0}clearCustomerForTransaction(A){const t=lt.getMap("transactionCustomerIds");t?.has(A)&&(t.delete(A),lt.setMap("transactionCustomerIds",t))}getStakeholderTypeForTransaction(A){const t=this.customer?.stakeholders?.find((t=>t.transaction?.id===A));if(t)return t.type}async getOrCreateCustomer(A){this.customer=void 0;const t=mt.getShadowGraphqlClient(),e=(await t.query({query:qi,errorPolicy:"all",fetchPolicy:"no-cache",variables:{emailAddress:A}})).data.customer;if(!e.id){const e=(await t.mutate({mutation:Zi,errorPolicy:"all",fetchPolicy:"no-cache",variables:{details:{emailAddress:A}}})).data?.customerCreate;if(!e)throw new Error("Unable to create customer.");return this.customer=e,{customer:e,isAuthenticated:!1}}const n=await this.authenticateCustomerId(e.id);return{customer:this.customer||e,isAuthenticated:n}}async authenticateCustomerId(A){const t=mt.getShadowGraphqlClient(),e=lt.getMap("customerTokens");if(!e?.has(A))return!1;const n=e.get(A);if(!n)return!1;const i=(await t.mutate({mutation:$i,errorPolicy:"all",fetchPolicy:"no-cache",variables:{loginToken:n}})).data?.customerAuthenticate;return!!i&&(ut(n),this.customer=i,!0)}async generateVerificationCode(A){await mt.getShadowGraphqlClient().mutate({mutation:_i,variables:{emailAddress:A}})}async verifyCode(A,t){const e=await mt.getShadowGraphqlClient().mutate({mutation:Aa,errorPolicy:"all",fetchPolicy:"no-cache",variables:{emailAddress:A,verificationCode:t}});if(e.data?.customerVerifyCode.loginToken){if(!e.data.customerVerifyCode.partner?.id)throw new Error(`Unable to find customer: ${A}`);const t=lt.getMap("customerTokens")||new Map;return t.set(e.data.customerVerifyCode.id,e.data.customerVerifyCode.loginToken),lt.setMap("customerTokens",t),ut(e.data.customerVerifyCode.loginToken),this.customer={...e.data.customerVerifyCode,loginToken:void 0},!0}return!1}async getWorkflowExperience(A,t,e,n){if(!n)return await this.getWorkflowExperienceDeprecated(A,t,e);const i=async A=>{for(const t in A.layouts){const e=A.layouts[t].elements.filter((A=>A.type===E.Illustration));for(let A=0;A<e.length;++A){const t=e[A];t.src&&t.svg&&(t.cachedObjectURL=await dA(t.svg))}const n=A.layouts[t].elements.filter((A=>A.type===E.Textbox));for(let A=0;A<n.length;++A){const t=n[A];t.fontData?.assetUrl&&U(t.fontData.assetUrl)}}},{transaction:a,workflow:o,readOnly:r}=await(async()=>{const A=mt.getShadowGraphqlClient();if(await A.resetStore(),"transaction"===n.type){const{transactionId:t,readOnly:e}=n,i=await A.query({query:vn,variables:{id:t},errorPolicy:"all"});if(!i.data?.transactions||0===i.data.transactions.length)throw new rt("Existing transaction not found.");const a=i.data?.transactions[0];if(!a.workflowId)throw new rt("Existing transaction has no workflow ID.");const o=await ta(a.workflowId);if(!a.product)throw new rt("Failed to load transaction, product not available.");return{transaction:a,workflow:o,readOnly:e}}if("integration"===n.type||"external"===n.type){const t=async()=>{const t="integration"===n.type?{integrationProductId:n.integrationProductId}:{externalIntegrationId:n.externalIntegrationId,externalProductId:n.externalProductId},e=await A.mutate({mutation:xn,variables:{...t,bulk:n.bulk,workflowId:n.workflowId,claim:!0},errorPolicy:"all",fetchPolicy:"no-cache",context:this.options.applicationKey?{headers:{"X-Application-Key":this.options.applicationKey}}:void 0});if(!e.data||!e.data.transactionCreate)throw new rt("Failed to create transaction!");const i=e.data.transactionCreate;if(!i.product)throw new rt("Failed to create transaction, product not available.");return i},e=ta(n.workflowId),[i,a]=await Promise.all([t(),e]);return{transaction:i,workflow:a}}throw new rt("No workflow ID provided.")})();if(this.currencyCode=a.product.partner?.currencyCode,this.experienceOptions={product:a.product,transaction:a,layouts:[],stateMutationFunc:r?async()=>{throw new at("State mutation is forbidden in read only mode!")}:this.updateTransactionState,readOnly:r,workflow:o},"transaction"===n.type&&a.workflowState){const A=JSON.parse(a.workflowState);this.experienceOptions.layouts=Object.values(A.layouts).map((A=>A.layout)),await v(A),await i(A),this.experienceOptions.reloadedState=A}else if(!r&&n.workflowState){const A=JSON.parse(n.workflowState);this.experienceOptions.layouts=Object.values(A.layouts).map((A=>A.layout)),await v(A),await i(A),this.experienceOptions.reloadedState=A}else this.experienceOptions.layouts=ea(this.experienceOptions.transaction,this.experienceOptions.workflow);if(this.experienceOptions.previewService=e&&e(o),this.experienceOptions.renderableContextService=new Dn(this.experienceOptions.layouts),this.experienceOptions.product?.modelUrl&&this.experienceOptions.previewService?.initialize(this.experienceOptions.product.modelUrl,this.experienceOptions.renderableContextService),"transaction"!==n.type){const A=lt.getMap("transactionOwnerIds")||new Map;A.set(a.id,a.transactionOwnerId),Qt(a.transactionOwnerId||""),lt.setMap("transactionOwnerIds",A)}else{const A=(lt.getMap("transactionOwnerIds")||new Map).get(a.id);A&&Qt(A)}this.initialized=!0;const s=new ji(this,this.experienceOptions);return await s.getWorkflowManager().getInitializationPromise(),"transaction"!==n.type&&this.customer&&await s.attachCustomerDetails({email:this.customer.emailAddress}),s}async initFromIntegrationProduct(A){if(""===A)throw new rt("No integration product ID provided.");const t=mt.getShadowGraphqlClient();await t.resetStore();const e=await t.mutate({mutation:xn,variables:{integrationProductId:A,bulk:this.options.bulk||!1,claim:!0},errorPolicy:"all",fetchPolicy:"no-cache",context:this.options.applicationKey?{headers:{"X-Application-Key":this.options.applicationKey}}:void 0});if(!e.data||!e.data.transactionCreate)throw new rt("Failed to create transaction!");const n=e.data.transactionCreate;if(!n.product)throw new rt("Failed to create transaction, product not available.");this.currencyCode=n.product.partner?.currencyCode;const i=lt.getMap("transactionOwnerIds")||new Map;i.set(n.id,n.transactionOwnerId),Qt(n.transactionOwnerId||""),lt.setMap("transactionOwnerIds",i),this.experienceOptions={product:n.product,transaction:n,layouts:[],stateMutationFunc:this.updateTransactionState},this.initialized=!0}async initFromTransaction(A,t=!1){if(""===A)throw new rt("No transaction ID provided.");const e=mt.getShadowGraphqlClient();await e.resetStore();if(t)return await(async()=>{const n=(await e.query({query:vn,variables:{id:A},errorPolicy:"all"})).data?.transactions[0];if(!n)throw new rt("Failed to read transaction.");if(!n.product)throw new rt("Failed to load transaction, product not available.");this.currencyCode=n.product.partner?.currencyCode,this.experienceOptions={product:n.product,transaction:n,layouts:[],stateMutationFunc:async()=>{throw new at("State mutation is forbidden in read only mode!")},readOnly:t},this.initialized=!0})();const n=lt.getMap("transactionOwnerIds")||new Map,i=n.get(A);if(i){Qt(i);const n=(await e.query({query:vn,variables:{id:A},errorPolicy:"all"})).data?.transactions[0];if(!n)throw new rt("Failed to read transaction.");if(!n.product)throw new rt("Failed to load transaction, product not available.");return this.currencyCode=n.product.partner?.currencyCode,this.experienceOptions={product:n.product,transaction:n,layouts:[],stateMutationFunc:this.updateTransactionState,readOnly:t},void(this.initialized=!0)}try{const i=(await e.mutate({mutation:Sn,variables:{id:A},errorPolicy:"all"})).data?.transactionClaim;if(!i)throw new rt("Failed to read transaction.");if(!i.product)throw new rt("Failed to load transaction, product not available.");this.currencyCode=i.product.partner?.currencyCode,i.transactionOwnerId&&(n.set(i.id,i.transactionOwnerId),Qt(i.transactionOwnerId),lt.setMap("transactionOwnerIds",n)),this.experienceOptions={product:i.product,transaction:i,layouts:[],stateMutationFunc:this.updateTransactionState,readOnly:t},this.initialized=!0}catch{throw new rt("Attempted to access a transaction that isn't available.")}}async getWorkflowExperienceDeprecated(A,t,e){if(!this.initialized||!this.experienceOptions)throw new rt("Cannot launch experience: Not initialized.");const n=async A=>{for(const t in A.layouts){const e=A.layouts[t].elements.filter((A=>A.type===E.Illustration));for(let A=0;A<e.length;++A){const t=e[A];t.src&&t.svg&&(t.cachedObjectURL=await dA(t.svg))}const n=A.layouts[t].elements.filter((A=>A.type===E.Textbox));for(let A=0;A<n.length;++A){const t=n[A];t.fontData?.assetUrl&&U(t.fontData.assetUrl)}}};if(this.experienceOptions.transaction.workflowId){const A=await ta(this.experienceOptions.transaction.workflowId);if(this.experienceOptions.workflow=A,this.experienceOptions.transaction.workflowState){const A=JSON.parse(this.experienceOptions.transaction.workflowState);this.experienceOptions.layouts=Object.values(A.layouts).map((A=>A.layout)),await v(A),await n(A),this.experienceOptions.reloadedState=A}this.experienceOptions.previewService=e&&e(A),this.experienceOptions.renderableContextService=new Dn(this.experienceOptions.layouts),this.experienceOptions.product?.modelUrl&&this.experienceOptions.previewService?.initialize(this.experienceOptions.product.modelUrl,this.experienceOptions.renderableContextService);const t=new ji(this,this.experienceOptions);return await t.getWorkflowManager().getInitializationPromise(),t}if(A){const i=mt.getShadowGraphqlClient().mutate({mutation:Rn,variables:{workflowId:A,id:this.experienceOptions.transaction.id}}),a=ta(A);if(await Promise.all([i,a]),this.experienceOptions.workflow=await a,t){const A=JSON.parse(t);this.experienceOptions.layouts=Object.values(A.layouts).map((A=>A.layout)),await v(A),await n(A),this.experienceOptions.reloadedState=A}else this.experienceOptions.layouts=ea(this.experienceOptions.transaction,this.experienceOptions.workflow);this.experienceOptions.previewService=e&&e(await a),this.experienceOptions.renderableContextService=new Dn(this.experienceOptions.layouts),this.experienceOptions.product?.modelUrl&&this.experienceOptions.previewService?.initialize(this.experienceOptions.product.modelUrl,this.experienceOptions.renderableContextService);const o=new ji(this,this.experienceOptions);return await o.getWorkflowManager().getInitializationPromise(),o}throw new rt("No workflow ID provided.")}getPreviewService(){return this.experienceOptions?.previewService}getProduct(){if(!this.initialized||!this.experienceOptions)throw new rt("Cannot get product: Not initialized.");return this.experienceOptions.product}getTransaction(){if(!this.initialized||!this.experienceOptions)throw new rt("Cannot get transaction: Not initialized.");return this.experienceOptions.transaction}}function ia(A,t,e){return(t=function(A){var t=function(A,t){if("object"!=typeof A||null===A)return A;var e=A[Symbol.toPrimitive];if(void 0!==e){var n=e.call(A,t||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(A)}(A,"string");return"symbol"==typeof t?t:String(t)}(t))in A?Object.defineProperty(A,t,{value:e,enumerable:!0,configurable:!0,writable:!0}):A[t]=e,A}class aa{constructor(){ia(this,"getProduct",void 0),ia(this,"getCommandContext",void 0),ia(this,"getAllLayoutData",void 0),ia(this,"getMetadata",void 0),ia(this,"getWorkflowMetadata",void 0),ia(this,"getStepStorage",void 0),ia(this,"getUpdatesPending",void 0)}getInitializationPromise(){return Promise.resolve()}isInitialized(){return!0}getInformationResults(){return[]}getVariationRecords(){return[]}async reset(){}updateStateWithServer(A){}addVariationRecord(A){return{recordNumber:0,transactionId:"",values:[]}}getCurrentVariationRecord(){}removeVariationRecord(A){return[]}async outstandingRequestsPromise(){}async updateStateWithServerImmediate(A){}addPoller(A){}addConfirmCallback(A){}addCurrentVariationCallback(A){}addEditedCallback(A){}addElementsCallback(A){}addInformationResultCallback(A){}addInitCallback(A){}addMakingAdjustmentsCallback(A){}addMandatoryCallback(A){}addMetadataCallback(A){}addSelectionCallback(A){}addStepSpecificStorageCallback(A,t){}addStorageCallback(A){}addVariationRecordsCallback(A){}getCommandDispatcher(){return A=>{}}getLayouts(){return[]}getLayoutPreviewService(){return{getAll:()=>new Map}}getPreviewService(){}getProfanities(){return[]}getRegionElements(A){return[]}getSerializedStep(A,t){}getStepSpecificServices(A){}getTransaction(){return{id:""}}getTransactionCustomer(){}setTransactionCustomer(){}setTransactionCustomerDetails(){}getWorkflow(){return{id:"",name:"",panels:[],steps:[],showModelOnFinishStep:!1,allowProofDownload:!1,introduction:"",stepGroups:[]}}markStepsAsInitialised(A){}markUpdateCompleted(A){}markUpdatePending(){return"123"}getWorkflowSelections(){return{}}setCurrentAdjustingStepId(A){}setCurrentVariationRecord(A){}setEditedStatus(A,t){}setInformationResults(A){}setMandatoryFulfilled(A,t){}async setSelectionsAndElements(A,t,e){}setVariationRecords(A){}toggleDesignConfirmed(){}updateMetadata(A,t){}async updateStorage(A,t){}}function oa(A,t,e){return(t=function(A){var t=function(A,t){if("object"!=typeof A||null===A)return A;var e=A[Symbol.toPrimitive];if(void 0!==e){var n=e.call(A,t||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(A)}(A,"string");return"symbol"==typeof t?t:String(t)}(t))in A?Object.defineProperty(A,t,{value:e,enumerable:!0,configurable:!0,writable:!0}):A[t]=e,A}let ra;var sa;(sa=ra||(ra={})).SelectFrame="SelectFrame",sa.SelectImage="SelectImage",sa.Position="Position";class ca extends pi{constructor(A,t){super(A,t),oa(this,"frameService",this.manager.getStepSpecificServices(this.getId())?.frameService)}selectVariant(A){const t=this.manager.getRegionElements(this.step.stepName);return ti.selectVariant(this.step,A.getResource(),t,this.manager,(A=>this.setUpdateState(A)))}onFrameDataChanged(A){this.frameService&&this.frameService.onFrameDataChanged((t=>{t&&A(t)}))}selectImage(A){return ti.selectImage(this.step,A,this.manager)}getImageData(){if(this.frameService)return this.frameService.getImageData()}getCurrentFrameStep(A,t,e,n){return n&&n.length>1&&void 0===A?ra.SelectFrame:t||e||this.getImageData()?ra.Position:ra.SelectImage}getFrameService(){return this.frameService}hasOverlayImageKey(){return this.step.data.overlayImageKey}hasOverlayImageUrl(){return this.step.data.overlayImageUrl}hasVaryingUpload(){return this.step.data.varyUpload}hasVaryingSelection(){return this.step.data.varySelection}}const ga=A=>{const t=kA(null),e=kA(void 0),[n,i]=NA(void 0),{addEvent:a,removeEvent:o,updateEvent:r,eventCache:s}=Gt(),[c,g]=NA(!1),[B,l]=NA(!1),{state:w,uiDispatcher:d}=Vt(),E=RA((A=>{const t=A;d(new Kt({zoom:Math.max(.1,Math.min(t,w.maxZoom))}))}),[d,w.maxZoom]),h=RA((A=>{o(A),1===s.length&&(e.current=void 0),2===s.length&&i(void 0);"touch"===A.pointerType&&s.length>1&&s.length-1==1&&(l(!1),g(!1))}),[o,s.length]),Q=RA((A=>{a(A);"touch"===A.pointerType&&1===s.length&&(d(new Kt({selectedElement:void 0})),l(!0),g(!0))}),[a,s.length,d]),C=RA((A=>{r(A);const t=1===s.length&&"touch"!==s[0].pointerType,a=2===s.length&&"touch"===s[0].pointerType;if(c&&a){const[A,t]=s,e=Math.abs(A.clientX-t.clientX),a=n;a&&E(w.zoom-.0055*(a-e)),i(e)}if(B&&(t||a)&&A.isPrimary){const t=(e?.current?.x||A.screenX)-A.screenX,n=(e?.current?.y||A.screenY)-A.screenY;d(new Kt({selectedElement:void 0,xTranslation:w.xTranslation-t/w.zoom,yTranslation:w.yTranslation-n/w.zoom}))}A.isPrimary&&(e.current={x:A.screenX,y:A.screenY})}),[r,s,c,B,n,E,w.zoom,w.xTranslation,w.yTranslation,d]),u=RA((A=>{c&&E(w.zoom-.035*Math.sign(A.deltaY))}),[E,w.zoom,c]);UA((()=>{if(!t.current||0===s.length)return;const A=s[0].pointerId,e=t.current.hasPointerCapture(A);B&&!e&&t.current.setPointerCapture(A),!B&&e&&t.current.releasePointerCapture(A)}),[t,B,s]),Pe([" "],(()=>{l(!0),d(new Kt({selectedElement:void 0}))}),(()=>l(!1))),Pe(["Control"],(()=>g(!0)),(()=>g(!1)));const D=GA((()=>({cursor:B&&0===s.length?"grab":B&&1===s.length?"grabbing":c?"zoom-in":void 0,width:"100%",height:"100%",overflow:"clip"})),[B,c,s]);return bA("div",{ref:t,className:"transform-wrapper",onWheel:u,onPointerDown:Q,onPointerUp:h,onPointerCancel:h,onPointerLeave:h,onPointerMove:C,style:D,children:A.children})};export{na as SpiffCommerceClient,A as CommandContext,dt as spiffCoreConfiguration,Je as PromiseQueue,be as QueueablePromise,aa as MockWorkflowManager,Ei as InformationMessageType,pi as StepHandle,Ri as TextStepHandle,ca as FrameStepHandle,Mi as BulkStepHandle,Ni as ShapeStepHandle,Fi as IllustrationStepHandle,Yi as MaterialStepHandle,xi as ModelStepHandle,Si as PictureStepHandle,vi as QuestionStepHandle,qt as BulkPriceCalculationStrategy,Di as Variant,_A as OptionNotFoundError,At as LayoutNotFoundError,tt as AssetNotFoundError,et as ResourceNotFoundError,nt as MisconfigurationError,ot as ParseError,at as UnhandledBehaviorError,vt as assetService,Ti as designService,Ji as createDesign,Ut as optionService,lt as persistenceService,mt as graphQlManager,oe as toast,Vn as FrameService,jn as getBoundedOffsets,ti as frameStepService,ii as modelStepService,ni as materialStepService,si as shapeStepService,ri as questionStepService,_n as digitalContentStepService,ai as moduleStepService,oi as pictureStepService,wi as textStepService,ei as illustrationStepService,Wt as ProductCameraRig,ra as FrameStep,$t as ConversionLocation,Ae as ConversionDataType,ta as getWorkflow,t as AssetType,e as BringForwardCommand,n as BringToFrontCommand,i as BringToBackCommand,a as CanvasCommand,o as CreateElementCommand,r as CreateLayoutCommand,s as DeleteElementCommand,c as FontAlignmentCommand,g as FontColorCommand,B as FontSizeCommand,l as FontSourceCommand,w as GroupCommand,d as LayoutElementFactory,E as LayoutElementType,h as MoveCommand,Q as ResizeCommand,C as RotateCommand,u as SendBackwardsCommand,ee as StakeholderType,D as StepAspectType,m as StepType,p as TextChangeCommand,I as UnitOfMeasurement,f as dataUrlFromExternalUrl,y as findElement,M as frameDataCache,F as generate,Y as getAxisAlignedBoundingBox,x as generateSVGWithUnknownColors,S as getAttributesFromArrayBuffer,v as rehydrateSerializedLayout,N as getFrameData,R as getSvgElement,H as loadFontFromDataUrl,U as loadFontFromExternalUrl,P as determineCorrectFontSizeAndLines,G as patternImageDataCache,Cn as generateCommands,k as registerJSDOM,Re as minZoom,Yn as AdvancedEditor,ga as TransformWrapper,Fn as EditorCore,kt as useLayouts,Vt as useEditorState,Ue as useEditorInteraction,Pe as useShortcutCombination,Tt as commandReducer,Ot as getDefaultState,Pt as CommandContextContext,jt as AdvancedEditorStateProvider,zt as AdvancedEditorContext,Kt as UICommand,Jt as EditorSubMenu,re as ElementEventType,ce as KeyEvent,Gn as gatherVaryingStepAspects};
1103
1103
  //# sourceMappingURL=module.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@spiffcommerce/core",
3
- "version": "11.1.1",
3
+ "version": "11.1.2",
4
4
  "description": "Core client API for interacting with the Spiff Commerce backend.",
5
5
  "source": "src/index.ts",
6
6
  "main": "dist/main.js",