@chili-publish/studio-sdk 1.46.0 → 1.46.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/_bundles/main.js +4 -4
- package/_bundles/main.js.map +1 -1
- package/lib/src/interactions/Connector.cjs.js +29 -10
- package/lib/src/interactions/Connector.cjs.js.map +1 -1
- package/lib/src/interactions/Connector.d.ts +2 -2
- package/lib/src/interactions/Connector.es.js +29 -10
- package/lib/src/interactions/Connector.es.js.map +1 -1
- package/lib/src/sdk/package.json.cjs.js +1 -1
- package/lib/src/sdk/package.json.es.js +1 -1
- package/package.json +1 -1
|
@@ -18,7 +18,7 @@ const setupFrame = (iframe, editorLink, styling) => {
|
|
|
18
18
|
const stylingJson = JSON.stringify(styling || {});
|
|
19
19
|
const html = `<html>
|
|
20
20
|
<head>
|
|
21
|
-
<base href="
|
|
21
|
+
<base href="${link}" />
|
|
22
22
|
<meta charset="UTF-8"/>
|
|
23
23
|
<!-- use this property to pass the StudioStyling to the engine -->
|
|
24
24
|
<meta name="studio-styling" content='${stylingJson}'>
|
|
@@ -84,20 +84,36 @@ const setupFrame = (iframe, editorLink, styling) => {
|
|
|
84
84
|
<\/script>
|
|
85
85
|
</body>
|
|
86
86
|
</html>`;
|
|
87
|
-
|
|
87
|
+
const blobUrl = URL.createObjectURL(new Blob([html], { type: "text/html" }));
|
|
88
|
+
iframe.setAttribute("src", blobUrl);
|
|
89
|
+
return blobUrl;
|
|
88
90
|
};
|
|
89
|
-
let messageHandler = null;
|
|
90
91
|
const Connect = (editorLink, params, setConnection, editorId = "chili-editor", styling, onSetupFrameError) => {
|
|
91
|
-
if (messageHandler) {
|
|
92
|
-
window.removeEventListener("message", messageHandler);
|
|
93
|
-
}
|
|
94
92
|
const editorSelectorId = `#${editorId}`;
|
|
95
93
|
const iframe = document.createElement("iframe");
|
|
96
|
-
iframe.setAttribute("
|
|
94
|
+
iframe.setAttribute("src", "about:blank");
|
|
97
95
|
iframe.setAttribute("title", "Chili-Editor");
|
|
98
96
|
iframe.setAttribute("style", "width: 100%; height: 100%;");
|
|
99
97
|
iframe.setAttribute("frameBorder", "0");
|
|
100
98
|
iframe.setAttribute("referrerpolicy", "origin");
|
|
99
|
+
let messageHandler = null;
|
|
100
|
+
let domContentLoadedHandler = null;
|
|
101
|
+
let frameBlobUrl = null;
|
|
102
|
+
const teardownFrame = () => {
|
|
103
|
+
if (messageHandler) {
|
|
104
|
+
window.removeEventListener("message", messageHandler);
|
|
105
|
+
messageHandler = null;
|
|
106
|
+
}
|
|
107
|
+
if (domContentLoadedHandler) {
|
|
108
|
+
document.removeEventListener("DOMContentLoaded", domContentLoadedHandler);
|
|
109
|
+
domContentLoadedHandler = null;
|
|
110
|
+
}
|
|
111
|
+
iframe.remove();
|
|
112
|
+
if (frameBlobUrl) {
|
|
113
|
+
URL.revokeObjectURL(frameBlobUrl);
|
|
114
|
+
frameBlobUrl = null;
|
|
115
|
+
}
|
|
116
|
+
};
|
|
101
117
|
const setupNewFrame = () => {
|
|
102
118
|
const iframeContainer = document.querySelector(editorSelectorId);
|
|
103
119
|
if (iframeContainer) {
|
|
@@ -111,7 +127,7 @@ const Connect = (editorLink, params, setConnection, editorId = "chili-editor", s
|
|
|
111
127
|
{ capture: true, once: true }
|
|
112
128
|
);
|
|
113
129
|
try {
|
|
114
|
-
setupFrame(iframe, editorLink, styling);
|
|
130
|
+
frameBlobUrl = setupFrame(iframe, editorLink, styling);
|
|
115
131
|
} catch (error) {
|
|
116
132
|
if (error instanceof Error) {
|
|
117
133
|
onSetupFrameError == null ? void 0 : onSetupFrameError(error);
|
|
@@ -124,9 +140,11 @@ const Connect = (editorLink, params, setConnection, editorId = "chili-editor", s
|
|
|
124
140
|
if (document.readyState === "complete" || document.readyState === "interactive") {
|
|
125
141
|
setupNewFrame();
|
|
126
142
|
} else {
|
|
127
|
-
|
|
143
|
+
domContentLoadedHandler = () => {
|
|
144
|
+
domContentLoadedHandler = null;
|
|
128
145
|
setupNewFrame();
|
|
129
|
-
}
|
|
146
|
+
};
|
|
147
|
+
document.addEventListener("DOMContentLoaded", domContentLoadedHandler, { once: true });
|
|
130
148
|
}
|
|
131
149
|
messageHandler = (event) => {
|
|
132
150
|
var _a;
|
|
@@ -193,6 +211,7 @@ const Connect = (editorLink, params, setConnection, editorId = "chili-editor", s
|
|
|
193
211
|
}
|
|
194
212
|
})
|
|
195
213
|
);
|
|
214
|
+
return teardownFrame;
|
|
196
215
|
};
|
|
197
216
|
exports.default = Connect;
|
|
198
217
|
exports.setupFrame = setupFrame;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Connector.cjs.js","sources":["../../../src/interactions/Connector.ts"],"sourcesContent":["import { Connection, connectToChild } from 'penpal';\nimport { Id } from '../types/CommonTypes';\nimport { StudioStyling } from '../types/ConfigurationTypes';\n\nexport const validateEditorLink = (editorLink: string) => {\n const linkValidator = new RegExp(/^(?:http(s)?:\\/\\/)?[\\w.-]+(?:\\.[\\w.-]+)+[\\w]+\\/$/);\n let link = '';\n if (linkValidator.test(editorLink)) {\n link = editorLink;\n } else if (editorLink.indexOf('/index.html') > -1) {\n link = editorLink.replace('/index.html', '/');\n } else if (editorLink.charAt(-1) !== '/') {\n link = `${editorLink}/`;\n }\n return link;\n};\n\nexport const setupFrame = (iframe: HTMLIFrameElement, editorLink: string, styling?: StudioStyling) => {\n const link = validateEditorLink(editorLink);\n const stylingJson = JSON.stringify(styling || {});\n const html = `<html>\n <head>\n <base href=\"/\" />\n <meta charset=\"UTF-8\"/>\n <!-- use this property to pass the StudioStyling to the engine -->\n <meta name=\"studio-styling\" content='${stylingJson}'>\n </head>\n <body>\n <script>\n const handleIframeError = (event) => {\n if (window.parent && window.parent !== window) {\n window.parent.postMessage(\n {\n type: 'iframe-error',\n error: {\n message: event.message,\n filename: event.filename,\n lineno: event.lineno,\n colno: event.colno,\n error: event.error?.toString(),\n },\n },\n window.location.ancestorOrigins[0] || window.location.origin,\n );\n }\n };\n const handleUnhandledRejection = (event) => {\n if (window.parent && window.parent !== window) {\n window.parent.postMessage(\n {\n type: 'iframe-error',\n error: { message: event.reason?.toString() || 'Unhandled promise rejection' },\n },\n window.location.ancestorOrigins[0] || window.location.origin,\n );\n }\n };\n window.addEventListener('error', handleIframeError);\n window.addEventListener('unhandledrejection', handleUnhandledRejection);\n </script>\n <script src=\"${link}init.js\" async></script>\n <script src=\"${link}flutter_bootstrap.js\"></script>\n <script>\n try {\n if(!window?.initializeStudioEngine){\n throw new Error('Failed to initialize studio engine: initializeStudioEngine not found');\n }\n initializeStudioEngine({\n assetBase: '${link}',\n });\n } catch(error) {\n if (window.parent && window.parent !== window) {\n window.parent.postMessage({\n type: 'iframe-error',\n error: {\n message: error?.message || 'Error initializing studio engine',\n error: error?.toString()\n }\n }, window.location.ancestorOrigins[0] || window.location.origin);\n }\n throw error;\n } finally {\n window.removeEventListener('error', handleIframeError);\n window.removeEventListener('unhandledrejection', handleUnhandledRejection);\n }\n </script>\n </body>\n</html>`;\n\n // Set the iframe's content using DOM manipulation\n // eslint-disable-next-line no-param-reassign\n iframe.srcdoc = html;\n};\n\ninterface ConfigParameterTypes {\n onActionsChanged: (state: string) => void;\n onStateChanged: (state: string) => void;\n onAuthExpired: (authRefreshRequest: string) => Promise<string | null>;\n onViewportRequested: () => string | null;\n onDocumentLoaded: () => void;\n onSelectedFramesContentChanged: (state: string) => void;\n onSelectedFramesLayoutChanged: (state: string) => void;\n onFramesLayoutChanged: (state: string) => void;\n onSelectedLayoutPropertiesChanged: (state: string) => void;\n onSelectedLayoutUnitChanged: (state: string) => void;\n /**\n * @deprecated use `onSelectedPageIdChanged` instead\n */\n onPageSelectionChanged: (id: Id) => void;\n onScrubberPositionChanged: (state: string) => void;\n onFrameAnimationsChanged: (state: string) => void;\n onVariableListChanged: (state: string) => void;\n onSelectedToolChanged: (state: string) => void;\n onUndoStateChanged: (state: string) => void;\n onSelectedLayoutFramesChanged: (state: string) => void;\n onSelectedTextStyleChanged: (styles: string) => void;\n onColorsChanged: (colors: string) => void;\n onParagraphStylesChanged: (paragraphStyles: string) => void;\n onCharacterStylesChanged: (characterStyles: string) => void;\n onFontFamiliesChanged: (fonts: string) => void;\n onSelectedLayoutIdChanged: (id: string) => void;\n onLayoutsChanged: (layouts: string) => void;\n onConnectorEvent: (state: string) => void;\n onConnectorsChanged: (state: string) => void;\n onZoomChanged: (scaleFactor: string) => void;\n onSelectedPageIdChanged: (pageId: string) => void;\n onPagesChanged: (pages: string) => void;\n onPageSnapshotInvalidated: (pageId: Id) => void;\n onPageSizeChanged: (scaleFactor: string) => void;\n onShapeCornerRadiusChanged: (cornerRadius: string) => void;\n onCropActiveFrameIdChanged: (id?: Id) => void;\n onAsyncError: (asyncError: string) => void;\n onViewModeChanged: (viewMode: string) => void;\n onBarcodeValidationChanged: (validationResults: string) => void;\n onDataSourceIdChanged: (connectorId?: Id) => void;\n onInjectedDataChanged: (variableId: Id) => void;\n onDocumentIssueListChanged: (documentIssues: string) => void;\n onCustomUndoDataChanged: (customData: string) => void;\n onEngineEditModeChanged: (engineEditMode: string) => void;\n onBrandKitMediaChanged: (brandKitMedia: string) => void;\n onCanvasFramesManipulated: (frameIds: string) => void;\n}\n\nlet messageHandler: ((event: MessageEvent) => void) | null = null;\n\nconst Connect = (\n editorLink: string,\n params: ConfigParameterTypes,\n setConnection: (connection: Connection) => void,\n editorId = 'chili-editor',\n styling?: StudioStyling,\n onSetupFrameError?: (error: Error) => void,\n) => {\n if (messageHandler) {\n window.removeEventListener('message', messageHandler);\n }\n const editorSelectorId = `#${editorId}`;\n const iframe = document.createElement('iframe');\n iframe.setAttribute('srcdoc', ' ');\n iframe.setAttribute('title', 'Chili-Editor');\n iframe.setAttribute('style', 'width: 100%; height: 100%;');\n iframe.setAttribute('frameBorder', '0');\n iframe.setAttribute('referrerpolicy', 'origin');\n const setupNewFrame = () => {\n const iframeContainer = document.querySelector(editorSelectorId);\n if (iframeContainer) {\n iframeContainer?.appendChild(iframe);\n\n iframe.addEventListener(\n 'error',\n () => {\n const error = new Error('Failed to setup frame: iframe failed to load');\n onSetupFrameError?.(error);\n },\n { capture: true, once: true },\n );\n\n try {\n setupFrame(iframe, editorLink, styling);\n } catch (error: unknown) {\n if (error instanceof Error) {\n onSetupFrameError?.(error);\n } else {\n onSetupFrameError?.(new Error(`Failed to setup frame: ${error}`));\n }\n }\n }\n };\n\n if (document.readyState === 'complete' || document.readyState === 'interactive') {\n setupNewFrame();\n } else {\n document.addEventListener('DOMContentLoaded', () => {\n setupNewFrame();\n });\n }\n\n messageHandler = (event: MessageEvent) => {\n if (event.source !== iframe.contentWindow) {\n return;\n }\n if (event.data?.type === 'iframe-error') {\n const errorData = event.data.error;\n const error = new Error(errorData.message || 'Failed to setup frame: error in iframe');\n onSetupFrameError?.(error);\n }\n };\n\n window.addEventListener('message', messageHandler);\n\n setConnection(\n connectToChild({\n // The iframe to which a connection should be made\n iframe,\n // All the methods that we want to expose to the child should be inside the methods object\n // f.e. stateChange(documentJson)\n methods: {\n actionsChanged: params.onActionsChanged,\n stateChanged: params.onStateChanged,\n documentLoaded: params.onDocumentLoaded,\n authExpired: params.onAuthExpired,\n viewportRequested: params.onViewportRequested,\n selectedFramesContent: params.onSelectedFramesContentChanged,\n selectedFramesLayout: params.onSelectedFramesLayoutChanged,\n allFramesLayout: params.onFramesLayoutChanged,\n selectedLayoutProperties: params.onSelectedLayoutPropertiesChanged,\n openLayoutPropertiesPanel: params.onPageSelectionChanged,\n selectedLayoutUnit: params.onSelectedLayoutUnitChanged,\n scrubberPositionChanged: params.onScrubberPositionChanged,\n frameAnimationsChanged: params.onFrameAnimationsChanged,\n selectedToolChanged: params.onSelectedToolChanged,\n variableListChanged: params.onVariableListChanged,\n undoStackStateChanged: params.onUndoStateChanged,\n selectedLayoutFramesChanged: params.onSelectedLayoutFramesChanged,\n selectedTextStyleChanged: params.onSelectedTextStyleChanged,\n colorsChanged: params.onColorsChanged,\n paragraphStylesChanged: params.onParagraphStylesChanged,\n characterStylesChanged: params.onCharacterStylesChanged,\n fontFamiliesChanged: params.onFontFamiliesChanged,\n selectedLayoutId: params.onSelectedLayoutIdChanged,\n layoutListChanged: params.onLayoutsChanged,\n connectorEvent: params.onConnectorEvent,\n connectorsChanged: params.onConnectorsChanged,\n zoomChanged: params.onZoomChanged,\n pageSnapshotInvalidated: params.onPageSnapshotInvalidated,\n pagesChanged: params.onPagesChanged,\n pageSizeChanged: params.onPageSizeChanged,\n shapeCornerRadiusChanged: params.onShapeCornerRadiusChanged,\n cropActiveFrameIdChanged: params.onCropActiveFrameIdChanged,\n asyncError: params.onAsyncError,\n viewModeChanged: params.onViewModeChanged,\n barcodeValidationChanged: params.onBarcodeValidationChanged,\n selectedPageIdChanged: params.onSelectedPageIdChanged,\n dataSourceIdChanged: params.onDataSourceIdChanged,\n injectedDataChanged: params.onInjectedDataChanged,\n documentIssueListChanged: params.onDocumentIssueListChanged,\n customUndoDataChanged: params.onCustomUndoDataChanged,\n engineEditingModeChanged: params.onEngineEditModeChanged,\n brandKitMediaChanged: params.onBrandKitMediaChanged,\n frameManipulated: params.onCanvasFramesManipulated,\n },\n }),\n );\n};\nexport default Connect;\n"],"names":["connectToChild"],"mappings":";;;AAIO,MAAM,qBAAqB,CAAC,eAAuB;AACtD,QAAM,gBAAgB,IAAI,OAAO,kDAAkD;AACnF,MAAI,OAAO;AACX,MAAI,cAAc,KAAK,UAAU,GAAG;AAChC,WAAO;AAAA,EACX,WAAW,WAAW,QAAQ,aAAa,IAAI,IAAI;AAC/C,WAAO,WAAW,QAAQ,eAAe,GAAG;AAAA,EAChD,WAAW,WAAW,OAAO,EAAE,MAAM,KAAK;AACtC,WAAO,GAAG,UAAU;AAAA,EACxB;AACA,SAAO;AACX;AAEO,MAAM,aAAa,CAAC,QAA2B,YAAoB,YAA4B;AAClG,QAAM,OAAO,mBAAmB,UAAU;AAC1C,QAAM,cAAc,KAAK,UAAU,WAAW,CAAA,CAAE;AAChD,QAAM,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA,mDAKkC,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAmCvC,IAAI;AAAA,uBACJ,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sCAOW,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAuBtC,SAAO,SAAS;AACpB;AAmDA,IAAI,iBAAyD;AAE7D,MAAM,UAAU,CACZ,YACA,QACA,eACA,WAAW,gBACX,SACA,sBACC;AACD,MAAI,gBAAgB;AAChB,WAAO,oBAAoB,WAAW,cAAc;AAAA,EACxD;AACA,QAAM,mBAAmB,IAAI,QAAQ;AACrC,QAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,SAAO,aAAa,UAAU,GAAG;AACjC,SAAO,aAAa,SAAS,cAAc;AAC3C,SAAO,aAAa,SAAS,4BAA4B;AACzD,SAAO,aAAa,eAAe,GAAG;AACtC,SAAO,aAAa,kBAAkB,QAAQ;AAC9C,QAAM,gBAAgB,MAAM;AACxB,UAAM,kBAAkB,SAAS,cAAc,gBAAgB;AAC/D,QAAI,iBAAiB;AACjB,yDAAiB,YAAY;AAE7B,aAAO;AAAA,QACH;AAAA,QACA,MAAM;AACF,gBAAM,QAAQ,IAAI,MAAM,8CAA8C;AACtE,iEAAoB;AAAA,QACxB;AAAA,QACA,EAAE,SAAS,MAAM,MAAM,KAAA;AAAA,MAAK;AAGhC,UAAI;AACA,mBAAW,QAAQ,YAAY,OAAO;AAAA,MAC1C,SAAS,OAAgB;AACrB,YAAI,iBAAiB,OAAO;AACxB,iEAAoB;AAAA,QACxB,OAAO;AACH,iEAAoB,IAAI,MAAM,0BAA0B,KAAK,EAAE;AAAA,QACnE;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAEA,MAAI,SAAS,eAAe,cAAc,SAAS,eAAe,eAAe;AAC7E,kBAAA;AAAA,EACJ,OAAO;AACH,aAAS,iBAAiB,oBAAoB,MAAM;AAChD,oBAAA;AAAA,IACJ,CAAC;AAAA,EACL;AAEA,mBAAiB,CAAC,UAAwB;;AACtC,QAAI,MAAM,WAAW,OAAO,eAAe;AACvC;AAAA,IACJ;AACA,UAAI,WAAM,SAAN,mBAAY,UAAS,gBAAgB;AACrC,YAAM,YAAY,MAAM,KAAK;AAC7B,YAAM,QAAQ,IAAI,MAAM,UAAU,WAAW,wCAAwC;AACrF,6DAAoB;AAAA,IACxB;AAAA,EACJ;AAEA,SAAO,iBAAiB,WAAW,cAAc;AAEjD;AAAA,IACIA,sBAAe;AAAA;AAAA,MAEX;AAAA;AAAA;AAAA,MAGA,SAAS;AAAA,QACL,gBAAgB,OAAO;AAAA,QACvB,cAAc,OAAO;AAAA,QACrB,gBAAgB,OAAO;AAAA,QACvB,aAAa,OAAO;AAAA,QACpB,mBAAmB,OAAO;AAAA,QAC1B,uBAAuB,OAAO;AAAA,QAC9B,sBAAsB,OAAO;AAAA,QAC7B,iBAAiB,OAAO;AAAA,QACxB,0BAA0B,OAAO;AAAA,QACjC,2BAA2B,OAAO;AAAA,QAClC,oBAAoB,OAAO;AAAA,QAC3B,yBAAyB,OAAO;AAAA,QAChC,wBAAwB,OAAO;AAAA,QAC/B,qBAAqB,OAAO;AAAA,QAC5B,qBAAqB,OAAO;AAAA,QAC5B,uBAAuB,OAAO;AAAA,QAC9B,6BAA6B,OAAO;AAAA,QACpC,0BAA0B,OAAO;AAAA,QACjC,eAAe,OAAO;AAAA,QACtB,wBAAwB,OAAO;AAAA,QAC/B,wBAAwB,OAAO;AAAA,QAC/B,qBAAqB,OAAO;AAAA,QAC5B,kBAAkB,OAAO;AAAA,QACzB,mBAAmB,OAAO;AAAA,QAC1B,gBAAgB,OAAO;AAAA,QACvB,mBAAmB,OAAO;AAAA,QAC1B,aAAa,OAAO;AAAA,QACpB,yBAAyB,OAAO;AAAA,QAChC,cAAc,OAAO;AAAA,QACrB,iBAAiB,OAAO;AAAA,QACxB,0BAA0B,OAAO;AAAA,QACjC,0BAA0B,OAAO;AAAA,QACjC,YAAY,OAAO;AAAA,QACnB,iBAAiB,OAAO;AAAA,QACxB,0BAA0B,OAAO;AAAA,QACjC,uBAAuB,OAAO;AAAA,QAC9B,qBAAqB,OAAO;AAAA,QAC5B,qBAAqB,OAAO;AAAA,QAC5B,0BAA0B,OAAO;AAAA,QACjC,uBAAuB,OAAO;AAAA,QAC9B,0BAA0B,OAAO;AAAA,QACjC,sBAAsB,OAAO;AAAA,QAC7B,kBAAkB,OAAO;AAAA,MAAA;AAAA,IAC7B,CACH;AAAA,EAAA;AAET;;;;"}
|
|
1
|
+
{"version":3,"file":"Connector.cjs.js","sources":["../../../src/interactions/Connector.ts"],"sourcesContent":["import { Connection, connectToChild } from 'penpal';\nimport { Id } from '../types/CommonTypes';\nimport { StudioStyling } from '../types/ConfigurationTypes';\n\nexport const validateEditorLink = (editorLink: string) => {\n const linkValidator = new RegExp(/^(?:http(s)?:\\/\\/)?[\\w.-]+(?:\\.[\\w.-]+)+[\\w]+\\/$/);\n let link = '';\n if (linkValidator.test(editorLink)) {\n link = editorLink;\n } else if (editorLink.indexOf('/index.html') > -1) {\n link = editorLink.replace('/index.html', '/');\n } else if (editorLink.charAt(-1) !== '/') {\n link = `${editorLink}/`;\n }\n return link;\n};\n\nexport const setupFrame = (iframe: HTMLIFrameElement, editorLink: string, styling?: StudioStyling) => {\n const link = validateEditorLink(editorLink);\n const stylingJson = JSON.stringify(styling || {});\n const html = `<html>\n <head>\n <base href=\"${link}\" />\n <meta charset=\"UTF-8\"/>\n <!-- use this property to pass the StudioStyling to the engine -->\n <meta name=\"studio-styling\" content='${stylingJson}'>\n </head>\n <body>\n <script>\n const handleIframeError = (event) => {\n if (window.parent && window.parent !== window) {\n window.parent.postMessage(\n {\n type: 'iframe-error',\n error: {\n message: event.message,\n filename: event.filename,\n lineno: event.lineno,\n colno: event.colno,\n error: event.error?.toString(),\n },\n },\n window.location.ancestorOrigins[0] || window.location.origin,\n );\n }\n };\n const handleUnhandledRejection = (event) => {\n if (window.parent && window.parent !== window) {\n window.parent.postMessage(\n {\n type: 'iframe-error',\n error: { message: event.reason?.toString() || 'Unhandled promise rejection' },\n },\n window.location.ancestorOrigins[0] || window.location.origin,\n );\n }\n };\n window.addEventListener('error', handleIframeError);\n window.addEventListener('unhandledrejection', handleUnhandledRejection);\n </script>\n <script src=\"${link}init.js\" async></script>\n <script src=\"${link}flutter_bootstrap.js\"></script>\n <script>\n try {\n if(!window?.initializeStudioEngine){\n throw new Error('Failed to initialize studio engine: initializeStudioEngine not found');\n }\n initializeStudioEngine({\n assetBase: '${link}',\n });\n } catch(error) {\n if (window.parent && window.parent !== window) {\n window.parent.postMessage({\n type: 'iframe-error',\n error: {\n message: error?.message || 'Error initializing studio engine',\n error: error?.toString()\n }\n }, window.location.ancestorOrigins[0] || window.location.origin);\n }\n throw error;\n } finally {\n window.removeEventListener('error', handleIframeError);\n window.removeEventListener('unhandledrejection', handleUnhandledRejection);\n }\n </script>\n </body>\n</html>`;\n\n const blobUrl = URL.createObjectURL(new Blob([html], { type: 'text/html' }));\n iframe.setAttribute('src', blobUrl);\n return blobUrl;\n};\n\ninterface ConfigParameterTypes {\n onActionsChanged: (state: string) => void;\n onStateChanged: (state: string) => void;\n onAuthExpired: (authRefreshRequest: string) => Promise<string | null>;\n onViewportRequested: () => string | null;\n onDocumentLoaded: () => void;\n onSelectedFramesContentChanged: (state: string) => void;\n onSelectedFramesLayoutChanged: (state: string) => void;\n onFramesLayoutChanged: (state: string) => void;\n onSelectedLayoutPropertiesChanged: (state: string) => void;\n onSelectedLayoutUnitChanged: (state: string) => void;\n /**\n * @deprecated use `onSelectedPageIdChanged` instead\n */\n onPageSelectionChanged: (id: Id) => void;\n onScrubberPositionChanged: (state: string) => void;\n onFrameAnimationsChanged: (state: string) => void;\n onVariableListChanged: (state: string) => void;\n onSelectedToolChanged: (state: string) => void;\n onUndoStateChanged: (state: string) => void;\n onSelectedLayoutFramesChanged: (state: string) => void;\n onSelectedTextStyleChanged: (styles: string) => void;\n onColorsChanged: (colors: string) => void;\n onParagraphStylesChanged: (paragraphStyles: string) => void;\n onCharacterStylesChanged: (characterStyles: string) => void;\n onFontFamiliesChanged: (fonts: string) => void;\n onSelectedLayoutIdChanged: (id: string) => void;\n onLayoutsChanged: (layouts: string) => void;\n onConnectorEvent: (state: string) => void;\n onConnectorsChanged: (state: string) => void;\n onZoomChanged: (scaleFactor: string) => void;\n onSelectedPageIdChanged: (pageId: string) => void;\n onPagesChanged: (pages: string) => void;\n onPageSnapshotInvalidated: (pageId: Id) => void;\n onPageSizeChanged: (scaleFactor: string) => void;\n onShapeCornerRadiusChanged: (cornerRadius: string) => void;\n onCropActiveFrameIdChanged: (id?: Id) => void;\n onAsyncError: (asyncError: string) => void;\n onViewModeChanged: (viewMode: string) => void;\n onBarcodeValidationChanged: (validationResults: string) => void;\n onDataSourceIdChanged: (connectorId?: Id) => void;\n onInjectedDataChanged: (variableId: Id) => void;\n onDocumentIssueListChanged: (documentIssues: string) => void;\n onCustomUndoDataChanged: (customData: string) => void;\n onEngineEditModeChanged: (engineEditMode: string) => void;\n onBrandKitMediaChanged: (brandKitMedia: string) => void;\n onCanvasFramesManipulated: (frameIds: string) => void;\n}\n\nconst Connect = (\n editorLink: string,\n params: ConfigParameterTypes,\n setConnection: (connection: Connection) => void,\n editorId = 'chili-editor',\n styling?: StudioStyling,\n onSetupFrameError?: (error: Error) => void,\n) => {\n const editorSelectorId = `#${editorId}`;\n const iframe = document.createElement('iframe');\n iframe.setAttribute('src', 'about:blank');\n iframe.setAttribute('title', 'Chili-Editor');\n iframe.setAttribute('style', 'width: 100%; height: 100%;');\n iframe.setAttribute('frameBorder', '0');\n iframe.setAttribute('referrerpolicy', 'origin');\n\n // Everything this call attaches outside of the penpal connection is tracked per\n // invocation, so releasing one engine frame can never tear down the frame another\n // SDK instance is still using. The `message` listener closes over the iframe: as\n // long as that listener stays registered on `window`, the iframe element - and with\n // it the entire engine realm (Dart heap, CanvasKit and QuickJS WASM memory) - stays\n // reachable and can never be collected, even when the consumer has dropped every\n // reference of its own.\n let messageHandler: ((event: MessageEvent) => void) | null = null;\n let domContentLoadedHandler: (() => void) | null = null;\n let frameBlobUrl: string | null = null;\n\n /**\n * Releases the iframe and listeners this `Connect` call attached. Safe to call\n * more than once, and leaves frames of other `Connect` calls untouched.\n */\n const teardownFrame = () => {\n if (messageHandler) {\n window.removeEventListener('message', messageHandler);\n messageHandler = null;\n }\n if (domContentLoadedHandler) {\n document.removeEventListener('DOMContentLoaded', domContentLoadedHandler);\n domContentLoadedHandler = null;\n }\n iframe.remove();\n if (frameBlobUrl) {\n URL.revokeObjectURL(frameBlobUrl);\n frameBlobUrl = null;\n }\n };\n\n const setupNewFrame = () => {\n const iframeContainer = document.querySelector(editorSelectorId);\n if (iframeContainer) {\n iframeContainer?.appendChild(iframe);\n\n iframe.addEventListener(\n 'error',\n () => {\n const error = new Error('Failed to setup frame: iframe failed to load');\n onSetupFrameError?.(error);\n },\n { capture: true, once: true },\n );\n\n try {\n frameBlobUrl = setupFrame(iframe, editorLink, styling);\n } catch (error: unknown) {\n if (error instanceof Error) {\n onSetupFrameError?.(error);\n } else {\n onSetupFrameError?.(new Error(`Failed to setup frame: ${error}`));\n }\n }\n }\n };\n\n if (document.readyState === 'complete' || document.readyState === 'interactive') {\n setupNewFrame();\n } else {\n domContentLoadedHandler = () => {\n domContentLoadedHandler = null;\n setupNewFrame();\n };\n document.addEventListener('DOMContentLoaded', domContentLoadedHandler, { once: true });\n }\n\n messageHandler = (event: MessageEvent) => {\n if (event.source !== iframe.contentWindow) {\n return;\n }\n if (event.data?.type === 'iframe-error') {\n const errorData = event.data.error;\n const error = new Error(errorData.message || 'Failed to setup frame: error in iframe');\n onSetupFrameError?.(error);\n }\n };\n\n window.addEventListener('message', messageHandler);\n\n setConnection(\n connectToChild({\n // The iframe to which a connection should be made\n iframe,\n // All the methods that we want to expose to the child should be inside the methods object\n // f.e. stateChange(documentJson)\n methods: {\n actionsChanged: params.onActionsChanged,\n stateChanged: params.onStateChanged,\n documentLoaded: params.onDocumentLoaded,\n authExpired: params.onAuthExpired,\n viewportRequested: params.onViewportRequested,\n selectedFramesContent: params.onSelectedFramesContentChanged,\n selectedFramesLayout: params.onSelectedFramesLayoutChanged,\n allFramesLayout: params.onFramesLayoutChanged,\n selectedLayoutProperties: params.onSelectedLayoutPropertiesChanged,\n openLayoutPropertiesPanel: params.onPageSelectionChanged,\n selectedLayoutUnit: params.onSelectedLayoutUnitChanged,\n scrubberPositionChanged: params.onScrubberPositionChanged,\n frameAnimationsChanged: params.onFrameAnimationsChanged,\n selectedToolChanged: params.onSelectedToolChanged,\n variableListChanged: params.onVariableListChanged,\n undoStackStateChanged: params.onUndoStateChanged,\n selectedLayoutFramesChanged: params.onSelectedLayoutFramesChanged,\n selectedTextStyleChanged: params.onSelectedTextStyleChanged,\n colorsChanged: params.onColorsChanged,\n paragraphStylesChanged: params.onParagraphStylesChanged,\n characterStylesChanged: params.onCharacterStylesChanged,\n fontFamiliesChanged: params.onFontFamiliesChanged,\n selectedLayoutId: params.onSelectedLayoutIdChanged,\n layoutListChanged: params.onLayoutsChanged,\n connectorEvent: params.onConnectorEvent,\n connectorsChanged: params.onConnectorsChanged,\n zoomChanged: params.onZoomChanged,\n pageSnapshotInvalidated: params.onPageSnapshotInvalidated,\n pagesChanged: params.onPagesChanged,\n pageSizeChanged: params.onPageSizeChanged,\n shapeCornerRadiusChanged: params.onShapeCornerRadiusChanged,\n cropActiveFrameIdChanged: params.onCropActiveFrameIdChanged,\n asyncError: params.onAsyncError,\n viewModeChanged: params.onViewModeChanged,\n barcodeValidationChanged: params.onBarcodeValidationChanged,\n selectedPageIdChanged: params.onSelectedPageIdChanged,\n dataSourceIdChanged: params.onDataSourceIdChanged,\n injectedDataChanged: params.onInjectedDataChanged,\n documentIssueListChanged: params.onDocumentIssueListChanged,\n customUndoDataChanged: params.onCustomUndoDataChanged,\n engineEditingModeChanged: params.onEngineEditModeChanged,\n brandKitMediaChanged: params.onBrandKitMediaChanged,\n frameManipulated: params.onCanvasFramesManipulated,\n },\n }),\n );\n\n return teardownFrame;\n};\nexport default Connect;\n"],"names":["connectToChild"],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@ import { Connection } from 'penpal';
|
|
|
2
2
|
import { Id } from '../types/CommonTypes';
|
|
3
3
|
import { StudioStyling } from '../types/ConfigurationTypes';
|
|
4
4
|
export declare const validateEditorLink: (editorLink: string) => string;
|
|
5
|
-
export declare const setupFrame: (iframe: HTMLIFrameElement, editorLink: string, styling?: StudioStyling) =>
|
|
5
|
+
export declare const setupFrame: (iframe: HTMLIFrameElement, editorLink: string, styling?: StudioStyling) => string;
|
|
6
6
|
interface ConfigParameterTypes {
|
|
7
7
|
onActionsChanged: (state: string) => void;
|
|
8
8
|
onStateChanged: (state: string) => void;
|
|
@@ -51,5 +51,5 @@ interface ConfigParameterTypes {
|
|
|
51
51
|
onBrandKitMediaChanged: (brandKitMedia: string) => void;
|
|
52
52
|
onCanvasFramesManipulated: (frameIds: string) => void;
|
|
53
53
|
}
|
|
54
|
-
declare const Connect: (editorLink: string, params: ConfigParameterTypes, setConnection: (connection: Connection) => void, editorId?: string, styling?: StudioStyling, onSetupFrameError?: (error: Error) => void) => void;
|
|
54
|
+
declare const Connect: (editorLink: string, params: ConfigParameterTypes, setConnection: (connection: Connection) => void, editorId?: string, styling?: StudioStyling, onSetupFrameError?: (error: Error) => void) => () => void;
|
|
55
55
|
export default Connect;
|
|
@@ -16,7 +16,7 @@ const setupFrame = (iframe, editorLink, styling) => {
|
|
|
16
16
|
const stylingJson = JSON.stringify(styling || {});
|
|
17
17
|
const html = `<html>
|
|
18
18
|
<head>
|
|
19
|
-
<base href="
|
|
19
|
+
<base href="${link}" />
|
|
20
20
|
<meta charset="UTF-8"/>
|
|
21
21
|
<!-- use this property to pass the StudioStyling to the engine -->
|
|
22
22
|
<meta name="studio-styling" content='${stylingJson}'>
|
|
@@ -82,20 +82,36 @@ const setupFrame = (iframe, editorLink, styling) => {
|
|
|
82
82
|
<\/script>
|
|
83
83
|
</body>
|
|
84
84
|
</html>`;
|
|
85
|
-
|
|
85
|
+
const blobUrl = URL.createObjectURL(new Blob([html], { type: "text/html" }));
|
|
86
|
+
iframe.setAttribute("src", blobUrl);
|
|
87
|
+
return blobUrl;
|
|
86
88
|
};
|
|
87
|
-
let messageHandler = null;
|
|
88
89
|
const Connect = (editorLink, params, setConnection, editorId = "chili-editor", styling, onSetupFrameError) => {
|
|
89
|
-
if (messageHandler) {
|
|
90
|
-
window.removeEventListener("message", messageHandler);
|
|
91
|
-
}
|
|
92
90
|
const editorSelectorId = `#${editorId}`;
|
|
93
91
|
const iframe = document.createElement("iframe");
|
|
94
|
-
iframe.setAttribute("
|
|
92
|
+
iframe.setAttribute("src", "about:blank");
|
|
95
93
|
iframe.setAttribute("title", "Chili-Editor");
|
|
96
94
|
iframe.setAttribute("style", "width: 100%; height: 100%;");
|
|
97
95
|
iframe.setAttribute("frameBorder", "0");
|
|
98
96
|
iframe.setAttribute("referrerpolicy", "origin");
|
|
97
|
+
let messageHandler = null;
|
|
98
|
+
let domContentLoadedHandler = null;
|
|
99
|
+
let frameBlobUrl = null;
|
|
100
|
+
const teardownFrame = () => {
|
|
101
|
+
if (messageHandler) {
|
|
102
|
+
window.removeEventListener("message", messageHandler);
|
|
103
|
+
messageHandler = null;
|
|
104
|
+
}
|
|
105
|
+
if (domContentLoadedHandler) {
|
|
106
|
+
document.removeEventListener("DOMContentLoaded", domContentLoadedHandler);
|
|
107
|
+
domContentLoadedHandler = null;
|
|
108
|
+
}
|
|
109
|
+
iframe.remove();
|
|
110
|
+
if (frameBlobUrl) {
|
|
111
|
+
URL.revokeObjectURL(frameBlobUrl);
|
|
112
|
+
frameBlobUrl = null;
|
|
113
|
+
}
|
|
114
|
+
};
|
|
99
115
|
const setupNewFrame = () => {
|
|
100
116
|
const iframeContainer = document.querySelector(editorSelectorId);
|
|
101
117
|
if (iframeContainer) {
|
|
@@ -109,7 +125,7 @@ const Connect = (editorLink, params, setConnection, editorId = "chili-editor", s
|
|
|
109
125
|
{ capture: true, once: true }
|
|
110
126
|
);
|
|
111
127
|
try {
|
|
112
|
-
setupFrame(iframe, editorLink, styling);
|
|
128
|
+
frameBlobUrl = setupFrame(iframe, editorLink, styling);
|
|
113
129
|
} catch (error) {
|
|
114
130
|
if (error instanceof Error) {
|
|
115
131
|
onSetupFrameError == null ? void 0 : onSetupFrameError(error);
|
|
@@ -122,9 +138,11 @@ const Connect = (editorLink, params, setConnection, editorId = "chili-editor", s
|
|
|
122
138
|
if (document.readyState === "complete" || document.readyState === "interactive") {
|
|
123
139
|
setupNewFrame();
|
|
124
140
|
} else {
|
|
125
|
-
|
|
141
|
+
domContentLoadedHandler = () => {
|
|
142
|
+
domContentLoadedHandler = null;
|
|
126
143
|
setupNewFrame();
|
|
127
|
-
}
|
|
144
|
+
};
|
|
145
|
+
document.addEventListener("DOMContentLoaded", domContentLoadedHandler, { once: true });
|
|
128
146
|
}
|
|
129
147
|
messageHandler = (event) => {
|
|
130
148
|
var _a;
|
|
@@ -191,6 +209,7 @@ const Connect = (editorLink, params, setConnection, editorId = "chili-editor", s
|
|
|
191
209
|
}
|
|
192
210
|
})
|
|
193
211
|
);
|
|
212
|
+
return teardownFrame;
|
|
194
213
|
};
|
|
195
214
|
export {
|
|
196
215
|
Connect as default,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Connector.es.js","sources":["../../../src/interactions/Connector.ts"],"sourcesContent":["import { Connection, connectToChild } from 'penpal';\nimport { Id } from '../types/CommonTypes';\nimport { StudioStyling } from '../types/ConfigurationTypes';\n\nexport const validateEditorLink = (editorLink: string) => {\n const linkValidator = new RegExp(/^(?:http(s)?:\\/\\/)?[\\w.-]+(?:\\.[\\w.-]+)+[\\w]+\\/$/);\n let link = '';\n if (linkValidator.test(editorLink)) {\n link = editorLink;\n } else if (editorLink.indexOf('/index.html') > -1) {\n link = editorLink.replace('/index.html', '/');\n } else if (editorLink.charAt(-1) !== '/') {\n link = `${editorLink}/`;\n }\n return link;\n};\n\nexport const setupFrame = (iframe: HTMLIFrameElement, editorLink: string, styling?: StudioStyling) => {\n const link = validateEditorLink(editorLink);\n const stylingJson = JSON.stringify(styling || {});\n const html = `<html>\n <head>\n <base href=\"/\" />\n <meta charset=\"UTF-8\"/>\n <!-- use this property to pass the StudioStyling to the engine -->\n <meta name=\"studio-styling\" content='${stylingJson}'>\n </head>\n <body>\n <script>\n const handleIframeError = (event) => {\n if (window.parent && window.parent !== window) {\n window.parent.postMessage(\n {\n type: 'iframe-error',\n error: {\n message: event.message,\n filename: event.filename,\n lineno: event.lineno,\n colno: event.colno,\n error: event.error?.toString(),\n },\n },\n window.location.ancestorOrigins[0] || window.location.origin,\n );\n }\n };\n const handleUnhandledRejection = (event) => {\n if (window.parent && window.parent !== window) {\n window.parent.postMessage(\n {\n type: 'iframe-error',\n error: { message: event.reason?.toString() || 'Unhandled promise rejection' },\n },\n window.location.ancestorOrigins[0] || window.location.origin,\n );\n }\n };\n window.addEventListener('error', handleIframeError);\n window.addEventListener('unhandledrejection', handleUnhandledRejection);\n </script>\n <script src=\"${link}init.js\" async></script>\n <script src=\"${link}flutter_bootstrap.js\"></script>\n <script>\n try {\n if(!window?.initializeStudioEngine){\n throw new Error('Failed to initialize studio engine: initializeStudioEngine not found');\n }\n initializeStudioEngine({\n assetBase: '${link}',\n });\n } catch(error) {\n if (window.parent && window.parent !== window) {\n window.parent.postMessage({\n type: 'iframe-error',\n error: {\n message: error?.message || 'Error initializing studio engine',\n error: error?.toString()\n }\n }, window.location.ancestorOrigins[0] || window.location.origin);\n }\n throw error;\n } finally {\n window.removeEventListener('error', handleIframeError);\n window.removeEventListener('unhandledrejection', handleUnhandledRejection);\n }\n </script>\n </body>\n</html>`;\n\n // Set the iframe's content using DOM manipulation\n // eslint-disable-next-line no-param-reassign\n iframe.srcdoc = html;\n};\n\ninterface ConfigParameterTypes {\n onActionsChanged: (state: string) => void;\n onStateChanged: (state: string) => void;\n onAuthExpired: (authRefreshRequest: string) => Promise<string | null>;\n onViewportRequested: () => string | null;\n onDocumentLoaded: () => void;\n onSelectedFramesContentChanged: (state: string) => void;\n onSelectedFramesLayoutChanged: (state: string) => void;\n onFramesLayoutChanged: (state: string) => void;\n onSelectedLayoutPropertiesChanged: (state: string) => void;\n onSelectedLayoutUnitChanged: (state: string) => void;\n /**\n * @deprecated use `onSelectedPageIdChanged` instead\n */\n onPageSelectionChanged: (id: Id) => void;\n onScrubberPositionChanged: (state: string) => void;\n onFrameAnimationsChanged: (state: string) => void;\n onVariableListChanged: (state: string) => void;\n onSelectedToolChanged: (state: string) => void;\n onUndoStateChanged: (state: string) => void;\n onSelectedLayoutFramesChanged: (state: string) => void;\n onSelectedTextStyleChanged: (styles: string) => void;\n onColorsChanged: (colors: string) => void;\n onParagraphStylesChanged: (paragraphStyles: string) => void;\n onCharacterStylesChanged: (characterStyles: string) => void;\n onFontFamiliesChanged: (fonts: string) => void;\n onSelectedLayoutIdChanged: (id: string) => void;\n onLayoutsChanged: (layouts: string) => void;\n onConnectorEvent: (state: string) => void;\n onConnectorsChanged: (state: string) => void;\n onZoomChanged: (scaleFactor: string) => void;\n onSelectedPageIdChanged: (pageId: string) => void;\n onPagesChanged: (pages: string) => void;\n onPageSnapshotInvalidated: (pageId: Id) => void;\n onPageSizeChanged: (scaleFactor: string) => void;\n onShapeCornerRadiusChanged: (cornerRadius: string) => void;\n onCropActiveFrameIdChanged: (id?: Id) => void;\n onAsyncError: (asyncError: string) => void;\n onViewModeChanged: (viewMode: string) => void;\n onBarcodeValidationChanged: (validationResults: string) => void;\n onDataSourceIdChanged: (connectorId?: Id) => void;\n onInjectedDataChanged: (variableId: Id) => void;\n onDocumentIssueListChanged: (documentIssues: string) => void;\n onCustomUndoDataChanged: (customData: string) => void;\n onEngineEditModeChanged: (engineEditMode: string) => void;\n onBrandKitMediaChanged: (brandKitMedia: string) => void;\n onCanvasFramesManipulated: (frameIds: string) => void;\n}\n\nlet messageHandler: ((event: MessageEvent) => void) | null = null;\n\nconst Connect = (\n editorLink: string,\n params: ConfigParameterTypes,\n setConnection: (connection: Connection) => void,\n editorId = 'chili-editor',\n styling?: StudioStyling,\n onSetupFrameError?: (error: Error) => void,\n) => {\n if (messageHandler) {\n window.removeEventListener('message', messageHandler);\n }\n const editorSelectorId = `#${editorId}`;\n const iframe = document.createElement('iframe');\n iframe.setAttribute('srcdoc', ' ');\n iframe.setAttribute('title', 'Chili-Editor');\n iframe.setAttribute('style', 'width: 100%; height: 100%;');\n iframe.setAttribute('frameBorder', '0');\n iframe.setAttribute('referrerpolicy', 'origin');\n const setupNewFrame = () => {\n const iframeContainer = document.querySelector(editorSelectorId);\n if (iframeContainer) {\n iframeContainer?.appendChild(iframe);\n\n iframe.addEventListener(\n 'error',\n () => {\n const error = new Error('Failed to setup frame: iframe failed to load');\n onSetupFrameError?.(error);\n },\n { capture: true, once: true },\n );\n\n try {\n setupFrame(iframe, editorLink, styling);\n } catch (error: unknown) {\n if (error instanceof Error) {\n onSetupFrameError?.(error);\n } else {\n onSetupFrameError?.(new Error(`Failed to setup frame: ${error}`));\n }\n }\n }\n };\n\n if (document.readyState === 'complete' || document.readyState === 'interactive') {\n setupNewFrame();\n } else {\n document.addEventListener('DOMContentLoaded', () => {\n setupNewFrame();\n });\n }\n\n messageHandler = (event: MessageEvent) => {\n if (event.source !== iframe.contentWindow) {\n return;\n }\n if (event.data?.type === 'iframe-error') {\n const errorData = event.data.error;\n const error = new Error(errorData.message || 'Failed to setup frame: error in iframe');\n onSetupFrameError?.(error);\n }\n };\n\n window.addEventListener('message', messageHandler);\n\n setConnection(\n connectToChild({\n // The iframe to which a connection should be made\n iframe,\n // All the methods that we want to expose to the child should be inside the methods object\n // f.e. stateChange(documentJson)\n methods: {\n actionsChanged: params.onActionsChanged,\n stateChanged: params.onStateChanged,\n documentLoaded: params.onDocumentLoaded,\n authExpired: params.onAuthExpired,\n viewportRequested: params.onViewportRequested,\n selectedFramesContent: params.onSelectedFramesContentChanged,\n selectedFramesLayout: params.onSelectedFramesLayoutChanged,\n allFramesLayout: params.onFramesLayoutChanged,\n selectedLayoutProperties: params.onSelectedLayoutPropertiesChanged,\n openLayoutPropertiesPanel: params.onPageSelectionChanged,\n selectedLayoutUnit: params.onSelectedLayoutUnitChanged,\n scrubberPositionChanged: params.onScrubberPositionChanged,\n frameAnimationsChanged: params.onFrameAnimationsChanged,\n selectedToolChanged: params.onSelectedToolChanged,\n variableListChanged: params.onVariableListChanged,\n undoStackStateChanged: params.onUndoStateChanged,\n selectedLayoutFramesChanged: params.onSelectedLayoutFramesChanged,\n selectedTextStyleChanged: params.onSelectedTextStyleChanged,\n colorsChanged: params.onColorsChanged,\n paragraphStylesChanged: params.onParagraphStylesChanged,\n characterStylesChanged: params.onCharacterStylesChanged,\n fontFamiliesChanged: params.onFontFamiliesChanged,\n selectedLayoutId: params.onSelectedLayoutIdChanged,\n layoutListChanged: params.onLayoutsChanged,\n connectorEvent: params.onConnectorEvent,\n connectorsChanged: params.onConnectorsChanged,\n zoomChanged: params.onZoomChanged,\n pageSnapshotInvalidated: params.onPageSnapshotInvalidated,\n pagesChanged: params.onPagesChanged,\n pageSizeChanged: params.onPageSizeChanged,\n shapeCornerRadiusChanged: params.onShapeCornerRadiusChanged,\n cropActiveFrameIdChanged: params.onCropActiveFrameIdChanged,\n asyncError: params.onAsyncError,\n viewModeChanged: params.onViewModeChanged,\n barcodeValidationChanged: params.onBarcodeValidationChanged,\n selectedPageIdChanged: params.onSelectedPageIdChanged,\n dataSourceIdChanged: params.onDataSourceIdChanged,\n injectedDataChanged: params.onInjectedDataChanged,\n documentIssueListChanged: params.onDocumentIssueListChanged,\n customUndoDataChanged: params.onCustomUndoDataChanged,\n engineEditingModeChanged: params.onEngineEditModeChanged,\n brandKitMediaChanged: params.onBrandKitMediaChanged,\n frameManipulated: params.onCanvasFramesManipulated,\n },\n }),\n );\n};\nexport default Connect;\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Connector.es.js","sources":["../../../src/interactions/Connector.ts"],"sourcesContent":["import { Connection, connectToChild } from 'penpal';\nimport { Id } from '../types/CommonTypes';\nimport { StudioStyling } from '../types/ConfigurationTypes';\n\nexport const validateEditorLink = (editorLink: string) => {\n const linkValidator = new RegExp(/^(?:http(s)?:\\/\\/)?[\\w.-]+(?:\\.[\\w.-]+)+[\\w]+\\/$/);\n let link = '';\n if (linkValidator.test(editorLink)) {\n link = editorLink;\n } else if (editorLink.indexOf('/index.html') > -1) {\n link = editorLink.replace('/index.html', '/');\n } else if (editorLink.charAt(-1) !== '/') {\n link = `${editorLink}/`;\n }\n return link;\n};\n\nexport const setupFrame = (iframe: HTMLIFrameElement, editorLink: string, styling?: StudioStyling) => {\n const link = validateEditorLink(editorLink);\n const stylingJson = JSON.stringify(styling || {});\n const html = `<html>\n <head>\n <base href=\"${link}\" />\n <meta charset=\"UTF-8\"/>\n <!-- use this property to pass the StudioStyling to the engine -->\n <meta name=\"studio-styling\" content='${stylingJson}'>\n </head>\n <body>\n <script>\n const handleIframeError = (event) => {\n if (window.parent && window.parent !== window) {\n window.parent.postMessage(\n {\n type: 'iframe-error',\n error: {\n message: event.message,\n filename: event.filename,\n lineno: event.lineno,\n colno: event.colno,\n error: event.error?.toString(),\n },\n },\n window.location.ancestorOrigins[0] || window.location.origin,\n );\n }\n };\n const handleUnhandledRejection = (event) => {\n if (window.parent && window.parent !== window) {\n window.parent.postMessage(\n {\n type: 'iframe-error',\n error: { message: event.reason?.toString() || 'Unhandled promise rejection' },\n },\n window.location.ancestorOrigins[0] || window.location.origin,\n );\n }\n };\n window.addEventListener('error', handleIframeError);\n window.addEventListener('unhandledrejection', handleUnhandledRejection);\n </script>\n <script src=\"${link}init.js\" async></script>\n <script src=\"${link}flutter_bootstrap.js\"></script>\n <script>\n try {\n if(!window?.initializeStudioEngine){\n throw new Error('Failed to initialize studio engine: initializeStudioEngine not found');\n }\n initializeStudioEngine({\n assetBase: '${link}',\n });\n } catch(error) {\n if (window.parent && window.parent !== window) {\n window.parent.postMessage({\n type: 'iframe-error',\n error: {\n message: error?.message || 'Error initializing studio engine',\n error: error?.toString()\n }\n }, window.location.ancestorOrigins[0] || window.location.origin);\n }\n throw error;\n } finally {\n window.removeEventListener('error', handleIframeError);\n window.removeEventListener('unhandledrejection', handleUnhandledRejection);\n }\n </script>\n </body>\n</html>`;\n\n const blobUrl = URL.createObjectURL(new Blob([html], { type: 'text/html' }));\n iframe.setAttribute('src', blobUrl);\n return blobUrl;\n};\n\ninterface ConfigParameterTypes {\n onActionsChanged: (state: string) => void;\n onStateChanged: (state: string) => void;\n onAuthExpired: (authRefreshRequest: string) => Promise<string | null>;\n onViewportRequested: () => string | null;\n onDocumentLoaded: () => void;\n onSelectedFramesContentChanged: (state: string) => void;\n onSelectedFramesLayoutChanged: (state: string) => void;\n onFramesLayoutChanged: (state: string) => void;\n onSelectedLayoutPropertiesChanged: (state: string) => void;\n onSelectedLayoutUnitChanged: (state: string) => void;\n /**\n * @deprecated use `onSelectedPageIdChanged` instead\n */\n onPageSelectionChanged: (id: Id) => void;\n onScrubberPositionChanged: (state: string) => void;\n onFrameAnimationsChanged: (state: string) => void;\n onVariableListChanged: (state: string) => void;\n onSelectedToolChanged: (state: string) => void;\n onUndoStateChanged: (state: string) => void;\n onSelectedLayoutFramesChanged: (state: string) => void;\n onSelectedTextStyleChanged: (styles: string) => void;\n onColorsChanged: (colors: string) => void;\n onParagraphStylesChanged: (paragraphStyles: string) => void;\n onCharacterStylesChanged: (characterStyles: string) => void;\n onFontFamiliesChanged: (fonts: string) => void;\n onSelectedLayoutIdChanged: (id: string) => void;\n onLayoutsChanged: (layouts: string) => void;\n onConnectorEvent: (state: string) => void;\n onConnectorsChanged: (state: string) => void;\n onZoomChanged: (scaleFactor: string) => void;\n onSelectedPageIdChanged: (pageId: string) => void;\n onPagesChanged: (pages: string) => void;\n onPageSnapshotInvalidated: (pageId: Id) => void;\n onPageSizeChanged: (scaleFactor: string) => void;\n onShapeCornerRadiusChanged: (cornerRadius: string) => void;\n onCropActiveFrameIdChanged: (id?: Id) => void;\n onAsyncError: (asyncError: string) => void;\n onViewModeChanged: (viewMode: string) => void;\n onBarcodeValidationChanged: (validationResults: string) => void;\n onDataSourceIdChanged: (connectorId?: Id) => void;\n onInjectedDataChanged: (variableId: Id) => void;\n onDocumentIssueListChanged: (documentIssues: string) => void;\n onCustomUndoDataChanged: (customData: string) => void;\n onEngineEditModeChanged: (engineEditMode: string) => void;\n onBrandKitMediaChanged: (brandKitMedia: string) => void;\n onCanvasFramesManipulated: (frameIds: string) => void;\n}\n\nconst Connect = (\n editorLink: string,\n params: ConfigParameterTypes,\n setConnection: (connection: Connection) => void,\n editorId = 'chili-editor',\n styling?: StudioStyling,\n onSetupFrameError?: (error: Error) => void,\n) => {\n const editorSelectorId = `#${editorId}`;\n const iframe = document.createElement('iframe');\n iframe.setAttribute('src', 'about:blank');\n iframe.setAttribute('title', 'Chili-Editor');\n iframe.setAttribute('style', 'width: 100%; height: 100%;');\n iframe.setAttribute('frameBorder', '0');\n iframe.setAttribute('referrerpolicy', 'origin');\n\n // Everything this call attaches outside of the penpal connection is tracked per\n // invocation, so releasing one engine frame can never tear down the frame another\n // SDK instance is still using. The `message` listener closes over the iframe: as\n // long as that listener stays registered on `window`, the iframe element - and with\n // it the entire engine realm (Dart heap, CanvasKit and QuickJS WASM memory) - stays\n // reachable and can never be collected, even when the consumer has dropped every\n // reference of its own.\n let messageHandler: ((event: MessageEvent) => void) | null = null;\n let domContentLoadedHandler: (() => void) | null = null;\n let frameBlobUrl: string | null = null;\n\n /**\n * Releases the iframe and listeners this `Connect` call attached. Safe to call\n * more than once, and leaves frames of other `Connect` calls untouched.\n */\n const teardownFrame = () => {\n if (messageHandler) {\n window.removeEventListener('message', messageHandler);\n messageHandler = null;\n }\n if (domContentLoadedHandler) {\n document.removeEventListener('DOMContentLoaded', domContentLoadedHandler);\n domContentLoadedHandler = null;\n }\n iframe.remove();\n if (frameBlobUrl) {\n URL.revokeObjectURL(frameBlobUrl);\n frameBlobUrl = null;\n }\n };\n\n const setupNewFrame = () => {\n const iframeContainer = document.querySelector(editorSelectorId);\n if (iframeContainer) {\n iframeContainer?.appendChild(iframe);\n\n iframe.addEventListener(\n 'error',\n () => {\n const error = new Error('Failed to setup frame: iframe failed to load');\n onSetupFrameError?.(error);\n },\n { capture: true, once: true },\n );\n\n try {\n frameBlobUrl = setupFrame(iframe, editorLink, styling);\n } catch (error: unknown) {\n if (error instanceof Error) {\n onSetupFrameError?.(error);\n } else {\n onSetupFrameError?.(new Error(`Failed to setup frame: ${error}`));\n }\n }\n }\n };\n\n if (document.readyState === 'complete' || document.readyState === 'interactive') {\n setupNewFrame();\n } else {\n domContentLoadedHandler = () => {\n domContentLoadedHandler = null;\n setupNewFrame();\n };\n document.addEventListener('DOMContentLoaded', domContentLoadedHandler, { once: true });\n }\n\n messageHandler = (event: MessageEvent) => {\n if (event.source !== iframe.contentWindow) {\n return;\n }\n if (event.data?.type === 'iframe-error') {\n const errorData = event.data.error;\n const error = new Error(errorData.message || 'Failed to setup frame: error in iframe');\n onSetupFrameError?.(error);\n }\n };\n\n window.addEventListener('message', messageHandler);\n\n setConnection(\n connectToChild({\n // The iframe to which a connection should be made\n iframe,\n // All the methods that we want to expose to the child should be inside the methods object\n // f.e. stateChange(documentJson)\n methods: {\n actionsChanged: params.onActionsChanged,\n stateChanged: params.onStateChanged,\n documentLoaded: params.onDocumentLoaded,\n authExpired: params.onAuthExpired,\n viewportRequested: params.onViewportRequested,\n selectedFramesContent: params.onSelectedFramesContentChanged,\n selectedFramesLayout: params.onSelectedFramesLayoutChanged,\n allFramesLayout: params.onFramesLayoutChanged,\n selectedLayoutProperties: params.onSelectedLayoutPropertiesChanged,\n openLayoutPropertiesPanel: params.onPageSelectionChanged,\n selectedLayoutUnit: params.onSelectedLayoutUnitChanged,\n scrubberPositionChanged: params.onScrubberPositionChanged,\n frameAnimationsChanged: params.onFrameAnimationsChanged,\n selectedToolChanged: params.onSelectedToolChanged,\n variableListChanged: params.onVariableListChanged,\n undoStackStateChanged: params.onUndoStateChanged,\n selectedLayoutFramesChanged: params.onSelectedLayoutFramesChanged,\n selectedTextStyleChanged: params.onSelectedTextStyleChanged,\n colorsChanged: params.onColorsChanged,\n paragraphStylesChanged: params.onParagraphStylesChanged,\n characterStylesChanged: params.onCharacterStylesChanged,\n fontFamiliesChanged: params.onFontFamiliesChanged,\n selectedLayoutId: params.onSelectedLayoutIdChanged,\n layoutListChanged: params.onLayoutsChanged,\n connectorEvent: params.onConnectorEvent,\n connectorsChanged: params.onConnectorsChanged,\n zoomChanged: params.onZoomChanged,\n pageSnapshotInvalidated: params.onPageSnapshotInvalidated,\n pagesChanged: params.onPagesChanged,\n pageSizeChanged: params.onPageSizeChanged,\n shapeCornerRadiusChanged: params.onShapeCornerRadiusChanged,\n cropActiveFrameIdChanged: params.onCropActiveFrameIdChanged,\n asyncError: params.onAsyncError,\n viewModeChanged: params.onViewModeChanged,\n barcodeValidationChanged: params.onBarcodeValidationChanged,\n selectedPageIdChanged: params.onSelectedPageIdChanged,\n dataSourceIdChanged: params.onDataSourceIdChanged,\n injectedDataChanged: params.onInjectedDataChanged,\n documentIssueListChanged: params.onDocumentIssueListChanged,\n customUndoDataChanged: params.onCustomUndoDataChanged,\n engineEditingModeChanged: params.onEngineEditModeChanged,\n brandKitMediaChanged: params.onBrandKitMediaChanged,\n frameManipulated: params.onCanvasFramesManipulated,\n },\n }),\n );\n\n return teardownFrame;\n};\nexport default Connect;\n"],"names":[],"mappings":"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"}
|