plugin.ts: Make application endpoint paths absolute

This commit is contained in:
Anmol Sethi 2020-11-03 21:42:21 -05:00
parent 139a28e0ea
commit 687094802e
No known key found for this signature in database
GPG Key ID: 8CEF1878FF10ADEB
5 changed files with 20 additions and 13 deletions

View File

@ -60,6 +60,8 @@ export class PluginAPI {
// Add plugin key to each app. // Add plugin key to each app.
apps.push( apps.push(
...pluginApps.map((app) => { ...pluginApps.map((app) => {
app = {...app, path: path.join(p.routerPath, app.path || "")}
app = {...app, iconPath: path.join(app.path || "", app.iconPath)}
return { return {
...app, ...app,
plugin: { plugin: {
@ -69,7 +71,7 @@ export class PluginAPI {
displayName: p.displayName, displayName: p.displayName,
description: p.description, description: p.description,
path: p.path, routerPath: p.routerPath,
}, },
} }
}), }),
@ -192,8 +194,8 @@ export class PluginAPI {
if (!p.description) { if (!p.description) {
throw new Error("plugin missing description") throw new Error("plugin missing description")
} }
if (!p.path) { if (!p.routerPath) {
throw new Error("plugin missing path") throw new Error("plugin missing router path")
} }
p.init({ p.init({

View File

@ -21,7 +21,8 @@ describe("plugin", () => {
version: "4.0.0", version: "4.0.0",
description: "This app does XYZ.", description: "This app does XYZ.",
iconPath: "/icon.svg", iconPath: "/test-plugin/test-app/icon.svg",
path: "/test-plugin/test-app",
plugin: { plugin: {
name: "test-plugin", name: "test-plugin",
@ -30,7 +31,7 @@ describe("plugin", () => {
displayName: "Test Plugin", displayName: "Test Plugin",
description: "Plugin used in code-server tests.", description: "Plugin used in code-server tests.",
path: "/test-plugin", routerPath: "/test-plugin",
}, },
}, },
], ],

View File

@ -1,5 +1,6 @@
out/index.js: src/index.ts out/index.js: src/index.ts
yarn build # Typescript always emits, even on errors.
yarn build || rm out/index.js
node_modules: package.json yarn.lock node_modules: package.json yarn.lock
yarn yarn

View File

@ -3,7 +3,7 @@ import * as fspath from "path"
import * as pluginapi from "../../../typings/pluginapi" import * as pluginapi from "../../../typings/pluginapi"
export const displayName = "Test Plugin" export const displayName = "Test Plugin"
export const path = "/test-plugin" export const routerPath = "/test-plugin"
export const description = "Plugin used in code-server tests." export const description = "Plugin used in code-server tests."
export function init(config: pluginapi.PluginConfig) { export function init(config: pluginapi.PluginConfig) {
@ -24,6 +24,7 @@ export function applications(): pluginapi.Application[] {
name: "Test App", name: "Test App",
version: "4.0.0", version: "4.0.0",
iconPath: "/icon.svg", iconPath: "/icon.svg",
path: "/test-app",
description: "This app does XYZ.", description: "This app does XYZ.",
}, },

View File

@ -45,7 +45,9 @@ import * as express from "express"
* *
* There is also a /api/applications endpoint to allow programmatic access to all * There is also a /api/applications endpoint to allow programmatic access to all
* available applications. It could be used to create a custom application dashboard * available applications. It could be used to create a custom application dashboard
* for example. * for example. An important difference with the API is that all application paths
* will be absolute (i.e have the plugin path prepended) so that they may be used
* directly.
*/ */
/** /**
@ -60,30 +62,30 @@ export interface Plugin {
* *
* Fetched from package.json. * Fetched from package.json.
*/ */
name?: string readonly name?: string
/** /**
* The version for the plugin in the overlay. * The version for the plugin in the overlay.
* *
* Fetched from package.json. * Fetched from package.json.
*/ */
version?: string readonly version?: string
/** /**
* Name used in the overlay. * Name used in the overlay.
*/ */
displayName: string readonly displayName: string
/** /**
* Used in overlay. * Used in overlay.
* Should be a full sentence describing the plugin. * Should be a full sentence describing the plugin.
*/ */
description: string readonly description: string
/** /**
* The path at which the plugin router is to be registered. * The path at which the plugin router is to be registered.
*/ */
path: string readonly routerPath: string
/** /**
* init is called so that the plugin may initialize itself with the config. * init is called so that the plugin may initialize itself with the config.