@servicetitan/dte-unlayer 0.155.0 → 0.156.0
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/image-upload-error.d.ts +5 -0
- package/dist/image-upload-error.d.ts.map +1 -0
- package/dist/image-upload-error.js +8 -0
- package/dist/image-upload-error.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +6 -8
- package/dist/store.js.map +1 -1
- package/package.json +1 -1
- package/src/__tests__/store.image-upload.test.ts +132 -0
- package/src/image-upload-error.ts +7 -0
- package/src/index.ts +1 -0
- package/src/store.ts +8 -4
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/** Reject `onImage` with this error to show its message to the user instead of the generic upload failure text. */
|
|
2
|
+
export declare class ImageUploadError extends Error {
|
|
3
|
+
constructor(message: string, options?: ErrorOptions);
|
|
4
|
+
}
|
|
5
|
+
//# sourceMappingURL=image-upload-error.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"image-upload-error.d.ts","sourceRoot":"","sources":["../src/image-upload-error.ts"],"names":[],"mappings":"AAAA,mHAAmH;AACnH,qBAAa,gBAAiB,SAAQ,KAAK;gBAC3B,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY;CAItD"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/** Reject `onImage` with this error to show its message to the user instead of the generic upload failure text. */ export class ImageUploadError extends Error {
|
|
2
|
+
constructor(message, options){
|
|
3
|
+
super(message, options);
|
|
4
|
+
this.name = 'ImageUploadError';
|
|
5
|
+
}
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
//# sourceMappingURL=image-upload-error.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/image-upload-error.ts"],"sourcesContent":["/** Reject `onImage` with this error to show its message to the user instead of the generic upload failure text. */\nexport class ImageUploadError extends Error {\n constructor(message: string, options?: ErrorOptions) {\n super(message, options);\n this.name = 'ImageUploadError';\n }\n}\n"],"names":["ImageUploadError","Error","message","options","name"],"mappings":"AAAA,iHAAiH,GACjH,OAAO,MAAMA,yBAAyBC;IAClC,YAAYC,OAAe,EAAEC,OAAsB,CAAE;QACjD,KAAK,CAACD,SAASC;QACf,IAAI,CAACC,IAAI,GAAG;IAChB;AACJ"}
|
package/dist/index.d.ts
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,SAAS,CAAC;AACxB,cAAc,YAAY,CAAC;AAC3B,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,OAAO,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAC1E,YAAY,EACR,yBAAyB,EACzB,oBAAoB,EACpB,mBAAmB,EACnB,sBAAsB,GACzB,MAAM,cAAc,CAAC;AACtB,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,YAAY,EAAE,uBAAuB,EAAE,MAAM,SAAS,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,cAAc,8CAA8C,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,cAAc,SAAS,CAAC;AACxB,cAAc,YAAY,CAAC;AAC3B,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,OAAO,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAC1E,YAAY,EACR,yBAAyB,EACzB,oBAAoB,EACpB,mBAAmB,EACnB,sBAAsB,GACzB,MAAM,cAAc,CAAC;AACtB,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,YAAY,EAAE,uBAAuB,EAAE,MAAM,SAAS,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,cAAc,8CAA8C,CAAC"}
|
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["export * from './editor';\nexport * from './tools';\nexport * from './api-core';\nexport * from './api-custom-tools';\nexport * from './unlayer-interface';\nexport { isUnlayerMergeTagGroup, toUnlayerMergeTags } from './merge-tags';\nexport type {\n ToUnlayerMergeTagsOptions,\n UnlayerMergeTagGroup,\n UnlayerMergeTagLeaf,\n UnlayerMergeTagsConfig,\n} from './merge-tags';\nexport * from './loadScript';\nexport * from './shared/const';\nexport * from './shared/forms';\nexport * from './shared/schema';\nexport * from './shared/tools';\nexport type { UnlayerDesignChangeInfo } from './store';\nexport { versions } from './unlayer';\nexport * from './shared/date-calc';\nexport { emptyArrayIfNull } from './shared/nunjucks-helpers';\nexport * from './display-conditions/lookupOptionsController';\n"],"names":["isUnlayerMergeTagGroup","toUnlayerMergeTags","versions","emptyArrayIfNull"],"mappings":"AAAA,cAAc,WAAW;AACzB,cAAc,UAAU;AACxB,cAAc,aAAa;AAC3B,cAAc,qBAAqB;AACnC,cAAc,sBAAsB;AACpC,
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["export * from './editor';\nexport { ImageUploadError } from './image-upload-error';\nexport * from './tools';\nexport * from './api-core';\nexport * from './api-custom-tools';\nexport * from './unlayer-interface';\nexport { isUnlayerMergeTagGroup, toUnlayerMergeTags } from './merge-tags';\nexport type {\n ToUnlayerMergeTagsOptions,\n UnlayerMergeTagGroup,\n UnlayerMergeTagLeaf,\n UnlayerMergeTagsConfig,\n} from './merge-tags';\nexport * from './loadScript';\nexport * from './shared/const';\nexport * from './shared/forms';\nexport * from './shared/schema';\nexport * from './shared/tools';\nexport type { UnlayerDesignChangeInfo } from './store';\nexport { versions } from './unlayer';\nexport * from './shared/date-calc';\nexport { emptyArrayIfNull } from './shared/nunjucks-helpers';\nexport * from './display-conditions/lookupOptionsController';\n"],"names":["ImageUploadError","isUnlayerMergeTagGroup","toUnlayerMergeTags","versions","emptyArrayIfNull"],"mappings":"AAAA,cAAc,WAAW;AACzB,SAASA,gBAAgB,QAAQ,uBAAuB;AACxD,cAAc,UAAU;AACxB,cAAc,aAAa;AAC3B,cAAc,qBAAqB;AACnC,cAAc,sBAAsB;AACpC,SAASC,sBAAsB,EAAEC,kBAAkB,QAAQ,eAAe;AAO1E,cAAc,eAAe;AAC7B,cAAc,iBAAiB;AAC/B,cAAc,iBAAiB;AAC/B,cAAc,kBAAkB;AAChC,cAAc,iBAAiB;AAE/B,SAASC,QAAQ,QAAQ,YAAY;AACrC,cAAc,qBAAqB;AACnC,SAASC,gBAAgB,QAAQ,4BAA4B;AAC7D,cAAc,+CAA+C"}
|
package/dist/store.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACR,iBAAiB,EAIpB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EACH,aAAa,EACb,QAAQ,EAGX,MAAM,gBAAgB,CAAC;AAcxB,OAAO,EACH,wBAAwB,EACxB,mBAAmB,EACnB,yBAAyB,EACzB,UAAU,EACb,MAAM,qBAAqB,CAAC;AA0I7B,MAAM,WAAW,uBAAuB;IACpC,kBAAkB,EAAE,OAAO,CAAC;CAC/B;AAmBD,qBAAa,YAAY;IA4BT,QAAQ,CAAC,KAAK,EAAE,wBAAwB;IA3BpD,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAChC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAA0B;IAC1D,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAc;IAElD,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,MAAM,CAAC,CAAoB;IACnC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,kBAAkB,CAAS;IACnC,OAAO,CAAC,oBAAoB,CAAC,CAAS;IACtC,OAAO,CAAC,kBAAkB,CAAuC;IACjE,OAAO,CAAC,gBAAgB,CAA+B;IACvD,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,kBAAkB,CAAS;IACnC,OAAO,CAAC,eAAe,CAAC,CAAyB;IAEjD,OAAO,CAAC,WAAW,CAAC,CAAoC;IACxD,OAAO,CAAC,UAAU,CAAC,CAA0C;IAC7D,OAAO,CAAC,gBAAgB,CAAC,CAAwC;IACjE,OAAO,CAAC,SAAS,CAAC,CAAa;IAC/B,OAAO,CAAC,SAAS,CAAC,CAA2C;IAC7D,OAAO,CAAC,SAAS,CAAC,CAAgD;IAClE,OAAO,CAAC,cAAc,CAAC,CAA2B;IAClD,OAAO,CAAC,iBAAiB,CAAC,CAAkC;IAC5D,OAAO,CAAC,mBAAmB,CAAC,CAAgC;gBAEvC,KAAK,EAAE,wBAAwB;IAkDpD,IAAI,GAAU,WAAW,cAAc,mBAqCrC;IAEF,OAAO,aAYL;IAEF,OAAO,GAAI,MAAM,iBAAiB,UAGhC;IAEF,SAAS,GAAI,SAAS,mBAAmB,UAUvC;IAEF,WAAW,GAAI,WAAW,YAAY,CAAC,YAAY,CAAC,UAElD;IAEF,iBAAiB,GAAI,iBAAiB,YAAY,CAAC,kBAAkB,CAAC,UAEpE;IAEF,UAAU,GAAI,UAAU,YAAY,CAAC,WAAW,CAAC,UAE/C;IAEF,UAAU,GAAI,UAAU,YAAY,CAAC,WAAW,CAAC,UAE/C;IAEF,UAAU,GAAI,UAAU,YAAY,CAAC,WAAW,CAAC,UAE/C;IAEF,YAAY,GAAI,YAAY,YAAY,CAAC,aAAa,CAAC,UAErD;IAEF,eAAe,GAAI,eAAe,YAAY,CAAC,gBAAgB,CAAC,UAE9D;IAEF,kBAAkB,GAAI,kBAAkB,YAAY,CAAC,mBAAmB,CAAC,UAEvE;IAEF,oBAAoB,GAAI,oBAAoB,YAAY,CAAC,qBAAqB,CAAC,UAE7E;IAEF,YAAY,GAAI,OAAO,QAAQ,EAAE,UAE/B;IAEF,cAAc,GAAI,QAAQ,MAAM,EAAE,QAAQ,aAAa,EAAE,UAIvD;IAEF,mBAAmB,GAAI,QAAQ,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,UAEnD;IAEF;;;;;;OAMG;IACH,YAAY,GAAI,MAAM,yBAAyB,EAAE,GAAG,SAAS,UAI3D;IAEF,OAAO,CAAC,cAAc,CAgBpB;IAEF,OAAO,CAAC,aAAa,CAGnB;IAEF,OAAO,CAAC,cAAc,CAWpB;IAEF,OAAO,CAAC,eAAe,CAwCrB;IAEF,OAAO,CAAC,aAAa,CA8EnB;IAEF,OAAO,CAAC,oBAAoB,CAc1B;IAEF,OAAO,CAAC,sBAAsB,CAgB5B;IAEF,OAAO,CAAC,0BAA0B,CAyBhC;IAEF,OAAO,CAAC,gBAAgB,CAqCtB;IAEF,OAAO,CAAC,4BAA4B,CAiBlC;IAEF,OAAO,CAAC,WAAW,CAUjB;IAEF,OAAO,CAAC,WAAW,CA0CjB;IAEF,OAAO,CAAC,uBAAuB,CAmB7B;IAEF,OAAO,CAAC,uBAAuB,CAO7B;IAEF,OAAO,CAAC,aAAa,CA+CnB;CACL"}
|
package/dist/store.js
CHANGED
|
@@ -12,6 +12,7 @@ function _define_property(obj, key, value) {
|
|
|
12
12
|
return obj;
|
|
13
13
|
}
|
|
14
14
|
import { emitESignOffsetRequest } from './e-sign-offset/eSignOffsetController';
|
|
15
|
+
import { ImageUploadError } from './image-upload-error';
|
|
15
16
|
import { loadScript } from './loadScript';
|
|
16
17
|
import { logUnlayerError } from './log';
|
|
17
18
|
import { toUnlayerMergeTags } from './merge-tags';
|
|
@@ -594,10 +595,10 @@ export class UnlayerStore {
|
|
|
594
595
|
(_this_onErrorCB = (_this = this).onErrorCB) === null || _this_onErrorCB === void 0 ? void 0 : _this_onErrorCB.call(_this, res.title, res.description);
|
|
595
596
|
return;
|
|
596
597
|
}
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
598
|
+
/*
|
|
599
|
+
* Unlayer only leaves its "uploading" state when `done` receives a url, so `done` must not be
|
|
600
|
+
* called before the upload succeeds or after it fails, otherwise the image widget gets stuck.
|
|
601
|
+
*/ try {
|
|
601
602
|
const { url } = await this.onImageCB(file);
|
|
602
603
|
done({
|
|
603
604
|
progress: 100,
|
|
@@ -606,10 +607,7 @@ export class UnlayerStore {
|
|
|
606
607
|
} catch (error) {
|
|
607
608
|
var _this_onErrorCB1, _this1;
|
|
608
609
|
logUnlayerError('Image upload failed', error);
|
|
609
|
-
(_this_onErrorCB1 = (_this1 = this).onErrorCB) === null || _this_onErrorCB1 === void 0 ? void 0 : _this_onErrorCB1.call(_this1, 'Image upload failed', 'Something went wrong while uploading the image. Please try again or select another image.');
|
|
610
|
-
done({
|
|
611
|
-
progress: 100
|
|
612
|
-
});
|
|
610
|
+
(_this_onErrorCB1 = (_this1 = this).onErrorCB) === null || _this_onErrorCB1 === void 0 ? void 0 : _this_onErrorCB1.call(_this1, 'Image upload failed', error instanceof ImageUploadError ? error.message : 'Something went wrong while uploading the image. Please try again or select another image.');
|
|
613
611
|
}
|
|
614
612
|
};
|
|
615
613
|
this.startToolsReadyWatchdog = ()=>{
|
package/dist/store.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/store.ts"],"sourcesContent":["import { emitESignOffsetRequest } from './e-sign-offset/eSignOffsetController';\nimport { loadScript } from './loadScript';\nimport { logUnlayerError } from './log';\nimport { toUnlayerMergeTags, type UnlayerMergeTagsConfig } from './merge-tags';\nimport { defaultImageValidation } from './shared/configs';\nimport type {\n UnlayerEditorTwin,\n UnlayerEventConfig,\n UnlayerEventESignOffset,\n UnlayerEventRegister,\n} from './shared/const';\nimport { normalizeESignOffsetSettings } from './shared/e-sign-offset';\nimport { unlayerSupportedFonts } from './shared/fonts';\nimport {\n FormFieldInfo,\n FormInfo,\n getFormFieldSampleValue,\n parseFormFieldKey,\n} from './shared/forms';\nimport { schemaBuildMap, schemaIsDate } from './shared/schema';\nimport { unlayerToolsParseTwinKey } from './shared/tools';\nimport {\n unlayerToolsDedupeInstanceIds,\n unlayerToolsIterate,\n unlayerToolsNormalizeESignOffsets,\n} from './tools';\nimport {\n createUnlayerEditor,\n DesignUpdatedEventType,\n EventDesignUpdated,\n Unlayer,\n} from './unlayer';\nimport {\n CreateUnlayerEditorProps,\n UnlayerDesignFormat,\n UnlayerEditorMergeTagInfo,\n UnlayerRef,\n} from './unlayer-interface';\n\nconst defaultScriptUrl = 'https://editor.unlayer.com/embed.js?2';\nconst UNLAYER_TOOLS_READY_TIMEOUT_MS = 30000;\n\nconst normalizeFontToken = (font: string) =>\n font.replace(/[\"']/g, '').split(',')[0].trim().toLowerCase();\n\nconst getDesignFontTokens = (value: any, out: Set<string>) => {\n if (!value || typeof value !== 'object') {\n return;\n }\n\n if (Array.isArray(value)) {\n for (const item of value) {\n getDesignFontTokens(item, out);\n }\n\n return;\n }\n\n for (const [key, fieldValue] of Object.entries(value)) {\n if (key === 'fontFamily') {\n if (typeof fieldValue === 'string') {\n out.add(normalizeFontToken(fieldValue));\n } else if (fieldValue && typeof fieldValue === 'object') {\n const fontFamilyValue = fieldValue as { label?: string; value?: string };\n\n if (typeof fontFamilyValue.label === 'string') {\n out.add(normalizeFontToken(fontFamilyValue.label));\n }\n\n if (typeof fontFamilyValue.value === 'string') {\n out.add(normalizeFontToken(fontFamilyValue.value));\n }\n }\n }\n\n if (fieldValue && typeof fieldValue === 'object') {\n getDesignFontTokens(fieldValue, out);\n }\n }\n};\n\nconst ensureChunksFonts = (data: any) => {\n if (!data || typeof data !== 'object') {\n return data;\n }\n\n data.chunks ??= {};\n\n const existingFonts: any[] = Array.isArray(data.chunks.fonts) ? data.chunks.fonts : [];\n const existingLabels = new Set(existingFonts.map((f: any) => f.label));\n\n const usedFontTokens = new Set<string>();\n getDesignFontTokens(data.design, usedFontTokens);\n\n const html = typeof data.html === 'string' ? data.html.toLowerCase() : '';\n\n for (const font of unlayerSupportedFonts) {\n const labelToken = normalizeFontToken(font.label);\n const valueToken = normalizeFontToken(font.value);\n const isUsedInDesign = usedFontTokens.has(labelToken) || usedFontTokens.has(valueToken);\n const isUsedInHtml = [labelToken, valueToken].some(token => html.includes(token));\n\n if ((isUsedInDesign || isUsedInHtml) && !existingLabels.has(font.label)) {\n existingFonts.push(font);\n existingLabels.add(font.label);\n }\n }\n\n data.chunks.fonts = existingFonts;\n return data;\n};\n\nconst FORM_FIELD_DATA_POINT_PREFIX = 'FORM_FIELD_';\n\nconst getByPath = (data: unknown, path: string): unknown => {\n if (!data || typeof data !== 'object') {\n return undefined;\n }\n\n return path.split('.').reduce<unknown>((current, part) => {\n if (!current || typeof current !== 'object') {\n return undefined;\n }\n\n return (current as Record<string, unknown>)[part];\n }, data);\n};\n\nconst isPlainObject = (value: unknown): value is Record<string, unknown> =>\n !!value && typeof value === 'object' && !Array.isArray(value);\n\nconst deepMerge = (...sources: unknown[]): Record<string, unknown> => {\n const out: Record<string, unknown> = {};\n\n for (const source of sources) {\n if (!isPlainObject(source)) {\n continue;\n }\n\n for (const [key, value] of Object.entries(source)) {\n if (isPlainObject(value) && isPlainObject(out[key])) {\n out[key] = deepMerge(out[key], value);\n } else {\n out[key] = value;\n }\n }\n }\n\n return out;\n};\n\nconst setByPath = (target: Record<string, unknown>, path: string, value: unknown) => {\n const parts = path.split('.');\n if (!parts.length) {\n return;\n }\n\n let node: Record<string, unknown> = target;\n\n for (let i = 0; i < parts.length - 1; i += 1) {\n const key = parts[i];\n if (!isPlainObject(node[key])) {\n node[key] = {};\n }\n node = node[key] as Record<string, unknown>;\n }\n\n node[parts[parts.length - 1]] = value;\n};\n\nconst tokenizeFormulaFields = (expression: string): string[] => {\n const regex = /[A-Za-z_][A-Za-z0-9_.]*/g;\n return expression.match(regex) ?? [];\n};\n\nexport interface UnlayerDesignChangeInfo {\n isToolsListChanged: boolean;\n}\n\n// We are using exclusive lists here, because we can't be sure that we know all unlayer event types\nconst eventsNotChangingToolsList: DesignUpdatedEventType[] = [\n DesignUpdatedEventType.ContentMoved,\n DesignUpdatedEventType.ContentModified,\n DesignUpdatedEventType.ColumnModified,\n DesignUpdatedEventType.RowMoved,\n DesignUpdatedEventType.RowModified,\n DesignUpdatedEventType.BodyModified,\n];\n\nconst eventsNotAddingTools: DesignUpdatedEventType[] = [\n ...eventsNotChangingToolsList,\n DesignUpdatedEventType.ContentRemoved,\n DesignUpdatedEventType.ColumnRemoved,\n DesignUpdatedEventType.RowRemoved,\n];\n\nexport class UnlayerStore {\n readonly unlayerRef: UnlayerRef;\n private readonly schemaDummyData: Record<string, unknown>;\n private readonly dateSchemaFieldKeys: Set<string>;\n\n private editor: Unlayer | undefined;\n private isInit = false;\n private iframe?: HTMLIFrameElement;\n private hasDesign = false;\n private hasCoreLoaded = false;\n private hasToolsRegistered = false;\n private toolsReadyWatchdogId?: number;\n private formFieldsByFormId: Record<number, FormFieldInfo[]> = {};\n private formFieldSamples: Record<string, unknown> = {};\n private isEditorReady = false;\n private isMergeTagsApplied = false;\n private mergeTagsConfig?: UnlayerMergeTagsConfig;\n\n private onMessageCB?: (type: string, data: any) => void;\n private onChangeCB?: (info: UnlayerDesignChangeInfo) => void;\n private onSnapshotSaveCB?: (snapshot: UnlayerEditorTwin) => void;\n private onReadyCB?: () => void;\n private onImageCB?: (file: File) => Promise<{ url: string }>;\n private onErrorCB?: (title: string, description?: string) => void;\n private onFormSelectCB?: (formId: number) => void;\n private onCalcFieldOpenCB?: (usedFormIds: number[]) => void;\n private onCalcFieldSelectCB?: (fieldKeys: string[]) => void;\n\n constructor(readonly props: CreateUnlayerEditorProps) {\n const schemaData = this.props.schema ? schemaBuildMap(this.props.schema) : undefined;\n this.schemaDummyData = (schemaData?.dummyData ?? {}) as Record<string, unknown>;\n this.dateSchemaFieldKeys = new Set(\n Object.values(schemaData?.map ?? {})\n .filter(field => field.isValue && schemaIsDate(field.node))\n .map(field => field.fullKey),\n );\n\n this.props.eSignFieldTypes = [\n 'Signature',\n 'Initials',\n 'Date Signed',\n 'Date Signed Offset',\n 'Full Name',\n ];\n\n this.unlayerRef = {\n loadDesign: design => {\n this.editor?.loadDesign(design);\n },\n saveDesign: cb => {\n this.editor?.saveDesign(design => {\n unlayerToolsNormalizeESignOffsets(design);\n cb(design);\n });\n },\n exportHtml: cb => {\n this.editor?.exportHtml(data => {\n const result = ensureChunksFonts(data);\n unlayerToolsNormalizeESignOffsets(result?.design);\n result.demoData = this.buildCalculatedFieldDemoData(result.design);\n cb(result);\n });\n },\n sendFormList: forms => {\n this.sendFormList(forms);\n },\n sendFormFields: (formId, fields) => {\n this.sendFormFields(formId, fields);\n },\n sendCalcFieldLabels: labels => {\n this.sendCalcFieldLabels(labels);\n },\n setMergeTags: tags => {\n this.setMergeTags(tags);\n },\n };\n }\n\n init = async (container: HTMLDivElement) => {\n if (this.isInit) {\n return;\n }\n\n this.isInit = true;\n\n try {\n setTimeout(() => window.addEventListener('message', this.onPostMessage));\n\n await loadScript(defaultScriptUrl);\n\n if (!(window as any).unlayer) {\n throw new Error('Unlayer embed script loaded but window.unlayer is missing');\n }\n\n this.editor = createUnlayerEditor(container, this.props);\n // The host may already have pushed a newer set through `setMergeTags`; keep it.\n this.mergeTagsConfig ??= toUnlayerMergeTags(this.props.mergeTags);\n this.editor.addEventListener('editor:ready', this.onEditorReady);\n this.editor.addEventListener('design:loaded', this.onDesignLoaded);\n this.editor.addEventListener('design:updated', this.onDesignUpdated);\n this.editor.registerCallback('image', this.uploadImage);\n\n this.iframe = container.querySelector(`iframe`) ?? undefined;\n\n if (!this.iframe) {\n logUnlayerError('Unlayer iframe was not created after createEditor');\n }\n\n this.startToolsReadyWatchdog();\n } catch (error: unknown) {\n this.isInit = false;\n this.clearToolsReadyWatchdog();\n logUnlayerError('Failed to initialize Unlayer editor', error);\n throw error;\n }\n };\n\n destroy = () => {\n this.clearToolsReadyWatchdog();\n window.removeEventListener('message', this.onPostMessage);\n\n if (this.editor) {\n this.editor.removeEventListener('editor:ready', this.onEditorReady);\n this.editor.removeEventListener('design:loaded', this.onDesignLoaded);\n this.editor.removeEventListener('design:updated', this.onDesignUpdated);\n this.editor.unregisterCallback('image', this.uploadImage);\n\n this.editor = undefined;\n }\n };\n\n addTwin = (twin: UnlayerEditorTwin) => {\n this.props.toolTwins?.push(twin);\n this.sendMessage('--add-twin', JSON.parse(JSON.stringify(twin)));\n };\n\n setDesign = (design?: UnlayerDesignFormat) => {\n if (!this.editor) {\n return;\n }\n\n this.hasDesign = !!design;\n\n if (design) {\n this.editor.loadDesign(design);\n }\n };\n\n setOnChange = (onChange?: UnlayerStore['onChangeCB']) => {\n this.onChangeCB = onChange;\n };\n\n setOnSnapshotSave = (onSnapshotSave?: UnlayerStore['onSnapshotSaveCB']) => {\n this.onSnapshotSaveCB = onSnapshotSave;\n };\n\n setOnReady = (onReady?: UnlayerStore['onReadyCB']) => {\n this.onReadyCB = onReady;\n };\n\n setOnImage = (onImage?: UnlayerStore['onImageCB']) => {\n this.onImageCB = onImage;\n };\n\n setOnError = (onError?: UnlayerStore['onErrorCB']) => {\n this.onErrorCB = onError;\n };\n\n setOnMessage = (onMessage?: UnlayerStore['onMessageCB']) => {\n this.onMessageCB = onMessage;\n };\n\n setOnFormSelect = (onFormSelect?: UnlayerStore['onFormSelectCB']) => {\n this.onFormSelectCB = onFormSelect;\n };\n\n setOnCalcFieldOpen = (onCalcFieldOpen?: UnlayerStore['onCalcFieldOpenCB']) => {\n this.onCalcFieldOpenCB = onCalcFieldOpen;\n };\n\n setOnCalcFieldSelect = (onCalcFieldSelect?: UnlayerStore['onCalcFieldSelectCB']) => {\n this.onCalcFieldSelectCB = onCalcFieldSelect;\n };\n\n sendFormList = (forms: FormInfo[]) => {\n this.sendMessage('--form-list', { forms });\n };\n\n sendFormFields = (formId: number, fields: FormFieldInfo[]) => {\n this.formFieldsByFormId[formId] = fields;\n this.updateFormFieldSamples(formId, fields);\n this.sendMessage('--form-fields', { formId, fields });\n };\n\n sendCalcFieldLabels = (labels: Record<string, string>) => {\n this.sendMessage('--calc-field-labels', { labels });\n };\n\n /**\n * Replaces the editor's merge tag menu. Nested groups passed to `createEditor` stop DTE\n * custom tools from registering, so init only carries the flat shape and the grouped\n * config is applied here once the editor is ready. A call before that (including the\n * initial props) is parked; a later call replaces it. A failed apply is retried on the\n * next `design:loaded`.\n */\n setMergeTags = (tags: UnlayerEditorMergeTagInfo[] | undefined) => {\n this.mergeTagsConfig = toUnlayerMergeTags(tags);\n this.isMergeTagsApplied = false;\n this.applyMergeTags();\n };\n\n private applyMergeTags = () => {\n if (\n !this.editor ||\n !this.isEditorReady ||\n this.isMergeTagsApplied ||\n !this.mergeTagsConfig\n ) {\n return;\n }\n\n try {\n this.editor.setMergeTags(this.mergeTagsConfig);\n this.isMergeTagsApplied = true;\n } catch (error: unknown) {\n logUnlayerError('Failed to apply merge tags', error);\n }\n };\n\n private onEditorReady = () => {\n this.isEditorReady = true;\n this.applyMergeTags();\n };\n\n private onDesignLoaded = () => {\n // A loaded design means the editor is up even if `editor:ready` never reached us.\n this.onEditorReady();\n\n if (!this.hasDesign) {\n this.hasDesign = true;\n this.editor?.setBodyValues({\n backgroundColor: 'rgba(0,0,0,0)',\n contentWidth: '100%',\n });\n }\n };\n\n private onDesignUpdated = (event: EventDesignUpdated) => {\n const isToolAdded = !eventsNotAddingTools.includes(event.type);\n const isToolsListChanged = !eventsNotChangingToolsList.includes(event.type);\n\n if (isToolAdded) {\n this.editor?.exportHtml(data => {\n let hasChanges = false;\n\n unlayerToolsIterate(data.design, tool => {\n const realTool = tool.slug\n ? unlayerToolsParseTwinKey(tool.slug ?? '')\n : undefined;\n\n if (realTool) {\n hasChanges = true;\n\n if (tool.slug) {\n delete data.design.counters[`u_content_custom_${tool.slug}`];\n delete tool.values._meta.htmlID;\n }\n\n tool.type = realTool.type;\n tool.slug = realTool.slug;\n }\n });\n\n // Duplicated contents/rows carry the original's instance GUIDs; give copies new ones.\n if (unlayerToolsDedupeInstanceIds(data.design, event.item?.values?._meta?.htmlID)) {\n hasChanges = true;\n }\n\n if (hasChanges) {\n this.setDesign(data.design);\n }\n\n this.onChangeCB?.({ isToolsListChanged });\n });\n } else {\n this.onChangeCB?.({ isToolsListChanged });\n }\n };\n\n private onPostMessage = (e: MessageEvent) => {\n if (!e.data?.['-dte-message-from']) {\n return;\n }\n\n const type = e.data?.['-dte-message-from']?.type;\n const data = e.data?.['-dte-message-from']?.data;\n\n if (!type) {\n return;\n }\n\n if (type === '--ready' || type === '--registered') {\n this.hasToolsRegistered = true;\n this.clearToolsReadyWatchdog();\n this.onReadyCB?.();\n } else if (type === '--core-loaded') {\n this.hasCoreLoaded = true;\n const configData: UnlayerEventConfig = {\n dummyData: this.props.dummyData,\n schema: this.props.schema,\n generics: this.props.generics,\n genericConfigMode: this.props.genericConfigMode,\n isSnapshotMode: this.props.isSnapshotMode,\n holidays: this.props.holidays,\n conditionalRulesEnabled:\n !!this.props.displayConditions || !!this.props.onConditionalsOpen,\n };\n\n this.sendMessage('--config', JSON.parse(JSON.stringify(configData)));\n } else if (type === '--form-select') {\n this.onFormSelectCB?.(data?.formId);\n } else if (type === '--calc-field-open') {\n this.onCalcFieldOpenCB?.(data?.usedFormIds ?? []);\n } else if (type === '--esign-offset-open') {\n this.openESignOffsetRules(data);\n } else if (type === '--calc-field-select') {\n if (this.onCalcFieldSelectCB) {\n this.onCalcFieldSelectCB(data?.fieldKeys ?? []);\n } else {\n this.sendCalcFieldLabels({});\n }\n } else if (type === '--data-loaded') {\n const data: UnlayerEventRegister = {\n customTools: this.props.tools.map(tool => ({ key: tool.key })),\n toolTwins: this.props.toolTwins,\n eSignRecipients: this.props.eSignRecipients,\n eSignFieldTypes: this.props.eSignFieldTypes,\n units: this.props.units?.map(unit => ({\n ...unit,\n values: {\n ...unit.values,\n adminConfig: undefined,\n },\n })),\n };\n\n this.sendMessage('--register', JSON.parse(JSON.stringify(data)));\n } else if (type === '--save-snapshot') {\n this.editor?.exportHtml(template => {\n unlayerToolsIterate(template.design, tool => {\n if (tool.values?.twin?.id === data.id) {\n if (!tool.slug) {\n return;\n }\n\n this.onSnapshotSaveCB?.({\n title: '',\n tool: tool.slug,\n values: tool.values,\n });\n return false;\n }\n });\n });\n }\n\n this.onMessageCB?.(type, data);\n };\n\n private openESignOffsetRules = (data?: Partial<UnlayerEventESignOffset>) => {\n const requestId = data?.requestId;\n\n if (!requestId) {\n return;\n }\n\n emitESignOffsetRequest({\n value: normalizeESignOffsetSettings(data.value),\n done: value => {\n const result: UnlayerEventESignOffset = { requestId, value };\n this.sendMessage('--esign-offset-result', JSON.parse(JSON.stringify(result)));\n },\n });\n };\n\n private updateFormFieldSamples = (formId: number, fields: FormFieldInfo[]) => {\n fields.forEach((field, index) => {\n const normalizedFieldId = String(field.id ?? '').replaceAll('-', '');\n if (!normalizedFieldId) {\n return;\n }\n\n const sampleValue = getFormFieldSampleValue(field, index);\n setByPath(\n this.formFieldSamples,\n `__submission_fields.${formId}.${normalizedFieldId}`,\n sampleValue,\n );\n this.formFieldSamples[`${FORM_FIELD_DATA_POINT_PREFIX}${normalizedFieldId}`] =\n sampleValue;\n });\n };\n\n private collectCalculatedFieldKeys = (design?: UnlayerDesignFormat): Set<string> => {\n const keys = new Set<string>();\n\n if (!design) {\n return keys;\n }\n\n unlayerToolsIterate(design, tool => {\n const calc = tool.values?.calculation;\n if (!calc || typeof calc !== 'object') {\n return;\n }\n\n if (typeof calc.expression === 'string') {\n for (const key of tokenizeFormulaFields(calc.expression)) {\n keys.add(key);\n }\n }\n\n if (calc.fieldLabels && typeof calc.fieldLabels === 'object') {\n Object.keys(calc.fieldLabels).forEach(key => keys.add(key));\n }\n });\n\n return keys;\n };\n\n private resolveDemoValue = (\n key: string,\n fallbackIndex: number,\n sourceData: Record<string, unknown>,\n ): unknown => {\n const parsedFormField = parseFormFieldKey(key);\n if (parsedFormField) {\n const normalizedFieldId = parsedFormField.fieldId;\n const formFields = this.formFieldsByFormId[parsedFormField.formId] ?? [];\n const fieldIndex = formFields.findIndex(\n field => String(field.id ?? '').replaceAll('-', '') === normalizedFieldId,\n );\n const field = fieldIndex >= 0 ? formFields[fieldIndex] : undefined;\n const sample = field\n ? getFormFieldSampleValue(field, fieldIndex)\n : getByPath(\n this.formFieldSamples,\n `__submission_fields.${parsedFormField.formId}.${normalizedFieldId}`,\n );\n\n if (sample !== undefined) {\n return sample;\n }\n\n return this.dateSchemaFieldKeys.has(key) ? '2026-01-15' : 44 + fallbackIndex;\n }\n\n const existing = getByPath(sourceData, key);\n if (existing !== undefined) {\n return existing;\n }\n\n if (this.dateSchemaFieldKeys.has(key)) {\n return '2026-01-15';\n }\n\n return 44 + fallbackIndex;\n };\n\n private buildCalculatedFieldDemoData = (\n design?: UnlayerDesignFormat,\n ): Record<string, unknown> => {\n const demoData: Record<string, unknown> = {};\n const usedKeys = Array.from(this.collectCalculatedFieldKeys(design));\n const sourceData = deepMerge(\n this.schemaDummyData,\n this.props.dummyData,\n this.formFieldSamples,\n );\n\n usedKeys.forEach((key, index) => {\n const value = this.resolveDemoValue(key, index, sourceData);\n setByPath(demoData, key, value);\n });\n\n return demoData;\n };\n\n private sendMessage = (type: string, data?: any) => {\n this.iframe?.contentWindow?.postMessage(\n {\n '-dte-message-to': {\n type,\n data,\n },\n },\n '*',\n );\n };\n\n private uploadImage = async (\n data: { attachments: File[] },\n done: (result: { progress: number; url?: string }) => void,\n ) => {\n if (!this.onImageCB) {\n done({ progress: 100 });\n throw new Error('image upload is not implemented');\n }\n\n if (!data.attachments?.length) {\n return;\n }\n\n const file = data.attachments[0];\n\n const res = await this.validateImage(file, {\n ...defaultImageValidation,\n ...(this.props.imageValidation ?? {}),\n });\n\n if (!res.isValid) {\n logUnlayerError(`Image validation failed: ${res.title}`, res.description);\n this.onErrorCB?.(res.title, res.description);\n return;\n }\n\n done({ progress: 0 });\n\n try {\n const { url } = await this.onImageCB(file);\n done({ progress: 100, url });\n } catch (error: unknown) {\n logUnlayerError('Image upload failed', error);\n this.onErrorCB?.(\n 'Image upload failed',\n 'Something went wrong while uploading the image. Please try again or select another image.',\n );\n done({ progress: 100 });\n }\n };\n\n private startToolsReadyWatchdog = () => {\n this.clearToolsReadyWatchdog();\n this.toolsReadyWatchdogId = window.setTimeout(() => {\n if (this.hasToolsRegistered) {\n return;\n }\n\n logUnlayerError(\n 'Unlayer custom tools did not finish loading. customJS may not have run, or tool registration stalled.',\n {\n hasCoreLoaded: this.hasCoreLoaded,\n hasToolsRegistered: this.hasToolsRegistered,\n },\n );\n this.onErrorCB?.(\n 'Editor failed to load custom tools',\n 'Unlayer custom tools did not finish loading. Check the browser console for [dte-unlayer] details.',\n );\n }, UNLAYER_TOOLS_READY_TIMEOUT_MS);\n };\n\n private clearToolsReadyWatchdog = () => {\n if (this.toolsReadyWatchdogId === undefined) {\n return;\n }\n\n window.clearTimeout(this.toolsReadyWatchdogId);\n this.toolsReadyWatchdogId = undefined;\n };\n\n private validateImage = async (\n file: File,\n imageValidation: { maxFileSize: number; maxWidth: number; maxHeight: number },\n ): Promise<{ isValid: boolean; title: string; description: string }> => {\n const { maxFileSize, maxHeight, maxWidth } = imageValidation;\n\n if (file.size > maxFileSize) {\n const maxSizeMB = (maxFileSize / 1024 / 1024).toFixed(2);\n const fileSizeMB = (file.size / 1024 / 1024).toFixed(2);\n return {\n isValid: false,\n title: 'Image size limit reached',\n description: `This image is ${fileSizeMB}MB, which is above the ${maxSizeMB}MB limit. Please upload a smaller file to continue.`,\n };\n }\n\n return new Promise(resolve => {\n const img = new Image();\n const objectUrl = URL.createObjectURL(file);\n\n img.onload = () => {\n URL.revokeObjectURL(objectUrl);\n const { height, width } = img;\n\n if (width > maxWidth || height > maxHeight) {\n resolve({\n isValid: false,\n title: 'Dimension limit reached',\n description: `These image dimensions (${width}x${height}px) exceed the ${maxWidth}x${maxHeight}px limit. Please resize the image and try again.`,\n });\n } else {\n resolve({ isValid: true, title: '', description: '' });\n }\n };\n\n img.onerror = () => {\n URL.revokeObjectURL(objectUrl);\n resolve({\n isValid: false,\n title: 'The image is broken',\n description:\n 'Looks like this image isn’t valid. Please choose another image and try again.',\n });\n };\n\n img.src = objectUrl;\n });\n };\n}\n"],"names":["emitESignOffsetRequest","loadScript","logUnlayerError","toUnlayerMergeTags","defaultImageValidation","normalizeESignOffsetSettings","unlayerSupportedFonts","getFormFieldSampleValue","parseFormFieldKey","schemaBuildMap","schemaIsDate","unlayerToolsParseTwinKey","unlayerToolsDedupeInstanceIds","unlayerToolsIterate","unlayerToolsNormalizeESignOffsets","createUnlayerEditor","DesignUpdatedEventType","defaultScriptUrl","UNLAYER_TOOLS_READY_TIMEOUT_MS","normalizeFontToken","font","replace","split","trim","toLowerCase","getDesignFontTokens","value","out","Array","isArray","item","key","fieldValue","Object","entries","add","fontFamilyValue","label","ensureChunksFonts","data","chunks","existingFonts","fonts","existingLabels","Set","map","f","usedFontTokens","design","html","labelToken","valueToken","isUsedInDesign","has","isUsedInHtml","some","token","includes","push","FORM_FIELD_DATA_POINT_PREFIX","getByPath","path","undefined","reduce","current","part","isPlainObject","deepMerge","sources","source","setByPath","target","parts","length","node","i","tokenizeFormulaFields","expression","regex","match","eventsNotChangingToolsList","ContentMoved","ContentModified","ColumnModified","RowMoved","RowModified","BodyModified","eventsNotAddingTools","ContentRemoved","ColumnRemoved","RowRemoved","UnlayerStore","props","unlayerRef","schemaDummyData","dateSchemaFieldKeys","editor","isInit","iframe","hasDesign","hasCoreLoaded","hasToolsRegistered","toolsReadyWatchdogId","formFieldsByFormId","formFieldSamples","isEditorReady","isMergeTagsApplied","mergeTagsConfig","onMessageCB","onChangeCB","onSnapshotSaveCB","onReadyCB","onImageCB","onErrorCB","onFormSelectCB","onCalcFieldOpenCB","onCalcFieldSelectCB","init","destroy","addTwin","setDesign","setOnChange","setOnSnapshotSave","setOnReady","setOnImage","setOnError","setOnMessage","setOnFormSelect","setOnCalcFieldOpen","setOnCalcFieldSelect","sendFormList","sendFormFields","sendCalcFieldLabels","setMergeTags","applyMergeTags","onEditorReady","onDesignLoaded","onDesignUpdated","onPostMessage","openESignOffsetRules","updateFormFieldSamples","collectCalculatedFieldKeys","resolveDemoValue","buildCalculatedFieldDemoData","sendMessage","uploadImage","startToolsReadyWatchdog","clearToolsReadyWatchdog","validateImage","container","setTimeout","window","addEventListener","unlayer","Error","mergeTags","registerCallback","querySelector","error","removeEventListener","unregisterCallback","twin","toolTwins","JSON","parse","stringify","loadDesign","onChange","onSnapshotSave","onReady","onImage","onError","onMessage","onFormSelect","onCalcFieldOpen","onCalcFieldSelect","forms","formId","fields","labels","tags","setBodyValues","backgroundColor","contentWidth","event","isToolAdded","type","isToolsListChanged","exportHtml","hasChanges","tool","realTool","slug","counters","values","_meta","htmlID","e","configData","dummyData","schema","generics","genericConfigMode","isSnapshotMode","holidays","conditionalRulesEnabled","displayConditions","onConditionalsOpen","usedFormIds","fieldKeys","customTools","tools","eSignRecipients","eSignFieldTypes","units","unit","adminConfig","template","id","title","requestId","done","result","forEach","field","index","normalizedFieldId","String","replaceAll","sampleValue","keys","calc","calculation","fieldLabels","fallbackIndex","sourceData","parsedFormField","fieldId","formFields","fieldIndex","findIndex","sample","existing","demoData","usedKeys","from","contentWindow","postMessage","progress","attachments","file","res","imageValidation","isValid","description","url","clearTimeout","maxFileSize","maxHeight","maxWidth","size","maxSizeMB","toFixed","fileSizeMB","Promise","resolve","img","Image","objectUrl","URL","createObjectURL","onload","revokeObjectURL","height","width","onerror","src","schemaData","filter","isValue","fullKey","saveDesign","cb"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../src/store.ts"],"sourcesContent":["import { emitESignOffsetRequest } from './e-sign-offset/eSignOffsetController';\nimport { ImageUploadError } from './image-upload-error';\nimport { loadScript } from './loadScript';\nimport { logUnlayerError } from './log';\nimport { toUnlayerMergeTags, type UnlayerMergeTagsConfig } from './merge-tags';\nimport { defaultImageValidation } from './shared/configs';\nimport type {\n UnlayerEditorTwin,\n UnlayerEventConfig,\n UnlayerEventESignOffset,\n UnlayerEventRegister,\n} from './shared/const';\nimport { normalizeESignOffsetSettings } from './shared/e-sign-offset';\nimport { unlayerSupportedFonts } from './shared/fonts';\nimport {\n FormFieldInfo,\n FormInfo,\n getFormFieldSampleValue,\n parseFormFieldKey,\n} from './shared/forms';\nimport { schemaBuildMap, schemaIsDate } from './shared/schema';\nimport { unlayerToolsParseTwinKey } from './shared/tools';\nimport {\n unlayerToolsDedupeInstanceIds,\n unlayerToolsIterate,\n unlayerToolsNormalizeESignOffsets,\n} from './tools';\nimport {\n createUnlayerEditor,\n DesignUpdatedEventType,\n EventDesignUpdated,\n Unlayer,\n} from './unlayer';\nimport {\n CreateUnlayerEditorProps,\n UnlayerDesignFormat,\n UnlayerEditorMergeTagInfo,\n UnlayerRef,\n} from './unlayer-interface';\n\nconst defaultScriptUrl = 'https://editor.unlayer.com/embed.js?2';\nconst UNLAYER_TOOLS_READY_TIMEOUT_MS = 30000;\n\nconst normalizeFontToken = (font: string) =>\n font.replace(/[\"']/g, '').split(',')[0].trim().toLowerCase();\n\nconst getDesignFontTokens = (value: any, out: Set<string>) => {\n if (!value || typeof value !== 'object') {\n return;\n }\n\n if (Array.isArray(value)) {\n for (const item of value) {\n getDesignFontTokens(item, out);\n }\n\n return;\n }\n\n for (const [key, fieldValue] of Object.entries(value)) {\n if (key === 'fontFamily') {\n if (typeof fieldValue === 'string') {\n out.add(normalizeFontToken(fieldValue));\n } else if (fieldValue && typeof fieldValue === 'object') {\n const fontFamilyValue = fieldValue as { label?: string; value?: string };\n\n if (typeof fontFamilyValue.label === 'string') {\n out.add(normalizeFontToken(fontFamilyValue.label));\n }\n\n if (typeof fontFamilyValue.value === 'string') {\n out.add(normalizeFontToken(fontFamilyValue.value));\n }\n }\n }\n\n if (fieldValue && typeof fieldValue === 'object') {\n getDesignFontTokens(fieldValue, out);\n }\n }\n};\n\nconst ensureChunksFonts = (data: any) => {\n if (!data || typeof data !== 'object') {\n return data;\n }\n\n data.chunks ??= {};\n\n const existingFonts: any[] = Array.isArray(data.chunks.fonts) ? data.chunks.fonts : [];\n const existingLabels = new Set(existingFonts.map((f: any) => f.label));\n\n const usedFontTokens = new Set<string>();\n getDesignFontTokens(data.design, usedFontTokens);\n\n const html = typeof data.html === 'string' ? data.html.toLowerCase() : '';\n\n for (const font of unlayerSupportedFonts) {\n const labelToken = normalizeFontToken(font.label);\n const valueToken = normalizeFontToken(font.value);\n const isUsedInDesign = usedFontTokens.has(labelToken) || usedFontTokens.has(valueToken);\n const isUsedInHtml = [labelToken, valueToken].some(token => html.includes(token));\n\n if ((isUsedInDesign || isUsedInHtml) && !existingLabels.has(font.label)) {\n existingFonts.push(font);\n existingLabels.add(font.label);\n }\n }\n\n data.chunks.fonts = existingFonts;\n return data;\n};\n\nconst FORM_FIELD_DATA_POINT_PREFIX = 'FORM_FIELD_';\n\nconst getByPath = (data: unknown, path: string): unknown => {\n if (!data || typeof data !== 'object') {\n return undefined;\n }\n\n return path.split('.').reduce<unknown>((current, part) => {\n if (!current || typeof current !== 'object') {\n return undefined;\n }\n\n return (current as Record<string, unknown>)[part];\n }, data);\n};\n\nconst isPlainObject = (value: unknown): value is Record<string, unknown> =>\n !!value && typeof value === 'object' && !Array.isArray(value);\n\nconst deepMerge = (...sources: unknown[]): Record<string, unknown> => {\n const out: Record<string, unknown> = {};\n\n for (const source of sources) {\n if (!isPlainObject(source)) {\n continue;\n }\n\n for (const [key, value] of Object.entries(source)) {\n if (isPlainObject(value) && isPlainObject(out[key])) {\n out[key] = deepMerge(out[key], value);\n } else {\n out[key] = value;\n }\n }\n }\n\n return out;\n};\n\nconst setByPath = (target: Record<string, unknown>, path: string, value: unknown) => {\n const parts = path.split('.');\n if (!parts.length) {\n return;\n }\n\n let node: Record<string, unknown> = target;\n\n for (let i = 0; i < parts.length - 1; i += 1) {\n const key = parts[i];\n if (!isPlainObject(node[key])) {\n node[key] = {};\n }\n node = node[key] as Record<string, unknown>;\n }\n\n node[parts[parts.length - 1]] = value;\n};\n\nconst tokenizeFormulaFields = (expression: string): string[] => {\n const regex = /[A-Za-z_][A-Za-z0-9_.]*/g;\n return expression.match(regex) ?? [];\n};\n\nexport interface UnlayerDesignChangeInfo {\n isToolsListChanged: boolean;\n}\n\n// We are using exclusive lists here, because we can't be sure that we know all unlayer event types\nconst eventsNotChangingToolsList: DesignUpdatedEventType[] = [\n DesignUpdatedEventType.ContentMoved,\n DesignUpdatedEventType.ContentModified,\n DesignUpdatedEventType.ColumnModified,\n DesignUpdatedEventType.RowMoved,\n DesignUpdatedEventType.RowModified,\n DesignUpdatedEventType.BodyModified,\n];\n\nconst eventsNotAddingTools: DesignUpdatedEventType[] = [\n ...eventsNotChangingToolsList,\n DesignUpdatedEventType.ContentRemoved,\n DesignUpdatedEventType.ColumnRemoved,\n DesignUpdatedEventType.RowRemoved,\n];\n\nexport class UnlayerStore {\n readonly unlayerRef: UnlayerRef;\n private readonly schemaDummyData: Record<string, unknown>;\n private readonly dateSchemaFieldKeys: Set<string>;\n\n private editor: Unlayer | undefined;\n private isInit = false;\n private iframe?: HTMLIFrameElement;\n private hasDesign = false;\n private hasCoreLoaded = false;\n private hasToolsRegistered = false;\n private toolsReadyWatchdogId?: number;\n private formFieldsByFormId: Record<number, FormFieldInfo[]> = {};\n private formFieldSamples: Record<string, unknown> = {};\n private isEditorReady = false;\n private isMergeTagsApplied = false;\n private mergeTagsConfig?: UnlayerMergeTagsConfig;\n\n private onMessageCB?: (type: string, data: any) => void;\n private onChangeCB?: (info: UnlayerDesignChangeInfo) => void;\n private onSnapshotSaveCB?: (snapshot: UnlayerEditorTwin) => void;\n private onReadyCB?: () => void;\n private onImageCB?: (file: File) => Promise<{ url: string }>;\n private onErrorCB?: (title: string, description?: string) => void;\n private onFormSelectCB?: (formId: number) => void;\n private onCalcFieldOpenCB?: (usedFormIds: number[]) => void;\n private onCalcFieldSelectCB?: (fieldKeys: string[]) => void;\n\n constructor(readonly props: CreateUnlayerEditorProps) {\n const schemaData = this.props.schema ? schemaBuildMap(this.props.schema) : undefined;\n this.schemaDummyData = (schemaData?.dummyData ?? {}) as Record<string, unknown>;\n this.dateSchemaFieldKeys = new Set(\n Object.values(schemaData?.map ?? {})\n .filter(field => field.isValue && schemaIsDate(field.node))\n .map(field => field.fullKey),\n );\n\n this.props.eSignFieldTypes = [\n 'Signature',\n 'Initials',\n 'Date Signed',\n 'Date Signed Offset',\n 'Full Name',\n ];\n\n this.unlayerRef = {\n loadDesign: design => {\n this.editor?.loadDesign(design);\n },\n saveDesign: cb => {\n this.editor?.saveDesign(design => {\n unlayerToolsNormalizeESignOffsets(design);\n cb(design);\n });\n },\n exportHtml: cb => {\n this.editor?.exportHtml(data => {\n const result = ensureChunksFonts(data);\n unlayerToolsNormalizeESignOffsets(result?.design);\n result.demoData = this.buildCalculatedFieldDemoData(result.design);\n cb(result);\n });\n },\n sendFormList: forms => {\n this.sendFormList(forms);\n },\n sendFormFields: (formId, fields) => {\n this.sendFormFields(formId, fields);\n },\n sendCalcFieldLabels: labels => {\n this.sendCalcFieldLabels(labels);\n },\n setMergeTags: tags => {\n this.setMergeTags(tags);\n },\n };\n }\n\n init = async (container: HTMLDivElement) => {\n if (this.isInit) {\n return;\n }\n\n this.isInit = true;\n\n try {\n setTimeout(() => window.addEventListener('message', this.onPostMessage));\n\n await loadScript(defaultScriptUrl);\n\n if (!(window as any).unlayer) {\n throw new Error('Unlayer embed script loaded but window.unlayer is missing');\n }\n\n this.editor = createUnlayerEditor(container, this.props);\n // The host may already have pushed a newer set through `setMergeTags`; keep it.\n this.mergeTagsConfig ??= toUnlayerMergeTags(this.props.mergeTags);\n this.editor.addEventListener('editor:ready', this.onEditorReady);\n this.editor.addEventListener('design:loaded', this.onDesignLoaded);\n this.editor.addEventListener('design:updated', this.onDesignUpdated);\n this.editor.registerCallback('image', this.uploadImage);\n\n this.iframe = container.querySelector(`iframe`) ?? undefined;\n\n if (!this.iframe) {\n logUnlayerError('Unlayer iframe was not created after createEditor');\n }\n\n this.startToolsReadyWatchdog();\n } catch (error: unknown) {\n this.isInit = false;\n this.clearToolsReadyWatchdog();\n logUnlayerError('Failed to initialize Unlayer editor', error);\n throw error;\n }\n };\n\n destroy = () => {\n this.clearToolsReadyWatchdog();\n window.removeEventListener('message', this.onPostMessage);\n\n if (this.editor) {\n this.editor.removeEventListener('editor:ready', this.onEditorReady);\n this.editor.removeEventListener('design:loaded', this.onDesignLoaded);\n this.editor.removeEventListener('design:updated', this.onDesignUpdated);\n this.editor.unregisterCallback('image', this.uploadImage);\n\n this.editor = undefined;\n }\n };\n\n addTwin = (twin: UnlayerEditorTwin) => {\n this.props.toolTwins?.push(twin);\n this.sendMessage('--add-twin', JSON.parse(JSON.stringify(twin)));\n };\n\n setDesign = (design?: UnlayerDesignFormat) => {\n if (!this.editor) {\n return;\n }\n\n this.hasDesign = !!design;\n\n if (design) {\n this.editor.loadDesign(design);\n }\n };\n\n setOnChange = (onChange?: UnlayerStore['onChangeCB']) => {\n this.onChangeCB = onChange;\n };\n\n setOnSnapshotSave = (onSnapshotSave?: UnlayerStore['onSnapshotSaveCB']) => {\n this.onSnapshotSaveCB = onSnapshotSave;\n };\n\n setOnReady = (onReady?: UnlayerStore['onReadyCB']) => {\n this.onReadyCB = onReady;\n };\n\n setOnImage = (onImage?: UnlayerStore['onImageCB']) => {\n this.onImageCB = onImage;\n };\n\n setOnError = (onError?: UnlayerStore['onErrorCB']) => {\n this.onErrorCB = onError;\n };\n\n setOnMessage = (onMessage?: UnlayerStore['onMessageCB']) => {\n this.onMessageCB = onMessage;\n };\n\n setOnFormSelect = (onFormSelect?: UnlayerStore['onFormSelectCB']) => {\n this.onFormSelectCB = onFormSelect;\n };\n\n setOnCalcFieldOpen = (onCalcFieldOpen?: UnlayerStore['onCalcFieldOpenCB']) => {\n this.onCalcFieldOpenCB = onCalcFieldOpen;\n };\n\n setOnCalcFieldSelect = (onCalcFieldSelect?: UnlayerStore['onCalcFieldSelectCB']) => {\n this.onCalcFieldSelectCB = onCalcFieldSelect;\n };\n\n sendFormList = (forms: FormInfo[]) => {\n this.sendMessage('--form-list', { forms });\n };\n\n sendFormFields = (formId: number, fields: FormFieldInfo[]) => {\n this.formFieldsByFormId[formId] = fields;\n this.updateFormFieldSamples(formId, fields);\n this.sendMessage('--form-fields', { formId, fields });\n };\n\n sendCalcFieldLabels = (labels: Record<string, string>) => {\n this.sendMessage('--calc-field-labels', { labels });\n };\n\n /**\n * Replaces the editor's merge tag menu. Nested groups passed to `createEditor` stop DTE\n * custom tools from registering, so init only carries the flat shape and the grouped\n * config is applied here once the editor is ready. A call before that (including the\n * initial props) is parked; a later call replaces it. A failed apply is retried on the\n * next `design:loaded`.\n */\n setMergeTags = (tags: UnlayerEditorMergeTagInfo[] | undefined) => {\n this.mergeTagsConfig = toUnlayerMergeTags(tags);\n this.isMergeTagsApplied = false;\n this.applyMergeTags();\n };\n\n private applyMergeTags = () => {\n if (\n !this.editor ||\n !this.isEditorReady ||\n this.isMergeTagsApplied ||\n !this.mergeTagsConfig\n ) {\n return;\n }\n\n try {\n this.editor.setMergeTags(this.mergeTagsConfig);\n this.isMergeTagsApplied = true;\n } catch (error: unknown) {\n logUnlayerError('Failed to apply merge tags', error);\n }\n };\n\n private onEditorReady = () => {\n this.isEditorReady = true;\n this.applyMergeTags();\n };\n\n private onDesignLoaded = () => {\n // A loaded design means the editor is up even if `editor:ready` never reached us.\n this.onEditorReady();\n\n if (!this.hasDesign) {\n this.hasDesign = true;\n this.editor?.setBodyValues({\n backgroundColor: 'rgba(0,0,0,0)',\n contentWidth: '100%',\n });\n }\n };\n\n private onDesignUpdated = (event: EventDesignUpdated) => {\n const isToolAdded = !eventsNotAddingTools.includes(event.type);\n const isToolsListChanged = !eventsNotChangingToolsList.includes(event.type);\n\n if (isToolAdded) {\n this.editor?.exportHtml(data => {\n let hasChanges = false;\n\n unlayerToolsIterate(data.design, tool => {\n const realTool = tool.slug\n ? unlayerToolsParseTwinKey(tool.slug ?? '')\n : undefined;\n\n if (realTool) {\n hasChanges = true;\n\n if (tool.slug) {\n delete data.design.counters[`u_content_custom_${tool.slug}`];\n delete tool.values._meta.htmlID;\n }\n\n tool.type = realTool.type;\n tool.slug = realTool.slug;\n }\n });\n\n // Duplicated contents/rows carry the original's instance GUIDs; give copies new ones.\n if (unlayerToolsDedupeInstanceIds(data.design, event.item?.values?._meta?.htmlID)) {\n hasChanges = true;\n }\n\n if (hasChanges) {\n this.setDesign(data.design);\n }\n\n this.onChangeCB?.({ isToolsListChanged });\n });\n } else {\n this.onChangeCB?.({ isToolsListChanged });\n }\n };\n\n private onPostMessage = (e: MessageEvent) => {\n if (!e.data?.['-dte-message-from']) {\n return;\n }\n\n const type = e.data?.['-dte-message-from']?.type;\n const data = e.data?.['-dte-message-from']?.data;\n\n if (!type) {\n return;\n }\n\n if (type === '--ready' || type === '--registered') {\n this.hasToolsRegistered = true;\n this.clearToolsReadyWatchdog();\n this.onReadyCB?.();\n } else if (type === '--core-loaded') {\n this.hasCoreLoaded = true;\n const configData: UnlayerEventConfig = {\n dummyData: this.props.dummyData,\n schema: this.props.schema,\n generics: this.props.generics,\n genericConfigMode: this.props.genericConfigMode,\n isSnapshotMode: this.props.isSnapshotMode,\n holidays: this.props.holidays,\n conditionalRulesEnabled:\n !!this.props.displayConditions || !!this.props.onConditionalsOpen,\n };\n\n this.sendMessage('--config', JSON.parse(JSON.stringify(configData)));\n } else if (type === '--form-select') {\n this.onFormSelectCB?.(data?.formId);\n } else if (type === '--calc-field-open') {\n this.onCalcFieldOpenCB?.(data?.usedFormIds ?? []);\n } else if (type === '--esign-offset-open') {\n this.openESignOffsetRules(data);\n } else if (type === '--calc-field-select') {\n if (this.onCalcFieldSelectCB) {\n this.onCalcFieldSelectCB(data?.fieldKeys ?? []);\n } else {\n this.sendCalcFieldLabels({});\n }\n } else if (type === '--data-loaded') {\n const data: UnlayerEventRegister = {\n customTools: this.props.tools.map(tool => ({ key: tool.key })),\n toolTwins: this.props.toolTwins,\n eSignRecipients: this.props.eSignRecipients,\n eSignFieldTypes: this.props.eSignFieldTypes,\n units: this.props.units?.map(unit => ({\n ...unit,\n values: {\n ...unit.values,\n adminConfig: undefined,\n },\n })),\n };\n\n this.sendMessage('--register', JSON.parse(JSON.stringify(data)));\n } else if (type === '--save-snapshot') {\n this.editor?.exportHtml(template => {\n unlayerToolsIterate(template.design, tool => {\n if (tool.values?.twin?.id === data.id) {\n if (!tool.slug) {\n return;\n }\n\n this.onSnapshotSaveCB?.({\n title: '',\n tool: tool.slug,\n values: tool.values,\n });\n return false;\n }\n });\n });\n }\n\n this.onMessageCB?.(type, data);\n };\n\n private openESignOffsetRules = (data?: Partial<UnlayerEventESignOffset>) => {\n const requestId = data?.requestId;\n\n if (!requestId) {\n return;\n }\n\n emitESignOffsetRequest({\n value: normalizeESignOffsetSettings(data.value),\n done: value => {\n const result: UnlayerEventESignOffset = { requestId, value };\n this.sendMessage('--esign-offset-result', JSON.parse(JSON.stringify(result)));\n },\n });\n };\n\n private updateFormFieldSamples = (formId: number, fields: FormFieldInfo[]) => {\n fields.forEach((field, index) => {\n const normalizedFieldId = String(field.id ?? '').replaceAll('-', '');\n if (!normalizedFieldId) {\n return;\n }\n\n const sampleValue = getFormFieldSampleValue(field, index);\n setByPath(\n this.formFieldSamples,\n `__submission_fields.${formId}.${normalizedFieldId}`,\n sampleValue,\n );\n this.formFieldSamples[`${FORM_FIELD_DATA_POINT_PREFIX}${normalizedFieldId}`] =\n sampleValue;\n });\n };\n\n private collectCalculatedFieldKeys = (design?: UnlayerDesignFormat): Set<string> => {\n const keys = new Set<string>();\n\n if (!design) {\n return keys;\n }\n\n unlayerToolsIterate(design, tool => {\n const calc = tool.values?.calculation;\n if (!calc || typeof calc !== 'object') {\n return;\n }\n\n if (typeof calc.expression === 'string') {\n for (const key of tokenizeFormulaFields(calc.expression)) {\n keys.add(key);\n }\n }\n\n if (calc.fieldLabels && typeof calc.fieldLabels === 'object') {\n Object.keys(calc.fieldLabels).forEach(key => keys.add(key));\n }\n });\n\n return keys;\n };\n\n private resolveDemoValue = (\n key: string,\n fallbackIndex: number,\n sourceData: Record<string, unknown>,\n ): unknown => {\n const parsedFormField = parseFormFieldKey(key);\n if (parsedFormField) {\n const normalizedFieldId = parsedFormField.fieldId;\n const formFields = this.formFieldsByFormId[parsedFormField.formId] ?? [];\n const fieldIndex = formFields.findIndex(\n field => String(field.id ?? '').replaceAll('-', '') === normalizedFieldId,\n );\n const field = fieldIndex >= 0 ? formFields[fieldIndex] : undefined;\n const sample = field\n ? getFormFieldSampleValue(field, fieldIndex)\n : getByPath(\n this.formFieldSamples,\n `__submission_fields.${parsedFormField.formId}.${normalizedFieldId}`,\n );\n\n if (sample !== undefined) {\n return sample;\n }\n\n return this.dateSchemaFieldKeys.has(key) ? '2026-01-15' : 44 + fallbackIndex;\n }\n\n const existing = getByPath(sourceData, key);\n if (existing !== undefined) {\n return existing;\n }\n\n if (this.dateSchemaFieldKeys.has(key)) {\n return '2026-01-15';\n }\n\n return 44 + fallbackIndex;\n };\n\n private buildCalculatedFieldDemoData = (\n design?: UnlayerDesignFormat,\n ): Record<string, unknown> => {\n const demoData: Record<string, unknown> = {};\n const usedKeys = Array.from(this.collectCalculatedFieldKeys(design));\n const sourceData = deepMerge(\n this.schemaDummyData,\n this.props.dummyData,\n this.formFieldSamples,\n );\n\n usedKeys.forEach((key, index) => {\n const value = this.resolveDemoValue(key, index, sourceData);\n setByPath(demoData, key, value);\n });\n\n return demoData;\n };\n\n private sendMessage = (type: string, data?: any) => {\n this.iframe?.contentWindow?.postMessage(\n {\n '-dte-message-to': {\n type,\n data,\n },\n },\n '*',\n );\n };\n\n private uploadImage = async (\n data: { attachments: File[] },\n done: (result: { progress: number; url?: string }) => void,\n ) => {\n if (!this.onImageCB) {\n done({ progress: 100 });\n throw new Error('image upload is not implemented');\n }\n\n if (!data.attachments?.length) {\n return;\n }\n\n const file = data.attachments[0];\n\n const res = await this.validateImage(file, {\n ...defaultImageValidation,\n ...(this.props.imageValidation ?? {}),\n });\n\n if (!res.isValid) {\n logUnlayerError(`Image validation failed: ${res.title}`, res.description);\n this.onErrorCB?.(res.title, res.description);\n return;\n }\n\n /*\n * Unlayer only leaves its \"uploading\" state when `done` receives a url, so `done` must not be\n * called before the upload succeeds or after it fails, otherwise the image widget gets stuck.\n */\n try {\n const { url } = await this.onImageCB(file);\n done({ progress: 100, url });\n } catch (error: unknown) {\n logUnlayerError('Image upload failed', error);\n this.onErrorCB?.(\n 'Image upload failed',\n error instanceof ImageUploadError\n ? error.message\n : 'Something went wrong while uploading the image. Please try again or select another image.',\n );\n }\n };\n\n private startToolsReadyWatchdog = () => {\n this.clearToolsReadyWatchdog();\n this.toolsReadyWatchdogId = window.setTimeout(() => {\n if (this.hasToolsRegistered) {\n return;\n }\n\n logUnlayerError(\n 'Unlayer custom tools did not finish loading. customJS may not have run, or tool registration stalled.',\n {\n hasCoreLoaded: this.hasCoreLoaded,\n hasToolsRegistered: this.hasToolsRegistered,\n },\n );\n this.onErrorCB?.(\n 'Editor failed to load custom tools',\n 'Unlayer custom tools did not finish loading. Check the browser console for [dte-unlayer] details.',\n );\n }, UNLAYER_TOOLS_READY_TIMEOUT_MS);\n };\n\n private clearToolsReadyWatchdog = () => {\n if (this.toolsReadyWatchdogId === undefined) {\n return;\n }\n\n window.clearTimeout(this.toolsReadyWatchdogId);\n this.toolsReadyWatchdogId = undefined;\n };\n\n private validateImage = async (\n file: File,\n imageValidation: { maxFileSize: number; maxWidth: number; maxHeight: number },\n ): Promise<{ isValid: boolean; title: string; description: string }> => {\n const { maxFileSize, maxHeight, maxWidth } = imageValidation;\n\n if (file.size > maxFileSize) {\n const maxSizeMB = (maxFileSize / 1024 / 1024).toFixed(2);\n const fileSizeMB = (file.size / 1024 / 1024).toFixed(2);\n return {\n isValid: false,\n title: 'Image size limit reached',\n description: `This image is ${fileSizeMB}MB, which is above the ${maxSizeMB}MB limit. Please upload a smaller file to continue.`,\n };\n }\n\n return new Promise(resolve => {\n const img = new Image();\n const objectUrl = URL.createObjectURL(file);\n\n img.onload = () => {\n URL.revokeObjectURL(objectUrl);\n const { height, width } = img;\n\n if (width > maxWidth || height > maxHeight) {\n resolve({\n isValid: false,\n title: 'Dimension limit reached',\n description: `These image dimensions (${width}x${height}px) exceed the ${maxWidth}x${maxHeight}px limit. Please resize the image and try again.`,\n });\n } else {\n resolve({ isValid: true, title: '', description: '' });\n }\n };\n\n img.onerror = () => {\n URL.revokeObjectURL(objectUrl);\n resolve({\n isValid: false,\n title: 'The image is broken',\n description:\n 'Looks like this image isn’t valid. Please choose another image and try again.',\n });\n };\n\n img.src = objectUrl;\n });\n };\n}\n"],"names":["emitESignOffsetRequest","ImageUploadError","loadScript","logUnlayerError","toUnlayerMergeTags","defaultImageValidation","normalizeESignOffsetSettings","unlayerSupportedFonts","getFormFieldSampleValue","parseFormFieldKey","schemaBuildMap","schemaIsDate","unlayerToolsParseTwinKey","unlayerToolsDedupeInstanceIds","unlayerToolsIterate","unlayerToolsNormalizeESignOffsets","createUnlayerEditor","DesignUpdatedEventType","defaultScriptUrl","UNLAYER_TOOLS_READY_TIMEOUT_MS","normalizeFontToken","font","replace","split","trim","toLowerCase","getDesignFontTokens","value","out","Array","isArray","item","key","fieldValue","Object","entries","add","fontFamilyValue","label","ensureChunksFonts","data","chunks","existingFonts","fonts","existingLabels","Set","map","f","usedFontTokens","design","html","labelToken","valueToken","isUsedInDesign","has","isUsedInHtml","some","token","includes","push","FORM_FIELD_DATA_POINT_PREFIX","getByPath","path","undefined","reduce","current","part","isPlainObject","deepMerge","sources","source","setByPath","target","parts","length","node","i","tokenizeFormulaFields","expression","regex","match","eventsNotChangingToolsList","ContentMoved","ContentModified","ColumnModified","RowMoved","RowModified","BodyModified","eventsNotAddingTools","ContentRemoved","ColumnRemoved","RowRemoved","UnlayerStore","props","unlayerRef","schemaDummyData","dateSchemaFieldKeys","editor","isInit","iframe","hasDesign","hasCoreLoaded","hasToolsRegistered","toolsReadyWatchdogId","formFieldsByFormId","formFieldSamples","isEditorReady","isMergeTagsApplied","mergeTagsConfig","onMessageCB","onChangeCB","onSnapshotSaveCB","onReadyCB","onImageCB","onErrorCB","onFormSelectCB","onCalcFieldOpenCB","onCalcFieldSelectCB","init","destroy","addTwin","setDesign","setOnChange","setOnSnapshotSave","setOnReady","setOnImage","setOnError","setOnMessage","setOnFormSelect","setOnCalcFieldOpen","setOnCalcFieldSelect","sendFormList","sendFormFields","sendCalcFieldLabels","setMergeTags","applyMergeTags","onEditorReady","onDesignLoaded","onDesignUpdated","onPostMessage","openESignOffsetRules","updateFormFieldSamples","collectCalculatedFieldKeys","resolveDemoValue","buildCalculatedFieldDemoData","sendMessage","uploadImage","startToolsReadyWatchdog","clearToolsReadyWatchdog","validateImage","container","setTimeout","window","addEventListener","unlayer","Error","mergeTags","registerCallback","querySelector","error","removeEventListener","unregisterCallback","twin","toolTwins","JSON","parse","stringify","loadDesign","onChange","onSnapshotSave","onReady","onImage","onError","onMessage","onFormSelect","onCalcFieldOpen","onCalcFieldSelect","forms","formId","fields","labels","tags","setBodyValues","backgroundColor","contentWidth","event","isToolAdded","type","isToolsListChanged","exportHtml","hasChanges","tool","realTool","slug","counters","values","_meta","htmlID","e","configData","dummyData","schema","generics","genericConfigMode","isSnapshotMode","holidays","conditionalRulesEnabled","displayConditions","onConditionalsOpen","usedFormIds","fieldKeys","customTools","tools","eSignRecipients","eSignFieldTypes","units","unit","adminConfig","template","id","title","requestId","done","result","forEach","field","index","normalizedFieldId","String","replaceAll","sampleValue","keys","calc","calculation","fieldLabels","fallbackIndex","sourceData","parsedFormField","fieldId","formFields","fieldIndex","findIndex","sample","existing","demoData","usedKeys","from","contentWindow","postMessage","progress","attachments","file","res","imageValidation","isValid","description","url","message","clearTimeout","maxFileSize","maxHeight","maxWidth","size","maxSizeMB","toFixed","fileSizeMB","Promise","resolve","img","Image","objectUrl","URL","createObjectURL","onload","revokeObjectURL","height","width","onerror","src","schemaData","filter","isValue","fullKey","saveDesign","cb"],"mappings":";;;;;;;;;;;;;AAAA,SAASA,sBAAsB,QAAQ,wCAAwC;AAC/E,SAASC,gBAAgB,QAAQ,uBAAuB;AACxD,SAASC,UAAU,QAAQ,eAAe;AAC1C,SAASC,eAAe,QAAQ,QAAQ;AACxC,SAASC,kBAAkB,QAAqC,eAAe;AAC/E,SAASC,sBAAsB,QAAQ,mBAAmB;AAO1D,SAASC,4BAA4B,QAAQ,yBAAyB;AACtE,SAASC,qBAAqB,QAAQ,iBAAiB;AACvD,SAGIC,uBAAuB,EACvBC,iBAAiB,QACd,iBAAiB;AACxB,SAASC,cAAc,EAAEC,YAAY,QAAQ,kBAAkB;AAC/D,SAASC,wBAAwB,QAAQ,iBAAiB;AAC1D,SACIC,6BAA6B,EAC7BC,mBAAmB,EACnBC,iCAAiC,QAC9B,UAAU;AACjB,SACIC,mBAAmB,EACnBC,sBAAsB,QAGnB,YAAY;AAQnB,MAAMC,mBAAmB;AACzB,MAAMC,iCAAiC;AAEvC,MAAMC,qBAAqB,CAACC,OACxBA,KAAKC,OAAO,CAAC,SAAS,IAAIC,KAAK,CAAC,IAAI,CAAC,EAAE,CAACC,IAAI,GAAGC,WAAW;AAE9D,MAAMC,sBAAsB,CAACC,OAAYC;IACrC,IAAI,CAACD,SAAS,OAAOA,UAAU,UAAU;QACrC;IACJ;IAEA,IAAIE,MAAMC,OAAO,CAACH,QAAQ;QACtB,KAAK,MAAMI,QAAQJ,MAAO;YACtBD,oBAAoBK,MAAMH;QAC9B;QAEA;IACJ;IAEA,KAAK,MAAM,CAACI,KAAKC,WAAW,IAAIC,OAAOC,OAAO,CAACR,OAAQ;QACnD,IAAIK,QAAQ,cAAc;YACtB,IAAI,OAAOC,eAAe,UAAU;gBAChCL,IAAIQ,GAAG,CAAChB,mBAAmBa;YAC/B,OAAO,IAAIA,cAAc,OAAOA,eAAe,UAAU;gBACrD,MAAMI,kBAAkBJ;gBAExB,IAAI,OAAOI,gBAAgBC,KAAK,KAAK,UAAU;oBAC3CV,IAAIQ,GAAG,CAAChB,mBAAmBiB,gBAAgBC,KAAK;gBACpD;gBAEA,IAAI,OAAOD,gBAAgBV,KAAK,KAAK,UAAU;oBAC3CC,IAAIQ,GAAG,CAAChB,mBAAmBiB,gBAAgBV,KAAK;gBACpD;YACJ;QACJ;QAEA,IAAIM,cAAc,OAAOA,eAAe,UAAU;YAC9CP,oBAAoBO,YAAYL;QACpC;IACJ;AACJ;AAEA,MAAMW,oBAAoB,CAACC;QAKvBA,OAAAA;IAJA,IAAI,CAACA,QAAQ,OAAOA,SAAS,UAAU;QACnC,OAAOA;IACX;KAEAA,UAAAA,CAAAA,QAAAA,MAAKC,MAAM,cAAXD,qBAAAA,UAAAA,MAAKC,MAAM,GAAK,CAAC;IAEjB,MAAMC,gBAAuBb,MAAMC,OAAO,CAACU,KAAKC,MAAM,CAACE,KAAK,IAAIH,KAAKC,MAAM,CAACE,KAAK,GAAG,EAAE;IACtF,MAAMC,iBAAiB,IAAIC,IAAIH,cAAcI,GAAG,CAAC,CAACC,IAAWA,EAAET,KAAK;IAEpE,MAAMU,iBAAiB,IAAIH;IAC3BnB,oBAAoBc,KAAKS,MAAM,EAAED;IAEjC,MAAME,OAAO,OAAOV,KAAKU,IAAI,KAAK,WAAWV,KAAKU,IAAI,CAACzB,WAAW,KAAK;IAEvE,KAAK,MAAMJ,QAAQd,sBAAuB;QACtC,MAAM4C,aAAa/B,mBAAmBC,KAAKiB,KAAK;QAChD,MAAMc,aAAahC,mBAAmBC,KAAKM,KAAK;QAChD,MAAM0B,iBAAiBL,eAAeM,GAAG,CAACH,eAAeH,eAAeM,GAAG,CAACF;QAC5E,MAAMG,eAAe;YAACJ;YAAYC;SAAW,CAACI,IAAI,CAACC,CAAAA,QAASP,KAAKQ,QAAQ,CAACD;QAE1E,IAAI,AAACJ,CAAAA,kBAAkBE,YAAW,KAAM,CAACX,eAAeU,GAAG,CAACjC,KAAKiB,KAAK,GAAG;YACrEI,cAAciB,IAAI,CAACtC;YACnBuB,eAAeR,GAAG,CAACf,KAAKiB,KAAK;QACjC;IACJ;IAEAE,KAAKC,MAAM,CAACE,KAAK,GAAGD;IACpB,OAAOF;AACX;AAEA,MAAMoB,+BAA+B;AAErC,MAAMC,YAAY,CAACrB,MAAesB;IAC9B,IAAI,CAACtB,QAAQ,OAAOA,SAAS,UAAU;QACnC,OAAOuB;IACX;IAEA,OAAOD,KAAKvC,KAAK,CAAC,KAAKyC,MAAM,CAAU,CAACC,SAASC;QAC7C,IAAI,CAACD,WAAW,OAAOA,YAAY,UAAU;YACzC,OAAOF;QACX;QAEA,OAAO,AAACE,OAAmC,CAACC,KAAK;IACrD,GAAG1B;AACP;AAEA,MAAM2B,gBAAgB,CAACxC,QACnB,CAAC,CAACA,SAAS,OAAOA,UAAU,YAAY,CAACE,MAAMC,OAAO,CAACH;AAE3D,MAAMyC,YAAY,CAAC,GAAGC;IAClB,MAAMzC,MAA+B,CAAC;IAEtC,KAAK,MAAM0C,UAAUD,QAAS;QAC1B,IAAI,CAACF,cAAcG,SAAS;YACxB;QACJ;QAEA,KAAK,MAAM,CAACtC,KAAKL,MAAM,IAAIO,OAAOC,OAAO,CAACmC,QAAS;YAC/C,IAAIH,cAAcxC,UAAUwC,cAAcvC,GAAG,CAACI,IAAI,GAAG;gBACjDJ,GAAG,CAACI,IAAI,GAAGoC,UAAUxC,GAAG,CAACI,IAAI,EAAEL;YACnC,OAAO;gBACHC,GAAG,CAACI,IAAI,GAAGL;YACf;QACJ;IACJ;IAEA,OAAOC;AACX;AAEA,MAAM2C,YAAY,CAACC,QAAiCV,MAAcnC;IAC9D,MAAM8C,QAAQX,KAAKvC,KAAK,CAAC;IACzB,IAAI,CAACkD,MAAMC,MAAM,EAAE;QACf;IACJ;IAEA,IAAIC,OAAgCH;IAEpC,IAAK,IAAII,IAAI,GAAGA,IAAIH,MAAMC,MAAM,GAAG,GAAGE,KAAK,EAAG;QAC1C,MAAM5C,MAAMyC,KAAK,CAACG,EAAE;QACpB,IAAI,CAACT,cAAcQ,IAAI,CAAC3C,IAAI,GAAG;YAC3B2C,IAAI,CAAC3C,IAAI,GAAG,CAAC;QACjB;QACA2C,OAAOA,IAAI,CAAC3C,IAAI;IACpB;IAEA2C,IAAI,CAACF,KAAK,CAACA,MAAMC,MAAM,GAAG,EAAE,CAAC,GAAG/C;AACpC;AAEA,MAAMkD,wBAAwB,CAACC;QAEpBA;IADP,MAAMC,QAAQ;IACd,QAAOD,oBAAAA,WAAWE,KAAK,CAACD,oBAAjBD,+BAAAA,oBAA2B,EAAE;AACxC;AAMA,mGAAmG;AACnG,MAAMG,6BAAuD;IACzDhE,uBAAuBiE,YAAY;IACnCjE,uBAAuBkE,eAAe;IACtClE,uBAAuBmE,cAAc;IACrCnE,uBAAuBoE,QAAQ;IAC/BpE,uBAAuBqE,WAAW;IAClCrE,uBAAuBsE,YAAY;CACtC;AAED,MAAMC,uBAAiD;OAChDP;IACHhE,uBAAuBwE,cAAc;IACrCxE,uBAAuByE,aAAa;IACpCzE,uBAAuB0E,UAAU;CACpC;AAED,OAAO,MAAMC;IA4BT,YAAY,AAASC,KAA+B,CAAE;;;QA3BtD,uBAASC,cAAT,KAAA;QACA,uBAAiBC,mBAAjB,KAAA;QACA,uBAAiBC,uBAAjB,KAAA;QAEA,uBAAQC,UAAR,KAAA;QACA,uBAAQC,UAAR,KAAA;QACA,uBAAQC,UAAR,KAAA;QACA,uBAAQC,aAAR,KAAA;QACA,uBAAQC,iBAAR,KAAA;QACA,uBAAQC,sBAAR,KAAA;QACA,uBAAQC,wBAAR,KAAA;QACA,uBAAQC,sBAAR,KAAA;QACA,uBAAQC,oBAAR,KAAA;QACA,uBAAQC,iBAAR,KAAA;QACA,uBAAQC,sBAAR,KAAA;QACA,uBAAQC,mBAAR,KAAA;QAEA,uBAAQC,eAAR,KAAA;QACA,uBAAQC,cAAR,KAAA;QACA,uBAAQC,oBAAR,KAAA;QACA,uBAAQC,aAAR,KAAA;QACA,uBAAQC,aAAR,KAAA;QACA,uBAAQC,aAAR,KAAA;QACA,uBAAQC,kBAAR,KAAA;QACA,uBAAQC,qBAAR,KAAA;QACA,uBAAQC,uBAAR,KAAA;QAoDAC,uBAAAA,QAAAA,KAAAA;QAuCAC,uBAAAA,WAAAA,KAAAA;QAcAC,uBAAAA,WAAAA,KAAAA;QAKAC,uBAAAA,aAAAA,KAAAA;QAYAC,uBAAAA,eAAAA,KAAAA;QAIAC,uBAAAA,qBAAAA,KAAAA;QAIAC,uBAAAA,cAAAA,KAAAA;QAIAC,uBAAAA,cAAAA,KAAAA;QAIAC,uBAAAA,cAAAA,KAAAA;QAIAC,uBAAAA,gBAAAA,KAAAA;QAIAC,uBAAAA,mBAAAA,KAAAA;QAIAC,uBAAAA,sBAAAA,KAAAA;QAIAC,uBAAAA,wBAAAA,KAAAA;QAIAC,uBAAAA,gBAAAA,KAAAA;QAIAC,uBAAAA,kBAAAA,KAAAA;QAMAC,uBAAAA,uBAAAA,KAAAA;QAIA;;;;;;KAMC,GACDC,uBAAAA,gBAAAA,KAAAA;QAMA,uBAAQC,kBAAR,KAAA;QAkBA,uBAAQC,iBAAR,KAAA;QAKA,uBAAQC,kBAAR,KAAA;QAaA,uBAAQC,mBAAR,KAAA;QA0CA,uBAAQC,iBAAR,KAAA;QAgFA,uBAAQC,wBAAR,KAAA;QAgBA,uBAAQC,0BAAR,KAAA;QAkBA,uBAAQC,8BAAR,KAAA;QA2BA,uBAAQC,oBAAR,KAAA;QAuCA,uBAAQC,gCAAR,KAAA;QAmBA,uBAAQC,eAAR,KAAA;QAYA,uBAAQC,eAAR,KAAA;QA4CA,uBAAQC,2BAAR,KAAA;QAqBA,uBAAQC,2BAAR,KAAA;QASA,uBAAQC,iBAAR,KAAA;aAliBqBxD,QAAAA;aAtBbK,SAAS;aAETE,YAAY;aACZC,gBAAgB;aAChBC,qBAAqB;aAErBE,qBAAsD,CAAC;aACvDC,mBAA4C,CAAC;aAC7CC,gBAAgB;aAChBC,qBAAqB;aA+D7BW,OAAO,OAAOgC;YACV,IAAI,IAAI,CAACpD,MAAM,EAAE;gBACb;YACJ;YAEA,IAAI,CAACA,MAAM,GAAG;YAEd,IAAI;oBAUA,gFAAgF;gBAChF,uBAMcoD;gBAhBdC,WAAW,IAAMC,OAAOC,gBAAgB,CAAC,WAAW,IAAI,CAACd,aAAa;gBAEtE,MAAMzI,WAAWgB;gBAEjB,IAAI,CAAC,AAACsI,OAAeE,OAAO,EAAE;oBAC1B,MAAM,IAAIC,MAAM;gBACpB;gBAEA,IAAI,CAAC1D,MAAM,GAAGjF,oBAAoBsI,WAAW,IAAI,CAACzD,KAAK;iBAEvD,wBAAA,IAAI,CAACe,eAAe,cAApB,mCAAA,wBAAA,IAAI,CAACA,eAAe,GAAKxG,mBAAmB,IAAI,CAACyF,KAAK,CAAC+D,SAAS;gBAChE,IAAI,CAAC3D,MAAM,CAACwD,gBAAgB,CAAC,gBAAgB,IAAI,CAACjB,aAAa;gBAC/D,IAAI,CAACvC,MAAM,CAACwD,gBAAgB,CAAC,iBAAiB,IAAI,CAAChB,cAAc;gBACjE,IAAI,CAACxC,MAAM,CAACwD,gBAAgB,CAAC,kBAAkB,IAAI,CAACf,eAAe;gBACnE,IAAI,CAACzC,MAAM,CAAC4D,gBAAgB,CAAC,SAAS,IAAI,CAACX,WAAW;gBAEtD,IAAI,CAAC/C,MAAM,IAAGmD,2BAAAA,UAAUQ,aAAa,CAAC,CAAC,MAAM,CAAC,eAAhCR,sCAAAA,2BAAqCvF;gBAEnD,IAAI,CAAC,IAAI,CAACoC,MAAM,EAAE;oBACdhG,gBAAgB;gBACpB;gBAEA,IAAI,CAACgJ,uBAAuB;YAChC,EAAE,OAAOY,OAAgB;gBACrB,IAAI,CAAC7D,MAAM,GAAG;gBACd,IAAI,CAACkD,uBAAuB;gBAC5BjJ,gBAAgB,uCAAuC4J;gBACvD,MAAMA;YACV;QACJ;aAEAxC,UAAU;YACN,IAAI,CAAC6B,uBAAuB;YAC5BI,OAAOQ,mBAAmB,CAAC,WAAW,IAAI,CAACrB,aAAa;YAExD,IAAI,IAAI,CAAC1C,MAAM,EAAE;gBACb,IAAI,CAACA,MAAM,CAAC+D,mBAAmB,CAAC,gBAAgB,IAAI,CAACxB,aAAa;gBAClE,IAAI,CAACvC,MAAM,CAAC+D,mBAAmB,CAAC,iBAAiB,IAAI,CAACvB,cAAc;gBACpE,IAAI,CAACxC,MAAM,CAAC+D,mBAAmB,CAAC,kBAAkB,IAAI,CAACtB,eAAe;gBACtE,IAAI,CAACzC,MAAM,CAACgE,kBAAkB,CAAC,SAAS,IAAI,CAACf,WAAW;gBAExD,IAAI,CAACjD,MAAM,GAAGlC;YAClB;QACJ;aAEAyD,UAAU,CAAC0C;gBACP;aAAA,wBAAA,IAAI,CAACrE,KAAK,CAACsE,SAAS,cAApB,4CAAA,sBAAsBxG,IAAI,CAACuG;YAC3B,IAAI,CAACjB,WAAW,CAAC,cAAcmB,KAAKC,KAAK,CAACD,KAAKE,SAAS,CAACJ;QAC7D;aAEAzC,YAAY,CAACxE;YACT,IAAI,CAAC,IAAI,CAACgD,MAAM,EAAE;gBACd;YACJ;YAEA,IAAI,CAACG,SAAS,GAAG,CAAC,CAACnD;YAEnB,IAAIA,QAAQ;gBACR,IAAI,CAACgD,MAAM,CAACsE,UAAU,CAACtH;YAC3B;QACJ;aAEAyE,cAAc,CAAC8C;YACX,IAAI,CAAC1D,UAAU,GAAG0D;QACtB;aAEA7C,oBAAoB,CAAC8C;YACjB,IAAI,CAAC1D,gBAAgB,GAAG0D;QAC5B;aAEA7C,aAAa,CAAC8C;YACV,IAAI,CAAC1D,SAAS,GAAG0D;QACrB;aAEA7C,aAAa,CAAC8C;YACV,IAAI,CAAC1D,SAAS,GAAG0D;QACrB;aAEA7C,aAAa,CAAC8C;YACV,IAAI,CAAC1D,SAAS,GAAG0D;QACrB;aAEA7C,eAAe,CAAC8C;YACZ,IAAI,CAAChE,WAAW,GAAGgE;QACvB;aAEA7C,kBAAkB,CAAC8C;YACf,IAAI,CAAC3D,cAAc,GAAG2D;QAC1B;aAEA7C,qBAAqB,CAAC8C;YAClB,IAAI,CAAC3D,iBAAiB,GAAG2D;QAC7B;aAEA7C,uBAAuB,CAAC8C;YACpB,IAAI,CAAC3D,mBAAmB,GAAG2D;QAC/B;aAEA7C,eAAe,CAAC8C;YACZ,IAAI,CAAChC,WAAW,CAAC,eAAe;gBAAEgC;YAAM;QAC5C;aAEA7C,iBAAiB,CAAC8C,QAAgBC;YAC9B,IAAI,CAAC3E,kBAAkB,CAAC0E,OAAO,GAAGC;YAClC,IAAI,CAACtC,sBAAsB,CAACqC,QAAQC;YACpC,IAAI,CAAClC,WAAW,CAAC,iBAAiB;gBAAEiC;gBAAQC;YAAO;QACvD;aAEA9C,sBAAsB,CAAC+C;YACnB,IAAI,CAACnC,WAAW,CAAC,uBAAuB;gBAAEmC;YAAO;QACrD;aASA9C,eAAe,CAAC+C;YACZ,IAAI,CAACzE,eAAe,GAAGxG,mBAAmBiL;YAC1C,IAAI,CAAC1E,kBAAkB,GAAG;YAC1B,IAAI,CAAC4B,cAAc;QACvB;aAEQA,iBAAiB;YACrB,IACI,CAAC,IAAI,CAACtC,MAAM,IACZ,CAAC,IAAI,CAACS,aAAa,IACnB,IAAI,CAACC,kBAAkB,IACvB,CAAC,IAAI,CAACC,eAAe,EACvB;gBACE;YACJ;YAEA,IAAI;gBACA,IAAI,CAACX,MAAM,CAACqC,YAAY,CAAC,IAAI,CAAC1B,eAAe;gBAC7C,IAAI,CAACD,kBAAkB,GAAG;YAC9B,EAAE,OAAOoD,OAAgB;gBACrB5J,gBAAgB,8BAA8B4J;YAClD;QACJ;aAEQvB,gBAAgB;YACpB,IAAI,CAAC9B,aAAa,GAAG;YACrB,IAAI,CAAC6B,cAAc;QACvB;aAEQE,iBAAiB;YACrB,kFAAkF;YAClF,IAAI,CAACD,aAAa;YAElB,IAAI,CAAC,IAAI,CAACpC,SAAS,EAAE;oBAEjB;gBADA,IAAI,CAACA,SAAS,GAAG;iBACjB,eAAA,IAAI,CAACH,MAAM,cAAX,mCAAA,aAAaqF,aAAa,CAAC;oBACvBC,iBAAiB;oBACjBC,cAAc;gBAClB;YACJ;QACJ;aAEQ9C,kBAAkB,CAAC+C;YACvB,MAAMC,cAAc,CAAClG,qBAAqB9B,QAAQ,CAAC+H,MAAME,IAAI;YAC7D,MAAMC,qBAAqB,CAAC3G,2BAA2BvB,QAAQ,CAAC+H,MAAME,IAAI;YAE1E,IAAID,aAAa;oBACb;iBAAA,eAAA,IAAI,CAACzF,MAAM,cAAX,mCAAA,aAAa4F,UAAU,CAACrJ,CAAAA;wBAsB2BiJ,0BAAAA,oBAAAA,aAQ/C,kBAAA;oBA7BA,IAAIK,aAAa;oBAEjBhL,oBAAoB0B,KAAKS,MAAM,EAAE8I,CAAAA;4BAEEA;wBAD/B,MAAMC,WAAWD,KAAKE,IAAI,GACpBrL,0BAAyBmL,aAAAA,KAAKE,IAAI,cAATF,wBAAAA,aAAa,MACtChI;wBAEN,IAAIiI,UAAU;4BACVF,aAAa;4BAEb,IAAIC,KAAKE,IAAI,EAAE;gCACX,OAAOzJ,KAAKS,MAAM,CAACiJ,QAAQ,CAAC,CAAC,iBAAiB,EAAEH,KAAKE,IAAI,EAAE,CAAC;gCAC5D,OAAOF,KAAKI,MAAM,CAACC,KAAK,CAACC,MAAM;4BACnC;4BAEAN,KAAKJ,IAAI,GAAGK,SAASL,IAAI;4BACzBI,KAAKE,IAAI,GAAGD,SAASC,IAAI;wBAC7B;oBACJ;oBAEA,sFAAsF;oBACtF,IAAIpL,8BAA8B2B,KAAKS,MAAM,GAAEwI,cAAAA,MAAM1J,IAAI,cAAV0J,mCAAAA,qBAAAA,YAAYU,MAAM,cAAlBV,0CAAAA,2BAAAA,mBAAoBW,KAAK,cAAzBX,+CAAAA,yBAA2BY,MAAM,GAAG;wBAC/EP,aAAa;oBACjB;oBAEA,IAAIA,YAAY;wBACZ,IAAI,CAACrE,SAAS,CAACjF,KAAKS,MAAM;oBAC9B;qBAEA,mBAAA,CAAA,QAAA,IAAI,EAAC6D,UAAU,cAAf,uCAAA,sBAAA,OAAkB;wBAAE8E;oBAAmB;gBAC3C;YACJ,OAAO;oBACH,kBAAA;iBAAA,mBAAA,CAAA,QAAA,IAAI,EAAC9E,UAAU,cAAf,uCAAA,sBAAA,OAAkB;oBAAE8E;gBAAmB;YAC3C;QACJ;aAEQjD,gBAAgB,CAAC2D;gBAChBA,SAIQA,wBAAAA,UACAA,yBAAAA,UAuEb,mBAAA;YA5EA,IAAI,GAACA,UAAAA,EAAE9J,IAAI,cAAN8J,8BAAAA,OAAQ,CAAC,oBAAoB,GAAE;gBAChC;YACJ;YAEA,MAAMX,QAAOW,WAAAA,EAAE9J,IAAI,cAAN8J,gCAAAA,yBAAAA,QAAQ,CAAC,oBAAoB,cAA7BA,6CAAAA,uBAA+BX,IAAI;YAChD,MAAMnJ,QAAO8J,WAAAA,EAAE9J,IAAI,cAAN8J,gCAAAA,0BAAAA,QAAQ,CAAC,oBAAoB,cAA7BA,8CAAAA,wBAA+B9J,IAAI;YAEhD,IAAI,CAACmJ,MAAM;gBACP;YACJ;YAEA,IAAIA,SAAS,aAAaA,SAAS,gBAAgB;oBAG/C,iBAAA;gBAFA,IAAI,CAACrF,kBAAkB,GAAG;gBAC1B,IAAI,CAAC8C,uBAAuB;iBAC5B,kBAAA,CAAA,SAAA,IAAI,EAACpC,SAAS,cAAd,sCAAA,qBAAA;YACJ,OAAO,IAAI2E,SAAS,iBAAiB;gBACjC,IAAI,CAACtF,aAAa,GAAG;gBACrB,MAAMkG,aAAiC;oBACnCC,WAAW,IAAI,CAAC3G,KAAK,CAAC2G,SAAS;oBAC/BC,QAAQ,IAAI,CAAC5G,KAAK,CAAC4G,MAAM;oBACzBC,UAAU,IAAI,CAAC7G,KAAK,CAAC6G,QAAQ;oBAC7BC,mBAAmB,IAAI,CAAC9G,KAAK,CAAC8G,iBAAiB;oBAC/CC,gBAAgB,IAAI,CAAC/G,KAAK,CAAC+G,cAAc;oBACzCC,UAAU,IAAI,CAAChH,KAAK,CAACgH,QAAQ;oBAC7BC,yBACI,CAAC,CAAC,IAAI,CAACjH,KAAK,CAACkH,iBAAiB,IAAI,CAAC,CAAC,IAAI,CAAClH,KAAK,CAACmH,kBAAkB;gBACzE;gBAEA,IAAI,CAAC/D,WAAW,CAAC,YAAYmB,KAAKC,KAAK,CAACD,KAAKE,SAAS,CAACiC;YAC3D,OAAO,IAAIZ,SAAS,iBAAiB;oBACjC,sBAAA;iBAAA,uBAAA,CAAA,SAAA,IAAI,EAACxE,cAAc,cAAnB,2CAAA,0BAAA,QAAsB3E,iBAAAA,2BAAAA,KAAM0I,MAAM;YACtC,OAAO,IAAIS,SAAS,qBAAqB;;oBACrC,yBAAA;iBAAA,0BAAA,CAAA,SAAA,IAAI,EAACvE,iBAAiB,cAAtB,8CAAA,6BAAA,gBAAyB5E,iBAAAA,2BAAAA,KAAMyK,WAAW,uCAAI,EAAE;YACpD,OAAO,IAAItB,SAAS,uBAAuB;gBACvC,IAAI,CAAC/C,oBAAoB,CAACpG;YAC9B,OAAO,IAAImJ,SAAS,uBAAuB;gBACvC,IAAI,IAAI,CAACtE,mBAAmB,EAAE;;oBAC1B,IAAI,CAACA,mBAAmB,UAAC7E,iBAAAA,2BAAAA,KAAM0K,SAAS,yCAAI,EAAE;gBAClD,OAAO;oBACH,IAAI,CAAC7E,mBAAmB,CAAC,CAAC;gBAC9B;YACJ,OAAO,IAAIsD,SAAS,iBAAiB;oBAMtB;gBALX,MAAMnJ,OAA6B;oBAC/B2K,aAAa,IAAI,CAACtH,KAAK,CAACuH,KAAK,CAACtK,GAAG,CAACiJ,CAAAA,OAAS,CAAA;4BAAE/J,KAAK+J,KAAK/J,GAAG;wBAAC,CAAA;oBAC3DmI,WAAW,IAAI,CAACtE,KAAK,CAACsE,SAAS;oBAC/BkD,iBAAiB,IAAI,CAACxH,KAAK,CAACwH,eAAe;oBAC3CC,iBAAiB,IAAI,CAACzH,KAAK,CAACyH,eAAe;oBAC3CC,KAAK,GAAE,oBAAA,IAAI,CAAC1H,KAAK,CAAC0H,KAAK,cAAhB,wCAAA,kBAAkBzK,GAAG,CAAC0K,CAAAA,OAAS,CAAA;4BAClC,GAAGA,IAAI;4BACPrB,QAAQ;gCACJ,GAAGqB,KAAKrB,MAAM;gCACdsB,aAAa1J;4BACjB;wBACJ,CAAA;gBACJ;gBAEA,IAAI,CAACkF,WAAW,CAAC,cAAcmB,KAAKC,KAAK,CAACD,KAAKE,SAAS,CAAC9H;YAC7D,OAAO,IAAImJ,SAAS,mBAAmB;oBACnC;iBAAA,eAAA,IAAI,CAAC1F,MAAM,cAAX,mCAAA,aAAa4F,UAAU,CAAC6B,CAAAA;oBACpB5M,oBAAoB4M,SAASzK,MAAM,EAAE8I,CAAAA;4BAC7BA,mBAAAA;wBAAJ,IAAIA,EAAAA,eAAAA,KAAKI,MAAM,cAAXJ,oCAAAA,oBAAAA,aAAa7B,IAAI,cAAjB6B,wCAAAA,kBAAmB4B,EAAE,MAAKnL,KAAKmL,EAAE,EAAE;gCAKnC,wBAAA;4BAJA,IAAI,CAAC5B,KAAKE,IAAI,EAAE;gCACZ;4BACJ;6BAEA,yBAAA,CAAA,QAAA,IAAI,EAAClF,gBAAgB,cAArB,6CAAA,4BAAA,OAAwB;gCACpB6G,OAAO;gCACP7B,MAAMA,KAAKE,IAAI;gCACfE,QAAQJ,KAAKI,MAAM;4BACvB;4BACA,OAAO;wBACX;oBACJ;gBACJ;YACJ;aAEA,oBAAA,CAAA,QAAA,IAAI,EAACtF,WAAW,cAAhB,wCAAA,uBAAA,OAAmB8E,MAAMnJ;QAC7B;aAEQoG,uBAAuB,CAACpG;YAC5B,MAAMqL,YAAYrL,iBAAAA,2BAAAA,KAAMqL,SAAS;YAEjC,IAAI,CAACA,WAAW;gBACZ;YACJ;YAEA7N,uBAAuB;gBACnB2B,OAAOrB,6BAA6BkC,KAAKb,KAAK;gBAC9CmM,MAAMnM,CAAAA;oBACF,MAAMoM,SAAkC;wBAAEF;wBAAWlM;oBAAM;oBAC3D,IAAI,CAACsH,WAAW,CAAC,yBAAyBmB,KAAKC,KAAK,CAACD,KAAKE,SAAS,CAACyD;gBACxE;YACJ;QACJ;aAEQlF,yBAAyB,CAACqC,QAAgBC;YAC9CA,OAAO6C,OAAO,CAAC,CAACC,OAAOC;oBACcD;gBAAjC,MAAME,oBAAoBC,QAAOH,YAAAA,MAAMN,EAAE,cAARM,uBAAAA,YAAY,IAAII,UAAU,CAAC,KAAK;gBACjE,IAAI,CAACF,mBAAmB;oBACpB;gBACJ;gBAEA,MAAMG,cAAc9N,wBAAwByN,OAAOC;gBACnD3J,UACI,IAAI,CAACkC,gBAAgB,EACrB,CAAC,oBAAoB,EAAEyE,OAAO,CAAC,EAAEiD,mBAAmB,EACpDG;gBAEJ,IAAI,CAAC7H,gBAAgB,CAAC,GAAG7C,+BAA+BuK,mBAAmB,CAAC,GACxEG;YACR;QACJ;aAEQxF,6BAA6B,CAAC7F;YAClC,MAAMsL,OAAO,IAAI1L;YAEjB,IAAI,CAACI,QAAQ;gBACT,OAAOsL;YACX;YAEAzN,oBAAoBmC,QAAQ8I,CAAAA;oBACXA;gBAAb,MAAMyC,QAAOzC,eAAAA,KAAKI,MAAM,cAAXJ,mCAAAA,aAAa0C,WAAW;gBACrC,IAAI,CAACD,QAAQ,OAAOA,SAAS,UAAU;oBACnC;gBACJ;gBAEA,IAAI,OAAOA,KAAK1J,UAAU,KAAK,UAAU;oBACrC,KAAK,MAAM9C,OAAO6C,sBAAsB2J,KAAK1J,UAAU,EAAG;wBACtDyJ,KAAKnM,GAAG,CAACJ;oBACb;gBACJ;gBAEA,IAAIwM,KAAKE,WAAW,IAAI,OAAOF,KAAKE,WAAW,KAAK,UAAU;oBAC1DxM,OAAOqM,IAAI,CAACC,KAAKE,WAAW,EAAEV,OAAO,CAAChM,CAAAA,MAAOuM,KAAKnM,GAAG,CAACJ;gBAC1D;YACJ;YAEA,OAAOuM;QACX;aAEQxF,mBAAmB,CACvB/G,KACA2M,eACAC;YAEA,MAAMC,kBAAkBpO,kBAAkBuB;YAC1C,IAAI6M,iBAAiB;oBAEE;gBADnB,MAAMV,oBAAoBU,gBAAgBC,OAAO;gBACjD,MAAMC,cAAa,kDAAA,IAAI,CAACvI,kBAAkB,CAACqI,gBAAgB3D,MAAM,CAAC,cAA/C,6DAAA,kDAAmD,EAAE;gBACxE,MAAM8D,aAAaD,WAAWE,SAAS,CACnChB,CAAAA;wBAAgBA;2BAAPG,QAAOH,YAAAA,MAAMN,EAAE,cAARM,uBAAAA,YAAY,IAAII,UAAU,CAAC,KAAK,QAAQF;;gBAE5D,MAAMF,QAAQe,cAAc,IAAID,UAAU,CAACC,WAAW,GAAGjL;gBACzD,MAAMmL,SAASjB,QACTzN,wBAAwByN,OAAOe,cAC/BnL,UACI,IAAI,CAAC4C,gBAAgB,EACrB,CAAC,oBAAoB,EAAEoI,gBAAgB3D,MAAM,CAAC,CAAC,EAAEiD,mBAAmB;gBAG9E,IAAIe,WAAWnL,WAAW;oBACtB,OAAOmL;gBACX;gBAEA,OAAO,IAAI,CAAClJ,mBAAmB,CAAC1C,GAAG,CAACtB,OAAO,eAAe,KAAK2M;YACnE;YAEA,MAAMQ,WAAWtL,UAAU+K,YAAY5M;YACvC,IAAImN,aAAapL,WAAW;gBACxB,OAAOoL;YACX;YAEA,IAAI,IAAI,CAACnJ,mBAAmB,CAAC1C,GAAG,CAACtB,MAAM;gBACnC,OAAO;YACX;YAEA,OAAO,KAAK2M;QAChB;aAEQ3F,+BAA+B,CACnC/F;YAEA,MAAMmM,WAAoC,CAAC;YAC3C,MAAMC,WAAWxN,MAAMyN,IAAI,CAAC,IAAI,CAACxG,0BAA0B,CAAC7F;YAC5D,MAAM2L,aAAaxK,UACf,IAAI,CAAC2B,eAAe,EACpB,IAAI,CAACF,KAAK,CAAC2G,SAAS,EACpB,IAAI,CAAC/F,gBAAgB;YAGzB4I,SAASrB,OAAO,CAAC,CAAChM,KAAKkM;gBACnB,MAAMvM,QAAQ,IAAI,CAACoH,gBAAgB,CAAC/G,KAAKkM,OAAOU;gBAChDrK,UAAU6K,UAAUpN,KAAKL;YAC7B;YAEA,OAAOyN;QACX;aAEQnG,cAAc,CAAC0C,MAAcnJ;gBACjC,4BAAA;aAAA,eAAA,IAAI,CAAC2D,MAAM,cAAX,oCAAA,6BAAA,aAAaoJ,aAAa,cAA1B,iDAAA,2BAA4BC,WAAW,CACnC;gBACI,mBAAmB;oBACf7D;oBACAnJ;gBACJ;YACJ,GACA;QAER;aAEQ0G,cAAc,OAClB1G,MACAsL;gBAeQ;gBARHtL;YALL,IAAI,CAAC,IAAI,CAACyE,SAAS,EAAE;gBACjB6G,KAAK;oBAAE2B,UAAU;gBAAI;gBACrB,MAAM,IAAI9F,MAAM;YACpB;YAEA,IAAI,GAACnH,oBAAAA,KAAKkN,WAAW,cAAhBlN,wCAAAA,kBAAkBkC,MAAM,GAAE;gBAC3B;YACJ;YAEA,MAAMiL,OAAOnN,KAAKkN,WAAW,CAAC,EAAE;YAEhC,MAAME,MAAM,MAAM,IAAI,CAACvG,aAAa,CAACsG,MAAM;gBACvC,GAAGtP,sBAAsB;oBACrB,8BAAA,IAAI,CAACwF,KAAK,CAACgK,eAAe,cAA1B,yCAAA,8BAA8B,CAAC,CAAnC;YACJ;YAEA,IAAI,CAACD,IAAIE,OAAO,EAAE;oBAEd,iBAAA;gBADA3P,gBAAgB,CAAC,yBAAyB,EAAEyP,IAAIhC,KAAK,EAAE,EAAEgC,IAAIG,WAAW;iBACxE,kBAAA,CAAA,QAAA,IAAI,EAAC7I,SAAS,cAAd,sCAAA,qBAAA,OAAiB0I,IAAIhC,KAAK,EAAEgC,IAAIG,WAAW;gBAC3C;YACJ;YAEA;;;SAGC,GACD,IAAI;gBACA,MAAM,EAAEC,GAAG,EAAE,GAAG,MAAM,IAAI,CAAC/I,SAAS,CAAC0I;gBACrC7B,KAAK;oBAAE2B,UAAU;oBAAKO;gBAAI;YAC9B,EAAE,OAAOjG,OAAgB;oBAErB,kBAAA;gBADA5J,gBAAgB,uBAAuB4J;iBACvC,mBAAA,CAAA,SAAA,IAAI,EAAC7C,SAAS,cAAd,uCAAA,sBAAA,QACI,uBACA6C,iBAAiB9J,mBACX8J,MAAMkG,OAAO,GACb;YAEd;QACJ;aAEQ9G,0BAA0B;YAC9B,IAAI,CAACC,uBAAuB;YAC5B,IAAI,CAAC7C,oBAAoB,GAAGiD,OAAOD,UAAU,CAAC;oBAY1C,iBAAA;gBAXA,IAAI,IAAI,CAACjD,kBAAkB,EAAE;oBACzB;gBACJ;gBAEAnG,gBACI,yGACA;oBACIkG,eAAe,IAAI,CAACA,aAAa;oBACjCC,oBAAoB,IAAI,CAACA,kBAAkB;gBAC/C;iBAEJ,kBAAA,CAAA,QAAA,IAAI,EAACY,SAAS,cAAd,sCAAA,qBAAA,OACI,sCACA;YAER,GAAG/F;QACP;aAEQiI,0BAA0B;YAC9B,IAAI,IAAI,CAAC7C,oBAAoB,KAAKxC,WAAW;gBACzC;YACJ;YAEAyF,OAAO0G,YAAY,CAAC,IAAI,CAAC3J,oBAAoB;YAC7C,IAAI,CAACA,oBAAoB,GAAGxC;QAChC;aAEQsF,gBAAgB,OACpBsG,MACAE;YAEA,MAAM,EAAEM,WAAW,EAAEC,SAAS,EAAEC,QAAQ,EAAE,GAAGR;YAE7C,IAAIF,KAAKW,IAAI,GAAGH,aAAa;gBACzB,MAAMI,YAAY,AAACJ,CAAAA,cAAc,OAAO,IAAG,EAAGK,OAAO,CAAC;gBACtD,MAAMC,aAAa,AAACd,CAAAA,KAAKW,IAAI,GAAG,OAAO,IAAG,EAAGE,OAAO,CAAC;gBACrD,OAAO;oBACHV,SAAS;oBACTlC,OAAO;oBACPmC,aAAa,CAAC,cAAc,EAAEU,WAAW,uBAAuB,EAAEF,UAAU,mDAAmD,CAAC;gBACpI;YACJ;YAEA,OAAO,IAAIG,QAAQC,CAAAA;gBACf,MAAMC,MAAM,IAAIC;gBAChB,MAAMC,YAAYC,IAAIC,eAAe,CAACrB;gBAEtCiB,IAAIK,MAAM,GAAG;oBACTF,IAAIG,eAAe,CAACJ;oBACpB,MAAM,EAAEK,MAAM,EAAEC,KAAK,EAAE,GAAGR;oBAE1B,IAAIQ,QAAQf,YAAYc,SAASf,WAAW;wBACxCO,QAAQ;4BACJb,SAAS;4BACTlC,OAAO;4BACPmC,aAAa,CAAC,wBAAwB,EAAEqB,MAAM,CAAC,EAAED,OAAO,eAAe,EAAEd,SAAS,CAAC,EAAED,UAAU,gDAAgD,CAAC;wBACpJ;oBACJ,OAAO;wBACHO,QAAQ;4BAAEb,SAAS;4BAAMlC,OAAO;4BAAImC,aAAa;wBAAG;oBACxD;gBACJ;gBAEAa,IAAIS,OAAO,GAAG;oBACVN,IAAIG,eAAe,CAACJ;oBACpBH,QAAQ;wBACJb,SAAS;wBACTlC,OAAO;wBACPmC,aACI;oBACR;gBACJ;gBAEAa,IAAIU,GAAG,GAAGR;YACd;QACJ;QAhlBI,MAAMS,aAAa,IAAI,CAAC1L,KAAK,CAAC4G,MAAM,GAAG/L,eAAe,IAAI,CAACmF,KAAK,CAAC4G,MAAM,IAAI1I;QAC3E,IAAI,CAACgC,eAAe,WAAIwL,uBAAAA,iCAAAA,WAAY/E,SAAS,uCAAI,CAAC;QAClD,IAAI,CAACxG,mBAAmB,GAAG,IAAInD,IAC3BX,OAAOiK,MAAM,UAACoF,uBAAAA,iCAAAA,WAAYzO,GAAG,yCAAI,CAAC,GAC7B0O,MAAM,CAACvD,CAAAA,QAASA,MAAMwD,OAAO,IAAI9Q,aAAasN,MAAMtJ,IAAI,GACxD7B,GAAG,CAACmL,CAAAA,QAASA,MAAMyD,OAAO;QAGnC,IAAI,CAAC7L,KAAK,CAACyH,eAAe,GAAG;YACzB;YACA;YACA;YACA;YACA;SACH;QAED,IAAI,CAACxH,UAAU,GAAG;YACdyE,YAAYtH,CAAAA;oBACR;iBAAA,eAAA,IAAI,CAACgD,MAAM,cAAX,mCAAA,aAAasE,UAAU,CAACtH;YAC5B;YACA0O,YAAYC,CAAAA;oBACR;iBAAA,eAAA,IAAI,CAAC3L,MAAM,cAAX,mCAAA,aAAa0L,UAAU,CAAC1O,CAAAA;oBACpBlC,kCAAkCkC;oBAClC2O,GAAG3O;gBACP;YACJ;YACA4I,YAAY+F,CAAAA;oBACR;iBAAA,eAAA,IAAI,CAAC3L,MAAM,cAAX,mCAAA,aAAa4F,UAAU,CAACrJ,CAAAA;oBACpB,MAAMuL,SAASxL,kBAAkBC;oBACjCzB,kCAAkCgN,mBAAAA,6BAAAA,OAAQ9K,MAAM;oBAChD8K,OAAOqB,QAAQ,GAAG,IAAI,CAACpG,4BAA4B,CAAC+E,OAAO9K,MAAM;oBACjE2O,GAAG7D;gBACP;YACJ;YACA5F,cAAc8C,CAAAA;gBACV,IAAI,CAAC9C,YAAY,CAAC8C;YACtB;YACA7C,gBAAgB,CAAC8C,QAAQC;gBACrB,IAAI,CAAC/C,cAAc,CAAC8C,QAAQC;YAChC;YACA9C,qBAAqB+C,CAAAA;gBACjB,IAAI,CAAC/C,mBAAmB,CAAC+C;YAC7B;YACA9C,cAAc+C,CAAAA;gBACV,IAAI,CAAC/C,YAAY,CAAC+C;YACtB;QACJ;IACJ;AAkiBJ"}
|
package/package.json
CHANGED
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { ImageUploadError } from '../image-upload-error';
|
|
2
|
+
import { UnlayerStore } from '../store';
|
|
3
|
+
|
|
4
|
+
const editorMock = {
|
|
5
|
+
addEventListener: jest.fn(),
|
|
6
|
+
removeEventListener: jest.fn(),
|
|
7
|
+
registerCallback: jest.fn(),
|
|
8
|
+
unregisterCallback: jest.fn(),
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
jest.mock('../loadScript', () => ({ loadScript: jest.fn().mockResolvedValue(undefined) }));
|
|
12
|
+
jest.mock('../unlayer', () => ({
|
|
13
|
+
...jest.requireActual('../unlayer'),
|
|
14
|
+
createUnlayerEditor: jest.fn(() => editorMock),
|
|
15
|
+
}));
|
|
16
|
+
|
|
17
|
+
class LoadedImageMock {
|
|
18
|
+
width = 100;
|
|
19
|
+
height = 100;
|
|
20
|
+
onload?: () => void;
|
|
21
|
+
onerror?: () => void;
|
|
22
|
+
|
|
23
|
+
set src(_: string) {
|
|
24
|
+
setTimeout(() => this.onload?.());
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
const GENERIC_DESCRIPTION =
|
|
29
|
+
'Something went wrong while uploading the image. Please try again or select another image.';
|
|
30
|
+
|
|
31
|
+
describe('UnlayerStore image upload', () => {
|
|
32
|
+
const originalImage = window.Image;
|
|
33
|
+
const originalCreateObjectURL = URL.createObjectURL;
|
|
34
|
+
const originalRevokeObjectURL = URL.revokeObjectURL;
|
|
35
|
+
|
|
36
|
+
let store: UnlayerStore;
|
|
37
|
+
let onError: jest.Mock;
|
|
38
|
+
let done: jest.Mock;
|
|
39
|
+
|
|
40
|
+
const uploadImage = () => {
|
|
41
|
+
const [, handler] = editorMock.registerCallback.mock.calls.find(
|
|
42
|
+
([name]) => name === 'image',
|
|
43
|
+
);
|
|
44
|
+
const file = new File(['img'], 'logo.png', { type: 'image/png' });
|
|
45
|
+
|
|
46
|
+
return handler({ attachments: [file] }, done);
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
beforeEach(async () => {
|
|
50
|
+
jest.clearAllMocks();
|
|
51
|
+
jest.spyOn(console, 'error').mockImplementation(() => undefined);
|
|
52
|
+
window.Image = LoadedImageMock as unknown as typeof Image;
|
|
53
|
+
URL.createObjectURL = jest.fn(() => 'blob:logo');
|
|
54
|
+
URL.revokeObjectURL = jest.fn();
|
|
55
|
+
(window as any).unlayer = {};
|
|
56
|
+
|
|
57
|
+
onError = jest.fn();
|
|
58
|
+
done = jest.fn();
|
|
59
|
+
store = new UnlayerStore({ tools: [] });
|
|
60
|
+
store.setOnError(onError);
|
|
61
|
+
|
|
62
|
+
const container = document.createElement('div');
|
|
63
|
+
container.appendChild(document.createElement('iframe'));
|
|
64
|
+
await store.init(container);
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
afterEach(() => {
|
|
68
|
+
store.destroy();
|
|
69
|
+
window.Image = originalImage;
|
|
70
|
+
URL.createObjectURL = originalCreateObjectURL;
|
|
71
|
+
URL.revokeObjectURL = originalRevokeObjectURL;
|
|
72
|
+
jest.restoreAllMocks();
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
describe('when the host resolves with a url', () => {
|
|
76
|
+
beforeEach(async () => {
|
|
77
|
+
store.setOnImage(jest.fn().mockResolvedValue({ url: 'https://cdn/logo.png' }));
|
|
78
|
+
await uploadImage();
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
test('completes the upload with the url only', () => {
|
|
82
|
+
expect(done.mock.calls).toEqual([[{ progress: 100, url: 'https://cdn/logo.png' }]]);
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
test('does not report an error', () => {
|
|
86
|
+
expect(onError).not.toHaveBeenCalled();
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
describe('when the host rejects with an ImageUploadError', () => {
|
|
91
|
+
beforeEach(async () => {
|
|
92
|
+
store.setOnImage(
|
|
93
|
+
jest
|
|
94
|
+
.fn()
|
|
95
|
+
.mockRejectedValue(
|
|
96
|
+
new ImageUploadError(
|
|
97
|
+
'Image dimensions 4320x2144 exceed maximum allowed 4000px',
|
|
98
|
+
),
|
|
99
|
+
),
|
|
100
|
+
);
|
|
101
|
+
await uploadImage();
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
test('reports the host message', () => {
|
|
105
|
+
expect(onError).toHaveBeenCalledWith(
|
|
106
|
+
'Image upload failed',
|
|
107
|
+
'Image dimensions 4320x2144 exceed maximum allowed 4000px',
|
|
108
|
+
);
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
test('does not report upload progress', () => {
|
|
112
|
+
expect(done).not.toHaveBeenCalled();
|
|
113
|
+
});
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
describe('when the host rejects with any other error', () => {
|
|
117
|
+
beforeEach(async () => {
|
|
118
|
+
store.setOnImage(
|
|
119
|
+
jest.fn().mockRejectedValue(new Error('Request failed with status code 500')),
|
|
120
|
+
);
|
|
121
|
+
await uploadImage();
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
test('reports the generic message', () => {
|
|
125
|
+
expect(onError).toHaveBeenCalledWith('Image upload failed', GENERIC_DESCRIPTION);
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
test('does not report upload progress', () => {
|
|
129
|
+
expect(done).not.toHaveBeenCalled();
|
|
130
|
+
});
|
|
131
|
+
});
|
|
132
|
+
});
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/** Reject `onImage` with this error to show its message to the user instead of the generic upload failure text. */
|
|
2
|
+
export class ImageUploadError extends Error {
|
|
3
|
+
constructor(message: string, options?: ErrorOptions) {
|
|
4
|
+
super(message, options);
|
|
5
|
+
this.name = 'ImageUploadError';
|
|
6
|
+
}
|
|
7
|
+
}
|
package/src/index.ts
CHANGED
package/src/store.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { emitESignOffsetRequest } from './e-sign-offset/eSignOffsetController';
|
|
2
|
+
import { ImageUploadError } from './image-upload-error';
|
|
2
3
|
import { loadScript } from './loadScript';
|
|
3
4
|
import { logUnlayerError } from './log';
|
|
4
5
|
import { toUnlayerMergeTags, type UnlayerMergeTagsConfig } from './merge-tags';
|
|
@@ -720,8 +721,10 @@ export class UnlayerStore {
|
|
|
720
721
|
return;
|
|
721
722
|
}
|
|
722
723
|
|
|
723
|
-
|
|
724
|
-
|
|
724
|
+
/*
|
|
725
|
+
* Unlayer only leaves its "uploading" state when `done` receives a url, so `done` must not be
|
|
726
|
+
* called before the upload succeeds or after it fails, otherwise the image widget gets stuck.
|
|
727
|
+
*/
|
|
725
728
|
try {
|
|
726
729
|
const { url } = await this.onImageCB(file);
|
|
727
730
|
done({ progress: 100, url });
|
|
@@ -729,9 +732,10 @@ export class UnlayerStore {
|
|
|
729
732
|
logUnlayerError('Image upload failed', error);
|
|
730
733
|
this.onErrorCB?.(
|
|
731
734
|
'Image upload failed',
|
|
732
|
-
|
|
735
|
+
error instanceof ImageUploadError
|
|
736
|
+
? error.message
|
|
737
|
+
: 'Something went wrong while uploading the image. Please try again or select another image.',
|
|
733
738
|
);
|
|
734
|
-
done({ progress: 100 });
|
|
735
739
|
}
|
|
736
740
|
};
|
|
737
741
|
|