UNPKG

@vrx-arco/app

Version:

<p align="center"> <img src="https://vrx-arco.github.io/arco-design-pro/favicon.svg" width="200" height="250"> </p>

288 lines (272 loc) 9.59 kB
import { computed, createApp, defineComponent, inject, toRaw } from "vue"; import { createRouter, createWebHistory } from "vue-router"; import { createPinia, defineStore, storeToRefs } from "pinia"; import { filterEmptyChildren, useEmptyComponentInject } from "@vrx-arco/use"; //#region src/pinia/usePermissionStore.ts const usePermissionStore = defineStore("vrx-permission", { state: () => ({ dynamicRoutesName: [], dynamicRoutes: [], permission: null }), actions: { setDynamicRoutesName(routesName) { this.dynamicRoutesName = [...routesName]; } } }); //#endregion //#region src/pinia/index.ts const definePinia = (app) => { const pinia = createPinia(); app.use(pinia); return pinia; }; //#endregion //#region src/router/resetRoute.ts const resetRoute = (router) => { const permissionStore = usePermissionStore(); permissionStore.dynamicRoutesName.forEach((item) => { if (!router.hasRoute(item)) return; router.removeRoute(item); }); permissionStore.dynamicRoutesName = []; permissionStore.dynamicRoutes = []; }; //#endregion //#region ../../node_modules/.pnpm/@oxc-project+runtime@0.77.3/node_modules/@oxc-project/runtime/src/helpers/esm/typeof.js function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(o$1) { return typeof o$1; } : function(o$1) { return o$1 && "function" == typeof Symbol && o$1.constructor === Symbol && o$1 !== Symbol.prototype ? "symbol" : typeof o$1; }, _typeof(o); } //#endregion //#region ../../node_modules/.pnpm/@oxc-project+runtime@0.77.3/node_modules/@oxc-project/runtime/src/helpers/esm/toPrimitive.js function toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } //#endregion //#region ../../node_modules/.pnpm/@oxc-project+runtime@0.77.3/node_modules/@oxc-project/runtime/src/helpers/esm/toPropertyKey.js function toPropertyKey(t) { var i = toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } //#endregion //#region ../../node_modules/.pnpm/@oxc-project+runtime@0.77.3/node_modules/@oxc-project/runtime/src/helpers/esm/defineProperty.js function _defineProperty(e, r, t) { return (r = toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } //#endregion //#region ../../node_modules/.pnpm/@oxc-project+runtime@0.77.3/node_modules/@oxc-project/runtime/src/helpers/esm/objectSpread2.js function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function(r$1) { return Object.getOwnPropertyDescriptor(e, r$1).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread2(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function(r$1) { _defineProperty(e, r$1, t[r$1]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function(r$1) { Object.defineProperty(e, r$1, Object.getOwnPropertyDescriptor(t, r$1)); }); } return e; } //#endregion //#region src/router/filterRoutes.ts const filterRoutes = (routes, permission, filter) => { const filterRoutes$1 = []; const nameList = /* @__PURE__ */ new Set(); const listFilter = (routes$1, filterRoutes$2) => { routes$1.forEach((item) => { const children = item.children; if (!item.name) return; nameList.add(item.name); if (!filter(item, permission)) return; if (!Array.isArray(children) || !children.length) { filterRoutes$2.push(item); return; } const _filterRoute = _objectSpread2(_objectSpread2({}, item), {}, { children: [] }); filterRoutes$2.push(_filterRoute); _filterRoute.children = listFilter(children, _filterRoute.children); return; }); return filterRoutes$2; }; return [listFilter(routes, filterRoutes$1), nameList]; }; //#endregion //#region ../../node_modules/.pnpm/@oxc-project+runtime@0.77.3/node_modules/@oxc-project/runtime/src/helpers/esm/asyncToGenerator.js function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n$1) { return void e(n$1); } i.done ? t(u) : Promise.resolve(u).then(r, o); } function _asyncToGenerator(n) { return function() { var t = this, e = arguments; return new Promise(function(r, o) { var a = n.apply(t, e); function _next(n$1) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n$1); } function _throw(n$1) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n$1); } _next(void 0); }); }; } //#endregion //#region src/router/police.ts const defineRouterPolice = (router, options) => { const { loading } = options; const { dynamicRoutes = [], filterDynamicRoutes = () => true, pageNotFound, whiteList = [], loginExpiredRedirect } = options.router; const { getPermission, onLoginExpired, isLogin = () => true } = options.authentication || {}; router.beforeEach(function() { var _ref = _asyncToGenerator(function* (to) { const permissionStore = usePermissionStore(); loading === null || loading === void 0 || loading(true); const _isLogin = yield Promise.resolve().then(isLogin); if (!_isLogin) { resetRoute(router); if (to.name === loginExpiredRedirect || whiteList.includes(to.name)) return; return { name: loginExpiredRedirect }; } if (to.name === loginExpiredRedirect) { resetRoute(router); onLoginExpired === null || onLoginExpired === void 0 || onLoginExpired(); return; } if (!dynamicRoutes.length || permissionStore.dynamicRoutesName.length) return; try { const permission = yield Promise.resolve().then(getPermission); permissionStore.permission = permission; const [routes, routeNames] = filterRoutes(dynamicRoutes, permission, filterDynamicRoutes); permissionStore.setDynamicRoutesName(routeNames); routes.forEach((item) => { permissionStore.dynamicRoutes.push(item); router.addRoute(item); }); } catch (e) { resetRoute(router); onLoginExpired === null || onLoginExpired === void 0 || onLoginExpired(); return { name: loginExpiredRedirect }; } if (to.name === pageNotFound.name) return { path: to.fullPath, replace: true, query: to.query }; }); return function(_x) { return _ref.apply(this, arguments); }; }()); router.afterEach(() => { loading === null || loading === void 0 || loading(false); }); }; //#endregion //#region src/router/index.ts const defineRouter = (app, options) => { const { routes, pageNotFound, options: routerOptions } = options.router; const router = createRouter(_objectSpread2({ history: createWebHistory(), routes: [...routes, _objectSpread2({ path: "/:path(.*)*" }, pageNotFound)] }, routerOptions)); defineRouterPolice(router, options); app.use(router); return router; }; //#endregion //#region src/permission/app-context.ts const VrxArcoPermissionContext = Symbol("VrxArcoPermissionContext"); const provideVrxArcoCheckPermission = (app, options) => { var _options$authenticati; app.provide(VrxArcoPermissionContext, ((_options$authenticati = options.authentication) === null || _options$authenticati === void 0 ? void 0 : _options$authenticati.checkPermission) || (() => true)); }; const useVrxArcoCheckPermission = () => { return inject(VrxArcoPermissionContext, () => true); }; //#endregion //#region src/permission/component.ts const Permission = defineComponent({ name: "vrx-arco-permission", props: { data: {}, destroyOnNoPermission: { type: Boolean, default: true } }, setup: (props, { slots }) => { const checkPermission = useVrxArcoCheckPermission(); const { permission } = storeToRefs(usePermissionStore()); const { empty } = useEmptyComponentInject(); const hasPermission = computed(() => checkPermission(toRaw(permission.value), props.data)); return () => { var _slots$default; empty.value = false; const { destroyOnNoPermission } = props; if (!hasPermission.value && destroyOnNoPermission) { var _slots$noPermission; const noPermission = filterEmptyChildren((_slots$noPermission = slots.noPermission) === null || _slots$noPermission === void 0 ? void 0 : _slots$noPermission.call(slots)); empty.value = !noPermission.length; return noPermission; } return (_slots$default = slots.default) === null || _slots$default === void 0 ? void 0 : _slots$default.call(slots, { hasPermission: hasPermission.value }); }; } }); //#endregion //#region src/index.ts const createVrxArcoApp = (options) => { const { rootComponent, rootProps, rootContainer, immediate } = options; const app = createApp(rootComponent, rootProps); const pinia = definePinia(app); const router = defineRouter(app, options); provideVrxArcoCheckPermission(app, options); const mount = function() { var _ref = _asyncToGenerator(function* () { yield router.isReady(); return app.mount(rootContainer); }); return function mount$1() { return _ref.apply(this, arguments); }; }(); if (immediate !== null && immediate !== void 0 ? immediate : true) mount(); return { app, router, pinia, mount }; }; //#endregion export { Permission, createVrxArcoApp, usePermissionStore };