Skip to content

Commit a43c201

Browse files
committed
dont use request directly
1 parent 3c8aae0 commit a43c201

File tree

7 files changed

+198
-117
lines changed

7 files changed

+198
-117
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
node_modules/
2+
dist/

README.md

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,25 @@
11
# @beekeeperstudio/plugin
22

3-
A TypeScript wrapper library for building Beekeeper Studio plugins that enables communication between your plugin and the main application.
3+
A tiny wrapper of `window.postMessage` for building Beekeeper Studio plugins with TypeScript support.
44

55
## Installation
66

77
```bash
8-
npm install github:beekeeper-studio/plugin
8+
npm install @beekeeperstudio/plugin
99
# or
10-
yarn add github:beekeeper-studio/plugin
10+
yarn add @beekeeperstudio/plugin
1111
```
1212

1313
## Quick Start
1414

1515
```typescript
16-
import { request, notify } from '@beekeeperstudio/plugin';
16+
import { getTables, runQuery } from '@beekeeperstudio/plugin';
1717

1818
// Get all tables in the current database
19-
const tables = await request('getTables');
19+
const tables = await getTables();
2020

2121
// Run a SQL query
22-
const result = await request('runQuery', { query: 'SELECT * FROM users LIMIT 10' });
22+
const result = await runQuery({ query: 'SELECT * FROM users LIMIT 10' });
2323
```
2424

2525
## Development

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@beekeeperstudio/plugin",
3-
"version": "1.0.11",
3+
"version": "1.1.0",
44
"description": "A simple TypeScript wrapper to send messages from your Beekeeper Studio plugin to the main app.",
55
"main": "dist/index.js",
66
"types": "dist/index.d.ts",

src/comms.ts

Lines changed: 15 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,4 @@
1-
import type {
2-
GetTablesRequest,
3-
GetColumnsRequest,
4-
RunQueryRequest,
5-
ExpandTableResultRequest,
6-
SetTabTitleRequest,
7-
GetViewStateRequest,
8-
SetViewStateRequest,
9-
OpenExternalRequest,
10-
GetEncryptedDataRequest,
11-
SetEncryptedDataRequest,
12-
GetDataRequest,
13-
SetDataRequest,
14-
} from "./requestTypes";
15-
import type {
16-
GetTablesResponse,
17-
GetColumnsResponse,
18-
GetConnectionInfoResponse,
19-
GetAllTabsResponse,
20-
RunQueryResponse,
21-
ExpandTableResultResponse,
22-
SetTabTitleResponse,
23-
GetViewStateResponse,
24-
SetViewStateResponse,
25-
OpenExternalResponse,
26-
GetEncryptedDataResponse,
27-
SetEncryptedDataResponse,
28-
GetDataResponse,
29-
SetDataResponse,
30-
} from "./responseTypes";
1+
import type { PluginRequestPayload } from "./requestTypes";
312
import { generateUUID } from "./utils";
323

