import { Nothing } from "../internal"; declare type AnyFunc = (...args: any[]) => any; declare type PrimitiveType = number | string | boolean; /** Object types that should never be mapped */ declare type AtomicObject = Function | Promise | Date | RegExp; /** * If the lib "ES2015.Collection" is not included in tsconfig.json, * types like ReadonlyArray, WeakMap etc. fall back to `any` (specified nowhere) * or `{}` (from the node types), in both cases entering an infinite recursion in * pattern matching type mappings * This type can be used to cast these types to `void` in these cases. */ export declare type IfAvailable = true | false extends (T extends never ? true : false) ? Fallback : keyof T extends never ? Fallback : T; /** * These should also never be mapped but must be tested after regular Map and * Set */ declare type WeakReferences = IfAvailable> | IfAvailable>; export declare type WritableDraft = { -readonly [K in keyof T]: Draft; }; /** Convert a readonly type into a mutable type, if possible */ export declare type Draft = T extends PrimitiveType ? T : T extends AtomicObject ? T : T extends IfAvailable> ? Map, Draft> : T extends IfAvailable> ? Set> : T extends WeakReferences ? T : T extends object ? WritableDraft : T; /** Convert a mutable type into a readonly type */ export declare type Immutable = T extends PrimitiveType ? T : T extends AtomicObject ? T : T extends IfAvailable> ? ReadonlyMap, Immutable> : T extends IfAvailable> ? ReadonlySet> : T extends WeakReferences ? T : T extends object ? { readonly [K in keyof T]: Immutable; } : T; export interface Patch { op: "replace" | "remove" | "add"; path: (string | number)[]; value?: any; } export declare type PatchListener = (patches: Patch[], inversePatches: Patch[]) => void; /** Converts `nothing` into `undefined` */ declare type FromNothing = T extends Nothing ? undefined : T; /** The inferred return type of `produce` */ export declare type Produced = Return extends void ? Base : Return extends Promise ? Promise> : FromNothing; /** * Utility types */ declare type PatchesTuple = readonly [T, Patch[], Patch[]]; declare type ValidRecipeReturnType = State | void | undefined | (State extends undefined ? Nothing : never); declare type ValidRecipeReturnTypePossiblyPromise = ValidRecipeReturnType | Promise>; declare type PromisifyReturnIfNeeded = ReturnType extends Promise ? Promise : State> : UsePatches extends true ? PatchesTuple : State; /** * Core Producer inference */ declare type InferRecipeFromCurried = Curried extends (base: infer State, ...rest: infer Args) => any ? ReturnType extends State ? (draft: Draft, ...rest: Args) => ValidRecipeReturnType> : never : never; declare type InferInitialStateFromCurried = Curried extends (base: infer State, ...rest: any[]) => any ? State : never; declare type InferCurriedFromRecipe = Recipe extends (draft: infer DraftState, ...args: infer RestArgs) => any ? ReturnType extends ValidRecipeReturnTypePossiblyPromise ? (base: Immutable, ...args: RestArgs) => PromisifyReturnIfNeeded : never : never; declare type InferCurriedFromInitialStateAndRecipe = Recipe extends (draft: Draft, ...rest: infer RestArgs) => ValidRecipeReturnTypePossiblyPromise ? (base?: State | undefined, ...args: RestArgs) => PromisifyReturnIfNeeded : never; /** * The `produce` function takes a value and a "recipe function" (whose * return value often depends on the base state). The recipe function is * free to mutate its first argument however it wants. All mutations are * only ever applied to a __copy__ of the base state. * * Pass only a function to create a "curried producer" which relieves you * from passing the recipe function every time. * * Only plain objects and arrays are made mutable. All other objects are * considered uncopyable. * * Note: This function is __bound__ to its `Immer` instance. * * @param {any} base - the initial state * @param {Function} producer - function that receives a proxy of the base state as first argument and which can be freely modified * @param {Function} patchListener - optional function that will be called with all the patches produced here * @returns {any} a new state, or the initial state if nothing was modified */ export interface IProduce { /** Curried producer that infers the recipe from the curried output function (e.g. when passing to setState) */ (recipe: InferRecipeFromCurried, initialState?: InferInitialStateFromCurried): Curried; /** Curried producer that infers curried from the recipe */ (recipe: Recipe): InferCurriedFromRecipe; /** Curried producer that infers curried from the State generic, which is explicitly passed in. */ (recipe: (state: Draft, initialState: State) => ValidRecipeReturnType): (state?: State) => State; (recipe: (state: Draft, ...args: Args) => ValidRecipeReturnType, initialState: State): (state?: State, ...args: Args) => State; (recipe: (state: Draft) => ValidRecipeReturnType): (state: State) => State; (recipe: (state: Draft, ...args: Args) => ValidRecipeReturnType): (state: State, ...args: Args) => State; /** Curried producer with initial state, infers recipe from initial state */ (recipe: Recipe, initialState: State): InferCurriedFromInitialStateAndRecipe; /** Normal producer */ >(// By using a default inferred D, rather than Draft in the recipe, we can override it. base: Base, recipe: (draft: D) => ValidRecipeReturnType, listener?: PatchListener): Base; /** Promisified normal producer */ >(base: Base, recipe: (draft: D) => Promise>, listener?: PatchListener): Promise; } /** * Like `produce`, but instead of just returning the new state, * a tuple is returned with [nextState, patches, inversePatches] * * Like produce, this function supports currying */ export interface IProduceWithPatches { (recipe: Recipe): InferCurriedFromRecipe; (recipe: Recipe, initialState: State): InferCurriedFromInitialStateAndRecipe; >(base: Base, recipe: (draft: D) => ValidRecipeReturnType, listener?: PatchListener): PatchesTuple; >(base: Base, recipe: (draft: D) => Promise>, listener?: PatchListener): Promise>; } /** * The type for `recipe function` */ export declare type Producer = (draft: Draft) => ValidRecipeReturnType> | Promise>>; export declare function never_used(): void; export {}; //# sourceMappingURL=types-external.d.ts.map