@pexip-engage-public/plugin 1.1.25-canary-20250708143730 → 1.1.25

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.
Files changed (44) hide show
  1. package/CHANGELOG.md +7 -2
  2. package/dist/events/index.d.ts +0 -11
  3. package/dist/events/index.d.ts.map +1 -1
  4. package/dist/events/index.js +0 -2
  5. package/dist/events/index.js.map +1 -1
  6. package/dist/instance/PluginInstance.d.ts +1 -1
  7. package/dist/instance/PluginInstance.d.ts.map +1 -1
  8. package/dist/instance/PluginInstance.js +27 -30
  9. package/dist/instance/PluginInstance.js.map +1 -1
  10. package/dist/state/PluginState.schema.d.ts +6 -6
  11. package/package.json +9 -10
  12. package/src/@types/iframe-resizer.iframeResizer.d.ts +211 -0
  13. package/src/events/index.ts +0 -14
  14. package/src/instance/PluginInstance.ts +40 -42
  15. package/dist/resizer/api-resize-handlers.d.ts +0 -9
  16. package/dist/resizer/api-resize-handlers.d.ts.map +0 -1
  17. package/dist/resizer/api-resize-handlers.js +0 -12
  18. package/dist/resizer/api-resize-handlers.js.map +0 -1
  19. package/dist/resizer/child.d.ts +0 -12
  20. package/dist/resizer/child.d.ts.map +0 -1
  21. package/dist/resizer/child.js +0 -80
  22. package/dist/resizer/child.js.map +0 -1
  23. package/dist/resizer/common.d.ts +0 -27
  24. package/dist/resizer/common.d.ts.map +0 -1
  25. package/dist/resizer/common.js +0 -82
  26. package/dist/resizer/common.js.map +0 -1
  27. package/dist/resizer/index.d.ts +0 -2
  28. package/dist/resizer/index.d.ts.map +0 -1
  29. package/dist/resizer/index.js +0 -2
  30. package/dist/resizer/index.js.map +0 -1
  31. package/dist/resizer/parent.d.ts +0 -4
  32. package/dist/resizer/parent.d.ts.map +0 -1
  33. package/dist/resizer/parent.js +0 -185
  34. package/dist/resizer/parent.js.map +0 -1
  35. package/dist/resizer/types.d.ts +0 -101
  36. package/dist/resizer/types.d.ts.map +0 -1
  37. package/dist/resizer/types.js +0 -2
  38. package/dist/resizer/types.js.map +0 -1
  39. package/src/resizer/api-resize-handlers.ts +0 -17
  40. package/src/resizer/child.ts +0 -128
  41. package/src/resizer/common.ts +0 -117
  42. package/src/resizer/index.ts +0 -0
  43. package/src/resizer/parent.ts +0 -277
  44. package/src/resizer/types.ts +0 -108
@@ -1,19 +1,18 @@
1
1
  import { getCurrentPosition } from "@pexip-engage-public/utils/get-current-position";
2
+ import resizer, {
3
+ type IFrameComponent,
4
+ type IFrameMessageData,
5
+ } from "iframe-resizer/js/iframeResizer.js";
6
+
2
7
  import { parsePluginConfiguration } from "../configuration-parser/index.js";
3
8
  import { encodeURIParameters, pluginSearchParams } from "../encoding.js";
