@beekeeperstudio/plugin 1.6.0 → 1.7.1-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"eventForwarder.js","sources":["../src/index.ts","../src/eventForwarder.ts"],"sourcesContent":["import type { AppInfo, AppTheme, Column, ConfirmOptions, ConnectionInfo, JsonValue, OpenQueryTabOptions, OpenTableStructureTabOptions, OpenTableTableTabOptions, PluginErrorObject, PluginViewContext, PrimaryKey, QueryResult, RequestFileSaveOptions, RunQueryResult, Table, TableIndex, TableKey, WindowEventObject } from \"./types\";\nimport type { RequestMap } from \"./internal\";\n\nexport * from \"./types\";\n\n/**\n * Get a list of schemas from the current database.\n *\n * @since Beekeeper Studio 5.5.0\n **/\nexport async function getSchemas(): Promise<string[]> {\n return await request({ name: \"getSchemas\", args: void 0 });\n}\n\n/**\n * Get a list of tables from the current database.\n *\n * @since Beekeeper Studio 5.3.0\n **/\nexport async function getTables(schema?: string): Promise<Table[]> {\n return await request({ name: \"getTables\", args: { schema } });\n}\n\n/**\n * Get a list of columns from a table.\n *\n * @since Beekeeper Studio 5.3.0\n **/\nexport async function getColumns(table: string, schema?: string): Promise<Column[]> {\n return await request({ name: \"getColumns\", args: { table, schema } });\n}\n\n/** @since Beekeeper Studio 5.4.0 */\nexport async function getTableKeys(table: string, schema?: string): Promise<TableKey[]> {\n return await request({ name: \"getTableKeys\", args: { table, schema } });\n}\n\n/** @since Beekeeper Studio 5.5.0 */\nexport async function getTableIndexes(table: string, schema?: string): Promise<TableIndex[]> {\n return await request({ name: \"getTableIndexes\", args: { table, schema } });\n}\n\nexport async function getPrimaryKeys(table: string, schema?: string): Promise<PrimaryKey[]> {\n return await request({ name: \"getPrimaryKeys\", args: { table, schema } });\n}\n\nexport async function getIncomingKeys(table: string, schema?: string): Promise<TableKey[]> {\n return await request({ name: \"getIncomingKeys\", args: { table, schema } });\n}\n\nexport async function getOutgoingKeys(table: string, schema?: string): Promise<TableKey[]> {\n return await request({ name: \"getOutgoingKeys\", args: { table, schema } });\n}\n\n/**\n * Get information about the current database connection.\n *\n * @since Beekeeper Studio 5.3.0\n **/\nexport async function getConnectionInfo(): Promise<ConnectionInfo> {\n return await request({ name: \"getConnectionInfo\", args: void 0 });\n}\n\n/** @since Beekeeper Studio 5.4.0 */\nexport async function getAppInfo(): Promise<AppInfo> {\n return await request({ name: \"getAppInfo\", args: void 0 });\n}\n\n/**\n * Get the version of Beekeeper Studio\n * @since Beekeeper Studio 5.3.0\n **/\nexport async function getAppVersion(): Promise<\"5.3\" | (string & { __brand?: never })> {\n try {\n const appInfo = await getAppInfo();\n return appInfo.version;\n } catch (e) {\n if (e instanceof Error && e.message.includes(\"Unknown request\")) {\n return \"5.3\";\n }\n throw e;\n }\n}\n\n/**\n * Check if plugin's update is available.\n *\n * @since Beekeeper Studio 5.4.0\n **/\nexport async function checkForUpdate(): Promise<boolean> {\n return await request({ name: \"checkForUpdate\", args: void 0 });\n}\n\n/**\n * Execute a SQL query against the current database.\n *\n * WARNING: The query will be executed exactly as provided with no modification\n * or sanitization. Always validate and sanitize user input before including it\n * in queries to prevent unwanted actions.\n *\n * @since Beekeeper Studio 5.3.0\n **/\nexport async function runQuery(query: string): Promise<RunQueryResult> {\n return await request({ name: \"runQuery\", args: { query } });\n}\n\n/**\n * Display query results in the bottom table panel (shell-type tabs only).\n *\n * @since Beekeeper Studio 5.3.0\n **/\nexport async function expandTableResult(results: QueryResult[]): Promise<void> {\n return await request({ name: \"expandTableResult\", args: { results } });\n}\n\n/**\n * Set the title of the current plugin tab.\n *\n * @since Beekeeper Studio 5.3.0\n **/\nexport async function setTabTitle(title: string): Promise<void> {\n return await request({ name: \"setTabTitle\", args: { title } });\n}\n\n/**\n * Get the current view context.\n *\n * A view context describes how this plugin view was opened and what data is\n * available for it. It always includes the static `command` from your\n * `manifest.json`, and may also include dynamic `params` depending on where\n * the menu was invoked.\n *\n * @since Beekeeper Studio 5.4.0\n **/\nexport async function getViewContext(): Promise<PluginViewContext> {\n return await request({ name: \"getViewContext\", args: void 0 });\n}\n\n/**\n * Get the current state of your view instance.\n *\n * @see {@link https://docs.beekeeperstudio.io/plugin_development/plugin-views/#view-state|View State}\n * @since Beekeeper Studio 5.3.0\n **/\nexport async function getViewState<T = unknown>(): Promise<T> {\n return await request({ name: \"getViewState\", args: void 0 });\n}\n\n/**\n * Set the state of your view instance.\n *\n * @see {@link https://docs.beekeeperstudio.io/plugin_development/plugin-views/#view-state|View State}\n * @since Beekeeper Studio 5.3.0\n **/\nexport async function setViewState<T = unknown>(state: T): Promise<void> {\n return await request({ name: \"setViewState\", args: { state } });\n}\n\n/** @since Beekeeper Studio 5.3.0 */\nexport async function openExternal(link: string): Promise<void> {\n return await request({ name: \"openExternal\", args: { link } });\n}\n\n/** @since Beekeeper Studio 5.3.0 */\nexport async function getData<T = unknown>(key: string = \"default\"): Promise<T> {\n return await request({ name: \"getData\", args: { key } });\n}\n\n/**\n * Store data that can be retrieved later.\n *\n * @example\n * // Store with custom key\n * await setData(\"myKey\", { name: \"John\" });\n *\n * // Store with default key (equivalent to setData(\"default\", value))\n * await setData({ name: \"John\" });\n *\n * @since Beekeeper Studio 5.3.0\n */\nexport async function setData<T = unknown>(key: string, value: T): Promise<void>;\nexport async function setData<T = unknown>(value: T): Promise<void>;\nexport async function setData<T = unknown>(keyOrValue: string | T, value?: T): Promise<void> {\n if (value !== undefined) {\n return await request({ name: \"setData\", args: { key: keyOrValue as string, value } });\n } else {\n return await request({ name: \"setData\", args: { key: \"default\", value: keyOrValue as T } });\n }\n}\n\n/** @since Beekeeper Studio 5.3.0 */\nexport async function getEncryptedData<T>(key: string): Promise<T> {\n return await request({ name: \"getEncryptedData\", args: { key } });\n}\n\n/**\n * Store encrypted data that can be retrieved later.\n *\n * @example\n * // Store with custom key\n * await setEncryptedData(\"secretKey\", { token: \"abc123\" });\n *\n * // Store with default key (equivalent to setEncryptedData(\"default\", value))\n * await setEncryptedData({ token: \"abc123\" });\n *\n * @since Beekeeper Studio 5.3.0\n */\nexport async function setEncryptedData<T = unknown>(key: string, value: T): Promise<void>;\nexport async function setEncryptedData<T = unknown>(value: T): Promise<void>;\nexport async function setEncryptedData<T = unknown>(keyOrValue: string | T, value?: T): Promise<void> {\n if (value !== undefined) {\n return await request({ name: \"setEncryptedData\", args: { key: keyOrValue as string, value } });\n } else {\n return await request({ name: \"setEncryptedData\", args: { key: \"default\", value: keyOrValue as T } });\n }\n}\n\n/** @since Beekeeper Studio 5.4.0 */\nexport async function openTab(type: \"query\", options?: OpenQueryTabOptions): Promise<void>;\nexport async function openTab(type: \"tableTable\", options: OpenTableTableTabOptions): Promise<void>;\nexport async function openTab(type: \"tableStructure\", options: OpenTableStructureTabOptions): Promise<void>;\nexport async function openTab(\n type: \"query\" | \"tableTable\" | \"tableStructure\",\n options?:\n OpenQueryTabOptions\n | OpenTableTableTabOptions\n | OpenTableStructureTabOptions\n): Promise<void> {\n return await request({ name: \"openTab\", args: { type, ...options } });\n}\n\nexport async function requestFileSave(options: RequestFileSaveOptions): Promise<void> {\n return await request({ name: \"requestFileSave\", args: options });\n}\n\nexport async function showStatusBarUI(): Promise<void> {\n return await request({ name: \"toggleStatusBarUI\", args: { force: true } });\n}\n\nexport async function hideStatusBarUI(): Promise<void> {\n return await request({ name: \"toggleStatusBarUI\", args: { force: false } });\n}\n\n/** @since Beekeeper Studio 5.5.? */\nexport async function toggleStatusBarUI(): Promise<void> {\n return await request({ name: \"toggleStatusBarUI\", args: void 0 });\n}\n\n/** @since Beekeeper Studio 5.5.? */\nexport async function confirm(title?: string, message?: string, options?: ConfirmOptions): Promise<boolean> {\n return await request({ name: \"confirm\", args: { title, message, options } });\n}\n\n/** @since Beekeeper Studio 5.4.0 */\nexport const broadcast = {\n post<T extends JsonValue = JsonValue>(message: T): void {\n return notify(\"broadcast\", { message });\n },\n on<T extends JsonValue = JsonValue>(handler: (message: T) => void): void {\n addNotificationListener<T>(\"broadcast\", (params) => {\n handler(params.message);\n });\n },\n}\n\n/** @since Beekeeper Studio 5.3.0 */\nexport const log = {\n error(err: string | Error): void {\n if (typeof err === \"string\") {\n return notify(\"pluginError\", {\n name: \"Error\",\n message: err,\n stack: undefined,\n });\n }\n return notify(\"pluginError\", {\n name: err.name || \"Error\",\n message: err.message,\n stack: err.stack,\n });\n },\n}\n\n/** Clipboard interface. */\nexport const clipboard = {\n /** Write text to the Electron clipboard.\n * @since Beekeeper Studio 5.3.0 */\n async writeText(text: string): Promise<void> {\n await request({\n name: \"clipboard.writeText\",\n args: { text },\n });\n },\n /** Read text from the Electron clipboard.\n * @since Beekeeper Studio 5.3.0 */\n async readText(): Promise<string> {\n return await request({\n name: \"clipboard.readText\",\n args: void 0,\n });\n },\n /** @param data - Base64 encoded image data.\n * @since Beekeeper Studio 5.5.0 */\n async writeImage(data: string) {\n await request({\n name: \"clipboard.writeImage\",\n args: { data },\n });\n },\n // async write() {},\n // async read() {},\n};\n\n/** @since Beekeeper Studio 5.5.? */\nexport const noty = {\n async success(message: string): Promise<void> {\n return await request({\n name: \"noty.success\",\n args: { message },\n });\n },\n async info(message: string): Promise<void> {\n return await request({\n name: \"noty.info\",\n args: { message },\n });\n },\n async warning(message: string): Promise<void> {\n return await request({\n name: \"noty.warning\",\n args: { message },\n });\n },\n async error(message: string): Promise<void> {\n return await request({\n name: \"noty.error\",\n args: { message },\n });\n },\n}\n\nlet debugComms = false;\n\nexport function setDebugComms(enabled: boolean) {\n debugComms = enabled;\n}\n\nexport function notify<Message extends JsonValue = JsonValue>(\n name: \"broadcast\",\n args: { message: Message; }\n): void;\nexport function notify(name: \"pluginError\", args: PluginErrorObject): void;\nexport function notify(name: \"windowEvent\", args: WindowEventObject): void;\nexport function notify(name: string, args: any) {\n const payload = { name, args };\n if (debugComms) {\n const time = new Date().toLocaleTimeString(\"en-GB\");\n console.groupCollapsed(`${time} [NOTIFICATION] ${name}`);\n console.log(\"args:\", args);\n console.log(\"payload:\", payload);\n console.groupEnd();\n }\n window.parent.postMessage(payload, \"*\");\n}\n\nexport function addNotificationListener(\n name: \"tablesChanged\",\n handler: () => void,\n): void;\nexport function addNotificationListener<Message extends JsonValue = JsonValue>(\n name: \"broadcast\",\n handler: (args: { message: Message; }) => void,\n): void;\nexport function addNotificationListener(\n name: \"themeChanged\",\n handler: (args: AppTheme) => void,\n): void;\nexport function addNotificationListener(\n name: string,\n handler: (args: any) => void,\n) {\n if (!notificationListeners.get(name)) {\n notificationListeners.set(name, []);\n }\n notificationListeners.get(name)!.push(handler);\n}\n\nexport function removeNotificationListener(\n name: \"tablesChanged\",\n handler: (args: any) => void\n): void;\nexport function removeNotificationListener<Message extends JsonValue = JsonValue>(\n name: \"broadcast\",\n handler: (args: any) => void\n): void;\nexport function removeNotificationListener(\n name: \"themeChanged\",\n handler: (args: any) => void\n): void;\nexport function removeNotificationListener(\n name: string,\n handler: (args: any) => void\n) {\n const handlers = notificationListeners.get(name);\n if (handlers) {\n const index = handlers.indexOf(handler);\n if (index > -1) {\n handlers.splice(index, 1);\n }\n }\n}\n\nconst pendingRequests = new Map<\n string,\n {\n // The whole payload is kept just in case for debugging\n payload: any;\n resolve: (value: any) => void;\n reject: (reason?: any) => void;\n }\n>();\n\nexport async function request<T extends keyof RequestMap>(\n raw: { name: T; args: RequestMap[T][\"args\"] }\n): Promise<RequestMap[T][\"return\"]> {\n const payload = { id: generateUUID(), ...raw };\n\n if (debugComms) {\n const time = new Date().toLocaleTimeString(\"en-GB\");\n console.groupCollapsed(`${time} [REQUEST] ${payload.name}`);\n console.log(\"id:\", payload.id);\n console.log(\"args:\", payload.args);\n console.log(\"payload:\", payload);\n console.groupEnd();\n }\n\n return new Promise<any>((resolve, reject) => {\n try {\n pendingRequests.set(payload.id, { payload: payload, resolve, reject });\n window.parent.postMessage(payload, \"*\");\n } catch (e) {\n reject(e);\n }\n });\n}\n\nconst notificationListeners = new Map<string, ((args: any) => void)[]>();\n\nwindow.addEventListener(\"message\", (event) => {\n const { id, name, args, result, error } = event.data || {};\n\n if (name) {\n if (debugComms) {\n const time = new Date().toLocaleTimeString(\"en-GB\");\n console.groupCollapsed(`${time} [NOTIFICATION] ${name}`);\n console.log(\"Args:\", args);\n console.groupEnd();\n }\n\n const handlers = notificationListeners.get(name);\n if (handlers) {\n handlers.forEach((handler) => handler(args));\n }\n }\n\n if (id && pendingRequests.has(id)) {\n const { resolve, reject, payload } = pendingRequests.get(id)!;\n pendingRequests.delete(id);\n\n if (debugComms) {\n const time = new Date().toLocaleTimeString(\"en-GB\");\n console.groupCollapsed(`${time} [RESPONSE] ${payload.name}`);\n console.log(\"Result:\", result);\n if (error) console.error(\"Error:\", error);\n console.groupEnd();\n }\n\n if (error) {\n reject(error);\n } else {\n resolve(result);\n }\n }\n});\n\nfunction generateUUID() {\n const buf = new Uint8Array(16);\n crypto.getRandomValues(buf);\n\n buf[6] = (buf[6] & 0x0f) | 0x40; // version 4\n buf[8] = (buf[8] & 0x3f) | 0x80; // variant\n\n const hex = Array.from(buf, (b) => b.toString(16).padStart(2, \"0\")).join(\"\");\n\n return [\n hex.substring(0, 8),\n hex.substring(8, 12),\n hex.substring(12, 16),\n hex.substring(16, 20),\n hex.substring(20),\n ].join(\"-\");\n}\n\n","/** Any events that need to be forwarded to parent/plugin system\n * must go here */\n\n/** FIXME this file must be injected from the plugin system automatically */\n\nimport { notify } from \".\";\nimport { WindowEventInits, WindowEventClass } from \"./types\";\n\nfunction createEventInit<T>(event: T): {\n eventClass: WindowEventClass;\n eventInitOptions: WindowEventInits;\n} {\n if (event instanceof MouseEvent) {\n const eventInitOptions: MouseEventInit = {\n clientX: event.clientX,\n clientY: event.clientY,\n screenX: event.screenX,\n screenY: event.screenY,\n button: event.button,\n buttons: event.buttons,\n altKey: event.altKey,\n ctrlKey: event.ctrlKey,\n shiftKey: event.shiftKey,\n metaKey: event.metaKey,\n movementX: event.movementX,\n movementY: event.movementY,\n detail: event.detail,\n };\n return {\n eventClass: \"MouseEvent\",\n eventInitOptions,\n };\n }\n\n if (event instanceof PointerEvent) {\n const eventInitOptions: PointerEventInit = {\n clientX: event.clientX,\n clientY: event.clientY,\n screenX: event.screenX,\n screenY: event.screenY,\n button: event.button,\n buttons: event.buttons,\n altKey: event.altKey,\n ctrlKey: event.ctrlKey,\n shiftKey: event.shiftKey,\n metaKey: event.metaKey,\n movementX: event.movementX,\n movementY: event.movementY,\n detail: event.detail,\n pointerId: event.pointerId,\n pointerType: event.pointerType,\n isPrimary: event.isPrimary,\n };\n return {\n eventClass: \"PointerEvent\",\n eventInitOptions,\n };\n }\n\n if (event instanceof KeyboardEvent) {\n const isPasswordField =\n (event.target as HTMLInputElement)?.type === \"password\";\n\n if (isPasswordField) {\n // Avoid logging keystrokes from password fields\n return {\n eventClass: \"KeyboardEvent\",\n eventInitOptions: {},\n };\n }\n\n const eventInitOptions: KeyboardEventInit = {\n key: event.key,\n code: event.code,\n keyCode: event.keyCode,\n location: event.location,\n altKey: event.altKey,\n ctrlKey: event.ctrlKey,\n shiftKey: event.shiftKey,\n metaKey: event.metaKey,\n repeat: event.repeat,\n isComposing: event.isComposing,\n };\n\n return {\n eventClass: \"KeyboardEvent\",\n eventInitOptions,\n };\n }\n\n return {\n eventClass: \"Event\",\n eventInitOptions: {},\n };\n}\n\nconst forwardedEvents = [\n \"contextmenu\",\n \"click\",\n \"dblclick\",\n \"pointercancel\",\n \"pointerdown\",\n \"pointerenter\",\n \"pointerleave\",\n \"pointermove\",\n \"pointerout\",\n \"pointerover\",\n \"pointerup\",\n \"mousedown\",\n \"mouseenter\",\n \"mouseleave\",\n \"mousemove\",\n \"mouseout\",\n \"mouseover\",\n \"mouseup\",\n \"keydown\",\n \"keypress\",\n \"keyup\",\n] as const;\n\nforwardedEvents.forEach((eventType) => {\n document.addEventListener(eventType, (event) => {\n const eventInit = createEventInit(event);\n notify(\"windowEvent\", {\n eventType,\n eventClass: eventInit.eventClass,\n eventInitOptions: eventInit.eventInitOptions,\n });\n });\n});\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"eventForwarder.js","sources":["../src/index.ts","../src/eventForwarder.ts"],"sourcesContent":["import type {\n AppInfo,\n AppTheme,\n Column,\n ConfirmOptions,\n ConnectionInfo,\n JsonValue,\n OpenQueryTabOptions,\n OpenTableStructureTabOptions,\n OpenTableTableTabOptions,\n PluginErrorObject,\n PluginViewContext,\n PrimaryKey,\n QueryResult,\n RequestFileSaveOptions,\n RunQueryResult,\n Table,\n TableIndex,\n TableKey,\n WindowEventObject,\n WorkspaceInfo,\n} from \"./types\";\nimport type { RequestMap } from \"./internal\";\n\nexport * from \"./types\";\n\n/**\n * Get a list of schemas from the current database.\n *\n * @since Beekeeper Studio 5.5.0\n **/\nexport async function getSchemas(): Promise<string[]> {\n return await request({ name: \"getSchemas\", args: void 0 });\n}\n\n/**\n * Get a list of tables from the current database.\n *\n * @since Beekeeper Studio 5.3.0\n **/\nexport async function getTables(schema?: string): Promise<Table[]> {\n return await request({ name: \"getTables\", args: { schema } });\n}\n\n/**\n * Get a list of columns from a table.\n *\n * @since Beekeeper Studio 5.3.0\n **/\nexport async function getColumns(\n table: string,\n schema?: string,\n): Promise<Column[]> {\n return await request({ name: \"getColumns\", args: { table, schema } });\n}\n\n/** @since Beekeeper Studio 5.4.0 */\nexport async function getTableKeys(\n table: string,\n schema?: string,\n): Promise<TableKey[]> {\n return await request({ name: \"getTableKeys\", args: { table, schema } });\n}\n\n/** @since Beekeeper Studio 5.5.0 */\nexport async function getTableIndexes(\n table: string,\n schema?: string,\n): Promise<TableIndex[]> {\n return await request({ name: \"getTableIndexes\", args: { table, schema } });\n}\n\nexport async function getPrimaryKeys(\n table: string,\n schema?: string,\n): Promise<PrimaryKey[]> {\n return await request({ name: \"getPrimaryKeys\", args: { table, schema } });\n}\n\nexport async function getIncomingKeys(\n table: string,\n schema?: string,\n): Promise<TableKey[]> {\n return await request({ name: \"getIncomingKeys\", args: { table, schema } });\n}\n\nexport async function getOutgoingKeys(\n table: string,\n schema?: string,\n): Promise<TableKey[]> {\n return await request({ name: \"getOutgoingKeys\", args: { table, schema } });\n}\n\n/**\n * Get information about the current database connection.\n *\n * @since Beekeeper Studio 5.3.0\n **/\nexport async function getConnectionInfo(): Promise<ConnectionInfo> {\n return await request({ name: \"getConnectionInfo\", args: void 0 });\n}\n\n/**\n * Get information about the current workspace.\n *\n * @since Beekeeper Studio 5.5.?\n **/\nexport async function getWorkspaceInfo(): Promise<WorkspaceInfo> {\n return await request({ name: \"getWorkspaceInfo\", args: void 0 });\n}\n\n/** @since Beekeeper Studio 5.4.0 */\nexport async function getAppInfo(): Promise<AppInfo> {\n return await request({ name: \"getAppInfo\", args: void 0 });\n}\n\n/**\n * Get the version of Beekeeper Studio\n * @since Beekeeper Studio 5.3.0\n **/\nexport async function getAppVersion(): Promise<\n \"5.3\" | (string & { __brand?: never })\n> {\n try {\n const appInfo = await getAppInfo();\n return appInfo.version;\n } catch (e) {\n if (e instanceof Error && e.message.includes(\"Unknown request\")) {\n return \"5.3\";\n }\n throw e;\n }\n}\n\n/**\n * Check if plugin's update is available.\n *\n * @since Beekeeper Studio 5.4.0\n **/\nexport async function checkForUpdate(): Promise<boolean> {\n return await request({ name: \"checkForUpdate\", args: void 0 });\n}\n\n/**\n * Execute a SQL query against the current database.\n *\n * WARNING: The query will be executed exactly as provided with no modification\n * or sanitization. Always validate and sanitize user input before including it\n * in queries to prevent unwanted actions.\n *\n * @since Beekeeper Studio 5.3.0\n **/\nexport async function runQuery(query: string): Promise<RunQueryResult> {\n return await request({ name: \"runQuery\", args: { query } });\n}\n\n/**\n * Display query results in the bottom table panel (shell-type tabs only).\n *\n * @since Beekeeper Studio 5.3.0\n **/\nexport async function expandTableResult(results: QueryResult[]): Promise<void> {\n return await request({ name: \"expandTableResult\", args: { results } });\n}\n\n/**\n * Set the title of the current plugin tab.\n *\n * @since Beekeeper Studio 5.3.0\n **/\nexport async function setTabTitle(title: string): Promise<void> {\n return await request({ name: \"setTabTitle\", args: { title } });\n}\n\n/**\n * Get the current view context.\n *\n * A view context describes how this plugin view was opened and what data is\n * available for it. It always includes the static `command` from your\n * `manifest.json`, and may also include dynamic `params` depending on where\n * the menu was invoked.\n *\n * @since Beekeeper Studio 5.4.0\n **/\nexport async function getViewContext(): Promise<PluginViewContext> {\n return await request({ name: \"getViewContext\", args: void 0 });\n}\n\n/**\n * Get the current state of your view instance.\n *\n * @see {@link https://docs.beekeeperstudio.io/plugin_development/plugin-views/#view-state|View State}\n * @since Beekeeper Studio 5.3.0\n **/\nexport async function getViewState<T = unknown>(): Promise<T> {\n return await request({ name: \"getViewState\", args: void 0 });\n}\n\n/**\n * Set the state of your view instance.\n *\n * @see {@link https://docs.beekeeperstudio.io/plugin_development/plugin-views/#view-state|View State}\n * @since Beekeeper Studio 5.3.0\n **/\nexport async function setViewState<T = unknown>(state: T): Promise<void> {\n return await request({ name: \"setViewState\", args: { state } });\n}\n\n/** @since Beekeeper Studio 5.3.0 */\nexport async function openExternal(link: string): Promise<void> {\n return await request({ name: \"openExternal\", args: { link } });\n}\n\n/** @since Beekeeper Studio 5.4.0 */\nexport async function openTab(\n type: \"query\",\n options?: OpenQueryTabOptions,\n): Promise<void>;\nexport async function openTab(\n type: \"tableTable\",\n options: OpenTableTableTabOptions,\n): Promise<void>;\nexport async function openTab(\n type: \"tableStructure\",\n options: OpenTableStructureTabOptions,\n): Promise<void>;\nexport async function openTab(\n type: \"query\" | \"tableTable\" | \"tableStructure\",\n options?:\n | OpenQueryTabOptions\n | OpenTableTableTabOptions\n | OpenTableStructureTabOptions,\n): Promise<void> {\n return await request({ name: \"openTab\", args: { type, ...options } });\n}\n\nexport async function requestFileSave(\n options: RequestFileSaveOptions,\n): Promise<void> {\n return await request({ name: \"requestFileSave\", args: options });\n}\n\nexport async function showStatusBarUI(): Promise<void> {\n return await request({ name: \"toggleStatusBarUI\", args: { force: true } });\n}\n\nexport async function hideStatusBarUI(): Promise<void> {\n return await request({ name: \"toggleStatusBarUI\", args: { force: false } });\n}\n\n/** @since Beekeeper Studio 5.5.? */\nexport async function toggleStatusBarUI(): Promise<void> {\n return await request({ name: \"toggleStatusBarUI\", args: void 0 });\n}\n\n/** @since Beekeeper Studio 5.5.? */\nexport async function confirm(\n title?: string,\n message?: string,\n options?: ConfirmOptions,\n): Promise<boolean> {\n return await request({ name: \"confirm\", args: { title, message, options } });\n}\n\n/** @since Beekeeper Studio 5.4.0 */\nexport const broadcast = {\n post<T extends JsonValue = JsonValue>(message: T): void {\n return notify(\"broadcast\", { message });\n },\n on<T extends JsonValue = JsonValue>(handler: (message: T) => void): void {\n addNotificationListener<T>(\"broadcast\", (params) => {\n handler(params.message);\n });\n },\n};\n\nclass PluginLog {\n error(err: string | Error): void {\n const logStack = new Error().stack!;\n\n if (typeof err === \"string\") {\n return notify(\"pluginError\", {\n name: \"Error\",\n message: err,\n stack: logStack,\n logStack,\n });\n }\n return notify(\"pluginError\", {\n name: err.name || \"Error\",\n message: err.message,\n stack: err.stack,\n logStack,\n });\n }\n}\n\n/** @since Beekeeper Studio 5.3.0 */\nexport const log = new PluginLog();\n\n/** Clipboard interface. */\nexport const clipboard = {\n /** Write text to the Electron clipboard.\n * @since Beekeeper Studio 5.3.0 */\n async writeText(text: string): Promise<void> {\n await request({\n name: \"clipboard.writeText\",\n args: { text },\n });\n },\n /** Read text from the Electron clipboard.\n * @since Beekeeper Studio 5.3.0 */\n async readText(): Promise<string> {\n return await request({\n name: \"clipboard.readText\",\n args: void 0,\n });\n },\n /** @param data - Base64 encoded image data.\n * @since Beekeeper Studio 5.5.0 */\n async writeImage(data: string) {\n await request({\n name: \"clipboard.writeImage\",\n args: { data },\n });\n },\n // async write() {},\n // async read() {},\n};\n\n/**\n * Similar to `localStorage`, `appStorage` is a persistent storage that persists\n * across sessions. The data is stored in the local database of the app and\n * scoped to the plugin.\n *\n * @since Beekeeper Studio 5.3.0\n **/\nexport const appStorage = {\n async getItem<T = unknown>(\n key: string,\n options?: {\n encrypted: boolean;\n },\n ): Promise<T | null> {\n if (options?.encrypted) {\n return await request({\n name: \"getEncryptedData\",\n args: { key },\n });\n }\n return await request({ name: \"getData\", args: { key } });\n },\n async setItem<T = unknown>(\n key: string,\n value: T,\n options?: {\n encrypted: boolean;\n },\n ): Promise<void> {\n if (options?.encrypted) {\n return await request({\n name: \"setEncryptedData\",\n args: { key, value },\n });\n }\n return await request({ name: \"setData\", args: { key, value } });\n },\n // TODO\n // async removeItem(key: string): Promise<void> {},\n // async clear(): Promise<void> {},\n};\n\nexport const workspaceConnectionStorage = {\n async getItem<T = unknown>(key: string): Promise<T | null> {\n return await request({\n name: \"workspaceConnectionStorage.getItem\",\n args: { key },\n });\n },\n async setItem<T = unknown>(key: string, value: T): Promise<void> {\n return await request({\n name: \"workspaceConnectionStorage.setItem\",\n args: { key, value },\n });\n },\n // TODO\n // async removeItem(key: string): Promise<void> {},\n // async clear(): Promise<void> {},\n};\n\n/** @since Beekeeper Studio 5.5.? */\nexport const noty = {\n async success(message: string): Promise<void> {\n return await request({\n name: \"noty.success\",\n args: { message },\n });\n },\n async info(message: string): Promise<void> {\n return await request({\n name: \"noty.info\",\n args: { message },\n });\n },\n async warning(message: string): Promise<void> {\n return await request({\n name: \"noty.warning\",\n args: { message },\n });\n },\n async error(message: string): Promise<void> {\n return await request({\n name: \"noty.error\",\n args: { message },\n });\n },\n};\n\nlet debugComms = false;\n\nexport function setDebugComms(enabled: boolean) {\n debugComms = enabled;\n}\n\nexport function notify<Message extends JsonValue = JsonValue>(\n name: \"broadcast\",\n args: { message: Message },\n): void;\nexport function notify(name: \"pluginError\", args: PluginErrorObject): void;\nexport function notify(name: \"windowEvent\", args: WindowEventObject): void;\nexport function notify(name: string, args: any) {\n const payload = { name, args };\n if (debugComms) {\n const time = new Date().toLocaleTimeString(\"en-GB\");\n console.groupCollapsed(`${time} [NOTIFICATION] ${name}`);\n console.log(\"args:\", args);\n console.log(\"payload:\", payload);\n console.groupEnd();\n }\n window.parent.postMessage(payload, \"*\");\n}\n\nexport function addNotificationListener(\n name: \"tablesChanged\",\n handler: () => void,\n): void;\nexport function addNotificationListener<Message extends JsonValue = JsonValue>(\n name: \"broadcast\",\n handler: (args: { message: Message }) => void,\n): void;\nexport function addNotificationListener(\n name: \"themeChanged\",\n handler: (args: AppTheme) => void,\n): void;\nexport function addNotificationListener(\n name: \"dataPollSucceeded\",\n handler: () => void,\n): void;\nexport function addNotificationListener(\n name: string,\n handler: (args: any) => void,\n) {\n if (!notificationListeners.get(name)) {\n notificationListeners.set(name, []);\n }\n notificationListeners.get(name)!.push(handler);\n}\n\nexport function removeNotificationListener(\n name: \"tablesChanged\",\n handler: (args: any) => void,\n): void;\nexport function removeNotificationListener<\n Message extends JsonValue = JsonValue,\n>(name: \"broadcast\", handler: (args: any) => void): void;\nexport function removeNotificationListener(\n name: \"themeChanged\",\n handler: (args: any) => void,\n): void;\nexport function removeNotificationListener(\n name: string,\n handler: (args: any) => void,\n) {\n const handlers = notificationListeners.get(name);\n if (handlers) {\n const index = handlers.indexOf(handler);\n if (index > -1) {\n handlers.splice(index, 1);\n }\n }\n}\n\nconst pendingRequests = new Map<\n string,\n {\n // The whole payload is kept just in case for debugging\n payload: any;\n resolve: (value: any) => void;\n reject: (reason?: any) => void;\n }\n>();\n\nexport async function request<T extends keyof RequestMap>(raw: {\n name: T;\n args: RequestMap[T][\"args\"];\n}): Promise<RequestMap[T][\"return\"]> {\n const payload = { id: generateUUID(), ...raw };\n\n if (debugComms) {\n const time = new Date().toLocaleTimeString(\"en-GB\");\n console.groupCollapsed(`${time} [REQUEST] ${payload.name}`);\n console.log(\"id:\", payload.id);\n console.log(\"args:\", payload.args);\n console.log(\"payload:\", payload);\n console.groupEnd();\n }\n\n return new Promise<any>((resolve, reject) => {\n try {\n pendingRequests.set(payload.id, { payload: payload, resolve, reject });\n window.parent.postMessage(payload, \"*\");\n } catch (e) {\n reject(e);\n }\n });\n}\n\nconst notificationListeners = new Map<string, ((args: any) => void)[]>();\n\nwindow.addEventListener(\"message\", (event) => {\n const { id, name, args, result, error } = event.data || {};\n\n if (name) {\n if (debugComms) {\n const time = new Date().toLocaleTimeString(\"en-GB\");\n console.groupCollapsed(`${time} [NOTIFICATION] ${name}`);\n console.log(\"Args:\", args);\n console.groupEnd();\n }\n\n const handlers = notificationListeners.get(name);\n if (handlers) {\n handlers.forEach((handler) => handler(args));\n }\n }\n\n if (id && pendingRequests.has(id)) {\n const { resolve, reject, payload } = pendingRequests.get(id)!;\n pendingRequests.delete(id);\n\n if (debugComms) {\n const time = new Date().toLocaleTimeString(\"en-GB\");\n console.groupCollapsed(`${time} [RESPONSE] ${payload.name}`);\n console.log(\"Result:\", result);\n if (error) console.error(\"Error:\", error);\n console.groupEnd();\n }\n\n if (error) {\n reject(error);\n } else {\n resolve(result);\n }\n }\n});\n\nfunction generateUUID() {\n const buf = new Uint8Array(16);\n crypto.getRandomValues(buf);\n\n buf[6] = (buf[6] & 0x0f) | 0x40; // version 4\n buf[8] = (buf[8] & 0x3f) | 0x80; // variant\n\n const hex = Array.from(buf, (b) => b.toString(16).padStart(2, \"0\")).join(\"\");\n\n return [\n hex.substring(0, 8),\n hex.substring(8, 12),\n hex.substring(12, 16),\n hex.substring(16, 20),\n hex.substring(20),\n ].join(\"-\");\n}\n","/** Any events that need to be forwarded to parent/plugin system\n * must go here */\n\n/** FIXME this file must be injected from the plugin system automatically */\n\nimport { notify } from \".\";\nimport { WindowEventInits, WindowEventClass } from \"./types\";\n\nfunction createEventInit<T>(event: T): {\n eventClass: WindowEventClass;\n eventInitOptions: WindowEventInits;\n} {\n if (event instanceof MouseEvent) {\n const eventInitOptions: MouseEventInit = {\n clientX: event.clientX,\n clientY: event.clientY,\n screenX: event.screenX,\n screenY: event.screenY,\n button: event.button,\n buttons: event.buttons,\n altKey: event.altKey,\n ctrlKey: event.ctrlKey,\n shiftKey: event.shiftKey,\n metaKey: event.metaKey,\n movementX: event.movementX,\n movementY: event.movementY,\n detail: event.detail,\n };\n return {\n eventClass: \"MouseEvent\",\n eventInitOptions,\n };\n }\n\n if (event instanceof PointerEvent) {\n const eventInitOptions: PointerEventInit = {\n clientX: event.clientX,\n clientY: event.clientY,\n screenX: event.screenX,\n screenY: event.screenY,\n button: event.button,\n buttons: event.buttons,\n altKey: event.altKey,\n ctrlKey: event.ctrlKey,\n shiftKey: event.shiftKey,\n metaKey: event.metaKey,\n movementX: event.movementX,\n movementY: event.movementY,\n detail: event.detail,\n pointerId: event.pointerId,\n pointerType: event.pointerType,\n isPrimary: event.isPrimary,\n };\n return {\n eventClass: \"PointerEvent\",\n eventInitOptions,\n };\n }\n\n if (event instanceof KeyboardEvent) {\n const isPasswordField =\n (event.target as HTMLInputElement)?.type === \"password\";\n\n if (isPasswordField) {\n // Avoid logging keystrokes from password fields\n return {\n eventClass: \"KeyboardEvent\",\n eventInitOptions: {},\n };\n }\n\n const eventInitOptions: KeyboardEventInit = {\n key: event.key,\n code: event.code,\n keyCode: event.keyCode,\n location: event.location,\n altKey: event.altKey,\n ctrlKey: event.ctrlKey,\n shiftKey: event.shiftKey,\n metaKey: event.metaKey,\n repeat: event.repeat,\n isComposing: event.isComposing,\n };\n\n return {\n eventClass: \"KeyboardEvent\",\n eventInitOptions,\n };\n }\n\n return {\n eventClass: \"Event\",\n eventInitOptions: {},\n };\n}\n\nconst forwardedEvents = [\n \"contextmenu\",\n \"click\",\n \"dblclick\",\n \"pointercancel\",\n \"pointerdown\",\n \"pointerenter\",\n \"pointerleave\",\n \"pointermove\",\n \"pointerout\",\n \"pointerover\",\n \"pointerup\",\n \"mousedown\",\n \"mouseenter\",\n \"mouseleave\",\n \"mousemove\",\n \"mouseout\",\n \"mouseover\",\n \"mouseup\",\n \"keydown\",\n \"keypress\",\n \"keyup\",\n] as const;\n\nforwardedEvents.forEach((eventType) => {\n document.addEventListener(eventType, (event) => {\n const eventInit = createEventInit(event);\n notify(\"windowEvent\", {\n eventType,\n eventClass: eventInit.eventClass,\n eventInitOptions: eventInit.eventInitOptions,\n });\n });\n});\n"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -21,7 +21,7 @@ interface TableKey {
21
21
  }
22
22
  type IndexColumn = {
23
23
  name: string;
24
- order?: 'ASC' | 'DESC' | '2d' | '2dsphere' | 'text' | 'geoHaystack' | 'hashed' | number;
24
+ order?: "ASC" | "DESC" | "2d" | "2dsphere" | "text" | "geoHaystack" | "hashed" | number;
25
25
  /** MySQL Only */
26
26
  prefix?: number | null;
27
27
  };
@@ -109,7 +109,7 @@ type PluginViewContext = {
109
109
  command: string;
110
110
  params?: CellMenuParams | ColumnMenuParams | RowMenuParams | CornerMenuParams;
111
111
  };
112
- type DatabaseType = 'postgresql' | 'mysql' | 'mariadb' | 'sqlite' | 'sqlserver' | 'oracle' | 'mongodb' | 'cassandra' | 'clickhouse' | 'firebird' | 'bigquery' | 'redshift' | 'duckdb' | 'libsql' | 'redis' | 'surrealdb' | 'trino';
112
+ type DatabaseType = "postgresql" | "mysql" | "mariadb" | "sqlite" | "sqlserver" | "oracle" | "mongodb" | "cassandra" | "clickhouse" | "firebird" | "bigquery" | "redshift" | "duckdb" | "libsql" | "redis" | "surrealdb" | "trino";
113
113
  type ConnectionInfo = {
114
114
  /** @alias databaseType */
115
115
  connectionType: string;
@@ -163,9 +163,10 @@ type RequestFileSaveOptions = {
163
163
  }[];
164
164
  };
165
165
  type PluginErrorObject = {
166
- name?: string;
166
+ name: string;
167
167
  message: string;
168
168
  stack?: string;
169
+ logStack: string;
169
170
  };
170
171
  type WindowEventObject = {
171
172
  eventType: string;
@@ -176,6 +177,12 @@ type ConfirmOptions = {
176
177
  confirmLabel?: string;
177
178
  cancelLabel?: string;
178
179
  };
180
+ type WorkspaceInfo = {
181
+ id: number;
182
+ type: "local" | "cloud";
183
+ name: string;
184
+ isOwner: boolean;
185
+ };
179
186
 
180
187
  type RequestMap = {
181
188
  getSchemas: {
@@ -234,6 +241,10 @@ type RequestMap = {
234
241
  args: void;
235
242
  return: ConnectionInfo;
236
243
  };
244
+ getWorkspaceInfo: {
245
+ args: void;
246
+ return: WorkspaceInfo;
247
+ };
237
248
  getAppInfo: {
238
249
  args: void;
239
250
  return: AppInfo;
@@ -353,6 +364,19 @@ type RequestMap = {
353
364
  args: void;
354
365
  return: string;
355
366
  };
367
+ "workspaceConnectionStorage.setItem": {
368
+ args: {
369
+ key: string;
370
+ value: any;
371
+ };
372
+ return: void;
373
+ };
374
+ "workspaceConnectionStorage.getItem": {
375
+ args: {
376
+ key: string;
377
+ };
378
+ return: any;
379
+ };
356
380
  "noty.success": {
357
381
  args: {
358
382
  message: string;
@@ -410,6 +434,12 @@ declare function getOutgoingKeys(table: string, schema?: string): Promise<TableK
410
434
  * @since Beekeeper Studio 5.3.0
411
435
  **/
412
436
  declare function getConnectionInfo(): Promise<ConnectionInfo>;
437
+ /**
438
+ * Get information about the current workspace.
439
+ *
440
+ * @since Beekeeper Studio 5.5.?
441
+ **/
442
+ declare function getWorkspaceInfo(): Promise<WorkspaceInfo>;
413
443
  /** @since Beekeeper Studio 5.4.0 */
414
444
  declare function getAppInfo(): Promise<AppInfo>;
415
445
  /**
@@ -474,38 +504,6 @@ declare function getViewState<T = unknown>(): Promise<T>;
474
504
  declare function setViewState<T = unknown>(state: T): Promise<void>;
475
505
  /** @since Beekeeper Studio 5.3.0 */
476
506
  declare function openExternal(link: string): Promise<void>;
477
- /** @since Beekeeper Studio 5.3.0 */
478
- declare function getData<T = unknown>(key?: string): Promise<T>;
479
- /**
480
- * Store data that can be retrieved later.
481
- *
482
- * @example
483
- * // Store with custom key
484
- * await setData("myKey", { name: "John" });
485
- *
486
- * // Store with default key (equivalent to setData("default", value))
487
- * await setData({ name: "John" });
488
- *
489
- * @since Beekeeper Studio 5.3.0
490
- */
491
- declare function setData<T = unknown>(key: string, value: T): Promise<void>;
492
- declare function setData<T = unknown>(value: T): Promise<void>;
493
- /** @since Beekeeper Studio 5.3.0 */
494
- declare function getEncryptedData<T>(key: string): Promise<T>;
495
- /**
496
- * Store encrypted data that can be retrieved later.
497
- *
498
- * @example
499
- * // Store with custom key
500
- * await setEncryptedData("secretKey", { token: "abc123" });
501
- *
502
- * // Store with default key (equivalent to setEncryptedData("default", value))
503
- * await setEncryptedData({ token: "abc123" });
504
- *
505
- * @since Beekeeper Studio 5.3.0
506
- */
507
- declare function setEncryptedData<T = unknown>(key: string, value: T): Promise<void>;
508
- declare function setEncryptedData<T = unknown>(value: T): Promise<void>;
509
507
  /** @since Beekeeper Studio 5.4.0 */
510
508
  declare function openTab(type: "query", options?: OpenQueryTabOptions): Promise<void>;
511
509
  declare function openTab(type: "tableTable", options: OpenTableTableTabOptions): Promise<void>;
@@ -522,10 +520,11 @@ declare const broadcast: {
522
520
  post<T extends JsonValue = JsonValue>(message: T): void;
523
521
  on<T extends JsonValue = JsonValue>(handler: (message: T) => void): void;
524
522
  };
525
- /** @since Beekeeper Studio 5.3.0 */
526
- declare const log: {
523
+ declare class PluginLog {
527
524
  error(err: string | Error): void;
528
- };
525
+ }
526
+ /** @since Beekeeper Studio 5.3.0 */
527
+ declare const log: PluginLog;
529
528
  /** Clipboard interface. */
530
529
  declare const clipboard: {
531
530
  /** Write text to the Electron clipboard.
@@ -538,6 +537,25 @@ declare const clipboard: {
538
537
  * @since Beekeeper Studio 5.5.0 */
539
538
  writeImage(data: string): Promise<void>;
540
539
  };
540
+ /**
541
+ * Similar to `localStorage`, `appStorage` is a persistent storage that persists
542
+ * across sessions. The data is stored in the local database of the app and
543
+ * scoped to the plugin.
544
+ *
545
+ * @since Beekeeper Studio 5.3.0
546
+ **/
547
+ declare const appStorage: {
548
+ getItem<T = unknown>(key: string, options?: {
549
+ encrypted: boolean;
550
+ }): Promise<T | null>;
551
+ setItem<T = unknown>(key: string, value: T, options?: {
552
+ encrypted: boolean;
553
+ }): Promise<void>;
554
+ };
555
+ declare const workspaceConnectionStorage: {
556
+ getItem<T = unknown>(key: string): Promise<T | null>;
557
+ setItem<T = unknown>(key: string, value: T): Promise<void>;
558
+ };
541
559
  /** @since Beekeeper Studio 5.5.? */
542
560
  declare const noty: {
543
561
  success(message: string): Promise<void>;
@@ -556,6 +574,7 @@ declare function addNotificationListener<Message extends JsonValue = JsonValue>(
556
574
  message: Message;
557
575
  }) => void): void;
558
576
  declare function addNotificationListener(name: "themeChanged", handler: (args: AppTheme) => void): void;
577
+ declare function addNotificationListener(name: "dataPollSucceeded", handler: () => void): void;
559
578
  declare function removeNotificationListener(name: "tablesChanged", handler: (args: any) => void): void;
560
579
  declare function removeNotificationListener<Message extends JsonValue = JsonValue>(name: "broadcast", handler: (args: any) => void): void;
561
580
  declare function removeNotificationListener(name: "themeChanged", handler: (args: any) => void): void;
@@ -564,5 +583,5 @@ declare function request<T extends keyof RequestMap>(raw: {
564
583
  args: RequestMap[T]["args"];
565
584
  }): Promise<RequestMap[T]["return"]>;
566
585
 
567
- export { addNotificationListener, broadcast, checkForUpdate, clipboard, confirm, expandTableResult, getAppInfo, getAppVersion, getColumns, getConnectionInfo, getData, getEncryptedData, getIncomingKeys, getOutgoingKeys, getPrimaryKeys, getSchemas, getTableIndexes, getTableKeys, getTables, getViewContext, getViewState, hideStatusBarUI, log, notify, noty, openExternal, openTab, removeNotificationListener, request, requestFileSave, runQuery, setData, setDebugComms, setEncryptedData, setTabTitle, setViewState, showStatusBarUI, toggleStatusBarUI };
568
- export type { ActiveRange, AppInfo, AppTheme, CellMenuParams, CellMenuTarget, Column, ColumnMenuParams, ColumnMenuTarget, ConfirmOptions, ConnectionInfo, CornerMenuParams, CornerMenuTarget, DatabaseType, IndexColumn, JsonValue, LoadViewParams, OpenQueryTabOptions, OpenTableStructureTabOptions, OpenTableTableTabOptions, PluginErrorObject, PluginViewContext, PrimaryKey, QueryResult, RequestFileSaveOptions, RowMenuParams, RowMenuTarget, RunQueryResult, Table, TableFilter, TableIndex, TableKey, ThemeType, WindowEventClass, WindowEventInits, WindowEventObject };
586
+ export { addNotificationListener, appStorage, broadcast, checkForUpdate, clipboard, confirm, expandTableResult, getAppInfo, getAppVersion, getColumns, getConnectionInfo, getIncomingKeys, getOutgoingKeys, getPrimaryKeys, getSchemas, getTableIndexes, getTableKeys, getTables, getViewContext, getViewState, getWorkspaceInfo, hideStatusBarUI, log, notify, noty, openExternal, openTab, removeNotificationListener, request, requestFileSave, runQuery, setDebugComms, setTabTitle, setViewState, showStatusBarUI, toggleStatusBarUI, workspaceConnectionStorage };
587
+ export type { ActiveRange, AppInfo, AppTheme, CellMenuParams, CellMenuTarget, Column, ColumnMenuParams, ColumnMenuTarget, ConfirmOptions, ConnectionInfo, CornerMenuParams, CornerMenuTarget, DatabaseType, IndexColumn, JsonValue, LoadViewParams, OpenQueryTabOptions, OpenTableStructureTabOptions, OpenTableTableTabOptions, PluginErrorObject, PluginViewContext, PrimaryKey, QueryResult, RequestFileSaveOptions, RowMenuParams, RowMenuTarget, RunQueryResult, Table, TableFilter, TableIndex, TableKey, ThemeType, WindowEventClass, WindowEventInits, WindowEventObject, WorkspaceInfo };
package/dist/index.js CHANGED
@@ -47,6 +47,14 @@ async function getOutgoingKeys(table, schema) {
47
47
  async function getConnectionInfo() {
48
48
  return await request({ name: "getConnectionInfo", args: void 0 });
49
49
  }
50
+ /**
51
+ * Get information about the current workspace.
52
+ *
53
+ * @since Beekeeper Studio 5.5.?
54
+ **/
55
+ async function getWorkspaceInfo() {
56
+ return await request({ name: "getWorkspaceInfo", args: void 0 });
57
+ }
50
58
  /** @since Beekeeper Studio 5.4.0 */
51
59
  async function getAppInfo() {
52
60
  return await request({ name: "getAppInfo", args: void 0 });
@@ -138,30 +146,6 @@ async function setViewState(state) {
138
146
  async function openExternal(link) {
139
147
  return await request({ name: "openExternal", args: { link } });
140
148
  }
141
- /** @since Beekeeper Studio 5.3.0 */
142
- async function getData(key = "default") {
143
- return await request({ name: "getData", args: { key } });
144
- }
145
- async function setData(keyOrValue, value) {
146
- if (value !== undefined) {
147
- return await request({ name: "setData", args: { key: keyOrValue, value } });
148
- }
149
- else {
150
- return await request({ name: "setData", args: { key: "default", value: keyOrValue } });
151
- }
152
- }
153
- /** @since Beekeeper Studio 5.3.0 */
154
- async function getEncryptedData(key) {
155
- return await request({ name: "getEncryptedData", args: { key } });
156
- }
157
- async function setEncryptedData(keyOrValue, value) {
158
- if (value !== undefined) {
159
- return await request({ name: "setEncryptedData", args: { key: keyOrValue, value } });
160
- }
161
- else {
162
- return await request({ name: "setEncryptedData", args: { key: "default", value: keyOrValue } });
163
- }
164
- }
165
149
  async function openTab(type, options) {
166
150
  return await request({ name: "openTab", args: { type, ...options } });
167
151
  }
@@ -193,23 +177,27 @@ const broadcast = {
193
177
  });
194
178
  },
195
179
  };
196
- /** @since Beekeeper Studio 5.3.0 */
197
- const log = {
180
+ class PluginLog {
198
181
  error(err) {
182
+ const logStack = new Error().stack;
199
183
  if (typeof err === "string") {
200
184
  return notify("pluginError", {
201
185
  name: "Error",
202
186
  message: err,
203
- stack: undefined,
187
+ stack: logStack,
188
+ logStack,
204
189
  });
205
190
  }
206
191
  return notify("pluginError", {
207
192
  name: err.name || "Error",
208
193
  message: err.message,
209
194
  stack: err.stack,
195
+ logStack,
210
196
  });
211
- },
212
- };
197
+ }
198
+ }
199
+ /** @since Beekeeper Studio 5.3.0 */
200
+ const log = new PluginLog();
213
201
  /** Clipboard interface. */
214
202
  const clipboard = {
215
203
  /** Write text to the Electron clipboard.
@@ -239,6 +227,53 @@ const clipboard = {
239
227
  // async write() {},
240
228
  // async read() {},
241
229
  };
230
+ /**
231
+ * Similar to `localStorage`, `appStorage` is a persistent storage that persists
232
+ * across sessions. The data is stored in the local database of the app and
233
+ * scoped to the plugin.
234
+ *
235
+ * @since Beekeeper Studio 5.3.0
236
+ **/
237
+ const appStorage = {
238
+ async getItem(key, options) {
239
+ if (options?.encrypted) {
240
+ return await request({
241
+ name: "getEncryptedData",
242
+ args: { key },
243
+ });
244
+ }
245
+ return await request({ name: "getData", args: { key } });
246
+ },
247
+ async setItem(key, value, options) {
248
+ if (options?.encrypted) {
249
+ return await request({
250
+ name: "setEncryptedData",
251
+ args: { key, value },
252
+ });
253
+ }
254
+ return await request({ name: "setData", args: { key, value } });
255
+ },
256
+ // TODO
257
+ // async removeItem(key: string): Promise<void> {},
258
+ // async clear(): Promise<void> {},
259
+ };
260
+ const workspaceConnectionStorage = {
261
+ async getItem(key) {
262
+ return await request({
263
+ name: "workspaceConnectionStorage.getItem",
264
+ args: { key },
265
+ });
266
+ },
267
+ async setItem(key, value) {
268
+ return await request({
269
+ name: "workspaceConnectionStorage.setItem",
270
+ args: { key, value },
271
+ });
272
+ },
273
+ // TODO
274
+ // async removeItem(key: string): Promise<void> {},
275
+ // async clear(): Promise<void> {},
276
+ };
242
277
  /** @since Beekeeper Studio 5.5.? */
243
278
  const noty = {
244
279
  async success(message) {
@@ -366,5 +401,5 @@ function generateUUID() {
366
401
  ].join("-");
367
402
  }
368
403
 
369
- export { addNotificationListener, broadcast, checkForUpdate, clipboard, confirm, expandTableResult, getAppInfo, getAppVersion, getColumns, getConnectionInfo, getData, getEncryptedData, getIncomingKeys, getOutgoingKeys, getPrimaryKeys, getSchemas, getTableIndexes, getTableKeys, getTables, getViewContext, getViewState, hideStatusBarUI, log, notify, noty, openExternal, openTab, removeNotificationListener, request, requestFileSave, runQuery, setData, setDebugComms, setEncryptedData, setTabTitle, setViewState, showStatusBarUI, toggleStatusBarUI };
404
+ export { addNotificationListener, appStorage, broadcast, checkForUpdate, clipboard, confirm, expandTableResult, getAppInfo, getAppVersion, getColumns, getConnectionInfo, getIncomingKeys, getOutgoingKeys, getPrimaryKeys, getSchemas, getTableIndexes, getTableKeys, getTables, getViewContext, getViewState, getWorkspaceInfo, hideStatusBarUI, log, notify, noty, openExternal, openTab, removeNotificationListener, request, requestFileSave, runQuery, setDebugComms, setTabTitle, setViewState, showStatusBarUI, toggleStatusBarUI, workspaceConnectionStorage };
370
405
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/index.ts"],"sourcesContent":["import type { AppInfo, AppTheme, Column, ConfirmOptions, ConnectionInfo, JsonValue, OpenQueryTabOptions, OpenTableStructureTabOptions, OpenTableTableTabOptions, PluginErrorObject, PluginViewContext, PrimaryKey, QueryResult, RequestFileSaveOptions, RunQueryResult, Table, TableIndex, TableKey, WindowEventObject } from \"./types\";\nimport type { RequestMap } from \"./internal\";\n\nexport * from \"./types\";\n\n/**\n * Get a list of schemas from the current database.\n *\n * @since Beekeeper Studio 5.5.0\n **/\nexport async function getSchemas(): Promise<string[]> {\n return await request({ name: \"getSchemas\", args: void 0 });\n}\n\n/**\n * Get a list of tables from the current database.\n *\n * @since Beekeeper Studio 5.3.0\n **/\nexport async function getTables(schema?: string): Promise<Table[]> {\n return await request({ name: \"getTables\", args: { schema } });\n}\n\n/**\n * Get a list of columns from a table.\n *\n * @since Beekeeper Studio 5.3.0\n **/\nexport async function getColumns(table: string, schema?: string): Promise<Column[]> {\n return await request({ name: \"getColumns\", args: { table, schema } });\n}\n\n/** @since Beekeeper Studio 5.4.0 */\nexport async function getTableKeys(table: string, schema?: string): Promise<TableKey[]> {\n return await request({ name: \"getTableKeys\", args: { table, schema } });\n}\n\n/** @since Beekeeper Studio 5.5.0 */\nexport async function getTableIndexes(table: string, schema?: string): Promise<TableIndex[]> {\n return await request({ name: \"getTableIndexes\", args: { table, schema } });\n}\n\nexport async function getPrimaryKeys(table: string, schema?: string): Promise<PrimaryKey[]> {\n return await request({ name: \"getPrimaryKeys\", args: { table, schema } });\n}\n\nexport async function getIncomingKeys(table: string, schema?: string): Promise<TableKey[]> {\n return await request({ name: \"getIncomingKeys\", args: { table, schema } });\n}\n\nexport async function getOutgoingKeys(table: string, schema?: string): Promise<TableKey[]> {\n return await request({ name: \"getOutgoingKeys\", args: { table, schema } });\n}\n\n/**\n * Get information about the current database connection.\n *\n * @since Beekeeper Studio 5.3.0\n **/\nexport async function getConnectionInfo(): Promise<ConnectionInfo> {\n return await request({ name: \"getConnectionInfo\", args: void 0 });\n}\n\n/** @since Beekeeper Studio 5.4.0 */\nexport async function getAppInfo(): Promise<AppInfo> {\n return await request({ name: \"getAppInfo\", args: void 0 });\n}\n\n/**\n * Get the version of Beekeeper Studio\n * @since Beekeeper Studio 5.3.0\n **/\nexport async function getAppVersion(): Promise<\"5.3\" | (string & { __brand?: never })> {\n try {\n const appInfo = await getAppInfo();\n return appInfo.version;\n } catch (e) {\n if (e instanceof Error && e.message.includes(\"Unknown request\")) {\n return \"5.3\";\n }\n throw e;\n }\n}\n\n/**\n * Check if plugin's update is available.\n *\n * @since Beekeeper Studio 5.4.0\n **/\nexport async function checkForUpdate(): Promise<boolean> {\n return await request({ name: \"checkForUpdate\", args: void 0 });\n}\n\n/**\n * Execute a SQL query against the current database.\n *\n * WARNING: The query will be executed exactly as provided with no modification\n * or sanitization. Always validate and sanitize user input before including it\n * in queries to prevent unwanted actions.\n *\n * @since Beekeeper Studio 5.3.0\n **/\nexport async function runQuery(query: string): Promise<RunQueryResult> {\n return await request({ name: \"runQuery\", args: { query } });\n}\n\n/**\n * Display query results in the bottom table panel (shell-type tabs only).\n *\n * @since Beekeeper Studio 5.3.0\n **/\nexport async function expandTableResult(results: QueryResult[]): Promise<void> {\n return await request({ name: \"expandTableResult\", args: { results } });\n}\n\n/**\n * Set the title of the current plugin tab.\n *\n * @since Beekeeper Studio 5.3.0\n **/\nexport async function setTabTitle(title: string): Promise<void> {\n return await request({ name: \"setTabTitle\", args: { title } });\n}\n\n/**\n * Get the current view context.\n *\n * A view context describes how this plugin view was opened and what data is\n * available for it. It always includes the static `command` from your\n * `manifest.json`, and may also include dynamic `params` depending on where\n * the menu was invoked.\n *\n * @since Beekeeper Studio 5.4.0\n **/\nexport async function getViewContext(): Promise<PluginViewContext> {\n return await request({ name: \"getViewContext\", args: void 0 });\n}\n\n/**\n * Get the current state of your view instance.\n *\n * @see {@link https://docs.beekeeperstudio.io/plugin_development/plugin-views/#view-state|View State}\n * @since Beekeeper Studio 5.3.0\n **/\nexport async function getViewState<T = unknown>(): Promise<T> {\n return await request({ name: \"getViewState\", args: void 0 });\n}\n\n/**\n * Set the state of your view instance.\n *\n * @see {@link https://docs.beekeeperstudio.io/plugin_development/plugin-views/#view-state|View State}\n * @since Beekeeper Studio 5.3.0\n **/\nexport async function setViewState<T = unknown>(state: T): Promise<void> {\n return await request({ name: \"setViewState\", args: { state } });\n}\n\n/** @since Beekeeper Studio 5.3.0 */\nexport async function openExternal(link: string): Promise<void> {\n return await request({ name: \"openExternal\", args: { link } });\n}\n\n/** @since Beekeeper Studio 5.3.0 */\nexport async function getData<T = unknown>(key: string = \"default\"): Promise<T> {\n return await request({ name: \"getData\", args: { key } });\n}\n\n/**\n * Store data that can be retrieved later.\n *\n * @example\n * // Store with custom key\n * await setData(\"myKey\", { name: \"John\" });\n *\n * // Store with default key (equivalent to setData(\"default\", value))\n * await setData({ name: \"John\" });\n *\n * @since Beekeeper Studio 5.3.0\n */\nexport async function setData<T = unknown>(key: string, value: T): Promise<void>;\nexport async function setData<T = unknown>(value: T): Promise<void>;\nexport async function setData<T = unknown>(keyOrValue: string | T, value?: T): Promise<void> {\n if (value !== undefined) {\n return await request({ name: \"setData\", args: { key: keyOrValue as string, value } });\n } else {\n return await request({ name: \"setData\", args: { key: \"default\", value: keyOrValue as T } });\n }\n}\n\n/** @since Beekeeper Studio 5.3.0 */\nexport async function getEncryptedData<T>(key: string): Promise<T> {\n return await request({ name: \"getEncryptedData\", args: { key } });\n}\n\n/**\n * Store encrypted data that can be retrieved later.\n *\n * @example\n * // Store with custom key\n * await setEncryptedData(\"secretKey\", { token: \"abc123\" });\n *\n * // Store with default key (equivalent to setEncryptedData(\"default\", value))\n * await setEncryptedData({ token: \"abc123\" });\n *\n * @since Beekeeper Studio 5.3.0\n */\nexport async function setEncryptedData<T = unknown>(key: string, value: T): Promise<void>;\nexport async function setEncryptedData<T = unknown>(value: T): Promise<void>;\nexport async function setEncryptedData<T = unknown>(keyOrValue: string | T, value?: T): Promise<void> {\n if (value !== undefined) {\n return await request({ name: \"setEncryptedData\", args: { key: keyOrValue as string, value } });\n } else {\n return await request({ name: \"setEncryptedData\", args: { key: \"default\", value: keyOrValue as T } });\n }\n}\n\n/** @since Beekeeper Studio 5.4.0 */\nexport async function openTab(type: \"query\", options?: OpenQueryTabOptions): Promise<void>;\nexport async function openTab(type: \"tableTable\", options: OpenTableTableTabOptions): Promise<void>;\nexport async function openTab(type: \"tableStructure\", options: OpenTableStructureTabOptions): Promise<void>;\nexport async function openTab(\n type: \"query\" | \"tableTable\" | \"tableStructure\",\n options?:\n OpenQueryTabOptions\n | OpenTableTableTabOptions\n | OpenTableStructureTabOptions\n): Promise<void> {\n return await request({ name: \"openTab\", args: { type, ...options } });\n}\n\nexport async function requestFileSave(options: RequestFileSaveOptions): Promise<void> {\n return await request({ name: \"requestFileSave\", args: options });\n}\n\nexport async function showStatusBarUI(): Promise<void> {\n return await request({ name: \"toggleStatusBarUI\", args: { force: true } });\n}\n\nexport async function hideStatusBarUI(): Promise<void> {\n return await request({ name: \"toggleStatusBarUI\", args: { force: false } });\n}\n\n/** @since Beekeeper Studio 5.5.? */\nexport async function toggleStatusBarUI(): Promise<void> {\n return await request({ name: \"toggleStatusBarUI\", args: void 0 });\n}\n\n/** @since Beekeeper Studio 5.5.? */\nexport async function confirm(title?: string, message?: string, options?: ConfirmOptions): Promise<boolean> {\n return await request({ name: \"confirm\", args: { title, message, options } });\n}\n\n/** @since Beekeeper Studio 5.4.0 */\nexport const broadcast = {\n post<T extends JsonValue = JsonValue>(message: T): void {\n return notify(\"broadcast\", { message });\n },\n on<T extends JsonValue = JsonValue>(handler: (message: T) => void): void {\n addNotificationListener<T>(\"broadcast\", (params) => {\n handler(params.message);\n });\n },\n}\n\n/** @since Beekeeper Studio 5.3.0 */\nexport const log = {\n error(err: string | Error): void {\n if (typeof err === \"string\") {\n return notify(\"pluginError\", {\n name: \"Error\",\n message: err,\n stack: undefined,\n });\n }\n return notify(\"pluginError\", {\n name: err.name || \"Error\",\n message: err.message,\n stack: err.stack,\n });\n },\n}\n\n/** Clipboard interface. */\nexport const clipboard = {\n /** Write text to the Electron clipboard.\n * @since Beekeeper Studio 5.3.0 */\n async writeText(text: string): Promise<void> {\n await request({\n name: \"clipboard.writeText\",\n args: { text },\n });\n },\n /** Read text from the Electron clipboard.\n * @since Beekeeper Studio 5.3.0 */\n async readText(): Promise<string> {\n return await request({\n name: \"clipboard.readText\",\n args: void 0,\n });\n },\n /** @param data - Base64 encoded image data.\n * @since Beekeeper Studio 5.5.0 */\n async writeImage(data: string) {\n await request({\n name: \"clipboard.writeImage\",\n args: { data },\n });\n },\n // async write() {},\n // async read() {},\n};\n\n/** @since Beekeeper Studio 5.5.? */\nexport const noty = {\n async success(message: string): Promise<void> {\n return await request({\n name: \"noty.success\",\n args: { message },\n });\n },\n async info(message: string): Promise<void> {\n return await request({\n name: \"noty.info\",\n args: { message },\n });\n },\n async warning(message: string): Promise<void> {\n return await request({\n name: \"noty.warning\",\n args: { message },\n });\n },\n async error(message: string): Promise<void> {\n return await request({\n name: \"noty.error\",\n args: { message },\n });\n },\n}\n\nlet debugComms = false;\n\nexport function setDebugComms(enabled: boolean) {\n debugComms = enabled;\n}\n\nexport function notify<Message extends JsonValue = JsonValue>(\n name: \"broadcast\",\n args: { message: Message; }\n): void;\nexport function notify(name: \"pluginError\", args: PluginErrorObject): void;\nexport function notify(name: \"windowEvent\", args: WindowEventObject): void;\nexport function notify(name: string, args: any) {\n const payload = { name, args };\n if (debugComms) {\n const time = new Date().toLocaleTimeString(\"en-GB\");\n console.groupCollapsed(`${time} [NOTIFICATION] ${name}`);\n console.log(\"args:\", args);\n console.log(\"payload:\", payload);\n console.groupEnd();\n }\n window.parent.postMessage(payload, \"*\");\n}\n\nexport function addNotificationListener(\n name: \"tablesChanged\",\n handler: () => void,\n): void;\nexport function addNotificationListener<Message extends JsonValue = JsonValue>(\n name: \"broadcast\",\n handler: (args: { message: Message; }) => void,\n): void;\nexport function addNotificationListener(\n name: \"themeChanged\",\n handler: (args: AppTheme) => void,\n): void;\nexport function addNotificationListener(\n name: string,\n handler: (args: any) => void,\n) {\n if (!notificationListeners.get(name)) {\n notificationListeners.set(name, []);\n }\n notificationListeners.get(name)!.push(handler);\n}\n\nexport function removeNotificationListener(\n name: \"tablesChanged\",\n handler: (args: any) => void\n): void;\nexport function removeNotificationListener<Message extends JsonValue = JsonValue>(\n name: \"broadcast\",\n handler: (args: any) => void\n): void;\nexport function removeNotificationListener(\n name: \"themeChanged\",\n handler: (args: any) => void\n): void;\nexport function removeNotificationListener(\n name: string,\n handler: (args: any) => void\n) {\n const handlers = notificationListeners.get(name);\n if (handlers) {\n const index = handlers.indexOf(handler);\n if (index > -1) {\n handlers.splice(index, 1);\n }\n }\n}\n\nconst pendingRequests = new Map<\n string,\n {\n // The whole payload is kept just in case for debugging\n payload: any;\n resolve: (value: any) => void;\n reject: (reason?: any) => void;\n }\n>();\n\nexport async function request<T extends keyof RequestMap>(\n raw: { name: T; args: RequestMap[T][\"args\"] }\n): Promise<RequestMap[T][\"return\"]> {\n const payload = { id: generateUUID(), ...raw };\n\n if (debugComms) {\n const time = new Date().toLocaleTimeString(\"en-GB\");\n console.groupCollapsed(`${time} [REQUEST] ${payload.name}`);\n console.log(\"id:\", payload.id);\n console.log(\"args:\", payload.args);\n console.log(\"payload:\", payload);\n console.groupEnd();\n }\n\n return new Promise<any>((resolve, reject) => {\n try {\n pendingRequests.set(payload.id, { payload: payload, resolve, reject });\n window.parent.postMessage(payload, \"*\");\n } catch (e) {\n reject(e);\n }\n });\n}\n\nconst notificationListeners = new Map<string, ((args: any) => void)[]>();\n\nwindow.addEventListener(\"message\", (event) => {\n const { id, name, args, result, error } = event.data || {};\n\n if (name) {\n if (debugComms) {\n const time = new Date().toLocaleTimeString(\"en-GB\");\n console.groupCollapsed(`${time} [NOTIFICATION] ${name}`);\n console.log(\"Args:\", args);\n console.groupEnd();\n }\n\n const handlers = notificationListeners.get(name);\n if (handlers) {\n handlers.forEach((handler) => handler(args));\n }\n }\n\n if (id && pendingRequests.has(id)) {\n const { resolve, reject, payload } = pendingRequests.get(id)!;\n pendingRequests.delete(id);\n\n if (debugComms) {\n const time = new Date().toLocaleTimeString(\"en-GB\");\n console.groupCollapsed(`${time} [RESPONSE] ${payload.name}`);\n console.log(\"Result:\", result);\n if (error) console.error(\"Error:\", error);\n console.groupEnd();\n }\n\n if (error) {\n reject(error);\n } else {\n resolve(result);\n }\n }\n});\n\nfunction generateUUID() {\n const buf = new Uint8Array(16);\n crypto.getRandomValues(buf);\n\n buf[6] = (buf[6] & 0x0f) | 0x40; // version 4\n buf[8] = (buf[8] & 0x3f) | 0x80; // variant\n\n const hex = Array.from(buf, (b) => b.toString(16).padStart(2, \"0\")).join(\"\");\n\n return [\n hex.substring(0, 8),\n hex.substring(8, 12),\n hex.substring(12, 16),\n hex.substring(16, 20),\n hex.substring(20),\n ].join(\"-\");\n}\n\n"],"names":[],"mappings":"AAKA;;;;AAII;AACG,eAAe,UAAU,GAAA;AAC9B,IAAA,OAAO,MAAM,OAAO,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AAC5D;AAEA;;;;AAII;AACG,eAAe,SAAS,CAAC,MAAe,EAAA;AAC7C,IAAA,OAAO,MAAM,OAAO,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC;AAC/D;AAEA;;;;AAII;AACG,eAAe,UAAU,CAAC,KAAa,EAAE,MAAe,EAAA;AAC7D,IAAA,OAAO,MAAM,OAAO,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC;AACvE;AAEA;AACO,eAAe,YAAY,CAAC,KAAa,EAAE,MAAe,EAAA;AAC/D,IAAA,OAAO,MAAM,OAAO,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC;AACzE;AAEA;AACO,eAAe,eAAe,CAAC,KAAa,EAAE,MAAe,EAAA;AAClE,IAAA,OAAO,MAAM,OAAO,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC;AAC5E;AAEO,eAAe,cAAc,CAAC,KAAa,EAAE,MAAe,EAAA;AACjE,IAAA,OAAO,MAAM,OAAO,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC;AAC3E;AAEO,eAAe,eAAe,CAAC,KAAa,EAAE,MAAe,EAAA;AAClE,IAAA,OAAO,MAAM,OAAO,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC;AAC5E;AAEO,eAAe,eAAe,CAAC,KAAa,EAAE,MAAe,EAAA;AAClE,IAAA,OAAO,MAAM,OAAO,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC;AAC5E;AAEA;;;;AAII;AACG,eAAe,iBAAiB,GAAA;AACrC,IAAA,OAAO,MAAM,OAAO,CAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AACnE;AAEA;AACO,eAAe,UAAU,GAAA;AAC9B,IAAA,OAAO,MAAM,OAAO,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AAC5D;AAEA;;;AAGI;AACG,eAAe,aAAa,GAAA;AACjC,IAAA,IAAI;AACF,QAAA,MAAM,OAAO,GAAG,MAAM,UAAU,EAAE;QAClC,OAAO,OAAO,CAAC,OAAO;;IACtB,OAAO,CAAC,EAAE;AACV,QAAA,IAAI,CAAC,YAAY,KAAK,IAAI,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE;AAC/D,YAAA,OAAO,KAAK;;AAEd,QAAA,MAAM,CAAC;;AAEX;AAEA;;;;AAII;AACG,eAAe,cAAc,GAAA;AAClC,IAAA,OAAO,MAAM,OAAO,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AAChE;AAEA;;;;;;;;AAQI;AACG,eAAe,QAAQ,CAAC,KAAa,EAAA;AAC1C,IAAA,OAAO,MAAM,OAAO,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC;AAC7D;AAEA;;;;AAII;AACG,eAAe,iBAAiB,CAAC,OAAsB,EAAA;AAC5D,IAAA,OAAO,MAAM,OAAO,CAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,EAAE,CAAC;AACxE;AAEA;;;;AAII;AACG,eAAe,WAAW,CAAC,KAAa,EAAA;AAC7C,IAAA,OAAO,MAAM,OAAO,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC;AAChE;AAEA;;;;;;;;;AASI;AACG,eAAe,cAAc,GAAA;AAClC,IAAA,OAAO,MAAM,OAAO,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AAChE;AAEA;;;;;AAKI;AACG,eAAe,YAAY,GAAA;AAChC,IAAA,OAAO,MAAM,OAAO,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AAC9D;AAEA;;;;;AAKI;AACG,eAAe,YAAY,CAAc,KAAQ,EAAA;AACtD,IAAA,OAAO,MAAM,OAAO,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC;AACjE;AAEA;AACO,eAAe,YAAY,CAAC,IAAY,EAAA;AAC7C,IAAA,OAAO,MAAM,OAAO,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC;AAChE;AAEA;AACO,eAAe,OAAO,CAAc,MAAc,SAAS,EAAA;AAChE,IAAA,OAAO,MAAM,OAAO,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC;AAC1D;AAgBO,eAAe,OAAO,CAAc,UAAsB,EAAE,KAAS,EAAA;AAC1E,IAAA,IAAI,KAAK,KAAK,SAAS,EAAE;AACvB,QAAA,OAAO,MAAM,OAAO,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,UAAoB,EAAE,KAAK,EAAE,EAAE,CAAC;;SAChF;QACL,OAAO,MAAM,OAAO,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,UAAe,EAAE,EAAE,CAAC;;AAE/F;AAEA;AACO,eAAe,gBAAgB,CAAI,GAAW,EAAA;AACnD,IAAA,OAAO,MAAM,OAAO,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC;AACnE;AAgBO,eAAe,gBAAgB,CAAc,UAAsB,EAAE,KAAS,EAAA;AACnF,IAAA,IAAI,KAAK,KAAK,SAAS,EAAE;AACvB,QAAA,OAAO,MAAM,OAAO,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,UAAoB,EAAE,KAAK,EAAE,EAAE,CAAC;;SACzF;QACL,OAAO,MAAM,OAAO,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,UAAe,EAAE,EAAE,CAAC;;AAExG;AAMO,eAAe,OAAO,CAC3B,IAA+C,EAC/C,OAGgC,EAAA;AAEhC,IAAA,OAAO,MAAM,OAAO,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,GAAG,OAAO,EAAE,EAAE,CAAC;AACvE;AAEO,eAAe,eAAe,CAAC,OAA+B,EAAA;AACnE,IAAA,OAAO,MAAM,OAAO,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AAClE;AAEO,eAAe,eAAe,GAAA;AACnC,IAAA,OAAO,MAAM,OAAO,CAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC;AAC5E;AAEO,eAAe,eAAe,GAAA;AACnC,IAAA,OAAO,MAAM,OAAO,CAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC;AAC7E;AAEA;AACO,eAAe,iBAAiB,GAAA;AACrC,IAAA,OAAO,MAAM,OAAO,CAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AACnE;AAEA;AACO,eAAe,OAAO,CAAC,KAAc,EAAE,OAAgB,EAAE,OAAwB,EAAA;AACtF,IAAA,OAAO,MAAM,OAAO,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC;AAC9E;AAEA;AACa,MAAA,SAAS,GAAG;AACvB,IAAA,IAAI,CAAkC,OAAU,EAAA;QAC9C,OAAO,MAAM,CAAC,WAAW,EAAE,EAAE,OAAO,EAAE,CAAC;KACxC;AACD,IAAA,EAAE,CAAkC,OAA6B,EAAA;AAC/D,QAAA,uBAAuB,CAAI,WAAW,EAAE,CAAC,MAAM,KAAI;AACjD,YAAA,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC;AACzB,SAAC,CAAC;KACH;;AAGH;AACa,MAAA,GAAG,GAAG;AACjB,IAAA,KAAK,CAAC,GAAmB,EAAA;AACvB,QAAA,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE;YAC3B,OAAO,MAAM,CAAC,aAAa,EAAE;AAC3B,gBAAA,IAAI,EAAE,OAAO;AACb,gBAAA,OAAO,EAAE,GAAG;AACZ,gBAAA,KAAK,EAAE,SAAS;AACjB,aAAA,CAAC;;QAEJ,OAAO,MAAM,CAAC,aAAa,EAAE;AAC3B,YAAA,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,OAAO;YACzB,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,KAAK,EAAE,GAAG,CAAC,KAAK;AACjB,SAAA,CAAC;KACH;;AAGH;AACa,MAAA,SAAS,GAAG;AACvB;AACmC;IACnC,MAAM,SAAS,CAAC,IAAY,EAAA;AAC1B,QAAA,MAAM,OAAO,CAAC;AACZ,YAAA,IAAI,EAAE,qBAAqB;YAC3B,IAAI,EAAE,EAAE,IAAI,EAAE;AACf,SAAA,CAAC;KACH;AACD;AACmC;AACnC,IAAA,MAAM,QAAQ,GAAA;QACZ,OAAO,MAAM,OAAO,CAAC;AACnB,YAAA,IAAI,EAAE,oBAAoB;YAC1B,IAAI,EAAE,MAAM;AACb,SAAA,CAAC;KACH;AACD;AACmC;IACnC,MAAM,UAAU,CAAC,IAAY,EAAA;AAC3B,QAAA,MAAM,OAAO,CAAC;AACZ,YAAA,IAAI,EAAE,sBAAsB;YAC5B,IAAI,EAAE,EAAE,IAAI,EAAE;AACf,SAAA,CAAC;KACH;;;;AAKH;AACa,MAAA,IAAI,GAAG;IAClB,MAAM,OAAO,CAAC,OAAe,EAAA;QAC3B,OAAO,MAAM,OAAO,CAAC;AACnB,YAAA,IAAI,EAAE,cAAc;YACpB,IAAI,EAAE,EAAE,OAAO,EAAE;AAClB,SAAA,CAAC;KACH;IACD,MAAM,IAAI,CAAC,OAAe,EAAA;QACxB,OAAO,MAAM,OAAO,CAAC;AACnB,YAAA,IAAI,EAAE,WAAW;YACjB,IAAI,EAAE,EAAE,OAAO,EAAE;AAClB,SAAA,CAAC;KACH;IACD,MAAM,OAAO,CAAC,OAAe,EAAA;QAC3B,OAAO,MAAM,OAAO,CAAC;AACnB,YAAA,IAAI,EAAE,cAAc;YACpB,IAAI,EAAE,EAAE,OAAO,EAAE;AAClB,SAAA,CAAC;KACH;IACD,MAAM,KAAK,CAAC,OAAe,EAAA;QACzB,OAAO,MAAM,OAAO,CAAC;AACnB,YAAA,IAAI,EAAE,YAAY;YAClB,IAAI,EAAE,EAAE,OAAO,EAAE;AAClB,SAAA,CAAC;KACH;;AAGH,IAAI,UAAU,GAAG,KAAK;AAEhB,SAAU,aAAa,CAAC,OAAgB,EAAA;IAC5C,UAAU,GAAG,OAAO;AACtB;AAQgB,SAAA,MAAM,CAAC,IAAY,EAAE,IAAS,EAAA;AAC5C,IAAA,MAAM,OAAO,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE;IAC9B,IAAI,UAAU,EAAE;QACd,MAAM,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC,kBAAkB,CAAC,OAAO,CAAC;QACnD,OAAO,CAAC,cAAc,CAAC,CAAA,EAAG,IAAI,CAAmB,gBAAA,EAAA,IAAI,CAAE,CAAA,CAAC;AACxD,QAAA,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC;AAC1B,QAAA,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,OAAO,CAAC;QAChC,OAAO,CAAC,QAAQ,EAAE;;IAEpB,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,GAAG,CAAC;AACzC;AAcgB,SAAA,uBAAuB,CACrC,IAAY,EACZ,OAA4B,EAAA;IAE5B,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;AACpC,QAAA,qBAAqB,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;;IAErC,qBAAqB,CAAC,GAAG,CAAC,IAAI,CAAE,CAAC,IAAI,CAAC,OAAO,CAAC;AAChD;AAcgB,SAAA,0BAA0B,CACxC,IAAY,EACZ,OAA4B,EAAA;IAE5B,MAAM,QAAQ,GAAG,qBAAqB,CAAC,GAAG,CAAC,IAAI,CAAC;IAChD,IAAI,QAAQ,EAAE;QACZ,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC;AACvC,QAAA,IAAI,KAAK,GAAG,EAAE,EAAE;AACd,YAAA,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;;;AAG/B;AAEA,MAAM,eAAe,GAAG,IAAI,GAAG,EAQ5B;AAEI,eAAe,OAAO,CAC3B,GAA6C,EAAA;IAE7C,MAAM,OAAO,GAAG,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,GAAG,GAAG,EAAE;IAE9C,IAAI,UAAU,EAAE;QACd,MAAM,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC,kBAAkB,CAAC,OAAO,CAAC;QACnD,OAAO,CAAC,cAAc,CAAC,CAAG,EAAA,IAAI,CAAc,WAAA,EAAA,OAAO,CAAC,IAAI,CAAE,CAAA,CAAC;QAC3D,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC;AAClC,QAAA,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,OAAO,CAAC;QAChC,OAAO,CAAC,QAAQ,EAAE;;IAGpB,OAAO,IAAI,OAAO,CAAM,CAAC,OAAO,EAAE,MAAM,KAAI;AAC1C,QAAA,IAAI;AACF,YAAA,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;YACtE,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,GAAG,CAAC;;QACvC,OAAO,CAAC,EAAE;YACV,MAAM,CAAC,CAAC,CAAC;;AAEb,KAAC,CAAC;AACJ;AAEA,MAAM,qBAAqB,GAAG,IAAI,GAAG,EAAmC;AAExE,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC,KAAK,KAAI;AAC3C,IAAA,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC,IAAI,IAAI,EAAE;IAE1D,IAAI,IAAI,EAAE;QACR,IAAI,UAAU,EAAE;YACd,MAAM,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC,kBAAkB,CAAC,OAAO,CAAC;YACnD,OAAO,CAAC,cAAc,CAAC,CAAA,EAAG,IAAI,CAAmB,gBAAA,EAAA,IAAI,CAAE,CAAA,CAAC;AACxD,YAAA,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC;YAC1B,OAAO,CAAC,QAAQ,EAAE;;QAGpB,MAAM,QAAQ,GAAG,qBAAqB,CAAC,GAAG,CAAC,IAAI,CAAC;QAChD,IAAI,QAAQ,EAAE;AACZ,YAAA,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;;;IAIhD,IAAI,EAAE,IAAI,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;AACjC,QAAA,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,eAAe,CAAC,GAAG,CAAC,EAAE,CAAE;AAC7D,QAAA,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC;QAE1B,IAAI,UAAU,EAAE;YACd,MAAM,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC,kBAAkB,CAAC,OAAO,CAAC;YACnD,OAAO,CAAC,cAAc,CAAC,CAAG,EAAA,IAAI,CAAe,YAAA,EAAA,OAAO,CAAC,IAAI,CAAE,CAAA,CAAC;AAC5D,YAAA,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC;AAC9B,YAAA,IAAI,KAAK;AAAE,gBAAA,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC;YACzC,OAAO,CAAC,QAAQ,EAAE;;QAGpB,IAAI,KAAK,EAAE;YACT,MAAM,CAAC,KAAK,CAAC;;aACR;YACL,OAAO,CAAC,MAAM,CAAC;;;AAGrB,CAAC,CAAC;AAEF,SAAS,YAAY,GAAA;AACnB,IAAA,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC;AAC9B,IAAA,MAAM,CAAC,eAAe,CAAC,GAAG,CAAC;AAE3B,IAAA,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,IAAI,CAAC;AAChC,IAAA,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,IAAI,CAAC;AAEhC,IAAA,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;IAE5E,OAAO;AACL,QAAA,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC;AACnB,QAAA,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC;AACpB,QAAA,GAAG,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,CAAC;AACrB,QAAA,GAAG,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,CAAC;AACrB,QAAA,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;AAClB,KAAA,CAAC,IAAI,CAAC,GAAG,CAAC;AACb;;;;"}
1
+ {"version":3,"file":"index.js","sources":["../src/index.ts"],"sourcesContent":["import type {\n AppInfo,\n AppTheme,\n Column,\n ConfirmOptions,\n ConnectionInfo,\n JsonValue,\n OpenQueryTabOptions,\n OpenTableStructureTabOptions,\n OpenTableTableTabOptions,\n PluginErrorObject,\n PluginViewContext,\n PrimaryKey,\n QueryResult,\n RequestFileSaveOptions,\n RunQueryResult,\n Table,\n TableIndex,\n TableKey,\n WindowEventObject,\n WorkspaceInfo,\n} from \"./types\";\nimport type { RequestMap } from \"./internal\";\n\nexport * from \"./types\";\n\n/**\n * Get a list of schemas from the current database.\n *\n * @since Beekeeper Studio 5.5.0\n **/\nexport async function getSchemas(): Promise<string[]> {\n return await request({ name: \"getSchemas\", args: void 0 });\n}\n\n/**\n * Get a list of tables from the current database.\n *\n * @since Beekeeper Studio 5.3.0\n **/\nexport async function getTables(schema?: string): Promise<Table[]> {\n return await request({ name: \"getTables\", args: { schema } });\n}\n\n/**\n * Get a list of columns from a table.\n *\n * @since Beekeeper Studio 5.3.0\n **/\nexport async function getColumns(\n table: string,\n schema?: string,\n): Promise<Column[]> {\n return await request({ name: \"getColumns\", args: { table, schema } });\n}\n\n/** @since Beekeeper Studio 5.4.0 */\nexport async function getTableKeys(\n table: string,\n schema?: string,\n): Promise<TableKey[]> {\n return await request({ name: \"getTableKeys\", args: { table, schema } });\n}\n\n/** @since Beekeeper Studio 5.5.0 */\nexport async function getTableIndexes(\n table: string,\n schema?: string,\n): Promise<TableIndex[]> {\n return await request({ name: \"getTableIndexes\", args: { table, schema } });\n}\n\nexport async function getPrimaryKeys(\n table: string,\n schema?: string,\n): Promise<PrimaryKey[]> {\n return await request({ name: \"getPrimaryKeys\", args: { table, schema } });\n}\n\nexport async function getIncomingKeys(\n table: string,\n schema?: string,\n): Promise<TableKey[]> {\n return await request({ name: \"getIncomingKeys\", args: { table, schema } });\n}\n\nexport async function getOutgoingKeys(\n table: string,\n schema?: string,\n): Promise<TableKey[]> {\n return await request({ name: \"getOutgoingKeys\", args: { table, schema } });\n}\n\n/**\n * Get information about the current database connection.\n *\n * @since Beekeeper Studio 5.3.0\n **/\nexport async function getConnectionInfo(): Promise<ConnectionInfo> {\n return await request({ name: \"getConnectionInfo\", args: void 0 });\n}\n\n/**\n * Get information about the current workspace.\n *\n * @since Beekeeper Studio 5.5.?\n **/\nexport async function getWorkspaceInfo(): Promise<WorkspaceInfo> {\n return await request({ name: \"getWorkspaceInfo\", args: void 0 });\n}\n\n/** @since Beekeeper Studio 5.4.0 */\nexport async function getAppInfo(): Promise<AppInfo> {\n return await request({ name: \"getAppInfo\", args: void 0 });\n}\n\n/**\n * Get the version of Beekeeper Studio\n * @since Beekeeper Studio 5.3.0\n **/\nexport async function getAppVersion(): Promise<\n \"5.3\" | (string & { __brand?: never })\n> {\n try {\n const appInfo = await getAppInfo();\n return appInfo.version;\n } catch (e) {\n if (e instanceof Error && e.message.includes(\"Unknown request\")) {\n return \"5.3\";\n }\n throw e;\n }\n}\n\n/**\n * Check if plugin's update is available.\n *\n * @since Beekeeper Studio 5.4.0\n **/\nexport async function checkForUpdate(): Promise<boolean> {\n return await request({ name: \"checkForUpdate\", args: void 0 });\n}\n\n/**\n * Execute a SQL query against the current database.\n *\n * WARNING: The query will be executed exactly as provided with no modification\n * or sanitization. Always validate and sanitize user input before including it\n * in queries to prevent unwanted actions.\n *\n * @since Beekeeper Studio 5.3.0\n **/\nexport async function runQuery(query: string): Promise<RunQueryResult> {\n return await request({ name: \"runQuery\", args: { query } });\n}\n\n/**\n * Display query results in the bottom table panel (shell-type tabs only).\n *\n * @since Beekeeper Studio 5.3.0\n **/\nexport async function expandTableResult(results: QueryResult[]): Promise<void> {\n return await request({ name: \"expandTableResult\", args: { results } });\n}\n\n/**\n * Set the title of the current plugin tab.\n *\n * @since Beekeeper Studio 5.3.0\n **/\nexport async function setTabTitle(title: string): Promise<void> {\n return await request({ name: \"setTabTitle\", args: { title } });\n}\n\n/**\n * Get the current view context.\n *\n * A view context describes how this plugin view was opened and what data is\n * available for it. It always includes the static `command` from your\n * `manifest.json`, and may also include dynamic `params` depending on where\n * the menu was invoked.\n *\n * @since Beekeeper Studio 5.4.0\n **/\nexport async function getViewContext(): Promise<PluginViewContext> {\n return await request({ name: \"getViewContext\", args: void 0 });\n}\n\n/**\n * Get the current state of your view instance.\n *\n * @see {@link https://docs.beekeeperstudio.io/plugin_development/plugin-views/#view-state|View State}\n * @since Beekeeper Studio 5.3.0\n **/\nexport async function getViewState<T = unknown>(): Promise<T> {\n return await request({ name: \"getViewState\", args: void 0 });\n}\n\n/**\n * Set the state of your view instance.\n *\n * @see {@link https://docs.beekeeperstudio.io/plugin_development/plugin-views/#view-state|View State}\n * @since Beekeeper Studio 5.3.0\n **/\nexport async function setViewState<T = unknown>(state: T): Promise<void> {\n return await request({ name: \"setViewState\", args: { state } });\n}\n\n/** @since Beekeeper Studio 5.3.0 */\nexport async function openExternal(link: string): Promise<void> {\n return await request({ name: \"openExternal\", args: { link } });\n}\n\n/** @since Beekeeper Studio 5.4.0 */\nexport async function openTab(\n type: \"query\",\n options?: OpenQueryTabOptions,\n): Promise<void>;\nexport async function openTab(\n type: \"tableTable\",\n options: OpenTableTableTabOptions,\n): Promise<void>;\nexport async function openTab(\n type: \"tableStructure\",\n options: OpenTableStructureTabOptions,\n): Promise<void>;\nexport async function openTab(\n type: \"query\" | \"tableTable\" | \"tableStructure\",\n options?:\n | OpenQueryTabOptions\n | OpenTableTableTabOptions\n | OpenTableStructureTabOptions,\n): Promise<void> {\n return await request({ name: \"openTab\", args: { type, ...options } });\n}\n\nexport async function requestFileSave(\n options: RequestFileSaveOptions,\n): Promise<void> {\n return await request({ name: \"requestFileSave\", args: options });\n}\n\nexport async function showStatusBarUI(): Promise<void> {\n return await request({ name: \"toggleStatusBarUI\", args: { force: true } });\n}\n\nexport async function hideStatusBarUI(): Promise<void> {\n return await request({ name: \"toggleStatusBarUI\", args: { force: false } });\n}\n\n/** @since Beekeeper Studio 5.5.? */\nexport async function toggleStatusBarUI(): Promise<void> {\n return await request({ name: \"toggleStatusBarUI\", args: void 0 });\n}\n\n/** @since Beekeeper Studio 5.5.? */\nexport async function confirm(\n title?: string,\n message?: string,\n options?: ConfirmOptions,\n): Promise<boolean> {\n return await request({ name: \"confirm\", args: { title, message, options } });\n}\n\n/** @since Beekeeper Studio 5.4.0 */\nexport const broadcast = {\n post<T extends JsonValue = JsonValue>(message: T): void {\n return notify(\"broadcast\", { message });\n },\n on<T extends JsonValue = JsonValue>(handler: (message: T) => void): void {\n addNotificationListener<T>(\"broadcast\", (params) => {\n handler(params.message);\n });\n },\n};\n\nclass PluginLog {\n error(err: string | Error): void {\n const logStack = new Error().stack!;\n\n if (typeof err === \"string\") {\n return notify(\"pluginError\", {\n name: \"Error\",\n message: err,\n stack: logStack,\n logStack,\n });\n }\n return notify(\"pluginError\", {\n name: err.name || \"Error\",\n message: err.message,\n stack: err.stack,\n logStack,\n });\n }\n}\n\n/** @since Beekeeper Studio 5.3.0 */\nexport const log = new PluginLog();\n\n/** Clipboard interface. */\nexport const clipboard = {\n /** Write text to the Electron clipboard.\n * @since Beekeeper Studio 5.3.0 */\n async writeText(text: string): Promise<void> {\n await request({\n name: \"clipboard.writeText\",\n args: { text },\n });\n },\n /** Read text from the Electron clipboard.\n * @since Beekeeper Studio 5.3.0 */\n async readText(): Promise<string> {\n return await request({\n name: \"clipboard.readText\",\n args: void 0,\n });\n },\n /** @param data - Base64 encoded image data.\n * @since Beekeeper Studio 5.5.0 */\n async writeImage(data: string) {\n await request({\n name: \"clipboard.writeImage\",\n args: { data },\n });\n },\n // async write() {},\n // async read() {},\n};\n\n/**\n * Similar to `localStorage`, `appStorage` is a persistent storage that persists\n * across sessions. The data is stored in the local database of the app and\n * scoped to the plugin.\n *\n * @since Beekeeper Studio 5.3.0\n **/\nexport const appStorage = {\n async getItem<T = unknown>(\n key: string,\n options?: {\n encrypted: boolean;\n },\n ): Promise<T | null> {\n if (options?.encrypted) {\n return await request({\n name: \"getEncryptedData\",\n args: { key },\n });\n }\n return await request({ name: \"getData\", args: { key } });\n },\n async setItem<T = unknown>(\n key: string,\n value: T,\n options?: {\n encrypted: boolean;\n },\n ): Promise<void> {\n if (options?.encrypted) {\n return await request({\n name: \"setEncryptedData\",\n args: { key, value },\n });\n }\n return await request({ name: \"setData\", args: { key, value } });\n },\n // TODO\n // async removeItem(key: string): Promise<void> {},\n // async clear(): Promise<void> {},\n};\n\nexport const workspaceConnectionStorage = {\n async getItem<T = unknown>(key: string): Promise<T | null> {\n return await request({\n name: \"workspaceConnectionStorage.getItem\",\n args: { key },\n });\n },\n async setItem<T = unknown>(key: string, value: T): Promise<void> {\n return await request({\n name: \"workspaceConnectionStorage.setItem\",\n args: { key, value },\n });\n },\n // TODO\n // async removeItem(key: string): Promise<void> {},\n // async clear(): Promise<void> {},\n};\n\n/** @since Beekeeper Studio 5.5.? */\nexport const noty = {\n async success(message: string): Promise<void> {\n return await request({\n name: \"noty.success\",\n args: { message },\n });\n },\n async info(message: string): Promise<void> {\n return await request({\n name: \"noty.info\",\n args: { message },\n });\n },\n async warning(message: string): Promise<void> {\n return await request({\n name: \"noty.warning\",\n args: { message },\n });\n },\n async error(message: string): Promise<void> {\n return await request({\n name: \"noty.error\",\n args: { message },\n });\n },\n};\n\nlet debugComms = false;\n\nexport function setDebugComms(enabled: boolean) {\n debugComms = enabled;\n}\n\nexport function notify<Message extends JsonValue = JsonValue>(\n name: \"broadcast\",\n args: { message: Message },\n): void;\nexport function notify(name: \"pluginError\", args: PluginErrorObject): void;\nexport function notify(name: \"windowEvent\", args: WindowEventObject): void;\nexport function notify(name: string, args: any) {\n const payload = { name, args };\n if (debugComms) {\n const time = new Date().toLocaleTimeString(\"en-GB\");\n console.groupCollapsed(`${time} [NOTIFICATION] ${name}`);\n console.log(\"args:\", args);\n console.log(\"payload:\", payload);\n console.groupEnd();\n }\n window.parent.postMessage(payload, \"*\");\n}\n\nexport function addNotificationListener(\n name: \"tablesChanged\",\n handler: () => void,\n): void;\nexport function addNotificationListener<Message extends JsonValue = JsonValue>(\n name: \"broadcast\",\n handler: (args: { message: Message }) => void,\n): void;\nexport function addNotificationListener(\n name: \"themeChanged\",\n handler: (args: AppTheme) => void,\n): void;\nexport function addNotificationListener(\n name: \"dataPollSucceeded\",\n handler: () => void,\n): void;\nexport function addNotificationListener(\n name: string,\n handler: (args: any) => void,\n) {\n if (!notificationListeners.get(name)) {\n notificationListeners.set(name, []);\n }\n notificationListeners.get(name)!.push(handler);\n}\n\nexport function removeNotificationListener(\n name: \"tablesChanged\",\n handler: (args: any) => void,\n): void;\nexport function removeNotificationListener<\n Message extends JsonValue = JsonValue,\n>(name: \"broadcast\", handler: (args: any) => void): void;\nexport function removeNotificationListener(\n name: \"themeChanged\",\n handler: (args: any) => void,\n): void;\nexport function removeNotificationListener(\n name: string,\n handler: (args: any) => void,\n) {\n const handlers = notificationListeners.get(name);\n if (handlers) {\n const index = handlers.indexOf(handler);\n if (index > -1) {\n handlers.splice(index, 1);\n }\n }\n}\n\nconst pendingRequests = new Map<\n string,\n {\n // The whole payload is kept just in case for debugging\n payload: any;\n resolve: (value: any) => void;\n reject: (reason?: any) => void;\n }\n>();\n\nexport async function request<T extends keyof RequestMap>(raw: {\n name: T;\n args: RequestMap[T][\"args\"];\n}): Promise<RequestMap[T][\"return\"]> {\n const payload = { id: generateUUID(), ...raw };\n\n if (debugComms) {\n const time = new Date().toLocaleTimeString(\"en-GB\");\n console.groupCollapsed(`${time} [REQUEST] ${payload.name}`);\n console.log(\"id:\", payload.id);\n console.log(\"args:\", payload.args);\n console.log(\"payload:\", payload);\n console.groupEnd();\n }\n\n return new Promise<any>((resolve, reject) => {\n try {\n pendingRequests.set(payload.id, { payload: payload, resolve, reject });\n window.parent.postMessage(payload, \"*\");\n } catch (e) {\n reject(e);\n }\n });\n}\n\nconst notificationListeners = new Map<string, ((args: any) => void)[]>();\n\nwindow.addEventListener(\"message\", (event) => {\n const { id, name, args, result, error } = event.data || {};\n\n if (name) {\n if (debugComms) {\n const time = new Date().toLocaleTimeString(\"en-GB\");\n console.groupCollapsed(`${time} [NOTIFICATION] ${name}`);\n console.log(\"Args:\", args);\n console.groupEnd();\n }\n\n const handlers = notificationListeners.get(name);\n if (handlers) {\n handlers.forEach((handler) => handler(args));\n }\n }\n\n if (id && pendingRequests.has(id)) {\n const { resolve, reject, payload } = pendingRequests.get(id)!;\n pendingRequests.delete(id);\n\n if (debugComms) {\n const time = new Date().toLocaleTimeString(\"en-GB\");\n console.groupCollapsed(`${time} [RESPONSE] ${payload.name}`);\n console.log(\"Result:\", result);\n if (error) console.error(\"Error:\", error);\n console.groupEnd();\n }\n\n if (error) {\n reject(error);\n } else {\n resolve(result);\n }\n }\n});\n\nfunction generateUUID() {\n const buf = new Uint8Array(16);\n crypto.getRandomValues(buf);\n\n buf[6] = (buf[6] & 0x0f) | 0x40; // version 4\n buf[8] = (buf[8] & 0x3f) | 0x80; // variant\n\n const hex = Array.from(buf, (b) => b.toString(16).padStart(2, \"0\")).join(\"\");\n\n return [\n hex.substring(0, 8),\n hex.substring(8, 12),\n hex.substring(12, 16),\n hex.substring(16, 20),\n hex.substring(20),\n ].join(\"-\");\n}\n"],"names":[],"mappings":"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"}
@@ -21,7 +21,7 @@ interface TableKey {
21
21
  }
22
22
  type IndexColumn = {
23
23
  name: string;
24
- order?: 'ASC' | 'DESC' | '2d' | '2dsphere' | 'text' | 'geoHaystack' | 'hashed' | number;
24
+ order?: "ASC" | "DESC" | "2d" | "2dsphere" | "text" | "geoHaystack" | "hashed" | number;
25
25
  /** MySQL Only */
26
26
  prefix?: number | null;
27
27
  };
@@ -59,7 +59,7 @@ type TableFilter = {
59
59
  type JsonValue = string | number | boolean | null | JsonValue[] | {
60
60
  [key: string]: JsonValue;
61
61
  };
62
- type DatabaseType = 'postgresql' | 'mysql' | 'mariadb' | 'sqlite' | 'sqlserver' | 'oracle' | 'mongodb' | 'cassandra' | 'clickhouse' | 'firebird' | 'bigquery' | 'redshift' | 'duckdb' | 'libsql' | 'redis' | 'surrealdb' | 'trino';
62
+ type DatabaseType = "postgresql" | "mysql" | "mariadb" | "sqlite" | "sqlserver" | "oracle" | "mongodb" | "cassandra" | "clickhouse" | "firebird" | "bigquery" | "redshift" | "duckdb" | "libsql" | "redis" | "surrealdb" | "trino";
63
63
  type ConnectionInfo = {
64
64
  /** @alias databaseType */
65
65
  connectionType: string;
@@ -113,15 +113,22 @@ type RequestFileSaveOptions = {
113
113
  }[];
114
114
  };
115
115
  type PluginErrorObject = {
116
- name?: string;
116
+ name: string;
117
117
  message: string;
118
118
  stack?: string;
119
+ logStack: string;
119
120
  };
120
121
  type WindowEventObject = {
121
122
  eventType: string;
122
123
  eventClass: WindowEventClass;
123
124
  eventInitOptions: WindowEventInits;
124
125
  };
126
+ type WorkspaceInfo = {
127
+ id: number;
128
+ type: "local" | "cloud";
129
+ name: string;
130
+ isOwner: boolean;
131
+ };
125
132
 
126
133
  type RequestMap = {
127
134
  getSchemas: {
@@ -180,6 +187,10 @@ type RequestMap = {
180
187
  args: void;
181
188
  return: ConnectionInfo;
182
189
  };
190
+ getWorkspaceInfo: {
191
+ args: void;
192
+ return: WorkspaceInfo;
193
+ };
183
194
  getAppInfo: {
184
195
  args: void;
185
196
  return: AppInfo;
@@ -299,6 +310,19 @@ type RequestMap = {
299
310
  args: void;
300
311
  return: string;
301
312
  };
313
+ "workspaceConnectionStorage.setItem": {
314
+ args: {
315
+ key: string;
316
+ value: any;
317
+ };
318
+ return: void;
319
+ };
320
+ "workspaceConnectionStorage.getItem": {
321
+ args: {
322
+ key: string;
323
+ };
324
+ return: any;
325
+ };
302
326
  "noty.success": {
303
327
  args: {
304
328
  message: string;
@@ -356,6 +380,9 @@ type NotificationMap = {
356
380
  pluginError: {
357
381
  args: PluginErrorObject;
358
382
  };
383
+ dataPollSucceeded: {
384
+ args: void;
385
+ };
359
386
  };
360
387
 
361
388
  export type { NotificationMap, RequestMap, RequestPayload, ResponsePayload };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@beekeeperstudio/plugin",
3
- "version": "1.6.0",
3
+ "version": "1.7.1-beta.0",
4
4
  "description": "A simple TypeScript wrapper to send messages from your Beekeeper Studio plugin to the main app.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",