334
// Define a custom import.meta interface for TypeScript
@@ -42,7 +13,8 @@ declare global {
4213
const pendingRequests = new Map<
4314
string,
4415
{
45-
name: string;
16+
// The whole payload is kept just in case for debugging
17+
payload: PluginRequestPayload;
4618
resolve: (value: any) => void;
4719
reject: (reason?: any) => void;
4820
}
@@ -72,12 +44,12 @@ window.addEventListener("message", (event) => {
7244
}
7345

7446
if (id && pendingRequests.has(id)) {
75-
const { resolve, reject, name } = pendingRequests.get(id)!;
47+
const { resolve, reject, payload } = pendingRequests.get(id)!;
7648
pendingRequests.delete(id);
7749

7850
if (debugComms) {
7951
const time = new Date().toLocaleTimeString("en-GB");
80-
console.groupCollapsed(`${time} [RESPONSE] ${name}`);
52+
console.groupCollapsed(`${time} [RESPONSE] ${payload.name}`);
8153
console.log("Result:", result);
8254
if (error) console.error("Error:", error);
8355
console.groupEnd();
@@ -91,34 +63,23 @@ window.addEventListener("message", (event) => {
9163
}
9264
});
9365

94-
export async function request(name: "getTables", args?: GetTablesRequest["args"]): Promise<GetTablesResponse>;
95-
export async function request(name: "getColumns", args: GetColumnsRequest["args"]): Promise<GetColumnsResponse>;
96-
export async function request(name: "getConnectionInfo"): Promise<GetConnectionInfoResponse>;
97-
export async function request(name: "getAllTabs"): Promise<GetAllTabsResponse>;
98-
export async function request(name: "runQuery", args: RunQueryRequest["args"]): Promise<RunQueryResponse>;
99-
export async function request(name: "expandTableResult", args: ExpandTableResultRequest["args"]): Promise<ExpandTableResultResponse>;
100-
export async function request(name: "setTabTitle", args: SetTabTitleRequest["args"]): Promise<SetTabTitleResponse>;
101-
export async function request<T extends unknown>(name: "getViewState", args: GetViewStateRequest["args"]): Promise<GetViewStateResponse<T>>;
102-
export async function request<T extends unknown>(name: "setViewState", args: SetViewStateRequest<T>["args"]): Promise<SetViewStateResponse>;
103-
export async function request<T extends unknown>(name: "openExternal", args: OpenExternalRequest["args"]): Promise<OpenExternalResponse>;
104-
export async function request<T extends unknown>(name: "getData", args: GetDataRequest["args"]): Promise<GetDataResponse<T>>;
105-
export async function request<T extends unknown>(name: "setData", args: SetDataRequest<T>["args"]): Promise<SetDataResponse>;
106-
export async function request<T extends unknown>(name: "getEncryptedData", args: GetEncryptedDataRequest["args"]): Promise<GetEncryptedDataResponse<T>>;
107-
export async function request<T extends unknown>(name: "setEncryptedData", args: SetEncryptedDataRequest<T>["args"]): Promise<SetEncryptedDataResponse>;
108-
export async function request(name: unknown, args?: unknown): Promise<unknown> {
66+
export async function request(payload: any): Promise<any> {
67+
const fullPayload = {
68+
id: generateUUID(),
69+
...payload,
70+
} as PluginRequestPayload;
71+
10972
if (debugComms) {
11073
const time = new Date().toLocaleTimeString("en-GB");
111-
console.groupCollapsed(`${time} [REQUEST] ${name}`);
112-
console.log("Args:", args);
74+
console.groupCollapsed(`${time} [REQUEST] ${payload.name}`);
75+
console.log("Args:", payload.args);
11376
console.groupEnd();
11477
}
11578

11679
return new Promise<any>((resolve, reject) => {
11780
try {
118-
const id = generateUUID();
119-
const data = { id, name, args };
120-
pendingRequests.set(id, { name: name as string, resolve, reject });
121-
window.parent.postMessage(data, "*");
81+
pendingRequests.set(fullPayload.id, { payload: fullPayload, resolve, reject });
82+
window.parent.postMessage(payload, "*");
12283
} catch (e) {
12384
reject(e);
12485
}

src/index.ts

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,91 @@
1+
import { request } from "./comms";
2+
import type {
3+
GetTablesRequest,
4+
GetColumnsRequest,
5+
RunQueryRequest,
6+
ExpandTableResultRequest,
7+
SetTabTitleRequest,
8+
SetViewStateRequest,
9+
OpenExternalRequest,
10+
SetDataRequest,
11+
SetEncryptedDataRequest,
12+
} from "./requestTypes";
13+
import type {
14+
GetTablesResponse,
15+
GetColumnsResponse,
16+
GetConnectionInfoResponse,
17+
GetAllTabsResponse,
18+
RunQueryResponse,
19+
ExpandTableResultResponse,
20+
SetTabTitleResponse,
21+
GetViewStateResponse,
22+
SetViewStateResponse,
23+
OpenExternalResponse,
24+
GetDataResponse,
25+
SetDataResponse,
26+
GetEncryptedDataResponse,
27+
SetEncryptedDataResponse,
28+
} from "./responseTypes";
29+
30+
export async function getTables(args?: GetTablesRequest['args']): Promise<GetTablesResponse['result']> {
31+
return await request({ name: "getTables", args: args || {} });
32+
}
33+
34+
export async function getColumns(args: GetColumnsRequest['args']): Promise<GetColumnsResponse['result']> {
35+
return await request({ name: "getColumns", args });
36+
}
37+
38+
export async function getConnectionInfo(): Promise<GetConnectionInfoResponse['result']> {
39+
return await request({ name: "getConnectionInfo", args: void 0 });
40+
}
41+
42+
export async function getAllTabs(): Promise<GetAllTabsResponse['result']> {
43+
return await request({ name: "getAllTabs", args: void 0 });
44+
}
45+
46+
export async function runQuery(args: RunQueryRequest['args']): Promise<RunQueryResponse['result']> {
47+
return await request({ name: "runQuery", args });
48+
}
49+
50+
export async function expandTableResult(args: ExpandTableResultRequest['args']): Promise<ExpandTableResultResponse['result']> {
51+
return await request({ name: "expandTableResult", args });
52+
}
53+
54+
export async function setTabTitle(args: SetTabTitleRequest['args']): Promise<SetTabTitleResponse['result']> {
55+
return await request({ name: "setTabTitle", args });
56+
}
57+
58+
export async function getViewState<T>(): Promise<GetViewStateResponse<T>['result']> {
59+
return await request({ name: "getViewState", args: void 0 });
60+
}
61+
62+
export async function setViewState<T>(args: SetViewStateRequest<T>['args']): Promise<SetViewStateResponse['result']> {
63+
return await request({ name: "setViewState", args });
64+
}
65+
66+
export async function openExternal(args: OpenExternalRequest['args']): Promise<OpenExternalResponse['result']> {
67+
return await request({ name: "openExternal", args });
68+
}
69+
70+
export async function getData<T>(): Promise<GetDataResponse<T>['result']> {
71+
return await request({ name: "getData", args: void 0 });
72+
}
73+
74+
export async function setData<T>(args: SetDataRequest<T>['args']): Promise<SetDataResponse['result']> {
75+
return await request({ name: "setData", args });
76+
}
77+
78+
export async function getEncryptedData<T>(): Promise<GetEncryptedDataResponse<T>['result']> {
79+
return await request({ name: "getEncryptedData", args: void 0 });
80+
}
81+
82+
export async function setEncryptedData<T>(args: SetEncryptedDataRequest<T>['args']): Promise<SetEncryptedDataResponse['result']> {
83+
return await request({ name: "setEncryptedData", args });
84+
}
85+
186
export * from "./commonTypes";
287
export * from "./requestTypes";
388
export * from "./responseTypes";
489
export * from "./notificationTypes";
590
export * from "./comms";
91+

src/requestTypes.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,3 +104,5 @@ export type PluginRequestData =
104104
| SetDataRequest<unknown>
105105
| GetEncryptedDataRequest
106106
| SetEncryptedDataRequest<unknown>;
107+
108+
export type PluginRequestPayload = PluginRequestData;

0 commit comments

Comments
 (0)