diff --git a/src/context.ts b/src/context.ts index fe0d9412db..f27260b032 100644 --- a/src/context.ts +++ b/src/context.ts @@ -95,10 +95,24 @@ function createContext< ) } + let didWarnAboutStoreApiDeprecation = false + return { Provider, useStore, - useStoreApi, + /** + * @deprecated `useStoreApi` is renamed to `useStoreRef`, `useStoreApi` will be removed in next major + */ + useStoreApi: (...a: Parameters) => { + if (!didWarnAboutStoreApiDeprecation) { + console.warn( + '`useStoreApi` is renamed to `useStoreRef`, `useStoreApi` will be removed in next major' + ) + didWarnAboutStoreApiDeprecation = true + } + return useStoreApi(...a) + }, + useStoreRef: useStoreApi, } } diff --git a/src/middleware/devtools.ts b/src/middleware/devtools.ts index bd69eac0a8..db35626c8e 100644 --- a/src/middleware/devtools.ts +++ b/src/middleware/devtools.ts @@ -41,37 +41,92 @@ export type StoreApiWithDevtools = StoreApi & { devtools?: DevtoolsType } -export const devtools = - < - S extends State, - CustomSetState extends SetState, - CustomGetState extends GetState, - CustomStoreApi extends StoreApi - >( - fn: (set: NamedSet, get: CustomGetState, api: CustomStoreApi) => S, - options?: - | string - | { - name?: string - anonymousActionType?: string - serialize?: { - options: - | boolean - | { - date?: boolean - regex?: boolean - undefined?: boolean - nan?: boolean - infinity?: boolean - error?: boolean - symbol?: boolean - map?: boolean - set?: boolean - } +/** + * @deprecated Passing `name` as directly will be not allowed in next major. + * Pass the `name` in an object `{ name: ... }` instead + */ +export function devtools< + S extends State, + CustomSetState extends SetState, + CustomGetState extends GetState, + CustomStoreApi extends StoreApi +>( + fn: (set: NamedSet, get: CustomGetState, api: CustomStoreApi) => S, + options?: string +): ( + set: CustomSetState, + get: CustomGetState, + api: CustomStoreApi & + StoreApiWithDevtools & { + dispatch?: unknown + dispatchFromDevtools?: boolean + } +) => S +export function devtools< + S extends State, + CustomSetState extends SetState, + CustomGetState extends GetState, + CustomStoreApi extends StoreApi +>( + fn: (set: NamedSet, get: CustomGetState, api: CustomStoreApi) => S, + options?: { + name?: string + anonymousActionType?: string + serialize?: { + options: + | boolean + | { + date?: boolean + regex?: boolean + undefined?: boolean + nan?: boolean + infinity?: boolean + error?: boolean + symbol?: boolean + map?: boolean + set?: boolean } + } + } +): ( + set: CustomSetState, + get: CustomGetState, + api: CustomStoreApi & + StoreApiWithDevtools & { + dispatch?: unknown + dispatchFromDevtools?: boolean + } +) => S +export function devtools< + S extends State, + CustomSetState extends SetState, + CustomGetState extends GetState, + CustomStoreApi extends StoreApi +>( + fn: (set: NamedSet, get: CustomGetState, api: CustomStoreApi) => S, + options?: + | string + | { + name?: string + anonymousActionType?: string + serialize?: { + options: + | boolean + | { + date?: boolean + regex?: boolean + undefined?: boolean + nan?: boolean + infinity?: boolean + error?: boolean + symbol?: boolean + map?: boolean + set?: boolean + } } - ) => - ( + } +) { + return ( set: CustomSetState, get: CustomGetState, api: CustomStoreApi & @@ -80,6 +135,14 @@ export const devtools = dispatchFromDevtools?: boolean } ): S => { + let didWarnAboutNameDeprecation = false + if (typeof options === 'string' && !didWarnAboutNameDeprecation) { + console.warn( + '[zustand devtools middleware]: passing `name` as directly will be not allowed in next major' + + 'pass the `name` in an object `{ name: ... }` instead' + ) + didWarnAboutNameDeprecation = true + } const devtoolsOptions = options === undefined ? { name: undefined, anonymousActionType: undefined } @@ -262,6 +325,7 @@ export const devtools = return initialState } +} const parseJsonThen = (stringified: string, f: (parsed: T) => void) => { let parsed: T | undefined diff --git a/src/vanilla.ts b/src/vanilla.ts index 027a66f553..9396fca67d 100644 --- a/src/vanilla.ts +++ b/src/vanilla.ts @@ -1,6 +1,18 @@ +/** + * @deprecated `State` is renamed to `UnknownState`, + * `State` will be removed in next major + */ export type State = object + +export type UnknownState = object + // types inspired by setState from React, see: // https://github.com/DefinitelyTyped/DefinitelyTyped/blob/6c49e45842358ba59a508e13130791989911430d/types/react/v16/index.d.ts#L489-L495 +/** + * @deprecated Use the builtin `Partial` instead of `PartialState`. + * Additionally turn on `--exactOptionalPropertyTypes` tsc flag. + * `PartialState` will be removed in next major + */ export type PartialState< T extends State, K1 extends keyof T = keyof T, @@ -10,10 +22,35 @@ export type PartialState< > = | (Pick | Pick | Pick | Pick | T) | ((state: T) => Pick | Pick | Pick | Pick | T) + +/** + * @deprecated Use `(t: T) => U` instead of `StateSelector`. + * `StateSelector` will be removed in next major. + */ export type StateSelector = (state: T) => U + +/** + * @deprecated Use `(a: T, b: T) => boolean` instead of `EqualityChecker. + * `EqualityChecker` will be removed in next major. + */ export type EqualityChecker = (state: T, newState: T) => boolean + +/** + * @deprecated Use `(state: T, prevState: T) => void` instead of `StateListener`. + * `StateListener` will be removed in next major. + */ export type StateListener = (state: T, previousState: T) => void + +/** + * @deprecated Use `(slice: T, prevSlice: T) => void` instead of `StateSliceListener`. + * `StateSliceListener` will be removed in next major. + */ export type StateSliceListener = (slice: T, previousSlice: T) => void + +/** + * @deprecated Use `Store['subscribe']` instead of `Subscribe`. + * `Subscribe` will be removed in next major. + */ export type Subscribe = { (listener: StateListener): () => void /** @@ -26,6 +63,10 @@ export type Subscribe = { ): () => void } +/** + * @deprecated Use `Store['setState']` instead of `SetState` + * `SetState` will be removed in next major. + */ export type SetState = { < K1 extends keyof T, @@ -37,14 +78,41 @@ export type SetState = { replace?: boolean ): void } + +/** + * @deprecated Use `() => T` or `Store['getState']` instead of `GetState` + * `GetState` will be removed in next major. + */ export type GetState = () => T + +/** + * @deprecated Use `() => void` or `Store['destroy']` instead of `Destroy`. + * `Destroy` will be removed in next major. + */ export type Destroy = () => void + +/** + * @deprecated `StoreApi` has been renamed to `Store` + * `StoreApi` will be removed in next major. + */ export type StoreApi = { setState: SetState getState: GetState subscribe: Subscribe destroy: Destroy } + +export type Store = { + setState: SetState + getState: GetState + subscribe: Subscribe + destroy: Destroy +} + +/** + * @deprecated `StateCreator` has been renamed to `StoreInitializer`. + * `StateCreator` will be removed in next major. + */ export type StateCreator< T extends State, CustomSetState = SetState, @@ -52,6 +120,13 @@ export type StateCreator< CustomStoreApi extends StoreApi = StoreApi > = (set: CustomSetState, get: CustomGetState, api: CustomStoreApi) => T +export type StoreInitializer< + T extends State, + CustomSetState = SetState, + CustomGetState = GetState, + CustomStoreApi extends StoreApi = StoreApi +> = (set: CustomSetState, get: CustomGetState, api: CustomStoreApi) => T + function createStore< TState extends State, CustomSetState,