@chili-publish/studio-sdk 1.46.1 → 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.
@@ -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
- iframe.srcdoc = html;
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("srcdoc", " ");
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
- document.addEventListener("DOMContentLoaded", () => {
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":"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"}
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) => void;
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
- iframe.srcdoc = html;
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("srcdoc", " ");
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
- document.addEventListener("DOMContentLoaded", () => {
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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"}
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
3
- const version = "1.46.1";
3
+ const version = "1.46.2";
4
4
  const packageInfo = {
5
5
  version
6
6
  };
@@ -1,4 +1,4 @@
1
- const version = "1.46.1";
1
+ const version = "1.46.2";
2
2
  const packageInfo = {
3
3
  version
4
4
  };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@chili-publish/studio-sdk",
3
3
  "private": false,
4
- "version": "1.46.1",
4
+ "version": "1.46.2",
5
5
  "description": "The sdk for the chili editor",
6
6
  "repository": {
7
7
  "type": "git",