@fluid-app/widget-runtime 0.1.0

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 (46) hide show
  1. package/README.md +77 -0
  2. package/dist/Thread-0eUyc0Hw.cjs +591 -0
  3. package/dist/Thread-0eUyc0Hw.cjs.map +1 -0
  4. package/dist/Thread-BiW7rXts.mjs +574 -0
  5. package/dist/Thread-BiW7rXts.mjs.map +1 -0
  6. package/dist/index.cjs +6 -0
  7. package/dist/index.d.cts +3 -0
  8. package/dist/index.d.mts +3 -0
  9. package/dist/index.mjs +3 -0
  10. package/dist/remote-dom-renderer-BU-73KvK.d.mts +90 -0
  11. package/dist/remote-dom-renderer-BU-73KvK.d.mts.map +1 -0
  12. package/dist/remote-dom-renderer-DSHFetvm.d.cts +90 -0
  13. package/dist/remote-dom-renderer-DSHFetvm.d.cts.map +1 -0
  14. package/dist/remote-dom-renderer-DUQf80Nu.cjs +2116 -0
  15. package/dist/remote-dom-renderer-DUQf80Nu.cjs.map +1 -0
  16. package/dist/remote-dom-renderer-DcwcNPsu.mjs +2081 -0
  17. package/dist/remote-dom-renderer-DcwcNPsu.mjs.map +1 -0
  18. package/dist/remote-dom-values-BSAxrOE7.mjs +238 -0
  19. package/dist/remote-dom-values-BSAxrOE7.mjs.map +1 -0
  20. package/dist/remote-dom-values-D4AgBNWr.d.cts +32 -0
  21. package/dist/remote-dom-values-D4AgBNWr.d.cts.map +1 -0
  22. package/dist/remote-dom-values-DbgIedSg.cjs +297 -0
  23. package/dist/remote-dom-values-DbgIedSg.cjs.map +1 -0
  24. package/dist/remote-dom-values-EwoLXnSn.d.mts +32 -0
  25. package/dist/remote-dom-values-EwoLXnSn.d.mts.map +1 -0
  26. package/dist/remote-dom.cjs +6 -0
  27. package/dist/remote-dom.d.cts +3 -0
  28. package/dist/remote-dom.d.mts +3 -0
  29. package/dist/remote-dom.mjs +3 -0
  30. package/dist/worker-react-bootstrap-C7tCMYGA.mjs +13 -0
  31. package/dist/worker-react-bootstrap-C7tCMYGA.mjs.map +1 -0
  32. package/dist/worker-react-bootstrap-N8jcWZ3L.cjs +13 -0
  33. package/dist/worker-react-bootstrap-N8jcWZ3L.cjs.map +1 -0
  34. package/dist/worker-react-renderer-BKzig_Vy.mjs +185 -0
  35. package/dist/worker-react-renderer-BKzig_Vy.mjs.map +1 -0
  36. package/dist/worker-react-renderer-BSFxMMf7.cjs +186 -0
  37. package/dist/worker-react-renderer-BSFxMMf7.cjs.map +1 -0
  38. package/dist/worker.cjs +325 -0
  39. package/dist/worker.cjs.map +1 -0
  40. package/dist/worker.d.cts +46 -0
  41. package/dist/worker.d.cts.map +1 -0
  42. package/dist/worker.d.mts +46 -0
  43. package/dist/worker.d.mts.map +1 -0
  44. package/dist/worker.mjs +319 -0
  45. package/dist/worker.mjs.map +1 -0
  46. package/package.json +68 -0
