From 0ccae383c6d9bd90b31b4f27df3028cf081361f2 Mon Sep 17 00:00:00 2001 From: Michael Peyper Date: Fri, 8 Jan 2021 12:05:33 +1100 Subject: [PATCH 1/5] refactor: change functions to be more consistent between regular functions and arrow functions --- src/core/index.ts | 52 ++++++++++++++++--------------- src/helpers/createTestHarness.tsx | 6 ++-- src/helpers/promises.ts | 10 +++--- 3 files changed, 37 insertions(+), 31 deletions(-) diff --git a/src/core/index.ts b/src/core/index.ts index 6f8f5809..82cc396d 100644 --- a/src/core/index.ts +++ b/src/core/index.ts @@ -40,38 +40,40 @@ function resultContainer(): ResultContainer { } } -const createRenderHook = >( +function createRenderHook>( createRenderer: CreateRenderer -) => ( - callback: (props: TProps) => TResult, - options: RenderHookOptions = {} as RenderHookOptions -): RenderHook => { - const { result, setValue, setError, addResolver } = resultContainer() - const renderProps = { callback, setValue, setError } - let hookProps = options.initialProps +) { + return function renderHook( + callback: (props: TProps) => TResult, + options: RenderHookOptions = {} as RenderHookOptions + ): RenderHook { + const { result, setValue, setError, addResolver } = resultContainer() + const renderProps = { callback, setValue, setError } + let hookProps = options.initialProps - const { render, rerender, unmount, act, ...renderUtils } = createRenderer(renderProps, options) + const { render, rerender, unmount, act, ...renderUtils } = createRenderer(renderProps, options) - render(hookProps) + render(hookProps) - function rerenderHook(newProps = hookProps) { - hookProps = newProps - rerender(hookProps) - } + const rerenderHook = (newProps = hookProps) => { + hookProps = newProps + rerender(hookProps) + } - function unmountHook() { - removeCleanup(unmountHook) - unmount() - } + const unmountHook = () => { + removeCleanup(unmountHook) + unmount() + } - addCleanup(unmountHook) + addCleanup(unmountHook) - return { - result, - rerender: rerenderHook, - unmount: unmountHook, - ...asyncUtils(act, addResolver), - ...renderUtils + return { + result, + rerender: rerenderHook, + unmount: unmountHook, + ...asyncUtils(act, addResolver), + ...renderUtils + } } } diff --git a/src/helpers/createTestHarness.tsx b/src/helpers/createTestHarness.tsx index b382a080..9f1465c4 100644 --- a/src/helpers/createTestHarness.tsx +++ b/src/helpers/createTestHarness.tsx @@ -24,11 +24,11 @@ function TestComponent({ return null } -export const createTestHarness = ( +function createTestHarness( rendererProps: RendererProps, Wrapper?: WrapperComponent, suspense: boolean = true -) => { +) { return (props?: TProps) => { let component = if (Wrapper) { @@ -40,3 +40,5 @@ export const createTestHarness = ( return component } } + +export { createTestHarness } diff --git a/src/helpers/promises.ts b/src/helpers/promises.ts index d7dec9bd..8f7612ba 100644 --- a/src/helpers/promises.ts +++ b/src/helpers/promises.ts @@ -1,9 +1,11 @@ -const resolveAfter = (ms: number) => - new Promise((resolve) => { +function resolveAfter(ms: number) { + return new Promise((resolve) => { setTimeout(resolve, ms) }) +} -const isPromise = (value: unknown): boolean => - typeof (value as PromiseLike).then === 'function' +function isPromise(value: unknown): boolean { + return typeof (value as PromiseLike).then === 'function' +} export { isPromise, resolveAfter } From 87fc21459265f74bb16460d922f1e1e4fcee970d Mon Sep 17 00:00:00 2001 From: Michael Peyper Date: Fri, 8 Jan 2021 12:13:45 +1100 Subject: [PATCH 2/5] refactor: rename testHook to be testHarness for consistency --- src/dom/pure.ts | 6 +++--- src/helpers/createTestHarness.tsx | 2 +- src/native/pure.ts | 8 ++++---- src/server/pure.ts | 8 ++++---- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/dom/pure.ts b/src/dom/pure.ts index c2f90916..2b2d1f32 100644 --- a/src/dom/pure.ts +++ b/src/dom/pure.ts @@ -13,18 +13,18 @@ function createDomRenderer( ) { const container = document.createElement('div') - const testHook = createTestHarness(rendererProps, wrapper) + const testHarness = createTestHarness(rendererProps, wrapper) return { render(props?: TProps) { document.body.appendChild(container) act(() => { - ReactDOM.render(testHook(props), container) + ReactDOM.render(testHarness(props), container) }) }, rerender(props?: TProps) { act(() => { - ReactDOM.render(testHook(props), container) + ReactDOM.render(testHarness(props), container) }) }, unmount() { diff --git a/src/helpers/createTestHarness.tsx b/src/helpers/createTestHarness.tsx index 9f1465c4..99f9e9ee 100644 --- a/src/helpers/createTestHarness.tsx +++ b/src/helpers/createTestHarness.tsx @@ -29,7 +29,7 @@ function createTestHarness( Wrapper?: WrapperComponent, suspense: boolean = true ) { - return (props?: TProps) => { + return function testHarness(props?: TProps) { let component = if (Wrapper) { component = {component} diff --git a/src/native/pure.ts b/src/native/pure.ts index e9156bc1..b343bb66 100644 --- a/src/native/pure.ts +++ b/src/native/pure.ts @@ -7,22 +7,22 @@ import { createRenderHook, cleanup, addCleanup, removeCleanup } from '../core' import { createTestHarness } from '../helpers/createTestHarness' function createNativeRenderer( - testHookProps: RendererProps, + rendererProps: RendererProps, { wrapper }: RendererOptions ) { let container: ReactTestRenderer - const testHook = createTestHarness(testHookProps, wrapper) + const testHarness = createTestHarness(rendererProps, wrapper) return { render(props?: TProps) { act(() => { - container = create(testHook(props)) + container = create(testHarness(props)) }) }, rerender(props?: TProps) { act(() => { - container.update(testHook(props)) + container.update(testHarness(props)) }) }, unmount() { diff --git a/src/server/pure.ts b/src/server/pure.ts index ec0737b1..ae7f21d0 100644 --- a/src/server/pure.ts +++ b/src/server/pure.ts @@ -14,7 +14,7 @@ function createServerRenderer( ) { const container = document.createElement('div') - const testHook = createTestHarness(rendererProps, wrapper, false) + const testHarness = createTestHarness(rendererProps, wrapper, false) let renderProps: TProps | undefined let hydrated = false @@ -23,7 +23,7 @@ function createServerRenderer( render(props?: TProps) { renderProps = props act(() => { - const serverOutput = ReactDOMServer.renderToString(testHook(props)) + const serverOutput = ReactDOMServer.renderToString(testHarness(props)) container.innerHTML = serverOutput }) }, @@ -33,7 +33,7 @@ function createServerRenderer( } else { document.body.appendChild(container) act(() => { - ReactDOM.hydrate(testHook(renderProps), container) + ReactDOM.hydrate(testHarness(renderProps), container) }) hydrated = true } @@ -43,7 +43,7 @@ function createServerRenderer( throw new Error('You must hydrate the component before you can rerender') } act(() => { - ReactDOM.render(testHook(props), container) + ReactDOM.render(testHarness(props), container) }) }, unmount() { From 111d9cc70339cf8f78e1c500fdeca1f73f5e162a Mon Sep 17 00:00:00 2001 From: Michael Peyper Date: Fri, 8 Jan 2021 12:15:00 +1100 Subject: [PATCH 3/5] refactor: remove default exports for consistency --- src/core/asyncUtils.ts | 2 +- src/core/index.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/core/asyncUtils.ts b/src/core/asyncUtils.ts index 4c2ecf77..d12e468c 100644 --- a/src/core/asyncUtils.ts +++ b/src/core/asyncUtils.ts @@ -95,4 +95,4 @@ function asyncUtils(act: Act, addResolver: (callback: () => void) => void): Asyn } } -export default asyncUtils +export { asyncUtils } diff --git a/src/core/index.ts b/src/core/index.ts index 82cc396d..270f2c7b 100644 --- a/src/core/index.ts +++ b/src/core/index.ts @@ -1,7 +1,7 @@ import { CreateRenderer, Renderer, RenderResult, RenderHook, RenderHookOptions } from '../types' import { ResultContainer } from '../types/internal' -import asyncUtils from './asyncUtils' +import { asyncUtils } from './asyncUtils' import { cleanup, addCleanup, removeCleanup } from './cleanup' function resultContainer(): ResultContainer { From 9944f1484efffa9c85c0eb515690fc4c70f78b86 Mon Sep 17 00:00:00 2001 From: Michael Peyper Date: Fri, 8 Jan 2021 16:50:49 +1100 Subject: [PATCH 4/5] fix: display returned function names correctly in stack traces --- src/core/index.ts | 11 +++++++++-- src/helpers/createTestHarness.tsx | 9 ++++++++- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/src/core/index.ts b/src/core/index.ts index 270f2c7b..4a2079c5 100644 --- a/src/core/index.ts +++ b/src/core/index.ts @@ -43,10 +43,10 @@ function resultContainer(): ResultContainer { function createRenderHook>( createRenderer: CreateRenderer ) { - return function renderHook( + const renderHook = ( callback: (props: TProps) => TResult, options: RenderHookOptions = {} as RenderHookOptions - ): RenderHook { + ): RenderHook => { const { result, setValue, setError, addResolver } = resultContainer() const renderProps = { callback, setValue, setError } let hookProps = options.initialProps @@ -75,6 +75,13 @@ function createRenderHook( Wrapper?: WrapperComponent, suspense: boolean = true ) { - return function testHarness(props?: TProps) { + const testHarness = (props?: TProps) => { let component = if (Wrapper) { component = {component} @@ -39,6 +39,13 @@ function createTestHarness( } return component } + + // If the function name does not get used before it is returned, + // it seems to vanish in nodejs and does not appear in stack traces. + // This dummy usage works around that. + const _name = testHarness.name // eslint-disable-line @typescript-eslint/no-unused-vars + + return testHarness } export { createTestHarness } From efc618b33a1464f88b651a052073ea6f32538fee Mon Sep 17 00:00:00 2001 From: Michael Peyper Date: Fri, 8 Jan 2021 22:32:16 +1100 Subject: [PATCH 5/5] refactor: remove variable assignment in function name workaround Co-authored-by: Jonathan Peyper --- src/core/index.ts | 5 +++-- src/helpers/createTestHarness.tsx | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/core/index.ts b/src/core/index.ts index 4a2079c5..7c4c5c83 100644 --- a/src/core/index.ts +++ b/src/core/index.ts @@ -77,9 +77,10 @@ function createRenderHook( } // If the function name does not get used before it is returned, - // it seems to vanish in nodejs and does not appear in stack traces. + // it's name is removed by babel-plugin-minify-dead-code-elimination. // This dummy usage works around that. - const _name = testHarness.name // eslint-disable-line @typescript-eslint/no-unused-vars + testHarness.name // eslint-disable-line @typescript-eslint/no-unused-expressions return testHarness }