@mittwald/flow-remote-react-renderer 0.2.0-alpha.1031 → 0.2.0-alpha.1033

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 (38) hide show
  1. package/dist/js/RemoteRenderer.mjs +11 -12
  2. package/dist/js/RemoteRenderer.mjs.map +1 -1
  3. package/dist/js/RemoteRendererBrowser.mjs +121 -185
  4. package/dist/js/RemoteRendererBrowser.mjs.map +1 -1
  5. package/dist/js/auto-generated/index.mjs +138 -345
  6. package/dist/js/auto-generated/index.mjs.map +1 -1
  7. package/dist/js/components/Form.mjs +21 -28
  8. package/dist/js/components/Form.mjs.map +1 -1
  9. package/dist/js/components/HostRenderErrorBoundary.mjs +29 -41
  10. package/dist/js/components/HostRenderErrorBoundary.mjs.map +1 -1
  11. package/dist/js/components/NotificationRenderController.mjs +20 -21
  12. package/dist/js/components/NotificationRenderController.mjs.map +1 -1
  13. package/dist/js/components/SlotRootWrapper.mjs +7 -6
  14. package/dist/js/components/SlotRootWrapper.mjs.map +1 -1
  15. package/dist/js/components/index.mjs +4 -0
  16. package/dist/js/components.mjs +42 -49
  17. package/dist/js/components.mjs.map +1 -1
  18. package/dist/js/hooks/useControllableSuspenseTrigger.mjs +23 -26
  19. package/dist/js/hooks/useControllableSuspenseTrigger.mjs.map +1 -1
  20. package/dist/js/hooks/useMergedComponents.mjs +11 -21
  21. package/dist/js/hooks/useMergedComponents.mjs.map +1 -1
  22. package/dist/js/hooks/useUpdateHostPathnameOnRemote.mjs +13 -13
  23. package/dist/js/hooks/useUpdateHostPathnameOnRemote.mjs.map +1 -1
  24. package/dist/js/index.mjs +4 -5
  25. package/dist/js/integrations/react-hook-form/Form.mjs +22 -12
  26. package/dist/js/integrations/react-hook-form/Form.mjs.map +1 -1
  27. package/dist/js/lib/componentUsage.mjs +7 -5
  28. package/dist/js/lib/componentUsage.mjs.map +1 -1
  29. package/dist/js/lib/createFlowRemoteComponentRenderer.mjs +27 -42
  30. package/dist/js/lib/createFlowRemoteComponentRenderer.mjs.map +1 -1
  31. package/dist/js/lib/elementFactory.mjs +15 -19
  32. package/dist/js/lib/elementFactory.mjs.map +1 -1
  33. package/dist/js/lib/mapAttributeToReactProperty.mjs +9 -10
  34. package/dist/js/lib/mapAttributeToReactProperty.mjs.map +1 -1
  35. package/dist/js/lib/propClassifiers.mjs +6 -4
  36. package/dist/js/lib/propClassifiers.mjs.map +1 -1
  37. package/package.json +11 -13
  38. package/dist/js/index.mjs.map +0 -1
@@ -1,16 +1,15 @@
1
1
  "use client"
2
2
  /* */
