import { useUserStore } from './user'
import { useCartStore, emptyCart } from './cart'
-export const useCartUserStore = pinia([useUserStore, useCartStore], {
- combinedGetter: state =>
- `Hi ${user.state.name}, you have ${cart.state.list.length} items in your cart. It costs ${cart.price}.`,
-})
+export const useCartUserStore = pinia(
+ {
+ user: useUserStore,
+ cart: useCartStore,
+ },
+ {
+ combinedGetter: state =>
+ `Hi ${user.state.name}, you have ${cart.state.list.length} items in your cart. It costs ${cart.price}.`,
+ }
+)
export async function orderCart() {
const store = useCartUserStore()
+import { useUserStore } from './user'
+import { useCartStore } from './cart'
+import { pinia, CombinedState } from '../../../src/pinia'
// in this file we could import other stores that use one each other while
// avoiding any recursive import
+
+type S = CombinedState<{
+ user: typeof useUserStore
+ cart: typeof useCartStore
+}>
+
+let a: S
+
+a.user.isAdmin = false
+a.cart.rawItems.push()
let rootStore: RootState
-export function devtoolPlugin(store: Store<string, StateTree>) {
+export function useStoreDevtools(store: Store<string, StateTree>) {
if (!devtoolHook) return
if (!rootStore) {
--- /dev/null
+import { Store, StoreGetter, StateTree, StoreGetters } from './types'
+import { CombinedStore } from './store'
+
+export type CombinedState<
+ S extends Record<
+ string,
+ (
+ ...args: any[]
+ ) => CombinedStore<
+ string,
+ StateTree,
+ Record<string, StoreGetter<StateTree>>
+ >
+ >
+> = {
+ [k in keyof S]: S[k] extends (
+ ...args: any[]
+ ) => CombinedStore<
+ string,
+ infer State,
+ Record<string, StoreGetter<infer State>>
+ >
+ ? State
+ : never
+}
+
+export type CombinedGetters<
+ S extends Record<
+ string,
+ (
+ ...args: any[]
+ ) => CombinedStore<
+ string,
+ StateTree,
+ Record<string, StoreGetter<StateTree>>
+ >
+ >
+> = {
+ [k in keyof S]: S[k] extends (
+ ...args: any[]
+ ) => CombinedStore<string, infer State, infer Getters>
+ ? StoreGetters<State, Getters>
+ : never
+}
+
+export function pinia<
+ S extends Record<
+ string,
+ (
+ ...args: any[]
+ ) => CombinedStore<
+ string,
+ StateTree,
+ Record<string, StoreGetter<StateTree>>
+ >
+ >
+>(stores: S): Store<'', CombinedState<S>> & CombinedGetters<S> {
+ // TODO: implement if makes sense
+
+ // @ts-ignore
+ return {}
+}
StoreGetters,
StoreGetter,
} from './types'
-import { devtoolPlugin } from './devtools'
+import { useStoreDevtools } from './devtools'
function innerPatch<T extends StateTree>(
target: T,
* they want, no? like user/cart
*/
-type CombinedStore<
+export type CombinedStore<
Id extends string,
S extends StateTree,
G extends Record<string, StoreGetter<S>>
},
})
- // Devtools injection hue hue
- devtoolPlugin(store)
-
return store
}
return function useStore(forceNewStore = false): CombinedStore<Id, S, G> {
if (!store || forceNewStore) store = buildStore(id, buildState, getters)
+ useStoreDevtools(store)
+
return store
}
}