222 lines
6.4 KiB
TypeScript
222 lines
6.4 KiB
TypeScript
import { boot } from 'quasar/wrappers';
|
|
import { RouteConfig } from 'vue-router';
|
|
import { Module, Store } from 'vuex';
|
|
import { StateInterface } from 'src/store';
|
|
import { FG_Plugin } from 'src/plugins';
|
|
import routes from 'src/router/routes';
|
|
|
|
const config = {
|
|
// Do not change required Modules !!
|
|
requiredModules: ['User'],
|
|
// here you can import plugins.
|
|
loadModules: []
|
|
};
|
|
|
|
// do not change anything here !!
|
|
|
|
// combine routes from source to target
|
|
|
|
function combineRoutes(
|
|
target: RouteConfig[],
|
|
source: FG_Plugin.PluginRouteConfig[],
|
|
mainPath: '/' | '/main' = '/'
|
|
): RouteConfig[] {
|
|
target.forEach(target => {
|
|
if (target.path === mainPath) {
|
|
console.log('target', target.path);
|
|
source.forEach((sourceMainConfig: FG_Plugin.PluginRouteConfig) => {
|
|
console.log('sourceMainconfig', sourceMainConfig);
|
|
const targetMainConfig = target.children?.find(
|
|
(targetMainConfig: RouteConfig) => {
|
|
return sourceMainConfig.path === targetMainConfig.path;
|
|
}
|
|
);
|
|
if (targetMainConfig) {
|
|
const sourceChildren: RouteConfig[] = [];
|
|
sourceMainConfig.children?.forEach(child => {
|
|
sourceChildren.push(<RouteConfig>child);
|
|
});
|
|
if (targetMainConfig.children) {
|
|
targetMainConfig.children = Object.assign(
|
|
targetMainConfig.children,
|
|
sourceChildren
|
|
);
|
|
} else {
|
|
targetMainConfig.children = sourceChildren;
|
|
}
|
|
} else {
|
|
if (target.children === undefined) {
|
|
target.children = [];
|
|
}
|
|
target.children.push(<RouteConfig>sourceMainConfig);
|
|
}
|
|
});
|
|
}
|
|
});
|
|
return target;
|
|
}
|
|
|
|
// combine Links of Plugins from source to target
|
|
function combineMainLinks(
|
|
target: FG_Plugin.PluginMainLink[],
|
|
source: FG_Plugin.PluginRouteConfig
|
|
): FG_Plugin.PluginMainLink[] {
|
|
const targetPluginMainLink:
|
|
| FG_Plugin.PluginMainLink
|
|
| undefined = target.find(
|
|
(targetPluginMainLink: FG_Plugin.PluginMainLink) => {
|
|
console.log(targetPluginMainLink.title, source.title);
|
|
return targetPluginMainLink.title == source.title;
|
|
}
|
|
);
|
|
if (targetPluginMainLink) {
|
|
source.children?.forEach(
|
|
(sourcePluginChildLink: FG_Plugin.PluginRouteConfig) => {
|
|
targetPluginMainLink.children.push(<FG_Plugin.PluginChildLink>{
|
|
title: sourcePluginChildLink.title,
|
|
icon: sourcePluginChildLink.icon,
|
|
link: sourcePluginChildLink.name,
|
|
name: sourcePluginChildLink.name,
|
|
permissions: sourcePluginChildLink.meta?.permissions
|
|
});
|
|
}
|
|
);
|
|
} else {
|
|
const mainLink: FG_Plugin.PluginMainLink = <FG_Plugin.PluginMainLink>{
|
|
title: source.title,
|
|
icon: source.icon,
|
|
link: source.name,
|
|
name: source.name,
|
|
permissions: source.meta?.permissions
|
|
};
|
|
source.children?.forEach(child => {
|
|
if (mainLink.children === undefined) {
|
|
mainLink.children = [];
|
|
}
|
|
mainLink.children.push(<FG_Plugin.PluginChildLink>{
|
|
title: child.title,
|
|
icon: child.icon,
|
|
link: child.name,
|
|
name: child.name,
|
|
permissions: child.meta?.permissions
|
|
});
|
|
});
|
|
target.push(mainLink);
|
|
}
|
|
return target;
|
|
}
|
|
|
|
function loadShortCuts(
|
|
target: FG_Plugin.ShortCutLink[],
|
|
source: FG_Plugin.PluginRouteConfig[]
|
|
): FG_Plugin.ShortCutLink[] {
|
|
source.forEach(route => {
|
|
if (route.shortcut) {
|
|
target.push(<FG_Plugin.ShortCutLink>{
|
|
link: route.name,
|
|
icon: route.icon,
|
|
permissions: route.meta?.permissions
|
|
});
|
|
}
|
|
if (route.children) {
|
|
target = loadShortCuts(target, route.children);
|
|
}
|
|
});
|
|
return target;
|
|
}
|
|
|
|
// loade plugins
|
|
function loadPlugin(
|
|
loadedPlugins: FG_Plugin.LoadedPlugins,
|
|
modules: string[],
|
|
plugins: Plugin[],
|
|
store: Store<any>
|
|
): FG_Plugin.LoadedPlugins {
|
|
modules.forEach(requiredModule => {
|
|
const plugin = <FG_Plugin.Plugin | undefined>plugins.find(plugin => {
|
|
return plugin.name == requiredModule;
|
|
});
|
|
if (plugin) {
|
|
if (plugin.mainRoutes) {
|
|
loadedPlugins.routes = combineRoutes(
|
|
loadedPlugins.routes,
|
|
plugin.mainRoutes,
|
|
'/main'
|
|
);
|
|
plugin.mainRoutes.forEach(route => {
|
|
loadedPlugins.mainLinks = combineMainLinks(
|
|
loadedPlugins.mainLinks,
|
|
route
|
|
);
|
|
});
|
|
loadedPlugins.shortcuts = loadShortCuts(
|
|
loadedPlugins.shortcuts,
|
|
plugin.mainRoutes
|
|
);
|
|
}
|
|
if (plugin.outRoutes) {
|
|
loadedPlugins.routes = combineRoutes(
|
|
loadedPlugins.routes,
|
|
plugin.outRoutes
|
|
);
|
|
loadedPlugins.shortcutsOut = loadShortCuts(
|
|
loadedPlugins.shortcutsOut,
|
|
plugin.outRoutes
|
|
);
|
|
}
|
|
if (plugin.store) {
|
|
console.log(plugin.store);
|
|
console.log(plugin.store.keys());
|
|
plugin.store.forEach((store_plugin, store_namespace) => {
|
|
store.registerModule(store_namespace, store_plugin);
|
|
});
|
|
}
|
|
loadedPlugins.plugins.push({
|
|
name: plugin.name,
|
|
version: plugin.version
|
|
});
|
|
} else {
|
|
console.exception(`Don't find required Plugin ${requiredModule}`);
|
|
}
|
|
});
|
|
return loadedPlugins;
|
|
}
|
|
|
|
// "async" is optional;
|
|
// more info on params: https://quasar.dev/quasar-cli/cli-documentation/boot-files#Anatomy-of-a-boot-file
|
|
export default boot<Store<StateInterface>>(({ Vue, router, store }) => {
|
|
const plugins: Plugin[] = [];
|
|
let loadedPlugins: FG_Plugin.LoadedPlugins = {
|
|
routes,
|
|
plugins: [],
|
|
mainLinks: [],
|
|
shortcuts: [],
|
|
shortcutsOut: []
|
|
};
|
|
|
|
// get all plugins
|
|
const pluginsContext = require.context('src/plugins', true, /.+\/plugin.ts$/);
|
|
pluginsContext.keys().forEach((fileName: string) => {
|
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
|
|
plugins.push(pluginsContext(fileName).default);
|
|
});
|
|
|
|
// load plugins
|
|
loadedPlugins = loadPlugin(
|
|
loadedPlugins,
|
|
config.requiredModules,
|
|
plugins,
|
|
store
|
|
);
|
|
loadedPlugins = loadPlugin(loadedPlugins, config.loadModules, plugins, store);
|
|
|
|
console.log(loadedPlugins.routes);
|
|
|
|
// add new routes for plugins
|
|
router.addRoutes(loadedPlugins.routes);
|
|
|
|
// save plugins in VM-variable
|
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
|
|
Vue.prototype.$flaschengeistPlugins = loadedPlugins;
|
|
});
|