@@ -0,0 +1,185 @@
1
+ import { a as REMOTE_DOM_SEARCH_SORT_EVENTS, c as isRemoteDomSerializableValue, n as FLUID_SPACER_WIDGET_TAG_NAME, o as SUPPORTED_REMOTE_DOM_EVENTS, r as REMOTE_DOM_ALLOWED_TAG_NAMES, t as FLUID_SEARCH_SORT_TAG_NAME } from "./remote-dom-values-BSAxrOE7.mjs";
2
+ import { BatchingRemoteConnection, RemoteRootElement, createRemoteElement } from "@remote-dom/core/elements";
3
+ import { flushSync } from "react-dom";
4
+ import { createRoot } from "react-dom/client";
5
+ //#region src/worker-react-renderer.ts
6
+ const REMOTE_ROOT_TAG_NAME = "remote-root";
7
+ const standardEventDefinitions = createRemoteEventDefinitions(SUPPORTED_REMOTE_DOM_EVENTS);
8
+ const searchSortEventDefinitions = {
9
+ ...standardEventDefinitions,
10
+ ...createRemoteEventDefinitions(REMOTE_DOM_SEARCH_SORT_EVENTS)
11
+ };
12
+ const FluidRemoteElement = createRemoteElement({ events: standardEventDefinitions });
13
+ const RemoteInputElement = createRemoteElement({
14
+ events: standardEventDefinitions,
15
+ properties: {
16
+ checked: {
17
+ attribute: false,
18
+ default: false
19
+ },
20
+ type: {
21
+ attribute: true,
22
+ default: "text"
23
+ },
24
+ value: {
25
+ attribute: false,
26
+ default: ""
27
+ }
28
+ }
29
+ });
30
+ var FluidRemoteInputElement = class extends RemoteInputElement {
31
+ applyHostState(detail) {
32
+ const value = readSerializableString(detail, "value");
33
+ if (value !== void 0) this.updateRemoteProperty("value", value);
34
+ const checked = detail.checked;
35
+ if (typeof checked === "boolean") this.updateRemoteProperty("checked", checked);
36
+ }
37
+ };
38
+ const FluidRemoteSearchSortElement = createRemoteElement({
39
+ events: searchSortEventDefinitions,
40
+ properties: {
41
+ placeholder: { attribute: false },
42
+ searchValue: {
43
+ attribute: false,
44
+ default: ""
45
+ },
46
+ sortOptions: { attribute: false },
47
+ sortValue: { attribute: false }
48
+ }
49
+ });
50
+ const FluidRemoteSpacerWidgetElement = createRemoteElement({
51
+ events: standardEventDefinitions,
52
+ properties: {
53
+ customHeight: { attribute: false },
54
+ previewMode: {
55
+ attribute: false,
56
+ default: false
57
+ }
58
+ }
59
+ });
60
+ let remoteElementsRegistered = false;
61
+ function createRemoteDomReactWorkerRenderer({ connection }) {
62
+ registerRemoteElements();
63
+ const remoteRoot = document.createElement(REMOTE_ROOT_TAG_NAME);
64
+ const batchedConnection = new BatchingRemoteConnection(connection);
65
+ remoteRoot.connect(batchedConnection);
66
+ const reactRoot = createRoot(remoteRoot);
67
+ try {
68
+ document.body.append(remoteRoot);
69
+ } catch (error) {
70
+ reactRoot.unmount();
71
+ throw error;
72
+ }
73
+ let disposed = false;
74
+ return {
75
+ render(node) {
76
+ flushSync(() => {
77
+ reactRoot.render(node);
78
+ });
79
+ batchedConnection.flush();
80
+ },
81
+ dispose() {
82
+ if (disposed) return;
83
+ disposed = true;
84
+ const cleanupErrors = [];
85
+ try {
86
+ flushSync(() => {
87
+ reactRoot.unmount();
88
+ });
89
+ } catch (error) {
90
+ cleanupErrors.push(error);
91
+ }
92
+ try {
93
+ remoteRoot.remove();
94
+ } catch (error) {
95
+ cleanupErrors.push(error);
96
+ }
97
+ try {
98
+ batchedConnection.flush();
99
+ } catch (error) {
100
+ cleanupErrors.push(error);
101
+ }
102
+ if (cleanupErrors.length > 0) throw new AggregateError(cleanupErrors, "Remote DOM React session cleanup failed.");
103
+ }
104
+ };
105
+ }
106
+ function registerRemoteElements() {
107
+ if (remoteElementsRegistered) return;
108
+ remoteElementsRegistered = true;
109
+ defineRemoteElement(REMOTE_ROOT_TAG_NAME, RemoteRootElement);
110
+ for (const tagName of REMOTE_DOM_ALLOWED_TAG_NAMES) {
111
+ if (tagName === "fluid-ui-search-sort" || tagName === "fluid-spacer-widget") continue;
112
+ defineRemoteElement(tagName, tagName === "input" ? FluidRemoteInputElement : FluidRemoteElement);
113
+ }
114
+ defineRemoteElement(FLUID_SEARCH_SORT_TAG_NAME, FluidRemoteSearchSortElement);
115
+ defineRemoteElement(FLUID_SPACER_WIDGET_TAG_NAME, FluidRemoteSpacerWidgetElement);
116
+ }
117
+ function defineRemoteElement(tagName, constructor) {
118
+ if (customElements.get(tagName)) return;
119
+ customElements.define(tagName, constructor);
120
+ }
121
+ function createRemoteEventDefinitions(eventNames) {
122
+ return Object.fromEntries(eventNames.map((eventName) => [eventName, {
123
+ bubbles: true,
124
+ dispatchEvent(payload) {
125
+ const detail = readHostEventDetail(payload);
126
+ if (this instanceof FluidRemoteInputElement && isObjectRecord(detail)) this.applyHostState(detail);
127
+ return createRemoteDomReactEvent(eventName, detail);
128
+ }
129
+ }]));
130
+ }
131
+ function readHostEventDetail(payload) {
132
+ if (!isObjectRecord(payload)) return void 0;
133
+ const detail = payload.detail;
134
+ return isRemoteDomSerializableValue(detail) ? detail : void 0;
135
+ }
136
+ function createRemoteDomReactEvent(eventName, detail) {
137
+ const customDetail = parseCustomEventDetail(eventName, detail);
138
+ const event = new CustomEvent(eventName, {
139
+ bubbles: true,
140
+ cancelable: true,
141
+ detail: customDetail.ok ? customDetail.value : detail
142
+ });
143
+ if (!isObjectRecord(detail)) return event;
144
+ const key = readSerializableString(detail, "key");
145
+ if (key !== void 0) setObjectProperty(event, "key", key);
146
+ const eventType = readSerializableString(detail, "type");
147
+ if (eventType !== void 0) setObjectProperty(event, "inputType", eventType);
148
+ return event;
149
+ }
150
+ function parseCustomEventDetail(eventName, detail) {
151
+ if (!isSearchSortEvent(eventName) || !isObjectRecord(detail)) return { ok: false };
152
+ const detailJson = detail.detailJson;
153
+ if (typeof detailJson !== "string") return { ok: false };
154
+ try {
155
+ const value = JSON.parse(detailJson);
156
+ return isRemoteDomSerializableValue(value) ? {
157
+ ok: true,
158
+ value
159
+ } : { ok: false };
160
+ } catch {
161
+ return { ok: false };
162
+ }
163
+ }
164
+ function isSearchSortEvent(eventName) {
165
+ return REMOTE_DOM_SEARCH_SORT_EVENTS.some((candidate) => candidate === eventName);
166
+ }
167
+ function readSerializableString(detail, key) {
168
+ const value = detail[key];
169
+ return typeof value === "string" ? value : void 0;
170
+ }
171
+ function setObjectProperty(target, key, value) {
172
+ Object.defineProperty(target, key, {
173
+ configurable: true,
174
+ enumerable: true,
175
+ value,
176
+ writable: true
177
+ });
178
+ }
179
+ function isObjectRecord(value) {
180
+ return typeof value === "object" && value !== null && !Array.isArray(value);
181
+ }
182
+ //#endregion
183
+ export { createRemoteDomReactWorkerRenderer };
184
+
185
+ //# sourceMappingURL=worker-react-renderer-BKzig_Vy.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker-react-renderer-BKzig_Vy.mjs","names":[],"sources":["../src/worker-react-renderer.ts"],"sourcesContent":["import {\n BatchingRemoteConnection,\n createRemoteElement,\n RemoteRootElement,\n type RemoteElementEventListenerDefinition,\n type RemoteConnection,\n} from \"@remote-dom/core/elements\";\nimport type { ReactNode } from \"react\";\nimport { flushSync } from \"react-dom\";\nimport { createRoot, type Root } from \"react-dom/client\";\n\nimport {\n FLUID_SEARCH_SORT_TAG_NAME,\n FLUID_SPACER_WIDGET_TAG_NAME,\n isRemoteDomSerializableValue,\n REMOTE_DOM_ALLOWED_TAG_NAMES,\n REMOTE_DOM_SEARCH_SORT_EVENTS,\n SUPPORTED_REMOTE_DOM_EVENTS,\n type RemoteDomSerializableValue,\n} from \"./remote-dom-values\";\n\nexport interface RemoteDomReactWorkerRendererOptions {\n /**\n * The host-backed connection ({@link RemoteConnection}); its `mutate` is the\n * threads-proxied `host.mutate`. The renderer wraps it in a\n * `BatchingRemoteConnection` and flushes explicitly after every commit.\n */\n readonly connection: RemoteConnection;\n}\n\nexport interface RemoteDomReactWorkerRenderer {\n readonly render: (node: ReactNode) => void;\n readonly dispose: () => void;\n}\n\nconst REMOTE_ROOT_TAG_NAME = \"remote-root\";\n\ntype NoRemoteMembers = Record<never, never>;\ntype RemoteEventListeners = Record<string, (payload?: unknown) => unknown>;\n\nconst standardEventDefinitions = createRemoteEventDefinitions(\n SUPPORTED_REMOTE_DOM_EVENTS,\n);\nconst searchSortEventDefinitions = {\n ...standardEventDefinitions,\n ...createRemoteEventDefinitions(REMOTE_DOM_SEARCH_SORT_EVENTS),\n};\n\nconst FluidRemoteElement = createRemoteElement<\n NoRemoteMembers,\n NoRemoteMembers,\n NoRemoteMembers,\n RemoteEventListeners\n>({ events: standardEventDefinitions });\n\ninterface RemoteInputProperties {\n readonly checked: boolean;\n readonly type: string;\n readonly value: string;\n}\n\nconst RemoteInputElement = createRemoteElement<\n RemoteInputProperties,\n NoRemoteMembers,\n NoRemoteMembers,\n RemoteEventListeners\n>({\n events: standardEventDefinitions,\n properties: {\n checked: { attribute: false, default: false },\n type: { attribute: true, default: \"text\" },\n value: { attribute: false, default: \"\" },\n },\n});\n\nclass FluidRemoteInputElement extends RemoteInputElement {\n applyHostState(detail: Readonly<Record<string, unknown>>): void {\n // React wraps public input setters with its value tracker. Update Remote\n // DOM's upstream property cache directly so the following native event is\n // extracted, while still synchronizing the host-controlled value.\n const value = readSerializableString(detail, \"value\");\n if (value !== undefined) this.updateRemoteProperty(\"value\", value);\n\n const checked = detail.checked;\n if (typeof checked === \"boolean\") {\n this.updateRemoteProperty(\"checked\", checked);\n }\n }\n}\n\ninterface RemoteSearchSortOption {\n readonly label: string;\n readonly value: string;\n}\n\ninterface RemoteSearchSortProperties {\n readonly placeholder: string | undefined;\n readonly searchValue: string;\n readonly sortOptions: readonly RemoteSearchSortOption[] | undefined;\n readonly sortValue: string | undefined;\n}\n\nconst FluidRemoteSearchSortElement = createRemoteElement<\n RemoteSearchSortProperties,\n NoRemoteMembers,\n NoRemoteMembers,\n RemoteEventListeners\n>({\n events: searchSortEventDefinitions,\n properties: {\n placeholder: { attribute: false },\n searchValue: { attribute: false, default: \"\" },\n sortOptions: { attribute: false },\n sortValue: { attribute: false },\n },\n});\n\ninterface RemoteSpacerProperties {\n readonly customHeight: string | undefined;\n readonly previewMode: boolean;\n}\n\nconst FluidRemoteSpacerWidgetElement = createRemoteElement<\n RemoteSpacerProperties,\n NoRemoteMembers,\n NoRemoteMembers,\n RemoteEventListeners\n>({\n events: standardEventDefinitions,\n properties: {\n customHeight: { attribute: false },\n previewMode: { attribute: false, default: false },\n },\n});\n\nlet remoteElementsRegistered = false;\n\nexport function createRemoteDomReactWorkerRenderer({\n connection,\n}: RemoteDomReactWorkerRendererOptions): RemoteDomReactWorkerRenderer {\n registerRemoteElements();\n\n const remoteRoot = document.createElement(\n REMOTE_ROOT_TAG_NAME,\n ) as RemoteRootElement;\n const batchedConnection = new BatchingRemoteConnection(connection);\n remoteRoot.connect(batchedConnection);\n const reactRoot: Root = createRoot(remoteRoot);\n // Remote DOM installs bubbling event proxies from custom-element lifecycle\n // callbacks. Keep the remote tree connected to its synthetic document so\n // those callbacks run for every element React mounts.\n try {\n document.body.append(remoteRoot);\n } catch (error) {\n reactRoot.unmount();\n throw error;\n }\n let disposed = false;\n\n return {\n render(node) {\n flushSync(() => {\n reactRoot.render(node);\n });\n // The host must never observe a capability/event side effect before the\n // DOM it references, so force mutations out immediately after commit.\n batchedConnection.flush();\n },\n dispose() {\n if (disposed) return;\n disposed = true;\n const cleanupErrors: unknown[] = [];\n\n try {\n flushSync(() => {\n reactRoot.unmount();\n });\n } catch (error) {\n cleanupErrors.push(error);\n }\n try {\n remoteRoot.remove();\n } catch (error) {\n cleanupErrors.push(error);\n }\n try {\n batchedConnection.flush();\n } catch (error) {\n cleanupErrors.push(error);\n }\n\n if (cleanupErrors.length > 0) {\n throw new AggregateError(\n cleanupErrors,\n \"Remote DOM React session cleanup failed.\",\n );\n }\n },\n };\n}\n\nfunction registerRemoteElements(): void {\n if (remoteElementsRegistered) return;\n remoteElementsRegistered = true;\n\n defineRemoteElement(REMOTE_ROOT_TAG_NAME, RemoteRootElement);\n for (const tagName of REMOTE_DOM_ALLOWED_TAG_NAMES) {\n if (\n tagName === FLUID_SEARCH_SORT_TAG_NAME ||\n tagName === FLUID_SPACER_WIDGET_TAG_NAME\n ) {\n continue;\n }\n defineRemoteElement(\n tagName,\n tagName === \"input\" ? FluidRemoteInputElement : FluidRemoteElement,\n );\n }\n defineRemoteElement(FLUID_SEARCH_SORT_TAG_NAME, FluidRemoteSearchSortElement);\n defineRemoteElement(\n FLUID_SPACER_WIDGET_TAG_NAME,\n FluidRemoteSpacerWidgetElement,\n );\n}\n\nfunction defineRemoteElement(\n tagName: string,\n constructor: CustomElementConstructor,\n): void {\n if (customElements.get(tagName)) return;\n customElements.define(tagName, constructor);\n}\n\nfunction createRemoteEventDefinitions(\n eventNames: readonly string[],\n): Readonly<Record<string, RemoteElementEventListenerDefinition>> {\n return Object.fromEntries(\n eventNames.map((eventName) => [\n eventName,\n {\n bubbles: true,\n dispatchEvent(this: Element, payload?: unknown) {\n const detail = readHostEventDetail(payload);\n if (\n this instanceof FluidRemoteInputElement &&\n isObjectRecord(detail)\n ) {\n this.applyHostState(detail);\n }\n return createRemoteDomReactEvent(eventName, detail);\n },\n },\n ]),\n );\n}\n\nfunction readHostEventDetail(\n payload: unknown,\n): RemoteDomSerializableValue | undefined {\n if (!isObjectRecord(payload)) return undefined;\n const detail = payload.detail;\n return isRemoteDomSerializableValue(detail) ? detail : undefined;\n}\n\nfunction createRemoteDomReactEvent(\n eventName: string,\n detail: RemoteDomSerializableValue | undefined,\n): Event {\n const customDetail = parseCustomEventDetail(eventName, detail);\n const event = new CustomEvent(eventName, {\n bubbles: true,\n cancelable: true,\n detail: customDetail.ok ? customDetail.value : detail,\n });\n if (!isObjectRecord(detail)) return event;\n\n const key = readSerializableString(detail, \"key\");\n if (key !== undefined) setObjectProperty(event, \"key\", key);\n\n const eventType = readSerializableString(detail, \"type\");\n if (eventType !== undefined) setObjectProperty(event, \"inputType\", eventType);\n\n return event;\n}\n\nfunction parseCustomEventDetail(\n eventName: string,\n detail: RemoteDomSerializableValue | undefined,\n):\n | { readonly ok: true; readonly value: RemoteDomSerializableValue }\n | { readonly ok: false } {\n if (!isSearchSortEvent(eventName) || !isObjectRecord(detail)) {\n return { ok: false };\n }\n const detailJson = detail.detailJson;\n if (typeof detailJson !== \"string\") return { ok: false };\n\n try {\n const value: unknown = JSON.parse(detailJson);\n return isRemoteDomSerializableValue(value)\n ? { ok: true, value }\n : { ok: false };\n } catch {\n return { ok: false };\n }\n}\n\nfunction isSearchSortEvent(eventName: string): boolean {\n return REMOTE_DOM_SEARCH_SORT_EVENTS.some(\n (candidate) => candidate === eventName,\n );\n}\n\nfunction readSerializableString(\n detail: Readonly<Record<string, unknown>>,\n key: string,\n): string | undefined {\n const value = detail[key];\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction setObjectProperty(target: object, key: string, value: unknown): void {\n Object.defineProperty(target, key, {\n configurable: true,\n enumerable: true,\n value,\n writable: true,\n });\n}\n\nfunction isObjectRecord(\n value: unknown,\n): value is Readonly<Record<string, unknown>> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n"],"mappings":"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"}
@@ -0,0 +1,186 @@
1
+ require("./remote-dom-renderer-DUQf80Nu.cjs");
2
+ const require_remote_dom_values = require("./remote-dom-values-DbgIedSg.cjs");
3
+ let _remote_dom_core_elements = require("@remote-dom/core/elements");
4
+ let react_dom = require("react-dom");
5
+ let react_dom_client = require("react-dom/client");
6
+ //#region src/worker-react-renderer.ts
7
+ const REMOTE_ROOT_TAG_NAME = "remote-root";
8
+ const standardEventDefinitions = createRemoteEventDefinitions(require_remote_dom_values.SUPPORTED_REMOTE_DOM_EVENTS);
9
+ const searchSortEventDefinitions = {
10
+ ...standardEventDefinitions,
11
+ ...createRemoteEventDefinitions(require_remote_dom_values.REMOTE_DOM_SEARCH_SORT_EVENTS)
12
+ };
13
+ const FluidRemoteElement = (0, _remote_dom_core_elements.createRemoteElement)({ events: standardEventDefinitions });
14
+ const RemoteInputElement = (0, _remote_dom_core_elements.createRemoteElement)({
15
+ events: standardEventDefinitions,
16
+ properties: {
17
+ checked: {
18
+ attribute: false,
19
+ default: false
20
+ },
21
+ type: {
22
+ attribute: true,
23
+ default: "text"
24
+ },
25
+ value: {
26
+ attribute: false,
27
+ default: ""
28
+ }
29
+ }
30
+ });
31
+ var FluidRemoteInputElement = class extends RemoteInputElement {
32
+ applyHostState(detail) {
33
+ const value = readSerializableString(detail, "value");
34
+ if (value !== void 0) this.updateRemoteProperty("value", value);
35
+ const checked = detail.checked;
36
+ if (typeof checked === "boolean") this.updateRemoteProperty("checked", checked);
37
+ }
38
+ };
39
+ const FluidRemoteSearchSortElement = (0, _remote_dom_core_elements.createRemoteElement)({
40
+ events: searchSortEventDefinitions,
41
+ properties: {
42
+ placeholder: { attribute: false },
43
+ searchValue: {
44
+ attribute: false,
45
+ default: ""
46
+ },
47
+ sortOptions: { attribute: false },
48
+ sortValue: { attribute: false }
49
+ }
50
+ });
51
+ const FluidRemoteSpacerWidgetElement = (0, _remote_dom_core_elements.createRemoteElement)({
52
+ events: standardEventDefinitions,
53
+ properties: {
54
+ customHeight: { attribute: false },
55
+ previewMode: {
56
+ attribute: false,
57
+ default: false
58
+ }
59
+ }
60
+ });
61
+ let remoteElementsRegistered = false;
62
+ function createRemoteDomReactWorkerRenderer({ connection }) {
63
+ registerRemoteElements();
64
+ const remoteRoot = document.createElement(REMOTE_ROOT_TAG_NAME);
65
+ const batchedConnection = new _remote_dom_core_elements.BatchingRemoteConnection(connection);
66
+ remoteRoot.connect(batchedConnection);
67
+ const reactRoot = (0, react_dom_client.createRoot)(remoteRoot);
68
+ try {
69
+ document.body.append(remoteRoot);
70
+ } catch (error) {
71
+ reactRoot.unmount();
72
+ throw error;
73
+ }
74
+ let disposed = false;
75
+ return {
76
+ render(node) {
77
+ (0, react_dom.flushSync)(() => {
78
+ reactRoot.render(node);
79
+ });
80
+ batchedConnection.flush();
81
+ },
82
+ dispose() {
83
+ if (disposed) return;
84
+ disposed = true;
85
+ const cleanupErrors = [];
86
+ try {
87
+ (0, react_dom.flushSync)(() => {
88
+ reactRoot.unmount();
89
+ });
90
+ } catch (error) {
91
+ cleanupErrors.push(error);
92
+ }
93
+ try {
94
+ remoteRoot.remove();
95
+ } catch (error) {
96
+ cleanupErrors.push(error);
97
+ }
98
+ try {
99
+ batchedConnection.flush();
100
+ } catch (error) {
101
+ cleanupErrors.push(error);
102
+ }
103
+ if (cleanupErrors.length > 0) throw new AggregateError(cleanupErrors, "Remote DOM React session cleanup failed.");
104
+ }
105
+ };
106
+ }
107
+ function registerRemoteElements() {
108
+ if (remoteElementsRegistered) return;
109
+ remoteElementsRegistered = true;
110
+ defineRemoteElement(REMOTE_ROOT_TAG_NAME, _remote_dom_core_elements.RemoteRootElement);
111
+ for (const tagName of require_remote_dom_values.REMOTE_DOM_ALLOWED_TAG_NAMES) {
112
+ if (tagName === "fluid-ui-search-sort" || tagName === "fluid-spacer-widget") continue;
113
+ defineRemoteElement(tagName, tagName === "input" ? FluidRemoteInputElement : FluidRemoteElement);
114
+ }
115
+ defineRemoteElement(require_remote_dom_values.FLUID_SEARCH_SORT_TAG_NAME, FluidRemoteSearchSortElement);
116
+ defineRemoteElement(require_remote_dom_values.FLUID_SPACER_WIDGET_TAG_NAME, FluidRemoteSpacerWidgetElement);
117
+ }
118
+ function defineRemoteElement(tagName, constructor) {
119
+ if (customElements.get(tagName)) return;
120
+ customElements.define(tagName, constructor);
121
+ }
122
+ function createRemoteEventDefinitions(eventNames) {
123
+ return Object.fromEntries(eventNames.map((eventName) => [eventName, {
124
+ bubbles: true,
125
+ dispatchEvent(payload) {
126
+ const detail = readHostEventDetail(payload);
127
+ if (this instanceof FluidRemoteInputElement && isObjectRecord(detail)) this.applyHostState(detail);
128
+ return createRemoteDomReactEvent(eventName, detail);
129
+ }
130
+ }]));
131
+ }
132
+ function readHostEventDetail(payload) {
133
+ if (!isObjectRecord(payload)) return void 0;
134
+ const detail = payload.detail;
135
+ return require_remote_dom_values.isRemoteDomSerializableValue(detail) ? detail : void 0;
136
+ }
137
+ function createRemoteDomReactEvent(eventName, detail) {
138
+ const customDetail = parseCustomEventDetail(eventName, detail);
139
+ const event = new CustomEvent(eventName, {
140
+ bubbles: true,
141
+ cancelable: true,
142
+ detail: customDetail.ok ? customDetail.value : detail
143
+ });
144
+ if (!isObjectRecord(detail)) return event;
145
+ const key = readSerializableString(detail, "key");
146
+ if (key !== void 0) setObjectProperty(event, "key", key);
147
+ const eventType = readSerializableString(detail, "type");
148
+ if (eventType !== void 0) setObjectProperty(event, "inputType", eventType);
149
+ return event;
150
+ }
151
+ function parseCustomEventDetail(eventName, detail) {
152
+ if (!isSearchSortEvent(eventName) || !isObjectRecord(detail)) return { ok: false };
153
+ const detailJson = detail.detailJson;
154
+ if (typeof detailJson !== "string") return { ok: false };
155
+ try {
156
+ const value = JSON.parse(detailJson);
157
+ return require_remote_dom_values.isRemoteDomSerializableValue(value) ? {
158
+ ok: true,
159
+ value
160
+ } : { ok: false };
161
+ } catch {
162
+ return { ok: false };
163
+ }
164
+ }
165
+ function isSearchSortEvent(eventName) {
166
+ return require_remote_dom_values.REMOTE_DOM_SEARCH_SORT_EVENTS.some((candidate) => candidate === eventName);
167
+ }
168
+ function readSerializableString(detail, key) {
169
+ const value = detail[key];
170
+ return typeof value === "string" ? value : void 0;
171
+ }
172
+ function setObjectProperty(target, key, value) {
173
+ Object.defineProperty(target, key, {
174
+ configurable: true,
175
+ enumerable: true,
176
+ value,
177
+ writable: true
178
+ });
179
+ }
180
+ function isObjectRecord(value) {
181
+ return typeof value === "object" && value !== null && !Array.isArray(value);
182
+ }
183
+ //#endregion
184
+ exports.createRemoteDomReactWorkerRenderer = createRemoteDomReactWorkerRenderer;
185
+
186
+ //# sourceMappingURL=worker-react-renderer-BSFxMMf7.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker-react-renderer-BSFxMMf7.cjs","names":["SUPPORTED_REMOTE_DOM_EVENTS","REMOTE_DOM_SEARCH_SORT_EVENTS","BatchingRemoteConnection","RemoteRootElement","REMOTE_DOM_ALLOWED_TAG_NAMES","FLUID_SEARCH_SORT_TAG_NAME","FLUID_SPACER_WIDGET_TAG_NAME","isRemoteDomSerializableValue"],"sources":["../src/worker-react-renderer.ts"],"sourcesContent":["import {\n BatchingRemoteConnection,\n createRemoteElement,\n RemoteRootElement,\n type RemoteElementEventListenerDefinition,\n type RemoteConnection,\n} from \"@remote-dom/core/elements\";\nimport type { ReactNode } from \"react\";\nimport { flushSync } from \"react-dom\";\nimport { createRoot, type Root } from \"react-dom/client\";\n\nimport {\n FLUID_SEARCH_SORT_TAG_NAME,\n FLUID_SPACER_WIDGET_TAG_NAME,\n isRemoteDomSerializableValue,\n REMOTE_DOM_ALLOWED_TAG_NAMES,\n REMOTE_DOM_SEARCH_SORT_EVENTS,\n SUPPORTED_REMOTE_DOM_EVENTS,\n type RemoteDomSerializableValue,\n} from \"./remote-dom-values\";\n\nexport interface RemoteDomReactWorkerRendererOptions {\n /**\n * The host-backed connection ({@link RemoteConnection}); its `mutate` is the\n * threads-proxied `host.mutate`. The renderer wraps it in a\n * `BatchingRemoteConnection` and flushes explicitly after every commit.\n */\n readonly connection: RemoteConnection;\n}\n\nexport interface RemoteDomReactWorkerRenderer {\n readonly render: (node: ReactNode) => void;\n readonly dispose: () => void;\n}\n\nconst REMOTE_ROOT_TAG_NAME = \"remote-root\";\n\ntype NoRemoteMembers = Record<never, never>;\ntype RemoteEventListeners = Record<string, (payload?: unknown) => unknown>;\n\nconst standardEventDefinitions = createRemoteEventDefinitions(\n SUPPORTED_REMOTE_DOM_EVENTS,\n);\nconst searchSortEventDefinitions = {\n ...standardEventDefinitions,\n ...createRemoteEventDefinitions(REMOTE_DOM_SEARCH_SORT_EVENTS),\n};\n\nconst FluidRemoteElement = createRemoteElement<\n NoRemoteMembers,\n NoRemoteMembers,\n NoRemoteMembers,\n RemoteEventListeners\n>({ events: standardEventDefinitions });\n\ninterface RemoteInputProperties {\n readonly checked: boolean;\n readonly type: string;\n readonly value: string;\n}\n\nconst RemoteInputElement = createRemoteElement<\n RemoteInputProperties,\n NoRemoteMembers,\n NoRemoteMembers,\n RemoteEventListeners\n>({\n events: standardEventDefinitions,\n properties: {\n checked: { attribute: false, default: false },\n type: { attribute: true, default: \"text\" },\n value: { attribute: false, default: \"\" },\n },\n});\n\nclass FluidRemoteInputElement extends RemoteInputElement {\n applyHostState(detail: Readonly<Record<string, unknown>>): void {\n // React wraps public input setters with its value tracker. Update Remote\n // DOM's upstream property cache directly so the following native event is\n // extracted, while still synchronizing the host-controlled value.\n const value = readSerializableString(detail, \"value\");\n if (value !== undefined) this.updateRemoteProperty(\"value\", value);\n\n const checked = detail.checked;\n if (typeof checked === \"boolean\") {\n this.updateRemoteProperty(\"checked\", checked);\n }\n }\n}\n\ninterface RemoteSearchSortOption {\n readonly label: string;\n readonly value: string;\n}\n\ninterface RemoteSearchSortProperties {\n readonly placeholder: string | undefined;\n readonly searchValue: string;\n readonly sortOptions: readonly RemoteSearchSortOption[] | undefined;\n readonly sortValue: string | undefined;\n}\n\nconst FluidRemoteSearchSortElement = createRemoteElement<\n RemoteSearchSortProperties,\n NoRemoteMembers,\n NoRemoteMembers,\n RemoteEventListeners\n>({\n events: searchSortEventDefinitions,\n properties: {\n placeholder: { attribute: false },\n searchValue: { attribute: false, default: \"\" },\n sortOptions: { attribute: false },\n sortValue: { attribute: false },\n },\n});\n\ninterface RemoteSpacerProperties {\n readonly customHeight: string | undefined;\n readonly previewMode: boolean;\n}\n\nconst FluidRemoteSpacerWidgetElement = createRemoteElement<\n RemoteSpacerProperties,\n NoRemoteMembers,\n NoRemoteMembers,\n RemoteEventListeners\n>({\n events: standardEventDefinitions,\n properties: {\n customHeight: { attribute: false },\n previewMode: { attribute: false, default: false },\n },\n});\n\nlet remoteElementsRegistered = false;\n\nexport function createRemoteDomReactWorkerRenderer({\n connection,\n}: RemoteDomReactWorkerRendererOptions): RemoteDomReactWorkerRenderer {\n registerRemoteElements();\n\n const remoteRoot = document.createElement(\n REMOTE_ROOT_TAG_NAME,\n ) as RemoteRootElement;\n const batchedConnection = new BatchingRemoteConnection(connection);\n remoteRoot.connect(batchedConnection);\n const reactRoot: Root = createRoot(remoteRoot);\n // Remote DOM installs bubbling event proxies from custom-element lifecycle\n // callbacks. Keep the remote tree connected to its synthetic document so\n // those callbacks run for every element React mounts.\n try {\n document.body.append(remoteRoot);\n } catch (error) {\n reactRoot.unmount();\n throw error;\n }\n let disposed = false;\n\n return {\n render(node) {\n flushSync(() => {\n reactRoot.render(node);\n });\n // The host must never observe a capability/event side effect before the\n // DOM it references, so force mutations out immediately after commit.\n batchedConnection.flush();\n },\n dispose() {\n if (disposed) return;\n disposed = true;\n const cleanupErrors: unknown[] = [];\n\n try {\n flushSync(() => {\n reactRoot.unmount();\n });\n } catch (error) {\n cleanupErrors.push(error);\n }\n try {\n remoteRoot.remove();\n } catch (error) {\n cleanupErrors.push(error);\n }\n try {\n batchedConnection.flush();\n } catch (error) {\n cleanupErrors.push(error);\n }\n\n if (cleanupErrors.length > 0) {\n throw new AggregateError(\n cleanupErrors,\n \"Remote DOM React session cleanup failed.\",\n );\n }\n },\n };\n}\n\nfunction registerRemoteElements(): void {\n if (remoteElementsRegistered) return;\n remoteElementsRegistered = true;\n\n defineRemoteElement(REMOTE_ROOT_TAG_NAME, RemoteRootElement);\n for (const tagName of REMOTE_DOM_ALLOWED_TAG_NAMES) {\n if (\n tagName === FLUID_SEARCH_SORT_TAG_NAME ||\n tagName === FLUID_SPACER_WIDGET_TAG_NAME\n ) {\n continue;\n }\n defineRemoteElement(\n tagName,\n tagName === \"input\" ? FluidRemoteInputElement : FluidRemoteElement,\n );\n }\n defineRemoteElement(FLUID_SEARCH_SORT_TAG_NAME, FluidRemoteSearchSortElement);\n defineRemoteElement(\n FLUID_SPACER_WIDGET_TAG_NAME,\n FluidRemoteSpacerWidgetElement,\n );\n}\n\nfunction defineRemoteElement(\n tagName: string,\n constructor: CustomElementConstructor,\n): void {\n if (customElements.get(tagName)) return;\n customElements.define(tagName, constructor);\n}\n\nfunction createRemoteEventDefinitions(\n eventNames: readonly string[],\n): Readonly<Record<string, RemoteElementEventListenerDefinition>> {\n return Object.fromEntries(\n eventNames.map((eventName) => [\n eventName,\n {\n bubbles: true,\n dispatchEvent(this: Element, payload?: unknown) {\n const detail = readHostEventDetail(payload);\n if (\n this instanceof FluidRemoteInputElement &&\n isObjectRecord(detail)\n ) {\n this.applyHostState(detail);\n }\n return createRemoteDomReactEvent(eventName, detail);\n },\n },\n ]),\n );\n}\n\nfunction readHostEventDetail(\n payload: unknown,\n): RemoteDomSerializableValue | undefined {\n if (!isObjectRecord(payload)) return undefined;\n const detail = payload.detail;\n return isRemoteDomSerializableValue(detail) ? detail : undefined;\n}\n\nfunction createRemoteDomReactEvent(\n eventName: string,\n detail: RemoteDomSerializableValue | undefined,\n): Event {\n const customDetail = parseCustomEventDetail(eventName, detail);\n const event = new CustomEvent(eventName, {\n bubbles: true,\n cancelable: true,\n detail: customDetail.ok ? customDetail.value : detail,\n });\n if (!isObjectRecord(detail)) return event;\n\n const key = readSerializableString(detail, \"key\");\n if (key !== undefined) setObjectProperty(event, \"key\", key);\n\n const eventType = readSerializableString(detail, \"type\");\n if (eventType !== undefined) setObjectProperty(event, \"inputType\", eventType);\n\n return event;\n}\n\nfunction parseCustomEventDetail(\n eventName: string,\n detail: RemoteDomSerializableValue | undefined,\n):\n | { readonly ok: true; readonly value: RemoteDomSerializableValue }\n | { readonly ok: false } {\n if (!isSearchSortEvent(eventName) || !isObjectRecord(detail)) {\n return { ok: false };\n }\n const detailJson = detail.detailJson;\n if (typeof detailJson !== \"string\") return { ok: false };\n\n try {\n const value: unknown = JSON.parse(detailJson);\n return isRemoteDomSerializableValue(value)\n ? { ok: true, value }\n : { ok: false };\n } catch {\n return { ok: false };\n }\n}\n\nfunction isSearchSortEvent(eventName: string): boolean {\n return REMOTE_DOM_SEARCH_SORT_EVENTS.some(\n (candidate) => candidate === eventName,\n );\n}\n\nfunction readSerializableString(\n detail: Readonly<Record<string, unknown>>,\n key: string,\n): string | undefined {\n const value = detail[key];\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction setObjectProperty(target: object, key: string, value: unknown): void {\n Object.defineProperty(target, key, {\n configurable: true,\n enumerable: true,\n value,\n writable: true,\n });\n}\n\nfunction isObjectRecord(\n value: unknown,\n): value is Readonly<Record<string, unknown>> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n"],"mappings":"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"}