expect(() => store.throws()).toThrowError('fail')
})
- it('can avoid errors to propagate', () => {
+ it.skip('can avoid thrown errors to propagate', () => {
const store = useStore()
store.$onAction(({ onError }) => {
onError(() => false)
expect(() => store.throws()).not.toThrowError('fail')
})
- it('can avoid async errors to propagate', async () => {
+ it.skip('can avoid async errors to propagate', async () => {
const store = useStore()
store.$onAction(({ onError }) => {
onError(() => false)
expect(spy).toHaveBeenCalledWith('fail')
})
- it('can override the returned value', () => {
+ it.skip('can override the returned value', () => {
const store = useStore()
expect.assertions(2)
store.$onAction(({ after }) => {
expect(store.toggle()).toBe('hello')
})
- it('can override the resolved value', async () => {
+ it.skip('can override the resolved value', async () => {
const store = useStore()
expect.assertions(2)
store.$onAction(({ after }) => {
await expect(store.getNonA()).resolves.toBe('hello')
})
- it('can override the resolved value with a promise', async () => {
+ it.skip('can override the resolved value with a promise', async () => {
const store = useStore()
expect.assertions(2)
store.$onAction(({ after }) => {
expect(spy).not.toHaveBeenCalled()
})
+ it('can register multiple onAction', async () => {
+ const spy1 = jest.fn()
+ const spy2 = jest.fn()
+ store.$onAction(({ after }) => {
+ after(spy1)
+ })
+ store.$onAction(({ after }) => {
+ after(spy2)
+ })
+
+ await expect(store.asyncUpperName()).resolves.toBe('EDUARDO')
+ expect(spy2).toHaveBeenCalledTimes(1)
+ expect(spy1).toHaveBeenCalledTimes(1)
+ })
+
it('calls after with the returned value', async () => {
const spy = jest.fn()
// Cannot destructure because of https://github.com/microsoft/TypeScript/issues/38020
import { patchObject } from './hmr'
import { addSubscription, triggerSubscriptions } from './subscriptions'
+type _ArrayType<AT> = AT extends Array<infer T> ? T : never
+
function mergeReactiveObjects<T extends StateTree>(
target: T,
patchToApply: DeepPartial<T>
setActivePinia(pinia)
const args = Array.from(arguments)
- let afterCallback: (resolvedReturn: any) => any = noop
- let onErrorCallback: (error: unknown) => unknown = noop
- function after(callback: typeof afterCallback) {
- afterCallback = callback
+ const afterCallbackList: Array<(resolvedReturn: any) => any> = []
+ const onErrorCallbackList: Array<(error: unknown) => unknown> = []
+ function after(callback: _ArrayType<typeof afterCallbackList>) {
+ afterCallbackList.push(callback)
}
- function onError(callback: typeof onErrorCallback) {
- onErrorCallback = callback
+ function onError(callback: _ArrayType<typeof onErrorCallbackList>) {
+ onErrorCallbackList.push(callback)
}
// @ts-expect-error
ret = action.apply(this && this.$id === $id ? this : store, args)
// handle sync errors
} catch (error) {
- if (onErrorCallback(error) !== false) {
- throw error
- }
+ triggerSubscriptions(onErrorCallbackList, error)
+ throw error
}
if (ret instanceof Promise) {
return ret
.then((value) => {
- const newRet = afterCallback(value)
- // allow the afterCallback to override the return value
- return newRet === undefined ? value : newRet
+ triggerSubscriptions(afterCallbackList, value)
+ return value
})
.catch((error) => {
- if (onErrorCallback(error) !== false) {
- return Promise.reject(error)
- }
+ triggerSubscriptions(onErrorCallbackList, error)
+ return Promise.reject(error)
})
}
// allow the afterCallback to override the return value
- const newRet = afterCallback(ret)
- return newRet === undefined ? ret : newRet
+ triggerSubscriptions(afterCallbackList, ret)
+ return ret
}
}