translime-sdk 1.0.2 → 1.0.3
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.
- package/dist/index.cjs +10 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +19 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.js +10 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -210,6 +210,15 @@ async function setPluginSetting(...args) {
|
|
|
210
210
|
return null;
|
|
211
211
|
}
|
|
212
212
|
/**
|
|
213
|
+
* 执行宿主注册的插件命令
|
|
214
|
+
* @param {...any} args
|
|
215
|
+
* @returns {Promise<any>}
|
|
216
|
+
*/
|
|
217
|
+
async function executePluginCommand(...args) {
|
|
218
|
+
if (typeof window !== "undefined" && window.ts?.executePluginCommand) return window.ts.executePluginCommand(...args);
|
|
219
|
+
return null;
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
213
222
|
* 获取窗口控制工具
|
|
214
223
|
* @description 包含 minimize, maximize, close 等窗口操作
|
|
215
224
|
* @returns {Object|null}
|
|
@@ -258,6 +267,7 @@ function useLogger() {
|
|
|
258
267
|
}
|
|
259
268
|
//#endregion
|
|
260
269
|
exports.electronNetAdapter = electronNetAdapter;
|
|
270
|
+
exports.executePluginCommand = executePluginCommand;
|
|
261
271
|
exports.getMainStore = getMainStore;
|
|
262
272
|
exports.getPluginSetting = getPluginSetting;
|
|
263
273
|
exports.isPreviewMode = isPreviewMode;
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["checkPreviewMode"],"sources":["../src/electronNetAdapter.js","../src/index.js"],"sourcesContent":["function createRequestId() {\r\n if (typeof globalThis !== 'undefined' && globalThis.crypto?.randomUUID) {\r\n return globalThis.crypto.randomUUID();\r\n }\r\n\r\n return `ts-net-${Date.now()}-${Math.random().toString(16).slice(2)}`;\r\n}\r\n\r\nfunction createRequestMeta(requestConfig) {\r\n const url = new URL(requestConfig.url);\r\n return {\r\n _options: requestConfig,\r\n method: requestConfig.method,\r\n path: url.pathname,\r\n protocol: url.protocol,\r\n host: url.host,\r\n hostname: url.hostname,\r\n };\r\n}\r\n\r\nfunction createNetworkError(message, config, requestConfig, cause) {\r\n const error = new Error(message || 'Network Error');\r\n error.code = 'ERR_NETWORK';\r\n error.config = config;\r\n error.request = createRequestMeta(requestConfig);\r\n if (cause) {\r\n error.cause = cause;\r\n }\r\n return error;\r\n}\r\n\r\nfunction normalizeHeaders(headers) {\r\n if (!headers) {\r\n return undefined;\r\n }\r\n\r\n return Object.fromEntries(\r\n Object.entries(headers).filter(([, value]) => value != null),\r\n );\r\n}\r\n\r\nfunction buildRequestConfig(config) {\r\n const baseURL = config.baseURL ? config.baseURL.replace(/\\/+$/, '') : '';\r\n const url = new URL(config.url, baseURL || undefined).toString();\r\n\r\n return {\r\n method: config.method?.toUpperCase() || 'GET',\r\n url,\r\n headers: normalizeHeaders(config.headers),\r\n data: config.data,\r\n responseType: config.responseType,\r\n };\r\n}\r\n\r\nfunction buildPreviewOptions(requestConfig) {\r\n return {\r\n method: requestConfig.method,\r\n headers: requestConfig.headers,\r\n body: requestConfig.data,\r\n };\r\n}\r\n\r\nexport default async function electronNetAdapter(config) {\r\n const net = typeof window !== 'undefined' ? window.ts?.net : null;\r\n if (!net?.request) {\r\n throw createNetworkError('window.ts.net.request is not available', config, {\r\n method: config.method?.toUpperCase() || 'GET',\r\n url: new URL(config.url, config.baseURL || undefined).toString(),\r\n });\r\n }\r\n\r\n const requestId = createRequestId();\r\n const requestConfig = buildRequestConfig(config);\r\n const requestMeta = createRequestMeta(requestConfig);\r\n\r\n if (config.signal && typeof net.abort === 'function') {\r\n config.signal.addEventListener('abort', () => {\r\n net.abort(requestId);\r\n }, { once: true });\r\n }\r\n\r\n try {\r\n let response;\r\n try {\r\n response = await net.request(requestId, requestConfig);\r\n } catch (error) {\r\n response = await net.request(\r\n requestConfig.url,\r\n buildPreviewOptions(requestConfig),\r\n );\r\n if (response?.ok === false && !response.status) {\r\n throw error;\r\n }\r\n }\r\n\r\n return {\r\n data: response?.data,\r\n status: response?.status,\r\n statusText: response?.statusText || '',\r\n headers: response?.headers || {},\r\n config,\r\n request: requestMeta,\r\n };\r\n } catch (error) {\r\n throw createNetworkError(error.message, config, requestConfig, error);\r\n }\r\n}\r\n","/**\r\n * Translime SDK\r\n * 提供插件开发所需的标准 API 和类型提示。\r\n * 包含主进程 (Main Process) 和渲染进程 (Renderer Process) 的通用接口。\r\n */\r\n\r\nimport {\r\n isPreviewMode as checkPreviewMode,\r\n initPreviewMock,\r\n} from './preview-mock';\r\nimport electronNetAdapter from './electronNetAdapter';\r\n\r\nconst CLIPBOARD_IPC = {\r\n readText: 'read-clipboard-text',\r\n writeText: 'copy-text',\r\n};\r\n\r\n// ----------------------------------------------------------------------\r\n// Initialization (Side Effect)\r\n// ----------------------------------------------------------------------\r\n\r\n// 在模块加载时检测并初始化 Preview Mock 环境\r\n// 确保在 Preview 模式下直接导入 SDK 也能获得 Mock 支持\r\nif (typeof window !== 'undefined' && checkPreviewMode()) {\r\n initPreviewMock();\r\n}\r\n\r\n// ----------------------------------------------------------------------\r\n// Core / Store APIs (Main Process Only)\r\n// ----------------------------------------------------------------------\r\n\r\n/**\r\n * 检查当前是否为 Preview 模式\r\n * @returns {boolean}\r\n */\r\nexport function isPreviewMode() {\r\n return checkPreviewMode();\r\n}\r\n\r\n/**\r\n * @typedef {Object} MainStore\r\n * @property {Object} config\r\n * @property {function(string, *): *} config.get\r\n * @property {function(string, *): void} config.set\r\n * @property {Object} [logger]\r\n */\r\n\r\n/**\r\n * 获取主程序 Store\r\n * @description 仅在 **主进程 (Main Process)** 环境可用\r\n * @returns {MainStore|null} 若在非主进程环境调用,返回 null\r\n */\r\nexport function getMainStore() {\r\n if (typeof global !== 'undefined' && global.mainStore) {\r\n return global.mainStore;\r\n }\r\n return null;\r\n}\r\n\r\n/**\r\n * 使用插件配置代理\r\n * @description 获取针对特定插件的配置读写对象\r\n * @param {string} pluginId 插件 ID (通常与 package.json 中的 name 一致)\r\n * @returns {{ get: function(string, *): *, set: function(string, *): void }}\r\n */\r\nexport function usePluginConfig(pluginId) {\r\n const store = getMainStore();\r\n return {\r\n get(key, defaultValue) {\r\n return store?.config?.get(`plugin.${pluginId}.settings.${key}`, defaultValue);\r\n },\r\n set(key, value) {\r\n store?.config?.set(`plugin.${pluginId}.settings.${key}`, value);\r\n },\r\n };\r\n}\r\n\r\n/**\r\n * 获取插件间通信工具\r\n * @description 仅在 **主进程 (Main Process)** 环境可用\r\n * @returns {import('./index.d').PluginInterop|null}\r\n */\r\nexport function usePluginInterop() {\r\n if (typeof global !== 'undefined' && global.pluginInterop) {\r\n return global.pluginInterop;\r\n }\r\n return null;\r\n}\r\n\r\n// ----------------------------------------------------------------------\r\n// UI & Renderer APIs (Renderer Process Only)\r\n// ----------------------------------------------------------------------\r\n\r\n/**\r\n * 获取 IPC 通信工具\r\n * @description 仅在 **渲染进程 (Renderer Process)** 环境可用\r\n * @returns {Object|null} 包含 invoke, send, on 等方法的对象\r\n */\r\nexport function useIpc() {\r\n if (typeof window !== 'undefined' && window.electron?.useIpc) {\r\n return window.electron.useIpc();\r\n }\r\n return null;\r\n}\r\n\r\n/**\r\n * 获取 Vuetify 实例\r\n * @description 仅在 **渲染进程** 环境可用,用于访问 Vuetify 的全局配置\r\n * @returns {Object} Vuetify 实例对象\r\n */\r\nexport function useVuetify() {\r\n if (typeof window !== 'undefined' && window.vuetify$) {\r\n return window.vuetify$;\r\n }\r\n return {};\r\n}\r\n\r\n/**\r\n * 获取全局注册的 Vuetify 组件\r\n * @returns {Record<string, any>}\r\n */\r\nexport function useVuetifyComponents() {\r\n return useVuetify().components || {};\r\n}\r\n\r\n/**\r\n * 获取全局注册的 Vuetify 指令\r\n * @returns {Record<string, any>}\r\n */\r\nexport function useVuetifyDirectives() {\r\n return useVuetify().directives || {};\r\n}\r\n\r\n/**\r\n * 获取 Dialog API\r\n * @description 类似于 Electron 的 dialog 模块 (showOpenDialog, showSaveDialog 等)\r\n * @returns {Object|null}\r\n */\r\nexport function useDialog() {\r\n if (typeof window !== 'undefined' && window.electron?.dialog) {\r\n return window.electron.dialog;\r\n }\r\n return null;\r\n}\r\n\r\n/**\r\n * 获取 Shell API\r\n * @description 类似于 Electron 的 shell 模块 (openExternal, showItemInFolder 等)\r\n * @returns {Object|null}\r\n */\r\nexport function useShell() {\r\n if (typeof window !== 'undefined' && window.electron?.shell) {\r\n return window.electron.shell;\r\n }\r\n return null;\r\n}\r\n\r\n/**\r\n * 获取插件自身设置 (IPC 封装)\r\n * @description 仅在 **渲染进程** 环境可用。这是 `plugin.settings` 的前端读取接口。\r\n * @param {...any} args\r\n * @returns {Promise<any>}\r\n */\r\nexport async function getPluginSetting(...args) {\r\n if (typeof window !== 'undefined' && window.ts?.getPluginSetting) {\r\n return window.ts.getPluginSetting(...args);\r\n }\r\n return null;\r\n}\r\n\r\n/**\r\n * 更新插件自身设置 (IPC 封装)\r\n * @description 仅在 **渲染进程** 环境可用。\r\n * @param {...any} args\r\n * @returns {Promise<any>}\r\n */\r\nexport async function setPluginSetting(...args) {\r\n if (typeof window !== 'undefined' && window.ts?.setPluginSetting) {\r\n return window.ts.setPluginSetting(...args);\r\n }\r\n return null;\r\n}\r\n\r\n/**\r\n * 获取窗口控制工具\r\n * @description 包含 minimize, maximize, close 等窗口操作\r\n * @returns {Object|null}\r\n */\r\nexport function useWindowControl() {\r\n if (typeof window !== 'undefined' && window.ts?.windowControl) {\r\n return window.ts.windowControl;\r\n }\r\n return null;\r\n}\r\n\r\n// ----------------------------------------------------------------------\r\n// Utilities (Shared)\r\n// ----------------------------------------------------------------------\r\n\r\n/**\r\n * 获取剪贴板工具\r\n * @returns {Object|null}\r\n */\r\nexport function useClipboard() {\r\n if (typeof window !== 'undefined') {\r\n return {\r\n async readText() {\r\n if (window.electron?.useIpc) {\r\n return window.electron.useIpc().invoke(CLIPBOARD_IPC.readText);\r\n }\r\n if (navigator.clipboard?.readText) {\r\n return navigator.clipboard.readText();\r\n }\r\n return null;\r\n },\r\n async writeText(text) {\r\n if (window.electron?.useIpc) {\r\n return window.electron.useIpc().invoke(CLIPBOARD_IPC.writeText, text);\r\n }\r\n if (navigator.clipboard?.writeText) {\r\n return navigator.clipboard.writeText(text);\r\n }\r\n return null;\r\n },\r\n };\r\n }\r\n return null;\r\n}\r\n\r\n/**\r\n * 在默认浏览器中打开链接\r\n * @param {string} url 要打开的链接\r\n * @returns {Promise<void>}\r\n */\r\nexport async function openLink(...args) {\r\n if (typeof window !== 'undefined' && window.electron?.openLink) {\r\n return window.electron.openLink(...args);\r\n }\r\n return null;\r\n}\r\n\r\n/**\r\n * 获取日志工具\r\n * @description 自动适配 Node.js 环境 (Main) 或浏览器环境 (Renderer)\r\n * @returns {Record<'log'|'info'|'warn'|'error'|'debug', Function>} Console-like logger\r\n */\r\nexport function useLogger() {\r\n if (typeof global !== 'undefined' && global.mainStore) {\r\n return global.mainStore?.logger || console;\r\n }\r\n if (typeof window !== 'undefined') {\r\n return window.ts?.logger || console;\r\n }\r\n return console;\r\n}\r\n\r\nexport { electronNetAdapter };\r\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["checkPreviewMode"],"sources":["../src/electronNetAdapter.js","../src/index.js"],"sourcesContent":["function createRequestId() {\r\n if (typeof globalThis !== 'undefined' && globalThis.crypto?.randomUUID) {\r\n return globalThis.crypto.randomUUID();\r\n }\r\n\r\n return `ts-net-${Date.now()}-${Math.random().toString(16).slice(2)}`;\r\n}\r\n\r\nfunction createRequestMeta(requestConfig) {\r\n const url = new URL(requestConfig.url);\r\n return {\r\n _options: requestConfig,\r\n method: requestConfig.method,\r\n path: url.pathname,\r\n protocol: url.protocol,\r\n host: url.host,\r\n hostname: url.hostname,\r\n };\r\n}\r\n\r\nfunction createNetworkError(message, config, requestConfig, cause) {\r\n const error = new Error(message || 'Network Error');\r\n error.code = 'ERR_NETWORK';\r\n error.config = config;\r\n error.request = createRequestMeta(requestConfig);\r\n if (cause) {\r\n error.cause = cause;\r\n }\r\n return error;\r\n}\r\n\r\nfunction normalizeHeaders(headers) {\r\n if (!headers) {\r\n return undefined;\r\n }\r\n\r\n return Object.fromEntries(\r\n Object.entries(headers).filter(([, value]) => value != null),\r\n );\r\n}\r\n\r\nfunction buildRequestConfig(config) {\r\n const baseURL = config.baseURL ? config.baseURL.replace(/\\/+$/, '') : '';\r\n const url = new URL(config.url, baseURL || undefined).toString();\r\n\r\n return {\r\n method: config.method?.toUpperCase() || 'GET',\r\n url,\r\n headers: normalizeHeaders(config.headers),\r\n data: config.data,\r\n responseType: config.responseType,\r\n };\r\n}\r\n\r\nfunction buildPreviewOptions(requestConfig) {\r\n return {\r\n method: requestConfig.method,\r\n headers: requestConfig.headers,\r\n body: requestConfig.data,\r\n };\r\n}\r\n\r\nexport default async function electronNetAdapter(config) {\r\n const net = typeof window !== 'undefined' ? window.ts?.net : null;\r\n if (!net?.request) {\r\n throw createNetworkError('window.ts.net.request is not available', config, {\r\n method: config.method?.toUpperCase() || 'GET',\r\n url: new URL(config.url, config.baseURL || undefined).toString(),\r\n });\r\n }\r\n\r\n const requestId = createRequestId();\r\n const requestConfig = buildRequestConfig(config);\r\n const requestMeta = createRequestMeta(requestConfig);\r\n\r\n if (config.signal && typeof net.abort === 'function') {\r\n config.signal.addEventListener('abort', () => {\r\n net.abort(requestId);\r\n }, { once: true });\r\n }\r\n\r\n try {\r\n let response;\r\n try {\r\n response = await net.request(requestId, requestConfig);\r\n } catch (error) {\r\n response = await net.request(\r\n requestConfig.url,\r\n buildPreviewOptions(requestConfig),\r\n );\r\n if (response?.ok === false && !response.status) {\r\n throw error;\r\n }\r\n }\r\n\r\n return {\r\n data: response?.data,\r\n status: response?.status,\r\n statusText: response?.statusText || '',\r\n headers: response?.headers || {},\r\n config,\r\n request: requestMeta,\r\n };\r\n } catch (error) {\r\n throw createNetworkError(error.message, config, requestConfig, error);\r\n }\r\n}\r\n","/**\r\n * Translime SDK\r\n * 提供插件开发所需的标准 API 和类型提示。\r\n * 包含主进程 (Main Process) 和渲染进程 (Renderer Process) 的通用接口。\r\n */\r\n\r\nimport {\r\n isPreviewMode as checkPreviewMode,\r\n initPreviewMock,\r\n} from './preview-mock';\r\nimport electronNetAdapter from './electronNetAdapter';\r\n\r\nconst CLIPBOARD_IPC = {\r\n readText: 'read-clipboard-text',\r\n writeText: 'copy-text',\r\n};\r\n\r\n// ----------------------------------------------------------------------\r\n// Initialization (Side Effect)\r\n// ----------------------------------------------------------------------\r\n\r\n// 在模块加载时检测并初始化 Preview Mock 环境\r\n// 确保在 Preview 模式下直接导入 SDK 也能获得 Mock 支持\r\nif (typeof window !== 'undefined' && checkPreviewMode()) {\r\n initPreviewMock();\r\n}\r\n\r\n// ----------------------------------------------------------------------\r\n// Core / Store APIs (Main Process Only)\r\n// ----------------------------------------------------------------------\r\n\r\n/**\r\n * 检查当前是否为 Preview 模式\r\n * @returns {boolean}\r\n */\r\nexport function isPreviewMode() {\r\n return checkPreviewMode();\r\n}\r\n\r\n/**\r\n * @typedef {Object} MainStore\r\n * @property {Object} config\r\n * @property {function(string, *): *} config.get\r\n * @property {function(string, *): void} config.set\r\n * @property {Object} [logger]\r\n */\r\n\r\n/**\r\n * 获取主程序 Store\r\n * @description 仅在 **主进程 (Main Process)** 环境可用\r\n * @returns {MainStore|null} 若在非主进程环境调用,返回 null\r\n */\r\nexport function getMainStore() {\r\n if (typeof global !== 'undefined' && global.mainStore) {\r\n return global.mainStore;\r\n }\r\n return null;\r\n}\r\n\r\n/**\r\n * 使用插件配置代理\r\n * @description 获取针对特定插件的配置读写对象\r\n * @param {string} pluginId 插件 ID (通常与 package.json 中的 name 一致)\r\n * @returns {{ get: function(string, *): *, set: function(string, *): void }}\r\n */\r\nexport function usePluginConfig(pluginId) {\r\n const store = getMainStore();\r\n return {\r\n get(key, defaultValue) {\r\n return store?.config?.get(`plugin.${pluginId}.settings.${key}`, defaultValue);\r\n },\r\n set(key, value) {\r\n store?.config?.set(`plugin.${pluginId}.settings.${key}`, value);\r\n },\r\n };\r\n}\r\n\r\n/**\r\n * 获取插件间通信工具\r\n * @description 仅在 **主进程 (Main Process)** 环境可用\r\n * @returns {import('./index.d').PluginInterop|null}\r\n */\r\nexport function usePluginInterop() {\r\n if (typeof global !== 'undefined' && global.pluginInterop) {\r\n return global.pluginInterop;\r\n }\r\n return null;\r\n}\r\n\r\n// ----------------------------------------------------------------------\r\n// UI & Renderer APIs (Renderer Process Only)\r\n// ----------------------------------------------------------------------\r\n\r\n/**\r\n * 获取 IPC 通信工具\r\n * @description 仅在 **渲染进程 (Renderer Process)** 环境可用\r\n * @returns {Object|null} 包含 invoke, send, on 等方法的对象\r\n */\r\nexport function useIpc() {\r\n if (typeof window !== 'undefined' && window.electron?.useIpc) {\r\n return window.electron.useIpc();\r\n }\r\n return null;\r\n}\r\n\r\n/**\r\n * 获取 Vuetify 实例\r\n * @description 仅在 **渲染进程** 环境可用,用于访问 Vuetify 的全局配置\r\n * @returns {Object} Vuetify 实例对象\r\n */\r\nexport function useVuetify() {\r\n if (typeof window !== 'undefined' && window.vuetify$) {\r\n return window.vuetify$;\r\n }\r\n return {};\r\n}\r\n\r\n/**\r\n * 获取全局注册的 Vuetify 组件\r\n * @returns {Record<string, any>}\r\n */\r\nexport function useVuetifyComponents() {\r\n return useVuetify().components || {};\r\n}\r\n\r\n/**\r\n * 获取全局注册的 Vuetify 指令\r\n * @returns {Record<string, any>}\r\n */\r\nexport function useVuetifyDirectives() {\r\n return useVuetify().directives || {};\r\n}\r\n\r\n/**\r\n * 获取 Dialog API\r\n * @description 类似于 Electron 的 dialog 模块 (showOpenDialog, showSaveDialog 等)\r\n * @returns {Object|null}\r\n */\r\nexport function useDialog() {\r\n if (typeof window !== 'undefined' && window.electron?.dialog) {\r\n return window.electron.dialog;\r\n }\r\n return null;\r\n}\r\n\r\n/**\r\n * 获取 Shell API\r\n * @description 类似于 Electron 的 shell 模块 (openExternal, showItemInFolder 等)\r\n * @returns {Object|null}\r\n */\r\nexport function useShell() {\r\n if (typeof window !== 'undefined' && window.electron?.shell) {\r\n return window.electron.shell;\r\n }\r\n return null;\r\n}\r\n\r\n/**\r\n * 获取插件自身设置 (IPC 封装)\r\n * @description 仅在 **渲染进程** 环境可用。这是 `plugin.settings` 的前端读取接口。\r\n * @param {...any} args\r\n * @returns {Promise<any>}\r\n */\r\nexport async function getPluginSetting(...args) {\r\n if (typeof window !== 'undefined' && window.ts?.getPluginSetting) {\r\n return window.ts.getPluginSetting(...args);\r\n }\r\n return null;\r\n}\r\n\r\n/**\r\n * 更新插件自身设置 (IPC 封装)\r\n * @description 仅在 **渲染进程** 环境可用。\r\n * @param {...any} args\r\n * @returns {Promise<any>}\r\n */\r\nexport async function setPluginSetting(...args) {\r\n if (typeof window !== 'undefined' && window.ts?.setPluginSetting) {\r\n return window.ts.setPluginSetting(...args);\r\n }\r\n return null;\r\n}\r\n\r\n/**\r\n * 执行宿主注册的插件命令\r\n * @param {...any} args\r\n * @returns {Promise<any>}\r\n */\r\nexport async function executePluginCommand(...args) {\r\n if (typeof window !== 'undefined' && window.ts?.executePluginCommand) {\r\n return window.ts.executePluginCommand(...args);\r\n }\r\n return null;\r\n}\r\n\r\n/**\r\n * 获取窗口控制工具\r\n * @description 包含 minimize, maximize, close 等窗口操作\r\n * @returns {Object|null}\r\n */\r\nexport function useWindowControl() {\r\n if (typeof window !== 'undefined' && window.ts?.windowControl) {\r\n return window.ts.windowControl;\r\n }\r\n return null;\r\n}\r\n\r\n// ----------------------------------------------------------------------\r\n// Utilities (Shared)\r\n// ----------------------------------------------------------------------\r\n\r\n/**\r\n * 获取剪贴板工具\r\n * @returns {Object|null}\r\n */\r\nexport function useClipboard() {\r\n if (typeof window !== 'undefined') {\r\n return {\r\n async readText() {\r\n if (window.electron?.useIpc) {\r\n return window.electron.useIpc().invoke(CLIPBOARD_IPC.readText);\r\n }\r\n if (navigator.clipboard?.readText) {\r\n return navigator.clipboard.readText();\r\n }\r\n return null;\r\n },\r\n async writeText(text) {\r\n if (window.electron?.useIpc) {\r\n return window.electron.useIpc().invoke(CLIPBOARD_IPC.writeText, text);\r\n }\r\n if (navigator.clipboard?.writeText) {\r\n return navigator.clipboard.writeText(text);\r\n }\r\n return null;\r\n },\r\n };\r\n }\r\n return null;\r\n}\r\n\r\n/**\r\n * 在默认浏览器中打开链接\r\n * @param {string} url 要打开的链接\r\n * @returns {Promise<void>}\r\n */\r\nexport async function openLink(...args) {\r\n if (typeof window !== 'undefined' && window.electron?.openLink) {\r\n return window.electron.openLink(...args);\r\n }\r\n return null;\r\n}\r\n\r\n/**\r\n * 获取日志工具\r\n * @description 自动适配 Node.js 环境 (Main) 或浏览器环境 (Renderer)\r\n * @returns {Record<'log'|'info'|'warn'|'error'|'debug', Function>} Console-like logger\r\n */\r\nexport function useLogger() {\r\n if (typeof global !== 'undefined' && global.mainStore) {\r\n return global.mainStore?.logger || console;\r\n }\r\n if (typeof window !== 'undefined') {\r\n return window.ts?.logger || console;\r\n }\r\n return console;\r\n}\r\n\r\nexport { electronNetAdapter };\r\n"],"mappings":"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"}
|
package/dist/index.d.cts
CHANGED
|
@@ -7,6 +7,20 @@ export interface MainStore {
|
|
|
7
7
|
config: Config;
|
|
8
8
|
}
|
|
9
9
|
|
|
10
|
+
export interface PluginCommandContribution {
|
|
11
|
+
id: string;
|
|
12
|
+
title?: string;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export interface PluginManifest {
|
|
16
|
+
activationEvents?: string[];
|
|
17
|
+
dependencies?: string[];
|
|
18
|
+
optionalDependencies?: string[];
|
|
19
|
+
contributes?: {
|
|
20
|
+
commands?: PluginCommandContribution[];
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
|
|
10
24
|
/**
|
|
11
25
|
* 检查当前是否为 Preview 模式
|
|
12
26
|
*/
|
|
@@ -89,6 +103,11 @@ export function getPluginSetting(...args: any[]): Promise<any>;
|
|
|
89
103
|
*/
|
|
90
104
|
export function setPluginSetting(...args: any[]): Promise<any>;
|
|
91
105
|
|
|
106
|
+
/**
|
|
107
|
+
* 执行宿主注册的插件命令
|
|
108
|
+
*/
|
|
109
|
+
export function executePluginCommand(...args: any[]): Promise<any>;
|
|
110
|
+
|
|
92
111
|
/**
|
|
93
112
|
* 获取窗口控制工具 (仅在渲染进程环境可用)
|
|
94
113
|
*/
|
package/dist/index.d.ts
CHANGED
|
@@ -7,6 +7,20 @@ export interface MainStore {
|
|
|
7
7
|
config: Config;
|
|
8
8
|
}
|
|
9
9
|
|
|
10
|
+
export interface PluginCommandContribution {
|
|
11
|
+
id: string;
|
|
12
|
+
title?: string;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export interface PluginManifest {
|
|
16
|
+
activationEvents?: string[];
|
|
17
|
+
dependencies?: string[];
|
|
18
|
+
optionalDependencies?: string[];
|
|
19
|
+
contributes?: {
|
|
20
|
+
commands?: PluginCommandContribution[];
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
|
|
10
24
|
/**
|
|
11
25
|
* 检查当前是否为 Preview 模式
|
|
12
26
|
*/
|
|
@@ -89,6 +103,11 @@ export function getPluginSetting(...args: any[]): Promise<any>;
|
|
|
89
103
|
*/
|
|
90
104
|
export function setPluginSetting(...args: any[]): Promise<any>;
|
|
91
105
|
|
|
106
|
+
/**
|
|
107
|
+
* 执行宿主注册的插件命令
|
|
108
|
+
*/
|
|
109
|
+
export function executePluginCommand(...args: any[]): Promise<any>;
|
|
110
|
+
|
|
92
111
|
/**
|
|
93
112
|
* 获取窗口控制工具 (仅在渲染进程环境可用)
|
|
94
113
|
*/
|
package/dist/index.js
CHANGED
|
@@ -209,6 +209,15 @@ async function setPluginSetting(...args) {
|
|
|
209
209
|
return null;
|
|
210
210
|
}
|
|
211
211
|
/**
|
|
212
|
+
* 执行宿主注册的插件命令
|
|
213
|
+
* @param {...any} args
|
|
214
|
+
* @returns {Promise<any>}
|
|
215
|
+
*/
|
|
216
|
+
async function executePluginCommand(...args) {
|
|
217
|
+
if (typeof window !== "undefined" && window.ts?.executePluginCommand) return window.ts.executePluginCommand(...args);
|
|
218
|
+
return null;
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
212
221
|
* 获取窗口控制工具
|
|
213
222
|
* @description 包含 minimize, maximize, close 等窗口操作
|
|
214
223
|
* @returns {Object|null}
|
|
@@ -256,6 +265,6 @@ function useLogger() {
|
|
|
256
265
|
return console;
|
|
257
266
|
}
|
|
258
267
|
//#endregion
|
|
259
|
-
export { electronNetAdapter, getMainStore, getPluginSetting, isPreviewMode, openLink, setPluginSetting, useClipboard, useDialog, useIpc, useLogger, usePluginConfig, usePluginInterop, useShell, useVuetify, useVuetifyComponents, useVuetifyDirectives, useWindowControl };
|
|
268
|
+
export { electronNetAdapter, executePluginCommand, getMainStore, getPluginSetting, isPreviewMode, openLink, setPluginSetting, useClipboard, useDialog, useIpc, useLogger, usePluginConfig, usePluginInterop, useShell, useVuetify, useVuetifyComponents, useVuetifyDirectives, useWindowControl };
|
|
260
269
|
|
|
261
270
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["checkPreviewMode"],"sources":["../src/electronNetAdapter.js","../src/index.js"],"sourcesContent":["function createRequestId() {\r\n if (typeof globalThis !== 'undefined' && globalThis.crypto?.randomUUID) {\r\n return globalThis.crypto.randomUUID();\r\n }\r\n\r\n return `ts-net-${Date.now()}-${Math.random().toString(16).slice(2)}`;\r\n}\r\n\r\nfunction createRequestMeta(requestConfig) {\r\n const url = new URL(requestConfig.url);\r\n return {\r\n _options: requestConfig,\r\n method: requestConfig.method,\r\n path: url.pathname,\r\n protocol: url.protocol,\r\n host: url.host,\r\n hostname: url.hostname,\r\n };\r\n}\r\n\r\nfunction createNetworkError(message, config, requestConfig, cause) {\r\n const error = new Error(message || 'Network Error');\r\n error.code = 'ERR_NETWORK';\r\n error.config = config;\r\n error.request = createRequestMeta(requestConfig);\r\n if (cause) {\r\n error.cause = cause;\r\n }\r\n return error;\r\n}\r\n\r\nfunction normalizeHeaders(headers) {\r\n if (!headers) {\r\n return undefined;\r\n }\r\n\r\n return Object.fromEntries(\r\n Object.entries(headers).filter(([, value]) => value != null),\r\n );\r\n}\r\n\r\nfunction buildRequestConfig(config) {\r\n const baseURL = config.baseURL ? config.baseURL.replace(/\\/+$/, '') : '';\r\n const url = new URL(config.url, baseURL || undefined).toString();\r\n\r\n return {\r\n method: config.method?.toUpperCase() || 'GET',\r\n url,\r\n headers: normalizeHeaders(config.headers),\r\n data: config.data,\r\n responseType: config.responseType,\r\n };\r\n}\r\n\r\nfunction buildPreviewOptions(requestConfig) {\r\n return {\r\n method: requestConfig.method,\r\n headers: requestConfig.headers,\r\n body: requestConfig.data,\r\n };\r\n}\r\n\r\nexport default async function electronNetAdapter(config) {\r\n const net = typeof window !== 'undefined' ? window.ts?.net : null;\r\n if (!net?.request) {\r\n throw createNetworkError('window.ts.net.request is not available', config, {\r\n method: config.method?.toUpperCase() || 'GET',\r\n url: new URL(config.url, config.baseURL || undefined).toString(),\r\n });\r\n }\r\n\r\n const requestId = createRequestId();\r\n const requestConfig = buildRequestConfig(config);\r\n const requestMeta = createRequestMeta(requestConfig);\r\n\r\n if (config.signal && typeof net.abort === 'function') {\r\n config.signal.addEventListener('abort', () => {\r\n net.abort(requestId);\r\n }, { once: true });\r\n }\r\n\r\n try {\r\n let response;\r\n try {\r\n response = await net.request(requestId, requestConfig);\r\n } catch (error) {\r\n response = await net.request(\r\n requestConfig.url,\r\n buildPreviewOptions(requestConfig),\r\n );\r\n if (response?.ok === false && !response.status) {\r\n throw error;\r\n }\r\n }\r\n\r\n return {\r\n data: response?.data,\r\n status: response?.status,\r\n statusText: response?.statusText || '',\r\n headers: response?.headers || {},\r\n config,\r\n request: requestMeta,\r\n };\r\n } catch (error) {\r\n throw createNetworkError(error.message, config, requestConfig, error);\r\n }\r\n}\r\n","/**\r\n * Translime SDK\r\n * 提供插件开发所需的标准 API 和类型提示。\r\n * 包含主进程 (Main Process) 和渲染进程 (Renderer Process) 的通用接口。\r\n */\r\n\r\nimport {\r\n isPreviewMode as checkPreviewMode,\r\n initPreviewMock,\r\n} from './preview-mock';\r\nimport electronNetAdapter from './electronNetAdapter';\r\n\r\nconst CLIPBOARD_IPC = {\r\n readText: 'read-clipboard-text',\r\n writeText: 'copy-text',\r\n};\r\n\r\n// ----------------------------------------------------------------------\r\n// Initialization (Side Effect)\r\n// ----------------------------------------------------------------------\r\n\r\n// 在模块加载时检测并初始化 Preview Mock 环境\r\n// 确保在 Preview 模式下直接导入 SDK 也能获得 Mock 支持\r\nif (typeof window !== 'undefined' && checkPreviewMode()) {\r\n initPreviewMock();\r\n}\r\n\r\n// ----------------------------------------------------------------------\r\n// Core / Store APIs (Main Process Only)\r\n// ----------------------------------------------------------------------\r\n\r\n/**\r\n * 检查当前是否为 Preview 模式\r\n * @returns {boolean}\r\n */\r\nexport function isPreviewMode() {\r\n return checkPreviewMode();\r\n}\r\n\r\n/**\r\n * @typedef {Object} MainStore\r\n * @property {Object} config\r\n * @property {function(string, *): *} config.get\r\n * @property {function(string, *): void} config.set\r\n * @property {Object} [logger]\r\n */\r\n\r\n/**\r\n * 获取主程序 Store\r\n * @description 仅在 **主进程 (Main Process)** 环境可用\r\n * @returns {MainStore|null} 若在非主进程环境调用,返回 null\r\n */\r\nexport function getMainStore() {\r\n if (typeof global !== 'undefined' && global.mainStore) {\r\n return global.mainStore;\r\n }\r\n return null;\r\n}\r\n\r\n/**\r\n * 使用插件配置代理\r\n * @description 获取针对特定插件的配置读写对象\r\n * @param {string} pluginId 插件 ID (通常与 package.json 中的 name 一致)\r\n * @returns {{ get: function(string, *): *, set: function(string, *): void }}\r\n */\r\nexport function usePluginConfig(pluginId) {\r\n const store = getMainStore();\r\n return {\r\n get(key, defaultValue) {\r\n return store?.config?.get(`plugin.${pluginId}.settings.${key}`, defaultValue);\r\n },\r\n set(key, value) {\r\n store?.config?.set(`plugin.${pluginId}.settings.${key}`, value);\r\n },\r\n };\r\n}\r\n\r\n/**\r\n * 获取插件间通信工具\r\n * @description 仅在 **主进程 (Main Process)** 环境可用\r\n * @returns {import('./index.d').PluginInterop|null}\r\n */\r\nexport function usePluginInterop() {\r\n if (typeof global !== 'undefined' && global.pluginInterop) {\r\n return global.pluginInterop;\r\n }\r\n return null;\r\n}\r\n\r\n// ----------------------------------------------------------------------\r\n// UI & Renderer APIs (Renderer Process Only)\r\n// ----------------------------------------------------------------------\r\n\r\n/**\r\n * 获取 IPC 通信工具\r\n * @description 仅在 **渲染进程 (Renderer Process)** 环境可用\r\n * @returns {Object|null} 包含 invoke, send, on 等方法的对象\r\n */\r\nexport function useIpc() {\r\n if (typeof window !== 'undefined' && window.electron?.useIpc) {\r\n return window.electron.useIpc();\r\n }\r\n return null;\r\n}\r\n\r\n/**\r\n * 获取 Vuetify 实例\r\n * @description 仅在 **渲染进程** 环境可用,用于访问 Vuetify 的全局配置\r\n * @returns {Object} Vuetify 实例对象\r\n */\r\nexport function useVuetify() {\r\n if (typeof window !== 'undefined' && window.vuetify$) {\r\n return window.vuetify$;\r\n }\r\n return {};\r\n}\r\n\r\n/**\r\n * 获取全局注册的 Vuetify 组件\r\n * @returns {Record<string, any>}\r\n */\r\nexport function useVuetifyComponents() {\r\n return useVuetify().components || {};\r\n}\r\n\r\n/**\r\n * 获取全局注册的 Vuetify 指令\r\n * @returns {Record<string, any>}\r\n */\r\nexport function useVuetifyDirectives() {\r\n return useVuetify().directives || {};\r\n}\r\n\r\n/**\r\n * 获取 Dialog API\r\n * @description 类似于 Electron 的 dialog 模块 (showOpenDialog, showSaveDialog 等)\r\n * @returns {Object|null}\r\n */\r\nexport function useDialog() {\r\n if (typeof window !== 'undefined' && window.electron?.dialog) {\r\n return window.electron.dialog;\r\n }\r\n return null;\r\n}\r\n\r\n/**\r\n * 获取 Shell API\r\n * @description 类似于 Electron 的 shell 模块 (openExternal, showItemInFolder 等)\r\n * @returns {Object|null}\r\n */\r\nexport function useShell() {\r\n if (typeof window !== 'undefined' && window.electron?.shell) {\r\n return window.electron.shell;\r\n }\r\n return null;\r\n}\r\n\r\n/**\r\n * 获取插件自身设置 (IPC 封装)\r\n * @description 仅在 **渲染进程** 环境可用。这是 `plugin.settings` 的前端读取接口。\r\n * @param {...any} args\r\n * @returns {Promise<any>}\r\n */\r\nexport async function getPluginSetting(...args) {\r\n if (typeof window !== 'undefined' && window.ts?.getPluginSetting) {\r\n return window.ts.getPluginSetting(...args);\r\n }\r\n return null;\r\n}\r\n\r\n/**\r\n * 更新插件自身设置 (IPC 封装)\r\n * @description 仅在 **渲染进程** 环境可用。\r\n * @param {...any} args\r\n * @returns {Promise<any>}\r\n */\r\nexport async function setPluginSetting(...args) {\r\n if (typeof window !== 'undefined' && window.ts?.setPluginSetting) {\r\n return window.ts.setPluginSetting(...args);\r\n }\r\n return null;\r\n}\r\n\r\n/**\r\n * 获取窗口控制工具\r\n * @description 包含 minimize, maximize, close 等窗口操作\r\n * @returns {Object|null}\r\n */\r\nexport function useWindowControl() {\r\n if (typeof window !== 'undefined' && window.ts?.windowControl) {\r\n return window.ts.windowControl;\r\n }\r\n return null;\r\n}\r\n\r\n// ----------------------------------------------------------------------\r\n// Utilities (Shared)\r\n// ----------------------------------------------------------------------\r\n\r\n/**\r\n * 获取剪贴板工具\r\n * @returns {Object|null}\r\n */\r\nexport function useClipboard() {\r\n if (typeof window !== 'undefined') {\r\n return {\r\n async readText() {\r\n if (window.electron?.useIpc) {\r\n return window.electron.useIpc().invoke(CLIPBOARD_IPC.readText);\r\n }\r\n if (navigator.clipboard?.readText) {\r\n return navigator.clipboard.readText();\r\n }\r\n return null;\r\n },\r\n async writeText(text) {\r\n if (window.electron?.useIpc) {\r\n return window.electron.useIpc().invoke(CLIPBOARD_IPC.writeText, text);\r\n }\r\n if (navigator.clipboard?.writeText) {\r\n return navigator.clipboard.writeText(text);\r\n }\r\n return null;\r\n },\r\n };\r\n }\r\n return null;\r\n}\r\n\r\n/**\r\n * 在默认浏览器中打开链接\r\n * @param {string} url 要打开的链接\r\n * @returns {Promise<void>}\r\n */\r\nexport async function openLink(...args) {\r\n if (typeof window !== 'undefined' && window.electron?.openLink) {\r\n return window.electron.openLink(...args);\r\n }\r\n return null;\r\n}\r\n\r\n/**\r\n * 获取日志工具\r\n * @description 自动适配 Node.js 环境 (Main) 或浏览器环境 (Renderer)\r\n * @returns {Record<'log'|'info'|'warn'|'error'|'debug', Function>} Console-like logger\r\n */\r\nexport function useLogger() {\r\n if (typeof global !== 'undefined' && global.mainStore) {\r\n return global.mainStore?.logger || console;\r\n }\r\n if (typeof window !== 'undefined') {\r\n return window.ts?.logger || console;\r\n }\r\n return console;\r\n}\r\n\r\nexport { electronNetAdapter };\r\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["checkPreviewMode"],"sources":["../src/electronNetAdapter.js","../src/index.js"],"sourcesContent":["function createRequestId() {\r\n if (typeof globalThis !== 'undefined' && globalThis.crypto?.randomUUID) {\r\n return globalThis.crypto.randomUUID();\r\n }\r\n\r\n return `ts-net-${Date.now()}-${Math.random().toString(16).slice(2)}`;\r\n}\r\n\r\nfunction createRequestMeta(requestConfig) {\r\n const url = new URL(requestConfig.url);\r\n return {\r\n _options: requestConfig,\r\n method: requestConfig.method,\r\n path: url.pathname,\r\n protocol: url.protocol,\r\n host: url.host,\r\n hostname: url.hostname,\r\n };\r\n}\r\n\r\nfunction createNetworkError(message, config, requestConfig, cause) {\r\n const error = new Error(message || 'Network Error');\r\n error.code = 'ERR_NETWORK';\r\n error.config = config;\r\n error.request = createRequestMeta(requestConfig);\r\n if (cause) {\r\n error.cause = cause;\r\n }\r\n return error;\r\n}\r\n\r\nfunction normalizeHeaders(headers) {\r\n if (!headers) {\r\n return undefined;\r\n }\r\n\r\n return Object.fromEntries(\r\n Object.entries(headers).filter(([, value]) => value != null),\r\n );\r\n}\r\n\r\nfunction buildRequestConfig(config) {\r\n const baseURL = config.baseURL ? config.baseURL.replace(/\\/+$/, '') : '';\r\n const url = new URL(config.url, baseURL || undefined).toString();\r\n\r\n return {\r\n method: config.method?.toUpperCase() || 'GET',\r\n url,\r\n headers: normalizeHeaders(config.headers),\r\n data: config.data,\r\n responseType: config.responseType,\r\n };\r\n}\r\n\r\nfunction buildPreviewOptions(requestConfig) {\r\n return {\r\n method: requestConfig.method,\r\n headers: requestConfig.headers,\r\n body: requestConfig.data,\r\n };\r\n}\r\n\r\nexport default async function electronNetAdapter(config) {\r\n const net = typeof window !== 'undefined' ? window.ts?.net : null;\r\n if (!net?.request) {\r\n throw createNetworkError('window.ts.net.request is not available', config, {\r\n method: config.method?.toUpperCase() || 'GET',\r\n url: new URL(config.url, config.baseURL || undefined).toString(),\r\n });\r\n }\r\n\r\n const requestId = createRequestId();\r\n const requestConfig = buildRequestConfig(config);\r\n const requestMeta = createRequestMeta(requestConfig);\r\n\r\n if (config.signal && typeof net.abort === 'function') {\r\n config.signal.addEventListener('abort', () => {\r\n net.abort(requestId);\r\n }, { once: true });\r\n }\r\n\r\n try {\r\n let response;\r\n try {\r\n response = await net.request(requestId, requestConfig);\r\n } catch (error) {\r\n response = await net.request(\r\n requestConfig.url,\r\n buildPreviewOptions(requestConfig),\r\n );\r\n if (response?.ok === false && !response.status) {\r\n throw error;\r\n }\r\n }\r\n\r\n return {\r\n data: response?.data,\r\n status: response?.status,\r\n statusText: response?.statusText || '',\r\n headers: response?.headers || {},\r\n config,\r\n request: requestMeta,\r\n };\r\n } catch (error) {\r\n throw createNetworkError(error.message, config, requestConfig, error);\r\n }\r\n}\r\n","/**\r\n * Translime SDK\r\n * 提供插件开发所需的标准 API 和类型提示。\r\n * 包含主进程 (Main Process) 和渲染进程 (Renderer Process) 的通用接口。\r\n */\r\n\r\nimport {\r\n isPreviewMode as checkPreviewMode,\r\n initPreviewMock,\r\n} from './preview-mock';\r\nimport electronNetAdapter from './electronNetAdapter';\r\n\r\nconst CLIPBOARD_IPC = {\r\n readText: 'read-clipboard-text',\r\n writeText: 'copy-text',\r\n};\r\n\r\n// ----------------------------------------------------------------------\r\n// Initialization (Side Effect)\r\n// ----------------------------------------------------------------------\r\n\r\n// 在模块加载时检测并初始化 Preview Mock 环境\r\n// 确保在 Preview 模式下直接导入 SDK 也能获得 Mock 支持\r\nif (typeof window !== 'undefined' && checkPreviewMode()) {\r\n initPreviewMock();\r\n}\r\n\r\n// ----------------------------------------------------------------------\r\n// Core / Store APIs (Main Process Only)\r\n// ----------------------------------------------------------------------\r\n\r\n/**\r\n * 检查当前是否为 Preview 模式\r\n * @returns {boolean}\r\n */\r\nexport function isPreviewMode() {\r\n return checkPreviewMode();\r\n}\r\n\r\n/**\r\n * @typedef {Object} MainStore\r\n * @property {Object} config\r\n * @property {function(string, *): *} config.get\r\n * @property {function(string, *): void} config.set\r\n * @property {Object} [logger]\r\n */\r\n\r\n/**\r\n * 获取主程序 Store\r\n * @description 仅在 **主进程 (Main Process)** 环境可用\r\n * @returns {MainStore|null} 若在非主进程环境调用,返回 null\r\n */\r\nexport function getMainStore() {\r\n if (typeof global !== 'undefined' && global.mainStore) {\r\n return global.mainStore;\r\n }\r\n return null;\r\n}\r\n\r\n/**\r\n * 使用插件配置代理\r\n * @description 获取针对特定插件的配置读写对象\r\n * @param {string} pluginId 插件 ID (通常与 package.json 中的 name 一致)\r\n * @returns {{ get: function(string, *): *, set: function(string, *): void }}\r\n */\r\nexport function usePluginConfig(pluginId) {\r\n const store = getMainStore();\r\n return {\r\n get(key, defaultValue) {\r\n return store?.config?.get(`plugin.${pluginId}.settings.${key}`, defaultValue);\r\n },\r\n set(key, value) {\r\n store?.config?.set(`plugin.${pluginId}.settings.${key}`, value);\r\n },\r\n };\r\n}\r\n\r\n/**\r\n * 获取插件间通信工具\r\n * @description 仅在 **主进程 (Main Process)** 环境可用\r\n * @returns {import('./index.d').PluginInterop|null}\r\n */\r\nexport function usePluginInterop() {\r\n if (typeof global !== 'undefined' && global.pluginInterop) {\r\n return global.pluginInterop;\r\n }\r\n return null;\r\n}\r\n\r\n// ----------------------------------------------------------------------\r\n// UI & Renderer APIs (Renderer Process Only)\r\n// ----------------------------------------------------------------------\r\n\r\n/**\r\n * 获取 IPC 通信工具\r\n * @description 仅在 **渲染进程 (Renderer Process)** 环境可用\r\n * @returns {Object|null} 包含 invoke, send, on 等方法的对象\r\n */\r\nexport function useIpc() {\r\n if (typeof window !== 'undefined' && window.electron?.useIpc) {\r\n return window.electron.useIpc();\r\n }\r\n return null;\r\n}\r\n\r\n/**\r\n * 获取 Vuetify 实例\r\n * @description 仅在 **渲染进程** 环境可用,用于访问 Vuetify 的全局配置\r\n * @returns {Object} Vuetify 实例对象\r\n */\r\nexport function useVuetify() {\r\n if (typeof window !== 'undefined' && window.vuetify$) {\r\n return window.vuetify$;\r\n }\r\n return {};\r\n}\r\n\r\n/**\r\n * 获取全局注册的 Vuetify 组件\r\n * @returns {Record<string, any>}\r\n */\r\nexport function useVuetifyComponents() {\r\n return useVuetify().components || {};\r\n}\r\n\r\n/**\r\n * 获取全局注册的 Vuetify 指令\r\n * @returns {Record<string, any>}\r\n */\r\nexport function useVuetifyDirectives() {\r\n return useVuetify().directives || {};\r\n}\r\n\r\n/**\r\n * 获取 Dialog API\r\n * @description 类似于 Electron 的 dialog 模块 (showOpenDialog, showSaveDialog 等)\r\n * @returns {Object|null}\r\n */\r\nexport function useDialog() {\r\n if (typeof window !== 'undefined' && window.electron?.dialog) {\r\n return window.electron.dialog;\r\n }\r\n return null;\r\n}\r\n\r\n/**\r\n * 获取 Shell API\r\n * @description 类似于 Electron 的 shell 模块 (openExternal, showItemInFolder 等)\r\n * @returns {Object|null}\r\n */\r\nexport function useShell() {\r\n if (typeof window !== 'undefined' && window.electron?.shell) {\r\n return window.electron.shell;\r\n }\r\n return null;\r\n}\r\n\r\n/**\r\n * 获取插件自身设置 (IPC 封装)\r\n * @description 仅在 **渲染进程** 环境可用。这是 `plugin.settings` 的前端读取接口。\r\n * @param {...any} args\r\n * @returns {Promise<any>}\r\n */\r\nexport async function getPluginSetting(...args) {\r\n if (typeof window !== 'undefined' && window.ts?.getPluginSetting) {\r\n return window.ts.getPluginSetting(...args);\r\n }\r\n return null;\r\n}\r\n\r\n/**\r\n * 更新插件自身设置 (IPC 封装)\r\n * @description 仅在 **渲染进程** 环境可用。\r\n * @param {...any} args\r\n * @returns {Promise<any>}\r\n */\r\nexport async function setPluginSetting(...args) {\r\n if (typeof window !== 'undefined' && window.ts?.setPluginSetting) {\r\n return window.ts.setPluginSetting(...args);\r\n }\r\n return null;\r\n}\r\n\r\n/**\r\n * 执行宿主注册的插件命令\r\n * @param {...any} args\r\n * @returns {Promise<any>}\r\n */\r\nexport async function executePluginCommand(...args) {\r\n if (typeof window !== 'undefined' && window.ts?.executePluginCommand) {\r\n return window.ts.executePluginCommand(...args);\r\n }\r\n return null;\r\n}\r\n\r\n/**\r\n * 获取窗口控制工具\r\n * @description 包含 minimize, maximize, close 等窗口操作\r\n * @returns {Object|null}\r\n */\r\nexport function useWindowControl() {\r\n if (typeof window !== 'undefined' && window.ts?.windowControl) {\r\n return window.ts.windowControl;\r\n }\r\n return null;\r\n}\r\n\r\n// ----------------------------------------------------------------------\r\n// Utilities (Shared)\r\n// ----------------------------------------------------------------------\r\n\r\n/**\r\n * 获取剪贴板工具\r\n * @returns {Object|null}\r\n */\r\nexport function useClipboard() {\r\n if (typeof window !== 'undefined') {\r\n return {\r\n async readText() {\r\n if (window.electron?.useIpc) {\r\n return window.electron.useIpc().invoke(CLIPBOARD_IPC.readText);\r\n }\r\n if (navigator.clipboard?.readText) {\r\n return navigator.clipboard.readText();\r\n }\r\n return null;\r\n },\r\n async writeText(text) {\r\n if (window.electron?.useIpc) {\r\n return window.electron.useIpc().invoke(CLIPBOARD_IPC.writeText, text);\r\n }\r\n if (navigator.clipboard?.writeText) {\r\n return navigator.clipboard.writeText(text);\r\n }\r\n return null;\r\n },\r\n };\r\n }\r\n return null;\r\n}\r\n\r\n/**\r\n * 在默认浏览器中打开链接\r\n * @param {string} url 要打开的链接\r\n * @returns {Promise<void>}\r\n */\r\nexport async function openLink(...args) {\r\n if (typeof window !== 'undefined' && window.electron?.openLink) {\r\n return window.electron.openLink(...args);\r\n }\r\n return null;\r\n}\r\n\r\n/**\r\n * 获取日志工具\r\n * @description 自动适配 Node.js 环境 (Main) 或浏览器环境 (Renderer)\r\n * @returns {Record<'log'|'info'|'warn'|'error'|'debug', Function>} Console-like logger\r\n */\r\nexport function useLogger() {\r\n if (typeof global !== 'undefined' && global.mainStore) {\r\n return global.mainStore?.logger || console;\r\n }\r\n if (typeof window !== 'undefined') {\r\n return window.ts?.logger || console;\r\n }\r\n return console;\r\n}\r\n\r\nexport { electronNetAdapter };\r\n"],"mappings":"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"}
|