[plugin][core] Fixed entry point, work on plugin definitions

* Entry point is now in source, no need to compile, this is done
  by Flaschengeist when included
* Added `id` property to plugins
* Required modules now support version dependencies
This commit is contained in:
Ferdinand Thiessen 2021-05-21 17:04:29 +02:00
parent ac5dc4d634
commit 91888f694b
7 changed files with 45 additions and 34 deletions

View File

@ -13,20 +13,19 @@
"type": "git",
"url": "https://flaschengeist.dev/Flaschengeist/flaschengeist-typings"
},
"main": "dist/index.js",
"typings": "dist/index.d.ts",
"typings": "types/index.d.ts",
"scripts": {
"build": "tsc",
"valid": "tsc --noEmit",
"pretty": "prettier --config ./package.json --write '{,!(node_modules)/**/}*.ts'"
},
"devDependencies": {
"prettier": "^2.3.0",
"typescript": "^4.2.4",
"vue": "^3.0.11",
"vue-router": "^4.0.8"
"typescript": "^4.2.4"
},
"peerDependencies": {
"flaschengeist": "^2.0.0-alpha.1"
"flaschengeist": "^2.0.0-alpha.1",
"vue": "^3.0.11",
"vue-router": "^4.0.8"
},
"prettier": {
"singleQuote": true,

2
src/index.d.ts vendored
View File

@ -1,2 +0,0 @@
/// <reference path="plugin.d.ts" />
/// <reference path="flaschengeist.d.ts" />

View File

@ -1 +0,0 @@
/// <reference path="index.d.ts" />

View File

@ -4,9 +4,8 @@
"target": "esnext",
"module": "esnext",
"declaration": true,
"outDir": "./dist",
"strict": true,
"moduleResolution": "node"
"moduleResolution": "Node"
},
"exclude": [
"node_modules",

3
types/index.d.ts vendored Normal file
View File

@ -0,0 +1,3 @@
/// <reference path="flaschengeist.d.ts" />
export * from "./plugin"

View File

@ -1,18 +1,31 @@
import { RouteLocationRaw, RouteRecordRaw, RouteRecordName } from 'vue-router';
import { Component } from 'vue';
import type { RouteLocationRaw, RouteRecordRaw, RouteRecordName } from 'vue-router';
import type { Component } from '@vue/runtime-core';
declare namespace FG_Plugin {
type Join<T extends unknown[], D extends string> =
T extends [] ? '' :
T extends [string | number | boolean | bigint] ? `${T[0]}` :
T extends [string | number | boolean | bigint, ...infer U] ? `${T[0]}${D}${Join<U, D>}` :
string;
type BVersion = Join<[number, number], '.'> | Join<[number, number, number], '.'>
type Version = BVersion | Join<[BVersion, string], '-'>
export namespace FG_Plugin {
/**
* Interface defining a Flaschengeist plugin
*/
interface Plugin {
export interface Plugin {
/** Unique identifier for this plugin, we recommend using a FQN like com.example.my_plugin */
id: string,
/** Arbitrary name of the plugin used inside admin view etc */
name: string;
/** Version of this plugin, used for dependencies. MUST be semver parsable */
version: string;
/** Widgets provided by this plugin */
widgets: Widget[];
/** Pther frontend modules needed for this plugin to work correctly */
requiredModules: string[];
/** Other frontend modules needed for this plugin to work correctly */
requiredModules: [string, Version?][];
/** Backend modules needed for this plugin to work correctly */
requiredBackendModules: string[];
requiredBackendModules: [string, Version?][];
/** Menu entries for authenticated users */
innerRoutes?: MenuRoute[];
/** Public menu entries (without authentification) */
@ -26,7 +39,7 @@ declare namespace FG_Plugin {
/**
* Defines the loaded state of the Flaschengeist
*/
interface Flaschengeist {
export interface Flaschengeist {
/** All loaded plugins */
plugins: LoadedPlugin[];
/** All routes, combined from all plugins */
@ -44,7 +57,7 @@ declare namespace FG_Plugin {
/**
* Interface for a frontend notification
*/
interface Notification extends FG.Notification {
export interface Notification extends FG.Notification {
/** If set a button for accepting will be shown, this function will get called before deleting the notification */
accept?(): Promise<void>;
/** If set this function is called before the notification gets deleted */
@ -67,30 +80,30 @@ declare namespace FG_Plugin {
/**
* Defines a shortcut link
*/
interface Shortcut {
export interface Shortcut {
link: RouteRecordName;
icon: string;
permissions?: string[];
}
/**
* Defines a main menu entry along with the route
* Used when defining a plugin
*/
interface MenuRoute extends MenuEntry {
route: NamedRouteRecordRaw;
shortcut?: boolean;
children?: this[];
}
type NamedRouteRecordRaw = RouteRecordRaw & {
name: RouteRecordName;
};
/**
* Defines a main menu entry along with the route
* Used when defining a plugin
*/
export interface MenuRoute extends MenuEntry {
route: NamedRouteRecordRaw;
shortcut?: boolean;
children?: this[];
}
/**
* Defines a menu entry in the main menu
*/
interface MenuLink extends MenuEntry {
export interface MenuLink extends MenuEntry {
/** Name of the target route */
link: RouteRecordName;
}
@ -108,7 +121,7 @@ declare namespace FG_Plugin {
/**
* Widget object for the dashboard
*/
interface Widget {
export interface Widget {
name: string;
priority: number;
permissions: FG.Permission[];