// When changing thing, also edit router.d.ts
|
export const NavigationFailureType = {
|
redirected: 2,
|
aborted: 4,
|
cancelled: 8,
|
duplicated: 16
|
}
|
|
export function createNavigationRedirectedError (from, to) {
|
return createRouterError(
|
from,
|
to,
|
NavigationFailureType.redirected,
|
`Redirected when going from "${from.fullPath}" to "${stringifyRoute(
|
to
|
)}" via a navigation guard.`
|
)
|
}
|
|
export function createNavigationDuplicatedError (from, to) {
|
const error = createRouterError(
|
from,
|
to,
|
NavigationFailureType.duplicated,
|
`Avoided redundant navigation to current location: "${from.fullPath}".`
|
)
|
// backwards compatible with the first introduction of Errors
|
error.name = 'NavigationDuplicated'
|
return error
|
}
|
|
export function createNavigationCancelledError (from, to) {
|
return createRouterError(
|
from,
|
to,
|
NavigationFailureType.cancelled,
|
`Navigation cancelled from "${from.fullPath}" to "${
|
to.fullPath
|
}" with a new navigation.`
|
)
|
}
|
|
export function createNavigationAbortedError (from, to) {
|
return createRouterError(
|
from,
|
to,
|
NavigationFailureType.aborted,
|
`Navigation aborted from "${from.fullPath}" to "${
|
to.fullPath
|
}" via a navigation guard.`
|
)
|
}
|
|
function createRouterError (from, to, type, message) {
|
const error = new Error(message)
|
error._isRouter = true
|
error.from = from
|
error.to = to
|
error.type = type
|
|
return error
|
}
|
|
const propertiesToLog = ['params', 'query', 'hash']
|
|
function stringifyRoute (to) {
|
if (typeof to === 'string') return to
|
if ('path' in to) return to.path
|
const location = {}
|
propertiesToLog.forEach(key => {
|
if (key in to) location[key] = to[key]
|
})
|
return JSON.stringify(location, null, 2)
|
}
|
|
export function isError (err) {
|
return Object.prototype.toString.call(err).indexOf('Error') > -1
|
}
|
|
export function isNavigationFailure (err, errorType) {
|
return (
|
isError(err) &&
|
err._isRouter &&
|
(errorType == null || err.type === errorType)
|
)
|
}
|