@dimina-kit/devtools 0.1.0-dev.20260422094158
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/LICENSE +21 -0
- package/README.md +562 -0
- package/dist/main/api.d.ts +21 -0
- package/dist/main/api.d.ts.map +1 -0
- package/dist/main/api.js +22 -0
- package/dist/main/api.js.map +1 -0
- package/dist/main/app/app.d.ts +15 -0
- package/dist/main/app/app.d.ts.map +1 -0
- package/dist/main/app/app.js +192 -0
- package/dist/main/app/app.js.map +1 -0
- package/dist/main/app/bootstrap.d.ts +14 -0
- package/dist/main/app/bootstrap.d.ts.map +1 -0
- package/dist/main/app/bootstrap.js +41 -0
- package/dist/main/app/bootstrap.js.map +1 -0
- package/dist/main/app/launch.d.ts +10 -0
- package/dist/main/app/launch.d.ts.map +1 -0
- package/dist/main/app/launch.js +28 -0
- package/dist/main/app/launch.js.map +1 -0
- package/dist/main/app/lifecycle.d.ts +2 -0
- package/dist/main/app/lifecycle.d.ts.map +1 -0
- package/dist/main/app/lifecycle.js +11 -0
- package/dist/main/app/lifecycle.js.map +1 -0
- package/dist/main/index.d.ts +2 -0
- package/dist/main/index.d.ts.map +1 -0
- package/dist/main/index.js +3 -0
- package/dist/main/index.js.map +1 -0
- package/dist/main/ipc/app.d.ts +3 -0
- package/dist/main/ipc/app.d.ts.map +1 -0
- package/dist/main/ipc/app.js +14 -0
- package/dist/main/ipc/app.js.map +1 -0
- package/dist/main/ipc/index.d.ts +9 -0
- package/dist/main/ipc/index.d.ts.map +1 -0
- package/dist/main/ipc/index.js +9 -0
- package/dist/main/ipc/index.js.map +1 -0
- package/dist/main/ipc/panels.d.ts +3 -0
- package/dist/main/ipc/panels.d.ts.map +1 -0
- package/dist/main/ipc/panels.js +39 -0
- package/dist/main/ipc/panels.js.map +1 -0
- package/dist/main/ipc/popover.d.ts +3 -0
- package/dist/main/ipc/popover.d.ts.map +1 -0
- package/dist/main/ipc/popover.js +13 -0
- package/dist/main/ipc/popover.js.map +1 -0
- package/dist/main/ipc/projects.d.ts +3 -0
- package/dist/main/ipc/projects.d.ts.map +1 -0
- package/dist/main/ipc/projects.js +15 -0
- package/dist/main/ipc/projects.js.map +1 -0
- package/dist/main/ipc/session.d.ts +3 -0
- package/dist/main/ipc/session.d.ts.map +1 -0
- package/dist/main/ipc/session.js +10 -0
- package/dist/main/ipc/session.js.map +1 -0
- package/dist/main/ipc/settings.d.ts +3 -0
- package/dist/main/ipc/settings.d.ts.map +1 -0
- package/dist/main/ipc/settings.js +61 -0
- package/dist/main/ipc/settings.js.map +1 -0
- package/dist/main/ipc/simulator.d.ts +3 -0
- package/dist/main/ipc/simulator.d.ts.map +1 -0
- package/dist/main/ipc/simulator.js +26 -0
- package/dist/main/ipc/simulator.js.map +1 -0
- package/dist/main/ipc/toolbar.d.ts +3 -0
- package/dist/main/ipc/toolbar.d.ts.map +1 -0
- package/dist/main/ipc/toolbar.js +10 -0
- package/dist/main/ipc/toolbar.js.map +1 -0
- package/dist/main/menu/index.d.ts +3 -0
- package/dist/main/menu/index.d.ts.map +1 -0
- package/dist/main/menu/index.js +65 -0
- package/dist/main/menu/index.js.map +1 -0
- package/dist/main/services/automation/exec.d.ts +9 -0
- package/dist/main/services/automation/exec.d.ts.map +1 -0
- package/dist/main/services/automation/exec.js +33 -0
- package/dist/main/services/automation/exec.js.map +1 -0
- package/dist/main/services/automation/handlers/app.d.ts +3 -0
- package/dist/main/services/automation/handlers/app.d.ts.map +1 -0
- package/dist/main/services/automation/handlers/app.js +132 -0
- package/dist/main/services/automation/handlers/app.js.map +1 -0
- package/dist/main/services/automation/handlers/element.d.ts +3 -0
- package/dist/main/services/automation/handlers/element.d.ts.map +1 -0
- package/dist/main/services/automation/handlers/element.js +151 -0
- package/dist/main/services/automation/handlers/element.js.map +1 -0
- package/dist/main/services/automation/handlers/page.d.ts +3 -0
- package/dist/main/services/automation/handlers/page.d.ts.map +1 -0
- package/dist/main/services/automation/handlers/page.js +66 -0
- package/dist/main/services/automation/handlers/page.js.map +1 -0
- package/dist/main/services/automation/handlers/tool.d.ts +3 -0
- package/dist/main/services/automation/handlers/tool.d.ts.map +1 -0
- package/dist/main/services/automation/handlers/tool.js +8 -0
- package/dist/main/services/automation/handlers/tool.js.map +1 -0
- package/dist/main/services/automation/index.d.ts +18 -0
- package/dist/main/services/automation/index.d.ts.map +1 -0
- package/dist/main/services/automation/index.js +95 -0
- package/dist/main/services/automation/index.js.map +1 -0
- package/dist/main/services/automation/registry.d.ts +6 -0
- package/dist/main/services/automation/registry.d.ts.map +1 -0
- package/dist/main/services/automation/registry.js +20 -0
- package/dist/main/services/automation/registry.js.map +1 -0
- package/dist/main/services/automation/shared.d.ts +24 -0
- package/dist/main/services/automation/shared.d.ts.map +1 -0
- package/dist/main/services/automation/shared.js +2 -0
- package/dist/main/services/automation/shared.js.map +1 -0
- package/dist/main/services/default-adapter.d.ts +3 -0
- package/dist/main/services/default-adapter.d.ts.map +1 -0
- package/dist/main/services/default-adapter.js +17 -0
- package/dist/main/services/default-adapter.js.map +1 -0
- package/dist/main/services/layout/index.d.ts +27 -0
- package/dist/main/services/layout/index.d.ts.map +1 -0
- package/dist/main/services/layout/index.js +49 -0
- package/dist/main/services/layout/index.js.map +1 -0
- package/dist/main/services/mcp/index.d.ts +15 -0
- package/dist/main/services/mcp/index.d.ts.map +1 -0
- package/dist/main/services/mcp/index.js +15 -0
- package/dist/main/services/mcp/index.js.map +1 -0
- package/dist/main/services/mcp/server.d.ts +10 -0
- package/dist/main/services/mcp/server.d.ts.map +1 -0
- package/dist/main/services/mcp/server.js +76 -0
- package/dist/main/services/mcp/server.js.map +1 -0
- package/dist/main/services/mcp/target-manager.d.ts +43 -0
- package/dist/main/services/mcp/target-manager.d.ts.map +1 -0
- package/dist/main/services/mcp/target-manager.js +165 -0
- package/dist/main/services/mcp/target-manager.js.map +1 -0
- package/dist/main/services/mcp/tool-registry.d.ts +14 -0
- package/dist/main/services/mcp/tool-registry.d.ts.map +1 -0
- package/dist/main/services/mcp/tool-registry.js +84 -0
- package/dist/main/services/mcp/tool-registry.js.map +1 -0
- package/dist/main/services/mcp/tools/context-tools.d.ts +15 -0
- package/dist/main/services/mcp/tools/context-tools.d.ts.map +1 -0
- package/dist/main/services/mcp/tools/context-tools.js +244 -0
- package/dist/main/services/mcp/tools/context-tools.js.map +1 -0
- package/dist/main/services/mcp/tools/simulator-tools.d.ts +14 -0
- package/dist/main/services/mcp/tools/simulator-tools.d.ts.map +1 -0
- package/dist/main/services/mcp/tools/simulator-tools.js +143 -0
- package/dist/main/services/mcp/tools/simulator-tools.js.map +1 -0
- package/dist/main/services/mcp/tools/workbench-tools.d.ts +7 -0
- package/dist/main/services/mcp/tools/workbench-tools.d.ts.map +1 -0
- package/dist/main/services/mcp/tools/workbench-tools.js +13 -0
- package/dist/main/services/mcp/tools/workbench-tools.js.map +1 -0
- package/dist/main/services/notifications/renderer-notifier.d.ts +80 -0
- package/dist/main/services/notifications/renderer-notifier.d.ts.map +1 -0
- package/dist/main/services/notifications/renderer-notifier.js +70 -0
- package/dist/main/services/notifications/renderer-notifier.js.map +1 -0
- package/dist/main/services/projects/index.d.ts +2 -0
- package/dist/main/services/projects/index.d.ts.map +1 -0
- package/dist/main/services/projects/index.js +6 -0
- package/dist/main/services/projects/index.js.map +1 -0
- package/dist/main/services/projects/project-repository.d.ts +28 -0
- package/dist/main/services/projects/project-repository.d.ts.map +1 -0
- package/dist/main/services/projects/project-repository.js +145 -0
- package/dist/main/services/projects/project-repository.js.map +1 -0
- package/dist/main/services/settings/index.d.ts +16 -0
- package/dist/main/services/settings/index.d.ts.map +1 -0
- package/dist/main/services/settings/index.js +46 -0
- package/dist/main/services/settings/index.js.map +1 -0
- package/dist/main/services/simulator/dir.d.ts +2 -0
- package/dist/main/services/simulator/dir.d.ts.map +1 -0
- package/dist/main/services/simulator/dir.js +5 -0
- package/dist/main/services/simulator/dir.js.map +1 -0
- package/dist/main/services/simulator/referer.d.ts +10 -0
- package/dist/main/services/simulator/referer.d.ts.map +1 -0
- package/dist/main/services/simulator/referer.js +20 -0
- package/dist/main/services/simulator/referer.js.map +1 -0
- package/dist/main/services/views/view-manager.d.ts +84 -0
- package/dist/main/services/views/view-manager.d.ts.map +1 -0
- package/dist/main/services/views/view-manager.js +254 -0
- package/dist/main/services/views/view-manager.js.map +1 -0
- package/dist/main/services/workbench-context.d.ts +59 -0
- package/dist/main/services/workbench-context.d.ts.map +1 -0
- package/dist/main/services/workbench-context.js +33 -0
- package/dist/main/services/workbench-context.js.map +1 -0
- package/dist/main/services/workspace/index.d.ts +2 -0
- package/dist/main/services/workspace/index.d.ts.map +1 -0
- package/dist/main/services/workspace/index.js +2 -0
- package/dist/main/services/workspace/index.js.map +1 -0
- package/dist/main/services/workspace/workspace-service.d.ts +49 -0
- package/dist/main/services/workspace/workspace-service.d.ts.map +1 -0
- package/dist/main/services/workspace/workspace-service.js +90 -0
- package/dist/main/services/workspace/workspace-service.js.map +1 -0
- package/dist/main/utils/logger.d.ts +15 -0
- package/dist/main/utils/logger.d.ts.map +1 -0
- package/dist/main/utils/logger.js +48 -0
- package/dist/main/utils/logger.js.map +1 -0
- package/dist/main/utils/paths.d.ts +6 -0
- package/dist/main/utils/paths.d.ts.map +1 -0
- package/dist/main/utils/paths.js +15 -0
- package/dist/main/utils/paths.js.map +1 -0
- package/dist/main/utils/theme.d.ts +10 -0
- package/dist/main/utils/theme.d.ts.map +1 -0
- package/dist/main/utils/theme.js +13 -0
- package/dist/main/utils/theme.js.map +1 -0
- package/dist/main/windows/main-window/create.d.ts +11 -0
- package/dist/main/windows/main-window/create.d.ts.map +1 -0
- package/dist/main/windows/main-window/create.js +67 -0
- package/dist/main/windows/main-window/create.js.map +1 -0
- package/dist/main/windows/main-window/events.d.ts +9 -0
- package/dist/main/windows/main-window/events.d.ts.map +1 -0
- package/dist/main/windows/main-window/events.js +18 -0
- package/dist/main/windows/main-window/events.js.map +1 -0
- package/dist/main/windows/main-window/index.d.ts +5 -0
- package/dist/main/windows/main-window/index.d.ts.map +1 -0
- package/dist/main/windows/main-window/index.js +3 -0
- package/dist/main/windows/main-window/index.js.map +1 -0
- package/dist/main/windows/settings-window/create.d.ts +3 -0
- package/dist/main/windows/settings-window/create.d.ts.map +1 -0
- package/dist/main/windows/settings-window/create.js +18 -0
- package/dist/main/windows/settings-window/create.js.map +1 -0
- package/dist/main/windows/settings-window/events.d.ts +3 -0
- package/dist/main/windows/settings-window/events.d.ts.map +1 -0
- package/dist/main/windows/settings-window/events.js +6 -0
- package/dist/main/windows/settings-window/events.js.map +1 -0
- package/dist/main/windows/settings-window/index.d.ts +3 -0
- package/dist/main/windows/settings-window/index.d.ts.map +1 -0
- package/dist/main/windows/settings-window/index.js +3 -0
- package/dist/main/windows/settings-window/index.js.map +1 -0
- package/dist/preload/instrumentation/app-data.d.ts +3 -0
- package/dist/preload/instrumentation/app-data.d.ts.map +1 -0
- package/dist/preload/instrumentation/app-data.js +103 -0
- package/dist/preload/instrumentation/app-data.js.map +1 -0
- package/dist/preload/instrumentation/console.d.ts +2 -0
- package/dist/preload/instrumentation/console.d.ts.map +1 -0
- package/dist/preload/instrumentation/console.js +54 -0
- package/dist/preload/instrumentation/console.js.map +1 -0
- package/dist/preload/instrumentation/disposable.d.ts +11 -0
- package/dist/preload/instrumentation/disposable.d.ts.map +1 -0
- package/dist/preload/instrumentation/disposable.js +15 -0
- package/dist/preload/instrumentation/disposable.js.map +1 -0
- package/dist/preload/instrumentation/index.d.ts +5 -0
- package/dist/preload/instrumentation/index.d.ts.map +1 -0
- package/dist/preload/instrumentation/index.js +5 -0
- package/dist/preload/instrumentation/index.js.map +1 -0
- package/dist/preload/instrumentation/storage.d.ts +2 -0
- package/dist/preload/instrumentation/storage.d.ts.map +1 -0
- package/dist/preload/instrumentation/storage.js +106 -0
- package/dist/preload/instrumentation/storage.js.map +1 -0
- package/dist/preload/instrumentation/wxml-extract.d.ts +11 -0
- package/dist/preload/instrumentation/wxml-extract.d.ts.map +1 -0
- package/dist/preload/instrumentation/wxml-extract.js +173 -0
- package/dist/preload/instrumentation/wxml-extract.js.map +1 -0
- package/dist/preload/instrumentation/wxml.d.ts +5 -0
- package/dist/preload/instrumentation/wxml.d.ts.map +1 -0
- package/dist/preload/instrumentation/wxml.js +223 -0
- package/dist/preload/instrumentation/wxml.js.map +1 -0
- package/dist/preload/runtime/bridge.d.ts +36 -0
- package/dist/preload/runtime/bridge.d.ts.map +1 -0
- package/dist/preload/runtime/bridge.js +151 -0
- package/dist/preload/runtime/bridge.js.map +1 -0
- package/dist/preload/runtime/host.d.ts +3 -0
- package/dist/preload/runtime/host.d.ts.map +1 -0
- package/dist/preload/runtime/host.js +28 -0
- package/dist/preload/runtime/host.js.map +1 -0
- package/dist/preload/shared/api-compat.d.ts +2 -0
- package/dist/preload/shared/api-compat.d.ts.map +1 -0
- package/dist/preload/shared/api-compat.js +196 -0
- package/dist/preload/shared/api-compat.js.map +1 -0
- package/dist/preload/shared/constants.d.ts +16 -0
- package/dist/preload/shared/constants.d.ts.map +1 -0
- package/dist/preload/shared/constants.js +16 -0
- package/dist/preload/shared/constants.js.map +1 -0
- package/dist/preload/shared/types.d.ts +34 -0
- package/dist/preload/shared/types.d.ts.map +1 -0
- package/dist/preload/shared/types.js +8 -0
- package/dist/preload/shared/types.js.map +1 -0
- package/dist/preload/windows/main.d.ts +7 -0
- package/dist/preload/windows/main.d.ts.map +1 -0
- package/dist/preload/windows/main.js +7 -0
- package/dist/preload/windows/main.js.map +1 -0
- package/dist/preload/windows/simulator.js +969 -0
- package/dist/preload/windows/simulator.js.map +7 -0
- package/dist/renderer/assets/index-kcmIQPCg.js +2 -0
- package/dist/renderer/assets/index-kcmIQPCg.js.map +1 -0
- package/dist/renderer/assets/input-B7sz4y1r.js +2 -0
- package/dist/renderer/assets/input-B7sz4y1r.js.map +1 -0
- package/dist/renderer/assets/ipc-transport-C9-PPTGn.css +1 -0
- package/dist/renderer/assets/ipc-transport-L_WD9x12.js +9 -0
- package/dist/renderer/assets/ipc-transport-L_WD9x12.js.map +1 -0
- package/dist/renderer/assets/popover-CzMIs2j4.js +2 -0
- package/dist/renderer/assets/popover-CzMIs2j4.js.map +1 -0
- package/dist/renderer/assets/select-BBXJVe8R.js +2 -0
- package/dist/renderer/assets/select-BBXJVe8R.js.map +1 -0
- package/dist/renderer/assets/settings-Db1pvrBJ.js +2 -0
- package/dist/renderer/assets/settings-Db1pvrBJ.js.map +1 -0
- package/dist/renderer/assets/settings-api-DJ1M-CNt.js +2 -0
- package/dist/renderer/assets/settings-api-DJ1M-CNt.js.map +1 -0
- package/dist/renderer/assets/workbenchSettings-BnQsvWkQ.js +8 -0
- package/dist/renderer/assets/workbenchSettings-BnQsvWkQ.js.map +1 -0
- package/dist/renderer/entries/main/index.html +15 -0
- package/dist/renderer/entries/popover/index.html +18 -0
- package/dist/renderer/entries/settings/index.html +15 -0
- package/dist/renderer/entries/workbench-settings/index.html +15 -0
- package/dist/shared/constants.d.ts +10 -0
- package/dist/shared/constants.d.ts.map +1 -0
- package/dist/shared/constants.js +10 -0
- package/dist/shared/constants.js.map +1 -0
- package/dist/shared/ipc-channels.d.ts +89 -0
- package/dist/shared/ipc-channels.d.ts.map +1 -0
- package/dist/shared/ipc-channels.js +102 -0
- package/dist/shared/ipc-channels.js.map +1 -0
- package/dist/shared/types.d.ts +89 -0
- package/dist/shared/types.d.ts.map +1 -0
- package/dist/shared/types.js +2 -0
- package/dist/shared/types.js.map +1 -0
- package/dist/simulator/assets/simulator-C1eHXnuq.js +9 -0
- package/dist/simulator/assets/simulator-C1eHXnuq.js.map +1 -0
- package/dist/simulator/simulator.html +164 -0
- package/package.json +204 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 EchoTechFE and dimina-kit contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,562 @@
|
|
|
1
|
+
# Dimina DevTools
|
|
2
|
+
|
|
3
|
+
基于 Electron 的小程序模块化开发者工具。提供模拟器、Chrome DevTools 面板、WXML/AppData/Storage 面板、编译配置等功能。
|
|
4
|
+
|
|
5
|
+
所有功能拆分为独立可导入的模块,第三方可按需组装,最大程度支持自定义。
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 三种接入方式
|
|
10
|
+
|
|
11
|
+
| 级别 | 入口 | 控制力 | 适合场景 |
|
|
12
|
+
| ------------ | ---------------------- | ------------------ | -------------------- |
|
|
13
|
+
| **零配置** | `launch()` | 无 | 直接运行 |
|
|
14
|
+
| **配置驱动** | `createWorkbenchApp()` | 开关模块、选择面板 | 简单定制 |
|
|
15
|
+
| **模块组装** | 单独 import 各模块 | 完全控制 | 深度定制、自定义 IPC |
|
|
16
|
+
|
|
17
|
+
### 零配置
|
|
18
|
+
|
|
19
|
+
```typescript
|
|
20
|
+
import { launch } from '@dimina-kit/devtools/launch'
|
|
21
|
+
launch()
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
### 配置驱动
|
|
25
|
+
|
|
26
|
+
```typescript
|
|
27
|
+
import { createWorkbenchApp } from '@dimina-kit/devtools/app'
|
|
28
|
+
|
|
29
|
+
createWorkbenchApp({
|
|
30
|
+
appName: 'My DevTools',
|
|
31
|
+
adapter: myAdapter,
|
|
32
|
+
panels: ['console', 'storage'], // 只显示这两个内置面板
|
|
33
|
+
modules: { settings: false }, // 禁用设置面板模块
|
|
34
|
+
window: { width: 1400, height: 900 },
|
|
35
|
+
}).start()
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
### 宿主扩展(推荐用于品牌化 / 自定义功能)
|
|
39
|
+
|
|
40
|
+
基于 `createWorkbenchApp()` 的配置驱动模式,通过 hooks 注入宿主逻辑,无需手动组装模块:
|
|
41
|
+
|
|
42
|
+
```typescript
|
|
43
|
+
import { suppressEpipe } from '@dimina-kit/devtools/bootstrap'
|
|
44
|
+
import { createWorkbenchApp } from '@dimina-kit/devtools/app'
|
|
45
|
+
import { rendererDir } from '@dimina-kit/devtools/paths'
|
|
46
|
+
import { ipcMain, Menu } from 'electron'
|
|
47
|
+
|
|
48
|
+
suppressEpipe()
|
|
49
|
+
|
|
50
|
+
createWorkbenchApp({
|
|
51
|
+
appName: '我的开发工具',
|
|
52
|
+
adapter: myAdapter,
|
|
53
|
+
preloadPath: '/path/to/my-preload.js',
|
|
54
|
+
rendererDir,
|
|
55
|
+
apiNamespaces: ['my'],
|
|
56
|
+
brandingProvider: () => ({ appName: '我的开发工具' }),
|
|
57
|
+
toolbarActions: () => [
|
|
58
|
+
{ id: 'deploy', label: '发布' },
|
|
59
|
+
{ id: 'preview', label: '预览' },
|
|
60
|
+
],
|
|
61
|
+
icon: '/path/to/icon.png',
|
|
62
|
+
menuBuilder: (mainWindow, ctx) => {
|
|
63
|
+
// 自定义菜单,ctx 是 WorkbenchContext
|
|
64
|
+
Menu.setApplicationMenu(/* ... */)
|
|
65
|
+
},
|
|
66
|
+
onSetup: ({ mainWindow, context }) => {
|
|
67
|
+
// 注册自定义 IPC handler
|
|
68
|
+
ipcMain.handle('toolbar:action:deploy', async () => {
|
|
69
|
+
// 通过 service 访问状态:context.workspace.getProjectPath()、context.workspace.hasActiveSession()
|
|
70
|
+
})
|
|
71
|
+
},
|
|
72
|
+
onBeforeClose: ({ context }) => {
|
|
73
|
+
// 窗口关闭前的自定义清理逻辑
|
|
74
|
+
// session 关闭和 view 销毁由框架自动处理
|
|
75
|
+
},
|
|
76
|
+
}).start()
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
### 模块组装(仅在需要完全控制时使用)
|
|
80
|
+
|
|
81
|
+
```typescript
|
|
82
|
+
import { app, globalShortcut } from 'electron'
|
|
83
|
+
import path from 'path'
|
|
84
|
+
import { createMainWindow } from '@dimina-kit/devtools/create-window'
|
|
85
|
+
import { createWorkbenchContext } from '@dimina-kit/devtools/context'
|
|
86
|
+
import { registerSimulatorIpc } from '@dimina-kit/devtools/ipc-simulator'
|
|
87
|
+
import { registerPanelsIpc } from '@dimina-kit/devtools/ipc-panels'
|
|
88
|
+
import { registerToolbarIpc } from '@dimina-kit/devtools/ipc-toolbar'
|
|
89
|
+
import { registerPopoverIpc } from '@dimina-kit/devtools/ipc-popover'
|
|
90
|
+
import { registerProjectsIpc } from '@dimina-kit/devtools/ipc-projects'
|
|
91
|
+
import { registerSessionIpc } from '@dimina-kit/devtools/ipc-session'
|
|
92
|
+
// registerSettingsIpc 不需要,不导入
|
|
93
|
+
import { rendererDir, defaultPreloadPath } from '@dimina-kit/devtools/paths'
|
|
94
|
+
|
|
95
|
+
app.whenReady().then(() => {
|
|
96
|
+
const mainWindow = createMainWindow({
|
|
97
|
+
title: 'My DevTools',
|
|
98
|
+
indexHtml: path.join(rendererDir, 'index.html'),
|
|
99
|
+
})
|
|
100
|
+
|
|
101
|
+
const ctx = createWorkbenchContext({
|
|
102
|
+
mainWindow,
|
|
103
|
+
adapter: myAdapter,
|
|
104
|
+
preloadPath: defaultPreloadPath,
|
|
105
|
+
rendererDir,
|
|
106
|
+
})
|
|
107
|
+
|
|
108
|
+
registerProjectsIpc(ctx)
|
|
109
|
+
registerSessionIpc(ctx)
|
|
110
|
+
registerSimulatorIpc(ctx)
|
|
111
|
+
registerPanelsIpc(ctx)
|
|
112
|
+
registerToolbarIpc(ctx)
|
|
113
|
+
registerPopoverIpc(ctx)
|
|
114
|
+
|
|
115
|
+
// 添加自定义 IPC — 通过 ctx.workspace 访问会话状态
|
|
116
|
+
ipcMain.handle('my:action', () => {
|
|
117
|
+
console.log('current project:', ctx.workspace.getProjectPath())
|
|
118
|
+
})
|
|
119
|
+
|
|
120
|
+
mainWindow.on('resize', () => ctx.views.repositionAll())
|
|
121
|
+
mainWindow.on('close', async (e) => {
|
|
122
|
+
if (ctx.workspace.hasActiveSession()) {
|
|
123
|
+
e.preventDefault()
|
|
124
|
+
await ctx.workspace.closeProject()
|
|
125
|
+
ctx.notify.windowNavigateBack()
|
|
126
|
+
}
|
|
127
|
+
})
|
|
128
|
+
})
|
|
129
|
+
|
|
130
|
+
app.on('window-all-closed', () => {
|
|
131
|
+
globalShortcut.unregisterAll()
|
|
132
|
+
app.quit()
|
|
133
|
+
})
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
---
|
|
137
|
+
|
|
138
|
+
## 目录结构
|
|
139
|
+
|
|
140
|
+
```
|
|
141
|
+
src/
|
|
142
|
+
shared/
|
|
143
|
+
types.ts # 跨层共享类型
|
|
144
|
+
constants.ts # 跨层共享常量
|
|
145
|
+
ipc-channels.ts # IPC 频道名称常量
|
|
146
|
+
main/
|
|
147
|
+
api.ts # 公共 API 聚合入口(package main)
|
|
148
|
+
app/
|
|
149
|
+
launch.ts # 零配置入口
|
|
150
|
+
app.ts # createWorkbenchApp 工厂
|
|
151
|
+
bootstrap.ts # suppressEpipe / setupCdpPort
|
|
152
|
+
lifecycle.ts # Electron app 生命周期注册
|
|
153
|
+
windows/
|
|
154
|
+
main-window/ # 主窗口创建 + 事件接线
|
|
155
|
+
settings-window/ # 独立设置窗口
|
|
156
|
+
ipc/ # 只做 handler 注册,不写业务
|
|
157
|
+
index.ts # 聚合 register 函数导出
|
|
158
|
+
simulator.ts # simulator attach/detach/resize
|
|
159
|
+
panels.ts # panel:list / panel:eval / selectSimulator
|
|
160
|
+
toolbar.ts # 品牌 / 工具栏配置
|
|
161
|
+
popover.ts # 编译配置弹窗
|
|
162
|
+
settings.ts # 项目设置 + workbench 设置
|
|
163
|
+
projects.ts # 项目列表管理
|
|
164
|
+
session.ts # 编译会话 open/close/status
|
|
165
|
+
services/ # 按业务领域分,真正的业务能力
|
|
166
|
+
settings/ # 用户级 workbench 设置读写 + 主题应用
|
|
167
|
+
projects/ # 项目列表 CRUD(持久化)
|
|
168
|
+
layout/ # 布局常量 + bounds 计算
|
|
169
|
+
mcp/ # MCP server
|
|
170
|
+
automation/ # 自动化 WebSocket 服务
|
|
171
|
+
simulator/ # simulator dir / referer
|
|
172
|
+
workbench-context.ts # 共享状态类型 + 工厂 + 辅助函数
|
|
173
|
+
default-adapter.ts # 默认 CompilationAdapter
|
|
174
|
+
menu/ # 应用菜单
|
|
175
|
+
utils/paths.ts # rendererDir / defaultPreloadPath
|
|
176
|
+
|
|
177
|
+
preload/ # 按注入目标分
|
|
178
|
+
windows/ # contextBridge 类型 preload
|
|
179
|
+
main.ts # 主窗口 preload,可组合导出 install*Instrumentation
|
|
180
|
+
simulator.ts # simulator webview 的默认 preload
|
|
181
|
+
shared/ # preload 之间共享
|
|
182
|
+
api-compat.ts # setupApiCompatHook
|
|
183
|
+
constants.ts
|
|
184
|
+
types.ts
|
|
185
|
+
instrumentation/ # 注入到小程序 runtime 的探针
|
|
186
|
+
console.ts # 控制台拦截
|
|
187
|
+
storage.ts # localStorage 拦截
|
|
188
|
+
app-data.ts # Worker setData 拦截
|
|
189
|
+
wxml.ts # Vue 组件树提取
|
|
190
|
+
runtime/
|
|
191
|
+
bridge.ts # installSimulatorBridge
|
|
192
|
+
host.ts
|
|
193
|
+
|
|
194
|
+
renderer/
|
|
195
|
+
entries/ # 各窗口 HTML + React 挂载点
|
|
196
|
+
main/ popover/ settings/ workbench-settings/
|
|
197
|
+
modules/ # 先按窗口分,再按区域
|
|
198
|
+
main/
|
|
199
|
+
app/ # 主窗口 App 根
|
|
200
|
+
features/ # 主窗口内的业务区域
|
|
201
|
+
project-runtime/ # 项目视图 + 工具栏 + 右侧面板切换
|
|
202
|
+
right-panel/ # WXML / AppData / Storage 面板
|
|
203
|
+
popover/ settings/ workbench-settings/
|
|
204
|
+
shared/
|
|
205
|
+
components/ # UI 组件(ui / layout / json-viewer / ...)
|
|
206
|
+
lib/ # ipc / simulator-url / utils / ...
|
|
207
|
+
|
|
208
|
+
simulator/ # 小程序容器运行时(独立 webview 入口)
|
|
209
|
+
simulator.html
|
|
210
|
+
main.tsx
|
|
211
|
+
simulator-api.ts
|
|
212
|
+
simulator-api-storage.ts
|
|
213
|
+
simulator-api-device.ts
|
|
214
|
+
simulator-api-media.ts
|
|
215
|
+
simulator-api-fs.ts
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
渲染层使用 **React + shadcn/ui + Tailwind CSS**,通过 Vite 构建,产物输出到 `dist/renderer/`。
|
|
219
|
+
|
|
220
|
+
---
|
|
221
|
+
|
|
222
|
+
## 配置参考
|
|
223
|
+
|
|
224
|
+
### WorkbenchConfig
|
|
225
|
+
|
|
226
|
+
`launch()` 和 `createWorkbenchApp()` 共用:
|
|
227
|
+
|
|
228
|
+
| 字段 | 类型 | 默认值 | 说明 |
|
|
229
|
+
| ------------------ | ----------------------- | ------------------- | ---------------------------------- |
|
|
230
|
+
| `appName` | `string` | `'Dimina DevTools'` | 窗口标题 |
|
|
231
|
+
| `adapter` | `CompilationAdapter` | 内置 | 项目编译适配器 |
|
|
232
|
+
| `panels` | `BuiltinPanelId[]` | 全部四个 | 显示哪些内置面板 |
|
|
233
|
+
| `preloadPath` | `string` | 内置 | 自定义 preload 脚本路径 |
|
|
234
|
+
| `apiNamespaces` | `string[]` | `[]` | 自定义 API 命名空间(如 `['qd']`) |
|
|
235
|
+
| `brandingProvider` | `() => { appName }` | — | 品牌信息 provider |
|
|
236
|
+
| `toolbarActions` | `() => ToolbarAction[]` | — | 工具栏动作按钮 provider |
|
|
237
|
+
|
|
238
|
+
### WorkbenchAppConfig(扩展 WorkbenchConfig)
|
|
239
|
+
|
|
240
|
+
`createWorkbenchApp()` 额外支持:
|
|
241
|
+
|
|
242
|
+
| 字段 | 类型 | 默认值 | 说明 |
|
|
243
|
+
| --------------- | ------------------------------------------- | ----------- | ------------------------------------------------- |
|
|
244
|
+
| `modules` | `Partial<Record<BuiltinModuleId, boolean>>` | 全部 `true` | 开关 IPC 模块组 |
|
|
245
|
+
| `rendererDir` | `string` | 内置 | 自定义 renderer HTML 目录 |
|
|
246
|
+
| `icon` | `string` | — | 窗口/任务栏图标路径(macOS 使用 app bundle 图标) |
|
|
247
|
+
| `menuBuilder` | `(mainWindow, context) => void` | 内置菜单 | 自定义菜单构建器 |
|
|
248
|
+
| `onSetup` | `(instance) => void` | — | 窗口和 context 创建后的回调,用于注册自定义 IPC |
|
|
249
|
+
| `onBeforeClose` | `(instance) => void` | — | 窗口关闭前的回调,session 关闭由框架自动处理 |
|
|
250
|
+
| `window` | `WorkbenchWindowConfig` | — | 窗口尺寸覆盖 |
|
|
251
|
+
|
|
252
|
+
### 内置面板 ID
|
|
253
|
+
|
|
254
|
+
`'wxml'` \| `'console'` \| `'appdata'` \| `'storage'`
|
|
255
|
+
|
|
256
|
+
### 内置模块 ID
|
|
257
|
+
|
|
258
|
+
`'projects'` \| `'session'` \| `'simulator'` \| `'popover'` \| `'settings'`
|
|
259
|
+
|
|
260
|
+
---
|
|
261
|
+
|
|
262
|
+
## CompilationAdapter
|
|
263
|
+
|
|
264
|
+
实现此接口接入自定义构建流程:
|
|
265
|
+
|
|
266
|
+
```typescript
|
|
267
|
+
import type { CompilationAdapter } from '@dimina-kit/devtools/types'
|
|
268
|
+
|
|
269
|
+
const myAdapter: CompilationAdapter = {
|
|
270
|
+
async openProject(opts) {
|
|
271
|
+
// opts.projectPath — 小程序项目绝对路径
|
|
272
|
+
// opts.sourcemap — 是否生成 sourcemap
|
|
273
|
+
// opts.onRebuild — 热更新回调
|
|
274
|
+
// opts.onBuildError — 构建错误回调
|
|
275
|
+
return {
|
|
276
|
+
port: 3000,
|
|
277
|
+
appInfo: { appName: 'my-app' },
|
|
278
|
+
close: async () => {},
|
|
279
|
+
}
|
|
280
|
+
},
|
|
281
|
+
}
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
---
|
|
285
|
+
|
|
286
|
+
## Preload Instrumentation
|
|
287
|
+
|
|
288
|
+
模拟器 webview 注入 preload 脚本在全局安装 instrumentation。内置 preload(`preload/windows/simulator.ts`)组装了以下模块:
|
|
289
|
+
|
|
290
|
+
| Instrumentation | 捕获内容 |
|
|
291
|
+
| ----------------------------------------- | ----------------------------------------------- |
|
|
292
|
+
| Console (`installConsoleInstrumentation`) | `console.*`、`window.onerror`、未捕获 rejection |
|
|
293
|
+
| Storage (`installStorageInstrumentation`) | `localStorage.setItem/removeItem`、全量快照 |
|
|
294
|
+
| AppData (`installAppDataInstrumentation`) | Worker `type='u'` 消息、setData 调用 |
|
|
295
|
+
| WXML (`installWxmlInstrumentation`) | Vue 组件树提取、MutationObserver 自动更新 |
|
|
296
|
+
|
|
297
|
+
所有 install\* 函数从 `@dimina-kit/devtools/preload` 统一导出,调用后通过 `installSimulatorBridge` 暴露的内部桥接通道把数据推到宿主。面板打开时调用 `panel:eval` 通过 `executeJavaScript` 拉取当前状态。
|
|
298
|
+
|
|
299
|
+
### 自定义 Preload
|
|
300
|
+
|
|
301
|
+
按需组合或追加自定义逻辑(`src/preload/windows/simulator.ts` 作为参考):
|
|
302
|
+
|
|
303
|
+
```typescript
|
|
304
|
+
// my-preload.ts
|
|
305
|
+
import {
|
|
306
|
+
installSimulatorBridge,
|
|
307
|
+
installConsoleInstrumentation,
|
|
308
|
+
installStorageInstrumentation,
|
|
309
|
+
setupApiCompatHook,
|
|
310
|
+
} from '@dimina-kit/devtools/preload'
|
|
311
|
+
// 不需要 WXML/AppData,不导入
|
|
312
|
+
|
|
313
|
+
setupApiCompatHook()
|
|
314
|
+
installSimulatorBridge()
|
|
315
|
+
installConsoleInstrumentation()
|
|
316
|
+
installStorageInstrumentation()
|
|
317
|
+
|
|
318
|
+
// 自定义 hook
|
|
319
|
+
window.addEventListener('error', (e) => {
|
|
320
|
+
console.error('[my-preload]', e.message)
|
|
321
|
+
})
|
|
322
|
+
```
|
|
323
|
+
|
|
324
|
+
编译后传入路径:
|
|
325
|
+
|
|
326
|
+
```typescript
|
|
327
|
+
launch({ preloadPath: '/absolute/path/to/my-preload.js' })
|
|
328
|
+
```
|
|
329
|
+
|
|
330
|
+
---
|
|
331
|
+
|
|
332
|
+
## 模块导出一览
|
|
333
|
+
|
|
334
|
+
```
|
|
335
|
+
@dimina-kit/devtools launch, createWorkbenchApp, buildDefaultMenu,
|
|
336
|
+
openSettingsWindow, suppressEpipe, setupCdpPort,
|
|
337
|
+
createWorkbenchContext, createMainWindow, ...
|
|
338
|
+
(api.ts 聚合了下方全部入口)
|
|
339
|
+
@dimina-kit/devtools/launch launch(config?), buildDefaultMenu, openSettingsWindow
|
|
340
|
+
@dimina-kit/devtools/app createWorkbenchApp(config?)
|
|
341
|
+
@dimina-kit/devtools/types TypeScript 类型定义
|
|
342
|
+
@dimina-kit/devtools/context createWorkbenchContext(opts),
|
|
343
|
+
hasBuiltinPanel(ctx, panelId), getDefaultTab(ctx)
|
|
344
|
+
@dimina-kit/devtools/create-window createMainWindow(opts)
|
|
345
|
+
@dimina-kit/devtools/view-manager createViewManager(ctx) → ViewManager
|
|
346
|
+
(attachSimulator, detachSimulator, showSimulator,
|
|
347
|
+
hideSimulator, showSettings, hideSettings,
|
|
348
|
+
showPopover, hidePopover, resize,
|
|
349
|
+
setVisible, repositionAll, disposeAll)
|
|
350
|
+
@dimina-kit/devtools/layout computeRightPanelBounds, computeSimulatorBounds,
|
|
351
|
+
computeSettingsBounds, computePopoverBounds,
|
|
352
|
+
setHeaderHeight, getRightX,
|
|
353
|
+
HEADER_H, SPLITTER_W, SETTINGS_W
|
|
354
|
+
@dimina-kit/devtools/projects listProjects, addProject, removeProject,
|
|
355
|
+
getCompileConfig, saveCompileConfig,
|
|
356
|
+
updateLastOpened
|
|
357
|
+
@dimina-kit/devtools/paths rendererDir, defaultPreloadPath,
|
|
358
|
+
getRendererDir, getPreloadDir, getRendererHtml
|
|
359
|
+
@dimina-kit/devtools/ipc-simulator registerSimulatorIpc(ctx)
|
|
360
|
+
@dimina-kit/devtools/ipc-panels registerPanelsIpc(ctx)
|
|
361
|
+
@dimina-kit/devtools/ipc-toolbar registerToolbarIpc(ctx)
|
|
362
|
+
@dimina-kit/devtools/ipc-popover registerPopoverIpc(ctx)
|
|
363
|
+
@dimina-kit/devtools/ipc-settings registerSettingsIpc(ctx)
|
|
364
|
+
@dimina-kit/devtools/ipc-projects registerProjectsIpc(ctx)
|
|
365
|
+
@dimina-kit/devtools/ipc-session registerSessionIpc(ctx), sendStatus(ctx, status, msg)
|
|
366
|
+
@dimina-kit/devtools/bootstrap suppressEpipe(), setupCdpPort()
|
|
367
|
+
@dimina-kit/devtools/workbench-settings loadWorkbenchSettings(), saveWorkbenchSettings(), applyTheme()
|
|
368
|
+
@dimina-kit/devtools/preload installConsoleInstrumentation,
|
|
369
|
+
installStorageInstrumentation,
|
|
370
|
+
installAppDataInstrumentation, sendAllAppData,
|
|
371
|
+
installWxmlInstrumentation, sendWxmlTree,
|
|
372
|
+
setupWxmlObserver, installSimulatorBridge,
|
|
373
|
+
setupApiCompatHook
|
|
374
|
+
@dimina-kit/devtools/simulator-dir simulatorDir
|
|
375
|
+
```
|
|
376
|
+
|
|
377
|
+
---
|
|
378
|
+
|
|
379
|
+
## WorkbenchContext
|
|
380
|
+
|
|
381
|
+
`WorkbenchContext` 是所有 IPC 模块共享的状态入口。配置字段直接暴露,运行时状态通过三个 service 访问:
|
|
382
|
+
|
|
383
|
+
```typescript
|
|
384
|
+
interface WorkbenchContext {
|
|
385
|
+
mainWindow: BrowserWindow
|
|
386
|
+
adapter: CompilationAdapter
|
|
387
|
+
preloadPath: string
|
|
388
|
+
rendererDir: string
|
|
389
|
+
panels: string[]
|
|
390
|
+
apiNamespaces: string[]
|
|
391
|
+
appName: string
|
|
392
|
+
toolbarActions?: () => Promise<ToolbarAction[]> | ToolbarAction[]
|
|
393
|
+
brandingProvider?: () => Promise<{ appName: string }> | { appName: string }
|
|
394
|
+
workbenchSettingsWindow: BrowserWindow | null
|
|
395
|
+
|
|
396
|
+
// ── Services(运行时状态封装在内部,通过方法访问)──
|
|
397
|
+
views: ViewManager // ctx.views.repositionAll(), ctx.views.getSimulatorWebContentsId(), ...
|
|
398
|
+
notify: RendererNotifier // ctx.notify.projectStatus(), ctx.notify.windowNavigateBack(), ...
|
|
399
|
+
workspace: WorkspaceService // ctx.workspace.getProjectPath(), ctx.workspace.hasActiveSession(), ...
|
|
400
|
+
}
|
|
401
|
+
```
|
|
402
|
+
|
|
403
|
+
会话和视图状态不再作为 ctx 的直接字段暴露,而是封装在对应 service 的私有闭包中:
|
|
404
|
+
|
|
405
|
+
| 旧写法 | 新写法 |
|
|
406
|
+
| ---------------------------- | ----------------------------------------------------------------- |
|
|
407
|
+
| `ctx.currentProjectPath` | `ctx.workspace.getProjectPath()` |
|
|
408
|
+
| `ctx.currentSession` | `ctx.workspace.getSession()` / `ctx.workspace.hasActiveSession()` |
|
|
409
|
+
| `ctx.simulatorWebContentsId` | `ctx.views.getSimulatorWebContentsId()` |
|
|
410
|
+
| `ctx.devToolsViewAdded` | `ctx.views.isSimulatorAdded()` |
|
|
411
|
+
| `ctx.lastSimWidth` | `ctx.views.getLastSimWidth()` |
|
|
412
|
+
|
|
413
|
+
---
|
|
414
|
+
|
|
415
|
+
## 整体架构
|
|
416
|
+
|
|
417
|
+
### 视图层级(从上到下 = 从顶层到底层)
|
|
418
|
+
|
|
419
|
+
```mermaid
|
|
420
|
+
flowchart TB
|
|
421
|
+
subgraph BW["BrowserWindow"]
|
|
422
|
+
direction TB
|
|
423
|
+
Z3["⑤ popoverView [z=3,顶层]<br/>entries/popover/index.html<br/>全屏透明遮罩 + 编译配置表单"]
|
|
424
|
+
Z2["④ settingsView [z=2]<br/>entries/settings/index.html<br/>固定宽度 320px,右侧对齐"]
|
|
425
|
+
Z1["② simulatorView [z=1]<br/>Chrome DevTools 面板"]
|
|
426
|
+
subgraph Z0["① mainWindow [z=0,底层] entries/main/index.html"]
|
|
427
|
+
direction LR
|
|
428
|
+
SIM["模拟器 <webview><br/>拖拽分割线"]
|
|
429
|
+
PNL["WXML / AppData / Storage<br/>React 中直接渲染"]
|
|
430
|
+
end
|
|
431
|
+
Z3 -. 覆盖 .-> Z2
|
|
432
|
+
Z2 -. 覆盖 .-> Z1
|
|
433
|
+
Z1 -. 覆盖 .-> Z0
|
|
434
|
+
end
|
|
435
|
+
```
|
|
436
|
+
|
|
437
|
+
层级由 `addChildView()` 调用顺序决定,后添加的 View 在上层。内置面板(WXML / AppData / Storage)不使用独立 WebContentsView,直接在主窗口 React 中渲染;只有 Chrome DevTools / settings / popover 需要 View 覆盖。
|
|
438
|
+
|
|
439
|
+
### 数据流
|
|
440
|
+
|
|
441
|
+
内置面板采用**拉取式**数据流,避免长期订阅:
|
|
442
|
+
|
|
443
|
+
```mermaid
|
|
444
|
+
sequenceDiagram
|
|
445
|
+
autonumber
|
|
446
|
+
actor User as 用户
|
|
447
|
+
participant UI as 面板 UI (React)
|
|
448
|
+
participant R as renderer
|
|
449
|
+
participant M as main<br/>ipc/panels.ts
|
|
450
|
+
participant P as preload<br/>instrumentation
|
|
451
|
+
|
|
452
|
+
User->>UI: 打开面板 / 刷新
|
|
453
|
+
UI->>R: invokeMain('panel:eval', expression)
|
|
454
|
+
R->>M: IPC: panel:eval
|
|
455
|
+
M->>P: webContents.executeJavaScript(expression)
|
|
456
|
+
Note over P: window 上已挂好取值函数
|
|
457
|
+
P-->>M: 结构化数据
|
|
458
|
+
M-->>R: 返回结果
|
|
459
|
+
R-->>UI: 渲染
|
|
460
|
+
```
|
|
461
|
+
|
|
462
|
+
Console 输出等推送场景仍由 preload 通过 `installSimulatorBridge()` 经由 webview ipcRenderer 送至宿主,再由 renderer 分发到相应面板。
|
|
463
|
+
|
|
464
|
+
---
|
|
465
|
+
|
|
466
|
+
## IPC 通信总览
|
|
467
|
+
|
|
468
|
+
| 频道 | 方向 | 说明 |
|
|
469
|
+
| --------------------------------- | ----- | ---------------------------------------------- |
|
|
470
|
+
| `projects:list` | R→M | 获取项目列表 |
|
|
471
|
+
| `projects:add` | R→M | 添加项目 |
|
|
472
|
+
| `projects:remove` | R→M | 删除项目 |
|
|
473
|
+
| `dialog:openDirectory` | R→M | 打开目录选择对话框 |
|
|
474
|
+
| `project:open` | R→M | 编译并启动项目 |
|
|
475
|
+
| `project:close` | R→M | 停止编译,清理 View |
|
|
476
|
+
| `project:status` | M→R | 编译状态推送 |
|
|
477
|
+
| `project:getPages` | R→M | 读取 app.json pages |
|
|
478
|
+
| `project:getCompileConfig` | R→M | 读取编译配置 |
|
|
479
|
+
| `project:saveCompileConfig` | R→M | 保存编译配置 |
|
|
480
|
+
| `app:getPreloadPath` | R→M | 获取 preload 脚本路径 |
|
|
481
|
+
| `app:getBranding` | R→M | 读取品牌信息(`brandingProvider`) |
|
|
482
|
+
| `toolbar:getActions` | R→M | 读取自定义工具栏按钮 |
|
|
483
|
+
| `workbench:getPanelConfig` | R→M | 获取 panels 配置 |
|
|
484
|
+
| `workbench:getApiNamespaces` | R→M | 获取自定义 API namespaces |
|
|
485
|
+
| `simulator:attach` | R→M | 绑定 simulator webContents,创建 simulatorView |
|
|
486
|
+
| `simulator:detach` | R→M | 销毁所有 View |
|
|
487
|
+
| `simulator:resize` | R→M | 更新 View 位置(分割线拖动) |
|
|
488
|
+
| `simulator:setVisible` | R→M | 显示/隐藏 simulator 面板 |
|
|
489
|
+
| `workbench:reset` | R→M | 通知主窗口重置面板状态 |
|
|
490
|
+
| `panel:list` | R→M | 获取启用的内置面板列表 |
|
|
491
|
+
| `panel:eval` | R→M | 在 simulator webContents 执行 JS 并返回结果 |
|
|
492
|
+
| `panel:select` | R→M | 切换到指定内置面板 |
|
|
493
|
+
| `panel:selectSimulator` | R→M | 切换到 simulator tab |
|
|
494
|
+
| `popover:show` | R→M | 创建弹窗 |
|
|
495
|
+
| `popover:hide` | R→M | 销毁弹窗 |
|
|
496
|
+
| `popover:init` | M→P | 初始化弹窗数据 |
|
|
497
|
+
| `popover:relaunch` | P→M→R | 重新编译 |
|
|
498
|
+
| `popover:closed` | M→R | 弹窗关闭通知 |
|
|
499
|
+
| `settings:setVisible` | R→M | 显示/隐藏设置视图 |
|
|
500
|
+
| `settings:init` | M→P | 初始化设置面板 |
|
|
501
|
+
| `settings:configChanged` | P→M→R | 编译配置变更通知 |
|
|
502
|
+
| `settings:projectSettingsChanged` | P→M | 项目级设置(如 sourcemap)落盘 |
|
|
503
|
+
| `settings:closed` | M→R | 设置面板关闭通知 |
|
|
504
|
+
| `workbenchSettings:get` | R→M | 读取用户级 workbench 设置 |
|
|
505
|
+
| `workbenchSettings:save` | R→M | 保存 workbench 设置并应用主题 |
|
|
506
|
+
| `workbenchSettings:setTheme` | R→M | 仅切换主题 |
|
|
507
|
+
| `workbenchSettings:getCdpStatus` | R→M | 读取当前 CDP 端口状态 |
|
|
508
|
+
| `workbenchSettings:setVisible` | R→M | 打开/关闭独立设置窗口 |
|
|
509
|
+
|
|
510
|
+
R=渲染进程,M=主进程,P=子 WebContentsView
|
|
511
|
+
|
|
512
|
+
---
|
|
513
|
+
|
|
514
|
+
## 已知限制:Electron `chrome.devtools.panels.create()` 不可用
|
|
515
|
+
|
|
516
|
+
Electron 对 `chrome.devtools.panels.create()` 的支持**长期不稳定**。该 API 调用成功(无报错,返回 panel 对象),但面板 tab 永远不出现在 DevTools UI 中。
|
|
517
|
+
|
|
518
|
+
**影响范围**:从 Electron 7 到 39 均有报告([#23662](https://github.com/electron/electron/issues/23662)、[#41613](https://github.com/electron/electron/issues/41613)、[#48705](https://github.com/electron/electron/issues/48705)),非特定版本 bug,而是系统性实现缺陷。官方文档声称完全支持,但实际因竞态条件和实现不完整导致面板无法可靠渲染。Electron 团队无修复计划。
|
|
519
|
+
|
|
520
|
+
**当前方案**:内置面板(WXML / AppData / Storage)直接在主窗口 React 中渲染,通过 `panel:eval` IPC 调用 `webContents.executeJavaScript()` 从 simulator 拉取数据;Chrome DevTools 仍作为独立 `WebContentsView` 通过 `setDevToolsWebContents()` 挂载。面板切换由 renderer toolbar 的 tab 栏控制,主进程负责 simulator/settings/popover View 的创建、定位和显隐。详见 `src/main/ipc/panels.ts` 和 `src/main/ipc/simulator.ts`。
|
|
521
|
+
|
|
522
|
+
---
|
|
523
|
+
|
|
524
|
+
## 调试
|
|
525
|
+
|
|
526
|
+
- **Cmd+Shift+I** / **Ctrl+Shift+I** — 打开 mainWindow 的 Electron DevTools(调试 React 渲染层)
|
|
527
|
+
- 模拟器 webview 的 Chrome DevTools 在编译完成、`dom-ready` 后自动打开
|
|
528
|
+
- 开发模式(`!app.isPackaged`)下 mainWindow DevTools 自动以 detach 模式打开
|
|
529
|
+
|
|
530
|
+
---
|
|
531
|
+
|
|
532
|
+
## 开发
|
|
533
|
+
|
|
534
|
+
```bash
|
|
535
|
+
pnpm build # 构建全部(main + preload + renderer)
|
|
536
|
+
pnpm build:main # 仅构建主进程 TypeScript
|
|
537
|
+
pnpm build:preload # 仅构建 preload TypeScript
|
|
538
|
+
pnpm build:renderer # Vite 构建渲染层
|
|
539
|
+
pnpm dev # Watch 模式 + Electron
|
|
540
|
+
pnpm check-types # 类型检查
|
|
541
|
+
pnpm test # 运行测试
|
|
542
|
+
```
|
|
543
|
+
|
|
544
|
+
---
|
|
545
|
+
|
|
546
|
+
## 安全说明
|
|
547
|
+
|
|
548
|
+
- 本工具仅用于本地开发调试,不应部署到生产环境
|
|
549
|
+
- 为方便开发调试,BrowserWindow 启用了 `nodeIntegration` 并禁用了 `contextIsolation`,这在生产环境中存在安全风险
|
|
550
|
+
- 仅在受信任的本地开发环境中使用本工具
|
|
551
|
+
- 不要在 devtools 窗口中加载不受信任的远程内容
|
|
552
|
+
- 如需在非本地环境使用,请自行评估并加固安全配置
|
|
553
|
+
|
|
554
|
+
### MCP Server 风险
|
|
555
|
+
|
|
556
|
+
内置的 MCP server 默认关闭,由 `startMcpServer` 入口显式启动,或通过 workbench 设置中的 `mcp.enabled` 开启。开启后会在本机监听 SSE 端点,向任何可以连接到该端点的 MCP 客户端暴露一组工具,能力包括:在页面上下文执行任意 JS(`evaluate`)、读取 DOM 结构、截屏、拉取网络日志、触发导航等。
|
|
557
|
+
|
|
558
|
+
由于 workbench 主窗口出于调试需要启用了 `nodeIntegration` 并关闭了 `contextIsolation`,通过 MCP 客户端执行的 `evaluate` 实际拥有 Node API 访问权限。换言之,开启 MCP 等同于允许已连接的本机 MCP 客户端在 DevTools 进程中执行 Node 代码,读写本机文件和启动子进程均在其能力范围内。
|
|
559
|
+
|
|
560
|
+
因此仅在连接到可信的本机 MCP 客户端或被信任的 AI 工具时启用该功能;不要在公共 WiFi、共享机器或存在远程 SSH 端口转发的场景下开启,以免监听端口被非预期的客户端访问。
|
|
561
|
+
|
|
562
|
+
作为收窄 RCE 面的默认策略,`workbench_evaluate` 已从 MCP 工具集中移除,workbench 只暴露只读诊断工具(截屏、console 日志、DOM、网络日志等)。`simulator_evaluate` 仍然保留,因为 simulator 使用 `<webview>`,默认 `nodeIntegration=false`,其 `evaluate` 仅在页面 JS 上下文执行,不具备 Node API 访问能力。
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export { launch, buildDefaultMenu, openSettingsWindow } from './app/launch.js';
|
|
2
|
+
export { createWorkbenchApp } from './app/app.js';
|
|
3
|
+
export type { WorkbenchAppInstance } from './app/app.js';
|
|
4
|
+
export { suppressEpipe, setupCdpPort } from './app/bootstrap.js';
|
|
5
|
+
export { createWorkbenchContext, hasBuiltinPanel, getDefaultTab } from './services/workbench-context.js';
|
|
6
|
+
export type { WorkbenchContext, CreateContextOptions } from './services/workbench-context.js';
|
|
7
|
+
export { createMainWindow } from './windows/main-window/index.js';
|
|
8
|
+
export { createViewManager } from './services/views/view-manager.js';
|
|
9
|
+
export type { ViewManager } from './services/views/view-manager.js';
|
|
10
|
+
export { registerAppIpc } from './ipc/app.js';
|
|
11
|
+
export { registerSimulatorIpc } from './ipc/simulator.js';
|
|
12
|
+
export { registerPanelsIpc } from './ipc/panels.js';
|
|
13
|
+
export { registerPopoverIpc } from './ipc/popover.js';
|
|
14
|
+
export { registerSettingsIpc } from './ipc/settings.js';
|
|
15
|
+
export { registerProjectsIpc } from './ipc/projects.js';
|
|
16
|
+
export { registerSessionIpc } from './ipc/session.js';
|
|
17
|
+
export { registerToolbarIpc } from './ipc/toolbar.js';
|
|
18
|
+
export { rendererDir, defaultPreloadPath, getRendererDir, getPreloadDir, getRendererHtml } from './utils/paths.js';
|
|
19
|
+
export { simulatorDir } from './services/simulator/dir.js';
|
|
20
|
+
export type { WorkbenchConfig, WorkbenchAppConfig, CompilationAdapter, ProjectSession, ToolbarAction, BuiltinPanelId, BuiltinModuleId, } from '../shared/types.js';
|
|
21
|
+
//# sourceMappingURL=api.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/main/api.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AAC9E,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AACjD,YAAY,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAA;AAGxD,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAGhE,OAAO,EAAE,sBAAsB,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAA;AACxG,YAAY,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAA;AAC7F,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAA;AACjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAA;AACpE,YAAY,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAA;AAGnE,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAC7C,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAA;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AAGrD,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,cAAc,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAClH,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAA;AAG1D,YAAY,EACV,eAAe,EACf,kBAAkB,EAClB,kBAAkB,EAClB,cAAc,EACd,aAAa,EACb,cAAc,EACd,eAAe,GAChB,MAAM,oBAAoB,CAAA"}
|
package/dist/main/api.js
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
// ── Primary API ──────────────────────────────────────────────────────────
|
|
2
|
+
export { launch, buildDefaultMenu, openSettingsWindow } from './app/launch.js';
|
|
3
|
+
export { createWorkbenchApp } from './app/app.js';
|
|
4
|
+
// ── Bootstrap utilities ──────────────────────────────────────────────────
|
|
5
|
+
export { suppressEpipe, setupCdpPort } from './app/bootstrap.js';
|
|
6
|
+
// ── Context & views (for module-assembly consumers) ──────────────────────
|
|
7
|
+
export { createWorkbenchContext, hasBuiltinPanel, getDefaultTab } from './services/workbench-context.js';
|
|
8
|
+
export { createMainWindow } from './windows/main-window/index.js';
|
|
9
|
+
export { createViewManager } from './services/views/view-manager.js';
|
|
10
|
+
// ── IPC module registration ──────────────────────────────────────────────
|
|
11
|
+
export { registerAppIpc } from './ipc/app.js';
|
|
12
|
+
export { registerSimulatorIpc } from './ipc/simulator.js';
|
|
13
|
+
export { registerPanelsIpc } from './ipc/panels.js';
|
|
14
|
+
export { registerPopoverIpc } from './ipc/popover.js';
|
|
15
|
+
export { registerSettingsIpc } from './ipc/settings.js';
|
|
16
|
+
export { registerProjectsIpc } from './ipc/projects.js';
|
|
17
|
+
export { registerSessionIpc } from './ipc/session.js';
|
|
18
|
+
export { registerToolbarIpc } from './ipc/toolbar.js';
|
|
19
|
+
// ── Paths ────────────────────────────────────────────────────────────────
|
|
20
|
+
export { rendererDir, defaultPreloadPath, getRendererDir, getPreloadDir, getRendererHtml } from './utils/paths.js';
|
|
21
|
+
export { simulatorDir } from './services/simulator/dir.js';
|
|
22
|
+
//# sourceMappingURL=api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/main/api.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AAC9E,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AAGjD,4EAA4E;AAC5E,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAEhE,4EAA4E;AAC5E,OAAO,EAAE,sBAAsB,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAA;AAExG,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAA;AACjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAA;AAGpE,4EAA4E;AAC5E,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAC7C,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAA;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AAErD,4EAA4E;AAC5E,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,cAAc,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAClH,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAA"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { BrowserWindow } from 'electron';
|
|
2
|
+
import type { WorkbenchAppConfig } from '../../shared/types.js';
|
|
3
|
+
import { type WorkbenchContext } from '../services/workbench-context.js';
|
|
4
|
+
import { type AutomationServer } from '../services/automation/index.js';
|
|
5
|
+
export interface WorkbenchAppInstance {
|
|
6
|
+
mainWindow: BrowserWindow;
|
|
7
|
+
context: WorkbenchContext;
|
|
8
|
+
automationServer?: AutomationServer;
|
|
9
|
+
dispose: () => Promise<void>;
|
|
10
|
+
}
|
|
11
|
+
export declare function createWorkbenchApp(config?: WorkbenchAppConfig): {
|
|
12
|
+
setup: () => Promise<WorkbenchAppInstance>;
|
|
13
|
+
start: () => void;
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=app.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../../src/main/app/app.ts"],"names":[],"mappings":"AAEA,OAAO,EAAO,aAAa,EAAe,MAAM,UAAU,CAAA;AAG1D,OAAO,KAAK,EAAmB,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AAIhF,OAAO,EAA0B,KAAK,gBAAgB,EAAE,MAAM,kCAAkC,CAAA;AAahG,OAAO,EAAyB,KAAK,gBAAgB,EAAE,MAAM,iCAAiC,CAAA;AAyB9F,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,aAAa,CAAA;IACzB,OAAO,EAAE,gBAAgB,CAAA;IACzB,gBAAgB,CAAC,EAAE,gBAAgB,CAAA;IACnC,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAC7B;AAqID,wBAAgB,kBAAkB,CAAC,MAAM,GAAE,kBAAuB;iBAMxC,OAAO,CAAC,oBAAoB,CAAC;iBA8BnC,IAAI;EAYvB"}
|