123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113 |
- // @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 inital 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 inital 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 inital 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 inital 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
|