Skip to content

Commit 08091c9

Browse files
committed
fix: update rehydrate children for new API
1 parent cb1c528 commit 08091c9

File tree

6 files changed

+27
-22
lines changed

6 files changed

+27
-22
lines changed

src/IRehydrator.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,9 @@
11
import * as React from "react";
22

3-
type RehydrateChildren = (el: Element) => Promise<React.ReactNode>;
4-
53
export default interface IRehydrator {
64
[name: string]: (
75
el: Element,
8-
rehydrateChildren: RehydrateChildren,
6+
rehydrate: (element: Element) => React.ReactNode,
97
extra: object
108
) => Promise<React.ReactElement<any>>;
119
}

src/__tests__/tests.ts

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -27,14 +27,10 @@ describe("reactFromHtml E2E tests", async () => {
2727

2828
const mockCall = jest.fn();
2929
const rehydrators = {
30-
[componentName]: async (node: HTMLElement) => {
30+
[componentName]: async (el, rehydrate) => {
3131
mockCall();
3232

33-
await reactFromHtml(node, rehydrators, { extra: {} });
34-
35-
return React.createElement("span", {
36-
dangerouslySetInnerHTML: { __html: node.innerHTML },
37-
});
33+
return React.createElement("span", {}, await rehydrate(el));
3834
},
3935
};
4036

src/dom-element-to-react/convert.ts

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,23 +13,30 @@ const convertText = (el: Text): string =>
1313

1414
const convertElement = async (
1515
el: Element,
16-
customElementHandler: CustomElementHandlerType,
17-
recursor: StaticToReactElementRecursor
18-
) =>
19-
// If customElementHandler is truthy, use it; otherwise, just convert to a React element.
20-
(await customElementHandler(el)) || staticToReactElement(el, recursor);
16+
recursor: StaticToReactElementRecursor,
17+
customElementHandler?: CustomElementHandlerType
18+
) => {
19+
if (customElementHandler) {
20+
// If customElementHandler is truthy, use it; otherwise, just convert to a React element.
21+
return (
22+
(await customElementHandler(el)) || staticToReactElement(el, recursor)
23+
);
24+
}
25+
26+
return staticToReactElement(el, recursor);
27+
};
2128

2229
const convert = async (
2330
el: Node,
24-
customElementHandler: CustomElementHandlerType
31+
customElementHandler?: CustomElementHandlerType
2532
) => {
2633
const recursor: StaticToReactElementRecursor = (innerEl: Node) =>
2734
convert(innerEl, customElementHandler);
2835

2936
if (el.nodeType === Node.TEXT_NODE) {
3037
return convertText(el as Text);
3138
} else if (el.nodeType === Node.ELEMENT_NODE) {
32-
return convertElement(el as Element, customElementHandler, recursor);
39+
return convertElement(el as Element, recursor, customElementHandler);
3340
}
3441

3542
// Unhandled node type. Probably an HTML comment.

src/dom-element-to-react/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import convert, { CustomElementHandlerType } from "./convert";
33

44
const rehydrateChildren = async (
55
node: Node,
6-
customHandler: CustomElementHandlerType
6+
customHandler?: CustomElementHandlerType
77
): Promise<React.ReactNode> => {
88
if (!node || !node.childNodes) {
99
return null;

src/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
export { default, rehydrateChildren } from "./rehydrator";
1+
export { default } from "./rehydrator";

src/rehydrator.ts

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,10 @@ const rehydratableToReactElement = async (
2323

2424
return rehydrator(
2525
el,
26-
async children =>
27-
(await rehydrateChildren(children, rehydrators, options)).rehydrated,
26+
async node => {
27+
await rehydrate(node, rehydrators, options);
28+
return domElementToReact(node);
29+
},
2830
options.extra
2931
);
3032
};
@@ -98,7 +100,7 @@ const createQuerySelector = (rehydratableIds: string[]) =>
98100
""
99101
);
100102

101-
export default async (
103+
const rehydrate = async (
102104
container: Element,
103105
rehydrators: IRehydrator,
104106
options: IOptions
@@ -144,4 +146,6 @@ export default async (
144146
await Promise.all(renders.map(r => r().then(render)));
145147
};
146148

147-
export { IRehydrator, rehydratableToReactElement, rehydrateChildren };
149+
export default rehydrate;
150+
151+
export { IRehydrator, rehydratableToReactElement };

0 commit comments

Comments
 (0)