141 lines
2.4 KiB
JavaScript
141 lines
2.4 KiB
JavaScript
|
|
// ref:
|
|
// https://github.com/vuejs/vue-router/blob/dev/src/index.js
|
|
|
|
import Axios from 'axios';
|
|
import ZeroPlugin from './plugin.zero.js';
|
|
import EventHub from '../services/eventhub.js';
|
|
import VueRouter from 'vue-router';
|
|
import Vue from 'vue';
|
|
//import CommercePlugin from '../../../zero.Commerce/Plugins/zero.Commerce/plugin.js'; // TODO dynPath
|
|
import options from './options.js';
|
|
import routerConfig from '../config/router.config.js'
|
|
|
|
class Zero
|
|
{
|
|
static install;
|
|
|
|
config = { ...options };
|
|
|
|
#vue = null;
|
|
#plugins = [];
|
|
#renderers = [];
|
|
#routes = [];
|
|
#router = null;
|
|
|
|
|
|
constructor(vue, opts)
|
|
{
|
|
this.config = { ...options, ...opts };
|
|
this.#vue = vue;
|
|
|
|
this.use(ZeroPlugin);
|
|
//this.use(CommercePlugin);
|
|
}
|
|
|
|
|
|
/*
|
|
* Get the currently installed version of the zero frontend
|
|
*/
|
|
get version()
|
|
{
|
|
return this.config.version;
|
|
}
|
|
|
|
/*
|
|
* Get all installed zero plugins
|
|
*/
|
|
get plugins()
|
|
{
|
|
return this.#plugins;
|
|
}
|
|
|
|
|
|
/*
|
|
* Get all installed zero plugins
|
|
*/
|
|
get router()
|
|
{
|
|
return this.#router;
|
|
}
|
|
|
|
|
|
/*
|
|
* Locates zero plugins and install them
|
|
*/
|
|
setup()
|
|
{
|
|
this.#router = new VueRouter({
|
|
...routerConfig,
|
|
routes: this.#routes
|
|
});
|
|
|
|
//const result = await Axios.get('zerovue/config');
|
|
//this.config = { ...this.config, ...result.data };
|
|
|
|
//console.info(this.#vue.router);
|
|
|
|
//EventHub.$emit('zero.setup');
|
|
}
|
|
|
|
|
|
/*
|
|
* Installs a zero plugin
|
|
* Each plugin is a superset of a vue (client) plugin and can therefore hook into the vue system
|
|
*/
|
|
use(plugin)
|
|
{
|
|
if (typeof plugin.install === 'function')
|
|
{
|
|
plugin.install(this.#vue, this);
|
|
}
|
|
|
|
this.#plugins.push(plugin);
|
|
|
|
// append routes
|
|
plugin.routes.forEach(x => this.#routes.push(x));
|
|
|
|
// append renderers
|
|
plugin.renderers.forEach(x => this.#renderers.push(x));
|
|
|
|
console.log(`[zero] Installed %c${plugin.name}%cplugin`, 'font-style:italic;');
|
|
}
|
|
|
|
|
|
/*
|
|
* Returns a renderer
|
|
*/
|
|
getRenderer(alias)
|
|
{
|
|
const renderer = this.#renderers.find(x => x.alias === alias);
|
|
|
|
if (!renderer)
|
|
{
|
|
console.warn(`[zero] Could not find renderer ${alias}`);
|
|
}
|
|
|
|
return renderer;
|
|
}
|
|
};
|
|
|
|
|
|
/*
|
|
* Registers zero within the vue system
|
|
*/
|
|
Zero.install = (vue, opts) =>
|
|
{
|
|
const zero = new Zero(vue, opts);
|
|
|
|
Object.defineProperty(vue.prototype, 'zero', {
|
|
get: () => zero
|
|
});
|
|
|
|
zero.setup();
|
|
|
|
Vue.mixin({
|
|
router: zero.router
|
|
});
|
|
};
|
|
|
|
|
|
export default Zero; |