@mittwald/flow-remote-react-renderer 0.2.0-alpha.864 → 0.2.0-alpha.866

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 (74) hide show
  1. package/dist/js/RemoteRenderer.mjs +11 -12
  2. package/dist/js/RemoteRenderer.mjs.map +1 -1
  3. package/dist/js/_virtual/_rolldown/runtime.mjs +26 -0
  4. package/dist/js/index.mjs +3 -3
  5. package/dist/js/node_modules/.pnpm/invariant@2.2.4/node_modules/invariant/browser.mjs +55 -0
  6. package/dist/js/node_modules/.pnpm/invariant@2.2.4/node_modules/invariant/browser.mjs.map +1 -0
  7. package/dist/js/packages/core/src/file.mjs +19 -0
  8. package/dist/js/packages/core/src/file.mjs.map +1 -0
  9. package/dist/js/packages/core/src/index.mjs +3 -0
  10. package/dist/js/packages/remote-react-renderer/src/RemoteRendererBrowser.mjs +105 -0
  11. package/dist/js/packages/remote-react-renderer/src/RemoteRendererBrowser.mjs.map +1 -0
  12. package/dist/js/packages/remote-react-renderer/src/auto-generated/index.mjs +141 -0
  13. package/dist/js/packages/remote-react-renderer/src/auto-generated/index.mjs.map +1 -0
  14. package/dist/js/packages/remote-react-renderer/src/components/Form.mjs +28 -0
  15. package/dist/js/packages/remote-react-renderer/src/components/Form.mjs.map +1 -0
  16. package/dist/js/packages/remote-react-renderer/src/components/NotificationRenderController.mjs +24 -0
  17. package/dist/js/packages/remote-react-renderer/src/components/NotificationRenderController.mjs.map +1 -0
  18. package/dist/js/packages/remote-react-renderer/src/components/SlotRootWrapper.mjs +11 -0
  19. package/dist/js/packages/remote-react-renderer/src/components/SlotRootWrapper.mjs.map +1 -0
  20. package/dist/js/packages/remote-react-renderer/src/components/index.mjs +4 -0
  21. package/dist/js/packages/remote-react-renderer/src/components/lib/prepareFormData.mjs +21 -0
  22. package/dist/js/packages/remote-react-renderer/src/components/lib/prepareFormData.mjs.map +1 -0
  23. package/dist/js/packages/remote-react-renderer/src/components.mjs +48 -0
  24. package/dist/js/packages/remote-react-renderer/src/components.mjs.map +1 -0
  25. package/dist/js/packages/remote-react-renderer/src/hooks/useControllableSuspenseTrigger.mjs +27 -0
  26. package/dist/js/packages/remote-react-renderer/src/hooks/useControllableSuspenseTrigger.mjs.map +1 -0
  27. package/dist/js/packages/remote-react-renderer/src/hooks/useMergedComponents.mjs +14 -0
  28. package/dist/js/packages/remote-react-renderer/src/hooks/useMergedComponents.mjs.map +1 -0
  29. package/dist/js/packages/remote-react-renderer/src/hooks/useUpdateHostPathnameOnRemote.mjs +17 -0
  30. package/dist/js/packages/remote-react-renderer/src/hooks/useUpdateHostPathnameOnRemote.mjs.map +1 -0
  31. package/dist/js/packages/remote-react-renderer/src/integrations/react-hook-form/Form.mjs +26 -0
  32. package/dist/js/packages/remote-react-renderer/src/integrations/react-hook-form/Form.mjs.map +1 -0
  33. package/dist/js/packages/remote-react-renderer/src/lib/createFlowRemoteComponentRenderer.mjs +32 -0
  34. package/dist/js/packages/remote-react-renderer/src/lib/createFlowRemoteComponentRenderer.mjs.map +1 -0
  35. package/dist/js/packages/remote-react-renderer/src/lib/elementFactory.mjs +19 -0
  36. package/dist/js/packages/remote-react-renderer/src/lib/elementFactory.mjs.map +1 -0
  37. package/dist/js/packages/remote-react-renderer/src/lib/mapAttributeToReactProperty.mjs +13 -0
  38. package/dist/js/packages/remote-react-renderer/src/lib/mapAttributeToReactProperty.mjs.map +1 -0
  39. package/dist/js/packages/remote-react-renderer/src/lib/propClassifiers.mjs +9 -0
  40. package/dist/js/packages/remote-react-renderer/src/lib/propClassifiers.mjs.map +1 -0
  41. package/package.json +20 -20
  42. package/dist/js/core/src/file.mjs +0 -17
  43. package/dist/js/core/src/file.mjs.map +0 -1
  44. package/dist/js/index.mjs.map +0 -1
  45. package/dist/js/remote-react-renderer/src/RemoteRendererBrowser.mjs +0 -149
  46. package/dist/js/remote-react-renderer/src/RemoteRendererBrowser.mjs.map +0 -1
  47. package/dist/js/remote-react-renderer/src/auto-generated/index.mjs +0 -344
  48. package/dist/js/remote-react-renderer/src/auto-generated/index.mjs.map +0 -1
  49. package/dist/js/remote-react-renderer/src/components/Form.mjs +0 -37
  50. package/dist/js/remote-react-renderer/src/components/Form.mjs.map +0 -1
  51. package/dist/js/remote-react-renderer/src/components/NotificationRenderController.mjs +0 -25
  52. package/dist/js/remote-react-renderer/src/components/NotificationRenderController.mjs.map +0 -1
  53. package/dist/js/remote-react-renderer/src/components/SlotRootWrapper.mjs +0 -10
  54. package/dist/js/remote-react-renderer/src/components/SlotRootWrapper.mjs.map +0 -1
  55. package/dist/js/remote-react-renderer/src/components/lib/prepareFormData.mjs +0 -21
  56. package/dist/js/remote-react-renderer/src/components/lib/prepareFormData.mjs.map +0 -1
  57. package/dist/js/remote-react-renderer/src/components.mjs +0 -55
  58. package/dist/js/remote-react-renderer/src/components.mjs.map +0 -1
  59. package/dist/js/remote-react-renderer/src/hooks/useControllableSuspenseTrigger.mjs +0 -30
  60. package/dist/js/remote-react-renderer/src/hooks/useControllableSuspenseTrigger.mjs.map +0 -1
  61. package/dist/js/remote-react-renderer/src/hooks/useMergedComponents.mjs +0 -24
  62. package/dist/js/remote-react-renderer/src/hooks/useMergedComponents.mjs.map +0 -1
  63. package/dist/js/remote-react-renderer/src/hooks/useUpdateHostPathnameOnRemote.mjs +0 -17
  64. package/dist/js/remote-react-renderer/src/hooks/useUpdateHostPathnameOnRemote.mjs.map +0 -1
  65. package/dist/js/remote-react-renderer/src/integrations/react-hook-form/Form.mjs +0 -16
  66. package/dist/js/remote-react-renderer/src/integrations/react-hook-form/Form.mjs.map +0 -1
  67. package/dist/js/remote-react-renderer/src/lib/createFlowRemoteComponentRenderer.mjs +0 -47
  68. package/dist/js/remote-react-renderer/src/lib/createFlowRemoteComponentRenderer.mjs.map +0 -1
  69. package/dist/js/remote-react-renderer/src/lib/elementFactory.mjs +0 -23
  70. package/dist/js/remote-react-renderer/src/lib/elementFactory.mjs.map +0 -1
  71. package/dist/js/remote-react-renderer/src/lib/mapAttributeToReactProperty.mjs +0 -14
  72. package/dist/js/remote-react-renderer/src/lib/mapAttributeToReactProperty.mjs.map +0 -1
  73. package/dist/js/remote-react-renderer/src/lib/propClassifiers.mjs +0 -7
  74. package/dist/js/remote-react-renderer/src/lib/propClassifiers.mjs.map +0 -1
