You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
258 lines
6.7 KiB
258 lines
6.7 KiB
/*!
|
|
* vue-router v3.6.5
|
|
* (c) 2022 Evan You
|
|
* @license MIT
|
|
*/
|
|
'use strict'
|
|
|
|
Object.defineProperty(exports, '__esModule', { value: true })
|
|
|
|
var vue = require('vue')
|
|
|
|
// dev only warn if no current instance
|
|
|
|
function throwNoCurrentInstance (method) {
|
|
if (!vue.getCurrentInstance()) {
|
|
throw new Error(
|
|
('[vue-router]: Missing current instance. ' + method + '() must be called inside <script setup> or setup().')
|
|
)
|
|
}
|
|
}
|
|
|
|
function useRouter () {
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
throwNoCurrentInstance('useRouter')
|
|
}
|
|
|
|
return vue.getCurrentInstance().proxy.$root.$router
|
|
}
|
|
|
|
function useRoute () {
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
throwNoCurrentInstance('useRoute')
|
|
}
|
|
|
|
var root = vue.getCurrentInstance().proxy.$root
|
|
if (!root._$route) {
|
|
var route = vue.effectScope(true).run(function () { return vue.shallowReactive(Object.assign({}, root.$router.currentRoute)) }
|
|
)
|
|
root._$route = route
|
|
|
|
root.$router.afterEach(function (to) {
|
|
Object.assign(route, to)
|
|
})
|
|
}
|
|
|
|
return root._$route
|
|
}
|
|
|
|
function onBeforeRouteUpdate (guard) {
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
throwNoCurrentInstance('onBeforeRouteUpdate')
|
|
}
|
|
|
|
return useFilteredGuard(guard, isUpdateNavigation)
|
|
}
|
|
function isUpdateNavigation (to, from, depth) {
|
|
var toMatched = to.matched
|
|
var fromMatched = from.matched
|
|
return (
|
|
toMatched.length >= depth &&
|
|
toMatched
|
|
.slice(0, depth + 1)
|
|
.every(function (record, i) { return record === fromMatched[i] })
|
|
)
|
|
}
|
|
|
|
function isLeaveNavigation (to, from, depth) {
|
|
var toMatched = to.matched
|
|
var fromMatched = from.matched
|
|
return toMatched.length < depth || toMatched[depth] !== fromMatched[depth]
|
|
}
|
|
|
|
function onBeforeRouteLeave (guard) {
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
throwNoCurrentInstance('onBeforeRouteLeave')
|
|
}
|
|
|
|
return useFilteredGuard(guard, isLeaveNavigation)
|
|
}
|
|
|
|
var noop = function () {}
|
|
function useFilteredGuard (guard, fn) {
|
|
var instance = vue.getCurrentInstance()
|
|
var router = useRouter()
|
|
|
|
var target = instance.proxy
|
|
// find the nearest RouterView to know the depth
|
|
while (
|
|
target &&
|
|
target.$vnode &&
|
|
target.$vnode.data &&
|
|
target.$vnode.data.routerViewDepth == null
|
|
) {
|
|
target = target.$parent
|
|
}
|
|
|
|
var depth =
|
|
target && target.$vnode && target.$vnode.data
|
|
? target.$vnode.data.routerViewDepth
|
|
: null
|
|
|
|
if (depth != null) {
|
|
var removeGuard = router.beforeEach(function (to, from, next) {
|
|
return fn(to, from, depth) ? guard(to, from, next) : next()
|
|
})
|
|
|
|
vue.onUnmounted(removeGuard)
|
|
return removeGuard
|
|
}
|
|
|
|
return noop
|
|
}
|
|
|
|
/* */
|
|
|
|
function guardEvent (e) {
|
|
// don't redirect with control keys
|
|
if (e.metaKey || e.altKey || e.ctrlKey || e.shiftKey) { return }
|
|
// don't redirect when preventDefault called
|
|
if (e.defaultPrevented) { return }
|
|
// don't redirect on right click
|
|
if (e.button !== undefined && e.button !== 0) { return }
|
|
// don't redirect if `target="_blank"`
|
|
if (e.currentTarget && e.currentTarget.getAttribute) {
|
|
var target = e.currentTarget.getAttribute('target')
|
|
if (/\b_blank\b/i.test(target)) { return }
|
|
}
|
|
// this may be a Weex event which doesn't have this method
|
|
if (e.preventDefault) {
|
|
e.preventDefault()
|
|
}
|
|
return true
|
|
}
|
|
|
|
function includesParams (outer, inner) {
|
|
var loop = function (key) {
|
|
var innerValue = inner[key]
|
|
var outerValue = outer[key]
|
|
if (typeof innerValue === 'string') {
|
|
if (innerValue !== outerValue) { return { v: false } }
|
|
} else {
|
|
if (
|
|
!Array.isArray(outerValue) ||
|
|
outerValue.length !== innerValue.length ||
|
|
innerValue.some(function (value, i) { return value !== outerValue[i] })
|
|
) {
|
|
return { v: false }
|
|
}
|
|
}
|
|
}
|
|
|
|
for (var key in inner) {
|
|
var returned = loop(key)
|
|
|
|
if (returned) return returned.v
|
|
}
|
|
|
|
return true
|
|
}
|
|
|
|
// helpers from vue router 4
|
|
|
|
function isSameRouteLocationParamsValue (a, b) {
|
|
return Array.isArray(a)
|
|
? isEquivalentArray(a, b)
|
|
: Array.isArray(b)
|
|
? isEquivalentArray(b, a)
|
|
: a === b
|
|
}
|
|
|
|
function isEquivalentArray (a, b) {
|
|
return Array.isArray(b)
|
|
? a.length === b.length && a.every(function (value, i) { return value === b[i] })
|
|
: a.length === 1 && a[0] === b
|
|
}
|
|
|
|
function isSameRouteLocationParams (a, b) {
|
|
if (Object.keys(a).length !== Object.keys(b).length) { return false }
|
|
|
|
for (var key in a) {
|
|
if (!isSameRouteLocationParamsValue(a[key], b[key])) { return false }
|
|
}
|
|
|
|
return true
|
|
}
|
|
|
|
function useLink (props) {
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
throwNoCurrentInstance('useLink')
|
|
}
|
|
|
|
var router = useRouter()
|
|
var currentRoute = useRoute()
|
|
|
|
var resolvedRoute = vue.computed(function () { return router.resolve(vue.unref(props.to), currentRoute) })
|
|
|
|
var activeRecordIndex = vue.computed(function () {
|
|
var route = resolvedRoute.value.route
|
|
var matched = route.matched
|
|
var length = matched.length
|
|
var routeMatched = matched[length - 1]
|
|
var currentMatched = currentRoute.matched
|
|
if (!routeMatched || !currentMatched.length) { return -1 }
|
|
var index = currentMatched.indexOf(routeMatched)
|
|
if (index > -1) { return index }
|
|
// possible parent record
|
|
var parentRecord = currentMatched[currentMatched.length - 2]
|
|
|
|
return (
|
|
// we are dealing with nested routes
|
|
length > 1 &&
|
|
// if the parent and matched route have the same path, this link is
|
|
// referring to the empty child. Or we currently are on a different
|
|
// child of the same parent
|
|
parentRecord && parentRecord === routeMatched.parent
|
|
)
|
|
})
|
|
|
|
var isActive = vue.computed(
|
|
function () {
|
|
return activeRecordIndex.value > -1 &&
|
|
includesParams(currentRoute.params, resolvedRoute.value.route.params)
|
|
}
|
|
)
|
|
var isExactActive = vue.computed(
|
|
function () {
|
|
return activeRecordIndex.value > -1 &&
|
|
activeRecordIndex.value === currentRoute.matched.length - 1 &&
|
|
isSameRouteLocationParams(currentRoute.params, resolvedRoute.value.route.params)
|
|
}
|
|
)
|
|
|
|
var navigate = function (e) {
|
|
var href = resolvedRoute.value.route
|
|
if (guardEvent(e)) {
|
|
return props.replace
|
|
? router.replace(href)
|
|
: router.push(href)
|
|
}
|
|
return Promise.resolve()
|
|
}
|
|
|
|
return {
|
|
href: vue.computed(function () { return resolvedRoute.value.href }),
|
|
route: vue.computed(function () { return resolvedRoute.value.route }),
|
|
isExactActive: isExactActive,
|
|
isActive: isActive,
|
|
navigate: navigate
|
|
}
|
|
}
|
|
|
|
exports.isSameRouteLocationParams = isSameRouteLocationParams
|
|
exports.onBeforeRouteLeave = onBeforeRouteLeave
|
|
exports.onBeforeRouteUpdate = onBeforeRouteUpdate
|
|
exports.useLink = useLink
|
|
exports.useRoute = useRoute
|
|
exports.useRouter = useRouter
|