debian-mirror-gitlab/app/assets/javascripts/lib/utils/vue3compat/vue_router.js
2023-07-09 08:55:56 +05:30

115 lines
2.5 KiB
JavaScript

import Vue from 'vue';
import {
createRouter,
createMemoryHistory,
createWebHistory,
createWebHashHistory,
} from 'vue-router-vue3';
const mode = (value, options) => {
if (!value) return null;
let history;
// eslint-disable-next-line default-case
switch (value) {
case 'history':
history = createWebHistory(options.base);
break;
case 'hash':
history = createWebHashHistory();
break;
case 'abstract':
history = createMemoryHistory();
break;
}
return { history };
};
const base = () => null;
const toNewCatchAllPath = (path) => {
if (path === '*') return '/:pathMatch(.*)*';
return path;
};
const routes = (value) => {
if (!value) return null;
const newRoutes = value.reduce(function handleRoutes(acc, route) {
const newRoute = {
...route,
path: toNewCatchAllPath(route.path),
};
if (route.children) {
newRoute.children = route.children.reduce(handleRoutes, []);
}
acc.push(newRoute);
return acc;
}, []);
return { routes: newRoutes };
};
const scrollBehavior = (value) => {
return {
scrollBehavior(...args) {
const { x, y, left, top } = value(...args);
return { left: x || left, top: y || top };
},
};
};
const transformers = {
mode,
base,
routes,
scrollBehavior,
};
const transformOptions = (options = {}) => {
const defaultConfig = {
routes: [],
history: createWebHashHistory(),
};
return Object.keys(options).reduce((acc, key) => {
const value = options[key];
if (key in transformers) {
Object.assign(acc, transformers[key](value, options));
} else {
acc[key] = value;
}
return acc;
}, defaultConfig);
};
const installed = new WeakMap();
export default class VueRouterCompat {
constructor(options) {
// eslint-disable-next-line no-constructor-return
return new Proxy(createRouter(transformOptions(options)), {
get(target, prop) {
const result = target[prop];
// eslint-disable-next-line no-underscore-dangle
if (result?.__v_isRef) {
return result.value;
}
return result;
},
});
}
static install() {
Vue.mixin({
beforeCreate() {
const { app } = this.$.appContext;
const { router } = this.$options;
if (router && !installed.get(app)?.has(router)) {
if (!installed.has(app)) {
installed.set(app, new WeakSet());
}
installed.get(app).add(router);
this.$.appContext.app.use(this.$options.router);
}
},
});
}
}