123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257 |
- /*!
- * 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
|