NavigationGuard,
RouteLocationRaw,
START_LOCATION_NORMALIZED,
+ RouteLocationNormalized,
} from '../src/types'
const routes: RouteRecordRaw[] = [
}, error)
})
+ it('triggers onError with to and from', async () => {
+ const { router } = createRouter()
+ let expectedTo: RouteLocationNormalized | undefined
+ let expectedFrom: RouteLocationNormalized | undefined
+ const error = new Error()
+ router.beforeEach((to, from) => {
+ expectedTo = to
+ expectedFrom = from
+ throw error
+ })
+
+ await expect(router.push('/foo')).rejects.toEqual(error)
+
+ expect(afterEach).toHaveBeenCalledTimes(0)
+ expect(onError).toHaveBeenCalledTimes(1)
+
+ expect(onError).toHaveBeenCalledWith(error, expectedTo, expectedFrom)
+ })
+
it('triggers onError with rejected promises', async () => {
let error = new Error()
await testError(async () => {
expect(afterEach).toHaveBeenCalledTimes(0)
expect(onError).toHaveBeenCalledTimes(1)
- expect(onError).toHaveBeenCalledWith(expectedError)
+ expect(onError).toHaveBeenCalledWith(
+ expectedError,
+ expect.any(Object),
+ expect.any(Object)
+ )
}
async function testNavigation(
expect(afterEach).toHaveBeenCalledTimes(0)
expect(onError).toHaveBeenCalledTimes(1)
- expect(onError).toHaveBeenCalledWith(expectedError)
+ expect(onError).toHaveBeenCalledWith(
+ expectedError,
+ expect.any(Object),
+ expect.any(Object)
+ )
}
/**
* Internal type to define an ErrorHandler
+ *
+ * @param error - error thrown
+ * @param to - location we were navigating to when the error happened
+ * @param from - location we were navigating from when the error happened
* @internal
*/
-export type _ErrorHandler = (error: any) => any
+export type _ErrorHandler = (
+ error: any,
+ to: RouteLocationNormalized,
+ from: RouteLocationNormalizedLoaded
+) => any
// resolve, reject arguments of Promise constructor
type OnReadyCallback = [() => void, (reason?: any) => void]
isNavigationFailure(error)
? error
: // reject any unknown error
- triggerError(error)
+ triggerError(error, toLocation, from)
)
.then((failure: NavigationFailure | NavigationRedirectError | void) => {
if (failure) {
// do not restore history on unknown direction
if (info.delta) routerHistory.go(-info.delta, false)
// unrecognized error, transfer to the global handler
- return triggerError(error)
+ return triggerError(error, toLocation, from)
})
.then((failure: NavigationFailure | void) => {
failure =
/**
* Trigger errorHandlers added via onError and throws the error as well
+ *
* @param error - error to throw
+ * @param to - location we were navigating to when the error happened
+ * @param from - location we were navigating from when the error happened
* @returns the error as a rejected promise
*/
- function triggerError(error: any): Promise<unknown> {
+ function triggerError(
+ error: any,
+ to: RouteLocationNormalized,
+ from: RouteLocationNormalizedLoaded
+ ): Promise<unknown> {
markAsReady(error)
const list = errorHandlers.list()
if (list.length) {
- list.forEach(handler => handler(error))
+ list.forEach(handler => handler(error, to, from))
} else {
if (__DEV__) {
warn('uncaught error during route navigation:')
return nextTick()
.then(() => scrollBehavior(to, from, scrollPosition))
.then(position => position && scrollToPosition(position))
- .catch(triggerError)
+ .catch(err => triggerError(err, to, from))
}
const go = (delta: number) => routerHistory.go(delta)