@@ -0,0 +1,21 @@
1
+ "use client"
2
+ /* */
3
+ import { addAwaitedArrayBuffer } from "../../../../core/src/file.mjs";
4
+ import "../../../../core/src/index.mjs";
5
+ //#region src/components/lib/prepareFormData.ts
6
+ var prepareFormData = async (formData) => {
7
+ const fieldNames = [...new Set(Array.from(formData.keys()))];
8
+ for (const fieldName of fieldNames) {
9
+ const values = formData.getAll(fieldName);
10
+ formData.delete(fieldName);
11
+ for (const value of values) {
12
+ if (value instanceof File) await addAwaitedArrayBuffer(value);
13
+ formData.append(fieldName, value);
14
+ }
15
+ }
16
+ return formData;
17
+ };
18
+ //#endregion
19
+ export { prepareFormData };
20
+
21
+ //# sourceMappingURL=prepareFormData.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prepareFormData.mjs","names":[],"sources":["../../../../../../../src/components/lib/prepareFormData.ts"],"sourcesContent":["import { addAwaitedArrayBuffer } from \"@mittwald/flow-core\";\n\nexport const prepareFormData = async (\n formData: FormData,\n): Promise<FormData> => {\n const fieldNames = [...new Set(Array.from(formData.keys()))];\n\n for (const fieldName of fieldNames) {\n const values = formData.getAll(fieldName);\n formData.delete(fieldName);\n\n for (const value of values) {\n if (value instanceof File) {\n await addAwaitedArrayBuffer(value);\n }\n formData.append(fieldName, value);\n }\n }\n\n return formData;\n};\n"],"mappings":";;;AAEA,IAAa,kBAAkB,OAC7B,aACsB;CACtB,MAAM,aAAa,CAAC,GAAG,IAAI,IAAI,MAAM,KAAK,SAAS,KAAK,CAAC,CAAC,CAAC;CAE3D,KAAK,MAAM,aAAa,YAAY;EAClC,MAAM,SAAS,SAAS,OAAO,SAAS;EACxC,SAAS,OAAO,SAAS;EAEzB,KAAK,MAAM,SAAS,QAAQ;GAC1B,IAAI,iBAAiB,MACnB,MAAM,sBAAsB,KAAK;GAEnC,SAAS,OAAO,WAAW,KAAK;EAClC;CACF;CAEA,OAAO;AACT"}
@@ -0,0 +1,48 @@
1
+ "use client"
2
+ /* */
3
+ import { createFlowRemoteComponentRenderer } from "./lib/createFlowRemoteComponentRenderer.mjs";
4
+ import { elementFactory } from "./lib/elementFactory.mjs";
5
+ import flowComponents from "./auto-generated/index.mjs";
6
+ import { Form } from "./components/Form.mjs";
7
+ import SlotRootWrapper from "./components/SlotRootWrapper.mjs";
8
+ import "./components/index.mjs";
9
+ import { Form as Form$1 } from "./integrations/react-hook-form/Form.mjs";
10
+ import { NotificationRenderController } from "./components/NotificationRenderController.mjs";
11
+ import { createRemoteComponentRenderer } from "@mittwald/remote-dom-react/host";
12
+ //#region src/components.ts
13
+ var htmlComponentsMap = {
14
+ svg: createRemoteComponentRenderer(elementFactory("svg")),
15
+ circle: createRemoteComponentRenderer(elementFactory("circle")),
16
+ g: createRemoteComponentRenderer(elementFactory("g")),
17
+ path: createRemoteComponentRenderer(elementFactory("path")),
18
+ strong: createRemoteComponentRenderer(elementFactory("strong")),
19
+ s: createRemoteComponentRenderer(elementFactory("s")),
20
+ ul: createRemoteComponentRenderer(elementFactory("ul")),
21
+ ol: createRemoteComponentRenderer(elementFactory("ol")),
22
+ li: createRemoteComponentRenderer(elementFactory("li")),
23
+ small: createRemoteComponentRenderer(elementFactory("small")),
24
+ i: createRemoteComponentRenderer(elementFactory("i")),
25
+ br: createRemoteComponentRenderer(elementFactory("br", { isVoidElement: true }))
26
+ };
27
+ /**
28
+ * Components that are allowed to be used remotely but should not be rendered on
29
+ * the host.
30
+ */
31
+ var skippedComponentsMap = { script: () => null };
32
+ var flowComponentsMap = {
33
+ "flr-form": createFlowRemoteComponentRenderer("Form", Form),
34
+ "flr-rhf-form": createFlowRemoteComponentRenderer("RhfForm", Form$1),
35
+ "flr-slot-root-wrapper": createFlowRemoteComponentRenderer("SlotRootWrapper", SlotRootWrapper),
36
+ "flr-notification": createFlowRemoteComponentRenderer("Notification", NotificationRenderController),
37
+ "flr-clear-props-context-content": createFlowRemoteComponentRenderer("ClearPropsContextContent", SlotRootWrapper)
38
+ };
39
+ var components = {
40
+ ...htmlComponentsMap,
41
+ ...skippedComponentsMap,
42
+ ...flowComponents,
43
+ ...flowComponentsMap
44
+ };
45
+ //#endregion
46
+ export { components };
47
+
48
+ //# sourceMappingURL=components.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"components.mjs","names":[],"sources":["../../../../../src/components.ts"],"sourcesContent":["import { createFlowRemoteComponentRenderer } from \"@/lib/createFlowRemoteComponentRenderer\";\nimport { elementFactory } from \"@/lib/elementFactory\";\nimport { createRemoteComponentRenderer } from \"@mittwald/remote-dom-react/host\";\nimport autoGenerated from \"./auto-generated\";\nimport { Form, SlotRootWrapper } from \"@/components/\";\nimport { Form as RhfForm } from \"@/integrations/react-hook-form/Form\";\nimport { NotificationRenderController } from \"@/components/NotificationRenderController\";\n\nconst htmlComponentsMap = {\n svg: createRemoteComponentRenderer(elementFactory(\"svg\")),\n circle: createRemoteComponentRenderer(elementFactory(\"circle\")),\n g: createRemoteComponentRenderer(elementFactory(\"g\")),\n path: createRemoteComponentRenderer(elementFactory(\"path\")),\n strong: createRemoteComponentRenderer(elementFactory(\"strong\")),\n s: createRemoteComponentRenderer(elementFactory(\"s\")),\n ul: createRemoteComponentRenderer(elementFactory(\"ul\")),\n ol: createRemoteComponentRenderer(elementFactory(\"ol\")),\n li: createRemoteComponentRenderer(elementFactory(\"li\")),\n small: createRemoteComponentRenderer(elementFactory(\"small\")),\n i: createRemoteComponentRenderer(elementFactory(\"i\")),\n br: createRemoteComponentRenderer(\n elementFactory(\"br\", { isVoidElement: true }),\n ),\n} as const;\n\n/**\n * Components that are allowed to be used remotely but should not be rendered on\n * the host.\n */\nconst skippedComponentsMap = {\n script: () => null,\n} as const;\n\nconst flowComponentsMap = {\n \"flr-form\": createFlowRemoteComponentRenderer(\"Form\", Form),\n \"flr-rhf-form\": createFlowRemoteComponentRenderer(\"RhfForm\", RhfForm),\n \"flr-slot-root-wrapper\": createFlowRemoteComponentRenderer(\n \"SlotRootWrapper\",\n SlotRootWrapper,\n ),\n \"flr-notification\": createFlowRemoteComponentRenderer(\n \"Notification\",\n NotificationRenderController,\n ),\n \"flr-clear-props-context-content\": createFlowRemoteComponentRenderer(\n \"ClearPropsContextContent\",\n SlotRootWrapper,\n ),\n};\n\nexport const components = {\n ...htmlComponentsMap,\n ...skippedComponentsMap,\n ...autoGenerated,\n ...flowComponentsMap,\n};\n"],"mappings":";;;;;;;;;;AAQA,IAAM,oBAAoB;CACxB,KAAK,8BAA8B,eAAe,KAAK,CAAC;CACxD,QAAQ,8BAA8B,eAAe,QAAQ,CAAC;CAC9D,GAAG,8BAA8B,eAAe,GAAG,CAAC;CACpD,MAAM,8BAA8B,eAAe,MAAM,CAAC;CAC1D,QAAQ,8BAA8B,eAAe,QAAQ,CAAC;CAC9D,GAAG,8BAA8B,eAAe,GAAG,CAAC;CACpD,IAAI,8BAA8B,eAAe,IAAI,CAAC;CACtD,IAAI,8BAA8B,eAAe,IAAI,CAAC;CACtD,IAAI,8BAA8B,eAAe,IAAI,CAAC;CACtD,OAAO,8BAA8B,eAAe,OAAO,CAAC;CAC5D,GAAG,8BAA8B,eAAe,GAAG,CAAC;CACpD,IAAI,8BACF,eAAe,MAAM,EAAE,eAAe,KAAK,CAAC,CAC9C;AACF;;;;;AAMA,IAAM,uBAAuB,EAC3B,cAAc,KAChB;AAEA,IAAM,oBAAoB;CACxB,YAAY,kCAAkC,QAAQ,IAAI;CAC1D,gBAAgB,kCAAkC,WAAW,MAAO;CACpE,yBAAyB,kCACvB,mBACA,eACF;CACA,oBAAoB,kCAClB,gBACA,4BACF;CACA,mCAAmC,kCACjC,4BACA,eACF;AACF;AAEA,IAAa,aAAa;CACxB,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;AACL"}
@@ -0,0 +1,27 @@
1
+ "use client"
2
+ /* */
3
+ import { useId, useRef, useState } from "react";
4
+ import { usePromise } from "@mittwald/react-use-promise";
5
+ //#region src/hooks/useControllableSuspenseTrigger.ts
6
+ var useControllableSuspenseTrigger = () => {
7
+ const localId = useId();
8
+ const promise = useRef(null);
9
+ const [startedCount, setStartedCount] = useState(0);
10
+ usePromise((promise) => promise, promise.current ? [promise.current.promise] : null, {
11
+ keepValueWhileLoading: false,
12
+ loaderId: localId + startedCount
13
+ });
14
+ return {
15
+ start: () => {
16
+ promise.current = Promise.withResolvers();
17
+ setStartedCount((c) => c + 1);
18
+ },
19
+ stop: () => {
20
+ promise.current?.resolve();
21
+ }
22
+ };
23
+ };
24
+ //#endregion
25
+ export { useControllableSuspenseTrigger };
26
+
27
+ //# sourceMappingURL=useControllableSuspenseTrigger.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useControllableSuspenseTrigger.mjs","names":[],"sources":["../../../../../../src/hooks/useControllableSuspenseTrigger.ts"],"sourcesContent":["import { usePromise } from \"@mittwald/react-use-promise\";\nimport { useId, useRef, useState } from \"react\";\n\nexport const useControllableSuspenseTrigger = () => {\n const localId = useId();\n const promise = useRef<PromiseWithResolvers<void>>(null);\n const [startedCount, setStartedCount] = useState(0);\n\n usePromise(\n (promise: Promise<void>) => promise,\n promise.current ? [promise.current.promise] : null,\n {\n keepValueWhileLoading: false,\n loaderId: localId + startedCount,\n },\n );\n\n return {\n start: () => {\n promise.current = Promise.withResolvers<void>();\n setStartedCount((c) => c + 1);\n },\n stop: () => {\n promise.current?.resolve();\n },\n };\n};\n"],"mappings":";;;AAGA,IAAa,uCAAuC;CAClD,MAAM,UAAU,MAAM;CACtB,MAAM,UAAU,OAAmC,IAAI;CACvD,MAAM,CAAC,cAAc,mBAAmB,SAAS,CAAC;CAElD,YACG,YAA2B,SAC5B,QAAQ,UAAU,CAAC,QAAQ,QAAQ,OAAO,IAAI,MAC9C;EACE,uBAAuB;EACvB,UAAU,UAAU;CACtB,CACF;CAEA,OAAO;EACL,aAAa;GACX,QAAQ,UAAU,QAAQ,cAAoB;GAC9C,iBAAiB,MAAM,IAAI,CAAC;EAC9B;EACA,YAAY;GACV,QAAQ,SAAS,QAAQ;EAC3B;CACF;AACF"}
@@ -0,0 +1,14 @@
1
+ "use client"
2
+ /* */
3
+ import { components } from "../components.mjs";
4
+ import { useMemo } from "react";
5
+ import { reduce } from "remeda";
6
+ //#region src/hooks/useMergedComponents.ts
7
+ var useMergedComponents = (integrations) => useMemo(() => new Map(Object.entries(reduce([...integrations, components], (merged, current) => ({
8
+ ...merged,
9
+ ...current
10
+ }), {}))), [...integrations]);
11
+ //#endregion
12
+ export { useMergedComponents };
13
+
14
+ //# sourceMappingURL=useMergedComponents.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useMergedComponents.mjs","names":[],"sources":["../../../../../../src/hooks/useMergedComponents.ts"],"sourcesContent":["import { components } from \"@/components\";\nimport type { RemoteComponentsMap } from \"@/lib/types\";\nimport type { RemoteComponentRendererProps } from \"@mittwald/remote-dom-react/host\";\nimport { type ComponentType, useMemo } from \"react\";\nimport { reduce } from \"remeda\";\n\nexport const useMergedComponents = (\n integrations: RemoteComponentsMap<never>[],\n) =>\n useMemo(\n () =>\n new Map<string, ComponentType<RemoteComponentRendererProps>>(\n Object.entries(\n reduce(\n [...integrations, components],\n (merged, current) => ({\n ...merged,\n ...current,\n }),\n {},\n ),\n ),\n ),\n [...integrations],\n );\n"],"mappings":";;;;AAMA,IAAa,uBACX,iBAEA,cAEI,IAAI,IACF,OAAO,QACL,OACE,CAAC,GAAG,cAAc,UAAU,IAC3B,QAAQ,aAAa;CACpB,GAAG;CACH,GAAG;AACL,IACA,CAAC,CACH,CACF,CACF,GACF,CAAC,GAAG,YAAY,CAClB"}
@@ -0,0 +1,17 @@
1
+ "use client"
2
+ /* */
3
+ import { useLayoutEffect } from "react";
4
+ import "@mittwald/flow-remote-core";
5
+ //#region src/hooks/useUpdateHostPathnameOnRemote.ts
6
+ /** Updates the host pathname in the remote connection. */
7
+ var useUpdateHostPathnameOnRemote = (hostPathname, connection) => {
8
+ useLayoutEffect(() => {
9
+ if (hostPathname === void 0 || !connection) return;
10
+ const { updateHostPathname } = connection;
11
+ updateHostPathname(hostPathname);
12
+ }, [hostPathname, connection]);
13
+ };
14
+ //#endregion
15
+ export { useUpdateHostPathnameOnRemote };
16
+
17
+ //# sourceMappingURL=useUpdateHostPathnameOnRemote.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useUpdateHostPathnameOnRemote.mjs","names":[],"sources":["../../../../../../src/hooks/useUpdateHostPathnameOnRemote.ts"],"sourcesContent":["import { type HostToRemoteConnection } from \"@mittwald/flow-remote-core\";\nimport { useLayoutEffect } from \"react\";\n\n/** Updates the host pathname in the remote connection. */\nexport const useUpdateHostPathnameOnRemote = (\n hostPathname?: string,\n connection?: HostToRemoteConnection,\n) => {\n useLayoutEffect(() => {\n if (hostPathname === undefined || !connection) {\n return;\n }\n\n const { updateHostPathname } = connection;\n updateHostPathname(hostPathname);\n }, [hostPathname, connection]);\n};\n"],"mappings":";;;;AAIA,IAAa,iCACX,cACA,eACG;CACH,sBAAsB;EACpB,IAAI,iBAAiB,KAAA,KAAa,CAAC,YACjC;EAGF,MAAM,EAAE,uBAAuB;EAC/B,mBAAmB,YAAY;CACjC,GAAG,CAAC,cAAc,UAAU,CAAC;AAC/B"}
@@ -0,0 +1,26 @@
1
+ "use client"
2
+ /* */
3
+ import "react";
4
+ import { jsx } from "react/jsx-runtime";
5
+ //#region src/integrations/react-hook-form/Form.tsx
6
+ /**
7
+ * ReactHookForm won't send the data over onSubmit, the form state is
8
+ * transferred over onChange. To avoid sending unnecessary data, this RemoteForm
9
+ * sends only the onSubmit without any formData.
10
+ */
11
+ var Form = (props) => {
12
+ const { onSubmit: onSubmitFromProps, ref, ...rest } = props;
13
+ const onSubmit = async (event) => {
14
+ event.preventDefault();
15
+ await onSubmitFromProps?.();
16
+ };
17
+ return /* @__PURE__ */ jsx("form", {
18
+ ...rest,
19
+ ref,
20
+ onSubmit
21
+ });
22
+ };
23
+ //#endregion
24
+ export { Form };
25
+
26
+ //# sourceMappingURL=Form.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Form.mjs","names":[],"sources":["../../../../../../../src/integrations/react-hook-form/Form.tsx"],"sourcesContent":["import {\n type FC,\n type FormEvent,\n type PropsWithChildren,\n type Ref,\n} from \"react\";\n\ntype FormProps = {\n onSubmit?: () => void | Promise<void>;\n ref?: Ref<HTMLFormElement>;\n} & PropsWithChildren;\n\n/**\n * ReactHookForm won't send the data over onSubmit, the form state is\n * transferred over onChange. To avoid sending unnecessary data, this RemoteForm\n * sends only the onSubmit without any formData.\n */\nexport const Form: FC<FormProps> = (props) => {\n const { onSubmit: onSubmitFromProps, ref, ...rest } = props;\n\n const onSubmit = async (event: FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n await onSubmitFromProps?.();\n };\n\n return <form {...rest} ref={ref} onSubmit={onSubmit} />;\n};\n"],"mappings":";;;;;;;;AAiBA,IAAa,QAAuB,UAAU;CAC5C,MAAM,EAAE,UAAU,mBAAmB,KAAK,GAAG,SAAS;CAEtD,MAAM,WAAW,OAAO,UAAsC;EAC5D,MAAM,eAAe;EACrB,MAAM,oBAAoB;CAC5B;CAEA,OAAO,oBAAC,QAAD;EAAM,GAAI;EAAW;EAAe;CAAW,CAAA;AACxD"}
@@ -0,0 +1,32 @@
1
+ "use client"
2
+ /* */
3
+ import { isReactSuspendedStyle, isStyleProp } from "./propClassifiers.mjs";
4
+ import "react";
5
+ import { jsx } from "react/jsx-runtime";
6
+ import { Version } from "@mittwald/flow-remote-core";
7
+ import { createRemoteComponentRenderer } from "@mittwald/remote-dom-react/host";
8
+ import { FlowRemoteElement } from "@mittwald/flow-remote-elements";
9
+ import { mapValues } from "remeda";
10
+ //#region src/lib/createFlowRemoteComponentRenderer.tsx
11
+ var mapProperty = (val, key) => {
12
+ if (isStyleProp(key)) {
13
+ if (isReactSuspendedStyle(val)) return { display: "none" };
14
+ return {};
15
+ }
16
+ return val;
17
+ };
18
+ var createFlowRemoteComponentRenderer = (name, Component) => {
19
+ function HostComponent(props) {
20
+ const { [FlowRemoteElement.versionPropertyName]: version = Version.v1, [FlowRemoteElement.initializationPropertyName]: initialized = false, ...restProps } = mapValues(props, (v, k) => mapProperty(v, k));
21
+ if (version >= Version.v3) {
22
+ if (!initialized) return null;
23
+ }
24
+ return /* @__PURE__ */ jsx(Component, { ...restProps });
25
+ }
26
+ HostComponent.displayName = `FlowRemoteRenderer(${name})`;
27
+ return createRemoteComponentRenderer(HostComponent, { name: `RemoteRenderer(${name})` });
28
+ };
29
+ //#endregion
30
+ export { createFlowRemoteComponentRenderer };
31
+
32
+ //# sourceMappingURL=createFlowRemoteComponentRenderer.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createFlowRemoteComponentRenderer.mjs","names":[],"sources":["../../../../../../src/lib/createFlowRemoteComponentRenderer.tsx"],"sourcesContent":["import { isReactSuspendedStyle, isStyleProp } from \"@/lib/propClassifiers\";\nimport type { RemoteComponentRendererProps } from \"@mittwald/remote-dom-react/host\";\nimport { createRemoteComponentRenderer } from \"@mittwald/remote-dom-react/host\";\nimport { FlowRemoteElement } from \"@mittwald/flow-remote-elements\";\nimport type { FlowRemoteElementMetaData } from \"@mittwald/flow-remote-elements\";\nimport { Version } from \"@mittwald/flow-remote-core\";\nimport { type ComponentType } from \"react\";\nimport { mapValues } from \"remeda\";\n\nconst mapProperty = (val: unknown, key: string) => {\n if (isStyleProp(key)) {\n if (isReactSuspendedStyle(val)) {\n return {\n display: \"none\",\n };\n }\n return {};\n }\n return val;\n};\n\nexport const createFlowRemoteComponentRenderer = <P extends object>(\n name: string,\n Component: ComponentType<P>,\n): ComponentType<RemoteComponentRendererProps> => {\n function HostComponent(props: P & FlowRemoteElementMetaData) {\n const hostComponentProps = mapValues(props, (v, k) =>\n mapProperty(v, k),\n ) as P & FlowRemoteElementMetaData;\n\n const {\n [FlowRemoteElement.versionPropertyName]: version = Version.v1,\n [FlowRemoteElement.initializationPropertyName]: initialized = false,\n ...restProps\n } = hostComponentProps;\n\n if (version >= Version.v3) {\n // \"initialized\" handling introduced in version 3\n if (!initialized) {\n return null;\n }\n }\n\n return <Component {...(restProps as P)} />;\n }\n HostComponent.displayName = `FlowRemoteRenderer(${name})`;\n return createRemoteComponentRenderer(HostComponent, {\n name: `RemoteRenderer(${name})`,\n });\n};\n"],"mappings":";;;;;;;;AASA,IAAM,eAAe,KAAc,QAAgB;CACjD,IAAI,YAAY,GAAG,GAAG;EACpB,IAAI,sBAAsB,GAAG,GAC3B,OAAO,EACL,SAAS,OACX;EAEF,OAAO,CAAC;CACV;CACA,OAAO;AACT;AAEA,IAAa,qCACX,MACA,cACgD;CAChD,SAAS,cAAc,OAAsC;EAK3D,MAAM,GACH,kBAAkB,sBAAsB,UAAU,QAAQ,KAC1D,kBAAkB,6BAA6B,cAAc,OAC9D,GAAG,cAPsB,UAAU,QAAQ,GAAG,MAC9C,YAAY,GAAG,CAAC,CAOd;EAEJ,IAAI,WAAW,QAAQ;OAEjB,CAAC,aACH,OAAO;EAAA;EAIX,OAAO,oBAAC,WAAD,EAAW,GAAK,UAAkB,CAAA;CAC3C;CACA,cAAc,cAAc,sBAAsB,KAAK;CACvD,OAAO,8BAA8B,eAAe,EAClD,MAAM,kBAAkB,KAAK,GAC/B,CAAC;AACH"}
@@ -0,0 +1,19 @@
1
+ "use client"
2
+ /* */
3
+ import { mapAttributeToReactProperty } from "./mapAttributeToReactProperty.mjs";
4
+ import { createElement } from "react";
5
+ import { mapKeys } from "remeda";
6
+ import clsx from "clsx";
7
+ //#region src/lib/elementFactory.ts
8
+ var elementFactory = (element, options = {}) => (props) => {
9
+ const result = { ...props };
10
+ const { isVoidElement = false } = options;
11
+ if (isVoidElement) delete result["children"];
12
+ result["className"] = clsx("className" in result && String(result["className"]), "class" in result && String(result["class"]));
13
+ delete result["class"];
14
+ return createElement(element, mapKeys(result, mapAttributeToReactProperty));
15
+ };
16
+ //#endregion
17
+ export { elementFactory };
18
+
19
+ //# sourceMappingURL=elementFactory.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"elementFactory.mjs","names":[],"sources":["../../../../../../src/lib/elementFactory.ts"],"sourcesContent":["import { mapAttributeToReactProperty } from \"@/lib/mapAttributeToReactProperty\";\nimport clsx from \"clsx\";\nimport { createElement } from \"react\";\nimport { mapKeys } from \"remeda\";\n\ntype ElementTagNameMap = HTMLElementTagNameMap &\n Pick<\n SVGElementTagNameMap,\n Exclude<keyof SVGElementTagNameMap, keyof HTMLElementTagNameMap>\n >;\n\ninterface Options {\n isVoidElement?: boolean;\n}\n\nexport const elementFactory =\n <E extends keyof ElementTagNameMap>(element: E, options: Options = {}) =>\n (props: Record<string, unknown>) => {\n const result = { ...props };\n const { isVoidElement = false } = options;\n\n if (isVoidElement) {\n delete result[\"children\"];\n }\n\n // merge className and class\n result[\"className\"] = clsx(\n \"className\" in result && String(result[\"className\"]),\n \"class\" in result && String(result[\"class\"]),\n );\n\n delete result[\"class\"];\n\n return createElement(element, mapKeys(result, mapAttributeToReactProperty));\n };\n"],"mappings":";;;;;AAeA,IAAa,kBACyB,SAAY,UAAmB,CAAC,OACnE,UAAmC;CAClC,MAAM,SAAS,EAAE,GAAG,MAAM;CAC1B,MAAM,EAAE,gBAAgB,UAAU;CAElC,IAAI,eACF,OAAO,OAAO;CAIhB,OAAO,eAAe,KACpB,eAAe,UAAU,OAAO,OAAO,YAAY,GACnD,WAAW,UAAU,OAAO,OAAO,QAAQ,CAC7C;CAEA,OAAO,OAAO;CAEd,OAAO,cAAc,SAAS,QAAQ,QAAQ,2BAA2B,CAAC;AAC5E"}
@@ -0,0 +1,13 @@
1
+ "use client"
2
+ /* */
3
+ import { toCamelCase } from "remeda";
4
+ //#region src/lib/mapAttributeToReactProperty.ts
5
+ var keepWhenStartsWith = ["aria-", "data-"];
6
+ var mapAttributeToReactProperty = (key) => {
7
+ if (keepWhenStartsWith.some((prefix) => key.startsWith(prefix))) return key;
8
+ return toCamelCase(key);
9
+ };
10
+ //#endregion
11
+ export { mapAttributeToReactProperty };
12
+
13
+ //# sourceMappingURL=mapAttributeToReactProperty.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mapAttributeToReactProperty.mjs","names":[],"sources":["../../../../../../src/lib/mapAttributeToReactProperty.ts"],"sourcesContent":["import { toCamelCase } from \"remeda\";\n\nconst keepWhenStartsWith = [\"aria-\", \"data-\"];\n\nexport const mapAttributeToReactProperty = (key: string) => {\n if (keepWhenStartsWith.some((prefix) => key.startsWith(prefix))) {\n return key;\n }\n\n return toCamelCase(key);\n};\n"],"mappings":";;AAEA,IAAM,qBAAqB,CAAC,SAAS,OAAO;AAE5C,IAAa,+BAA+B,QAAgB;CAC1D,IAAI,mBAAmB,MAAM,WAAW,IAAI,WAAW,MAAM,CAAC,GAC5D,OAAO;CAGT,OAAO,YAAY,GAAG;AACxB"}
@@ -0,0 +1,9 @@
1
+ "use client"
2
+ /* */
3
+ //#region src/lib/propClassifiers.ts
4
+ var isStyleProp = (name) => name === "style";
5
+ var isReactSuspendedStyle = (value) => value === "display: none !important;";
6
+ //#endregion
7
+ export { isReactSuspendedStyle, isStyleProp };
8
+
9
+ //# sourceMappingURL=propClassifiers.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"propClassifiers.mjs","names":[],"sources":["../../../../../../src/lib/propClassifiers.ts"],"sourcesContent":["export const isStyleProp = (name: string): boolean => name === \"style\";\n\nexport const isReactSuspendedStyle = (value: unknown): boolean =>\n value === \"display: none !important;\";\n"],"mappings":";AAAA,IAAa,eAAe,SAA0B,SAAS;AAE/D,IAAa,yBAAyB,UACpC,UAAU"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mittwald/flow-remote-react-renderer",
3
- "version": "0.2.0-alpha.864",
3
+ "version": "0.2.0-alpha.866",
4
4
  "type": "module",
