@dimina-kit/devtools 0.3.2-dev.20260601115343 → 0.3.2-dev.20260610114009
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/README.md +49 -59
- package/dist/main/api.d.ts +1 -2
- package/dist/main/api.js +5 -1
- package/dist/main/app/app.d.ts +15 -5
- package/dist/main/app/app.js +249 -122
- package/dist/main/app/bootstrap.d.ts +16 -0
- package/dist/main/app/bootstrap.js +20 -0
- package/dist/main/app/launch.d.ts +8 -4
- package/dist/main/app/launch.js +9 -4
- package/dist/main/index.bundle.js +6071 -1863
- package/dist/main/index.js +9 -1
- package/dist/main/ipc/app.d.ts +1 -1
- package/dist/main/ipc/bridge-router.d.ts +61 -0
- package/dist/main/ipc/bridge-router.js +1333 -0
- package/dist/main/ipc/panels.d.ts +1 -1
- package/dist/main/ipc/panels.js +6 -2
- package/dist/main/ipc/popover.d.ts +1 -1
- package/dist/main/ipc/project-fs.d.ts +1 -1
- package/dist/main/ipc/projects.d.ts +1 -1
- package/dist/main/ipc/session.d.ts +1 -1
- package/dist/main/ipc/settings.d.ts +1 -1
- package/dist/main/ipc/simulator-module.d.ts +6 -0
- package/dist/main/ipc/simulator-module.js +9 -1
- package/dist/main/ipc/simulator.d.ts +2 -2
- package/dist/main/ipc/simulator.js +29 -5
- package/dist/main/ipc/toolbar.d.ts +1 -1
- package/dist/main/ipc/views.d.ts +1 -1
- package/dist/main/ipc/views.js +40 -2
- package/dist/main/runtime/devtools-backend.d.ts +17 -0
- package/dist/main/runtime/devtools-backend.js +49 -0
- package/dist/main/runtime/miniapp-runtime.d.ts +39 -0
- package/dist/main/runtime/miniapp-runtime.js +17 -0
- package/dist/main/services/automation/exec.d.ts +27 -2
- package/dist/main/services/automation/exec.js +37 -3
- package/dist/main/services/automation/handlers/app.js +127 -11
- package/dist/main/services/automation/handlers/page.js +36 -19
- package/dist/main/services/automation/index.js +40 -13
- package/dist/main/services/automation/wait-active-page.d.ts +56 -0
- package/dist/main/services/automation/wait-active-page.js +71 -0
- package/dist/main/services/console-forward/index.d.ts +36 -0
- package/dist/main/services/console-forward/index.js +81 -0
- package/dist/main/services/dimina-resource-server.d.ts +7 -0
- package/dist/main/services/dimina-resource-server.js +99 -0
- package/dist/main/services/elements-forward/index.d.ts +66 -0
- package/dist/main/services/elements-forward/index.js +583 -0
- package/dist/main/services/layout/index.d.ts +22 -0
- package/dist/main/services/layout/index.js +25 -0
- package/dist/main/services/mcp/index.d.ts +1 -0
- package/dist/main/services/mcp/index.js +3 -0
- package/dist/main/services/mcp/server.d.ts +1 -1
- package/dist/main/services/mcp/server.js +1 -1
- package/dist/main/services/mcp/target-manager.d.ts +35 -0
- package/dist/main/services/mcp/target-manager.js +63 -1
- package/dist/main/services/mcp/tools/context-tools.js +15 -1
- package/dist/main/services/module.d.ts +1 -1
- package/dist/main/services/network-forward/index.d.ts +190 -0
- package/dist/main/services/network-forward/index.js +765 -0
- package/dist/main/services/notifications/renderer-notifier.d.ts +11 -0
- package/dist/main/services/notifications/renderer-notifier.js +7 -1
- package/dist/main/services/render-inspect/index.d.ts +41 -0
- package/dist/main/services/render-inspect/index.js +88 -0
- package/dist/main/services/safe-area/index.d.ts +17 -0
- package/dist/main/services/safe-area/index.js +59 -0
- package/dist/main/services/service-host-pool/pool.d.ts +197 -0
- package/dist/main/services/service-host-pool/pool.js +364 -0
- package/dist/main/services/simulator/custom-apis.d.ts +34 -0
- package/dist/main/services/simulator/custom-apis.js +22 -0
- package/dist/main/services/simulator-appdata/index.d.ts +35 -0
- package/dist/main/services/simulator-appdata/index.js +71 -0
- package/dist/main/services/simulator-current-page/index.d.ts +24 -0
- package/dist/main/services/simulator-current-page/index.js +19 -0
- package/dist/main/services/simulator-storage/index.d.ts +37 -2
- package/dist/main/services/simulator-storage/index.js +209 -32
- package/dist/main/services/simulator-storage/service-storage-ops.d.ts +40 -0
- package/dist/main/services/simulator-storage/service-storage-ops.js +67 -0
- package/dist/main/services/simulator-temp-files/index.d.ts +1 -1
- package/dist/main/services/simulator-temp-files/index.js +39 -17
- package/dist/main/services/simulator-wxml/index.d.ts +29 -0
- package/dist/main/services/simulator-wxml/index.js +28 -0
- package/dist/main/services/toolbar/toolbar-store.d.ts +3 -3
- package/dist/main/services/toolbar/toolbar-store.js +1 -18
- package/dist/main/services/views/devtools-tabs.d.ts +47 -0
- package/dist/main/services/views/devtools-tabs.js +95 -0
- package/dist/main/services/views/miniapp-partition.d.ts +80 -0
- package/dist/main/services/views/miniapp-partition.js +138 -0
- package/dist/main/services/views/simulator-session-policy.d.ts +28 -0
- package/dist/main/services/views/simulator-session-policy.js +82 -0
- package/dist/main/services/views/view-manager.d.ts +125 -0
- package/dist/main/services/views/view-manager.js +852 -4
- package/dist/main/services/workbench-context.d.ts +67 -7
- package/dist/main/services/workbench-context.js +6 -1
- package/dist/main/services/workspace/workspace-service.js +7 -13
- package/dist/main/utils/ipc-registry.d.ts +1 -1
- package/dist/main/utils/ipc-registry.js +21 -4
- package/dist/main/utils/paths.d.ts +15 -0
- package/dist/main/utils/paths.js +19 -0
- package/dist/main/utils/sender-policy.d.ts +9 -3
- package/dist/main/utils/sender-policy.js +18 -4
- package/dist/main/utils/theme.d.ts +1 -1
- package/dist/main/utils/theme.js +1 -1
- package/dist/main/windows/main-window/create.d.ts +0 -6
- package/dist/main/windows/main-window/create.js +6 -80
- package/dist/main/windows/main-window/events.d.ts +1 -1
- package/dist/main/windows/main-window/events.js +1 -1
- package/dist/main/windows/service-host-window/create.d.ts +67 -0
- package/dist/main/windows/service-host-window/create.js +138 -0
- package/dist/native-host/common/common.js +368 -0
- package/dist/native-host/container/pageFrame.css +1 -0
- package/dist/native-host/render/render.js +9334 -0
- package/dist/native-host/service/service.js +6 -0
- package/dist/preload/index.d.ts +2 -0
- package/dist/preload/index.js +6 -0
- package/dist/preload/instrumentation/app-data.d.ts +18 -20
- package/dist/preload/instrumentation/app-data.js +23 -160
- package/dist/preload/instrumentation/wxml-extract.d.ts +1 -1
- package/dist/preload/instrumentation/wxml-extract.js +1 -1
- package/dist/preload/runtime/bridge.d.ts +3 -8
- package/dist/preload/runtime/bridge.js +2 -32
- package/dist/preload/runtime/custom-apis.js +20 -17
- package/dist/preload/runtime/host-toolbar-advertiser.d.ts +27 -0
- package/dist/preload/runtime/host-toolbar-advertiser.js +55 -0
- package/dist/preload/runtime/main-api-runner.d.ts +9 -0
- package/dist/preload/runtime/main-api-runner.js +85 -0
- package/dist/preload/runtime/native-host.d.ts +43 -0
- package/dist/preload/runtime/native-host.js +83 -0
- package/dist/preload/shared/expose.d.ts +10 -5
- package/dist/preload/shared/expose.js +30 -12
- package/dist/preload/shared/sid-registry.d.ts +11 -0
- package/dist/preload/shared/sid-registry.js +38 -0
- package/dist/preload/windows/host-toolbar.cjs +161 -0
- package/dist/preload/windows/host-toolbar.cjs.map +7 -0
- package/dist/preload/windows/host-toolbar.d.ts +2 -0
- package/dist/preload/windows/host-toolbar.js +12 -0
- package/dist/preload/windows/main.cjs +1935 -0
- package/dist/preload/windows/main.cjs.map +4 -4
- package/dist/preload/windows/simulator.cjs +925 -0
- package/dist/preload/windows/simulator.cjs.map +7 -0
- package/dist/preload/windows/simulator.js +244 -574
- package/dist/render-host/pageFrame.html +29 -0
- package/dist/render-host/preload.cjs +154 -0
- package/dist/render-host/render-inspect.js +295 -0
- package/dist/renderer/assets/index-CcJKzatF.js +50 -0
- package/dist/renderer/assets/{input-CCYS8Ave.js → input-QGx6FFX1.js} +2 -2
- package/dist/renderer/assets/ipc-transport-BT4QYQqu.css +1 -0
- package/dist/renderer/assets/{ipc-transport-Bn4KXvhu.js → ipc-transport-DvZvwK-Z.js} +2 -2
- package/dist/renderer/assets/{popover-CH4rwpdt.js → popover-BOH1If1J.js} +2 -2
- package/dist/renderer/assets/select-C7JQ8G5N.js +2 -0
- package/dist/renderer/assets/{settings-CMTB-t0x.js → settings-DpAbTJyF.js} +2 -2
- package/dist/renderer/assets/{settings-api-Csdngf9Z.js → settings-api-RD2IZF53.js} +2 -2
- package/dist/renderer/assets/{workbenchSettings-CODFCzOg.js → workbenchSettings-CNJX4Qna.js} +2 -2
- package/dist/renderer/entries/main/index.html +5 -5
- package/dist/renderer/entries/popover/index.html +5 -5
- package/dist/renderer/entries/settings/index.html +5 -5
- package/dist/renderer/entries/workbench-settings/index.html +4 -4
- package/dist/service-host/preload.cjs +254 -0
- package/dist/service-host/service.html +10 -0
- package/dist/service-host/sourcemap-rewrite.cjs +58 -0
- package/dist/service-host/sync-api-patch.js +20 -0
- package/dist/service-host/sync-impls/menu-button-geometry.js +8 -0
- package/dist/service-host/sync-impls/menu-button.js +16 -0
- package/dist/service-host/sync-impls/storage.js +50 -0
- package/dist/service-host/sync-impls/system-info.js +54 -0
- package/dist/shared/appdata-accumulator.d.ts +95 -0
- package/dist/shared/appdata-accumulator.js +213 -0
- package/dist/shared/bridge-channels.d.ts +378 -0
- package/dist/shared/bridge-channels.js +81 -0
- package/dist/shared/ipc-channels.d.ts +84 -1
- package/dist/shared/ipc-channels.js +90 -10
- package/dist/shared/ipc-schemas.d.ts +59 -2
- package/dist/shared/ipc-schemas.js +64 -3
- package/dist/shared/open-in-editor.d.ts +71 -0
- package/dist/shared/open-in-editor.js +138 -0
- package/dist/shared/simulator-api-metadata.d.ts +21 -0
- package/dist/shared/simulator-api-metadata.js +23 -0
- package/dist/shared/types.d.ts +2 -39
- package/dist/simulator/assets/device-shell-DsdcNEkt.css +1 -0
- package/dist/simulator/assets/device-shell-fH2cI-3q.js +2 -0
- package/dist/simulator/assets/jsx-runtime-P6ZegaOf.js +2 -0
- package/dist/simulator/assets/simulator-DHylZf9Z.js +10 -0
- package/dist/simulator/assets/simulator-mini-app-BDNu5n26.js +2 -0
- package/dist/simulator/device-shell/menu-button-geometry.js +8 -0
- package/dist/simulator/simulator.html +2 -112
- package/package.json +12 -12
- package/dist/main/utils/disposable.d.ts +0 -18
- package/dist/main/utils/disposable.js +0 -67
- package/dist/renderer/assets/index-BDMxXUfn.js +0 -50
- package/dist/renderer/assets/ipc-transport-Cu7tubyg.css +0 -1
- package/dist/renderer/assets/select-Ct4-sijm.js +0 -2
- package/dist/simulator/assets/simulator-B4e3c6_O.js +0 -9
package/README.md
CHANGED
|
@@ -2,16 +2,18 @@
|
|
|
2
2
|
|
|
3
3
|
基于 Electron 的小程序开发者工具。提供模拟器、Chrome DevTools 面板、WXML/AppData/Storage 面板、编译配置等功能。
|
|
4
4
|
|
|
5
|
-
下游 host 通过 [`@dimina-kit/
|
|
5
|
+
下游 host 通过 `launch(config)` 集成并定制 devtools(零配置直接 `launch()`,配置驱动 `launch({...})`;见下方「两种用法」)。两种用法都经领域中立的 [`@dimina-kit/electron-deck`](../electron-deck) 框架编排——框架接管 Electron 进程生命周期(whenReady / will-quit)、wire/trust 原语,devtools 作为 `RuntimeBackend` 注入完整运行时(见 [`framework-extraction-v2.md`](../electron-deck/docs/framework-extraction-v2.md))。
|
|
6
6
|
|
|
7
7
|
---
|
|
8
8
|
|
|
9
|
-
##
|
|
9
|
+
## 两种用法
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
单一入口 `launch(config?)`——不传配置即零配置直接运行,传 `WorkbenchAppConfig` 即配置驱动定制。
|
|
12
|
+
|
|
13
|
+
| 用法 | 调用 | 控制力 | 适合场景 |
|
|
12
14
|
| ------------ | ---------------------- | --------------------- | -------------- |
|
|
13
15
|
| **零配置** | `launch()` | 无 | 直接运行 |
|
|
14
|
-
| **配置驱动** | `
|
|
16
|
+
| **配置驱动** | `launch({...})` | 配置 Provider + 扩展点 | 品牌化、深度定制 |
|
|
15
17
|
|
|
16
18
|
### 零配置
|
|
17
19
|
|
|
@@ -22,17 +24,17 @@ launch()
|
|
|
22
24
|
|
|
23
25
|
### 配置驱动
|
|
24
26
|
|
|
25
|
-
扩展点分两类:**配置 Provider**(构造期、一对一,替换某个内置能力)走 `
|
|
27
|
+
扩展点分两类:**配置 Provider**(构造期、一对一,替换某个内置能力)走 `launch` 配置字段;**Contribution**(`onSetup` 期、一对多,添加多个同类条目)走 `onSetup(instance)` 上的 typed 方法。所有 Contribution 都 per-context,随 context 自动销毁。
|
|
26
28
|
|
|
27
29
|
```typescript
|
|
28
30
|
import { suppressEpipe } from '@dimina-kit/devtools/bootstrap'
|
|
29
|
-
import {
|
|
31
|
+
import { launch } from '@dimina-kit/devtools'
|
|
30
32
|
import { rendererDir } from '@dimina-kit/devtools/paths'
|
|
31
33
|
import { Menu } from 'electron'
|
|
32
34
|
|
|
33
35
|
suppressEpipe()
|
|
34
36
|
|
|
35
|
-
|
|
37
|
+
launch({
|
|
36
38
|
// ── 配置 Provider(构造期,一对一)──
|
|
37
39
|
appName: '我的开发工具',
|
|
38
40
|
adapter: myAdapter,
|
|
@@ -53,14 +55,10 @@ createWorkbenchApp({
|
|
|
53
55
|
instance.registerSimulatorApi('login', (params) => myLogin(params))
|
|
54
56
|
|
|
55
57
|
// 工具栏:整表替换,随 host 状态(如登录态)重算时再 set 一次
|
|
56
|
-
const refreshToolbar = () =>
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
{ id: 'preview', label: '预览', placement: 'primary', handler: () => preview() },
|
|
61
|
-
{ id: 'deploy', label: '发布', placement: 'trailing', handler: () => deploy() },
|
|
62
|
-
])
|
|
63
|
-
}
|
|
58
|
+
const refreshToolbar = () => instance.toolbar.set([
|
|
59
|
+
{ id: 'deploy', label: '发布', handler: () => deploy() },
|
|
60
|
+
{ id: 'preview', label: '预览', handler: () => preview() },
|
|
61
|
+
])
|
|
64
62
|
refreshToolbar()
|
|
65
63
|
|
|
66
64
|
// 自定义 IPC:经 gated 的 IpcRegistry,不再裸 ipcMain.handle
|
|
@@ -70,16 +68,10 @@ createWorkbenchApp({
|
|
|
70
68
|
// const win = createDialogWindow(/* ... */)
|
|
71
69
|
// instance.registerTrustedWindow(win)
|
|
72
70
|
},
|
|
73
|
-
onBeforeOpenProject: async ({ projectPath, instance }) => {
|
|
74
|
-
const ok = await canOpenProject(projectPath)
|
|
75
|
-
return ok
|
|
76
|
-
? { allow: true }
|
|
77
|
-
: { allow: false, reason: '当前账号没有项目权限' }
|
|
78
|
-
},
|
|
79
71
|
onBeforeClose: ({ context }) => {
|
|
80
72
|
// 窗口关闭前的自定义清理;session 关闭和 view 销毁由框架自动处理
|
|
81
73
|
},
|
|
82
|
-
})
|
|
74
|
+
})
|
|
83
75
|
```
|
|
84
76
|
|
|
85
77
|
> Contribution 注册物全部自动进 `context.registry`,host 无需手写 cleanup。devtools 内部仍用 `WorkbenchModule` 组织内置 IPC 模块,但这是实现细节,不再作为对外接入方式导出。
|
|
@@ -98,7 +90,7 @@ src/
|
|
|
98
90
|
api.ts # 公共 API 聚合入口(package main)
|
|
99
91
|
app/
|
|
100
92
|
launch.ts # 零配置入口
|
|
101
|
-
app.ts #
|
|
93
|
+
app.ts # createDevtoolsRuntime 装配体 + runDevtoolsBootstrap
|
|
102
94
|
bootstrap.ts # suppressEpipe / setupCdpPort
|
|
103
95
|
lifecycle.ts # Electron app 生命周期注册
|
|
104
96
|
ipc/ # 只做 handler 注册,不写业务
|
|
@@ -128,8 +120,7 @@ src/
|
|
|
128
120
|
default-adapter.ts # 默认 CompilationAdapter
|
|
129
121
|
menu/ # 应用菜单
|
|
130
122
|
utils/
|
|
131
|
-
paths.ts # rendererDir / defaultPreloadPath / simulatorDir
|
|
132
|
-
disposable.ts # DisposableRegistry + AggregateError 聚合
|
|
123
|
+
paths.ts # rendererDir / defaultPreloadPath / simulatorDir / cjsSiblingPreloadPath
|
|
133
124
|
ipc-registry.ts # ipcMain.handle 包装 + SenderPolicy 闸门
|
|
134
125
|
sender-policy.ts # sender webContents id 白名单
|
|
135
126
|
ipc-schema.ts # zod schema 校验工具
|
|
@@ -141,7 +132,7 @@ src/
|
|
|
141
132
|
preload/ # 按注入目标分
|
|
142
133
|
windows/ # contextBridge 类型 preload
|
|
143
134
|
main.ts # workbench 三窗口 preload,仅暴露 window.devtools.ipc
|
|
144
|
-
simulator.ts # simulator
|
|
135
|
+
simulator.ts # simulator(WCV)frame preload(native-host 跑其 .cjs sibling)
|
|
145
136
|
shared/ # preload 之间共享
|
|
146
137
|
api-compat.ts # setupApiCompatHook
|
|
147
138
|
constants.ts
|
|
@@ -150,7 +141,6 @@ src/
|
|
|
150
141
|
console.ts # 控制台拦截
|
|
151
142
|
app-data.ts # Worker setData 拦截 → createAppDataSource
|
|
152
143
|
wxml.ts # Vue 组件树提取 → createWxmlSource
|
|
153
|
-
disposable.ts # instrumentation 共用的清理工具
|
|
154
144
|
miniapp-snapshot/ # 面板数据统一快照框架(docs/miniapp-snapshot.md)
|
|
155
145
|
types.ts # MiniappSnapshotSource / SnapshotEnvelope
|
|
156
146
|
host.ts # createMiniappSnapshotHost → push/pull/__miniappSnapshot
|
|
@@ -191,21 +181,21 @@ src/
|
|
|
191
181
|
|
|
192
182
|
### WorkbenchConfig
|
|
193
183
|
|
|
194
|
-
`launch()`
|
|
184
|
+
`launch()` 接受的基础字段(`WorkbenchConfig`):
|
|
195
185
|
|
|
196
186
|
| 字段 | 类型 | 默认值 | 说明 |
|
|
197
187
|
| ------------------ | -------------------- | ------------------- | ---------------------------------- |
|
|
198
188
|
| `appName` | `string` | `'Dimina DevTools'` | 窗口标题 |
|
|
199
189
|
| `adapter` | `CompilationAdapter` | 内置 | 项目编译适配器 |
|
|
200
190
|
| `panels` | `BuiltinPanelId[]` | 全部四个 | 显示哪些内置面板 |
|
|
201
|
-
| `preloadPath` | `string` | 内置 |
|
|
191
|
+
| `preloadPath` | `string` | 内置 | 统一的 host 级 preload 入口;native-host simulator(WCV)自动跑其 `.cjs` sibling(`cjsSiblingPreloadPath`) |
|
|
202
192
|
| `apiNamespaces` | `string[]` | `[]` | 自定义 API 命名空间(如 `['qd']`) |
|
|
203
193
|
| `brandingProvider` | `() => { appName }` | — | 品牌信息 provider |
|
|
204
194
|
| `headerHeight` | `number` | `40` | 头部栏高度(px),同步下发 main + renderer |
|
|
205
195
|
|
|
206
196
|
### WorkbenchAppConfig(扩展 WorkbenchConfig)
|
|
207
197
|
|
|
208
|
-
`
|
|
198
|
+
`launch()` 完整接受的 `WorkbenchAppConfig` 额外支持:
|
|
209
199
|
|
|
210
200
|
| 字段 | 类型 | 默认值 | 说明 |
|
|
211
201
|
| --------------- | ------------------------------------------- | ----------- | ------------------------------------------------- |
|
|
@@ -213,9 +203,8 @@ src/
|
|
|
213
203
|
| `rendererDir` | `string` | 内置 | 自定义 renderer HTML 目录 |
|
|
214
204
|
| `icon` | `string` | — | 窗口/任务栏图标路径(macOS 使用 app bundle 图标) |
|
|
215
205
|
| `menuBuilder` | `(mainWindow, menuContext: MenuContext) => void` | 内置菜单 | 自定义菜单构建器;`menuContext` 为收窄后的 `MenuContext`,不含 `registry`/`senderPolicy` 等内部管线 |
|
|
216
|
-
| `onSetup` | `(instance) => void
|
|
217
|
-
| `
|
|
218
|
-
| `onBeforeClose` | `(instance) => void \| Promise<void>` | — | 窗口关闭前的回调,session 关闭由框架自动处理 |
|
|
206
|
+
| `onSetup` | `(instance) => void` | — | 窗口和 context 创建后的回调,用于注册 Contribution(见下文)|
|
|
207
|
+
| `onBeforeClose` | `(instance) => void` | — | 窗口关闭前的回调,session 关闭由框架自动处理 |
|
|
219
208
|
| `window` | `WorkbenchWindowConfig` | — | 窗口尺寸覆盖 |
|
|
220
209
|
| `updateChecker` | `UpdateChecker` | — | 自定义更新检查器;提供后启用"检查更新"功能 |
|
|
221
210
|
| `updateOptions` | `{ checkInterval?, initialDelay?, getCurrentVersion? }` | — | 仅当 `updateChecker` 提供时生效,默认 1h / 5s |
|
|
@@ -231,8 +220,6 @@ src/
|
|
|
231
220
|
| `instance.ipc` | `IpcRegistry` 实例,`instance.ipc.handle(channel, fn)` 注册自定义 IPC;已绑定 `senderPolicy` 网关 |
|
|
232
221
|
| `instance.registerTrustedWindow(win)` | 把 host 自有弹窗 `BrowserWindow` 加入受信 sender 集,否则其发起的 `instance.ipc` 调用会被网关拒绝。窗口关闭即移除 |
|
|
233
222
|
|
|
234
|
-
`onSetup` 可以返回 Promise;`createWorkbenchApp().start()` 会等待 `onSetup` 解析完成后才继续后续启动流程,因此宿主在 `onSetup` 内注册的 simulator API 会早于 simulator `<webview>` 首次枚举自定义 API。
|
|
235
|
-
|
|
236
223
|
### 内置面板 ID
|
|
237
224
|
|
|
238
225
|
`'wxml'` \| `'console'` \| `'appdata'` \| `'storage'`
|
|
@@ -245,7 +232,7 @@ src/
|
|
|
245
232
|
|
|
246
233
|
## Embedding & Extending the Project Panel
|
|
247
234
|
|
|
248
|
-
宿主(如 qdmp)通过 `
|
|
235
|
+
宿主(如 qdmp)通过 `launch({...})` 嵌入 devtools 时,可对项目面板做三个正交扩展:
|
|
249
236
|
|
|
250
237
|
| 扩展点 | 用途 |
|
|
251
238
|
| --- | --- |
|
|
@@ -264,7 +251,7 @@ src/
|
|
|
264
251
|
### 最小示例
|
|
265
252
|
|
|
266
253
|
```typescript
|
|
267
|
-
import {
|
|
254
|
+
import { launch } from '@dimina-kit/devtools'
|
|
268
255
|
import type { ProjectsProvider, ProjectTemplate } from '@dimina-kit/devtools/projects-provider'
|
|
269
256
|
import { BrowserWindow } from 'electron'
|
|
270
257
|
|
|
@@ -306,7 +293,7 @@ const qdmpBlank: ProjectTemplate = {
|
|
|
306
293
|
source: { type: 'directory', path: '/abs/path/to/template' },
|
|
307
294
|
}
|
|
308
295
|
|
|
309
|
-
|
|
296
|
+
launch({
|
|
310
297
|
projectsProvider: provider,
|
|
311
298
|
projectTemplates: [qdmpBlank],
|
|
312
299
|
builtinTemplates: ['taro-todo'], // 只保留 taro-todo,干掉默认 blank
|
|
@@ -325,7 +312,7 @@ createWorkbenchApp({
|
|
|
325
312
|
win.on('closed', () => resolve(null))
|
|
326
313
|
})
|
|
327
314
|
},
|
|
328
|
-
})
|
|
315
|
+
})
|
|
329
316
|
```
|
|
330
317
|
|
|
331
318
|
### `customCreateProjectDialog` 返回值
|
|
@@ -389,13 +376,13 @@ const myAdapter: CompilationAdapter = {
|
|
|
389
376
|
|
|
390
377
|
## Preload Instrumentation
|
|
391
378
|
|
|
392
|
-
模拟器
|
|
379
|
+
模拟器 frame 注入 preload 脚本,在其全局上安装两类东西:**桥接**(把数据通道暴露到运行时全局)+ **instrumentation**(监听运行时事件并写入桥接)。内置 preload 见 `src/preload/windows/simulator.ts`(native-host simulator 跑其 `.cjs` sibling)。
|
|
393
380
|
|
|
394
381
|
### 必装:桥接
|
|
395
382
|
|
|
396
383
|
| 函数 | 作用 | 不装会怎样 |
|
|
397
384
|
| --- | --- | --- |
|
|
398
|
-
| `installSimulatorBridge()` | 暴露 `window.__simulatorData`,承载 `highlightElement` / `unhighlightElement` / `getAppdata` / `getWxml` / `getStorageSnapshot` 等只读 API(供主进程 `executeJavaScript` 拉取) | 元素选区 overlay 不显示;automation `Page.getData` 返回空对象;MCP `simulator_get_overview` 在 hints 中追加 `simulator bridge not ready (window.__simulatorData missing)
|
|
385
|
+
| `installSimulatorBridge()` | 暴露 `window.__simulatorData`,承载 `highlightElement` / `unhighlightElement` / `getAppdata` / `getWxml` / `getStorageSnapshot` 等只读 API(供主进程 `executeJavaScript` 拉取) | 元素选区 overlay 不显示;automation `Page.getData` 返回空对象;MCP `simulator_get_overview` 在 hints 中追加 `simulator bridge not ready (window.__simulatorData missing)`。注:三个右侧面板的数据都另有来源(Storage 走主进程 CDP;AppData/WXML 走主进程 `SimulatorAppDataChannel` / `SimulatorWxmlChannel`;Console 走 render-host/service-host guest preload → 主进程 `consoleLog`),均不依赖 `window.__simulatorData`,不受影响 |
|
|
399
386
|
| `installCustomApisBridge()` | 暴露 `window.__diminaCustomApis`,承载 `list` / `invoke`,让模拟器侧把主进程注册的 API 代理回小程序 runtime | `registerSimulatorApi` 注册的业务 API 在小程序里调用全部 no-op(参见下方 "Simulator 自定义 API") |
|
|
400
387
|
| `setupApiCompatHook()` | 兼容上游 API 名称变更 | 部分 API 调用兼容性问题 |
|
|
401
388
|
|
|
@@ -403,14 +390,16 @@ const myAdapter: CompilationAdapter = {
|
|
|
403
390
|
|
|
404
391
|
### 按需:instrumentation
|
|
405
392
|
|
|
406
|
-
|
|
393
|
+
这些探针是**可组合的 preload API**:`@dimina-kit/devtools/preload` 把它们导出,供下游自己拼装自定义 preload。下表是各探针自身的契约(捕获什么 + 推到哪个通道)。
|
|
407
394
|
|
|
408
395
|
| 探针 | 捕获内容 | 数据通道 |
|
|
409
396
|
| --- | --- | --- |
|
|
410
|
-
| `installConsoleInstrumentation()` | `console.*`、`window.onerror`、未捕获 rejection | `sendToHost
|
|
397
|
+
| `installConsoleInstrumentation()` | `console.*`、`window.onerror`、未捕获 rejection | `sendToHost`(guest → embedder) |
|
|
411
398
|
| `createAppDataSource()` | Worker `ub` 消息、setData / page init | miniappSnapshot 框架(`miniapp-snapshot:push`) |
|
|
412
399
|
| `createWxmlSource()` | Vue 组件树提取、MutationObserver 自动更新 | miniappSnapshot 框架(`miniapp-snapshot:push`) |
|
|
413
400
|
|
|
401
|
+
> ⚠️ **内置 native-host 运行时并不靠这条 `miniapp-snapshot:push` 通道喂面板**:右侧 WXML / AppData 面板的数据由主进程服务(`SimulatorWxmlChannel` / `SimulatorAppDataChannel`)直接供给(见下方「数据流」)。内置 simulator preload 仍调用 `createAppDataSource().start()`,但只为副作用(填 `window.__simulatorData.getAppdata()` 供 automation / MCP 读取),并**不**把它 wrap 进 `MiniappSnapshotHost`——所以 `miniapp-snapshot:push` 在内置路径下无消费者。该框架契约(含 `createWxmlSource`)仍为外部/组合式 preload 保留导出(详见 `docs/miniapp-snapshot.md`)。
|
|
402
|
+
|
|
414
403
|
> Storage 面板的数据由主进程通过 CDP `DOMStorage` 域抓取(`src/main/services/simulator-storage`),**不需要 preload 侧 instrumentation**。
|
|
415
404
|
|
|
416
405
|
各面板的数据流详见下方 "数据流" 章节。
|
|
@@ -476,7 +465,7 @@ launch({ preloadPath: '/absolute/path/to/my-preload.js' })
|
|
|
476
465
|
| `wx.getStorage(...)` 覆盖内置 | `'getStorage'`(小心:这会**屏蔽** dimina 容器的实现) |
|
|
477
466
|
|
|
478
467
|
```typescript
|
|
479
|
-
|
|
468
|
+
launch({
|
|
480
469
|
onSetup: (instance) => {
|
|
481
470
|
// 提供 wx.login 的实现(dimina 容器默认未实现,注册后才能用)
|
|
482
471
|
const dispose = instance.registerSimulatorApi('login', async ({ success }) => {
|
|
@@ -508,13 +497,12 @@ createWorkbenchApp({
|
|
|
508
497
|
`@dimina-kit/devtools` 的公共入口。`api.ts`(根入口)聚合了所有公共 API,优先从根入口导入。
|
|
509
498
|
|
|
510
499
|
```
|
|
511
|
-
@dimina-kit/devtools launch,
|
|
500
|
+
@dimina-kit/devtools launch, buildDefaultMenu,
|
|
512
501
|
openSettingsWindow, suppressEpipe, setupCdpPort,
|
|
513
502
|
createWorkbenchContext, createMainWindow,
|
|
514
503
|
createViewManager, IpcRegistry,
|
|
515
504
|
UpdateManager, createGitHubReleaseChecker, ...
|
|
516
505
|
@dimina-kit/devtools/launch launch(config?), buildDefaultMenu, openSettingsWindow
|
|
517
|
-
@dimina-kit/devtools/app createWorkbenchApp(config?)
|
|
518
506
|
@dimina-kit/devtools/types TypeScript 类型定义
|
|
519
507
|
@dimina-kit/devtools/bootstrap suppressEpipe(), setupCdpPort()
|
|
520
508
|
@dimina-kit/devtools/context createWorkbenchContext(opts),
|
|
@@ -587,21 +575,23 @@ interface WorkbenchContext {
|
|
|
587
575
|
flowchart TB
|
|
588
576
|
subgraph BW["BrowserWindow"]
|
|
589
577
|
direction TB
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
578
|
+
Z4["⑤ popoverView [顶层]<br/>entries/popover/index.html<br/>全屏透明遮罩 + 编译配置表单"]
|
|
579
|
+
Z3["④ settingsView<br/>entries/settings/index.html<br/>固定宽度 320px,右侧对齐"]
|
|
580
|
+
Z2["② simulatorView<br/>Chrome DevTools 面板(绑到活跃 render-host guest / service host)"]
|
|
581
|
+
Z1["① nativeSimulatorView : WebContentsView<br/>模拟器主进程顶层 WCV(跑 simulator/main.tsx 的 DeviceShell)<br/>partition=persist:simulator,托管每页 render-host <webview> guest"]
|
|
582
|
+
subgraph Z0["⓪ mainWindow [底层] entries/main/index.html"]
|
|
594
583
|
direction LR
|
|
595
|
-
SIM["
|
|
584
|
+
SIM["<SimulatorPanel> 占位 / 锚点<br/>(仅 nativeSimulatorView 的 bounds target,无 webview)"]
|
|
596
585
|
PNL["WXML / AppData / Storage<br/>React 中直接渲染"]
|
|
597
586
|
end
|
|
587
|
+
Z4 -. 覆盖 .-> Z3
|
|
598
588
|
Z3 -. 覆盖 .-> Z2
|
|
599
589
|
Z2 -. 覆盖 .-> Z1
|
|
600
590
|
Z1 -. 覆盖 .-> Z0
|
|
601
591
|
end
|
|
602
592
|
```
|
|
603
593
|
|
|
604
|
-
层级由 `addChildView()` 调用顺序决定,后添加的 View
|
|
594
|
+
层级由 `addChildView()` 调用顺序决定,后添加的 View 在上层。overlay 栈里有**两个不同的** simulator 相关 view:`nativeSimulatorView`(模拟器本体,主进程顶层 `WebContentsView`,跑 `simulator/main.tsx` 的 DeviceShell,内部托管每页 render-host `<webview>` guest)和 `simulatorView`(Chrome DevTools 面板本身,绑到活跃 render-host guest / service host)。模拟器**不是** mainWindow renderer 里的 `<webview>`——主 renderer 的 `<SimulatorPanel>` 只画一个空占位 div 当 `nativeSimulatorView` 的 bounds 锚点(手机框 / 圆角 / 刘海 / 页面 `<webview>` 都在那个 WCV 内部的 DeviceShell 里)。内置面板(WXML / AppData / Storage)不使用独立 WebContentsView,直接在主窗口 React 中渲染;只有 nativeSimulator / Chrome DevTools / settings / popover 需要 View 覆盖。
|
|
605
595
|
|
|
606
596
|
### 数据流
|
|
607
597
|
|
|
@@ -609,10 +599,10 @@ flowchart TB
|
|
|
609
599
|
|
|
610
600
|
| 面板 / 场景 | 模式 | 路径 |
|
|
611
601
|
| --- | --- | --- |
|
|
612
|
-
| Console | 推送 |
|
|
613
|
-
| AppData / WXML 树 | 推送 + 拉取 |
|
|
602
|
+
| Console | 推送 | render-host / service-host preload monkeypatch `console.*` → 主进程 `consoleLog` 容器消息 → bridge-router → `ctx.guestConsole.emit` → `services/console-forward`。render(视图)层条目以 `[视图]` 前缀注入挂在 service host 上的 Chrome DevTools,service 层本就原生显示在同一面板;automation WS 等外部订阅者也从这里 fan-out |
|
|
603
|
+
| AppData / WXML 树 | 推送 + 拉取 | 主进程服务,镜像 Storage 的 main→renderer 契约:WXML 由 `services/simulator-wxml` 经 render-inspect 从活跃 render-host `<webview>` guest 拉树(`SimulatorWxmlChannel.GetSnapshot`),render 活动时推 `SimulatorWxmlChannel.Event`;AppData 由 `services/simulator-appdata` 在 bridge-router 里 tap service→render 的 setData 流,推 `SimulatorAppDataChannel.Event` |
|
|
614
604
|
| Storage | 拉取 + 推送 | renderer `ipcInvoke(SimulatorStorageChannel.GetSnapshot)` → 主进程 CDP `DOMStorage` 域;变更事件由主进程通过 `SimulatorStorageChannel.Event` 推回 renderer |
|
|
615
|
-
| 元素选区 / `Page.getData` / MCP overview | 拉取 | 主进程 `webContents.executeJavaScript(...)` 或 `Runtime.evaluate(...)` 读 `window.__simulatorData.*`(由 `installSimulatorBridge`
|
|
605
|
+
| 元素选区 / `Page.getData` / MCP overview | 拉取 | 主进程 `webContents.executeJavaScript(...)` 或 `Runtime.evaluate(...)` 读 `window.__simulatorData.*`(由 `installSimulatorBridge` 暴露) |
|
|
616
606
|
|
|
617
607
|
> `src/main/ipc/panels.ts` 暴露 `panel:eval` handler 供外部 host 自定义面板复用,内置 renderer 不消费它。
|
|
618
608
|
|
|
@@ -630,14 +620,14 @@ Electron 对 `chrome.devtools.panels.create()` 的支持**长期不稳定**。
|
|
|
630
620
|
|
|
631
621
|
**影响范围**:从 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 团队无修复计划。
|
|
632
622
|
|
|
633
|
-
**当前方案**:内置面板(WXML / AppData / Storage)直接在主窗口 React
|
|
623
|
+
**当前方案**:内置面板(WXML / AppData / Storage)直接在主窗口 React 中渲染,数据由主进程服务直接供给——WXML / AppData 走 `SimulatorWxmlChannel` / `SimulatorAppDataChannel`(main → renderer 的 seed `GetSnapshot` + push `Event`),Storage 走 CDP `DOMStorage` 域(详见上方「数据流」);Chrome DevTools 仍作为独立 `WebContentsView` 通过 `setDevToolsWebContents()` 挂载。面板切换由 renderer toolbar 的 tab 栏控制,主进程负责 nativeSimulator/settings/popover View 的创建、定位和显隐。详见 `src/main/ipc/panels.ts` 和 `src/main/ipc/simulator.ts`。
|
|
634
624
|
|
|
635
625
|
---
|
|
636
626
|
|
|
637
627
|
## 调试
|
|
638
628
|
|
|
639
629
|
- **Cmd+Shift+I** / **Ctrl+Shift+I** — 打开 mainWindow 的 Electron DevTools(调试 React 渲染层)
|
|
640
|
-
-
|
|
630
|
+
- 模拟器活跃 render-host `<webview>` guest 的 Chrome DevTools 在编译完成、`dom-ready` 后自动打开
|
|
641
631
|
- 开发模式(`!app.isPackaged`)下 mainWindow DevTools 自动以 detach 模式打开
|
|
642
632
|
|
|
643
633
|
---
|
|
@@ -661,7 +651,7 @@ pnpm test # 运行测试
|
|
|
661
651
|
本工具仅用于本地开发调试。当前的安全配置:
|
|
662
652
|
|
|
663
653
|
- **Workbench 窗口**(main / settings / popover overlay)均启用 `contextIsolation` 并禁用 `nodeIntegration`;renderer 通过 main preload 经 `contextBridge` 拿到 `window.devtools.ipc`,每个 IPC handler 经 sender whitelist 校验调用方
|
|
664
|
-
- **Simulator
|
|
654
|
+
- **Simulator 本体** 是主进程顶层 `WebContentsView`(`nativeSimulatorView`,`partition='persist:simulator'`、`nodeIntegration=false`),其 preload 由 `webPreferences.preload = cjsSiblingPreloadPath(ctx.preloadPath)` 在创建时(`attachNativeSimulator`)固定;session 层的 `configureSimulatorSession()` 只设 Referer/CORS 头,不注册 frame preload。**小程序的每页代码** 运行在该 WCV 内部 DeviceShell 托管的 render-host `<webview>` guest 里(同 `persist:simulator` partition、`nodeIntegration=false`),承载逐页沙箱;guest 的 contextIsolation/sandbox 由主进程 `will-attach-webview` 钉死,渲染进程无法替换
|
|
665
655
|
- **renderer 入口** 启用了保守 CSP;`will-navigate` / `setWindowOpenHandler` 屏蔽外部跳转
|
|
666
656
|
|
|
667
657
|
仍然不要在 devtools 窗口中加载不受信任的远程内容;本工具不打算在非本地环境部署。
|
|
@@ -670,6 +660,6 @@ pnpm test # 运行测试
|
|
|
670
660
|
|
|
671
661
|
内置的 MCP server 默认关闭,由 `startMcpServer` 入口显式启动,或通过 workbench 设置中的 `mcp.enabled` 开启。开启后会在本机监听 SSE 端点,向任何可以连接到该端点的 MCP 客户端暴露一组工具,能力包括:读取 DOM 结构、截屏、拉取网络日志、触发导航等。
|
|
672
662
|
|
|
673
|
-
`workbench_evaluate` 已从 MCP 工具集中移除,workbench 只暴露只读诊断工具(截屏、console 日志、DOM、网络日志等)。`simulator_evaluate`
|
|
663
|
+
`workbench_evaluate` 已从 MCP 工具集中移除,workbench 只暴露只读诊断工具(截屏、console 日志、DOM、网络日志等)。`simulator_evaluate` 仍然保留,但小程序页面跑在 render-host `<webview>` guest 里(`nodeIntegration=false`),其 `evaluate` 仅在页面 JS 上下文执行,不具备 Node API 访问能力。
|
|
674
664
|
|
|
675
665
|
仅在连接到可信的本机 MCP 客户端或被信任的 AI 工具时启用该功能;不要在公共 WiFi、共享机器或存在远程 SSH 端口转发的场景下开启,以免监听端口被非预期的客户端访问。
|
package/dist/main/api.d.ts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
export { launch, buildDefaultMenu, openSettingsWindow } from './app/launch.js';
|
|
2
|
-
export { createWorkbenchApp } from './app/app.js';
|
|
3
2
|
export type { WorkbenchAppInstance } from './app/app.js';
|
|
4
3
|
export { suppressEpipe, setupCdpPort } from './app/bootstrap.js';
|
|
5
4
|
export { createWorkbenchContext, hasBuiltinPanel, getDefaultTab } from './services/workbench-context.js';
|
|
@@ -15,5 +14,5 @@ export { IpcRegistry } from './utils/ipc-registry.js';
|
|
|
15
14
|
export type { SenderPolicy } from './utils/ipc-registry.js';
|
|
16
15
|
export { UpdateManager, createGitHubReleaseChecker } from './services/update/index.js';
|
|
17
16
|
export type { UpdateManagerOptions, GitHubReleaseCheckerOptions, PickAssetContext, VersionScheme, } from './services/update/index.js';
|
|
18
|
-
export type {
|
|
17
|
+
export type { WorkbenchConfig, WorkbenchAppConfig, CompilationAdapter, ProjectSession, ToolbarAction, BuiltinPanelId, BuiltinModuleId, UpdateChecker, UpdateInfo, } from '../shared/types.js';
|
|
19
18
|
//# sourceMappingURL=api.d.ts.map
|
package/dist/main/api.js
CHANGED
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
// ── Primary API ──────────────────────────────────────────────────────────
|
|
2
|
+
// `launch` boots through the @dimina-kit/electron-deck framework
|
|
3
|
+
// (process-lifecycle gate + wire/trust) with the devtools RuntimeBackend
|
|
4
|
+
// supplying the full runtime. The instance builder (`createDevtoolsRuntime`) is
|
|
5
|
+
// internal — hosts integrate via `launch(config)`; the `WorkbenchAppInstance`
|
|
6
|
+
// type (what `onSetup(instance)` receives) is re-exported for typing host callbacks.
|
|
2
7
|
export { launch, buildDefaultMenu, openSettingsWindow } from './app/launch.js';
|
|
3
|
-
export { createWorkbenchApp } from './app/app.js';
|
|
4
8
|
// ── Bootstrap utilities ──────────────────────────────────────────────────
|
|
5
9
|
export { suppressEpipe, setupCdpPort } from './app/bootstrap.js';
|
|
6
10
|
// ── Context & views (for module-assembly consumers) ──────────────────────
|
package/dist/main/app/app.d.ts
CHANGED
|
@@ -4,7 +4,7 @@ import type { SimulatorApiHandler } from '../services/simulator/custom-apis.js';
|
|
|
4
4
|
import { type WorkbenchContext } from '../services/workbench-context.js';
|
|
5
5
|
import { type AutomationServer } from '../services/automation/index.js';
|
|
6
6
|
import { UpdateManager } from '../services/update/index.js';
|
|
7
|
-
import { type Disposable } from '
|
|
7
|
+
import { type Disposable } from '@dimina-kit/electron-deck/main';
|
|
8
8
|
import { IpcRegistry } from '../utils/ipc-registry.js';
|
|
9
9
|
export interface WorkbenchAppInstance {
|
|
10
10
|
mainWindow: BrowserWindow;
|
|
@@ -23,8 +23,18 @@ export interface WorkbenchAppInstance {
|
|
|
23
23
|
updateManager?: UpdateManager;
|
|
24
24
|
dispose: () => Promise<void>;
|
|
25
25
|
}
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
26
|
+
/**
|
|
27
|
+
* Pre-ready bootstrap side effects (app name, CDP port, CSP suppression,
|
|
28
|
+
* privileged scheme). MUST run before `app.whenReady()`. Extracted so the `RuntimeBackend.beforeReady` hook (which launch()
|
|
29
|
+
* routes through) runs it before the framework awaits app.whenReady().
|
|
30
|
+
*/
|
|
31
|
+
export declare function runDevtoolsBootstrap(config?: WorkbenchAppConfig): void;
|
|
32
|
+
/**
|
|
33
|
+
* Domain runtime assembly — the post-whenReady body. Builds the main window +
|
|
34
|
+
* context, registers IPC modules, stands up simulator/storage/CDP/native-host
|
|
35
|
+
* services, and returns the fat {@link WorkbenchAppInstance}. Extracted so the
|
|
36
|
+
* v2 `RuntimeBackend.assemble` reuses the exact same body (parity by shared
|
|
37
|
+
* implementation, not behavioural re-creation).
|
|
38
|
+
*/
|
|
39
|
+
export declare function createDevtoolsRuntime(config?: WorkbenchAppConfig): Promise<WorkbenchAppInstance>;
|
|
30
40
|
//# sourceMappingURL=app.d.ts.map
|