From: Eduardo San Martin Morote Date: Mon, 20 Jan 2020 16:40:02 +0000 (+0100) Subject: feat: allow empty state option to make it easy to group stores X-Git-Tag: 0.0.5~9 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=810e0f0a1d4439438c68df711960d3b7453c0460;p=thirdparty%2Fvuejs%2Fpinia.git feat: allow empty state option to make it easy to group stores --- diff --git a/README.md b/README.md index 4b250cb5..7e35b884 100644 --- a/README.md +++ b/README.md @@ -287,7 +287,6 @@ import { useCartStore } from './cart' export const useSharedStore = createStore({ id: 'shared', - state: () => ({}), getters: { summary() { const user = useUserStore() diff --git a/__tests__/store.spec.ts b/__tests__/store.spec.ts index e2048f70..a0570ed3 100644 --- a/__tests__/store.spec.ts +++ b/__tests__/store.spec.ts @@ -29,6 +29,29 @@ describe('Store', () => { }) }) + it('can be reset', () => { + const store = useStore() + store.state.a = false + const spy = jest.fn() + store.subscribe(spy) + store.reset() + store.state.nested.foo = 'bar' + expect(spy).not.toHaveBeenCalled() + expect(store.state).toEqual({ + a: true, + nested: { + foo: 'bar', + a: { b: 'string' }, + }, + }) + }) + + it('can create an empty state if no state option is provided', () => { + const store = createStore({ id: 'some' })() + + expect(store.state).toEqual({}) + }) + it('can hydrate the state', () => { setActiveReq({}) const useStore = createStore({ @@ -93,4 +116,39 @@ describe('Store', () => { store.state.nested.a.b = 'hey' expect(store2.state.nested.a.b).toBe('string') }) + + it('subscribe to changes', () => { + const store = useStore() + const spy = jest.fn() + store.subscribe(spy) + + store.state.a = false + + expect(spy).toHaveBeenCalledWith( + { + payload: {}, + storeName: 'main', + type: expect.stringContaining('in place'), + }, + store.state + ) + }) + + it('subscribe to changes done via patch', () => { + const store = useStore() + const spy = jest.fn() + store.subscribe(spy) + + const patch = { a: false } + store.patch(patch) + + expect(spy).toHaveBeenCalledWith( + { + payload: patch, + storeName: 'main', + type: expect.stringContaining('patch'), + }, + store.state + ) + }) }) diff --git a/src/pinia.ts b/src/pinia.ts deleted file mode 100644 index 49907b3e..00000000 --- a/src/pinia.ts +++ /dev/null @@ -1,91 +0,0 @@ -import { Store, StoreGetter, StateTree, StoreWithGetters } from './types' -import { CombinedStore, buildStore } from './store' - -export type CombinedState< - S extends Record< - string, - ( - ...args: any[] - ) => CombinedStore< - string, - StateTree, - Record> - > - > -> = { - [k in keyof S]: S[k] extends ( - ...args: any[] - ) => CombinedStore< - string, - infer State, - Record> - > - ? State - : never -} - -export type CombinedGetters< - S extends Record< - string, - ( - ...args: any[] - ) => CombinedStore< - string, - StateTree, - Record> - > - > -> = { - [k in keyof S]: S[k] extends ( - ...args: any[] - ) => CombinedStore - ? StoreWithGetters - : never -} - -function buildCombinedStore< - S extends Record< - string, - CombinedStore>> - > ->(stores: S): Store<'', CombinedState> & CombinedGetters { - const state = {} - for (const name in stores) { - const store = stores[name] - Object.defineProperty(state, name, { - get: () => store.state, - }) - } - - // @ts-ignore - return { - state, - } -} - -export function pinia< - S extends Record< - string, - ( - ...args: any[] - ) => CombinedStore< - string, - StateTree, - Record> - > - > ->(stores: S): Store<'', CombinedState> & CombinedGetters { - // TODO: implement if makes sense - const state = {} - for (const name in stores) { - const store = stores[name]() - Object.defineProperty(state, name, { - get: () => store.state, - }) - } - - // @ts-ignore - return { - state, - } -} diff --git a/src/store.ts b/src/store.ts index 711aef0d..0c1f5948 100644 --- a/src/store.ts +++ b/src/store.ts @@ -8,7 +8,6 @@ import { StoreWithGetters, StoreGetter, NonNullObject, - StoreReactiveGetters, } from './types' import { useStoreDevtools } from './devtools' @@ -61,25 +60,6 @@ export type Store< A extends Record > = StoreWithState & StoreWithGetters & StoreWithActions -export type WrapStoreWithId< - S extends Store -> = S extends Store - ? { - [k in Id]: Store - } - : never - -export type ExtractGettersFromStore = S extends Store< - any, - infer S, - infer G, - any -> - ? { - [k in keyof G]: ReturnType - } - : never - export type PiniaStore< P extends Record> > = P extends Record @@ -107,7 +87,7 @@ export function buildStore< A extends Record >( id: Id, - buildState: () => S, + buildState = () => ({} as S), getters: G = {} as G, actions: A = {} as A, initialState?: S | undefined @@ -281,7 +261,7 @@ export function createStore< A extends Record >(options: { id: Id - state: () => S + state?: () => S getters?: G // allow actions use other actions actions?: A & ThisType & StoreWithGetters>