5
5
  "description": "React rendering for Flow Remote Elements",
6
6
  "homepage": "https://mittwald.github.io/flow",
@@ -28,38 +28,38 @@
28
28
  "test:unit": "vitest run"
29
29
  },
30
30
  "dependencies": {
31
- "@mittwald/ext-bridge": "0.2.0-alpha.864",
32
- "@mittwald/flow-remote-core": "0.2.0-alpha.864",
33
- "@mittwald/flow-remote-elements": "0.2.0-alpha.864",
31
+ "@mittwald/ext-bridge": "0.2.0-alpha.866",
32
+ "@mittwald/flow-remote-core": "0.2.0-alpha.866",
33
+ "@mittwald/flow-remote-elements": "0.2.0-alpha.866",
34
34
  "@mittwald/react-use-promise": "^4.2.2",
35
35
  "@mittwald/remote-dom-react": "1.2.2-mittwald.10",
36
- "@types/react": "^19.2.14",
36
+ "@types/react": "^19.2",
37
37
  "clsx": "^2.1.1",
38
38
  "react-children-utilities": "^2.10.0",
39
- "remeda": "^2.33.6"
39
+ "remeda": "^2.39.0"
40
40
  },
41
41
  "devDependencies": {
42
42
  "@mittwald/flow-core": "",
43
- "@mittwald/flow-react-components": "0.2.0-alpha.864",
43
+ "@mittwald/flow-react-components": "0.2.0-alpha.866",
44
44
  "@mittwald/typescript-config": "",
45
- "@types/node": "^24.12.0",
46
- "nx": "^22.5.4",
47
- "prettier": "^3.8.1",
48
- "react": "^19.2.4",
49
- "react-dom": "^19.2.4",
50
- "react-hook-form": "^7.71.2",
45
+ "@types/node": "^25.9.3",
46
+ "nx": "^22.7.5",
47
+ "prettier": "^3.8.4",
48
+ "react": "^19.2.0",
49
+ "react-dom": "^19.2.0",
50
+ "react-hook-form": "^7.79.0",
51
51
  "rimraf": "^6.1.3",
52
52
  "rollup-preserve-directives": "^1.1.3",
53
- "typescript": "^5.9.3",
54
- "vite": "^7.3.2",
53
+ "typescript": "^6.0.3",
54
+ "vite": "^8.0.16",
55
55
  "vite-plugin-banner": "^0.8.1",
56
- "vite-plugin-checker": "^0.12.0",
57
- "vite-plugin-dts": "^4.5.4",
56
+ "vite-plugin-checker": "^0.14.1",
57
+ "vite-plugin-dts": "^5.0.2",
58
58
  "vite-plugin-externalize-deps": "^0.10.0",
59
- "vitest": "^4.0.18"
59
+ "vitest": "^4.1.9"
60
60
  },
