You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
114 lines
4.3 KiB
114 lines
4.3 KiB
2 years ago
|
// @flow
|
||
|
|
||
|
export interface Patch {
|
||
|
op: "replace" | "remove" | "add";
|
||
|
path: (string | number)[];
|
||
|
value?: any;
|
||
|
}
|
||
|
|
||
|
export type PatchListener = (patches: Patch[], inversePatches: Patch[]) => void
|
||
|
|
||
|
type Base = {...} | Array<any>
|
||
|
interface IProduce {
|
||
|
/**
|
||
|
* Immer takes a state, and runs a function against it.
|
||
|
* That function can freely mutate the state, as it will create copies-on-write.
|
||
|
* This means that the original state will stay unchanged, and once the function finishes, the modified state is returned.
|
||
|
*
|
||
|
* If the first argument is a function, this is interpreted as the recipe, and will create a curried function that will execute the recipe
|
||
|
* any time it is called with the current state.
|
||
|
*
|
||
|
* @param currentState - the state to start with
|
||
|
* @param recipe - function that receives a proxy of the current state as first argument and which can be freely modified
|
||
|
* @param initialState - if a curried function is created and this argument was given, it will be used as fallback if the curried function is called with a state of undefined
|
||
|
* @returns The next state: a new state, or the current state if nothing was modified
|
||
|
*/
|
||
|
<S: Base>(
|
||
|
currentState: S,
|
||
|
recipe: (draftState: S) => S | void,
|
||
|
patchListener?: PatchListener
|
||
|
): S;
|
||
|
// curried invocations with initial state
|
||
|
<S: Base, A = void, B = void, C = void>(
|
||
|
recipe: (draftState: S, a: A, b: B, c: C, ...extraArgs: any[]) => S | void,
|
||
|
initialState: S
|
||
|
): (currentState: S | void, a: A, b: B, c: C, ...extraArgs: any[]) => S;
|
||
|
// curried invocations without initial state
|
||
|
<S: Base, A = void, B = void, C = void>(
|
||
|
recipe: (draftState: S, a: A, b: B, c: C, ...extraArgs: any[]) => S | void
|
||
|
): (currentState: S, a: A, b: B, c: C, ...extraArgs: any[]) => S;
|
||
|
}
|
||
|
|
||
|
interface IProduceWithPatches {
|
||
|
/**
|
||
|
* Like `produce`, but instead of just returning the new state,
|
||
|
* a tuple is returned with [nextState, patches, inversePatches]
|
||
|
*
|
||
|
* Like produce, this function supports currying
|
||
|
*/
|
||
|
<S: Base>(
|
||
|
currentState: S,
|
||
|
recipe: (draftState: S) => S | void
|
||
|
): [S, Patch[], Patch[]];
|
||
|
// curried invocations with initial state
|
||
|
<S: Base, A = void, B = void, C = void>(
|
||
|
recipe: (draftState: S, a: A, b: B, c: C, ...extraArgs: any[]) => S | void,
|
||
|
initialState: S
|
||
|
): (currentState: S | void, a: A, b: B, c: C, ...extraArgs: any[]) => [S, Patch[], Patch[]];
|
||
|
// curried invocations without initial state
|
||
|
<S: Base, A = void, B = void, C = void>(
|
||
|
recipe: (draftState: S, a: A, b: B, c: C, ...extraArgs: any[]) => S | void
|
||
|
): (currentState: S, a: A, b: B, c: C, ...extraArgs: any[]) => [S, Patch[], Patch[]];
|
||
|
}
|
||
|
|
||
|
declare export var produce: IProduce
|
||
|
declare export default IProduce
|
||
|
|
||
|
declare export var produceWithPatches: IProduceWithPatches
|
||
|
|
||
|
declare export var nothing: typeof undefined
|
||
|
|
||
|
declare export var immerable: Symbol
|
||
|
|
||
|
/**
|
||
|
* Automatically freezes any state trees generated by immer.
|
||
|
* This protects against accidental modifications of the state tree outside of an immer function.
|
||
|
* This comes with a performance impact, so it is recommended to disable this option in production.
|
||
|
* By default it is turned on during local development, and turned off in production.
|
||
|
*/
|
||
|
declare export function setAutoFreeze(autoFreeze: boolean): void
|
||
|
|
||
|
/**
|
||
|
* Manually override whether proxies should be used.
|
||
|
* By default done by using feature detection
|
||
|
*/
|
||
|
declare export function setUseProxies(useProxies: boolean): void
|
||
|
|
||
|
declare export function applyPatches<S>(state: S, patches: Patch[]): S
|
||
|
|
||
|
declare export function original<S>(value: S): S
|
||
|
|
||
|
declare export function current<S>(value: S): S
|
||
|
|
||
|
declare export function isDraft(value: any): boolean
|
||
|
|
||
|
/**
|
||
|
* Creates a mutable draft from an (immutable) object / array.
|
||
|
* The draft can be modified until `finishDraft` is called
|
||
|
*/
|
||
|
declare export function createDraft<T>(base: T): T
|
||
|
|
||
|
/**
|
||
|
* Given a draft that was created using `createDraft`,
|
||
|
* finalizes the draft into a new immutable object.
|
||
|
* Optionally a patch-listener can be provided to gather the patches that are needed to construct the object.
|
||
|
*/
|
||
|
declare export function finishDraft<T>(base: T, listener?: PatchListener): T
|
||
|
|
||
|
declare export function enableES5(): void
|
||
|
declare export function enableMapSet(): void
|
||
|
declare export function enablePatches(): void
|
||
|
declare export function enableAllPlugins(): void
|
||
|
|
||
|
declare export function freeze<T>(obj: T, freeze?: boolean): T
|