@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
JavaScript
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 };