@dimina-kit/devtools 0.3.1-dev.20260513123738 → 0.3.1-dev.20260517100756
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 +153 -82
- package/dist/main/api.d.ts +6 -2
- package/dist/main/api.js +5 -2
- package/dist/main/app/app.d.ts +1 -1
- package/dist/main/app/app.js +71 -36
- package/dist/main/app/launch.d.ts +2 -2
- package/dist/main/app/launch.js +6 -3
- package/dist/main/index.bundle.js +1074 -289
- package/dist/main/ipc/app.d.ts +2 -1
- package/dist/main/ipc/app.js +5 -4
- package/dist/main/ipc/index.d.ts +5 -4
- package/dist/main/ipc/index.js +5 -4
- package/dist/main/ipc/panels.d.ts +2 -1
- package/dist/main/ipc/panels.js +14 -9
- package/dist/main/ipc/popover.d.ts +4 -1
- package/dist/main/ipc/popover.js +15 -5
- package/dist/main/ipc/projects.d.ts +4 -1
- package/dist/main/ipc/projects.js +42 -5
- package/dist/main/ipc/session.d.ts +4 -1
- package/dist/main/ipc/session.js +26 -6
- package/dist/main/ipc/settings.d.ts +4 -1
- package/dist/main/ipc/settings.js +30 -17
- package/dist/main/ipc/simulator-module.d.ts +8 -0
- package/dist/main/ipc/simulator-module.js +19 -0
- package/dist/main/ipc/simulator.d.ts +2 -1
- package/dist/main/ipc/simulator.js +29 -15
- package/dist/main/ipc/toolbar.d.ts +2 -1
- package/dist/main/ipc/toolbar.js +3 -2
- package/dist/main/services/automation/index.js +88 -13
- package/dist/main/services/mcp/server.d.ts +2 -1
- package/dist/main/services/mcp/server.js +5 -0
- package/dist/main/services/module.d.ts +18 -0
- package/dist/main/services/module.js +2 -0
- package/dist/main/services/notifications/renderer-notifier.d.ts +2 -0
- package/dist/main/services/projects/project-repository.d.ts +1 -0
- package/dist/main/services/projects/project-repository.js +3 -0
- package/dist/main/services/settings/index.d.ts +4 -0
- package/dist/main/services/settings/index.js +12 -1
- package/dist/main/services/simulator/custom-apis.d.ts +10 -0
- package/dist/main/services/simulator/custom-apis.js +26 -0
- package/dist/main/services/simulator-storage/index.d.ts +22 -1
- package/dist/main/services/simulator-storage/index.js +365 -98
- package/dist/main/services/update/update-manager.d.ts +16 -1
- package/dist/main/services/update/update-manager.js +18 -15
- package/dist/main/services/views/view-manager.d.ts +4 -0
- package/dist/main/services/views/view-manager.js +33 -2
- package/dist/main/services/window-service.d.ts +24 -0
- package/dist/main/services/window-service.js +26 -0
- package/dist/main/services/workbench-context.d.ts +15 -0
- package/dist/main/services/workbench-context.js +6 -0
- package/dist/main/services/workspace/workspace-service.d.ts +1 -0
- package/dist/main/services/workspace/workspace-service.js +7 -3
- package/dist/main/simulator-apis.d.ts +23 -0
- package/dist/main/simulator-apis.js +24 -0
- package/dist/main/utils/disposable.d.ts +13 -0
- package/dist/main/utils/disposable.js +60 -0
- package/dist/main/utils/ipc-registry.d.ts +39 -0
- package/dist/main/utils/ipc-registry.js +109 -0
- package/dist/main/utils/ipc-schema.d.ts +28 -0
- package/dist/main/utils/ipc-schema.js +38 -0
- package/dist/main/utils/paths.d.ts +6 -0
- package/dist/main/utils/paths.js +6 -0
- package/dist/main/utils/sender-policy.d.ts +23 -0
- package/dist/main/utils/sender-policy.js +42 -0
- package/dist/main/windows/main-window/create.d.ts +6 -0
- package/dist/main/windows/main-window/create.js +65 -9
- package/dist/main/windows/main-window/events.d.ts +2 -1
- package/dist/main/windows/main-window/events.js +25 -2
- package/dist/main/windows/navigation-hardening.d.ts +24 -0
- package/dist/main/windows/navigation-hardening.js +55 -0
- package/dist/main/windows/settings-window/create.js +11 -1
- package/dist/preload/index.d.ts +19 -0
- package/dist/preload/index.js +18 -0
- package/dist/preload/instrumentation/app-data.js +178 -19
- package/dist/preload/runtime/custom-apis.d.ts +6 -0
- package/dist/preload/runtime/custom-apis.js +18 -0
- package/dist/preload/runtime/host.d.ts +1 -0
- package/dist/preload/runtime/host.js +13 -0
- package/dist/preload/windows/main.cjs +47 -0
- package/dist/preload/windows/main.cjs.map +7 -0
- package/dist/preload/windows/simulator.js +174 -18
- package/dist/renderer/assets/index-DW_0thr-.js +46 -0
- package/dist/renderer/assets/{input-DxfYnzX_.js → input-C5M5Wxn6.js} +2 -2
- package/dist/renderer/assets/{ipc-transport-ClIvDcYY.js → ipc-transport-CUsl-fS2.js} +2 -2
- package/dist/renderer/assets/ipc-transport-CltRuvhi.css +1 -0
- package/dist/renderer/assets/{popover-CtXcBJtM.js → popover-BSBPVO0o.js} +2 -2
- package/dist/renderer/assets/{select-DMfp49f1.js → select-B1tF3UAc.js} +2 -2
- package/dist/renderer/assets/{settings-DteGraEU.js → settings-7w54H6p-.js} +2 -2
- package/dist/renderer/assets/settings-api-BjJalghB.js +2 -0
- package/dist/renderer/assets/workbenchSettings-q2_-nc8t.js +8 -0
- package/dist/renderer/entries/main/index.html +12 -5
- package/dist/renderer/entries/popover/index.html +7 -5
- package/dist/renderer/entries/settings/index.html +7 -5
- package/dist/renderer/entries/workbench-settings/index.html +6 -4
- package/dist/shared/ipc-channels.d.ts +22 -0
- package/dist/shared/ipc-channels.js +23 -0
- package/dist/shared/ipc-schemas.d.ts +113 -0
- package/dist/shared/ipc-schemas.js +128 -0
- package/dist/shared/types.d.ts +2 -0
- package/dist/simulator/assets/simulator-DL6kOCq-.js +9 -0
- package/dist/simulator/simulator.html +1 -1
- package/package.json +11 -27
- package/dist/preload/windows/main.d.ts +0 -6
- package/dist/preload/windows/main.js +0 -6
- package/dist/renderer/assets/index-D1p6crtf.js +0 -46
- package/dist/renderer/assets/ipc-transport-EiWxu_hG.css +0 -1
- package/dist/renderer/assets/settings-api-CY84UMpN.js +0 -2
- package/dist/renderer/assets/workbenchSettings-DjELLnSJ.js +0 -8
- package/dist/simulator/assets/simulator-C1eHXnuq.js +0 -9
package/README.md
CHANGED
|
@@ -83,6 +83,7 @@ import { app, globalShortcut } from 'electron'
|
|
|
83
83
|
import path from 'path'
|
|
84
84
|
import { createMainWindow } from '@dimina-kit/devtools/create-window'
|
|
85
85
|
import { createWorkbenchContext } from '@dimina-kit/devtools/context'
|
|
86
|
+
import { registerAppIpc } from '@dimina-kit/devtools'
|
|
86
87
|
import { registerSimulatorIpc } from '@dimina-kit/devtools/ipc-simulator'
|
|
87
88
|
import { registerPanelsIpc } from '@dimina-kit/devtools/ipc-panels'
|
|
88
89
|
import { registerToolbarIpc } from '@dimina-kit/devtools/ipc-toolbar'
|
|
@@ -95,7 +96,7 @@ import { rendererDir, defaultPreloadPath } from '@dimina-kit/devtools/paths'
|
|
|
95
96
|
app.whenReady().then(() => {
|
|
96
97
|
const mainWindow = createMainWindow({
|
|
97
98
|
title: 'My DevTools',
|
|
98
|
-
indexHtml: path.join(rendererDir, 'index.html'),
|
|
99
|
+
indexHtml: path.join(rendererDir, 'entries/main/index.html'),
|
|
99
100
|
})
|
|
100
101
|
|
|
101
102
|
const ctx = createWorkbenchContext({
|
|
@@ -105,6 +106,9 @@ app.whenReady().then(() => {
|
|
|
105
106
|
rendererDir,
|
|
106
107
|
})
|
|
107
108
|
|
|
109
|
+
// registerAppIpc 必装:renderer 启动时调用 app:getPreloadPath / app:getBranding,
|
|
110
|
+
// 缺它会卡在加载阶段。
|
|
111
|
+
registerAppIpc(ctx)
|
|
108
112
|
registerProjectsIpc(ctx)
|
|
109
113
|
registerSessionIpc(ctx)
|
|
110
114
|
registerSimulatorIpc(ctx)
|
|
@@ -112,6 +116,11 @@ app.whenReady().then(() => {
|
|
|
112
116
|
registerToolbarIpc(ctx)
|
|
113
117
|
registerPopoverIpc(ctx)
|
|
114
118
|
|
|
119
|
+
// Storage / 元素选区面板的后端 handler 由 setupSimulatorStorage 单独装。
|
|
120
|
+
// 该函数当前**未列入稳定公共 API**(在 `@dimina-kit/devtools` 之外)。
|
|
121
|
+
// 若需要这两个面板,建议改用上方的 `createWorkbenchApp({ onSetup })` 路线,
|
|
122
|
+
// 框架会自动注册;模块组装路线下你只能用不依赖它们的精简面板集。
|
|
123
|
+
|
|
115
124
|
// 添加自定义 IPC — 通过 ctx.workspace 访问会话状态
|
|
116
125
|
ipcMain.handle('my:action', () => {
|
|
117
126
|
console.log('current project:', ctx.workspace.getProjectPath())
|
|
@@ -150,9 +159,6 @@ src/
|
|
|
150
159
|
app.ts # createWorkbenchApp 工厂
|
|
151
160
|
bootstrap.ts # suppressEpipe / setupCdpPort
|
|
152
161
|
lifecycle.ts # Electron app 生命周期注册
|
|
153
|
-
windows/
|
|
154
|
-
main-window/ # 主窗口创建 + 事件接线
|
|
155
|
-
settings-window/ # 独立设置窗口
|
|
156
162
|
ipc/ # 只做 handler 注册,不写业务
|
|
157
163
|
index.ts # 聚合 register 函数导出
|
|
158
164
|
simulator.ts # simulator attach/detach/resize
|
|
@@ -166,17 +172,33 @@ src/
|
|
|
166
172
|
settings/ # 用户级 workbench 设置读写 + 主题应用
|
|
167
173
|
projects/ # 项目列表 CRUD(持久化)
|
|
168
174
|
layout/ # 布局常量 + bounds 计算
|
|
175
|
+
views/ # ViewManager(settings / popover overlay 等)
|
|
176
|
+
workspace/ # 项目会话生命周期
|
|
177
|
+
notifications/ # 主进程 → renderer 的事件通知
|
|
169
178
|
mcp/ # MCP server
|
|
170
179
|
automation/ # 自动化 WebSocket 服务
|
|
171
180
|
simulator/ # simulator dir / referer
|
|
181
|
+
simulator-storage/ # CDP DOMStorage + 元素 inspect 桥接
|
|
182
|
+
update/ # UpdateManager + GitHubReleaseChecker
|
|
172
183
|
workbench-context.ts # 共享状态类型 + 工厂 + 辅助函数
|
|
184
|
+
window-service.ts # main / settings 窗口聚合访问
|
|
185
|
+
module.ts # WorkbenchModule 协议
|
|
173
186
|
default-adapter.ts # 默认 CompilationAdapter
|
|
174
187
|
menu/ # 应用菜单
|
|
175
|
-
utils/
|
|
188
|
+
utils/
|
|
189
|
+
paths.ts # rendererDir / defaultPreloadPath / simulatorDir
|
|
190
|
+
disposable.ts # DisposableRegistry + AggregateError 聚合
|
|
191
|
+
ipc-registry.ts # ipcMain.handle 包装 + SenderPolicy 闸门
|
|
192
|
+
sender-policy.ts # sender webContents id 白名单
|
|
193
|
+
ipc-schema.ts # zod schema 校验工具
|
|
194
|
+
windows/
|
|
195
|
+
main-window/ # 主窗口创建 + 事件接线
|
|
196
|
+
settings-window/ # 独立设置窗口
|
|
197
|
+
navigation-hardening.ts # will-navigate / setWindowOpenHandler 限流
|
|
176
198
|
|
|
177
199
|
preload/ # 按注入目标分
|
|
178
200
|
windows/ # contextBridge 类型 preload
|
|
179
|
-
main.ts #
|
|
201
|
+
main.ts # workbench 三窗口 preload,仅暴露 window.devtools.ipc
|
|
180
202
|
simulator.ts # simulator webview 的默认 preload
|
|
181
203
|
shared/ # preload 之间共享
|
|
182
204
|
api-compat.ts # setupApiCompatHook
|
|
@@ -184,19 +206,20 @@ src/
|
|
|
184
206
|
types.ts
|
|
185
207
|
instrumentation/ # 注入到小程序 runtime 的探针
|
|
186
208
|
console.ts # 控制台拦截
|
|
187
|
-
storage.ts # localStorage 拦截
|
|
188
209
|
app-data.ts # Worker setData 拦截
|
|
189
|
-
wxml.ts # Vue 组件树提取
|
|
210
|
+
wxml.ts # Vue 组件树提取 + WXML 高亮 overlay
|
|
211
|
+
disposable.ts # instrumentation 共用的清理工具
|
|
190
212
|
runtime/
|
|
191
|
-
bridge.ts # installSimulatorBridge
|
|
192
|
-
|
|
213
|
+
bridge.ts # installSimulatorBridge → window.__simulatorData
|
|
214
|
+
custom-apis.ts # installCustomApisBridge → window.__diminaCustomApis
|
|
215
|
+
host.ts # sendToHost 推送封装
|
|
193
216
|
|
|
194
217
|
renderer/
|
|
195
218
|
entries/ # 各窗口 HTML + React 挂载点
|
|
196
219
|
main/ popover/ settings/ workbench-settings/
|
|
197
220
|
modules/ # 先按窗口分,再按区域
|
|
198
221
|
main/
|
|
199
|
-
|
|
222
|
+
main.tsx # 主窗口 React 根
|
|
200
223
|
features/ # 主窗口内的业务区域
|
|
201
224
|
project-runtime/ # 项目视图 + 工具栏 + 右侧面板切换
|
|
202
225
|
right-panel/ # WXML / AppData / Storage 面板
|
|
@@ -248,6 +271,8 @@ src/
|
|
|
248
271
|
| `onSetup` | `(instance) => void` | — | 窗口和 context 创建后的回调,用于注册自定义 IPC |
|
|
249
272
|
| `onBeforeClose` | `(instance) => void` | — | 窗口关闭前的回调,session 关闭由框架自动处理 |
|
|
250
273
|
| `window` | `WorkbenchWindowConfig` | — | 窗口尺寸覆盖 |
|
|
274
|
+
| `updateChecker` | `UpdateChecker` | — | 自定义更新检查器;提供后启用"检查更新"功能 |
|
|
275
|
+
| `updateOptions` | `{ checkInterval?, initialDelay?, getCurrentVersion? }` | — | 仅当 `updateChecker` 提供时生效,默认 1h / 5s |
|
|
251
276
|
|
|
252
277
|
### 内置面板 ID
|
|
253
278
|
|
|
@@ -285,37 +310,56 @@ const myAdapter: CompilationAdapter = {
|
|
|
285
310
|
|
|
286
311
|
## Preload Instrumentation
|
|
287
312
|
|
|
288
|
-
模拟器 webview 注入 preload
|
|
313
|
+
模拟器 webview 注入 preload 脚本,在 webview 全局上安装两类东西:**桥接**(把数据通道暴露到 webview)+ **instrumentation**(监听运行时事件并写入桥接)。内置 preload 见 `src/preload/windows/simulator.ts`。
|
|
289
314
|
|
|
290
|
-
|
|
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 自动更新 |
|
|
315
|
+
### 必装:桥接
|
|
296
316
|
|
|
297
|
-
|
|
317
|
+
| 函数 | 作用 | 不装会怎样 |
|
|
318
|
+
| --- | --- | --- |
|
|
319
|
+
| `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,不受影响;Console/AppData/WXML 推送走 `sendToHost`,也不受影响 |
|
|
320
|
+
| `installCustomApisBridge()` | 暴露 `window.__diminaCustomApis`,承载 `list` / `invoke`,让模拟器侧把主进程注册的 API 代理回小程序 runtime | `registerSimulatorApi` 注册的业务 API 在小程序里调用全部 no-op(参见下方 "Simulator 自定义 API") |
|
|
321
|
+
| `setupApiCompatHook()` | 兼容上游 API 名称变更 | 部分 API 调用兼容性问题 |
|
|
322
|
+
|
|
323
|
+
下游写自定义 preload 时,这三项原则上都要装。若不需要 `registerSimulatorApi`,`installCustomApisBridge` 可省略。
|
|
324
|
+
|
|
325
|
+
### 按需:instrumentation
|
|
326
|
+
|
|
327
|
+
| Instrumentation | 捕获内容 | 数据通道 |
|
|
328
|
+
| --- | --- | --- |
|
|
329
|
+
| `installConsoleInstrumentation` | `console.*`、`window.onerror`、未捕获 rejection | IPC sendToHost |
|
|
330
|
+
| `installAppDataInstrumentation` | Worker `type='u'` 消息、setData 调用 | IPC sendToHost + 写入 bridge state |
|
|
331
|
+
| `installWxmlInstrumentation` | Vue 组件树提取、MutationObserver 自动更新 | IPC sendToHost + 写入 bridge state |
|
|
332
|
+
|
|
333
|
+
> Storage 面板的数据由主进程通过 CDP `DOMStorage` 域抓取(`src/main/services/simulator-storage`),**不需要 preload 侧 instrumentation**。
|
|
334
|
+
|
|
335
|
+
各面板的数据流详见下方 "数据流" 章节。
|
|
298
336
|
|
|
299
337
|
### 自定义 Preload
|
|
300
338
|
|
|
301
|
-
|
|
339
|
+
参考 `src/preload/windows/simulator.ts`:
|
|
302
340
|
|
|
303
341
|
```typescript
|
|
304
342
|
// my-preload.ts
|
|
305
343
|
import {
|
|
306
344
|
installSimulatorBridge,
|
|
345
|
+
installCustomApisBridge,
|
|
307
346
|
installConsoleInstrumentation,
|
|
308
|
-
|
|
347
|
+
installAppDataInstrumentation,
|
|
348
|
+
installWxmlInstrumentation,
|
|
309
349
|
setupApiCompatHook,
|
|
310
350
|
} from '@dimina-kit/devtools/preload'
|
|
311
|
-
// 不需要 WXML/AppData,不导入
|
|
312
351
|
|
|
352
|
+
// 1. 兼容 hook + 桥接(必装,且应在 instrumentation 之前)
|
|
313
353
|
setupApiCompatHook()
|
|
314
354
|
installSimulatorBridge()
|
|
355
|
+
installCustomApisBridge() // 若用到 registerSimulatorApi,必装
|
|
356
|
+
|
|
357
|
+
// 2. instrumentation(按需)
|
|
315
358
|
installConsoleInstrumentation()
|
|
316
|
-
|
|
359
|
+
installAppDataInstrumentation()
|
|
360
|
+
installWxmlInstrumentation()
|
|
317
361
|
|
|
318
|
-
// 自定义 hook
|
|
362
|
+
// 3. 自定义 hook
|
|
319
363
|
window.addEventListener('error', (e) => {
|
|
320
364
|
console.error('[my-preload]', e.message)
|
|
321
365
|
})
|
|
@@ -329,49 +373,84 @@ launch({ preloadPath: '/absolute/path/to/my-preload.js' })
|
|
|
329
373
|
|
|
330
374
|
---
|
|
331
375
|
|
|
376
|
+
## Simulator 自定义 API
|
|
377
|
+
|
|
378
|
+
下游可以通过 `registerSimulatorApi` 把业务 API 注入到模拟器内运行的小程序。Handler 在 Electron **主进程**执行,能用任何 Node 能力(fs、net、原生模块、持久状态);模拟器侧拿到 `wx.<name>(params)` 调用后通过 IPC 转发到主进程,await 返回结果,handler 抛错则原型回传给小程序。
|
|
379
|
+
|
|
380
|
+
> ⚠️ 使用本功能要求模拟器 preload 调用 `installCustomApisBridge()`(详见上方 "Preload Instrumentation")。内置 preload 已包含此调用;若你用了自定义 preload 又忘记调用,注册的 API 在小程序运行时**没有任何反应**,且不会报错。
|
|
381
|
+
|
|
382
|
+
```typescript
|
|
383
|
+
import { registerSimulatorApi } from '@dimina-kit/devtools/simulator-apis'
|
|
384
|
+
|
|
385
|
+
const dispose = registerSimulatorApi('myCompany.login', async ({ username }) => {
|
|
386
|
+
// 主进程上下文:可调用内部 HTTP、读取凭证文件、访问原生模块
|
|
387
|
+
return await callInternalAuth(username)
|
|
388
|
+
})
|
|
389
|
+
|
|
390
|
+
// 不再需要时取消注册(不传也行,进程退出会一起清理)
|
|
391
|
+
dispose()
|
|
392
|
+
```
|
|
393
|
+
|
|
394
|
+
几点行为约定:
|
|
395
|
+
|
|
396
|
+
- 同名重复注册:后注册的覆盖前者,静默替换。
|
|
397
|
+
- `dispose()` 只会移除自己创建的那次注册——如果之后被别人覆盖了,旧的 disposer 是 no-op。
|
|
398
|
+
- 调用未注册的 name:小程序侧拿到 reject,错误信息里带 name。
|
|
399
|
+
- Handler 可同步或异步返回;返回值需可 JSON 序列化(IPC 限制)。
|
|
400
|
+
|
|
401
|
+
对小程序侧来说,这些 name 和内置 API(`wx.getStorage` 等)走同一个 `AppManager.apiRegistry`,没有区别。
|
|
402
|
+
|
|
403
|
+
---
|
|
404
|
+
|
|
332
405
|
## 模块导出一览
|
|
333
406
|
|
|
407
|
+
### Stable public exports
|
|
408
|
+
|
|
409
|
+
`@dimina-kit/devtools` 的稳定入口,签名遵循 semver;新版本不会做破坏性改动(除非 major bump)。
|
|
410
|
+
|
|
334
411
|
```
|
|
335
412
|
@dimina-kit/devtools launch, createWorkbenchApp, buildDefaultMenu,
|
|
336
413
|
openSettingsWindow, suppressEpipe, setupCdpPort,
|
|
337
|
-
createWorkbenchContext, createMainWindow,
|
|
338
|
-
|
|
414
|
+
createWorkbenchContext, createMainWindow,
|
|
415
|
+
createViewManager, register*Ipc,
|
|
416
|
+
registerSimulatorApi,
|
|
417
|
+
setHeaderHeight, UpdateManager,
|
|
418
|
+
createGitHubReleaseChecker, ...
|
|
419
|
+
(api.ts 聚合了所有公共 API;优先从根入口导入)
|
|
339
420
|
@dimina-kit/devtools/launch launch(config?), buildDefaultMenu, openSettingsWindow
|
|
340
421
|
@dimina-kit/devtools/app createWorkbenchApp(config?)
|
|
341
422
|
@dimina-kit/devtools/types TypeScript 类型定义
|
|
423
|
+
@dimina-kit/devtools/bootstrap suppressEpipe(), setupCdpPort()
|
|
424
|
+
@dimina-kit/devtools/paths rendererDir, defaultPreloadPath, simulatorDir,
|
|
425
|
+
getRendererDir, getPreloadDir, getRendererHtml
|
|
426
|
+
@dimina-kit/devtools/simulator-apis registerSimulatorApi(name, handler) →
|
|
427
|
+
注入由主进程托管的小程序 API(详见上方"Simulator 自定义 API")
|
|
428
|
+
@dimina-kit/devtools/preload installSimulatorBridge,
|
|
429
|
+
installCustomApisBridge,
|
|
430
|
+
installConsoleInstrumentation,
|
|
431
|
+
installAppDataInstrumentation, sendAllAppData,
|
|
432
|
+
installWxmlInstrumentation, sendWxmlTree,
|
|
433
|
+
setupWxmlObserver,
|
|
434
|
+
setupApiCompatHook
|
|
435
|
+
(storage 面板数据由主进程 CDP 抓取,无 preload 侧 hook)
|
|
436
|
+
```
|
|
437
|
+
|
|
438
|
+
### Experimental exports (v0.x — signatures may change in minor versions)
|
|
439
|
+
|
|
440
|
+
下列子路径主要用于"模块组装"等深度定制场景。在 0.x 阶段,函数签名和模块边界可能在 minor 版本之间调整;如果你不需要逐模块组装,请优先使用上方的 stable 入口或根 barrel。
|
|
441
|
+
|
|
442
|
+
```
|
|
342
443
|
@dimina-kit/devtools/context createWorkbenchContext(opts),
|
|
343
444
|
hasBuiltinPanel(ctx, panelId), getDefaultTab(ctx)
|
|
344
445
|
@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
446
|
@dimina-kit/devtools/ipc-simulator registerSimulatorIpc(ctx)
|
|
360
447
|
@dimina-kit/devtools/ipc-panels registerPanelsIpc(ctx)
|
|
361
448
|
@dimina-kit/devtools/ipc-toolbar registerToolbarIpc(ctx)
|
|
362
449
|
@dimina-kit/devtools/ipc-popover registerPopoverIpc(ctx)
|
|
363
450
|
@dimina-kit/devtools/ipc-settings registerSettingsIpc(ctx)
|
|
364
451
|
@dimina-kit/devtools/ipc-projects registerProjectsIpc(ctx)
|
|
365
|
-
@dimina-kit/devtools/ipc-session registerSessionIpc(ctx),
|
|
366
|
-
@dimina-kit/devtools/bootstrap suppressEpipe(), setupCdpPort()
|
|
452
|
+
@dimina-kit/devtools/ipc-session registerSessionIpc(ctx), sessionModule
|
|
367
453
|
@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
454
|
```
|
|
376
455
|
|
|
377
456
|
---
|
|
@@ -382,7 +461,6 @@ launch({ preloadPath: '/absolute/path/to/my-preload.js' })
|
|
|
382
461
|
|
|
383
462
|
```typescript
|
|
384
463
|
interface WorkbenchContext {
|
|
385
|
-
mainWindow: BrowserWindow
|
|
386
464
|
adapter: CompilationAdapter
|
|
387
465
|
preloadPath: string
|
|
388
466
|
rendererDir: string
|
|
@@ -391,16 +469,20 @@ interface WorkbenchContext {
|
|
|
391
469
|
appName: string
|
|
392
470
|
toolbarActions?: () => Promise<ToolbarAction[]> | ToolbarAction[]
|
|
393
471
|
brandingProvider?: () => Promise<{ appName: string }> | { appName: string }
|
|
394
|
-
workbenchSettingsWindow: BrowserWindow | null
|
|
395
472
|
|
|
396
473
|
// ── Services(运行时状态封装在内部,通过方法访问)──
|
|
474
|
+
windows: WindowService // ctx.windows.mainWindow, ctx.windows.settingsWindow, ...
|
|
397
475
|
views: ViewManager // ctx.views.repositionAll(), ctx.views.getSimulatorWebContentsId(), ...
|
|
398
476
|
notify: RendererNotifier // ctx.notify.projectStatus(), ctx.notify.windowNavigateBack(), ...
|
|
399
477
|
workspace: WorkspaceService // ctx.workspace.getProjectPath(), ctx.workspace.hasActiveSession(), ...
|
|
478
|
+
|
|
479
|
+
// ── Internal lifecycle / security (host 不直接消费) ──
|
|
480
|
+
registry: DisposableRegistry // 框架在创建时统一聚合 dispose
|
|
481
|
+
senderPolicy: SenderPolicy // IpcRegistry 自动校验 sender 白名单
|
|
400
482
|
}
|
|
401
483
|
```
|
|
402
484
|
|
|
403
|
-
|
|
485
|
+
会话和视图状态封装在对应 service 的私有闭包中,通过方法访问:
|
|
404
486
|
|
|
405
487
|
| 旧写法 | 新写法 |
|
|
406
488
|
| ---------------------------- | ----------------------------------------------------------------- |
|
|
@@ -409,6 +491,8 @@ interface WorkbenchContext {
|
|
|
409
491
|
| `ctx.simulatorWebContentsId` | `ctx.views.getSimulatorWebContentsId()` |
|
|
410
492
|
| `ctx.devToolsViewAdded` | `ctx.views.isSimulatorAdded()` |
|
|
411
493
|
| `ctx.lastSimWidth` | `ctx.views.getLastSimWidth()` |
|
|
494
|
+
| `ctx.mainWindow` | `ctx.windows.mainWindow` |
|
|
495
|
+
| `ctx.workbenchSettingsWindow`| `ctx.windows.settingsWindow` |
|
|
412
496
|
|
|
413
497
|
---
|
|
414
498
|
|
|
@@ -438,28 +522,15 @@ flowchart TB
|
|
|
438
522
|
|
|
439
523
|
### 数据流
|
|
440
524
|
|
|
441
|
-
|
|
525
|
+
按面板拆分,分**三条独立路径**:
|
|
442
526
|
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
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
|
-
```
|
|
527
|
+
| 面板 / 场景 | 模式 | 路径 |
|
|
528
|
+
| --- | --- | --- |
|
|
529
|
+
| Console / AppData / WXML 树 | 推送 | preload instrumentation 通过 `runtime/host.ts:sendToHost` 经 webview `ipcRenderer.sendToHost` 推到宿主 → renderer 监听 `ipc-message` 分发 |
|
|
530
|
+
| Storage | 拉取 + 推送 | renderer `ipcInvoke(SimulatorStorageChannel.GetSnapshot)` → 主进程 CDP `DOMStorage` 域;变更事件由主进程通过 `SimulatorStorageChannel.Event` 推回 renderer |
|
|
531
|
+
| 元素选区 / `Page.getData` / MCP overview | 拉取 | 主进程 `webContents.executeJavaScript(...)` 或 `Runtime.evaluate(...)` 读 `window.__simulatorData.*`(由 `installSimulatorBridge` 暴露) |
|
|
461
532
|
|
|
462
|
-
|
|
533
|
+
> `src/main/ipc/panels.ts` 暴露 `panel:eval` handler 供外部 host 自定义面板复用,内置 renderer 不消费它。
|
|
463
534
|
|
|
464
535
|
---
|
|
465
536
|
|
|
@@ -545,18 +616,18 @@ pnpm test # 运行测试
|
|
|
545
616
|
|
|
546
617
|
## 安全说明
|
|
547
618
|
|
|
548
|
-
|
|
549
|
-
- 为方便开发调试,BrowserWindow 启用了 `nodeIntegration` 并禁用了 `contextIsolation`,这在生产环境中存在安全风险
|
|
550
|
-
- 仅在受信任的本地开发环境中使用本工具
|
|
551
|
-
- 不要在 devtools 窗口中加载不受信任的远程内容
|
|
552
|
-
- 如需在非本地环境使用,请自行评估并加固安全配置
|
|
619
|
+
本工具仅用于本地开发调试。当前的安全配置:
|
|
553
620
|
|
|
554
|
-
|
|
621
|
+
- **Workbench 窗口**(main / settings / popover overlay)均启用 `contextIsolation` 并禁用 `nodeIntegration`;renderer 通过 main preload 经 `contextBridge` 拿到 `window.devtools.ipc`,每个 IPC handler 经 sender whitelist 校验调用方
|
|
622
|
+
- **Simulator 加载的小程序代码** 运行在独立 `<webview>` 中(`partition='persist:simulator'`、`nodeIntegration=false`),preload 由 `session.registerPreloadScript` 在 session 层固定,渲染进程无法替换
|
|
623
|
+
- **renderer 入口** 启用了保守 CSP;`will-navigate` / `setWindowOpenHandler` 屏蔽外部跳转
|
|
624
|
+
|
|
625
|
+
仍然不要在 devtools 窗口中加载不受信任的远程内容;本工具不打算在非本地环境部署。
|
|
555
626
|
|
|
556
|
-
|
|
627
|
+
### MCP Server 风险
|
|
557
628
|
|
|
558
|
-
|
|
629
|
+
内置的 MCP server 默认关闭,由 `startMcpServer` 入口显式启动,或通过 workbench 设置中的 `mcp.enabled` 开启。开启后会在本机监听 SSE 端点,向任何可以连接到该端点的 MCP 客户端暴露一组工具,能力包括:读取 DOM 结构、截屏、拉取网络日志、触发导航等。
|
|
559
630
|
|
|
560
|
-
|
|
631
|
+
`workbench_evaluate` 已从 MCP 工具集中移除,workbench 只暴露只读诊断工具(截屏、console 日志、DOM、网络日志等)。`simulator_evaluate` 仍然保留,但 simulator 使用 `<webview>`、`nodeIntegration=false`,其 `evaluate` 仅在页面 JS 上下文执行,不具备 Node API 访问能力。
|
|
561
632
|
|
|
562
|
-
|
|
633
|
+
仅在连接到可信的本机 MCP 客户端或被信任的 AI 工具时启用该功能;不要在公共 WiFi、共享机器或存在远程 SSH 端口转发的场景下开启,以免监听端口被非预期的客户端访问。
|
package/dist/main/api.d.ts
CHANGED
|
@@ -7,6 +7,10 @@ export type { WorkbenchContext, CreateContextOptions } from './services/workbenc
|
|
|
7
7
|
export { createMainWindow } from './windows/main-window/index.js';
|
|
8
8
|
export { createViewManager } from './services/views/view-manager.js';
|
|
9
9
|
export type { ViewManager } from './services/views/view-manager.js';
|
|
10
|
+
export type { WorkspaceService } from './services/workspace/workspace-service.js';
|
|
11
|
+
export type { Project, ProjectPages, ProjectSettings } from './services/projects/project-repository.js';
|
|
12
|
+
export { registerSimulatorApi } from './simulator-apis.js';
|
|
13
|
+
export type { SimulatorApiHandler } from './simulator-apis.js';
|
|
10
14
|
export { registerAppIpc } from './ipc/app.js';
|
|
11
15
|
export { registerSimulatorIpc } from './ipc/simulator.js';
|
|
12
16
|
export { registerPanelsIpc } from './ipc/panels.js';
|
|
@@ -15,8 +19,8 @@ export { registerSettingsIpc } from './ipc/settings.js';
|
|
|
15
19
|
export { registerProjectsIpc } from './ipc/projects.js';
|
|
16
20
|
export { registerSessionIpc } from './ipc/session.js';
|
|
17
21
|
export { registerToolbarIpc } from './ipc/toolbar.js';
|
|
18
|
-
export { rendererDir, defaultPreloadPath, getRendererDir, getPreloadDir, getRendererHtml } from './utils/paths.js';
|
|
19
|
-
export {
|
|
22
|
+
export { rendererDir, defaultPreloadPath, simulatorDir, getRendererDir, getPreloadDir, getRendererHtml, } from './utils/paths.js';
|
|
23
|
+
export { setHeaderHeight } from './services/layout/index.js';
|
|
20
24
|
export { UpdateManager, createGitHubReleaseChecker } from './services/update/index.js';
|
|
21
25
|
export type { UpdateManagerOptions, GitHubReleaseCheckerOptions, PickAssetContext, VersionScheme, } from './services/update/index.js';
|
|
22
26
|
export type { WorkbenchConfig, WorkbenchAppConfig, CompilationAdapter, ProjectSession, ToolbarAction, BuiltinPanelId, BuiltinModuleId, UpdateChecker, UpdateInfo, } from '../shared/types.js';
|
package/dist/main/api.js
CHANGED
|
@@ -7,6 +7,8 @@ export { suppressEpipe, setupCdpPort } from './app/bootstrap.js';
|
|
|
7
7
|
export { createWorkbenchContext, hasBuiltinPanel, getDefaultTab } from './services/workbench-context.js';
|
|
8
8
|
export { createMainWindow } from './windows/main-window/index.js';
|
|
9
9
|
export { createViewManager } from './services/views/view-manager.js';
|
|
10
|
+
// ── Simulator extension surface ──────────────────────────────────────────
|
|
11
|
+
export { registerSimulatorApi } from './simulator-apis.js';
|
|
10
12
|
// ── IPC module registration ──────────────────────────────────────────────
|
|
11
13
|
export { registerAppIpc } from './ipc/app.js';
|
|
12
14
|
export { registerSimulatorIpc } from './ipc/simulator.js';
|
|
@@ -17,8 +19,9 @@ export { registerProjectsIpc } from './ipc/projects.js';
|
|
|
17
19
|
export { registerSessionIpc } from './ipc/session.js';
|
|
18
20
|
export { registerToolbarIpc } from './ipc/toolbar.js';
|
|
19
21
|
// ── Paths ────────────────────────────────────────────────────────────────
|
|
20
|
-
export { rendererDir, defaultPreloadPath, getRendererDir, getPreloadDir, getRendererHtml } from './utils/paths.js';
|
|
21
|
-
|
|
22
|
+
export { rendererDir, defaultPreloadPath, simulatorDir, getRendererDir, getPreloadDir, getRendererHtml, } from './utils/paths.js';
|
|
23
|
+
// ── Layout ───────────────────────────────────────────────────────────────
|
|
24
|
+
export { setHeaderHeight } from './services/layout/index.js';
|
|
22
25
|
// ── Update checker ───────────────────────────────────────────────────────
|
|
23
26
|
export { UpdateManager, createGitHubReleaseChecker } from './services/update/index.js';
|
|
24
27
|
//# sourceMappingURL=api.js.map
|
package/dist/main/app/app.d.ts
CHANGED
|
@@ -12,6 +12,6 @@ export interface WorkbenchAppInstance {
|
|
|
12
12
|
}
|
|
13
13
|
export declare function createWorkbenchApp(config?: WorkbenchAppConfig): {
|
|
14
14
|
setup: () => Promise<WorkbenchAppInstance>;
|
|
15
|
-
start: () => void
|
|
15
|
+
start: () => Promise<void>;
|
|
16
16
|
};
|
|
17
17
|
//# sourceMappingURL=app.d.ts.map
|