4
- import {
5
- IFRAME_CHILD_MESSAGE,
6
- IFRAME_PARENT_MESSAGE,
7
- type IFrameMessage,
8
- type IFrameObjectMessage,
9
- type PluginEventMessage,
10
- type PressedExternalLinkMessage,
11
- type StateUpdateMessage,
12
- type StepShownMessage,
9
+ import type {
10
+ PluginEventMessage,
11
+ PressedExternalLinkMessage,
12
+ StateUpdateMessage,
13
+ StepShownMessage,
13
14
  } from "../events/index.js";
14
15
  import { logger } from "../logger.js";
15
- import { initialize } from "../resizer/parent.js";
16
- import type { InitializeResult } from "../resizer/types.js";
17
16
  import type { PluginIntent } from "../state/index.js";
18
17
  import {
19
18
  type CustomEventPayload,
@@ -31,9 +30,8 @@ type PluginEventListener = (event: PluginCustomEvent) => unknown;
31
30
  const PexipEngagePluginFrame = getPexipEngagePluginFrame();
32
31
 
33
32
  export class PluginInstance {
34
- #instance: InitializeResult;
33
+ #instance: IFrameComponent;
35
34
  readonly #target: HTMLElement;
36
- #iframe: HTMLIFrameElement | null = null;
37
35
  #state: StateUpdateMessage["payload"] | null = null;
38
36
  #meta: Record<string, unknown> = {};
39
37
  #status: "pending" | "success" | "error" | "disposed" = "pending";
@@ -78,16 +76,7 @@ export class PluginInstance {
78
76
  });
79
77
  }
80
78
 
81
- #sendMessage = (message: IFrameObjectMessage) => {
82
- this.#iframe?.contentWindow?.postMessage({ message, type: IFRAME_CHILD_MESSAGE }, "*");
83
- };
84
-
85
- #handleMessage = async (event: MessageEvent) => {
86
- const isIframeTarget = this.#iframe && this.#iframe.contentWindow === event.source;
87
- if (!isIframeTarget || event.data.type !== IFRAME_PARENT_MESSAGE) return;
88
-
89
- const message = event.data.message as IFrameMessage;
90
-
79
+ #handleMessage = async ({ message }: IFrameMessageData) => {
91
80
  if (message.type === "STATE_UPDATE") {
92
81
  this.#state = message.payload;
93
82
 
@@ -125,7 +114,7 @@ export class PluginInstance {
125
114
  });
126
115
  }
127
116
 
128
- this.#sendMessage({
117
+ this.#instance.iFrameResizer.sendMessage({
129
118
  payload: { meta: this.#meta },
130
119
  type: "PRE_APPOINTMENT_REQUEST",
131
120
  });
@@ -134,7 +123,7 @@ export class PluginInstance {
134
123
  }
135
124
 
136
125
  if (message.type === "REQUEST_ORIGIN_URL") {
137
- this.#sendMessage({
126
+ this.#instance.iFrameResizer.sendMessage({
138
127
  payload: { href: window.location.href },
139
128
  type: "REQUEST_ORIGIN_URL",
140
129
  });
