* refactor(middleware): rename argument name 'a' to 'arg' or 'args'
* refactor(middleware): rename argument name 'f' to 'fn'
* refactor(middleware/devtools.ts): rename argument name 'arg0' to 'args'
* make ExtractState public and move it to vanilla
* add docs on the matter
* Update vanilla.ts
---------
Co-authored-by: Daishi Kato <dai-shi@users.noreply.github.com>
* fix: add an inferred generic U to CreateStoreImpl
* fix: add inferred generic U variables to both Devtools and DevtoolsImpl
* test: add tests for issue #2700
* revert impl types
* code styling
---------
Co-authored-by: daishi <daishi@axlight.com>
* alternate implementation for shallow
* test with pure iterable
* refactor
* another refactor
---------
Co-authored-by: Danilo Britto <dbritto.dev@gmail.com>
* fix(immer): tweak type inference to base `setState` type off of store `setState` instead of `getState`
* fix(immer): instead, infer type directly from StoreApi<T>["setState"]
* fix(immer): instead of using `StoreApi`, extract from A2 the non-functional component of state
* docs: add comment describing why it is not derived from `A1`
* test: add example middleware that modifies getState w/o setState
* fix: add assertion for inner `set` and `get` types
---------
Co-authored-by: Daishi Kato <dai-shi@users.noreply.github.com>
* prepare for the next major version
* [v5] breaking: drop default exports (#2238)
* fix: drop default exports for v5
* chore: remove default from cjs build
* refactor: export shallow in v5
* fix: remove `addModuleExport` option for cjs.
* [v5] breaking: drop deprecated features (#2235)
* fix: remove deprecated v4 features
* chore(build): remove context
* docs(typescript): remove deprecated equals api
* docs(persist): remove old persist api
* chore: run yarn prettier on typescript docs
* Discard changes to docs/guides/typescript.md
* Discard changes to docs/integrations/persisting-store-data.md
* Discard changes to tests/shallow.test.tsx
* Discard changes to tests/vanilla/subscribe.test.tsx
* [v5] breaking: make React 18 as minimal requirement (#2236)
* fix: update package.json to require react 18+
* chore: update github actions to test on react 18+
* chore: remove devtools-skip hack from actions
* chore(test): remove CI-SKIP from devtools tests
* [v5] breaking: make use-sync-external-store an optional peer dependency (#2237)
* chore: make use-sync-external-store optional peerDep
* fix: use correct versions in package.json
* [v5] breaking: require TypeScript 4.5 and update tests (#2257)
* breaking(types): TS requirement
* wip: latest only
* wip: latest only 2
* drop ts <4.4
* wip: do not skip lib checkes
* use latest node types
* drop ts 4.4
* [v5]: drop "module" condition (#2270)
* Update package json in order to remove module
* Update rollup config in order to remove module config
* Update patch esm script
* Update package json to general exports and update node version (#2272)
* [v5]: drop UMD/SystemJS builds (#2287)
* Update rollup config in order to drop system js and umd builds
* Update packages
* Clean up files
* Update rollup config
* Update gh workflows
* Minor fixes
* Minor fixes
* Minor fixes
* Minor fixes
* Testing
* Minor changes
* Minor fixes
* remove `WithReact` type (#2300)
* 5.0.0-alpha.0
* [v5]: do not depend on use-sync-external-store (#2301)
* [v5]: do not depend on use-sync-external-store
* memo get(server)snapshot
* 5.0.0-alpha.1
* [v5]: refactor useMemoSelector (#2302)
* [v5]: refactor useMemoSelector
* add a test
* Revert "[v5]: refactor useMemoSelector"
This reverts commit b3c8b15586a270d12c335e566975021adf86c815.
* Revert "Revert "[v5]: refactor useMemoSelector""
This reverts commit 3c47301d23e18dffb7d72df36595f83570d15d08.
* [v5]: separate react entry point (#2303)
* 5.0.0-alpha.2
* 5.0.0-alpha.3
* refactor: Switch to Object.hasOwn (#2365)
* [v5] drop es5 (#2380)
* update yarn lock
* 5.0.0-alpha.4
* [v5]: follow React "standard" way with breaking behavioral change (#2395)
* [v5]: follow React "standard" way with breaking behavioral change
* add test
* 5.0.0-alpha.5
* [v5] Rewrite shallow to support iterables (#2427)
* [v5] fix rollup config for cjs (#2433)
* 5.0.0-alpha.6
* no production build test
* recover types that are dropped in #2462
* remove unused replacement
* [v5] Remove Devtools warning (#2466)
* chore: remove devtools extension warning
* docs: add devtools link to readme
* chore: remove unused test
* chrome: remove unused tests
* chore: remove unused test
* Revert "chore: remove unused test"
This reverts commit 0fa2a75f4936d960f703bf19e8f3505962cd628e.
* update test name
* update pnpm lock
* fix merge main
* add migration guide
* fix typos
* 5.0.0-beta.0
* update migration doc
* fix merge main
* fix merge main (prettier)
* 5.0.0-beta.1
* fix(types)!: require complete state if `setState`'s `replace` flag is set (#2580)
* fix(types): require complete state if `setState`'s `replace` flag is set
* switch to variant 2
* fix type errors
* update setState types for devtools and immer
* make devtools setState non-generic
* add migration guide
* merge migration guides
* run prettier
* Update tests/middlewareTypes.test.tsx
---------
Co-authored-by: Daishi Kato <dai-shi@users.noreply.github.com>
Co-authored-by: daishi <daishi@axlight.com>
* 5.0.0-beta.2
* move v5 migration doc
* fix ci
* missing commmit
* remove unused rule exclusion
* comment about react compiler
* revert eslint config
---------
Co-authored-by: Charles Kornoelje <33156025+charkour@users.noreply.github.com>
Co-authored-by: Danilo Britto <dbritto.dev@gmail.com>
Co-authored-by: Ekin Dursun <ekindursun@gmail.com>
Co-authored-by: Simon Farshid <simon.farshid@outlook.com>
Right now, we're requiring new `StateStorage` implementations to forcefully return `void` from inside `setItem` and `removeItem`.
When using a library that returns the set value for `setItem` or `removeItem`, therefore returning a `string`, it causes Typescript to fail, requiring some weird workarounds.
For example, when using `localforage` (https://github.com/localForage/localForage) one needs to do what we describe below. Notice the `void` keyword.
```typescript
const storage: StateStorage = {
...localForage,
setItem: void localForage.setItem.bind(localForage)
}
```
Another, longer, alternative is
```typescript
const storage: StateStorage = {
...localForage,
// Curly braces are required because we need to "return `void`"
setItem: (name, value) => {
localStorage.setItem(name, value)
}
}
```
By changing the type implementation to ignore types - using unknown - we can simply use `localforage` - and similar libraries - as if we were using `window.localStorage`
* feat(react): implement getServerState by closing over the defaultState
serverState will be used by react on the first client render; this should avoid hydration mismatches when combined with the persist middleware, which can change the state between the SSR and the first CSR
* define getServerState in vanilla.ts
* feat: implement getServerResult in persist middleware
this avoids hydration errors when state is restored from e.g. localstorage synchronously
* feat: capture initialState for getServerState in react
this avoids hydration mismatches when updates happen to the store state between ssr and csr
* refactor: revert changes to oldImpl
* fix: make selector default to identity function
if we default to `api.getState`, we will always read the client snapshot if there is no selector passed. An identity function returns its argument, which is either the snapshot (api.getState) or the server snapshot (api.getServerState)
* define getInitialState in vanilla
* revert WithReact
* fix them
* fix test
* oops, fix another test too
* forgot to use identity
* test: add a test for hydration errors
* fix(readme): imply getInitialState is a public api
---------
Co-authored-by: daishi <daishi@axlight.com>
* fix: unexpected null state update behavior
* chore: lint code
* test: add test for setting state to null
---------
Co-authored-by: wulimao <tao@trlab.com>
* feat: add support for Maps to persist middleware
* refactor: change createJsonStorage to accept custom reviver/replacer
* refactor: map support code review
* add tests ensuring that onRehydrateStorage is always passed the latest state
* fix persist to always pass latest state to onRehydrateStorage and onHydrate listeners
* document that tests for onHydrate during first hydration are not possible
* ensure state updates during onHydrate are reflected in onRehydrateStorage callback
* undo modifications to persist's old implementation
* document a potential issue with stale state being passed to 'onRehydrateStorage'
* fix an issue where state updates during 'onRehydrateStorage' were overwritten with sync storage reads
* add tests ensuring updates during the 'onRehydrateStorage' hook are handled correctly
* Update tests/persistSync.test.tsx
* Apply suggestions from code review
---------
Co-authored-by: Daishi Kato <dai-shi@users.noreply.github.com>