Skip to content

Commit 63a014e

Browse files
Merge pull request #166 from gjsjohnmurray/package-types
Create @intersystems-community/intersystems-servermanager NPM package
2 parents 68a6f02 + 2f77117 commit 63a014e

18 files changed

+369
-49
lines changed

README.md

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -220,25 +220,32 @@ Embedded entries (built-in default ones) are demoted to the end of the list, or
220220

221221
## Information for VS Code Extension Developers - How To Leverage Server Manager
222222

223-
An extension XYZ needing to connect to InterSystems servers can define Server Manager as a dependency in its `package.json` like this:
223+
The NPM package [`@intersystems-community/intersystems-servermanager`](https://www.npmjs.com/package/@intersystems-community/intersystems-servermanager) defines the types used by the API which this extension exports. It also declares some constants.
224+
225+
An extension XYZ needing to connect to InterSystems servers should include `"@intersystems-community/intersystems-servermanager": "latest"` in the `"devDependencies"` object in its `package.json`.
226+
227+
It might also define Server Manager as a dependency in its `package.json` like this:
224228

225229
```json
226230
"extensionDependencies": [
227231
"intersystems-community.servermanager"
228232
],
229233
```
230234

231-
Alternatively the `activate` method of XYZ can detect whether the extension is already available, then offer to install it if necessary:
235+
Alternatively the `activate` method of XYZ can detect whether the extension is already available, then offer to install it if not:
232236

233237
```ts
234-
const extId = 'intersystems-community.servermanager';
235-
let extension = vscode.extensions.getExtension(extId);
238+
import * as serverManager from '@intersystems-community/intersystems-servermanager';
239+
```
240+
...
241+
```ts
242+
let extension = vscode.extensions.getExtension(serverManager.EXTENSION_ID);
236243
if (!extension) {
237244
// Optionally ask user for permission
238245
// ...
239246

240-
await vscode.commands.executeCommand('workbench.extensions.installExtension', extId);
241-
extension = vscode.extensions.getExtension(extId);
247+
await vscode.commands.executeCommand('workbench.extensions.installExtension', serverManager.EXTENSION_ID);
248+
extension = vscode.extensions.getExtension(serverManager.EXTENSION_ID);
242249
}
243250
if (!extension.isActive) {
244251
await extension.activate();
@@ -250,7 +257,7 @@ XYZ can then use the extension's API to obtain the properties of a named server
250257
```ts
251258
const serverManagerApi = extension.exports;
252259
if (serverManagerApi && serverManagerApi.getServerSpec) { // defensive coding
253-
const serverSpec = await serverManagerApi.getServerSpec(serverName);
260+
const serverSpec: serverManager.IServerSpec | undefined = await serverManagerApi.getServerSpec(serverName);
254261
}
255262
```
256263

@@ -259,12 +266,11 @@ The `username` and `password` properties will only be present if defined in the
259266
To obtain the password with which to connect, use code like this which will also prompt for a username if absent:
260267

261268
```ts
262-
const AUTHENTICATION_PROVIDER = 'intersystems-server-credentials';
263269
if (typeof serverSpec.password === 'undefined') {
264270
const scopes = [serverSpec.name, serverSpec.username || ''];
265-
let session = await vscode.authentication.getSession(AUTHENTICATION_PROVIDER, scopes, { silent: true });
271+
let session = await vscode.authentication.getSession(serverManager.AUTHENTICATION_PROVIDER, scopes, { silent: true });
266272
if (!session) {
267-
session = await vscode.authentication.getSession(AUTHENTICATION_PROVIDER, scopes, { createIfNone: true });
273+
session = await vscode.authentication.getSession(serverManager.AUTHENTICATION_PROVIDER, scopes, { createIfNone: true });
268274
}
269275
if (session) {
270276
serverSpec.username = session.scopes[1];
@@ -276,13 +282,13 @@ To obtain the password with which to connect, use code like this which will also
276282
To offer the user a quickpick of servers:
277283

278284
```ts
279-
const serverName = await serverManagerApi.pickServer();
285+
const serverName: string = await serverManagerApi.pickServer();
280286
```
281287

282288
To obtain an array of server names:
283289

284290
```ts
285-
const allServerNames = await serverManagerApi.getServerNames();
291+
const allServerNames: serverManager.IServerName[] = await serverManagerApi.getServerNames();
286292
```
287293
For up-to-date details of the API, including result types and available parameters, review the source code of the extension's `activate` method [here](https://github.com/intersystems-community/intersystems-servermanager/blob/master/src/extension.ts).
288294

package-lock.json

Lines changed: 15 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@
5050
"tough-cookie": "^4.0.0"
5151
},
5252
"devDependencies": {
53+
"@intersystems-community/intersystems-servermanager": "latest",
5354
"@types/vscode": "^1.63.0",
5455
"@types/glob": "^7.1.1",
5556
"@types/keytar": "^4.4.2",

src/api/addServer.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import * as vscode from "vscode";
2-
import { IJSONServerSpec } from "../extension";
2+
import { IJSONServerSpec } from "@intersystems-community/intersystems-servermanager";
33
import { getServerNames } from "./getServerNames";
44

55
export async function addServer(

src/api/getPortalUriWithToken.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import * as vscode from "vscode";
22
import { Uri } from "vscode";
3-
import { extensionId, IServerSpec } from "../extension";
3+
import { IServerSpec } from "@intersystems-community/intersystems-servermanager";
4+
import { extensionId } from "../extension";
45
import { makeRESTRequest } from "../makeRESTRequest";
56

67
export enum BrowserTarget {

src/api/getServerNames.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import * as vscode from "vscode";
2-
import { IServerName } from "../extension";
2+
import { IServerName } from "@intersystems-community/intersystems-servermanager";
33
import { serverDetail } from "./getServerSummary";
44

55
export function getServerNames(scope?: vscode.ConfigurationScope, sorted?: boolean): IServerName[] {

src/api/getServerSpec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import * as vscode from "vscode";
22
import { AUTHENTICATION_PROVIDER } from "../authenticationProvider";
33
import { filePassword } from "../commands/managePasswords";
4-
import { IServerSpec } from "../extension";
4+
import { IServerSpec } from "@intersystems-community/intersystems-servermanager";
55
import { Keychain } from "../keychain";
66

77
interface ICredentialSet {

src/api/getServerSummary.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import * as vscode from "vscode";
2-
import { IServerName, IServerSpec } from "../extension";
2+
import { IServerName, IServerSpec } from "@intersystems-community/intersystems-servermanager";
33

44
export function getServerSummary(name: string, scope?: vscode.ConfigurationScope): IServerName | undefined {
55
const server: IServerSpec | undefined = vscode.workspace.getConfiguration("intersystems.servers", scope).get(name);

src/extension.ts

Lines changed: 1 addition & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
"use strict";
22

33
import * as vscode from "vscode";
4+
import { IServerName, IServerSpec } from "@intersystems-community/intersystems-servermanager";
45
import { addServer } from "./api/addServer";
56
import { BrowserTarget, getPortalUriWithToken } from "./api/getPortalUriWithToken";
67
import { getServerNames } from "./api/getServerNames";
@@ -16,34 +17,6 @@ import { NamespaceTreeItem, ProjectTreeItem, ServerManagerView, ServerTreeItem,
1617
export const extensionId = "intersystems-community.servermanager";
1718
export let globalState: vscode.Memento;
1819

19-
export interface IServerName {
20-
name: string;
21-
description: string;
22-
detail: string;
23-
}
24-
25-
export interface IWebServerSpec {
26-
scheme?: string;
27-
host: string;
28-
port: number;
29-
pathPrefix?: string;
30-
}
31-
32-
export interface IServerSpec {
33-
name: string;
34-
webServer: IWebServerSpec;
35-
username?: string;
36-
password?: string;
37-
description?: string;
38-
}
39-
40-
export interface IJSONServerSpec {
41-
webServer: IWebServerSpec;
42-
username?: string;
43-
password?: string;
44-
description?: string;
45-
}
46-
4720
export function activate(context: vscode.ExtensionContext) {
4821

4922
const _onDidChangePassword = new vscode.EventEmitter<string>();

src/makeRESTRequest.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import * as https from "https";
77
import tough = require("tough-cookie");
88
import * as vscode from "vscode";
99
import { AUTHENTICATION_PROVIDER } from "./authenticationProvider";
10-
import { IServerSpec } from "./extension";
10+
import { IServerSpec } from "@intersystems-community/intersystems-servermanager";
1111
import { getServerSpec } from "./api/getServerSpec";
1212

1313
axiosCookieJarSupport(axios);

0 commit comments

Comments
 (0)