@@ -145,7 +134,7 @@ export class PluginInstance {
145
134
  if (message.type === "REQUEST_GEOLOCATION") {
146
135
  const geolocation = getCurrentPosition();
147
136
 
148
- this.#sendMessage({
137
+ this.#instance.iFrameResizer.sendMessage({
149
138
  payload: await geolocation.catch((error) =>
150
139
  typeof error === "string" ? { error } : { error: "Unknown error" },
151
140
  ),
@@ -192,26 +181,36 @@ export class PluginInstance {
192
181
  const searchParams = pluginSearchParams.encode(this.#config.config);
193
182
  const src = `${PluginInstance.#url}/plugin?${searchParams}`;
194
183
 
195
- this.#iframe = container.createPexipPlugin(src);
196
- const [instance] = initialize({ checkOrigin: false }, this.#iframe);
197
- this.#status = "success";
198
- dispatchEvent({
199
- bubbles: true,
200
- cancelable: true,
201
- detail: { instance: this, type: PluginInstance.EVENT_LOADED },
202
- target: this.#target,
203
- });
184
+ const iframe = container.createPexipPlugin(src);
185
+ const self = this;
186
+ const [instance] = resizer(
187
+ {
188
+ checkOrigin: false,
189
+ heightCalculationMethod: "taggedElement",
190
+ log: false,
191
+ onInit() {
192
+ self.#status = "success";
193
+ dispatchEvent({
194
+ bubbles: true,
195
+ cancelable: true,
196
+ detail: { instance: self, type: PluginInstance.EVENT_LOADED },
197
+ target: self.#target,
198
+ });
199
+ },
200
+ onMessage: this.#handleMessage,
201
+ resizeFrom: "child",
202
+ },
203
+ iframe,
204
+ );
204
205
 
205
- window.addEventListener("message", this.#handleMessage);
206
206
  if (!instance) throw new Error("Failed to create resizer instance");
207
207
 
208
208
  return instance;
209
209
  }
210
210
 
211
211
  #restart = () => {
212
- window.removeEventListener("message", this.#handleMessage);
213
212
  // leave event listeners intact.
214
- this.#instance.unsubscribe();
213
+ this.#instance.iFrameResizer.close();
215
214
  this.#instance = this.#createInstance();
216
215
  };
217
216
 
@@ -227,8 +226,7 @@ export class PluginInstance {
227
226
  window.clearTimeout(this.#fallbackTimeoutId);
228
227
  }
229
228
 
230
- window.addEventListener("message", this.#handleMessage);
231
- this.#instance.unsubscribe();
229
+ this.#instance.iFrameResizer.close();
232
230
  const idx = PluginInstance.#instances.indexOf(this);
233
231
  if (idx !== -1) {
234
232
  PluginInstance.#instances.splice(idx, 1);
@@ -240,11 +238,11 @@ export class PluginInstance {
240
238
  setCSSVariable = (name: string, value: string) => {
241
239
  warnPrivate({ name: "setCSSVariable", type: "function" });
242
240
 
243
- this.#sendMessage({ payload: { name, value }, type: "CSS_VAR_UPDATE" });
241
+ this.#instance.iFrameResizer.sendMessage({ payload: { name, value }, type: "CSS_VAR_UPDATE" });
244
242
  };
245
243
 
246
244
  setCustomCSS = (css: string) => {
247
- this.#sendMessage({ payload: { css }, type: "CUSTOM_CSS_UPDATE" });
245
+ this.#instance.iFrameResizer.sendMessage({ payload: { css }, type: "CUSTOM_CSS_UPDATE" });
248
246
  };
249
247
 
250
248
  #listeners = new Set<EventListener>();
@@ -1,9 +0,0 @@
1
- import type { ResizeContext } from "./types.js";
2
- /**
3
- * Resize handler that scrolls to restore the iframe's position in the viewport as it was before the resize.
4
- *
5
- * *Note:* This behavior only triggers if the iframe currently has focus,
6
- * in order to try to limit the number of scroll as it can affect the user experience.
7
- */
8
- export declare const updateParentScrollOnResize: ({ previousRenderState, nextRenderState, iframe, }: ResizeContext) => void;
9
- //# sourceMappingURL=api-resize-handlers.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"api-resize-handlers.d.ts","sourceRoot":"","sources":["../../src/resizer/api-resize-handlers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD;;;;;GAKG;AACH,eAAO,MAAM,0BAA0B,GAAI,mDAIxC,aAAa,SAIf,CAAC"}
@@ -1,12 +0,0 @@
1
- /**
2
- * Resize handler that scrolls to restore the iframe's position in the viewport as it was before the resize.
3
- *
4
- * *Note:* This behavior only triggers if the iframe currently has focus,
5
- * in order to try to limit the number of scroll as it can affect the user experience.
6
- */
7
- export const updateParentScrollOnResize = ({ previousRenderState, nextRenderState, iframe, }) => {
8
- if (document.activeElement === iframe) {
9
- window.scrollBy(0, nextRenderState.rect.bottom - previousRenderState.rect.bottom);
10
- }
11
- };
12
- //# sourceMappingURL=api-resize-handlers.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"api-resize-handlers.js","sourceRoot":"","sources":["../../src/resizer/api-resize-handlers.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,EACzC,mBAAmB,EACnB,eAAe,EACf,MAAM,GACQ,EAAE,EAAE;IAClB,IAAI,QAAQ,CAAC,aAAa,KAAK,MAAM,EAAE,CAAC;QACtC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,eAAe,CAAC,IAAI,CAAC,MAAM,GAAG,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACpF,CAAC;AACH,CAAC,CAAC"}
@@ -1,12 +0,0 @@
1
- import type { IFrameMessage, IFrameObjectMessage } from "../events/index.js";
2
- export declare class IframeChildInstance {
3
- #private;
4
- sendMessage: (message: IFrameMessage) => void;
5
- constructor({ onReady, onMessage, }: {
6
- onReady: () => void;
7
- onMessage: (message: IFrameObjectMessage) => void;
8
- });
9
- initialize: () => void;
10
- unsubscribe: () => void;
11
- }
12
- //# sourceMappingURL=child.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"child.d.ts","sourceRoot":"","sources":["../../src/resizer/child.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,mBAAmB,EAGpB,MAAM,oBAAoB,CAAC;AAY5B,qBAAa,mBAAmB;;IAuD9B,WAAW,GAAI,SAAS,aAAa,UAenC;gBAmBU,EACV,OAAO,EACP,SAAS,GACV,EAAE;QACD,OAAO,EAAE,MAAM,IAAI,CAAC;QACpB,SAAS,EAAE,CAAC,OAAO,EAAE,mBAAmB,KAAK,IAAI,CAAC;KACnD;IAKD,UAAU,aAIR;IAEF,WAAW,aAGT;CACH"}
@@ -1,80 +0,0 @@
1
- import { applyStyleSettings, deferWhenWindowDocumentIsLoaded, getBoundingRectSize, getExponentialBackoffDelay, isBrowser, isInIframe, resolveElementToObserve, } from "./common.js";
2
- export class IframeChildInstance {
3
- #queue = [];
4
- #isQueueConsumed = false;
5
- #initialized = false;
6
- #resizeObserver = null;
7
- #getResizeObserverInstance = () => {
8
- if (!this.#resizeObserver) {
9
- this.#resizeObserver = new ResizeObserver((entries) => {
10
- if (!entries[0]?.target) {
11
- return;
12
- }
13
- const { height, width } = getBoundingRectSize(entries[0].target);
14
- const data = {
15
- height,
16
- type: "iframe-resized",
17
- width,
18
- };
19
- window.parent.postMessage(data, "*");
20
- });
21
- }
22
- return this.#resizeObserver;
23
- };
24
- #handleInitializeSignal = (event, nthRetry = 0) => {
25
- const { targetElementSelector, bodyPadding, bodyMargin } = event.data;
26
- const elementToObserve = resolveElementToObserve(document, targetElementSelector);
27
- if (this.#initialized || window.parent !== event.source) {
28
- return;
29
- }
30
- if (!elementToObserve) {
31
- return setTimeout(() => this.#handleInitializeSignal(event, nthRetry + 1), getExponentialBackoffDelay(nthRetry));
32
- }
33
- applyStyleSettings(document, { bodyMargin, bodyPadding });
34
- const resizeObserver = this.#getResizeObserverInstance();
35
- resizeObserver.disconnect();
36
- resizeObserver.observe(elementToObserve);
37
- this.#initialized = true;
38
- this.#isQueueConsumed = true;
39
- this.#queue.forEach((message) => this.sendMessage(message));
40
- this.#queue.length = 0;
41
- this.#onReady();
42
- };
43
- sendMessage = (message) => {
44
- if (!isBrowser())
45
- return;
46
- if (!isInIframe() && !this.#isQueueConsumed) {
47
- this.#queue.push(message);
48
- return;
49
- }
50
- const data = {
51
- message,
52
- type: "iframe-parent-message",
53
- };
54
- window.parent.postMessage(data, "*");
55
- };
56
- #handleMessage = (event) => {
57
- if (event.data?.type === "iframe-child-init") {
58
- return deferWhenWindowDocumentIsLoaded(() => this.#handleInitializeSignal(event));
59
- }
60
- if (event.data?.type === "iframe-child-message") {
61
- this.#onMessage(event.data.message);
62
- }
63
- };
64
- #onReady;
65
- #onMessage;
66
- constructor({ onReady, onMessage, }) {
67
- this.#onReady = onReady;
68
- this.#onMessage = onMessage;
69
- }
70
- initialize = () => {
71
- if (!isBrowser() || !isInIframe())
72
- return;
73
- window.addEventListener("message", this.#handleMessage);
74
- };
75
- unsubscribe = () => {
76
- window.removeEventListener("message", this.#handleMessage);
77
- this.#resizeObserver?.disconnect();
78
- };
79
- }
80
- //# sourceMappingURL=child.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"child.js","sourceRoot":"","sources":["../../src/resizer/child.ts"],"names":[],"mappings":"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"}
@@ -1,27 +0,0 @@
1
- import type { Settings } from "./types.js";
2
- export declare const isBrowser: () => boolean;
3
- export declare const isInIframe: () => boolean;
4
- export declare const isHtmlIframeElement: (element: Element) => element is HTMLIFrameElement;
5
- export declare const deferWhenWindowDocumentIsLoaded: (executable: () => void) => void;
6
- /**
7
- * Post the message twice, it assures the target to receive the message at least once
8
- */
9
- export declare const postMessageSafelyToCrossOriginIframe: (iframe: HTMLIFrameElement, executable: () => void) => void;
10
- export declare const deferWhenSameOriginIframeIsLoaded: (iframe: HTMLIFrameElement, executable: () => void) => void;
11
- export declare const getDefaultSettings: () => Settings;
12
- export declare const isIframeSameOrigin: (iframe: HTMLIFrameElement) => boolean;
13
- export declare const extractIframeOrigin: (iframe: HTMLIFrameElement) => string | null;
14
- export declare const removeUndefinedProperties: <T extends {
15
- [key: string]: unknown;
16
- }>(object: T) => T;
17
- export declare const getBoundingRectSize: (element: Element) => {
18
- height: number;
19
- width: number;
20
- };
21
- export declare const resolveElementToObserve: (document: Document | null, targetElementSelector?: string) => Element | null;
22
- export declare const applyStyleSettings: (document: Document, styleSettings: {
23
- bodyMargin?: string;
24
- bodyPadding?: string;
25
- }) => void;
26
- export declare const getExponentialBackoffDelay: (nthRetry: number) => 100 | 1000 | 10000;
27
- //# sourceMappingURL=common.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../src/resizer/common.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,eAAO,MAAM,SAAS,eAAsC,CAAC;AAE7D,eAAO,MAAM,UAAU,eAAmC,CAAC;AAE3D,eAAO,MAAM,mBAAmB,GAAI,SAAS,OAAO,KAAG,OAAO,IAAI,iBAC5B,CAAC;AAEvC,eAAO,MAAM,+BAA+B,GAAI,YAAY,MAAM,IAAI,SAIrE,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,oCAAoC,GAC/C,QAAQ,iBAAiB,EACzB,YAAY,MAAM,IAAI,SAIvB,CAAC;AAEF,eAAO,MAAM,iCAAiC,GAC5C,QAAQ,iBAAiB,EACzB,YAAY,MAAM,IAAI,SASvB,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,MAAM,QAIrC,CAAC;AAEH,eAAO,MAAM,kBAAkB,GAAI,QAAQ,iBAAiB,YAM3D,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAAI,QAAQ,iBAAiB,KAAG,MAAM,GAAG,IASxE,CAAC;AAEF,eAAO,MAAM,yBAAyB,GAAI,CAAC,SAAS;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,EAAE,QAAQ,CAAC,KAAG,CAI3F,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAAI,SAAS,OAAO;;;CAInD,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAClC,UAAU,QAAQ,GAAG,IAAI,EACzB,wBAAwB,MAAM,mBAS/B,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAC7B,UAAU,QAAQ,EAClB,eAAe;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,SAa7D,CAAC;AAEF,eAAO,MAAM,0BAA0B,GAAI,UAAU,MAAM,uBAU1D,CAAC"}
@@ -1,82 +0,0 @@
1
- export const isBrowser = () => typeof window !== "undefined";
2
- export const isInIframe = () => window.self !== window.top;
3
- export const isHtmlIframeElement = (element) => element instanceof HTMLIFrameElement;
4
- export const deferWhenWindowDocumentIsLoaded = (executable) => {
5
- window.document.readyState === "complete"
6
- ? executable()
7
- : window.addEventListener("load", executable);
8
- };
9
- /**
10
- * Post the message twice, it assures the target to receive the message at least once
11
- */
12
- export const postMessageSafelyToCrossOriginIframe = (iframe, executable) => {
13
- executable();
14
- iframe.addEventListener("load", executable);
15
- };
16
- export const deferWhenSameOriginIframeIsLoaded = (iframe, executable) => {
17
- const isLoadingCompleted = iframe.contentWindow?.document.readyState === "complete";
18
- const isNotBlankPage = iframe.src !== "about:blank" && iframe.contentWindow?.location.href !== "about:blank"; // Chrome browsers load once with an empty location
19
- return isNotBlankPage && isLoadingCompleted
20
- ? executable()
21
- : iframe.addEventListener("load", executable);
22
- };
23
- export const getDefaultSettings = () => ({
24
- checkOrigin: true,
25
- enableLegacyLibSupport: false,
26
- offsetSize: 0,
27
- });
28
- export const isIframeSameOrigin = (iframe) => {
29
- try {
30
- return new URL(iframe.src).origin === window.location.origin;
31
- }
32
- catch (e) {
33
- return false;
34
- }
35
- };
36
- export const extractIframeOrigin = (iframe) => {
37
- try {
38
- const origin = new URL(iframe.src).origin;
39
- if (origin !== "about:blank") {
40
- return origin;
41
- }
42
- }
43
- catch (error) { }
44
- return null;
45
- };
46
- export const removeUndefinedProperties = (object) => {
47
- Object.keys(object).forEach((key) => object[key] === undefined && delete object[key]);
48
- return object;
49
- };
50
- export const getBoundingRectSize = (element) => {
51
- const { height, width } = element.getBoundingClientRect();
52
- return { height: Math.ceil(height), width: Math.ceil(width) };
53
- };
54
- export const resolveElementToObserve = (document, targetElementSelector) => {
55
- if (!document) {
56
- return null;
57
- }
58
- return targetElementSelector
59
- ? document.querySelector(targetElementSelector)
60
- : document.documentElement;
61
- };
62
- export const applyStyleSettings = (document, styleSettings) => {
63
- if (!document) {
64
- return;
65
- }
66
- if (styleSettings.bodyPadding) {
67
- document.body.style.padding = styleSettings.bodyPadding;
68
- }
69
- if (styleSettings.bodyMargin) {
70
- document.body.style.margin = styleSettings.bodyMargin;
71
- }
72
- };
73
- export const getExponentialBackoffDelay = (nthRetry) => {
74
- if (nthRetry <= 100) {
75
- return 100; // for 10 seconds
76
- }
77
- if (nthRetry <= 120) {
78
- return 1000; // for 20 seconds
79
- }
80
- return 10000;
81
- };
82
- //# sourceMappingURL=common.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"common.js","sourceRoot":"","sources":["../../src/resizer/common.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/resizer/index.ts"],"names":[],"mappings":""}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/resizer/index.ts"],"names":[],"mappings":""}
@@ -1,4 +0,0 @@
1
- import type { InitializeFunction } from "./types.js";
2
- declare const initialize: InitializeFunction;
3
- export { initialize };
4
- //# sourceMappingURL=parent.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"parent.d.ts","sourceRoot":"","sources":["../../src/resizer/parent.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAGV,kBAAkB,EAInB,MAAM,YAAY,CAAC;AAKpB,QAAA,MAAM,UAAU,EAAE,kBA4BjB,CAAC;AA8NF,OAAO,EAAE,UAAU,EAAE,CAAC"}
@@ -1,185 +0,0 @@
1
- import { applyStyleSettings, deferWhenSameOriginIframeIsLoaded, extractIframeOrigin, getBoundingRectSize, getDefaultSettings, getExponentialBackoffDelay, isBrowser, isHtmlIframeElement, isIframeSameOrigin, postMessageSafelyToCrossOriginIframe, removeUndefinedProperties, resolveElementToObserve, } from "./common.js";
2
- const getResizeObserverInstance = createResizerObserverLazyFactory();
3
- let registeredElements = [];
4
- const initialize = (clientSettings, selector) => {
5
- if (!isBrowser()) {
6
- return [];
7
- }
8
- const finalSettings = {
9
- ...getDefaultSettings(),
10
- ...removeUndefinedProperties(clientSettings ?? {}),
11
- };
12
- const iframes = resolveIframesToRegister(selector);
13
- const allowedOrigins = registerIframesAllowOrigins(finalSettings, iframes);
14
- return iframes.map((iframe) => {
15
- const registeredElement = {
16
- iframe,
17
- initContext: { isInitialized: false, retryAttempts: 0 },
18
- interactionState: { isHovered: false },
19
- settings: finalSettings,
20
- };
21
- const unsubscribe = addChildResizeListener(registeredElement, allowedOrigins);
22
- registeredElements.push(registeredElement);
23
- return {
24
- unsubscribe: () => {
25
- unsubscribe();
26
- registeredElements = registeredElements.filter((entry) => entry.iframe !== iframe);
27
- },
28
- };
29
- });
30
- };
31
- function resolveIframesToRegister(selector) {
32
- if (typeof selector === "string") {
33
- return Array.from(document.querySelectorAll(selector)).filter(isHtmlIframeElement);
34
- }
35
- if (selector) {
36
- return isHtmlIframeElement(selector) ? [selector] : [];
37
- }
38
- return Array.from(document.getElementsByTagName("iframe"));
39
- }
40
- function registerIframesAllowOrigins(settings, iframes) {
41
- if (Array.isArray(settings.checkOrigin)) {
42
- return settings.checkOrigin;
43
- }
44
- if (!settings.checkOrigin) {
45
- return [];
46
- }
47
- const allowedOrigins = [];
48
- for (const iframe of iframes) {
49
- const origin = extractIframeOrigin(iframe);
50
- if (origin) {
51
- allowedOrigins.push(origin);
52
- }
53
- }
54
- return allowedOrigins;
55
- }
56
- function addChildResizeListener(registeredElement, allowedOrigins) {
57
- const removeResizeListener = isIframeSameOrigin(registeredElement.iframe)
58
- ? addSameOriginChildResizeListener(registeredElement)
59
- : addCrossOriginChildResizeListener(registeredElement, allowedOrigins);
60
- const removeInteractionListeners = addInteractionListeners(registeredElement);
61
- return () => {
62
- removeResizeListener();
63
- removeInteractionListeners();
64
- };
65
- }
66
- function addCrossOriginChildResizeListener(registeredElement, allowedOrigins) {
67
- const { iframe, initContext, settings: { checkOrigin, targetElementSelector, bodyPadding, bodyMargin }, } = registeredElement;
68
- const handleIframeResizedMessage = (event) => {
69
- const isOriginValid = !checkOrigin || allowedOrigins.includes(event.origin);
70
- const isIframeTarget = iframe.contentWindow === event.source;
71
- if (!isIframeTarget || !isOriginValid) {
72
- return;
73
- }
74
- if (event.data?.type === "iframe-resized") {
75
- const { height } = event.data;
76
- height && resizeIframe({ newHeight: height, registeredElement });
77
- return;
78
- }
79
- };
80
- window.addEventListener("message", handleIframeResizedMessage);
81
- const initMessage = {
82
- bodyMargin,
83
- bodyPadding,
84
- targetElementSelector,
85
- type: "iframe-child-init",
86
- };
87
- const sendInitializationMessageToChild = () => {
88
- postMessageSafelyToCrossOriginIframe(iframe, () => iframe.contentWindow?.postMessage(initMessage, "*"));
89
- initContext.retryAttempts++;
90
- initContext.retryTimeoutId = window.setTimeout(sendInitializationMessageToChild, getExponentialBackoffDelay(initContext.retryAttempts));
91
- };
92
- sendInitializationMessageToChild();
93
- return () => window.removeEventListener("message", handleIframeResizedMessage);
94
- }
95
- function addSameOriginChildResizeListener(registeredElement) {
96
- const { iframe, settings } = registeredElement;
97
- const { targetElementSelector } = settings;
98
- let nthRetry = 0;
99
- const initialize = () => {
100
- const elementToObserve = resolveElementToObserve(iframe.contentDocument, targetElementSelector);
101
- if (!iframe.contentDocument || !elementToObserve) {
102
- nthRetry++;
103
- return setTimeout(initialize, getExponentialBackoffDelay(nthRetry));
104
- }
105
- applyStyleSettings(iframe.contentDocument, settings);
106
- getResizeObserverInstance().observe(elementToObserve);
107
- };
108
- deferWhenSameOriginIframeIsLoaded(iframe, initialize);
109
- return () => {
110
- const elementToObserve = resolveElementToObserve(iframe.contentDocument, targetElementSelector);
111
- if (elementToObserve) {
112
- getResizeObserverInstance().unobserve(elementToObserve);
113
- }
114
- iframe.removeEventListener("load", initialize);
115
- };
116
- }
117
- function addInteractionListeners({ iframe, interactionState }) {
118
- const onMouseEnter = () => {
119
- interactionState.isHovered = true;
120
- };
121
- const onMouseLeave = () => {
122
- interactionState.isHovered = false;
123
- };
124
- iframe.addEventListener("mouseenter", onMouseEnter);
125
- iframe.addEventListener("mouseleave", onMouseLeave);
126
- return () => {
127
- iframe.removeEventListener("mouseenter", onMouseEnter);
128
- iframe.removeEventListener("mouseleave", onMouseLeave);
129
- };
130
- }
131
- function createResizerObserverLazyFactory() {
132
- let resizeObserver = null;
133
- return () => {
134
- if (!resizeObserver) {
135
- const handleEntry = ({ target }) => {
136
- const matchingRegisteredElement = registeredElements.find(({ iframe }) => iframe.contentDocument === target.ownerDocument);
137
- if (!matchingRegisteredElement) {
138
- return;
139
- }
140
- const { iframe, settings } = matchingRegisteredElement;
141
- const observedElement = resolveElementToObserve(iframe.contentDocument, settings.targetElementSelector);
142
- if (!observedElement) {
143
- return;
144
- }
145
- const { height } = getBoundingRectSize(observedElement);
146
- if (!height) {
147
- return;
148
- }
149
- resizeIframe({ newHeight: height, registeredElement: matchingRegisteredElement });
150
- };
151
- resizeObserver = new ResizeObserver((entries) => entries.forEach(handleEntry));
152
- }
153
- return resizeObserver;
154
- };
155
- }
156
- function resizeIframe({ registeredElement, newHeight, }) {
157
- const { iframe, settings, interactionState, initContext } = registeredElement;
158
- if (!initContext.isInitialized) {
159
- initContext.isInitialized = true;
160
- clearTimeout(initContext.retryTimeoutId);
161
- }
162
- if (settings.onBeforeIframeResize?.({
163
- iframe,
164
- observedHeight: newHeight,
165
- settings: { ...settings },
166
- }) === false) {
167
- return;
168
- }
169
- const previousBoundingRect = iframe.getBoundingClientRect();
170
- const newCalculatedHeight = newHeight + settings.offsetSize;
171
- iframe.style.height = `${newCalculatedHeight}px`;
172
- if (!settings.onIframeResize) {
173
- return;
174
- }
175
- const resizeContext = {
176
- iframe,
177
- interactionState: { ...interactionState },
178
- nextRenderState: { rect: iframe.getBoundingClientRect() },
179
- previousRenderState: { rect: previousBoundingRect },
180
- settings: { ...settings },
181
- };
182
- settings.onIframeResize(resizeContext);
183
- }
184
- export { initialize };
185
- //# sourceMappingURL=parent.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"parent.js","sourceRoot":"","sources":["../../src/resizer/parent.ts"],"names":[],"mappings":"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"}