3
- 'use client';
4
- import { jsx } from 'react/jsx-runtime';
5
- import { BrowserOnly } from '@mittwald/flow-react-components';
6
- import React from 'react';
7
-
8
- const RemoteRendererBrowser = React.lazy(
9
- () => import('./RemoteRendererBrowser.mjs')
10
- );
11
- const RemoteRenderer = (props) => {
12
- return /* @__PURE__ */ jsx(BrowserOnly, { children: /* @__PURE__ */ jsx(RemoteRendererBrowser, { ...props }) });
3
+ "use client";
4
+ import { BrowserOnly } from "@mittwald/flow-react-components";
5
+ import React from "react";
6
+ import { jsx } from "react/jsx-runtime";
7
+ //#region src/RemoteRenderer.tsx
8
+ var RemoteRendererBrowser = React.lazy(() => import("./RemoteRendererBrowser.mjs"));
9
+ var RemoteRenderer = (props) => {
10
+ return /* @__PURE__ */ jsx(BrowserOnly, { children: /* @__PURE__ */ jsx(RemoteRendererBrowser, { ...props }) });
13
11
  };
14
-
12
+ //#endregion
15
13
  export { RemoteRenderer, RemoteRenderer as default };
16
- //# sourceMappingURL=RemoteRenderer.mjs.map
14
+
15
+ //# sourceMappingURL=RemoteRenderer.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"RemoteRenderer.mjs","sources":["../../src/RemoteRenderer.tsx"],"sourcesContent":["\"use client\";\nimport type { RemoteRendererBrowserProps } from \"@/RemoteRendererBrowser\";\nimport { BrowserOnly } from \"@mittwald/flow-react-components\";\nimport type { RemoteReadyEvent } from \"@mittwald/flow-remote-core\";\nimport React, { type FC } from \"react\";\n\nexport type { RemoteRendererBrowserProps } from \"@/RemoteRendererBrowser\";\nexport type {\n ComponentUsageEvent,\n ComponentUsageHandler,\n} from \"@/lib/componentUsage\";\nexport type { RemoteReadyEvent };\n\nconst RemoteRendererBrowser = React.lazy(\n () => import(\"./RemoteRendererBrowser\"),\n);\n\nexport const RemoteRenderer: FC<RemoteRendererBrowserProps> = (props) => {\n return (\n <BrowserOnly>\n <RemoteRendererBrowser {...props} />\n </BrowserOnly>\n );\n};\n\nexport default RemoteRenderer;\n"],"names":[],"mappings":";;;;;AAaA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAwB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA;AAAA,CAAA,CAClC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,OAAO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAyB;AACxC,CAAA;AAEO,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAiD,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU;AACvE,CAAA,CAAA,2BACG,WAAA,CAAA,CAAA,CAAA,CACC,QAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,CAAA,CAAuB,CAAA,CAAA,CAAG,OAAO,CAAA,EACpC,CAAA;AAEJ,CAAA;;"}
1
+ {"version":3,"file":"RemoteRenderer.mjs","names":[],"sources":["../../src/RemoteRenderer.tsx"],"sourcesContent":["\"use client\";\nimport type { RemoteRendererBrowserProps } from \"@/RemoteRendererBrowser\";\nimport { BrowserOnly } from \"@mittwald/flow-react-components\";\nimport type { RemoteReadyEvent } from \"@mittwald/flow-remote-core\";\nimport React, { type FC } from \"react\";\n\nexport type { RemoteRendererBrowserProps } from \"@/RemoteRendererBrowser\";\nexport type {\n ComponentUsageEvent,\n ComponentUsageHandler,\n} from \"@/lib/componentUsage\";\nexport type { RemoteReadyEvent };\n\nconst RemoteRendererBrowser = React.lazy(\n () => import(\"./RemoteRendererBrowser\"),\n);\n\nexport const RemoteRenderer: FC<RemoteRendererBrowserProps> = (props) => {\n return (\n <BrowserOnly>\n <RemoteRendererBrowser {...props} />\n </BrowserOnly>\n );\n};\n\nexport default RemoteRenderer;\n"],"mappings":";;;;;;;AAaA,IAAM,wBAAwB,MAAM,WAC5B,OAAO,8BACf;AAEA,IAAa,kBAAkD,UAAU;CACvE,OACE,oBAAC,aAAD,EAAA,UACE,oBAAC,uBAAD,EAAuB,GAAI,MAAQ,CAAA,EACxB,CAAA;AAEjB"}
@@ -1,191 +1,127 @@
1
1
  "use client"
2
2
  /* */
3
- 'use client';
4
- import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
5
- import { HostRenderErrorBoundary } from './components/HostRenderErrorBoundary.mjs';
6
- import { useMergedComponents } from './hooks/useMergedComponents.mjs';
7
- import { toComponentUsageEvent } from './lib/componentUsage.mjs';
8
- import { getFlowComponentStatus } from '@mittwald/flow-react-components/internal';
9
- import { useControllableSuspenseTrigger } from './hooks/useControllableSuspenseTrigger.mjs';
10
- import { useUpdateHostPathnameOnRemote } from './hooks/useUpdateHostPathnameOnRemote.mjs';
11
- import { RemoteError, connectRemoteIframeRef } from '@mittwald/flow-remote-core';
12
- import { refresh, usePromise } from '@mittwald/react-use-promise';
13
- import { RemoteRootRenderer, RemoteReceiver } from '@mittwald/remote-dom-react/host';
14
- import { useMemo, useState, useRef, useEffect } from 'react';
15
- import { useLanguage, useTheme } from '@mittwald/flow-react-components';
16
-
17
- const hiddenIframeStyle = {
18
- visibility: "hidden",
19
- height: 0,
20
- width: 0,
21
- border: "none",
22
- position: "absolute",
23
- marginLeft: "-9999px"
3
+ "use client";
4
+ import { HostRenderErrorBoundary } from "./components/HostRenderErrorBoundary.mjs";
5
+ import { useMergedComponents } from "./hooks/useMergedComponents.mjs";
6
+ import { toComponentUsageEvent } from "./lib/componentUsage.mjs";
7
+ import { useControllableSuspenseTrigger } from "./hooks/useControllableSuspenseTrigger.mjs";
8
+ import { useUpdateHostPathnameOnRemote } from "./hooks/useUpdateHostPathnameOnRemote.mjs";
9
+ import { useLanguage, useTheme } from "@mittwald/flow-react-components";
10
+ import { useEffect, useMemo, useRef, useState } from "react";
11
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
12
+ import { RemoteError, connectRemoteIframeRef } from "@mittwald/flow-remote-core";
13
+ import { RemoteReceiver, RemoteRootRenderer } from "@mittwald/remote-dom-react/host";
14
+ import { getFlowComponentStatus } from "@mittwald/flow-react-components/internal";
15
+ import { refresh, usePromise } from "@mittwald/react-use-promise";
16
+ //#region src/RemoteRendererBrowser.tsx
17
+ var hiddenIframeStyle = {
18
+ visibility: "hidden",
19
+ height: 0,
20
+ width: 0,
21
+ border: "none",
22
+ position: "absolute",
23
+ marginLeft: "-9999px"
24
24
  };
25
- const RemoteRendererBrowser = (props) => {
26
- const {
27
- integrations = [],
28
- __remoteReceiver: remoteReceiverFromProps,
29
- ...connectedProps
30
- } = props;
31
- const remoteComponents = useMergedComponents(integrations);
32
- if (remoteReceiverFromProps) {
33
- return /* @__PURE__ */ jsx(
34
- RemoteRootRenderer,
35
- {
36
- components: remoteComponents,
37
- receiver: remoteReceiverFromProps
38
- }
39
- );
40
- }
41
- const { src } = connectedProps;
42
- if (!src) {
43
- throw new RemoteError("'src' prop is required");
44
- }
45
- return /* @__PURE__ */ jsx(
46
- RemoteRendererConnected,
47
- {
48
- ...connectedProps,
49
- src,
50
- remoteComponents
51
- }
52
- );
25
+ var RemoteRendererBrowser = (props) => {
26
+ const { integrations = [], __remoteReceiver: remoteReceiverFromProps, ...connectedProps } = props;
27
+ const remoteComponents = useMergedComponents(integrations);
28
+ if (remoteReceiverFromProps) return /* @__PURE__ */ jsx(RemoteRootRenderer, {
29
+ components: remoteComponents,
30
+ receiver: remoteReceiverFromProps
31
+ });
32
+ const { src } = connectedProps;
33
+ if (!src) throw new RemoteError("'src' prop is required");
34
+ return /* @__PURE__ */ jsx(RemoteRendererConnected, {
35
+ ...connectedProps,
36
+ src,
37
+ remoteComponents
38
+ });
53
39
  };
54
- const RemoteRendererConnected = (props) => {
55
- const {
56
- timeoutMs = 1e4,
57
- src,
58
- extBridgeImplementation,
59
- onNavigationStateChanged,
60
- onConnected,
61
- onDeprecation,
62
- onComponentUsage,
63
- hostPathname,
64
- remoteComponents
65
- } = props;
66
- const language = useLanguage();
67
- const theme = useTheme();
68
- const renderPromise = useMemo(() => Promise.withResolvers(), [src]);
69
- const connectionPromise = useMemo(() => Promise.withResolvers(), [src]);
70
- const loadingPromise = useMemo(() => Promise.withResolvers(), [src]);
71
- const suspenseTrigger = useControllableSuspenseTrigger();
72
- const [connectionSrc, setConnectionSrc] = useState(null);
73
- const connection = useRef(void 0);
74
- const [remoteError, setRemoteError] = useState();
75
- const [receiver, rendererSubscriber] = useMemo(() => {
76
- const remoteReceiver = new RemoteReceiver();
77
- const controller = new AbortController();
78
- remoteReceiver.subscribe(
79
- { id: remoteReceiver.root.id },
80
- () => renderPromise.resolve(),
81
- { signal: controller.signal }
82
- );
83
- return [remoteReceiver, controller];
84
- }, [src]);
85
- useUpdateHostPathnameOnRemote(hostPathname, connection.current);
86
- const hostConfig = {
87
- language,
88
- theme
89
- };
90
- const connect = connectRemoteIframeRef({
91
- connection: receiver.connection,
92
- extBridgeImplementation,
93
- hostConfig,
94
- onReady: ({ connection: establishedConnection, remoteReadyEvent }) => {
95
- establishedConnection.updateHostPathname(hostPathname);
96
- onConnected?.(remoteReadyEvent);
97
- connectionPromise.resolve();
98
- },
99
- onLoadingChanged: (isLoading) => {
100
- if (isLoading) {
101
- suspenseTrigger.start();
102
- } else {
103
- suspenseTrigger.stop();
104
- }
105
- },
106
- onError: setRemoteError,
107
- onNavigationStateChanged,
108
- onDeprecation,
109
- onEvent: (event) => {
110
- if (event.event === "ComponentRendered") {
111
- onComponentUsage?.(
112
- toComponentUsageEvent(event, getFlowComponentStatus)
113
- );
114
- }
115
- }
116
- });
117
- const timeoutPromise = (message) => new Promise((_, rej) => {
118
- setTimeout(() => {
119
- rej(new RemoteError(`${message}: Timeout reached`));
120
- }, timeoutMs);
121
- });
122
- const overallLoading = () => Promise.all([
123
- Promise.race([
124
- loadingPromise.promise,
125
- timeoutPromise("Remote URL could not be loaded")
126
- ]),
127
- Promise.race([
128
- connectionPromise.promise,
129
- timeoutPromise("Could not establish remote connection")
130
- ]),
131
- Promise.race([
132
- renderPromise.promise,
133
- timeoutPromise("Remote rendering failed")
134
- ])
135
- ]);
136
- const awaitLoadingPromise = connectionSrc === src;
137
- const loaderResourceTag = `mittwald/remote-react-renderer/connect/${src}`;
138
- useEffect(
139
- () => () => {
140
- refresh({
141
- tag: loaderResourceTag
142
- });
143
- },
144
- [src]
145
- );
146
- usePromise(
147
- async () => {
148
- await overallLoading();
149
- rendererSubscriber.abort();
150
- },
151
- // Disabled while erroring so the error is thrown below instead of the
152
- // loader suspending indefinitely.
153
- awaitLoadingPromise && !remoteError ? [] : null,
154
- {
155
- loaderId: src,
156
- tags: [loaderResourceTag]
157
- }
158
- );
159
- if (remoteError) {
160
- throw new RemoteError(`Remote rendering failed: ${remoteError}`);
161
- }
162
- return /* @__PURE__ */ jsxs(Fragment, { children: [
163
- /* @__PURE__ */ jsx(
164
- HostRenderErrorBoundary,
165
- {
166
- onNoComponentError: async (error) => {
167
- await connection.current?.reportHostError(
168
- error instanceof Error ? error.message : String(error)
169
- );
170
- },
171
- children: /* @__PURE__ */ jsx(RemoteRootRenderer, { components: remoteComponents, receiver })
172
- }
173
- ),
174
- /* @__PURE__ */ jsx(
175
- "iframe",
176
- {
177
- src,
178
- ref: (ref) => {
179
- connection.current = connect(ref);
180
- setConnectionSrc(src);
181
- },
182
- onLoad: () => loadingPromise.resolve(),
183
- onError: () => loadingPromise.reject(),
184
- style: hiddenIframeStyle
185
- }
186
- )
187
- ] });
40
+ var RemoteRendererConnected = (props) => {
41
+ const { timeoutMs = 1e4, src, extBridgeImplementation, onNavigationStateChanged, onConnected, onDeprecation, onComponentUsage, hostPathname, remoteComponents } = props;
42
+ const language = useLanguage();
43
+ const theme = useTheme();
44
+ const renderPromise = useMemo(() => Promise.withResolvers(), [src]);
45
+ const connectionPromise = useMemo(() => Promise.withResolvers(), [src]);
46
+ const loadingPromise = useMemo(() => Promise.withResolvers(), [src]);
47
+ const suspenseTrigger = useControllableSuspenseTrigger();
48
+ const [connectionSrc, setConnectionSrc] = useState(null);
49
+ const connection = useRef(void 0);
50
+ const [remoteError, setRemoteError] = useState();
51
+ const [receiver, rendererSubscriber] = useMemo(() => {
52
+ const remoteReceiver = new RemoteReceiver();
53
+ const controller = new AbortController();
54
+ remoteReceiver.subscribe({ id: remoteReceiver.root.id }, () => renderPromise.resolve(), { signal: controller.signal });
55
+ return [remoteReceiver, controller];
56
+ }, [src]);
57
+ useUpdateHostPathnameOnRemote(hostPathname, connection.current);
58
+ const hostConfig = {
59
+ language,
60
+ theme
61
+ };
62
+ const connect = connectRemoteIframeRef({
63
+ connection: receiver.connection,
64
+ extBridgeImplementation,
65
+ hostConfig,
66
+ onReady: ({ connection: establishedConnection, remoteReadyEvent }) => {
67
+ establishedConnection.updateHostPathname(hostPathname);
68
+ onConnected?.(remoteReadyEvent);
69
+ connectionPromise.resolve();
70
+ },
71
+ onLoadingChanged: (isLoading) => {
72
+ if (isLoading) suspenseTrigger.start();
73
+ else suspenseTrigger.stop();
74
+ },
75
+ onError: setRemoteError,
76
+ onNavigationStateChanged,
77
+ onDeprecation,
78
+ onEvent: (event) => {
79
+ if (event.event === "ComponentRendered") onComponentUsage?.(toComponentUsageEvent(event, getFlowComponentStatus));
80
+ }
81
+ });
82
+ const timeoutPromise = (message) => new Promise((_, rej) => {
83
+ setTimeout(() => {
84
+ rej(new RemoteError(`${message}: Timeout reached`));
85
+ }, timeoutMs);
86
+ });
87
+ const overallLoading = () => Promise.all([
88
+ Promise.race([loadingPromise.promise, timeoutPromise("Remote URL could not be loaded")]),
89
+ Promise.race([connectionPromise.promise, timeoutPromise("Could not establish remote connection")]),
90
+ Promise.race([renderPromise.promise, timeoutPromise("Remote rendering failed")])
91
+ ]);
92
+ const awaitLoadingPromise = connectionSrc === src;
93
+ const loaderResourceTag = `mittwald/remote-react-renderer/connect/${src}`;
94
+ useEffect(() => () => {
95
+ refresh({ tag: loaderResourceTag });
96
+ }, [src]);
97
+ usePromise(async () => {
98
+ await overallLoading();
99
+ rendererSubscriber.abort();
100
+ }, awaitLoadingPromise && !remoteError ? [] : null, {
101
+ loaderId: src,
102
+ tags: [loaderResourceTag]
103
+ });
104
+ if (remoteError) throw new RemoteError(`Remote rendering failed: ${remoteError}`);
105
+ return /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(HostRenderErrorBoundary, {
106
+ onNoComponentError: async (error) => {
107
+ await connection.current?.reportHostError(error instanceof Error ? error.message : String(error));
108
+ },
109
+ children: /* @__PURE__ */ jsx(RemoteRootRenderer, {
110
+ components: remoteComponents,
111
+ receiver
112
+ })
113
+ }), /* @__PURE__ */ jsx("iframe", {
114
+ src,
115
+ ref: (ref) => {
116
+ connection.current = connect(ref);
117
+ setConnectionSrc(src);
118
+ },
119
+ onLoad: () => loadingPromise.resolve(),
120
+ onError: () => loadingPromise.reject(),
121
+ style: hiddenIframeStyle
122
+ })] });
188
123
  };
189
-
124
+ //#endregion
190
125
  export { RemoteRendererBrowser, RemoteRendererBrowser as default };
191
- //# sourceMappingURL=RemoteRendererBrowser.mjs.map
126
+
127
+ //# sourceMappingURL=RemoteRendererBrowser.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"RemoteRendererBrowser.mjs","sources":["../../src/RemoteRendererBrowser.tsx"],"sourcesContent":["\"use client\";\n\nimport { HostRenderErrorBoundary } from \"@/components/HostRenderErrorBoundary\";\nimport { useMergedComponents } from \"@/hooks/useMergedComponents\";\nimport {\n toComponentUsageEvent,\n type ComponentUsageHandler,\n} from \"@/lib/componentUsage\";\nimport { getFlowComponentStatus } from \"@mittwald/flow-react-components/internal\";\nimport { useControllableSuspenseTrigger } from \"@/hooks/useControllableSuspenseTrigger\";\nimport { useUpdateHostPathnameOnRemote } from \"@/hooks/useUpdateHostPathnameOnRemote\";\nimport type { RemoteComponentsMap } from \"@/lib/types\";\nimport {\n connectRemoteIframeRef,\n RemoteError,\n type HostToRemoteConnection,\n type NavigationState,\n type RemoteExtBridgeConnectionApi,\n type RemoteReadyEvent,\n} from \"@mittwald/flow-remote-core\";\nimport { refresh, usePromise } from \"@mittwald/react-use-promise\";\nimport {\n RemoteReceiver,\n RemoteRootRenderer,\n} from \"@mittwald/remote-dom-react/host\";\nimport {\n type CSSProperties,\n type FC,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { useLanguage, useTheme } from \"@mittwald/flow-react-components\";\nimport type { HostConfig } from \"@mittwald/ext-bridge\";\n\nexport interface RemoteRendererBrowserProps {\n integrations?: RemoteComponentsMap<never>[];\n src?: string;\n timeoutMs?: number;\n onNavigationStateChanged?: (state: NavigationState) => void;\n onConnected?: (event: RemoteReadyEvent) => void;\n onDeprecation?: (message: string) => void;\n onComponentUsage?: ComponentUsageHandler;\n hostPathname?: string;\n extBridgeImplementation?: RemoteExtBridgeConnectionApi;\n /** Internal use only */\n __remoteReceiver?: RemoteReceiver;\n}\n\nconst hiddenIframeStyle: CSSProperties = {\n visibility: \"hidden\",\n height: 0,\n width: 0,\n border: \"none\",\n position: \"absolute\",\n marginLeft: \"-9999px\",\n};\n\nexport const RemoteRendererBrowser: FC<RemoteRendererBrowserProps> = (\n props,\n) => {\n const {\n integrations = [],\n __remoteReceiver: remoteReceiverFromProps,\n ...connectedProps\n } = props;\n\n const remoteComponents = useMergedComponents(integrations);\n\n // The two branches use disjoint sets of hooks, so the connection path lives\n // in a dedicated component. This keeps each component's hook order stable\n // (Rules of Hooks) while preserving the exact rendering of both paths.\n // Note that the receiver path has no connection, so it reports no usage.\n if (remoteReceiverFromProps) {\n return (\n <RemoteRootRenderer\n components={remoteComponents}\n receiver={remoteReceiverFromProps}\n />\n );\n }\n\n const { src } = connectedProps;\n if (!src) {\n throw new RemoteError(\"'src' prop is required\");\n }\n\n return (\n <RemoteRendererConnected\n {...connectedProps}\n src={src}\n remoteComponents={remoteComponents}\n />\n );\n};\n\ninterface RemoteRendererConnectedProps extends Omit<\n RemoteRendererBrowserProps,\n \"integrations\" | \"__remoteReceiver\" | \"src\"\n> {\n src: string;\n remoteComponents: ReturnType<typeof useMergedComponents>;\n}\n\nconst RemoteRendererConnected: FC<RemoteRendererConnectedProps> = (props) => {\n const {\n timeoutMs = 10_000,\n src,\n extBridgeImplementation,\n onNavigationStateChanged,\n onConnected,\n onDeprecation,\n onComponentUsage,\n hostPathname,\n remoteComponents,\n } = props;\n\n const language = useLanguage();\n const theme = useTheme();\n\n const renderPromise = useMemo(() => Promise.withResolvers<void>(), [src]);\n const connectionPromise = useMemo(() => Promise.withResolvers<void>(), [src]);\n const loadingPromise = useMemo(() => Promise.withResolvers<void>(), [src]);\n const suspenseTrigger = useControllableSuspenseTrigger();\n\n const [connectionSrc, setConnectionSrc] = useState<string | null>(null);\n const connection = useRef<HostToRemoteConnection>(undefined);\n const [remoteError, setRemoteError] = useState<string | undefined>();\n\n const [receiver, rendererSubscriber] = useMemo(() => {\n const remoteReceiver = new RemoteReceiver();\n const controller = new AbortController();\n remoteReceiver.subscribe(\n { id: remoteReceiver.root.id },\n () => renderPromise.resolve(),\n { signal: controller.signal },\n );\n return [remoteReceiver, controller];\n }, [src]);\n\n useUpdateHostPathnameOnRemote(hostPathname, connection.current);\n\n const hostConfig: HostConfig = {\n language,\n theme,\n };\n\n const connect = connectRemoteIframeRef({\n connection: receiver.connection,\n extBridgeImplementation,\n hostConfig,\n onReady: ({ connection: establishedConnection, remoteReadyEvent }) => {\n establishedConnection.updateHostPathname(hostPathname);\n onConnected?.(remoteReadyEvent);\n connectionPromise.resolve();\n },\n onLoadingChanged: (isLoading) => {\n if (isLoading) {\n suspenseTrigger.start();\n } else {\n suspenseTrigger.stop();\n }\n },\n onError: setRemoteError,\n onNavigationStateChanged,\n onDeprecation,\n onEvent: (event) => {\n if (event.event === \"ComponentRendered\") {\n onComponentUsage?.(\n toComponentUsageEvent(event, getFlowComponentStatus),\n );\n }\n },\n });\n\n const timeoutPromise = (message: string) =>\n new Promise((_, rej) => {\n setTimeout(() => {\n rej(new RemoteError(`${message}: Timeout reached`));\n }, timeoutMs);\n });\n\n const overallLoading = () =>\n Promise.all([\n Promise.race([\n loadingPromise.promise,\n timeoutPromise(\"Remote URL could not be loaded\"),\n ]),\n Promise.race([\n connectionPromise.promise,\n timeoutPromise(\"Could not establish remote connection\"),\n ]),\n Promise.race([\n renderPromise.promise,\n timeoutPromise(\"Remote rendering failed\"),\n ]),\n ]);\n\n const awaitLoadingPromise = connectionSrc === src;\n\n const loaderResourceTag = `mittwald/remote-react-renderer/connect/${src}`;\n\n // refresh on remount\n useEffect(\n () => () => {\n refresh({\n tag: loaderResourceTag,\n });\n },\n [src],\n );\n\n usePromise(\n async () => {\n await overallLoading();\n rendererSubscriber.abort();\n },\n // Disabled while erroring so the error is thrown below instead of the\n // loader suspending indefinitely.\n awaitLoadingPromise && !remoteError ? [] : null,\n {\n loaderId: src,\n tags: [loaderResourceTag],\n },\n );\n\n if (remoteError) {\n throw new RemoteError(`Remote rendering failed: ${remoteError}`);\n }\n\n return (\n <>\n <HostRenderErrorBoundary\n onNoComponentError={async (error) => {\n await connection.current?.reportHostError(\n error instanceof Error ? error.message : String(error),\n );\n }}\n >\n <RemoteRootRenderer components={remoteComponents} receiver={receiver} />\n </HostRenderErrorBoundary>\n <iframe\n src={src}\n ref={(ref) => {\n connection.current = connect(ref);\n setConnectionSrc(src);\n }}\n onLoad={() => loadingPromise.resolve()}\n onError={() => loadingPromise.reject()}\n style={hiddenIframeStyle}\n />\n </>\n );\n};\n\nexport default RemoteRendererBrowser;\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"RemoteRendererBrowser.mjs","names":[],"sources":["../../src/RemoteRendererBrowser.tsx"],"sourcesContent":["\"use client\";\n\nimport { HostRenderErrorBoundary } from \"@/components/HostRenderErrorBoundary\";\nimport { useMergedComponents } from \"@/hooks/useMergedComponents\";\nimport {\n toComponentUsageEvent,\n type ComponentUsageHandler,\n} from \"@/lib/componentUsage\";\nimport { getFlowComponentStatus } from \"@mittwald/flow-react-components/internal\";\nimport { useControllableSuspenseTrigger } from \"@/hooks/useControllableSuspenseTrigger\";\nimport { useUpdateHostPathnameOnRemote } from \"@/hooks/useUpdateHostPathnameOnRemote\";\nimport type { RemoteComponentsMap } from \"@/lib/types\";\nimport {\n connectRemoteIframeRef,\n RemoteError,\n type HostToRemoteConnection,\n type NavigationState,\n type RemoteExtBridgeConnectionApi,\n type RemoteReadyEvent,\n} from \"@mittwald/flow-remote-core\";\nimport { refresh, usePromise } from \"@mittwald/react-use-promise\";\nimport {\n RemoteReceiver,\n RemoteRootRenderer,\n} from \"@mittwald/remote-dom-react/host\";\nimport {\n type CSSProperties,\n type FC,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { useLanguage, useTheme } from \"@mittwald/flow-react-components\";\nimport type { HostConfig } from \"@mittwald/ext-bridge\";\n\nexport interface RemoteRendererBrowserProps {\n integrations?: RemoteComponentsMap<never>[];\n src?: string;\n timeoutMs?: number;\n onNavigationStateChanged?: (state: NavigationState) => void;\n onConnected?: (event: RemoteReadyEvent) => void;\n onDeprecation?: (message: string) => void;\n onComponentUsage?: ComponentUsageHandler;\n hostPathname?: string;\n extBridgeImplementation?: RemoteExtBridgeConnectionApi;\n /** Internal use only */\n __remoteReceiver?: RemoteReceiver;\n}\n\nconst hiddenIframeStyle: CSSProperties = {\n visibility: \"hidden\",\n height: 0,\n width: 0,\n border: \"none\",\n position: \"absolute\",\n marginLeft: \"-9999px\",\n};\n\nexport const RemoteRendererBrowser: FC<RemoteRendererBrowserProps> = (\n props,\n) => {\n const {\n integrations = [],\n __remoteReceiver: remoteReceiverFromProps,\n ...connectedProps\n } = props;\n\n const remoteComponents = useMergedComponents(integrations);\n\n // The two branches use disjoint sets of hooks, so the connection path lives\n // in a dedicated component. This keeps each component's hook order stable\n // (Rules of Hooks) while preserving the exact rendering of both paths.\n // Note that the receiver path has no connection, so it reports no usage.\n if (remoteReceiverFromProps) {\n return (\n <RemoteRootRenderer\n components={remoteComponents}\n receiver={remoteReceiverFromProps}\n />\n );\n }\n\n const { src } = connectedProps;\n if (!src) {\n throw new RemoteError(\"'src' prop is required\");\n }\n\n return (\n <RemoteRendererConnected\n {...connectedProps}\n src={src}\n remoteComponents={remoteComponents}\n />\n );\n};\n\ninterface RemoteRendererConnectedProps extends Omit<\n RemoteRendererBrowserProps,\n \"integrations\" | \"__remoteReceiver\" | \"src\"\n> {\n src: string;\n remoteComponents: ReturnType<typeof useMergedComponents>;\n}\n\nconst RemoteRendererConnected: FC<RemoteRendererConnectedProps> = (props) => {\n const {\n timeoutMs = 10_000,\n src,\n extBridgeImplementation,\n onNavigationStateChanged,\n onConnected,\n onDeprecation,\n onComponentUsage,\n hostPathname,\n remoteComponents,\n } = props;\n\n const language = useLanguage();\n const theme = useTheme();\n\n const renderPromise = useMemo(() => Promise.withResolvers<void>(), [src]);\n const connectionPromise = useMemo(() => Promise.withResolvers<void>(), [src]);\n const loadingPromise = useMemo(() => Promise.withResolvers<void>(), [src]);\n const suspenseTrigger = useControllableSuspenseTrigger();\n\n const [connectionSrc, setConnectionSrc] = useState<string | null>(null);\n const connection = useRef<HostToRemoteConnection>(undefined);\n const [remoteError, setRemoteError] = useState<string | undefined>();\n\n const [receiver, rendererSubscriber] = useMemo(() => {\n const remoteReceiver = new RemoteReceiver();\n const controller = new AbortController();\n remoteReceiver.subscribe(\n { id: remoteReceiver.root.id },\n () => renderPromise.resolve(),\n { signal: controller.signal },\n );\n return [remoteReceiver, controller];\n }, [src]);\n\n useUpdateHostPathnameOnRemote(hostPathname, connection.current);\n\n const hostConfig: HostConfig = {\n language,\n theme,\n };\n\n const connect = connectRemoteIframeRef({\n connection: receiver.connection,\n extBridgeImplementation,\n hostConfig,\n onReady: ({ connection: establishedConnection, remoteReadyEvent }) => {\n establishedConnection.updateHostPathname(hostPathname);\n onConnected?.(remoteReadyEvent);\n connectionPromise.resolve();\n },\n onLoadingChanged: (isLoading) => {\n if (isLoading) {\n suspenseTrigger.start();\n } else {\n suspenseTrigger.stop();\n }\n },\n onError: setRemoteError,\n onNavigationStateChanged,\n onDeprecation,\n onEvent: (event) => {\n if (event.event === \"ComponentRendered\") {\n onComponentUsage?.(\n toComponentUsageEvent(event, getFlowComponentStatus),\n );\n }\n },\n });\n\n const timeoutPromise = (message: string) =>\n new Promise((_, rej) => {\n setTimeout(() => {\n rej(new RemoteError(`${message}: Timeout reached`));\n }, timeoutMs);\n });\n\n const overallLoading = () =>\n Promise.all([\n Promise.race([\n loadingPromise.promise,\n timeoutPromise(\"Remote URL could not be loaded\"),\n ]),\n Promise.race([\n connectionPromise.promise,\n timeoutPromise(\"Could not establish remote connection\"),\n ]),\n Promise.race([\n renderPromise.promise,\n timeoutPromise(\"Remote rendering failed\"),\n ]),\n ]);\n\n const awaitLoadingPromise = connectionSrc === src;\n\n const loaderResourceTag = `mittwald/remote-react-renderer/connect/${src}`;\n\n // refresh on remount\n useEffect(\n () => () => {\n refresh({\n tag: loaderResourceTag,\n });\n },\n [src],\n );\n\n usePromise(\n async () => {\n await overallLoading();\n rendererSubscriber.abort();\n },\n // Disabled while erroring so the error is thrown below instead of the\n // loader suspending indefinitely.\n awaitLoadingPromise && !remoteError ? [] : null,\n {\n loaderId: src,\n tags: [loaderResourceTag],\n },\n );\n\n if (remoteError) {\n throw new RemoteError(`Remote rendering failed: ${remoteError}`);\n }\n\n return (\n <>\n <HostRenderErrorBoundary\n onNoComponentError={async (error) => {\n await connection.current?.reportHostError(\n error instanceof Error ? error.message : String(error),\n );\n }}\n >\n <RemoteRootRenderer components={remoteComponents} receiver={receiver} />\n </HostRenderErrorBoundary>\n <iframe\n src={src}\n ref={(ref) => {\n connection.current = connect(ref);\n setConnectionSrc(src);\n }}\n onLoad={() => loadingPromise.resolve()}\n onError={() => loadingPromise.reject()}\n style={hiddenIframeStyle}\n />\n </>\n );\n};\n\nexport default RemoteRendererBrowser;\n"],"mappings":"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"}