From a7c212c2a9deeb8cea738e334bf37b68322ada66 Mon Sep 17 00:00:00 2001 From: Christian Bromann Date: Mon, 8 Jul 2024 11:22:36 -0700 Subject: [PATCH] fix(hydrate): ensure beforeHydrateFn and afterHydrateFn always return a function (#5890) --- src/hydrate/runner/render.ts | 4 ++-- .../src/declarative-shadow-dom/test.e2e.ts | 14 ++++++++++++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/hydrate/runner/render.ts b/src/hydrate/runner/render.ts index c200a0d53e3..7860e722e7c 100644 --- a/src/hydrate/runner/render.ts +++ b/src/hydrate/runner/render.ts @@ -130,7 +130,7 @@ async function render(win: MockWindow, opts: HydrateFactoryOptions, results: Hyd } initializeWindow(win, win.document, opts, results); - const beforeHydrateFn = typeof opts.beforeHydrate === 'function' ? opts.beforeHydrate(win.document) : NOOP; + const beforeHydrateFn = typeof opts.beforeHydrate === 'function' ? opts.beforeHydrate : NOOP; try { await Promise.resolve(beforeHydrateFn(win.document)); return new Promise((resolve) => hydrateFactory(win, opts, results, afterHydrate, resolve)); @@ -162,7 +162,7 @@ async function afterHydrate( results: HydrateResults, resolve: (results: HydrateResults) => void, ) { - const afterHydrateFn = typeof opts.afterHydrate === 'function' ? opts.afterHydrate(win.document) : NOOP; + const afterHydrateFn = typeof opts.afterHydrate === 'function' ? opts.afterHydrate : NOOP; try { await Promise.resolve(afterHydrateFn(win.document)); return resolve(finalizeHydrate(win, win.document, opts, results)); diff --git a/test/end-to-end/src/declarative-shadow-dom/test.e2e.ts b/test/end-to-end/src/declarative-shadow-dom/test.e2e.ts index 8a1b5b717a8..486ba66a1e0 100644 --- a/test/end-to-end/src/declarative-shadow-dom/test.e2e.ts +++ b/test/end-to-end/src/declarative-shadow-dom/test.e2e.ts @@ -253,4 +253,18 @@ describe('renderToString', () => { `
2023 VW Beetle
`, ); }); + + it('calls beforeHydrate and afterHydrate function hooks', async () => { + const beforeHydrate = jest.fn((doc) => (doc.querySelector('div').textContent = 'Hello Universe')); + const afterHydrate = jest.fn(); + + const { html } = await renderToString('
Hello World
', { + beforeHydrate, + afterHydrate, + }); + + expect(beforeHydrate).toHaveBeenCalledTimes(1); + expect(afterHydrate).toHaveBeenCalledTimes(1); + expect(html).toContain('
Hello Universe
'); + }); });