@spiffcommerce/core 21.15.2 → 21.15.3

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
@@ -3044,7 +3044,7 @@ class Ka {
3044
3044
  constructor() {
3045
3045
  this.cachedColors = /* @__PURE__ */ new Map(), this.filterUnsupportedCharacters = (e, t) => {
3046
3046
  let A = e.replace(
3047
- /(\r\n|\r|(\u00a9|\u00ae|[\u2000-\u2017]|[\u201E-\u3300]]|\ud83c[\ud000-\udfff]|\ud83d[\ud000-\udfff]|\ud83e[\ud000-\udfff]))/gm,
3047
+ /(\r\n|\r|(\u2665|\u00a9|\u00ae|[\u2000-\u2017]|[\u201E-\u3300]]|\ud83c[\ud000-\udfff]|\ud83d[\ud000-\udfff]|\ud83e[\ud000-\udfff]))/gm,
3048
3048
  ""
3049
3049
  );
3050
3050
  const a = [], n = t ? NA(t.assetUrl) : void 0;
@@ -675,7 +675,7 @@
675
675
  />
676
676
  </svg>
677
677
  `,Q={};Q[this.shapeFillId]={browserValue:C};const m=l.generate();return{id:m,region:B,command:new l.CreateElementCommand({stepRegion:B,stepName:e.stepName,colors:Q,id:m,svg:E,type:l.LayoutElementType.Illustration,y:B.top,x:B.left,rotation:B.rotation,width:B.width,height:B.height,layer:B.layer,layerIndex:B.layerIndex,immutable:B.immutable,excludeFromExport:e.data.excludeFromPrint},h)}},g=e.data.regions.map(r),w=g.filter(B=>!!B).map(B=>B==null?void 0:B.command),d=g.filter(B=>!!B).map(B=>({id:B.id,region:B.region}));return{command:new l.GroupCommand(w),followup:async()=>{await n.setSelectionsAndElements(e.stepName,t.variant?[t.variant]:[],d,async()=>{n.updateStorage(e.stepName,{colour:o()})})}}}}}const ae=new an;class on{constructor(){this.latestToast=null,this.toastType=null,this.toastCallbacks=[]}addToastCallback(e){e({toastMessage:this.latestToast,toastType:this.toastType}),this.toastCallbacks.push(e)}removeToastCallback(e){this.toastCallbacks=this.toastCallbacks.filter(t=>t!==e)}setLatestToast(e,t){this.latestToast=e,this.toastType=t,this.onToastChange()}onToastChange(){this.toastCallbacks.forEach(e=>e({toastMessage:this.latestToast,toastType:this.toastType}))}}const Nt=new on,Le=30;class Me extends Error{constructor(e){super(e),Object.setPrototypeOf(this,new.target.prototype),this.name=Me.name}}const sn=["‘","’","“","”",`
678
- `];class ye extends Error{constructor(e){super(e),Object.setPrototypeOf(this,new.target.prototype),this.name=ye.name}}class rn{constructor(){this.cachedColors=new Map,this.filterUnsupportedCharacters=(e,t)=>{let A=e.replace(/(\r\n|\r|(\u00a9|\u00ae|[\u2000-\u2017]|[\u201E-\u3300]]|\ud83c[\ud000-\udfff]|\ud83d[\ud000-\udfff]|\ud83e[\ud000-\udfff]))/gm,"");const n=[],a=t?l.getFontMetrics(t.assetUrl):void 0;if(a){const i=A.split("").filter(s=>!sn.includes(s)).join(""),o=i.split("").map(s=>a.getFont().charToGlyph(s));for(let s=0;s<o.length;s++)o[s].name===".notdef"&&n.push(String.fromCharCode(i.charCodeAt(s)))}for(let i=0;i<n.length;i++)A=A.replaceAll(n[i],"");return A},this.textAlign=e=>e.vertical?"center":e.textAlign||"center",this.getErrorsForText=(e,t,A)=>{const n=[];t.data&&t.data.maxLength&&e.length>t.data.maxLength&&n.push({localizationKey:"workflow.steps.text.characterLimit"});const a=A.getProfanities(),i=He.split(e.toLowerCase());for(const s of i)for(const r in a){const g=a[r].toLowerCase().replace(/\s/g,"");if(s===g){n.push({localizationKey:"workflow.steps.text.blockedProfanity"});break}}return!t.data.allowNewlines&&(e.includes(`
678
+ `];class ye extends Error{constructor(e){super(e),Object.setPrototypeOf(this,new.target.prototype),this.name=ye.name}}class rn{constructor(){this.cachedColors=new Map,this.filterUnsupportedCharacters=(e,t)=>{let A=e.replace(/(\r\n|\r|(\u2665|\u00a9|\u00ae|[\u2000-\u2017]|[\u201E-\u3300]]|\ud83c[\ud000-\udfff]|\ud83d[\ud000-\udfff]|\ud83e[\ud000-\udfff]))/gm,"");const n=[],a=t?l.getFontMetrics(t.assetUrl):void 0;if(a){const i=A.split("").filter(s=>!sn.includes(s)).join(""),o=i.split("").map(s=>a.getFont().charToGlyph(s));for(let s=0;s<o.length;s++)o[s].name===".notdef"&&n.push(String.fromCharCode(i.charCodeAt(s)))}for(let i=0;i<n.length;i++)A=A.replaceAll(n[i],"");return A},this.textAlign=e=>e.vertical?"center":e.textAlign||"center",this.getErrorsForText=(e,t,A)=>{const n=[];t.data&&t.data.maxLength&&e.length>t.data.maxLength&&n.push({localizationKey:"workflow.steps.text.characterLimit"});const a=A.getProfanities(),i=He.split(e.toLowerCase());for(const s of i)for(const r in a){const g=a[r].toLowerCase().replace(/\s/g,"");if(s===g){n.push({localizationKey:"workflow.steps.text.blockedProfanity"});break}}return!t.data.allowNewlines&&(e.includes(`
679
679
  `)||e.includes("\r"))&&n.push({localizationKey:"workflow.steps.text.multipleLines"}),n}}async init(e,t,A){var a,i,o;const n=e.option;if(!n)return null;if(A)await this.reload(e,t,A);else{const s=this.getDefaultImageFillVariant(e.data),r=(a=s==null?void 0:s.asset)==null?void 0:a.fileLink,g=r?await l.getPatternImageData(r):void 0,w=g?{src:g.src,height:g.height,width:g.width,scale:e.data.imageFillScale||1}:void 0;t.updateStorage(e.stepName,{inputText:e.data.defaultText||"",color:((i=await this.getDefaultColorVariant(e.data))==null?void 0:i.color)||await this.getDefaultColor(e.data),fillImage:w}),t.updateMetadata(e.stepName,{text:e.data.defaultText||"",color:((o=await this.getDefaultColorVariant(e.data))==null?void 0:o.name)||await this.getDefaultColor(e.data),fillImage:s==null?void 0:s.name});const d=L.getDefaultVariant(n);if(d)return this.selectVariantCommand(e,d,{},[],t,()=>{},()=>{},w)}return null}findLayoutElements(e,t){return e.getRegionElements(t.stepName).map(a=>l.findElement(a.id,e.getAllLayoutData()))}availableFillColors(e){var n;const t=this.cachedColors.get(e.stepName);if(t)return t;const A=e.data.colorOption;if(A){const a=((n=A.variants)==null?void 0:n.map(i=>({fill:i.color,stroke:i.color,variant:i})))||[];return this.cachedColors.set(e.stepName,a),a}return[]}changeAlignment(e,t,A,n){if(!e.data||!e.data.regions)return;const a=n.getCommandDispatcher();for(const i of A){const o=new l.FontAlignmentCommand(i.id,t);a(o)}}async changeFillColor(e,t,A,n){var s;if(!e.data||!e.data.regions)return;const a=n.getCommandDispatcher();t.variant?n.updateMetadata(e.stepName,{color:t.variant.name}):n.updateMetadata(e.stepName,{color:t.fill});const i=e.data.colorOption,o=i?this.createTextFillSpotColor(i,t.variant):void 0;i?n.updateStorage(e.stepName,{color:t.fill,colorProfileAssetKey:(s=i.colorProfile)==null?void 0:s.key}):n.updateStorage(e.stepName,{color:t.fill});for(const r of A){if(!t.fill)throw new Error("Fill not set on new color selection!");const g=new l.FontColorCommand(r.id,t.fill,o);a(g)}}async availableFillImages(e){var A,n;const t=e.data.imageFillOption;if(t){const a=((n=(A=t.variants)==null?void 0:A.map(i=>{var o;return(o=i.asset)==null?void 0:o.fileLink}))==null?void 0:n.filter(i=>!!i))||[];return Promise.all(a.map(async i=>{const o=await l.getPatternImageData(i);return{src:i,width:o.width,height:o.height,scale:e.data.imageFillScale||1}}))}return Promise.resolve([])}async changeFillImage(e,t,A,n){var o,s;if(!e.data||!e.data.regions)return;const a=n.getCommandDispatcher(),i=(s=(o=e.option)==null?void 0:o.variants)==null?void 0:s.find(r=>{var g;return((g=r.asset)==null?void 0:g.fileLink)===t.src});n.updateMetadata(e.stepName,{fillImage:i==null?void 0:i.name}),n.updateStorage(e.stepName,{fillImage:t});for(const r of A){const g=new l.FontImageFillCommand(r.id,t);a(g)}}getProcessedInput(e,t,A){const n=A?e:this.injectReplaceableText(e,t);return l.applyTextTransformations(n,{vertical:t.vertical,uppercase:t.uppercase})}updateInputText(e,t,A,n){const a=n.getStepStorage(A.stepName),i=this.getProcessedInput(e,A.data,!!a.customiseAllText),o={command:void 0,helperText:"",errors:this.getErrorsForText(e,A,n)};if(o.errors.length>0)return o.helperText=o.errors[0].localizationKey,o;const s=(A.data.maxLength-i.length).toString();o.helperText=`${s} characters remaining`;const r=[],g=new Map,w=new Map;for(const d of t){if(!d.fontData)throw new k("Failed to resolve font data for text.");const[B,h]=l.determineCorrectFontSizeAndLines(d.fontSize,d.fontData,{left:d.x,top:d.y,width:d.width,height:d.height,rotation:d.rotation,panelId:""},[i],{size:A.data.size,minSize:A.data.minSize,maxSize:A.data.maxSize});g.set(d.id,B),w.set(d.id,h);const C=A.data.curved?i:(h||[]).join(`
680
680
  `);r.push(this.generateTextChangeCommandsForRegion(B,A.data,d.id,C))}return!A.data.curved&&t.length>0&&!Array.from(w.values()).every(B=>B)?(o.errors.push({localizationKey:"workflow.steps.text.doesNotFit"}),o):(n.updateStorage(A.stepName,{text:e}),n.updateMetadata(A.stepName,{text:i}),a.defaultCleared&&n.setMandatoryFulfilled(A.stepName,!0),o.command=new l.GroupCommand(r),o)}async selectVariant(e,t,A,n,a){const i=await this.selectVariantCommand(e,t,A.getStepStorage(e.stepName)||{},A.getRegionElements(e.stepName),A,n,a);i&&(i.command&&A.getCommandDispatcher()(i.command),i.followup&&await i.followup())}createTextFillSpotColor(e,t){const A=e.colorProfile;if(A){const n=(A.name||"").replace(/\s/g,"-"),a=n.lastIndexOf("/"),o=n.slice(a+1).slice(0,-4);if(!t.namedColor)throw new Error("variant named color not set!");return{profileName:o,namedColor:t.namedColor}}}async reload(e,t,A){var r,g,w;const n=t.getSerializedStep(e.stepName,A.serializableWorkflow.steps),o=Object.values(A.layouts).map(d=>d.elements).flat().filter(d=>d.stepName===e.stepName),s=e.option;if(n!=null&&n.selectedVariants){const d=n.selectedVariants[0].id;if(s&&d){const B=(r=s.variants)==null?void 0:r.find(h=>h.id===d);if(B){const h=await this.fontDataFromVariant(B),C=o.map(D=>({id:D.id,region:D.stepRegion})),E=(g=n.storage)==null?void 0:g.color,Q=(w=n.storage)==null?void 0:w.text;await t.setSelectionsAndElements(e.stepName,[B],C,async()=>{t.updateMetadata(e.stepName,{color:E,text:Q}),t.updateStorage(e.stepName,{text:Q,inputText:Q});const D=o.map(f=>new l.FontSourceCommand(f.id,h)),p=new l.GroupCommand(D);t.getCommandDispatcher()(p),t.setMandatoryFulfilled(e.stepName,!0)});const{command:m}=z.updateInputText(Q||"",o,e,t);m&&t.getCommandDispatcher()(m)}}}}async getDefaultColorVariant(e){const t=e.colorOption;if(t)return L.getDefaultVariant(t)}async getDefaultColor(e){const t=e.colorOption;if(!t)return;const A=L.getDefaultVariant(t);return A==null?void 0:A.color}getDefaultImageFillVariant(e){const t=e.imageFillOption;if(t)return L.getDefaultVariant(t)}async fontDataFromVariant(e){const t=e.asset;if(!t)throw new W(e);const A=t.fileLink;if(!A)throw new Z(t);const n=await l.loadFont(A);return{assetUrl:A,name:n.names.fullName.en}}async selectVariantCommand(e,t,A,n,a,i,o,s){var w;const r=a.markUpdatePending(),g=await this.fontDataFromVariant(t);if(n.length>0){const d=n.map(C=>new l.FontSourceCommand(C.id,g));if(s){const C=n.map(E=>new l.FontImageFillCommand(E.id,s));d.push(...C)}const B=await this.changeInputTextWithRegion(e,e.data.size||Le,g,A.text||"",A,a,!!A.customiseAllText,i,o);return B&&d.push(B),{command:new l.GroupCommand(d),followup:async()=>{a.markUpdateCompleted(r),await a.setSelectionsAndElements(e.stepName,[t],n)}}}else{const d=await this.createTextboxRegions(e.stepName,t,e.data,g,A,a),B=await this.changeInputTextWithRegion(e,e.data.size||Le,g,((w=d[0])==null?void 0:w.newElement.input)||A.text||e.data.defaultText||"",A,a,!!A.customiseAllText,i,o),h=d.flatMap(E=>E.commands);if(s){const E=d.map(Q=>new l.FontImageFillCommand(Q.regionElement.id,s));h.push(...E)}return B&&h.push(B),{command:new l.GroupCommand(h),followup:async()=>{a.markUpdateCompleted(r)}}}}injectReplaceableText(e,t){return t.replaceableText?t.replaceableText.replace("{{}}",e):e}async createTextboxRegions(e,t,A,n,a,i){if(!A||!A.regions)throw new Error("Step data not supplied");const o=a.text||A.defaultText||"",s=this.getProcessedInput(o,A,!1),r=async w=>{var C;const B=i.getLayouts().find(E=>E.panelId===w.panelId),h=l.generate();try{if(!B)throw new ye("Failed to find layout for region: "+w.panelId);const E=A.colorOption;let Q;if(E&&E.variants){const H=E.variants.find(R=>{var T;return R.id===((T=E.defaultVariant)==null?void 0:T.id)})||E.variants[0];Q=this.createTextFillSpotColor(E,H),i.updateStorage(e,{colorProfileAssetKey:(C=E.colorProfile)==null?void 0:C.key})}const m=await this.getDefaultColor(A),D=m||"#000000",p={stepRegion:w,stepName:e,align:this.textAlign(A),fill:a.color?a.color:D,fontSize:A.size||Le,fontData:n,id:h,layer:w.layer,layerIndex:w.layerIndex,rotation:w.rotation,text:s,input:o,type:l.LayoutElementType.Textbox,vertical:A.vertical,x:w.left,y:w.top,height:w.height,width:w.width,immutable:w.immutable,verticalAlign:A.verticalAlign||"middle",curved:A.curved,paths:A.paths,fillSpotColorDefinition:Q},f=[],I=new Map,F=new Map;if(!p.fontData)throw new k("Failed to resolve font data for text.");const[y,S]=l.determineCorrectFontSizeAndLines(p.fontSize,p.fontData,{left:p.x,top:p.y,width:p.width,height:p.height,rotation:p.rotation,panelId:""},[s],{size:A.size,minSize:A.minSize,maxSize:A.maxSize});I.set(p.id,y),F.set(p.id,S);const x=A.curved||A.vertical?s:(S||[]).join(`
681
681
  `);f.push(this.generateTextChangeCommandsForRegion(y,A,p.id,x));const P=new l.CreateElementCommand(p,B);return{regionElement:{id:h,region:w},commands:[P,...f],newElement:p,fontData:n}}catch(E){throw console.log(E),new Me("Error adding font to region")}},g=await Promise.all(A.regions.map(r)).catch(w=>{throw w instanceof Me?(Nt.setLatestToast("Failed to load font.",Ce.Error),w):w instanceof ye?w:new Error(w)});return await i.setSelectionsAndElements(e,[t],g.map(w=>w.regionElement),async()=>{i.updateMetadata(e,{text:o}),i.updateStorage(e,{text:o})}),g}generateTextChangeCommandsForRegion(e,t,A,n){const a=[],i=new l.TextChangeCommand(A,n);if(a.push(i),!t.size){const s=new l.FontSizeCommand(A,e);a.push(s)}return new l.GroupCommand(a)}async changeInputTextWithRegion(e,t,A,n,a,i,o,s,r,g){const w=(n||"").replace(/^(?![\u000A\u000D])[\u0000-\u001F\u007F-\u009F]/g,""),d=this.getProcessedInput(w,e.data,o),B=i.getRegionElements(e.stepName),h=new Map,C=new Map;for(const p of B)if(p.region){const[f,I]=l.determineCorrectFontSizeAndLines(t,A,p.region,[d],{size:e.data.size,minSize:e.data.minSize,maxSize:e.data.maxSize});h.set(p.id,f),C.set(p.id,I)}const Q=(()=>{if(e.data&&e.data.maxLength&&d.length>e.data.maxLength)return g&&g(!0),{info:"0"};const p=i.getProfanities(),f=He.split(d.toLowerCase());for(const I of f)for(const F in p){const y=p[F].toLowerCase().replace(/\s/g,"");if(I===y)return s(!0),{error:"Blocked profanity."}}return!e.data.vertical&&!e.data.allowNewlines&&(d.includes(`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@spiffcommerce/core",
3
- "version": "21.15.2",
3
+ "version": "21.15.3",
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",