@react-devtools-plus/core 0.2.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/client/index.ts","../src/events.ts","../src/plugin/manager.ts","../../../node_modules/.pnpm/birpc@0.2.19/node_modules/birpc/dist/index.mjs","../src/rpc/channel.ts","../src/rpc/index.ts"],"sourcesContent":["/**\n * Client connection management for React DevTools\n * React DevTools 客户端连接管理\n */\n\nimport { isBrowser, target } from '@react-devtools-plus/shared'\n\n/**\n * Set DevTools client URL\n * 设置 DevTools 客户端 URL\n */\nexport function setDevToolsClientUrl(url: string): void {\n target.__REACT_DEVTOOLS_CLIENT_URL__ = url\n}\n\n/**\n * Get DevTools client URL\n * 获取 DevTools 客户端 URL\n */\nexport function getDevToolsClientUrl(): string {\n return target.__REACT_DEVTOOLS_CLIENT_URL__ ?? (() => {\n if (isBrowser) {\n const devtoolsMeta = document.querySelector('meta[name=__REACT_DEVTOOLS_CLIENT_URL__]')\n if (devtoolsMeta)\n return devtoolsMeta.getAttribute('content') || ''\n }\n return ''\n })()\n}\n\n/**\n * Check if DevTools is enabled\n * 检查 DevTools 是否启用\n */\nexport function isDevToolsEnabled(): boolean {\n return target.__REACT_DEVTOOLS_ENABLED__ === true\n}\n\n/**\n * Set DevTools enabled state\n * 设置 DevTools 启用状态\n */\nexport function setDevToolsEnabled(enabled: boolean): void {\n target.__REACT_DEVTOOLS_ENABLED__ = enabled\n}\n\n/**\n * Get DevTools broadcast channel name\n * 获取 DevTools 广播通道名称\n */\nexport function getDevToolsChannelName(): string {\n return target.__REACT_DEVTOOLS_BROADCAST_CHANNEL__ || 'react-devtools-plus'\n}\n\n/**\n * Set DevTools broadcast channel name\n * 设置 DevTools 广播通道名称\n */\nexport function setDevToolsChannelName(channelName: string): void {\n target.__REACT_DEVTOOLS_BROADCAST_CHANNEL__ = channelName\n}\n\n/**\n * Client connection manager\n * 客户端连接管理器\n */\nexport class ClientConnectionManager {\n private connections: Map<string, any>\n private reconnectAttempts: Map<string, number>\n private reconnectTimers: Map<string, NodeJS.Timeout>\n private maxReconnectAttempts: number\n private reconnectDelay: number\n\n constructor(options: {\n maxReconnectAttempts?: number\n reconnectDelay?: number\n } = {}) {\n this.connections = new Map()\n this.reconnectAttempts = new Map()\n this.reconnectTimers = new Map()\n this.maxReconnectAttempts = options.maxReconnectAttempts || 5\n this.reconnectDelay = options.reconnectDelay || 1000\n }\n\n /**\n * Register a connection\n * 注册连接\n */\n register(id: string, connection: any): void {\n this.connections.set(id, connection)\n this.reconnectAttempts.set(id, 0)\n }\n\n /**\n * Unregister a connection\n * 注销连接\n */\n unregister(id: string): void {\n const timer = this.reconnectTimers.get(id)\n if (timer) {\n clearTimeout(timer)\n this.reconnectTimers.delete(id)\n }\n\n this.connections.delete(id)\n this.reconnectAttempts.delete(id)\n }\n\n /**\n * Get a connection\n * 获取连接\n */\n get(id: string): any {\n return this.connections.get(id)\n }\n\n /**\n * Get all connections\n * 获取所有连接\n */\n getAll(): Map<string, any> {\n return new Map(this.connections)\n }\n\n /**\n * Check if a connection exists\n * 检查连接是否存在\n */\n has(id: string): boolean {\n return this.connections.has(id)\n }\n\n /**\n * Handle connection error and attempt reconnect\n * 处理连接错误并尝试重连\n */\n handleError(id: string, error: Error, reconnectFn?: () => Promise<void>): void {\n console.error(`[React DevTools] Connection error for ${id}:`, error)\n\n if (!reconnectFn)\n return\n\n const attempts = this.reconnectAttempts.get(id) || 0\n\n if (attempts >= this.maxReconnectAttempts) {\n console.error(`[React DevTools] Max reconnect attempts reached for ${id}`)\n return\n }\n\n const delay = this.reconnectDelay * 2 ** attempts // Exponential backoff\n\n const timer = setTimeout(async () => {\n try {\n await reconnectFn()\n this.reconnectAttempts.set(id, 0) // Reset on successful reconnect\n }\n catch (err) {\n this.reconnectAttempts.set(id, attempts + 1)\n this.handleError(id, err as Error, reconnectFn)\n }\n }, delay)\n\n this.reconnectTimers.set(id, timer)\n }\n\n /**\n * Close all connections\n * 关闭所有连接\n */\n closeAll(): void {\n this.connections.forEach((connection) => {\n if (connection.$close) {\n connection.$close()\n }\n })\n\n this.reconnectTimers.forEach((timer) => {\n clearTimeout(timer)\n })\n\n this.connections.clear()\n this.reconnectAttempts.clear()\n this.reconnectTimers.clear()\n }\n}\n\n/**\n * Global client connection manager instance\n * 全局客户端连接管理器实例\n */\nexport const globalConnectionManager = new ClientConnectionManager()\n","/**\n * Event bus for React DevTools\n * React DevTools 事件总线\n */\n\nimport type { DevToolsEvent } from './types'\n\ntype EventHandler<T = DevToolsEvent> = (event: T) => void\ntype Unsubscribe = () => void\n\n/**\n * Event bus class\n * 事件总线类\n */\nexport class EventBus {\n private handlers: Map<string, Set<EventHandler>>\n\n constructor() {\n this.handlers = new Map()\n }\n\n /**\n * Subscribe to an event\n * 订阅事件\n */\n on<T extends DevToolsEvent['type']>(\n type: T,\n handler: EventHandler<Extract<DevToolsEvent, { type: T }>>,\n ): Unsubscribe {\n if (!this.handlers.has(type)) {\n this.handlers.set(type, new Set())\n }\n\n const handlers = this.handlers.get(type)!\n handlers.add(handler as EventHandler)\n\n // Return unsubscribe function\n return () => {\n handlers.delete(handler as EventHandler)\n if (handlers.size === 0) {\n this.handlers.delete(type)\n }\n }\n }\n\n /**\n * Subscribe to an event once\n * 订阅一次性事件\n */\n once<T extends DevToolsEvent['type']>(\n type: T,\n handler: EventHandler<Extract<DevToolsEvent, { type: T }>>,\n ): Unsubscribe {\n let unsubscribe: Unsubscribe\n\n const wrappedHandler = (event: DevToolsEvent) => {\n handler(event as Extract<DevToolsEvent, { type: T }>)\n unsubscribe()\n }\n\n unsubscribe = this.on(type, wrappedHandler as any)\n return unsubscribe\n }\n\n /**\n * Emit an event\n * 发送事件\n */\n emit(event: DevToolsEvent): void {\n const handlers = this.handlers.get(event.type)\n if (!handlers)\n return\n\n handlers.forEach((handler) => {\n try {\n handler(event)\n }\n catch (error) {\n console.error(`[React DevTools] Error in event handler for \"${event.type}\":`, error)\n }\n })\n }\n\n /**\n * Remove all event handlers\n * 移除所有事件处理器\n */\n clear(): void {\n this.handlers.clear()\n }\n\n /**\n * Remove all handlers for a specific event type\n * 移除特定事件类型的所有处理器\n */\n clearType(type: DevToolsEvent['type']): void {\n this.handlers.delete(type)\n }\n\n /**\n * Get number of handlers for an event type\n * 获取事件类型的处理器数量\n */\n getHandlerCount(type: DevToolsEvent['type']): number {\n return this.handlers.get(type)?.size || 0\n }\n\n /**\n * Check if there are any handlers for an event type\n * 检查是否有事件类型的处理器\n */\n hasHandlers(type: DevToolsEvent['type']): boolean {\n return this.getHandlerCount(type) > 0\n }\n}\n\n/**\n * Global event bus instance\n * 全局事件总线实例\n */\nexport const globalEventBus = new EventBus()\n","/**\n * Plugin manager for React DevTools\n * React DevTools 插件管理器\n */\n\nimport type { ComponentNode, DevToolsEvent, DevToolsPlugin, PluginContext } from '../types'\nimport { EventBus } from '../events'\n\n/**\n * Plugin manager class\n * 插件管理器类\n */\nexport class PluginManager {\n private plugins: Map<string, DevToolsPlugin>\n private contexts: Map<string, PluginContext>\n private eventBus: EventBus\n private rpcFunctions: Map<string, (...args: any[]) => any>\n private componentTreeGetter?: () => Promise<ComponentNode[]>\n private componentDetailsGetter?: (id: string) => Promise<ComponentNode | null>\n\n constructor() {\n this.plugins = new Map()\n this.contexts = new Map()\n this.eventBus = new EventBus()\n this.rpcFunctions = new Map()\n }\n\n /**\n * Register a plugin\n * 注册插件\n */\n async register(plugin: DevToolsPlugin): Promise<void> {\n if (this.plugins.has(plugin.id)) {\n throw new Error(`[React DevTools] Plugin \"${plugin.id}\" is already registered`)\n }\n\n // Create plugin context\n const context = this.createContext(plugin.id)\n this.contexts.set(plugin.id, context)\n\n // Register plugin\n this.plugins.set(plugin.id, plugin)\n\n // Register plugin RPC functions\n if (plugin.rpc) {\n Object.entries(plugin.rpc).forEach(([name, fn]) => {\n const fullName = `${plugin.id}.${name}`\n this.rpcFunctions.set(fullName, fn)\n })\n }\n\n // Register plugin event handlers\n if (plugin.on) {\n Object.entries(plugin.on).forEach(([type, handler]) => {\n if (handler) {\n this.eventBus.on(type as DevToolsEvent['type'], handler as any)\n }\n })\n }\n\n // Call plugin setup\n if (plugin.setup) {\n try {\n await plugin.setup(context)\n console.log(`[React DevTools] Plugin \"${plugin.name}\" registered successfully`)\n }\n catch (error) {\n console.error(`[React DevTools] Failed to setup plugin \"${plugin.name}\":`, error)\n // Rollback registration\n this.plugins.delete(plugin.id)\n this.contexts.delete(plugin.id)\n throw error\n }\n }\n }\n\n /**\n * Unregister a plugin\n * 注销插件\n */\n async unregister(pluginId: string): Promise<void> {\n const plugin = this.plugins.get(pluginId)\n if (!plugin) {\n console.warn(`[React DevTools] Plugin \"${pluginId}\" is not registered`)\n return\n }\n\n // Call plugin teardown\n if (plugin.teardown) {\n try {\n await plugin.teardown()\n }\n catch (error) {\n console.error(`[React DevTools] Error during plugin teardown for \"${plugin.name}\":`, error)\n }\n }\n\n // Remove plugin RPC functions\n if (plugin.rpc) {\n Object.keys(plugin.rpc).forEach((name) => {\n const fullName = `${pluginId}.${name}`\n this.rpcFunctions.delete(fullName)\n })\n }\n\n // Remove plugin\n this.plugins.delete(pluginId)\n this.contexts.delete(pluginId)\n\n console.log(`[React DevTools] Plugin \"${plugin.name}\" unregistered`)\n }\n\n /**\n * Get a plugin by ID\n * 根据 ID 获取插件\n */\n get(pluginId: string): DevToolsPlugin | undefined {\n return this.plugins.get(pluginId)\n }\n\n /**\n * Get all plugins\n * 获取所有插件\n */\n getAll(): DevToolsPlugin[] {\n return Array.from(this.plugins.values())\n }\n\n /**\n * Check if a plugin is registered\n * 检查插件是否已注册\n */\n has(pluginId: string): boolean {\n return this.plugins.has(pluginId)\n }\n\n /**\n * Get plugin context\n * 获取插件上下文\n */\n getContext(pluginId: string): PluginContext | undefined {\n return this.contexts.get(pluginId)\n }\n\n /**\n * Set component tree getter\n * 设置组件树获取器\n */\n setComponentTreeGetter(getter: () => Promise<ComponentNode[]>): void {\n this.componentTreeGetter = getter\n }\n\n /**\n * Set component details getter\n * 设置组件详情获取器\n */\n setComponentDetailsGetter(getter: (id: string) => Promise<ComponentNode | null>): void {\n this.componentDetailsGetter = getter\n }\n\n /**\n * Call plugin RPC function\n * 调用插件 RPC 函数\n */\n async callRPC<T = any>(name: string, ...args: any[]): Promise<T> {\n const fn = this.rpcFunctions.get(name)\n if (!fn) {\n throw new Error(`[React DevTools] RPC function \"${name}\" not found`)\n }\n\n try {\n return await fn(...args)\n }\n catch (error) {\n console.error(`[React DevTools] Error calling RPC function \"${name}\":`, error)\n throw error\n }\n }\n\n /**\n * Emit event to all plugins\n * 向所有插件发送事件\n */\n emit(event: DevToolsEvent): void {\n this.eventBus.emit(event)\n }\n\n /**\n * Subscribe to events\n * 订阅事件\n */\n on<T extends DevToolsEvent['type']>(\n type: T,\n handler: (event: Extract<DevToolsEvent, { type: T }>) => void,\n ): () => void {\n return this.eventBus.on(type, handler)\n }\n\n /**\n * Cleanup all plugins\n * 清理所有插件\n */\n async cleanup(): Promise<void> {\n const pluginIds = Array.from(this.plugins.keys())\n\n for (const pluginId of pluginIds) {\n await this.unregister(pluginId)\n }\n\n this.eventBus.clear()\n this.rpcFunctions.clear()\n }\n\n /**\n * Create plugin context\n * 创建插件上下文\n */\n private createContext(pluginId: string): PluginContext {\n return {\n getComponentTree: async () => {\n if (!this.componentTreeGetter) {\n throw new Error('[React DevTools] Component tree getter not set')\n }\n return this.componentTreeGetter()\n },\n\n getComponentDetails: async (componentId: string) => {\n if (!this.componentDetailsGetter) {\n throw new Error('[React DevTools] Component details getter not set')\n }\n return this.componentDetailsGetter(componentId)\n },\n\n emit: (event: DevToolsEvent) => {\n this.eventBus.emit(event)\n },\n\n on: <T extends DevToolsEvent['type']>(\n type: T,\n handler: (event: Extract<DevToolsEvent, { type: T }>) => void,\n ) => {\n return this.eventBus.on(type, handler)\n },\n\n registerRPC: <T extends (...args: any[]) => any>(name: string, fn: T) => {\n const fullName = `${pluginId}.${name}`\n this.rpcFunctions.set(fullName, fn)\n },\n\n callRPC: async <T = any>(name: string, ...args: any[]) => {\n return this.callRPC<T>(name, ...args)\n },\n }\n }\n}\n\n/**\n * Global plugin manager instance\n * 全局插件管理器实例\n */\nexport const globalPluginManager = new PluginManager()\n","const DEFAULT_TIMEOUT = 6e4;\nfunction defaultSerialize(i) {\n return i;\n}\nconst defaultDeserialize = defaultSerialize;\nconst { clearTimeout, setTimeout } = globalThis;\nconst random = Math.random.bind(Math);\nfunction createBirpc(functions, options) {\n const {\n post,\n on,\n off = () => {\n },\n eventNames = [],\n serialize = defaultSerialize,\n deserialize = defaultDeserialize,\n resolver,\n bind = \"rpc\",\n timeout = DEFAULT_TIMEOUT\n } = options;\n const rpcPromiseMap = /* @__PURE__ */ new Map();\n let _promise;\n let closed = false;\n const rpc = new Proxy({}, {\n get(_, method) {\n if (method === \"$functions\")\n return functions;\n if (method === \"$close\")\n return close;\n if (method === \"then\" && !eventNames.includes(\"then\") && !(\"then\" in functions))\n return void 0;\n const sendEvent = (...args) => {\n post(serialize({ m: method, a: args, t: \"q\" }));\n };\n if (eventNames.includes(method)) {\n sendEvent.asEvent = sendEvent;\n return sendEvent;\n }\n const sendCall = async (...args) => {\n if (closed)\n throw new Error(`[birpc] rpc is closed, cannot call \"${method}\"`);\n if (_promise) {\n try {\n await _promise;\n } finally {\n _promise = void 0;\n }\n }\n return new Promise((resolve, reject) => {\n const id = nanoid();\n let timeoutId;\n if (timeout >= 0) {\n timeoutId = setTimeout(() => {\n try {\n options.onTimeoutError?.(method, args);\n throw new Error(`[birpc] timeout on calling \"${method}\"`);\n } catch (e) {\n reject(e);\n }\n rpcPromiseMap.delete(id);\n }, timeout);\n if (typeof timeoutId === \"object\")\n timeoutId = timeoutId.unref?.();\n }\n rpcPromiseMap.set(id, { resolve, reject, timeoutId, method });\n post(serialize({ m: method, a: args, i: id, t: \"q\" }));\n });\n };\n sendCall.asEvent = sendEvent;\n return sendCall;\n }\n });\n function close() {\n closed = true;\n rpcPromiseMap.forEach(({ reject, method }) => {\n reject(new Error(`[birpc] rpc is closed, cannot call \"${method}\"`));\n });\n rpcPromiseMap.clear();\n off(onMessage);\n }\n async function onMessage(data, ...extra) {\n const msg = deserialize(data);\n if (msg.t === \"q\") {\n const { m: method, a: args } = msg;\n let result, error;\n const fn = resolver ? resolver(method, functions[method]) : functions[method];\n if (!fn) {\n error = new Error(`[birpc] function \"${method}\" not found`);\n } else {\n try {\n result = await fn.apply(bind === \"rpc\" ? rpc : functions, args);\n } catch (e) {\n error = e;\n }\n }\n if (msg.i) {\n if (error && options.onError)\n options.onError(error, method, args);\n post(serialize({ t: \"s\", i: msg.i, r: result, e: error }), ...extra);\n }\n } else {\n const { i: ack, r: result, e: error } = msg;\n const promise = rpcPromiseMap.get(ack);\n if (promise) {\n clearTimeout(promise.timeoutId);\n if (error)\n promise.reject(error);\n else\n promise.resolve(result);\n }\n rpcPromiseMap.delete(ack);\n }\n }\n _promise = on(onMessage);\n return rpc;\n}\nconst cacheMap = /* @__PURE__ */ new WeakMap();\nfunction cachedMap(items, fn) {\n return items.map((i) => {\n let r = cacheMap.get(i);\n if (!r) {\n r = fn(i);\n cacheMap.set(i, r);\n }\n return r;\n });\n}\nfunction createBirpcGroup(functions, channels, options = {}) {\n const getChannels = () => typeof channels === \"function\" ? channels() : channels;\n const getClients = (channels2 = getChannels()) => cachedMap(channels2, (s) => createBirpc(functions, { ...options, ...s }));\n const broadcastProxy = new Proxy({}, {\n get(_, method) {\n const client = getClients();\n const callbacks = client.map((c) => c[method]);\n const sendCall = (...args) => {\n return Promise.all(callbacks.map((i) => i(...args)));\n };\n sendCall.asEvent = (...args) => {\n callbacks.map((i) => i.asEvent(...args));\n };\n return sendCall;\n }\n });\n function updateChannels(fn) {\n const channels2 = getChannels();\n fn?.(channels2);\n return getClients(channels2);\n }\n getClients();\n return {\n get clients() {\n return getClients();\n },\n functions,\n updateChannels,\n broadcast: broadcastProxy,\n /**\n * @deprecated use `broadcast`\n */\n // @ts-expect-error deprecated\n boardcast: broadcastProxy\n };\n}\nconst urlAlphabet = \"useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict\";\nfunction nanoid(size = 21) {\n let id = \"\";\n let i = size;\n while (i--)\n id += urlAlphabet[random() * 64 | 0];\n return id;\n}\n\nexport { DEFAULT_TIMEOUT, cachedMap, createBirpc, createBirpcGroup };\n","/**\n * RPC channels for different communication methods\n * 不同通信方式的 RPC 通道\n */\n\nimport type { RPCChannel } from './types'\n\n/**\n * Create a BroadcastChannel-based RPC channel\n * 创建基于 BroadcastChannel 的 RPC 通道\n */\nexport function createBroadcastChannel(channelName: string): RPCChannel {\n const channel = new BroadcastChannel(channelName)\n const handlers = new Set<(message: any) => void>()\n\n channel.addEventListener('message', (event) => {\n handlers.forEach(handler => handler(event.data))\n })\n\n return {\n send: (message: any) => {\n channel.postMessage(message)\n },\n onMessage: (handler: (message: any) => void) => {\n handlers.add(handler)\n return () => handlers.delete(handler)\n },\n close: () => {\n channel.close()\n handlers.clear()\n },\n }\n}\n\n/**\n * Create a PostMessage-based RPC channel (for iframe communication)\n * 创建基于 PostMessage 的 RPC 通道(用于 iframe 通信)\n */\nexport function createPostMessageChannel(\n target: Window,\n origin: string = '*',\n): RPCChannel {\n const handlers = new Set<(message: any) => void>()\n\n const messageHandler = (event: MessageEvent) => {\n if (origin !== '*' && event.origin !== origin)\n return\n\n handlers.forEach(handler => handler(event.data))\n }\n\n window.addEventListener('message', messageHandler)\n\n return {\n send: (message: any) => {\n target.postMessage(message, origin)\n },\n onMessage: (handler: (message: any) => void) => {\n handlers.add(handler)\n return () => handlers.delete(handler)\n },\n close: () => {\n window.removeEventListener('message', messageHandler)\n handlers.clear()\n },\n }\n}\n\n/**\n * Create a WebSocket-based RPC channel\n * 创建基于 WebSocket 的 RPC 通道\n */\nexport function createWebSocketChannel(url: string): RPCChannel {\n const ws = new WebSocket(url)\n const handlers = new Set<(message: any) => void>()\n\n ws.addEventListener('message', (event) => {\n try {\n const data = JSON.parse(event.data)\n handlers.forEach(handler => handler(data))\n }\n catch (error) {\n console.error('[RPC] Failed to parse WebSocket message:', error)\n }\n })\n\n return {\n send: (message: any) => {\n if (ws.readyState === WebSocket.OPEN) {\n ws.send(JSON.stringify(message))\n }\n },\n onMessage: (handler: (message: any) => void) => {\n handlers.add(handler)\n return () => handlers.delete(handler)\n },\n close: () => {\n ws.close()\n handlers.clear()\n },\n }\n}\n\n/**\n * Create a custom event-based RPC channel (for in-page communication)\n * 创建基于自定义事件的 RPC 通道(用于页面内通信)\n */\nexport function createCustomEventChannel(eventName: string): RPCChannel {\n const handlers = new Set<(message: any) => void>()\n\n const eventHandler = (event: CustomEvent) => {\n handlers.forEach(handler => handler(event.detail))\n }\n\n window.addEventListener(eventName, eventHandler as EventListener)\n\n return {\n send: (message: any) => {\n window.dispatchEvent(new CustomEvent(eventName, { detail: message }))\n },\n onMessage: (handler: (message: any) => void) => {\n handlers.add(handler)\n return () => handlers.delete(handler)\n },\n close: () => {\n window.removeEventListener(eventName, eventHandler as EventListener)\n handlers.clear()\n },\n }\n}\n","/**\n * RPC system for React DevTools\n * React DevTools RPC 系统\n */\n\nimport type { ClientFunctions, ServerFunctions } from '../types'\nimport type { ClientRPC, RPCChannel, RPCOptions, ServerRPC } from './types'\nimport { createBirpc } from 'birpc'\n\n/**\n * Create client RPC instance\n * 创建客户端 RPC 实例\n */\nexport function createClientRPC(\n functions: ClientFunctions,\n channel: RPCChannel,\n options: RPCOptions = {},\n): ClientRPC {\n const { timeout = 30000 } = options\n\n const rpc = createBirpc<ServerFunctions, ClientFunctions>(functions, {\n post: (data) => {\n channel.send(data)\n },\n on: (fn) => {\n return channel.onMessage(fn)\n },\n timeout,\n })\n\n return Object.assign(rpc, functions, {\n $functions: functions,\n $channel: channel,\n $state: {\n state: 'connected' as const,\n connectedAt: Date.now(),\n },\n $close: () => {\n channel.close?.()\n },\n }) as unknown as ClientRPC\n}\n\n/**\n * Create server RPC instance\n * 创建服务端 RPC 实例\n */\nexport function createServerRPC(\n functions: ServerFunctions,\n channel: RPCChannel,\n options: RPCOptions = {},\n): ServerRPC {\n const { timeout = 30000 } = options\n\n const rpc = createBirpc<ClientFunctions, ServerFunctions>(functions, {\n post: (data) => {\n channel.send(data)\n },\n on: (fn) => {\n return channel.onMessage(fn)\n },\n timeout,\n })\n\n return Object.assign(rpc, functions, {\n $functions: functions,\n $channel: channel,\n $state: {\n state: 'connected' as const,\n connectedAt: Date.now(),\n },\n $close: () => {\n channel.close?.()\n },\n }) as unknown as ServerRPC\n}\n\n// Export channel creators\nexport * from './channel'\nexport * from './types'\n"],"mappings":"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","names":["clearTimeout","setTimeout","_a","target"]}
@@ -0,0 +1,306 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/plugin/index.ts
21
+ var plugin_exports = {};
22
+ __export(plugin_exports, {
23
+ PluginManager: () => PluginManager,
24
+ globalPluginManager: () => globalPluginManager
25
+ });
26
+ module.exports = __toCommonJS(plugin_exports);
27
+
28
+ // src/events.ts
29
+ var EventBus = class {
30
+ constructor() {
31
+ this.handlers = /* @__PURE__ */ new Map();
32
+ }
33
+ /**
34
+ * Subscribe to an event
35
+ * 订阅事件
36
+ */
37
+ on(type, handler) {
38
+ if (!this.handlers.has(type)) {
39
+ this.handlers.set(type, /* @__PURE__ */ new Set());
40
+ }
41
+ const handlers = this.handlers.get(type);
42
+ handlers.add(handler);
43
+ return () => {
44
+ handlers.delete(handler);
45
+ if (handlers.size === 0) {
46
+ this.handlers.delete(type);
47
+ }
48
+ };
49
+ }
50
+ /**
51
+ * Subscribe to an event once
52
+ * 订阅一次性事件
53
+ */
54
+ once(type, handler) {
55
+ let unsubscribe;
56
+ const wrappedHandler = (event) => {
57
+ handler(event);
58
+ unsubscribe();
59
+ };
60
+ unsubscribe = this.on(type, wrappedHandler);
61
+ return unsubscribe;
62
+ }
63
+ /**
64
+ * Emit an event
65
+ * 发送事件
66
+ */
67
+ emit(event) {
68
+ const handlers = this.handlers.get(event.type);
69
+ if (!handlers)
70
+ return;
71
+ handlers.forEach((handler) => {
72
+ try {
73
+ handler(event);
74
+ } catch (error) {
75
+ console.error(`[React DevTools] Error in event handler for "${event.type}":`, error);
76
+ }
77
+ });
78
+ }
79
+ /**
80
+ * Remove all event handlers
81
+ * 移除所有事件处理器
82
+ */
83
+ clear() {
84
+ this.handlers.clear();
85
+ }
86
+ /**
87
+ * Remove all handlers for a specific event type
88
+ * 移除特定事件类型的所有处理器
89
+ */
90
+ clearType(type) {
91
+ this.handlers.delete(type);
92
+ }
93
+ /**
94
+ * Get number of handlers for an event type
95
+ * 获取事件类型的处理器数量
96
+ */
97
+ getHandlerCount(type) {
98
+ var _a;
99
+ return ((_a = this.handlers.get(type)) == null ? void 0 : _a.size) || 0;
100
+ }
101
+ /**
102
+ * Check if there are any handlers for an event type
103
+ * 检查是否有事件类型的处理器
104
+ */
105
+ hasHandlers(type) {
106
+ return this.getHandlerCount(type) > 0;
107
+ }
108
+ };
109
+ var globalEventBus = new EventBus();
110
+
111
+ // src/plugin/manager.ts
112
+ var PluginManager = class {
113
+ constructor() {
114
+ this.plugins = /* @__PURE__ */ new Map();
115
+ this.contexts = /* @__PURE__ */ new Map();
116
+ this.eventBus = new EventBus();
117
+ this.rpcFunctions = /* @__PURE__ */ new Map();
118
+ }
119
+ /**
120
+ * Register a plugin
121
+ * 注册插件
122
+ */
123
+ async register(plugin) {
124
+ if (this.plugins.has(plugin.id)) {
125
+ throw new Error(`[React DevTools] Plugin "${plugin.id}" is already registered`);
126
+ }
127
+ const context = this.createContext(plugin.id);
128
+ this.contexts.set(plugin.id, context);
129
+ this.plugins.set(plugin.id, plugin);
130
+ if (plugin.rpc) {
131
+ Object.entries(plugin.rpc).forEach(([name, fn]) => {
132
+ const fullName = `${plugin.id}.${name}`;
133
+ this.rpcFunctions.set(fullName, fn);
134
+ });
135
+ }
136
+ if (plugin.on) {
137
+ Object.entries(plugin.on).forEach(([type, handler]) => {
138
+ if (handler) {
139
+ this.eventBus.on(type, handler);
140
+ }
141
+ });
142
+ }
143
+ if (plugin.setup) {
144
+ try {
145
+ await plugin.setup(context);
146
+ console.log(`[React DevTools] Plugin "${plugin.name}" registered successfully`);
147
+ } catch (error) {
148
+ console.error(`[React DevTools] Failed to setup plugin "${plugin.name}":`, error);
149
+ this.plugins.delete(plugin.id);
150
+ this.contexts.delete(plugin.id);
151
+ throw error;
152
+ }
153
+ }
154
+ }
155
+ /**
156
+ * Unregister a plugin
157
+ * 注销插件
158
+ */
159
+ async unregister(pluginId) {
160
+ const plugin = this.plugins.get(pluginId);
161
+ if (!plugin) {
162
+ console.warn(`[React DevTools] Plugin "${pluginId}" is not registered`);
163
+ return;
164
+ }
165
+ if (plugin.teardown) {
166
+ try {
167
+ await plugin.teardown();
168
+ } catch (error) {
169
+ console.error(`[React DevTools] Error during plugin teardown for "${plugin.name}":`, error);
170
+ }
171
+ }
172
+ if (plugin.rpc) {
173
+ Object.keys(plugin.rpc).forEach((name) => {
174
+ const fullName = `${pluginId}.${name}`;
175
+ this.rpcFunctions.delete(fullName);
176
+ });
177
+ }
178
+ this.plugins.delete(pluginId);
179
+ this.contexts.delete(pluginId);
180
+ console.log(`[React DevTools] Plugin "${plugin.name}" unregistered`);
181
+ }
182
+ /**
183
+ * Get a plugin by ID
184
+ * 根据 ID 获取插件
185
+ */
186
+ get(pluginId) {
187
+ return this.plugins.get(pluginId);
188
+ }
189
+ /**
190
+ * Get all plugins
191
+ * 获取所有插件
192
+ */
193
+ getAll() {
194
+ return Array.from(this.plugins.values());
195
+ }
196
+ /**
197
+ * Check if a plugin is registered
198
+ * 检查插件是否已注册
199
+ */
200
+ has(pluginId) {
201
+ return this.plugins.has(pluginId);
202
+ }
203
+ /**
204
+ * Get plugin context
205
+ * 获取插件上下文
206
+ */
207
+ getContext(pluginId) {
208
+ return this.contexts.get(pluginId);
209
+ }
210
+ /**
211
+ * Set component tree getter
212
+ * 设置组件树获取器
213
+ */
214
+ setComponentTreeGetter(getter) {
215
+ this.componentTreeGetter = getter;
216
+ }
217
+ /**
218
+ * Set component details getter
219
+ * 设置组件详情获取器
220
+ */
221
+ setComponentDetailsGetter(getter) {
222
+ this.componentDetailsGetter = getter;
223
+ }
224
+ /**
225
+ * Call plugin RPC function
226
+ * 调用插件 RPC 函数
227
+ */
228
+ async callRPC(name, ...args) {
229
+ const fn = this.rpcFunctions.get(name);
230
+ if (!fn) {
231
+ throw new Error(`[React DevTools] RPC function "${name}" not found`);
232
+ }
233
+ try {
234
+ return await fn(...args);
235
+ } catch (error) {
236
+ console.error(`[React DevTools] Error calling RPC function "${name}":`, error);
237
+ throw error;
238
+ }
239
+ }
240
+ /**
241
+ * Emit event to all plugins
242
+ * 向所有插件发送事件
243
+ */
244
+ emit(event) {
245
+ this.eventBus.emit(event);
246
+ }
247
+ /**
248
+ * Subscribe to events
249
+ * 订阅事件
250
+ */
251
+ on(type, handler) {
252
+ return this.eventBus.on(type, handler);
253
+ }
254
+ /**
255
+ * Cleanup all plugins
256
+ * 清理所有插件
257
+ */
258
+ async cleanup() {
259
+ const pluginIds = Array.from(this.plugins.keys());
260
+ for (const pluginId of pluginIds) {
261
+ await this.unregister(pluginId);
262
+ }
263
+ this.eventBus.clear();
264
+ this.rpcFunctions.clear();
265
+ }
266
+ /**
267
+ * Create plugin context
268
+ * 创建插件上下文
269
+ */
270
+ createContext(pluginId) {
271
+ return {
272
+ getComponentTree: async () => {
273
+ if (!this.componentTreeGetter) {
274
+ throw new Error("[React DevTools] Component tree getter not set");
275
+ }
276
+ return this.componentTreeGetter();
277
+ },
278
+ getComponentDetails: async (componentId) => {
279
+ if (!this.componentDetailsGetter) {
280
+ throw new Error("[React DevTools] Component details getter not set");
281
+ }
282
+ return this.componentDetailsGetter(componentId);
283
+ },
284
+ emit: (event) => {
285
+ this.eventBus.emit(event);
286
+ },
287
+ on: (type, handler) => {
288
+ return this.eventBus.on(type, handler);
289
+ },
290
+ registerRPC: (name, fn) => {
291
+ const fullName = `${pluginId}.${name}`;
292
+ this.rpcFunctions.set(fullName, fn);
293
+ },
294
+ callRPC: async (name, ...args) => {
295
+ return this.callRPC(name, ...args);
296
+ }
297
+ };
298
+ }
299
+ };
300
+ var globalPluginManager = new PluginManager();
301
+ // Annotate the CommonJS export names for ESM import in node:
302
+ 0 && (module.exports = {
303
+ PluginManager,
304
+ globalPluginManager
305
+ });
306
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/plugin/index.ts","../../src/events.ts","../../src/plugin/manager.ts"],"sourcesContent":["/**\n * Plugin system exports\n * 插件系统导出\n */\n\nexport type { DevToolsPlugin, PluginContext } from '../types'\nexport * from './manager'\n","/**\n * Event bus for React DevTools\n * React DevTools 事件总线\n */\n\nimport type { DevToolsEvent } from './types'\n\ntype EventHandler<T = DevToolsEvent> = (event: T) => void\ntype Unsubscribe = () => void\n\n/**\n * Event bus class\n * 事件总线类\n */\nexport class EventBus {\n private handlers: Map<string, Set<EventHandler>>\n\n constructor() {\n this.handlers = new Map()\n }\n\n /**\n * Subscribe to an event\n * 订阅事件\n */\n on<T extends DevToolsEvent['type']>(\n type: T,\n handler: EventHandler<Extract<DevToolsEvent, { type: T }>>,\n ): Unsubscribe {\n if (!this.handlers.has(type)) {\n this.handlers.set(type, new Set())\n }\n\n const handlers = this.handlers.get(type)!\n handlers.add(handler as EventHandler)\n\n // Return unsubscribe function\n return () => {\n handlers.delete(handler as EventHandler)\n if (handlers.size === 0) {\n this.handlers.delete(type)\n }\n }\n }\n\n /**\n * Subscribe to an event once\n * 订阅一次性事件\n */\n once<T extends DevToolsEvent['type']>(\n type: T,\n handler: EventHandler<Extract<DevToolsEvent, { type: T }>>,\n ): Unsubscribe {\n let unsubscribe: Unsubscribe\n\n const wrappedHandler = (event: DevToolsEvent) => {\n handler(event as Extract<DevToolsEvent, { type: T }>)\n unsubscribe()\n }\n\n unsubscribe = this.on(type, wrappedHandler as any)\n return unsubscribe\n }\n\n /**\n * Emit an event\n * 发送事件\n */\n emit(event: DevToolsEvent): void {\n const handlers = this.handlers.get(event.type)\n if (!handlers)\n return\n\n handlers.forEach((handler) => {\n try {\n handler(event)\n }\n catch (error) {\n console.error(`[React DevTools] Error in event handler for \"${event.type}\":`, error)\n }\n })\n }\n\n /**\n * Remove all event handlers\n * 移除所有事件处理器\n */\n clear(): void {\n this.handlers.clear()\n }\n\n /**\n * Remove all handlers for a specific event type\n * 移除特定事件类型的所有处理器\n */\n clearType(type: DevToolsEvent['type']): void {\n this.handlers.delete(type)\n }\n\n /**\n * Get number of handlers for an event type\n * 获取事件类型的处理器数量\n */\n getHandlerCount(type: DevToolsEvent['type']): number {\n return this.handlers.get(type)?.size || 0\n }\n\n /**\n * Check if there are any handlers for an event type\n * 检查是否有事件类型的处理器\n */\n hasHandlers(type: DevToolsEvent['type']): boolean {\n return this.getHandlerCount(type) > 0\n }\n}\n\n/**\n * Global event bus instance\n * 全局事件总线实例\n */\nexport const globalEventBus = new EventBus()\n","/**\n * Plugin manager for React DevTools\n * React DevTools 插件管理器\n */\n\nimport type { ComponentNode, DevToolsEvent, DevToolsPlugin, PluginContext } from '../types'\nimport { EventBus } from '../events'\n\n/**\n * Plugin manager class\n * 插件管理器类\n */\nexport class PluginManager {\n private plugins: Map<string, DevToolsPlugin>\n private contexts: Map<string, PluginContext>\n private eventBus: EventBus\n private rpcFunctions: Map<string, (...args: any[]) => any>\n private componentTreeGetter?: () => Promise<ComponentNode[]>\n private componentDetailsGetter?: (id: string) => Promise<ComponentNode | null>\n\n constructor() {\n this.plugins = new Map()\n this.contexts = new Map()\n this.eventBus = new EventBus()\n this.rpcFunctions = new Map()\n }\n\n /**\n * Register a plugin\n * 注册插件\n */\n async register(plugin: DevToolsPlugin): Promise<void> {\n if (this.plugins.has(plugin.id)) {\n throw new Error(`[React DevTools] Plugin \"${plugin.id}\" is already registered`)\n }\n\n // Create plugin context\n const context = this.createContext(plugin.id)\n this.contexts.set(plugin.id, context)\n\n // Register plugin\n this.plugins.set(plugin.id, plugin)\n\n // Register plugin RPC functions\n if (plugin.rpc) {\n Object.entries(plugin.rpc).forEach(([name, fn]) => {\n const fullName = `${plugin.id}.${name}`\n this.rpcFunctions.set(fullName, fn)\n })\n }\n\n // Register plugin event handlers\n if (plugin.on) {\n Object.entries(plugin.on).forEach(([type, handler]) => {\n if (handler) {\n this.eventBus.on(type as DevToolsEvent['type'], handler as any)\n }\n })\n }\n\n // Call plugin setup\n if (plugin.setup) {\n try {\n await plugin.setup(context)\n console.log(`[React DevTools] Plugin \"${plugin.name}\" registered successfully`)\n }\n catch (error) {\n console.error(`[React DevTools] Failed to setup plugin \"${plugin.name}\":`, error)\n // Rollback registration\n this.plugins.delete(plugin.id)\n this.contexts.delete(plugin.id)\n throw error\n }\n }\n }\n\n /**\n * Unregister a plugin\n * 注销插件\n */\n async unregister(pluginId: string): Promise<void> {\n const plugin = this.plugins.get(pluginId)\n if (!plugin) {\n console.warn(`[React DevTools] Plugin \"${pluginId}\" is not registered`)\n return\n }\n\n // Call plugin teardown\n if (plugin.teardown) {\n try {\n await plugin.teardown()\n }\n catch (error) {\n console.error(`[React DevTools] Error during plugin teardown for \"${plugin.name}\":`, error)\n }\n }\n\n // Remove plugin RPC functions\n if (plugin.rpc) {\n Object.keys(plugin.rpc).forEach((name) => {\n const fullName = `${pluginId}.${name}`\n this.rpcFunctions.delete(fullName)\n })\n }\n\n // Remove plugin\n this.plugins.delete(pluginId)\n this.contexts.delete(pluginId)\n\n console.log(`[React DevTools] Plugin \"${plugin.name}\" unregistered`)\n }\n\n /**\n * Get a plugin by ID\n * 根据 ID 获取插件\n */\n get(pluginId: string): DevToolsPlugin | undefined {\n return this.plugins.get(pluginId)\n }\n\n /**\n * Get all plugins\n * 获取所有插件\n */\n getAll(): DevToolsPlugin[] {\n return Array.from(this.plugins.values())\n }\n\n /**\n * Check if a plugin is registered\n * 检查插件是否已注册\n */\n has(pluginId: string): boolean {\n return this.plugins.has(pluginId)\n }\n\n /**\n * Get plugin context\n * 获取插件上下文\n */\n getContext(pluginId: string): PluginContext | undefined {\n return this.contexts.get(pluginId)\n }\n\n /**\n * Set component tree getter\n * 设置组件树获取器\n */\n setComponentTreeGetter(getter: () => Promise<ComponentNode[]>): void {\n this.componentTreeGetter = getter\n }\n\n /**\n * Set component details getter\n * 设置组件详情获取器\n */\n setComponentDetailsGetter(getter: (id: string) => Promise<ComponentNode | null>): void {\n this.componentDetailsGetter = getter\n }\n\n /**\n * Call plugin RPC function\n * 调用插件 RPC 函数\n */\n async callRPC<T = any>(name: string, ...args: any[]): Promise<T> {\n const fn = this.rpcFunctions.get(name)\n if (!fn) {\n throw new Error(`[React DevTools] RPC function \"${name}\" not found`)\n }\n\n try {\n return await fn(...args)\n }\n catch (error) {\n console.error(`[React DevTools] Error calling RPC function \"${name}\":`, error)\n throw error\n }\n }\n\n /**\n * Emit event to all plugins\n * 向所有插件发送事件\n */\n emit(event: DevToolsEvent): void {\n this.eventBus.emit(event)\n }\n\n /**\n * Subscribe to events\n * 订阅事件\n */\n on<T extends DevToolsEvent['type']>(\n type: T,\n handler: (event: Extract<DevToolsEvent, { type: T }>) => void,\n ): () => void {\n return this.eventBus.on(type, handler)\n }\n\n /**\n * Cleanup all plugins\n * 清理所有插件\n */\n async cleanup(): Promise<void> {\n const pluginIds = Array.from(this.plugins.keys())\n\n for (const pluginId of pluginIds) {\n await this.unregister(pluginId)\n }\n\n this.eventBus.clear()\n this.rpcFunctions.clear()\n }\n\n /**\n * Create plugin context\n * 创建插件上下文\n */\n private createContext(pluginId: string): PluginContext {\n return {\n getComponentTree: async () => {\n if (!this.componentTreeGetter) {\n throw new Error('[React DevTools] Component tree getter not set')\n }\n return this.componentTreeGetter()\n },\n\n getComponentDetails: async (componentId: string) => {\n if (!this.componentDetailsGetter) {\n throw new Error('[React DevTools] Component details getter not set')\n }\n return this.componentDetailsGetter(componentId)\n },\n\n emit: (event: DevToolsEvent) => {\n this.eventBus.emit(event)\n },\n\n on: <T extends DevToolsEvent['type']>(\n type: T,\n handler: (event: Extract<DevToolsEvent, { type: T }>) => void,\n ) => {\n return this.eventBus.on(type, handler)\n },\n\n registerRPC: <T extends (...args: any[]) => any>(name: string, fn: T) => {\n const fullName = `${pluginId}.${name}`\n this.rpcFunctions.set(fullName, fn)\n },\n\n callRPC: async <T = any>(name: string, ...args: any[]) => {\n return this.callRPC<T>(name, ...args)\n },\n }\n }\n}\n\n/**\n * Global plugin manager instance\n * 全局插件管理器实例\n */\nexport const globalPluginManager = new PluginManager()\n"],"mappings":"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","names":[]}
@@ -0,0 +1,94 @@
1
+ import { a as DevToolsPlugin, P as PluginContext, C as ComponentNode, D as DevToolsEvent } from '../types-BU_SaMGj.cjs';
2
+
3
+ /**
4
+ * Plugin manager for React DevTools
5
+ * React DevTools 插件管理器
6
+ */
7
+
8
+ /**
9
+ * Plugin manager class
10
+ * 插件管理器类
11
+ */
12
+ declare class PluginManager {
13
+ private plugins;
14
+ private contexts;
15
+ private eventBus;
16
+ private rpcFunctions;
17
+ private componentTreeGetter?;
18
+ private componentDetailsGetter?;
19
+ constructor();
20
+ /**
21
+ * Register a plugin
22
+ * 注册插件
23
+ */
24
+ register(plugin: DevToolsPlugin): Promise<void>;
25
+ /**
26
+ * Unregister a plugin
27
+ * 注销插件
28
+ */
29
+ unregister(pluginId: string): Promise<void>;
30
+ /**
31
+ * Get a plugin by ID
32
+ * 根据 ID 获取插件
33
+ */
34
+ get(pluginId: string): DevToolsPlugin | undefined;
35
+ /**
36
+ * Get all plugins
37
+ * 获取所有插件
38
+ */
39
+ getAll(): DevToolsPlugin[];
40
+ /**
41
+ * Check if a plugin is registered
42
+ * 检查插件是否已注册
43
+ */
44
+ has(pluginId: string): boolean;
45
+ /**
46
+ * Get plugin context
47
+ * 获取插件上下文
48
+ */
49
+ getContext(pluginId: string): PluginContext | undefined;
50
+ /**
51
+ * Set component tree getter
52
+ * 设置组件树获取器
53
+ */
54
+ setComponentTreeGetter(getter: () => Promise<ComponentNode[]>): void;
55
+ /**
56
+ * Set component details getter
57
+ * 设置组件详情获取器
58
+ */
59
+ setComponentDetailsGetter(getter: (id: string) => Promise<ComponentNode | null>): void;
60
+ /**
61
+ * Call plugin RPC function
62
+ * 调用插件 RPC 函数
63
+ */
64
+ callRPC<T = any>(name: string, ...args: any[]): Promise<T>;
65
+ /**
66
+ * Emit event to all plugins
67
+ * 向所有插件发送事件
68
+ */
69
+ emit(event: DevToolsEvent): void;
70
+ /**
71
+ * Subscribe to events
72
+ * 订阅事件
73
+ */
74
+ on<T extends DevToolsEvent['type']>(type: T, handler: (event: Extract<DevToolsEvent, {
75
+ type: T;
76
+ }>) => void): () => void;
77
+ /**
78
+ * Cleanup all plugins
79
+ * 清理所有插件
80
+ */
81
+ cleanup(): Promise<void>;
82
+ /**
83
+ * Create plugin context
84
+ * 创建插件上下文
85
+ */
86
+ private createContext;
87
+ }
88
+ /**
89
+ * Global plugin manager instance
90
+ * 全局插件管理器实例
91
+ */
92
+ declare const globalPluginManager: PluginManager;
93
+
94
+ export { DevToolsPlugin, PluginContext, PluginManager, globalPluginManager };
@@ -0,0 +1,94 @@
1
+ import { a as DevToolsPlugin, P as PluginContext, C as ComponentNode, D as DevToolsEvent } from '../types-BU_SaMGj.js';
2
+
3
+ /**
4
+ * Plugin manager for React DevTools
5
+ * React DevTools 插件管理器
6
+ */
7
+
8
+ /**
9
+ * Plugin manager class
10
+ * 插件管理器类
11
+ */
12
+ declare class PluginManager {
13
+ private plugins;
14
+ private contexts;
15
+ private eventBus;
16
+ private rpcFunctions;
17
+ private componentTreeGetter?;
18
+ private componentDetailsGetter?;
19
+ constructor();
20
+ /**
21
+ * Register a plugin
22
+ * 注册插件
23
+ */
24
+ register(plugin: DevToolsPlugin): Promise<void>;
25
+ /**
26
+ * Unregister a plugin
27
+ * 注销插件
28
+ */
29
+ unregister(pluginId: string): Promise<void>;
30
+ /**
31
+ * Get a plugin by ID
32
+ * 根据 ID 获取插件
33
+ */
34
+ get(pluginId: string): DevToolsPlugin | undefined;
35
+ /**
36
+ * Get all plugins
37
+ * 获取所有插件
38
+ */
39
+ getAll(): DevToolsPlugin[];
40
+ /**
41
+ * Check if a plugin is registered
42
+ * 检查插件是否已注册
43
+ */
44
+ has(pluginId: string): boolean;
45
+ /**
46
+ * Get plugin context
47
+ * 获取插件上下文
48
+ */
49
+ getContext(pluginId: string): PluginContext | undefined;
50
+ /**
51
+ * Set component tree getter
52
+ * 设置组件树获取器
53
+ */
54
+ setComponentTreeGetter(getter: () => Promise<ComponentNode[]>): void;
55
+ /**
56
+ * Set component details getter
57
+ * 设置组件详情获取器
58
+ */
59
+ setComponentDetailsGetter(getter: (id: string) => Promise<ComponentNode | null>): void;
60
+ /**
61
+ * Call plugin RPC function
62
+ * 调用插件 RPC 函数
63
+ */
64
+ callRPC<T = any>(name: string, ...args: any[]): Promise<T>;
65
+ /**
66
+ * Emit event to all plugins
67
+ * 向所有插件发送事件
68
+ */
69
+ emit(event: DevToolsEvent): void;
70
+ /**
71
+ * Subscribe to events
72
+ * 订阅事件
73
+ */
74
+ on<T extends DevToolsEvent['type']>(type: T, handler: (event: Extract<DevToolsEvent, {
75
+ type: T;
76
+ }>) => void): () => void;
77
+ /**
78
+ * Cleanup all plugins
79
+ * 清理所有插件
80
+ */
81
+ cleanup(): Promise<void>;
82
+ /**
83
+ * Create plugin context
84
+ * 创建插件上下文
85
+ */
86
+ private createContext;
87
+ }
88
+ /**
89
+ * Global plugin manager instance
90
+ * 全局插件管理器实例
91
+ */
92
+ declare const globalPluginManager: PluginManager;
93
+
94
+ export { DevToolsPlugin, PluginContext, PluginManager, globalPluginManager };