From 31132632069670a4831c0b30ebe93a9a0e7bb38a Mon Sep 17 00:00:00 2001 From: Ferdinand Thiessen Date: Thu, 20 May 2021 23:14:32 +0200 Subject: [PATCH] Init version --- .gitignore | 3 + package.json | 35 +++++++++++ src/flaschengeist.d.ts | 137 +++++++++++++++++++++++++++++++++++++++++ src/index.d.ts | 2 + src/index.ts | 1 + src/plugin.d.ts | 117 +++++++++++++++++++++++++++++++++++ 6 files changed, 295 insertions(+) create mode 100644 .gitignore create mode 100644 package.json create mode 100644 src/flaschengeist.d.ts create mode 100644 src/index.d.ts create mode 100644 src/index.ts create mode 100644 src/plugin.d.ts diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..52de1de --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +node_modules +# We do not rely on specific version, no need to share this +yarn.lock diff --git a/package.json b/package.json new file mode 100644 index 0000000..f8bd73c --- /dev/null +++ b/package.json @@ -0,0 +1,35 @@ +{ + "private": true, + "license": "MIT", + "version": "1.0.0-alpha.1", + "name": "@flaschengeist/types", + "author": "Ferdinand ", + "homepage": "https://flaschengeist.dev/Flaschengeist", + "description": "Flaschengeist TypeScript typings", + "bugs": { + "url": "https://flaschengeist.dev/Flaschengeist/flaschengeist/issues" + }, + "repository": { + "type": "git", + "url": "https://flaschengeist.dev/Flaschengeist/flaschengeist-typings" + }, + "scripts": { + "build": "tsc", + "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" + }, + "peerDependencies": { + "flaschengeist": "^2.0.0-alpha.1" + }, + "prettier": { + "singleQuote": true, + "semi": true, + "printWidth": 100, + "arrowParens": "always" + } +} diff --git a/src/flaschengeist.d.ts b/src/flaschengeist.d.ts new file mode 100644 index 0000000..0b0a806 --- /dev/null +++ b/src/flaschengeist.d.ts @@ -0,0 +1,137 @@ +declare namespace FG { + interface Notification { + id: number; + plugin: string; + text: string; + data?: unknown; + time: Date; + } + interface User { + userid: string; + display_name: string; + firstname: string; + lastname: string; + mail: string; + birthday?: Date; + roles: Array; + permissions?: Array; + avatar_url?: string; + } + interface Session { + expires: Date; + token: string; + lifetime: number; + browser: string; + platform: string; + userid: string; + } + type Permission = string; + interface Role { + id: number; + name: string; + permissions: Array; + } + interface Transaction { + id: number; + time: Date; + amount: number; + reversal_id?: number; + author_id?: string; + sender_id?: string; + original_id?: number; + receiver_id?: string; + } + interface Event { + id: number; + start: Date; + end?: Date; + name?: string; + description?: string; + type: EventType | number; + is_template: boolean; + jobs: Array; + } + interface EventType { + id: number; + name: string; + } + interface Invite { + id: number; + job_id: number; + invitee_id: string; + sender_id: string; + } + interface Job { + id: number; + start: Date; + end?: Date; + type: JobType | number; + comment?: string; + services: Array; + required_services: number; + } + interface JobType { + id: number; + name: string; + } + interface Service { + userid: string; + is_backup: boolean; + value: number; + } + interface Drink { + id: number; + article_id?: string; + package_size?: number; + name: string; + volume?: number; + cost_per_volume?: number; + cost_per_package?: number; + tags?: Array; + type?: DrinkType; + volumes: Array; + uuid: string; + receipt?: Array; + } + interface DrinkIngredient { + id: number; + volume: number; + ingredient_id: number; + } + interface DrinkPrice { + id: number; + price: number; + public: boolean; + description?: string; + } + interface DrinkPriceVolume { + id: number; + volume: number; + min_prices: Array; + prices: Array; + ingredients: Array; + } + interface DrinkType { + id: number; + name: string; + } + interface ExtraIngredient { + id: number; + name: string; + price: number; + } + interface Ingredient { + id: number; + drink_ingredient?: DrinkIngredient; + extra_ingredient?: ExtraIngredient; + } + interface MinPrices { + percentage: number; + price: number; + } + interface Tag { + id: number; + name: string; + color: string; + } +} diff --git a/src/index.d.ts b/src/index.d.ts new file mode 100644 index 0000000..0f87dc5 --- /dev/null +++ b/src/index.d.ts @@ -0,0 +1,2 @@ +/// +/// \ No newline at end of file diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 0000000..a022b03 --- /dev/null +++ b/src/index.ts @@ -0,0 +1 @@ +/// \ No newline at end of file diff --git a/src/plugin.d.ts b/src/plugin.d.ts new file mode 100644 index 0000000..d041af8 --- /dev/null +++ b/src/plugin.d.ts @@ -0,0 +1,117 @@ +import { RouteLocationRaw, RouteRecordRaw, RouteRecordName } from 'vue-router'; +import { Component } from 'vue'; + +declare namespace FG_Plugin { + /** + * Interface defining a Flaschengeist plugin + */ + interface Plugin { + name: string; + version: string; + widgets: Widget[]; + /** Pther frontend modules needed for this plugin to work correctly */ + requiredModules: string[]; + /** Backend modules needed for this plugin to work correctly */ + requiredBackendModules: string[]; + /** Menu entries for authenticated users */ + innerRoutes?: MenuRoute[]; + /** Public menu entries (without authentification) */ + outerRoutes?: MenuRoute[]; + /** Routes without menu links, for internal usage */ + internalRoutes?: NamedRouteRecordRaw[]; + /** Handle notifications, defaults to boot/plugins.ts:translateNotification() */ + notification?(msg: FG.Notification): FG_Plugin.Notification; + } + + /** + * Defines the loaded state of the Flaschengeist + */ + interface Flaschengeist { + /** All loaded plugins */ + plugins: LoadedPlugin[]; + /** All routes, combined from all plugins */ + routes: RouteRecordRaw[]; + /** All menu entries */ + menuLinks: MenuLink[]; + /** All inner shortcuts */ + shortcuts: Shortcut[]; + /** All outer shortcuts */ + outerShortcuts: Shortcut[]; + /** All widgets */ + widgets: Widget[]; + } + + /** + * Interface for a frontend notification + */ + 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; + /** If set this function is called before the notification gets deleted */ + reject?(): Promise; + /** If set the notification text is interpreted as a link to this location */ + link?: RouteLocationRaw; + /** If set this icon is used */ + icon?: string; + } + + /** + * Loaded Flaschengeist plugin + */ + interface LoadedPlugin { + name: string; + version: string; + notification(msg: FG.Notification): FG_Plugin.Notification; + } + + /** + * Defines a shortcut link + */ + 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 menu entry in the main menu + */ + interface MenuLink extends MenuEntry { + /** Name of the target route */ + link: RouteRecordName; + } + + /** + * Base interface for internal use + */ + interface MenuEntry { + title: string | (() => string); + icon: string; + permissions?: string[]; + children?: this[]; + } + + /** + * Widget object for the dashboard + */ + interface Widget { + name: string; + priority: number; + permissions: FG.Permission[]; + widget: Component; + } +}