@quilted/react-testing
Advanced tools
Comparing version 0.3.3 to 0.3.4
@@ -301,2 +301,3 @@ "use strict"; | ||
value: ({ | ||
options: customizeOptions, | ||
context: createAdditionalContext = defaultContext, | ||
@@ -307,3 +308,3 @@ actions: createAdditionalActions = defaultActions, | ||
}) => { | ||
return createMount({ | ||
const extendedMount = createMount({ | ||
context: options => ({ ...createContext(options), | ||
@@ -324,2 +325,5 @@ ...createAdditionalContext(options) | ||
}); | ||
return customizeOptions ? (element, options = {}) => extendedMount(element, { ...options, | ||
...customizeOptions(options) | ||
}) : extendedMount; | ||
} | ||
@@ -326,0 +330,0 @@ }); |
import type { ReactElement } from 'react'; | ||
import type { Node as BaseNode, RootNode, PlainObject, EmptyObject } from './types'; | ||
import type { Node as BaseNode, RootNode, PlainObject, EmptyObject, EraseIfEmpty, IfEmptyObject } from './types'; | ||
interface BaseNodeCreationOptions<T, Extensions extends PlainObject> { | ||
@@ -35,6 +35,12 @@ props: T; | ||
} | ||
export declare type MountOptionsOverrideOption<CreateMountOptions extends PlainObject = EmptyObject, MountOptions extends PlainObject = EmptyObject> = MountOptions extends EmptyObject ? { | ||
options?: never; | ||
} : { | ||
options?(current: MountOptions & EraseIfEmpty<CreateMountOptions>): Partial<MountOptions>; | ||
}; | ||
declare type CustomMountOptions<MountOptions extends PlainObject = EmptyObject, CreateContext extends PlainObject = EmptyObject, Context extends PlainObject = CreateContext, CreateActions extends PlainObject = EmptyObject, Actions extends PlainObject = EmptyObject, Extensions extends PlainObject = EmptyObject, Async extends boolean = false> = RenderOption<MountOptions, Context> & ContextOption<MountOptions, CreateContext> & ActionsOption<MountOptions, Context, CreateActions, Extensions> & AfterMountOption<MountOptions, Context, Actions, Extensions, Async>; | ||
declare type CustomMountExtendOptions<CreateMountOptions extends PlainObject = EmptyObject, MountOptions extends PlainObject = EmptyObject, CreateContext extends PlainObject = EmptyObject, Context extends PlainObject = CreateContext, CreateActions extends PlainObject = EmptyObject, Actions extends PlainObject = EmptyObject, Extensions extends PlainObject = EmptyObject, Async extends boolean = false> = CustomMountOptions<IfEmptyObject<MountOptions, CreateMountOptions, MountOptions & EraseIfEmpty<CreateMountOptions>>, CreateContext, Context, CreateActions, Actions, Extensions, Async> & MountOptionsOverrideOption<CreateMountOptions, MountOptions>; | ||
export interface CustomMount<MountOptions extends PlainObject, Context extends PlainObject, Actions extends PlainObject, Extensions extends PlainObject, Async extends boolean> { | ||
<Props>(element: ReactElement<any>, options?: MountOptions): CustomMountResult<Props, Context, Actions, Extensions, Async>; | ||
extend<AdditionalMountOptions extends PlainObject = EmptyObject, AdditionalContext extends PlainObject = EmptyObject, AdditionalActions extends PlainObject = EmptyObject, AdditionalAsync extends boolean = false>(options: CustomMountOptions<MountOptions & AdditionalMountOptions, AdditionalContext, Context & AdditionalContext, AdditionalActions, Actions & AdditionalActions, Extensions, AdditionalAsync>): CustomMount<MountOptions & AdditionalMountOptions, Context & AdditionalContext, Actions & AdditionalActions, Extensions, AdditionalAsync extends true ? AdditionalAsync : Async>; | ||
extend<AdditionalMountOptions extends PlainObject = EmptyObject, AdditionalContext extends PlainObject = EmptyObject, AdditionalActions extends PlainObject = EmptyObject, AdditionalAsync extends boolean = false>(options: CustomMountExtendOptions<AdditionalMountOptions, IfEmptyObject<MountOptions, AdditionalMountOptions, MountOptions & EraseIfEmpty<AdditionalMountOptions>>, AdditionalContext, IfEmptyObject<Context, AdditionalContext, Context & EraseIfEmpty<AdditionalContext>>, AdditionalActions, IfEmptyObject<Actions, AdditionalActions, Actions & EraseIfEmpty<AdditionalActions>>, Extensions, AdditionalAsync>): CustomMount<IfEmptyObject<MountOptions, AdditionalMountOptions, MountOptions & EraseIfEmpty<AdditionalMountOptions>>, IfEmptyObject<Context, AdditionalContext, Context & EraseIfEmpty<AdditionalContext>>, IfEmptyObject<Actions, AdditionalActions, Actions & EraseIfEmpty<AdditionalActions>>, Extensions, AdditionalAsync extends true ? AdditionalAsync : Async>; | ||
} | ||
@@ -41,0 +47,0 @@ declare type CustomMountResult<Props, Context extends PlainObject, Actions extends PlainObject, Extensions extends PlainObject, Async extends boolean> = Async extends true ? Promise<RootNode<Props, Context, Actions, Extensions>> : RootNode<Props, Context, Actions, Extensions>; |
@@ -227,4 +227,4 @@ "use strict"; | ||
writable: false, | ||
value: ({ context: createAdditionalContext = defaultContext, actions: createAdditionalActions = defaultActions, render: additionalRender = defaultRender, afterMount: additionalAfterMount = noop, }) => { | ||
return createMount({ | ||
value: ({ options: customizeOptions, context: createAdditionalContext = defaultContext, actions: createAdditionalActions = defaultActions, render: additionalRender = defaultRender, afterMount: additionalAfterMount = noop, }) => { | ||
const extendedMount = createMount({ | ||
context: (options) => (Object.assign(Object.assign({}, createContext(options)), createAdditionalContext(options))), | ||
@@ -239,2 +239,5 @@ actions: (root, options) => (Object.assign(Object.assign({}, createActions(root, options)), createAdditionalActions(root, options))), | ||
}); | ||
return customizeOptions | ||
? (element, options = {}) => extendedMount(element, Object.assign(Object.assign({}, options), customizeOptions(options))) | ||
: extendedMount; | ||
}, | ||
@@ -241,0 +244,0 @@ }); |
import type { ComponentType, ComponentPropsWithoutRef, HTMLAttributes, Context } from 'react'; | ||
export declare type PlainObject = Record<string, any>; | ||
export declare type EmptyObject = Record<string, never>; | ||
export declare type IfEmptyObject<T, If, Else> = T extends EmptyObject ? If : Else; | ||
export declare type EraseIfEmpty<T> = T extends EmptyObject ? {} : T; | ||
export declare type PropsFor<T extends string | ComponentType<any>> = T extends string ? T extends keyof JSX.IntrinsicElements ? JSX.IntrinsicElements[T] : T extends ComponentType<any> ? ComponentPropsWithoutRef<T> : HTMLAttributes<T> : T extends ComponentType<any> ? ComponentPropsWithoutRef<T> : never; | ||
@@ -5,0 +7,0 @@ export declare type FunctionKeys<T> = { |
{ | ||
"name": "@quilted/react-testing", | ||
"version": "0.3.3", | ||
"version": "0.3.4", | ||
"description": "", | ||
@@ -74,3 +74,3 @@ "publishConfig": { | ||
}, | ||
"gitHead": "dd6db17b6677941bf886af45476d3bcd4c452f9f" | ||
"gitHead": "cf345260b53b614c4adb01ad092d31c100348b5c" | ||
} |
@@ -300,2 +300,4 @@ # `@quilted/react-testing` | ||
Additionally, a new option is available for `extend()`: you can provide an `options` callback that receives as an argument the merged set of options, and must return a partial subset of those options to use as overrides. This can be used to extend a mount function and provide default values for some options that do not otherwise have defaults, or to customize base options on the basis of your newly-added options. | ||
```tsx | ||
@@ -302,0 +304,0 @@ import {createMount} from '@quilted/react-testing'; |
@@ -10,2 +10,5 @@ import type { | ||
export type EmptyObject = Record<string, never>; | ||
export type IfEmptyObject<T, If, Else> = T extends EmptyObject ? If : Else; | ||
// eslint-disable-next-line @typescript-eslint/ban-types | ||
export type EraseIfEmpty<T> = T extends EmptyObject ? {} : T; | ||
@@ -12,0 +15,0 @@ export type PropsFor<T extends string | ComponentType<any>> = T extends string |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
474650
5435
790