61
61
  "peerDependencies": {
62
- "@mittwald/flow-react-components": "0.2.0-alpha.863",
62
+ "@mittwald/flow-react-components": "0.2.0-alpha.865",
63
63
  "react": "^19.2.0",
64
64
  "react-dom": "^19.2.0",
65
65
  "react-hook-form": "*"
@@ -69,5 +69,5 @@
69
69
  "optional": true
70
70
  }
71
71
  },
72
- "gitHead": "6d2962059dc1a17ea8210d5a5d3450084691623e"
72
+ "gitHead": "a1e96368a69cc83562cd77102f537cbbfc1b7e76"
73
73
  }
@@ -1,17 +0,0 @@
1
- "use client"
2
- /* */
3
- const Key = "mittwald.flow-core.file.awaitedArrayBuffer";
4
- function isFileWithAwaitedArrayBuffer(file) {
5
- return Key in file && file[Key] instanceof ArrayBuffer && !file[Key].detached;
6
- }
7
- const addAwaitedArrayBuffer = async (file) => {
8
- if (isFileWithAwaitedArrayBuffer(file)) {
9
- return file;
10
- }
11
- const arrayBuffer = await file.arrayBuffer();
12
- Object.assign(file, { [Key]: arrayBuffer });
13
- return file;
14
- };
15
-
16
- export { addAwaitedArrayBuffer, isFileWithAwaitedArrayBuffer };
17
- //# sourceMappingURL=file.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"file.mjs","sources":["../../../../../core/src/file.ts"],"sourcesContent":["import invariant from \"invariant\";\n\nconst Key = \"mittwald.flow-core.file.awaitedArrayBuffer\";\n\nexport type FileWithAwaitedArrayBuffer = File & {\n [Key]: ArrayBuffer;\n};\n\nexport function isFileWithAwaitedArrayBuffer(\n file: File | FileWithAwaitedArrayBuffer,\n): file is FileWithAwaitedArrayBuffer {\n return Key in file && file[Key] instanceof ArrayBuffer && !file[Key].detached;\n}\n\nexport const addAwaitedArrayBuffer = async (file: File) => {\n if (isFileWithAwaitedArrayBuffer(file)) {\n return file;\n }\n\n const arrayBuffer = await file.arrayBuffer();\n Object.assign(file, { [Key]: arrayBuffer });\n\n return file;\n};\n\nexport const getAwaitArrayBuffer = (\n file: File | FileWithAwaitedArrayBuffer,\n) => {\n invariant(\n isFileWithAwaitedArrayBuffer(file),\n `File buffer unavailable (objectType=${Object.prototype.toString.call(\n file,\n )}, hasArrayBuffer=${\n Key in file && file[Key] instanceof ArrayBuffer\n }, isDetached=${\n Key in file && file[Key] instanceof ArrayBuffer\n ? file[Key].detached\n : \"n/a\"\n })`,\n );\n return file[Key];\n};\n"],"names":[],"mappings":"AAEA,MAAM,GAAA,GAAM,4CAAA;AAML,SAAS,6BACd,IAAA,EACoC;AACpC,EAAA,OAAO,GAAA,IAAO,QAAQ,IAAA,CAAK,GAAG,aAAa,WAAA,IAAe,CAAC,IAAA,CAAK,GAAG,CAAA,CAAE,QAAA;AACvE;AAEO,MAAM,qBAAA,GAAwB,OAAO,IAAA,KAAe;AACzD,EAAA,IAAI,4BAAA,CAA6B,IAAI,CAAA,EAAG;AACtC,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,WAAA,EAAY;AAC3C,EAAA,MAAA,CAAO,OAAO,IAAA,EAAM,EAAE,CAAC,GAAG,GAAG,aAAa,CAAA;AAE1C,EAAA,OAAO,IAAA;AACT;;;;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -1,149 +0,0 @@
1
- "use client"
2
- /* */
3
- 'use client';
4
- import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
5
- import { useMergedComponents } from './hooks/useMergedComponents.mjs';
6
- import { useControllableSuspenseTrigger } from './hooks/useControllableSuspenseTrigger.mjs';
7
- import { useUpdateHostPathnameOnRemote } from './hooks/useUpdateHostPathnameOnRemote.mjs';
8
- import { RemoteError, connectRemoteIframeRef } from '@mittwald/flow-remote-core';
9
- import { refresh, usePromise } from '@mittwald/react-use-promise';
10
- import { RemoteRootRenderer, RemoteReceiver } from '@mittwald/remote-dom-react/host';
11
- import { useMemo, useState, useRef, useEffect } from 'react';
12
- import { useLanguage, useTheme } from '@mittwald/flow-react-components';
13
-
14
- const hiddenIframeStyle = {
15
- visibility: "hidden",
16
- height: 0,
17
- width: 0,
18
- border: "none",
19
- position: "absolute",
20
- marginLeft: "-9999px"
21
- };
22
- const RemoteRendererBrowser = (props) => {
23
- const {
24
- integrations = [],
25
- timeoutMs = 1e4,
26
- src,
27
- extBridgeImplementation,
28
- onNavigationStateChanged,
29
- hostPathname,
30
- __remoteReceiver: remoteReceiverFromProps
31
- } = props;
32
- const remoteComponents = useMergedComponents(integrations);
33
- if (remoteReceiverFromProps) {
34
- return /* @__PURE__ */ jsx(
35
- RemoteRootRenderer,
36
- {
37
- components: remoteComponents,
38
- receiver: remoteReceiverFromProps
39
- }
40
- );
41
- }
42
- if (!src) {
43
- throw new RemoteError("'src' prop is required");
44
- }
45
- const language = useLanguage();
46
- const theme = useTheme();
47
- const renderPromise = useMemo(() => Promise.withResolvers(), [src]);
48
- const connectionPromise = useMemo(() => Promise.withResolvers(), [src]);
49
- const loadingPromise = useMemo(() => Promise.withResolvers(), [src]);
50
- const suspenseTrigger = useControllableSuspenseTrigger();
51
- const [connectionSrc, setConnectionSrc] = useState(null);
52
- const connection = useRef(void 0);
53
- const [remoteError, setRemoteError] = useState();
54
- if (remoteError) {
55
- throw new RemoteError(`Remote rendering failed: ${remoteError}`);
56
- }
57
- const [receiver, rendererSubscriber] = useMemo(() => {
58
- const remoteReceiver = new RemoteReceiver();
59
- const controller = new AbortController();
60
- remoteReceiver.subscribe(
61
- { id: remoteReceiver.root.id },
62
- () => renderPromise.resolve(),
63
- { signal: controller.signal }
64
- );
65
- return [remoteReceiver, controller];
66
- }, [src]);
67
- useUpdateHostPathnameOnRemote(hostPathname, connection.current);
68
- const hostConfig = {
69
- language,
70
- theme
71
- };
72
- const connect = connectRemoteIframeRef({
73
- connection: receiver.connection,
74
- extBridgeImplementation,
75
- hostConfig,
76
- onReady: (establishedConnection) => {
77
- establishedConnection.updateHostPathname(hostPathname);
78
- connectionPromise.resolve();
79
- },
80
- onLoadingChanged: (isLoading) => {
81
- if (isLoading) {
82
- suspenseTrigger.start();
83
- } else {
84
- suspenseTrigger.stop();
85
- }
86
- },
87
- onError: setRemoteError,
88
- onNavigationStateChanged
89
- });
90
- const timeoutPromise = (message) => new Promise((_, rej) => {
91
- setTimeout(() => {
92
- rej(new RemoteError(`${message}: Timeout reached`));
93
- }, timeoutMs);
94
- });
95
- const overallLoading = () => Promise.all([
96
- Promise.race([
97
- loadingPromise.promise,
98
- timeoutPromise("Remote URL could not be loaded")
99
- ]),
100
- Promise.race([
101
- connectionPromise.promise,
102
- timeoutPromise("Could not establish remote connection")
103
- ]),
104
- Promise.race([
105
- renderPromise.promise,
106
- timeoutPromise("Remote rendering failed")
107
- ])
108
- ]);
109
- const awaitLoadingPromise = connectionSrc === src;
110
- const loaderResourceTag = `mittwald/remote-react-renderer/connect/${src}`;
111
- useEffect(
112
- () => () => {
113
- refresh({
114
- tag: loaderResourceTag
115
- });
116
- },
117
- [src]
118
- );
119
- usePromise(
120
- async () => {
121
- await overallLoading();
122
- rendererSubscriber.abort();
123
- },
124
- awaitLoadingPromise ? [] : null,
125
- {
126
- loaderId: src,
127
- tags: [loaderResourceTag]
128
- }
129
- );
130
- return /* @__PURE__ */ jsxs(Fragment, { children: [
131
- /* @__PURE__ */ jsx(RemoteRootRenderer, { components: remoteComponents, receiver }),
132
- /* @__PURE__ */ jsx(
133
- "iframe",
134
- {
135
- src,
136
- ref: (ref) => {
137
- connection.current = connect(ref);
138
- setConnectionSrc(src);
139
- },
140
- onLoad: () => loadingPromise.resolve(),
141
- onError: () => loadingPromise.reject(),
142
- style: hiddenIframeStyle
143
- }
144
- )
145
- ] });
146
- };
147
-
148
- export { RemoteRendererBrowser, RemoteRendererBrowser as default };
149
- //# sourceMappingURL=RemoteRendererBrowser.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"RemoteRendererBrowser.mjs","sources":["../../../../src/RemoteRendererBrowser.tsx"],"sourcesContent":["\"use client\";\n\nimport { useMergedComponents } from \"@/hooks/useMergedComponents\";\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} 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/flow-core\";\n\nexport interface RemoteRendererBrowserProps {\n integrations?: RemoteComponentsMap<never>[];\n src?: string;\n timeoutMs?: number;\n onNavigationStateChanged?: (state: NavigationState) => void;\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 timeoutMs = 10_000,\n src,\n extBridgeImplementation,\n onNavigationStateChanged,\n hostPathname,\n __remoteReceiver: remoteReceiverFromProps,\n } = props;\n\n const remoteComponents = useMergedComponents(integrations);\n\n if (remoteReceiverFromProps) {\n return (\n <RemoteRootRenderer\n components={remoteComponents}\n receiver={remoteReceiverFromProps}\n />\n );\n }\n\n if (!src) {\n throw new RemoteError(\"'src' prop is required\");\n }\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 if (remoteError) {\n throw new RemoteError(`Remote rendering failed: ${remoteError}`);\n }\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: (establishedConnection) => {\n establishedConnection.updateHostPathname(hostPathname);\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 });\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 awaitLoadingPromise ? [] : null,\n {\n loaderId: src,\n tags: [loaderResourceTag],\n },\n );\n\n return (\n <>\n <RemoteRootRenderer components={remoteComponents} receiver={receiver} />\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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"}