START_LOCATION_NORMALIZED,
RouteLocationNormalized,
} from '../src/types'
+import { mockWarn } from 'jest-mock-warn'
const routes: Readonly<RouteRecordRaw>[] = [
{ path: '/', component: components.Home },
}
describe('Errors & Navigation failures', () => {
+ mockWarn()
beforeEach(() => {
onError.mockReset()
afterEach.mockReset()
throw error
})
- await expect(router.push('/foo')).rejects.toEqual(error)
+ await router.push('/foo').catch(() => {})
expect(afterEach).toHaveBeenCalledTimes(0)
expect(onError).toHaveBeenCalledTimes(1)
}
)
- await expect(router.push(to)).rejects.toEqual(expectedError)
+ if (expectedError !== undefined) {
+ await expect(router.push(to)).rejects.toEqual(expectedError)
+ } else {
+ await router.push(to).catch(() => {})
+ }
expect(afterEach).toHaveBeenCalledTimes(0)
expect(onError).toHaveBeenCalledTimes(1)
* @param from - location we were navigating from when the error happened
* @internal
*/
-export type _ErrorHandler = (
- error: any,
- to: RouteLocationNormalized,
- from: RouteLocationNormalizedLoaded
-) => any
+export interface _ErrorListener {
+ (
+ error: any,
+ to: RouteLocationNormalized,
+ from: RouteLocationNormalizedLoaded
+ ): any
+}
// resolve, reject arguments of Promise constructor
type OnReadyCallback = [() => void, (reason?: any) => void]
*
* @param handler - error handler to register
*/
- onError(handler: _ErrorHandler): () => void
+ onError(handler: _ErrorListener): () => void
/**
* Returns a Promise that resolves when the router has completed the initial
* navigation, which means it has resolved all async enter hooks and async
failure
)
})
+ // avoid warnings in the console about uncaught rejections, they are logged by triggerErrors
.catch(noop)
})
}
// Initialization and Errors
let readyHandlers = useCallbacks<OnReadyCallback>()
- let errorHandlers = useCallbacks<_ErrorHandler>()
+ let errorListeners = useCallbacks<_ErrorListener>()
let ready: boolean
/**
- * Trigger errorHandlers added via onError and throws the error as well
+ * Trigger errorListeners 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
from: RouteLocationNormalizedLoaded
): Promise<unknown> {
markAsReady(error)
- const list = errorHandlers.list()
+ const list = errorListeners.list()
if (list.length) {
list.forEach(handler => handler(error, to, from))
} else {
}
console.error(error)
}
+ // reject the error no matter there were error listeners or not
return Promise.reject(error)
}
from: RouteLocationNormalizedLoaded,
isPush: boolean,
isFirstNavigation: boolean
- ): Promise<any> {
+ ): // the return is not meant to be used
+ Promise<unknown> {
const { scrollBehavior } = options
if (!isBrowser || !scrollBehavior) return Promise.resolve()
beforeResolve: beforeResolveGuards.add,
afterEach: afterGuards.add,
- onError: errorHandlers.add,
+ onError: errorListeners.add,
isReady,
install(app: App) {