Merge branch 'main' into v5

This commit is contained in:
daishi 2023-11-03 09:00:02 +09:00
commit aaa5c21fc5
3 changed files with 115 additions and 27 deletions

View File

@ -176,7 +176,7 @@ const createUncurried = <T>(stateCreator: zustand.StateCreator<T>) => {
}
// when creating a store, we get its initial state, create a reset function and add it in the set
export const create = (<T>() => {
export const create = (<T>(stateCreator: zustand.StateCreator<T>) => {
console.log('zustand create mock')
// to support curried version of create

View File

@ -630,6 +630,54 @@ export const useBoundStore = create(
)
```
If you're using a type that JSON.stringify() doesn't support, you'll need to write your own serialization/deserialization code. However, if this is tedious, you can use third-party libraries to serialize and deserialize different types of data.
For example, [Superjson](https://github.com/blitz-js/superjson) can serialize data along with its type, allowing the data to be parsed back to its original type upon deserialization
```ts
import superjson from 'superjson' // can use anything: serialize-javascript, devalue, etc.
import { PersistStorage } from 'zustand/middleware'
interface BearState {
bear: Map<string, string>
fish: Set<string>
time: Date
query: RegExp
}
const storage: PersistStorage<BearState> = {
getItem: (name) => {
const str = localStorage.getItem(name)
if (!str) return null
return superjson.parse(str)
},
setItem: (name, value) => {
localStorage.setItem(name, superjson.stringify(value))
},
removeItem: (name) => localStorage.removeItem(name),
}
const initialState: BearState = {
bear: new Map(),
fish: new Set(),
time: new Date(),
query: new RegExp(''),
}
export const useBearStore = create<BearState>()(
persist(
(set) => ({
...initialState,
// ...
}),
{
name: 'food-storage',
storage,
}
)
)
```
### How can I rehydrate on storage event
You can use the Persist API to create your own implementation,

View File

@ -1,7 +1,7 @@
{
"name": "zustand",
"private": true,
"version": "4.4.5",
"version": "4.4.6",
"publishConfig": {
"tag": "next"
},
@ -29,7 +29,7 @@
"default": "./esm/index.mjs"
},
"module": {
"types": "./index.d.ts",
"types": "./esm/index.d.ts",
"default": "./esm/index.js"
},
"default": {
@ -38,76 +38,116 @@
}
},
"./vanilla": {
"types": "./vanilla.d.ts",
"import": {
"types": "./esm/vanilla.d.mts",
"default": "./esm/vanilla.mjs"
},
"module": "./esm/vanilla.js",
"default": "./vanilla.js"
"module": {
"types": "./esm/vanilla.d.ts",
"default": "./esm/vanilla.js"
},
"default": {
"types": "./vanilla.d.ts",
"default": "./vanilla.js"
}
},
"./middleware": {
"types": "./middleware.d.ts",
"import": {
"types": "./esm/middleware.d.mts",
"default": "./esm/middleware.mjs"
},
"module": "./esm/middleware.js",
"default": "./middleware.js"
"module": {
"types": "./esm/middleware.d.ts",
"default": "./esm/middleware.js"
},
"default": {
"types": "./middleware.d.ts",
"default": "./middleware.js"
}
},
"./middleware/immer": {
"types": "./middleware/immer.d.ts",
"import": {
"types": "./esm/middleware/immer.d.mts",
"default": "./esm/middleware/immer.mjs"
},
"module": "./esm/middleware/immer.js",
"default": "./middleware/immer.js"
"module": {
"types": "./esm/middleware/immer.d.ts",
"default": "./esm/middleware/immer.js"
},
"default": {
"types": "./middleware/immer.d.ts",
"default": "./middleware/immer.js"
}
},
"./shallow": {
"types": "./shallow.d.ts",
"import": {
"types": "./esm/shallow.d.mts",
"default": "./esm/shallow.mjs"
},
"module": "./esm/shallow.js",
"default": "./shallow.js"
"module": {
"types": "./esm/shallow.d.ts",
"default": "./esm/shallow.js"
},
"default": {
"types": "./shallow.d.ts",
"default": "./shallow.js"
}
},
"./vanilla/shallow": {
"types": "./vanilla/shallow.d.ts",
"import": {
"types": "./esm/vanilla/shallow.d.mts",
"default": "./esm/vanilla/shallow.mjs"
},
"module": "./esm/vanilla/shallow.js",
"default": "./vanilla/shallow.js"
"module": {
"types": "./esm/vanilla/shallow.d.ts",
"default": "./esm/vanilla/shallow.js"
},
"default": {
"types": "./vanilla/shallow.d.ts",
"default": "./vanilla/shallow.js"
}
},
"./react/shallow": {
"types": "./react/shallow.d.ts",
"import": {
"types": "./esm/react/shallow.d.mts",
"default": "./esm/react/shallow.mjs"
},
"module": "./esm/react/shallow.js",
"default": "./react/shallow.js"
"module": {
"types": "./esm/react/shallow.d.ts",
"default": "./esm/react/shallow.js"
},
"default": {
"types": "./react/shallow.d.ts",
"default": "./react/shallow.js"
}
},
"./traditional": {
"types": "./traditional.d.ts",
"import": {
"types": "./esm/traditional.d.mts",
"default": "./esm/traditional.mjs"
},
"module": "./esm/traditional.js",
"default": "./traditional.js"
"module": {
"types": "./esm/traditional.d.ts",
"default": "./esm/traditional.js"
},
"default": {
"types": "./traditional.d.ts",
"default": "./traditional.js"
}
},
"./context": {
"types": "./context.d.ts",
"import": {
"types": "./esm/context.d.mts",
"default": "./esm/context.mjs"
},
"module": "./esm/context.js",
"default": "./context.js"
"module": {
"types": "./esm/context.d.ts",
"default": "./esm/context.js"
},
"default": {
"types": "./context.d.ts",
"default": "./context.js"
}
}
},
"sideEffects": false,