@linkdesk/plugin-sdk 0.1.3 → 0.1.6
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/dev-host/linkdesk-mock.generated.ts +363 -0
- package/dev-host/mock.ts +63 -25
- package/dist/bin.js +40 -6
- package/dist/bin.js.map +1 -1
- package/dist/dev-real.d.ts +24 -0
- package/dist/dev-real.d.ts.map +1 -0
- package/dist/dev-real.js +286 -0
- package/dist/dev-real.js.map +1 -0
- package/dist/github-http.d.ts +30 -0
- package/dist/github-http.d.ts.map +1 -0
- package/dist/github-http.js +85 -0
- package/dist/github-http.js.map +1 -0
- package/dist/publish.d.ts +92 -0
- package/dist/publish.d.ts.map +1 -0
- package/dist/publish.js +462 -0
- package/dist/publish.js.map +1 -0
- package/dist/vite-config.d.ts +2 -0
- package/dist/vite-config.d.ts.map +1 -1
- package/dist/vite-config.js +16 -13
- package/dist/vite-config.js.map +1 -1
- package/package.json +1 -1
- package/schemas/plugin.schema.json +1 -1
|
@@ -0,0 +1,363 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 🔥 linkdesk-mock.generated.ts——dev 宿主 window.linkdesk mock 树(自动生成,勿手改)
|
|
3
|
+
*
|
|
4
|
+
* 生成源:src/core/api/linkdesk-api.ts + linkdesk-api/(LinkDeskAPI 交集——与 linkdesk.d.ts 同一标注源)
|
|
5
|
+
* 生成器:scripts/generate-contract.mjs(E6#27 第三产物,杜绝 mock/preload 双份漂移)
|
|
6
|
+
* 改契约源 → 跑 `node scripts/generate-contract.mjs`(npm run check 里 contracts:check 三产物逐字节强制)
|
|
7
|
+
*
|
|
8
|
+
* 消费方:packages/plugin-sdk/dev-host/mock.ts——injectDevMockApi() 用 Proxy 包本树:
|
|
9
|
+
* 树内方法 = 类型驱动中性默认 + 调用即打 [linkdesk-mock] 日志(mock vs 真 IPC 可感知);
|
|
10
|
+
* 树外路径(契约里不存在的方法名) = Proxy 抛「不在 linkdesk API 契约」。
|
|
11
|
+
* 默认值策略("不崩 + 可感知",详见 02-本地预览环境.md §10.2):
|
|
12
|
+
* Promise<void/…数据对象> → async 返 undefined;Promise<数组> → [];Promise<string/boolean> → ""/false;
|
|
13
|
+
* void → noop(registerCommand 等每插件必调,绝不抛);返回退订句柄(onChange 等)→ noop 函数;
|
|
14
|
+
* 其余同步 → ""/undefined。真数据/真行为走真实 IPC / linkdesk-plugin-sdk dev --real(E6#28.5)。
|
|
15
|
+
*/
|
|
16
|
+
export const linkdeskMock: Record<string, unknown> = {
|
|
17
|
+
commands: {
|
|
18
|
+
execute: async (..._args: unknown[]) => { console.info("[linkdesk-mock] commands.execute", ..._args); },
|
|
19
|
+
executeCommand: async (..._args: unknown[]) => { console.info("[linkdesk-mock] commands.executeCommand", ..._args); },
|
|
20
|
+
registerCommand: (..._args: unknown[]) => { console.info("[linkdesk-mock] commands.registerCommand", ..._args); },
|
|
21
|
+
unregisterCommands: (..._args: unknown[]) => { console.info("[linkdesk-mock] commands.unregisterCommands", ..._args); },
|
|
22
|
+
getCommands: async (..._args: unknown[]) => { console.info("[linkdesk-mock] commands.getCommands", ..._args); return []; },
|
|
23
|
+
_executeShellLocal: async (..._args: unknown[]) => { console.info("[linkdesk-mock] commands._executeShellLocal", ..._args); },
|
|
24
|
+
},
|
|
25
|
+
configuration: {
|
|
26
|
+
get: async (..._args: unknown[]) => { console.info("[linkdesk-mock] configuration.get", ..._args); },
|
|
27
|
+
set: async (..._args: unknown[]) => { console.info("[linkdesk-mock] configuration.set", ..._args); },
|
|
28
|
+
getSchema: async (..._args: unknown[]) => { console.info("[linkdesk-mock] configuration.getSchema", ..._args); },
|
|
29
|
+
onChange: (..._args: unknown[]) => { console.info("[linkdesk-mock] configuration.onChange", ..._args); return () => {}; },
|
|
30
|
+
getConfigurationContributions: async (..._args: unknown[]) => { console.info("[linkdesk-mock] configuration.getConfigurationContributions", ..._args); return []; },
|
|
31
|
+
inspectConfiguration: async (..._args: unknown[]) => { console.info("[linkdesk-mock] configuration.inspectConfiguration", ..._args); },
|
|
32
|
+
getUserSettings: async (..._args: unknown[]) => { console.info("[linkdesk-mock] configuration.getUserSettings", ..._args); },
|
|
33
|
+
onDidChangeConfiguration: (..._args: unknown[]) => { console.info("[linkdesk-mock] configuration.onDidChangeConfiguration", ..._args); return () => {}; },
|
|
34
|
+
onPluginLifecycleChange: (..._args: unknown[]) => { console.info("[linkdesk-mock] configuration.onPluginLifecycleChange", ..._args); return () => {}; },
|
|
35
|
+
consumeSettingsGroup: async (..._args: unknown[]) => { console.info("[linkdesk-mock] configuration.consumeSettingsGroup", ..._args); },
|
|
36
|
+
onRequestSettingsGroup: (..._args: unknown[]) => { console.info("[linkdesk-mock] configuration.onRequestSettingsGroup", ..._args); return () => {}; },
|
|
37
|
+
consumeScrollToSetting: async (..._args: unknown[]) => { console.info("[linkdesk-mock] configuration.consumeScrollToSetting", ..._args); },
|
|
38
|
+
onRequestScrollToSetting: (..._args: unknown[]) => { console.info("[linkdesk-mock] configuration.onRequestScrollToSetting", ..._args); return () => {}; },
|
|
39
|
+
consumeOpenKeybindings: async (..._args: unknown[]) => { console.info("[linkdesk-mock] configuration.consumeOpenKeybindings", ..._args); },
|
|
40
|
+
onRequestOpenKeybindings: (..._args: unknown[]) => { console.info("[linkdesk-mock] configuration.onRequestOpenKeybindings", ..._args); return () => {}; },
|
|
41
|
+
},
|
|
42
|
+
config: {
|
|
43
|
+
get: async (..._args: unknown[]) => { console.info("[linkdesk-mock] config.get", ..._args); },
|
|
44
|
+
set: async (..._args: unknown[]) => { console.info("[linkdesk-mock] config.set", ..._args); },
|
|
45
|
+
getSchema: async (..._args: unknown[]) => { console.info("[linkdesk-mock] config.getSchema", ..._args); },
|
|
46
|
+
onChange: (..._args: unknown[]) => { console.info("[linkdesk-mock] config.onChange", ..._args); return () => {}; },
|
|
47
|
+
getConfigurationContributions: async (..._args: unknown[]) => { console.info("[linkdesk-mock] config.getConfigurationContributions", ..._args); return []; },
|
|
48
|
+
inspectConfiguration: async (..._args: unknown[]) => { console.info("[linkdesk-mock] config.inspectConfiguration", ..._args); },
|
|
49
|
+
getUserSettings: async (..._args: unknown[]) => { console.info("[linkdesk-mock] config.getUserSettings", ..._args); },
|
|
50
|
+
onDidChangeConfiguration: (..._args: unknown[]) => { console.info("[linkdesk-mock] config.onDidChangeConfiguration", ..._args); return () => {}; },
|
|
51
|
+
onPluginLifecycleChange: (..._args: unknown[]) => { console.info("[linkdesk-mock] config.onPluginLifecycleChange", ..._args); return () => {}; },
|
|
52
|
+
consumeSettingsGroup: async (..._args: unknown[]) => { console.info("[linkdesk-mock] config.consumeSettingsGroup", ..._args); },
|
|
53
|
+
onRequestSettingsGroup: (..._args: unknown[]) => { console.info("[linkdesk-mock] config.onRequestSettingsGroup", ..._args); return () => {}; },
|
|
54
|
+
consumeScrollToSetting: async (..._args: unknown[]) => { console.info("[linkdesk-mock] config.consumeScrollToSetting", ..._args); },
|
|
55
|
+
onRequestScrollToSetting: (..._args: unknown[]) => { console.info("[linkdesk-mock] config.onRequestScrollToSetting", ..._args); return () => {}; },
|
|
56
|
+
consumeOpenKeybindings: async (..._args: unknown[]) => { console.info("[linkdesk-mock] config.consumeOpenKeybindings", ..._args); },
|
|
57
|
+
onRequestOpenKeybindings: (..._args: unknown[]) => { console.info("[linkdesk-mock] config.onRequestOpenKeybindings", ..._args); return () => {}; },
|
|
58
|
+
},
|
|
59
|
+
theme: {
|
|
60
|
+
getCurrent: async (..._args: unknown[]) => { console.info("[linkdesk-mock] theme.getCurrent", ..._args); return ""; },
|
|
61
|
+
getAvailable: async (..._args: unknown[]) => { console.info("[linkdesk-mock] theme.getAvailable", ..._args); return []; },
|
|
62
|
+
apply: async (..._args: unknown[]) => { console.info("[linkdesk-mock] theme.apply", ..._args); },
|
|
63
|
+
listRecipes: async (..._args: unknown[]) => { console.info("[linkdesk-mock] theme.listRecipes", ..._args); return []; },
|
|
64
|
+
getActive: async (..._args: unknown[]) => { console.info("[linkdesk-mock] theme.getActive", ..._args); },
|
|
65
|
+
getEffectiveTokens: async (..._args: unknown[]) => { console.info("[linkdesk-mock] theme.getEffectiveTokens", ..._args); },
|
|
66
|
+
setRecipe: async (..._args: unknown[]) => { console.info("[linkdesk-mock] theme.setRecipe", ..._args); },
|
|
67
|
+
setColorway: async (..._args: unknown[]) => { console.info("[linkdesk-mock] theme.setColorway", ..._args); },
|
|
68
|
+
resetAppearance: async (..._args: unknown[]) => { console.info("[linkdesk-mock] theme.resetAppearance", ..._args); },
|
|
69
|
+
resetMix: async (..._args: unknown[]) => { console.info("[linkdesk-mock] theme.resetMix", ..._args); },
|
|
70
|
+
getBaselineSeeds: async (..._args: unknown[]) => { console.info("[linkdesk-mock] theme.getBaselineSeeds", ..._args); },
|
|
71
|
+
},
|
|
72
|
+
language: {
|
|
73
|
+
getCurrent: async (..._args: unknown[]) => { console.info("[linkdesk-mock] language.getCurrent", ..._args); return ""; },
|
|
74
|
+
getAvailable: async (..._args: unknown[]) => { console.info("[linkdesk-mock] language.getAvailable", ..._args); return []; },
|
|
75
|
+
set: async (..._args: unknown[]) => { console.info("[linkdesk-mock] language.set", ..._args); },
|
|
76
|
+
getInitial: (..._args: unknown[]) => { console.info("[linkdesk-mock] language.getInitial", ..._args); },
|
|
77
|
+
onChange: (..._args: unknown[]) => { console.info("[linkdesk-mock] language.onChange", ..._args); return () => {}; },
|
|
78
|
+
},
|
|
79
|
+
appearance: {
|
|
80
|
+
importImage: async (..._args: unknown[]) => { console.info("[linkdesk-mock] appearance.importImage", ..._args); return ""; },
|
|
81
|
+
revealStorage: async (..._args: unknown[]) => { console.info("[linkdesk-mock] appearance.revealStorage", ..._args); },
|
|
82
|
+
},
|
|
83
|
+
tabs: {
|
|
84
|
+
create: async (..._args: unknown[]) => { console.info("[linkdesk-mock] tabs.create", ..._args); },
|
|
85
|
+
openOrFocus: async (..._args: unknown[]) => { console.info("[linkdesk-mock] tabs.openOrFocus", ..._args); },
|
|
86
|
+
focus: async (..._args: unknown[]) => { console.info("[linkdesk-mock] tabs.focus", ..._args); },
|
|
87
|
+
close: async (..._args: unknown[]) => { console.info("[linkdesk-mock] tabs.close", ..._args); },
|
|
88
|
+
focusBySourceId: async (..._args: unknown[]) => { console.info("[linkdesk-mock] tabs.focusBySourceId", ..._args); },
|
|
89
|
+
updateLabelBySourceId: async (..._args: unknown[]) => { console.info("[linkdesk-mock] tabs.updateLabelBySourceId", ..._args); },
|
|
90
|
+
closeBySourceId: async (..._args: unknown[]) => { console.info("[linkdesk-mock] tabs.closeBySourceId", ..._args); },
|
|
91
|
+
onDidChangeActiveTab: (..._args: unknown[]) => { console.info("[linkdesk-mock] tabs.onDidChangeActiveTab", ..._args); return () => {}; },
|
|
92
|
+
},
|
|
93
|
+
keybindings: {
|
|
94
|
+
getKeybindings: async (..._args: unknown[]) => { console.info("[linkdesk-mock] keybindings.getKeybindings", ..._args); return []; },
|
|
95
|
+
getConflicts: async (..._args: unknown[]) => { console.info("[linkdesk-mock] keybindings.getConflicts", ..._args); },
|
|
96
|
+
registerKeybinding: async (..._args: unknown[]) => { console.info("[linkdesk-mock] keybindings.registerKeybinding", ..._args); },
|
|
97
|
+
saveUserKeybindings: async (..._args: unknown[]) => { console.info("[linkdesk-mock] keybindings.saveUserKeybindings", ..._args); },
|
|
98
|
+
removeKeybindingForCommand: async (..._args: unknown[]) => { console.info("[linkdesk-mock] keybindings.removeKeybindingForCommand", ..._args); },
|
|
99
|
+
resetKeybindingToDefault: async (..._args: unknown[]) => { console.info("[linkdesk-mock] keybindings.resetKeybindingToDefault", ..._args); },
|
|
100
|
+
findKeybindingForCommand: async (..._args: unknown[]) => { console.info("[linkdesk-mock] keybindings.findKeybindingForCommand", ..._args); },
|
|
101
|
+
setKeybindingCaptureActive: async (..._args: unknown[]) => { console.info("[linkdesk-mock] keybindings.setKeybindingCaptureActive", ..._args); },
|
|
102
|
+
keyboardEventToKeyString: (..._args: unknown[]) => { console.info("[linkdesk-mock] keybindings.keyboardEventToKeyString", ..._args); return ""; },
|
|
103
|
+
onChange: (..._args: unknown[]) => { console.info("[linkdesk-mock] keybindings.onChange", ..._args); return () => {}; },
|
|
104
|
+
syncToMainProcess: async (..._args: unknown[]) => { console.info("[linkdesk-mock] keybindings.syncToMainProcess", ..._args); },
|
|
105
|
+
onForwardedEvent: (..._args: unknown[]) => { console.info("[linkdesk-mock] keybindings.onForwardedEvent", ..._args); return () => {}; },
|
|
106
|
+
},
|
|
107
|
+
notifications: {
|
|
108
|
+
show: async (..._args: unknown[]) => { console.info("[linkdesk-mock] notifications.show", ..._args); },
|
|
109
|
+
},
|
|
110
|
+
menu: {
|
|
111
|
+
registerItems: async (..._args: unknown[]) => { console.info("[linkdesk-mock] menu.registerItems", ..._args); },
|
|
112
|
+
getItems: async (..._args: unknown[]) => { console.info("[linkdesk-mock] menu.getItems", ..._args); return []; },
|
|
113
|
+
},
|
|
114
|
+
contextKey: {
|
|
115
|
+
set: async (..._args: unknown[]) => { console.info("[linkdesk-mock] contextKey.set", ..._args); },
|
|
116
|
+
_getValue: (..._args: unknown[]) => { console.info("[linkdesk-mock] contextKey._getValue", ..._args); },
|
|
117
|
+
},
|
|
118
|
+
dialog: {
|
|
119
|
+
confirm: async (..._args: unknown[]) => { console.info("[linkdesk-mock] dialog.confirm", ..._args); return false; },
|
|
120
|
+
alert: async (..._args: unknown[]) => { console.info("[linkdesk-mock] dialog.alert", ..._args); },
|
|
121
|
+
open: async (..._args: unknown[]) => { console.info("[linkdesk-mock] dialog.open", ..._args); },
|
|
122
|
+
openFile: async (..._args: unknown[]) => { console.info("[linkdesk-mock] dialog.openFile", ..._args); },
|
|
123
|
+
},
|
|
124
|
+
quickPick: {
|
|
125
|
+
show: async (..._args: unknown[]) => { console.info("[linkdesk-mock] quickPick.show", ..._args); },
|
|
126
|
+
},
|
|
127
|
+
quickPickHost: {
|
|
128
|
+
registerHost: (..._args: unknown[]) => { console.info("[linkdesk-mock] quickPickHost.registerHost", ..._args); return () => {}; },
|
|
129
|
+
onShow: (..._args: unknown[]) => { console.info("[linkdesk-mock] quickPickHost.onShow", ..._args); return () => {}; },
|
|
130
|
+
select: (..._args: unknown[]) => { console.info("[linkdesk-mock] quickPickHost.select", ..._args); },
|
|
131
|
+
highlight: (..._args: unknown[]) => { console.info("[linkdesk-mock] quickPickHost.highlight", ..._args); },
|
|
132
|
+
close: (..._args: unknown[]) => { console.info("[linkdesk-mock] quickPickHost.close", ..._args); },
|
|
133
|
+
itemAction: (..._args: unknown[]) => { console.info("[linkdesk-mock] quickPickHost.itemAction", ..._args); },
|
|
134
|
+
},
|
|
135
|
+
toast: {
|
|
136
|
+
onShow: (..._args: unknown[]) => { console.info("[linkdesk-mock] toast.onShow", ..._args); return () => {}; },
|
|
137
|
+
dismiss: (..._args: unknown[]) => { console.info("[linkdesk-mock] toast.dismiss", ..._args); },
|
|
138
|
+
action: (..._args: unknown[]) => { console.info("[linkdesk-mock] toast.action", ..._args); },
|
|
139
|
+
},
|
|
140
|
+
dialogHost: {
|
|
141
|
+
onShow: (..._args: unknown[]) => { console.info("[linkdesk-mock] dialogHost.onShow", ..._args); return () => {}; },
|
|
142
|
+
confirm: (..._args: unknown[]) => { console.info("[linkdesk-mock] dialogHost.confirm", ..._args); },
|
|
143
|
+
cancel: (..._args: unknown[]) => { console.info("[linkdesk-mock] dialogHost.cancel", ..._args); },
|
|
144
|
+
},
|
|
145
|
+
floatingPanelHost: {
|
|
146
|
+
onShow: (..._args: unknown[]) => { console.info("[linkdesk-mock] floatingPanelHost.onShow", ..._args); return () => {}; },
|
|
147
|
+
action: (..._args: unknown[]) => { console.info("[linkdesk-mock] floatingPanelHost.action", ..._args); },
|
|
148
|
+
},
|
|
149
|
+
serial: {
|
|
150
|
+
listPorts: async (..._args: unknown[]) => { console.info("[linkdesk-mock] serial.listPorts", ..._args); return []; },
|
|
151
|
+
getStatus: async (..._args: unknown[]) => { console.info("[linkdesk-mock] serial.getStatus", ..._args); return []; },
|
|
152
|
+
openPort: async (..._args: unknown[]) => { console.info("[linkdesk-mock] serial.openPort", ..._args); },
|
|
153
|
+
closePort: async (..._args: unknown[]) => { console.info("[linkdesk-mock] serial.closePort", ..._args); },
|
|
154
|
+
sendData: async (..._args: unknown[]) => { console.info("[linkdesk-mock] serial.sendData", ..._args); },
|
|
155
|
+
sendText: async (..._args: unknown[]) => { console.info("[linkdesk-mock] serial.sendText", ..._args); },
|
|
156
|
+
setDtr: async (..._args: unknown[]) => { console.info("[linkdesk-mock] serial.setDtr", ..._args); },
|
|
157
|
+
setRts: async (..._args: unknown[]) => { console.info("[linkdesk-mock] serial.setRts", ..._args); },
|
|
158
|
+
onData: (..._args: unknown[]) => { console.info("[linkdesk-mock] serial.onData", ..._args); return () => {}; },
|
|
159
|
+
onStats: (..._args: unknown[]) => { console.info("[linkdesk-mock] serial.onStats", ..._args); return () => {}; },
|
|
160
|
+
onSystem: (..._args: unknown[]) => { console.info("[linkdesk-mock] serial.onSystem", ..._args); return () => {}; },
|
|
161
|
+
},
|
|
162
|
+
clipboard: {
|
|
163
|
+
readText: async (..._args: unknown[]) => { console.info("[linkdesk-mock] clipboard.readText", ..._args); return ""; },
|
|
164
|
+
writeText: async (..._args: unknown[]) => { console.info("[linkdesk-mock] clipboard.writeText", ..._args); },
|
|
165
|
+
writeFileList: async (..._args: unknown[]) => { console.info("[linkdesk-mock] clipboard.writeFileList", ..._args); },
|
|
166
|
+
},
|
|
167
|
+
p2p: {
|
|
168
|
+
send: (..._args: unknown[]) => { console.info("[linkdesk-mock] p2p.send", ..._args); },
|
|
169
|
+
on: (..._args: unknown[]) => { console.info("[linkdesk-mock] p2p.on", ..._args); return () => {}; },
|
|
170
|
+
},
|
|
171
|
+
events: {
|
|
172
|
+
on: (..._args: unknown[]) => { console.info("[linkdesk-mock] events.on", ..._args); return () => {}; },
|
|
173
|
+
emit: (..._args: unknown[]) => { console.info("[linkdesk-mock] events.emit", ..._args); },
|
|
174
|
+
heartbeat: (..._args: unknown[]) => { console.info("[linkdesk-mock] events.heartbeat", ..._args); },
|
|
175
|
+
notifyTheme: (..._args: unknown[]) => { console.info("[linkdesk-mock] events.notifyTheme", ..._args); },
|
|
176
|
+
},
|
|
177
|
+
pluginState: {
|
|
178
|
+
get: async (..._args: unknown[]) => { console.info("[linkdesk-mock] pluginState.get", ..._args); },
|
|
179
|
+
set: async (..._args: unknown[]) => { console.info("[linkdesk-mock] pluginState.set", ..._args); },
|
|
180
|
+
onChange: (..._args: unknown[]) => { console.info("[linkdesk-mock] pluginState.onChange", ..._args); return () => {}; },
|
|
181
|
+
},
|
|
182
|
+
workspace: {
|
|
183
|
+
getFolders: async (..._args: unknown[]) => { console.info("[linkdesk-mock] workspace.getFolders", ..._args); return []; },
|
|
184
|
+
getActive: async (..._args: unknown[]) => { console.info("[linkdesk-mock] workspace.getActive", ..._args); },
|
|
185
|
+
setActive: async (..._args: unknown[]) => { console.info("[linkdesk-mock] workspace.setActive", ..._args); },
|
|
186
|
+
openFolder: async (..._args: unknown[]) => { console.info("[linkdesk-mock] workspace.openFolder", ..._args); },
|
|
187
|
+
addFolder: async (..._args: unknown[]) => { console.info("[linkdesk-mock] workspace.addFolder", ..._args); },
|
|
188
|
+
removeFolder: async (..._args: unknown[]) => { console.info("[linkdesk-mock] workspace.removeFolder", ..._args); },
|
|
189
|
+
onDidChangeFolders: (..._args: unknown[]) => { console.info("[linkdesk-mock] workspace.onDidChangeFolders", ..._args); return () => {}; },
|
|
190
|
+
onDidChangeActiveWorkspace: (..._args: unknown[]) => { console.info("[linkdesk-mock] workspace.onDidChangeActiveWorkspace", ..._args); return () => {}; },
|
|
191
|
+
},
|
|
192
|
+
filesystem: {
|
|
193
|
+
readTextFile: async (..._args: unknown[]) => { console.info("[linkdesk-mock] filesystem.readTextFile", ..._args); return ""; },
|
|
194
|
+
writeTextFile: async (..._args: unknown[]) => { console.info("[linkdesk-mock] filesystem.writeTextFile", ..._args); },
|
|
195
|
+
exists: async (..._args: unknown[]) => { console.info("[linkdesk-mock] filesystem.exists", ..._args); return false; },
|
|
196
|
+
createDir: async (..._args: unknown[]) => { console.info("[linkdesk-mock] filesystem.createDir", ..._args); },
|
|
197
|
+
copy: async (..._args: unknown[]) => { console.info("[linkdesk-mock] filesystem.copy", ..._args); },
|
|
198
|
+
rename: async (..._args: unknown[]) => { console.info("[linkdesk-mock] filesystem.rename", ..._args); },
|
|
199
|
+
remove: async (..._args: unknown[]) => { console.info("[linkdesk-mock] filesystem.remove", ..._args); },
|
|
200
|
+
listDir: async (..._args: unknown[]) => { console.info("[linkdesk-mock] filesystem.listDir", ..._args); return []; },
|
|
201
|
+
readBinaryFile: async (..._args: unknown[]) => { console.info("[linkdesk-mock] filesystem.readBinaryFile", ..._args); },
|
|
202
|
+
writeBinaryFile: async (..._args: unknown[]) => { console.info("[linkdesk-mock] filesystem.writeBinaryFile", ..._args); },
|
|
203
|
+
watch: async (..._args: unknown[]) => { console.info("[linkdesk-mock] filesystem.watch", ..._args); },
|
|
204
|
+
readdir: async (..._args: unknown[]) => { console.info("[linkdesk-mock] filesystem.readdir", ..._args); return []; },
|
|
205
|
+
},
|
|
206
|
+
path: {
|
|
207
|
+
appDataDir: async (..._args: unknown[]) => { console.info("[linkdesk-mock] path.appDataDir", ..._args); return ""; },
|
|
208
|
+
normalize: (..._args: unknown[]) => { console.info("[linkdesk-mock] path.normalize", ..._args); return ""; },
|
|
209
|
+
join: (..._args: unknown[]) => { console.info("[linkdesk-mock] path.join", ..._args); return ""; },
|
|
210
|
+
basename: (..._args: unknown[]) => { console.info("[linkdesk-mock] path.basename", ..._args); return ""; },
|
|
211
|
+
dirname: (..._args: unknown[]) => { console.info("[linkdesk-mock] path.dirname", ..._args); return ""; },
|
|
212
|
+
extname: (..._args: unknown[]) => { console.info("[linkdesk-mock] path.extname", ..._args); return ""; },
|
|
213
|
+
},
|
|
214
|
+
env: {
|
|
215
|
+
get: async (..._args: unknown[]) => { console.info("[linkdesk-mock] env.get", ..._args); },
|
|
216
|
+
},
|
|
217
|
+
search: {
|
|
218
|
+
searchFiles: async (..._args: unknown[]) => { console.info("[linkdesk-mock] search.searchFiles", ..._args); return []; },
|
|
219
|
+
},
|
|
220
|
+
encoding: {
|
|
221
|
+
detect: async (..._args: unknown[]) => { console.info("[linkdesk-mock] encoding.detect", ..._args); return ""; },
|
|
222
|
+
decode: async (..._args: unknown[]) => { console.info("[linkdesk-mock] encoding.decode", ..._args); return ""; },
|
|
223
|
+
encode: async (..._args: unknown[]) => { console.info("[linkdesk-mock] encoding.encode", ..._args); },
|
|
224
|
+
},
|
|
225
|
+
decorations: {
|
|
226
|
+
registerProvider: (..._args: unknown[]) => { console.info("[linkdesk-mock] decorations.registerProvider", ..._args); },
|
|
227
|
+
unregisterProvider: (..._args: unknown[]) => { console.info("[linkdesk-mock] decorations.unregisterProvider", ..._args); },
|
|
228
|
+
getDecoration: async (..._args: unknown[]) => { console.info("[linkdesk-mock] decorations.getDecoration", ..._args); },
|
|
229
|
+
onDidChange: (..._args: unknown[]) => { console.info("[linkdesk-mock] decorations.onDidChange", ..._args); return () => {}; },
|
|
230
|
+
},
|
|
231
|
+
fileAssociation: {
|
|
232
|
+
getPluginFor: async (..._args: unknown[]) => { console.info("[linkdesk-mock] fileAssociation.getPluginFor", ..._args); },
|
|
233
|
+
},
|
|
234
|
+
langDef: {
|
|
235
|
+
get: async (..._args: unknown[]) => { console.info("[linkdesk-mock] langDef.get", ..._args); },
|
|
236
|
+
},
|
|
237
|
+
lsp: {
|
|
238
|
+
spawn: async (..._args: unknown[]) => { console.info("[linkdesk-mock] lsp.spawn", ..._args); return ""; },
|
|
239
|
+
write: (..._args: unknown[]) => { console.info("[linkdesk-mock] lsp.write", ..._args); },
|
|
240
|
+
dispose: async (..._args: unknown[]) => { console.info("[linkdesk-mock] lsp.dispose", ..._args); },
|
|
241
|
+
onData: (..._args: unknown[]) => { console.info("[linkdesk-mock] lsp.onData", ..._args); return () => {}; },
|
|
242
|
+
},
|
|
243
|
+
protocol: {
|
|
244
|
+
listProtocols: async (..._args: unknown[]) => { console.info("[linkdesk-mock] protocol.listProtocols", ..._args); return []; },
|
|
245
|
+
getActiveProtocolId: async (..._args: unknown[]) => { console.info("[linkdesk-mock] protocol.getActiveProtocolId", ..._args); return ""; },
|
|
246
|
+
setActiveProtocolId: async (..._args: unknown[]) => { console.info("[linkdesk-mock] protocol.setActiveProtocolId", ..._args); },
|
|
247
|
+
},
|
|
248
|
+
viewContainer: {
|
|
249
|
+
getViewContainer: async (..._args: unknown[]) => { console.info("[linkdesk-mock] viewContainer.getViewContainer", ..._args); },
|
|
250
|
+
getViews: async (..._args: unknown[]) => { console.info("[linkdesk-mock] viewContainer.getViews", ..._args); return []; },
|
|
251
|
+
getView: async (..._args: unknown[]) => { console.info("[linkdesk-mock] viewContainer.getView", ..._args); },
|
|
252
|
+
registerView: async (..._args: unknown[]) => { console.info("[linkdesk-mock] viewContainer.registerView", ..._args); },
|
|
253
|
+
},
|
|
254
|
+
plugins: {
|
|
255
|
+
resolvePath: async (..._args: unknown[]) => { console.info("[linkdesk-mock] plugins.resolvePath", ..._args); return ""; },
|
|
256
|
+
resolveEntry: async (..._args: unknown[]) => { console.info("[linkdesk-mock] plugins.resolveEntry", ..._args); },
|
|
257
|
+
listDirs: async (..._args: unknown[]) => { console.info("[linkdesk-mock] plugins.listDirs", ..._args); return []; },
|
|
258
|
+
listAll: async (..._args: unknown[]) => { console.info("[linkdesk-mock] plugins.listAll", ..._args); return []; },
|
|
259
|
+
listDisabledDirs: async (..._args: unknown[]) => { console.info("[linkdesk-mock] plugins.listDisabledDirs", ..._args); return []; },
|
|
260
|
+
readManifest: async (..._args: unknown[]) => { console.info("[linkdesk-mock] plugins.readManifest", ..._args); return ""; },
|
|
261
|
+
readAllManifests: async (..._args: unknown[]) => { console.info("[linkdesk-mock] plugins.readAllManifests", ..._args); },
|
|
262
|
+
packageDownload: async (..._args: unknown[]) => { console.info("[linkdesk-mock] plugins.packageDownload", ..._args); },
|
|
263
|
+
packageExtract: async (..._args: unknown[]) => { console.info("[linkdesk-mock] plugins.packageExtract", ..._args); },
|
|
264
|
+
packageUpdateCheck: async (..._args: unknown[]) => { console.info("[linkdesk-mock] plugins.packageUpdateCheck", ..._args); },
|
|
265
|
+
packageStageUpdate: async (..._args: unknown[]) => { console.info("[linkdesk-mock] plugins.packageStageUpdate", ..._args); },
|
|
266
|
+
packageCommitUpdate: async (..._args: unknown[]) => { console.info("[linkdesk-mock] plugins.packageCommitUpdate", ..._args); },
|
|
267
|
+
},
|
|
268
|
+
pluginManager: {
|
|
269
|
+
list: async (..._args: unknown[]) => { console.info("[linkdesk-mock] pluginManager.list", ..._args); return []; },
|
|
270
|
+
enable: async (..._args: unknown[]) => { console.info("[linkdesk-mock] pluginManager.enable", ..._args); },
|
|
271
|
+
disable: async (..._args: unknown[]) => { console.info("[linkdesk-mock] pluginManager.disable", ..._args); },
|
|
272
|
+
uninstall: async (..._args: unknown[]) => { console.info("[linkdesk-mock] pluginManager.uninstall", ..._args); },
|
|
273
|
+
install: async (..._args: unknown[]) => { console.info("[linkdesk-mock] pluginManager.install", ..._args); },
|
|
274
|
+
installWithProgress: async (..._args: unknown[]) => { console.info("[linkdesk-mock] pluginManager.installWithProgress", ..._args); },
|
|
275
|
+
reinstall: async (..._args: unknown[]) => { console.info("[linkdesk-mock] pluginManager.reinstall", ..._args); },
|
|
276
|
+
getDisabled: async (..._args: unknown[]) => { console.info("[linkdesk-mock] pluginManager.getDisabled", ..._args); return []; },
|
|
277
|
+
getUninstalled: async (..._args: unknown[]) => { console.info("[linkdesk-mock] pluginManager.getUninstalled", ..._args); return []; },
|
|
278
|
+
isDisabled: async (..._args: unknown[]) => { console.info("[linkdesk-mock] pluginManager.isDisabled", ..._args); return false; },
|
|
279
|
+
update: async (..._args: unknown[]) => { console.info("[linkdesk-mock] pluginManager.update", ..._args); },
|
|
280
|
+
checkUpdates: async (..._args: unknown[]) => { console.info("[linkdesk-mock] pluginManager.checkUpdates", ..._args); },
|
|
281
|
+
notifyManifestChanged: (..._args: unknown[]) => { console.info("[linkdesk-mock] pluginManager.notifyManifestChanged", ..._args); },
|
|
282
|
+
},
|
|
283
|
+
bridge: {
|
|
284
|
+
onRequest: (..._args: unknown[]) => { console.info("[linkdesk-mock] bridge.onRequest", ..._args); return () => {}; },
|
|
285
|
+
respond: (..._args: unknown[]) => { console.info("[linkdesk-mock] bridge.respond", ..._args); },
|
|
286
|
+
broadcast: (..._args: unknown[]) => { console.info("[linkdesk-mock] bridge.broadcast", ..._args); },
|
|
287
|
+
notifyConfigChanged: (..._args: unknown[]) => { console.info("[linkdesk-mock] bridge.notifyConfigChanged", ..._args); },
|
|
288
|
+
},
|
|
289
|
+
pool: {
|
|
290
|
+
pushLayout: (..._args: unknown[]) => { console.info("[linkdesk-mock] pool.pushLayout", ..._args); },
|
|
291
|
+
onReady: (..._args: unknown[]) => { console.info("[linkdesk-mock] pool.onReady", ..._args); return () => {}; },
|
|
292
|
+
toggleDevTools: (..._args: unknown[]) => { console.info("[linkdesk-mock] pool.toggleDevTools", ..._args); },
|
|
293
|
+
onSidebarAction: (..._args: unknown[]) => { console.info("[linkdesk-mock] pool.onSidebarAction", ..._args); return () => {}; },
|
|
294
|
+
onTabAction: (..._args: unknown[]) => { console.info("[linkdesk-mock] pool.onTabAction", ..._args); return () => {}; },
|
|
295
|
+
onTabBarRects: (..._args: unknown[]) => { console.info("[linkdesk-mock] pool.onTabBarRects", ..._args); return () => {}; },
|
|
296
|
+
onDragPosition: (..._args: unknown[]) => { console.info("[linkdesk-mock] pool.onDragPosition", ..._args); return () => {}; },
|
|
297
|
+
pushAdsorbHint: (..._args: unknown[]) => { console.info("[linkdesk-mock] pool.pushAdsorbHint", ..._args); },
|
|
298
|
+
onAdsorbIndex: (..._args: unknown[]) => { console.info("[linkdesk-mock] pool.onAdsorbIndex", ..._args); return () => {}; },
|
|
299
|
+
pushQuickPick: (..._args: unknown[]) => { console.info("[linkdesk-mock] pool.pushQuickPick", ..._args); },
|
|
300
|
+
onQuickPickAction: (..._args: unknown[]) => { console.info("[linkdesk-mock] pool.onQuickPickAction", ..._args); return () => {}; },
|
|
301
|
+
pushToast: (..._args: unknown[]) => { console.info("[linkdesk-mock] pool.pushToast", ..._args); },
|
|
302
|
+
onToastAction: (..._args: unknown[]) => { console.info("[linkdesk-mock] pool.onToastAction", ..._args); return () => {}; },
|
|
303
|
+
pushDialog: (..._args: unknown[]) => { console.info("[linkdesk-mock] pool.pushDialog", ..._args); },
|
|
304
|
+
onDialogAction: (..._args: unknown[]) => { console.info("[linkdesk-mock] pool.onDialogAction", ..._args); return () => {}; },
|
|
305
|
+
pushFloatingPanel: (..._args: unknown[]) => { console.info("[linkdesk-mock] pool.pushFloatingPanel", ..._args); },
|
|
306
|
+
onFloatingPanelAction: (..._args: unknown[]) => { console.info("[linkdesk-mock] pool.onFloatingPanelAction", ..._args); return () => {}; },
|
|
307
|
+
onMemoryPressure: (..._args: unknown[]) => { console.info("[linkdesk-mock] pool.onMemoryPressure", ..._args); return () => {}; },
|
|
308
|
+
createWindow: (..._args: unknown[]) => { console.info("[linkdesk-mock] pool.createWindow", ..._args); },
|
|
309
|
+
closeWindow: (..._args: unknown[]) => { console.info("[linkdesk-mock] pool.closeWindow", ..._args); },
|
|
310
|
+
onWindowClosed: (..._args: unknown[]) => { console.info("[linkdesk-mock] pool.onWindowClosed", ..._args); return () => {}; },
|
|
311
|
+
onWindowBoundsChanged: (..._args: unknown[]) => { console.info("[linkdesk-mock] pool.onWindowBoundsChanged", ..._args); return () => {}; },
|
|
312
|
+
onLayout: (..._args: unknown[]) => { console.info("[linkdesk-mock] pool.onLayout", ..._args); return () => {}; },
|
|
313
|
+
ready: (..._args: unknown[]) => { console.info("[linkdesk-mock] pool.ready", ..._args); },
|
|
314
|
+
sidebarAction: (..._args: unknown[]) => { console.info("[linkdesk-mock] pool.sidebarAction", ..._args); },
|
|
315
|
+
tabAction: (..._args: unknown[]) => { console.info("[linkdesk-mock] pool.tabAction", ..._args); },
|
|
316
|
+
tabBarRects: (..._args: unknown[]) => { console.info("[linkdesk-mock] pool.tabBarRects", ..._args); },
|
|
317
|
+
dragPosition: (..._args: unknown[]) => { console.info("[linkdesk-mock] pool.dragPosition", ..._args); },
|
|
318
|
+
onAdsorbHint: (..._args: unknown[]) => { console.info("[linkdesk-mock] pool.onAdsorbHint", ..._args); return () => {}; },
|
|
319
|
+
adsorbIndex: (..._args: unknown[]) => { console.info("[linkdesk-mock] pool.adsorbIndex", ..._args); },
|
|
320
|
+
registerBeforeClose: (..._args: unknown[]) => { console.info("[linkdesk-mock] pool.registerBeforeClose", ..._args); },
|
|
321
|
+
unregisterBeforeClose: (..._args: unknown[]) => { console.info("[linkdesk-mock] pool.unregisterBeforeClose", ..._args); },
|
|
322
|
+
beforeClose: async (..._args: unknown[]) => { console.info("[linkdesk-mock] pool.beforeClose", ..._args); return false; },
|
|
323
|
+
},
|
|
324
|
+
window: {
|
|
325
|
+
minimize: (..._args: unknown[]) => { console.info("[linkdesk-mock] window.minimize", ..._args); },
|
|
326
|
+
maximize: (..._args: unknown[]) => { console.info("[linkdesk-mock] window.maximize", ..._args); },
|
|
327
|
+
unmaximize: (..._args: unknown[]) => { console.info("[linkdesk-mock] window.unmaximize", ..._args); },
|
|
328
|
+
close: (..._args: unknown[]) => { console.info("[linkdesk-mock] window.close", ..._args); },
|
|
329
|
+
setZoom: (..._args: unknown[]) => { console.info("[linkdesk-mock] window.setZoom", ..._args); },
|
|
330
|
+
toggleDevTools: async (..._args: unknown[]) => { console.info("[linkdesk-mock] window.toggleDevTools", ..._args); },
|
|
331
|
+
isMaximized: async (..._args: unknown[]) => { console.info("[linkdesk-mock] window.isMaximized", ..._args); return false; },
|
|
332
|
+
onMaximizeChange: (..._args: unknown[]) => { console.info("[linkdesk-mock] window.onMaximizeChange", ..._args); return () => {}; },
|
|
333
|
+
setAlwaysOnTop: (..._args: unknown[]) => { console.info("[linkdesk-mock] window.setAlwaysOnTop", ..._args); },
|
|
334
|
+
isAlwaysOnTop: async (..._args: unknown[]) => { console.info("[linkdesk-mock] window.isAlwaysOnTop", ..._args); return false; },
|
|
335
|
+
onAlwaysOnTopChange: (..._args: unknown[]) => { console.info("[linkdesk-mock] window.onAlwaysOnTopChange", ..._args); return () => {}; },
|
|
336
|
+
},
|
|
337
|
+
shell: {
|
|
338
|
+
showItemInFolder: async (..._args: unknown[]) => { console.info("[linkdesk-mock] shell.showItemInFolder", ..._args); },
|
|
339
|
+
openInTerminal: async (..._args: unknown[]) => { console.info("[linkdesk-mock] shell.openInTerminal", ..._args); },
|
|
340
|
+
startDrag: (..._args: unknown[]) => { console.info("[linkdesk-mock] shell.startDrag", ..._args); },
|
|
341
|
+
},
|
|
342
|
+
hotExit: {
|
|
343
|
+
save: async (..._args: unknown[]) => { console.info("[linkdesk-mock] hotExit.save", ..._args); },
|
|
344
|
+
load: async (..._args: unknown[]) => { console.info("[linkdesk-mock] hotExit.load", ..._args); },
|
|
345
|
+
clear: async (..._args: unknown[]) => { console.info("[linkdesk-mock] hotExit.clear", ..._args); },
|
|
346
|
+
},
|
|
347
|
+
getFilePath: (..._args: unknown[]) => { console.info("[linkdesk-mock] getFilePath", ..._args); return ""; },
|
|
348
|
+
panel: {
|
|
349
|
+
reveal: async (..._args: unknown[]) => { console.info("[linkdesk-mock] panel.reveal", ..._args); },
|
|
350
|
+
revealFloating: async (..._args: unknown[]) => { console.info("[linkdesk-mock] panel.revealFloating", ..._args); },
|
|
351
|
+
},
|
|
352
|
+
settings: {
|
|
353
|
+
list: async (..._args: unknown[]) => { console.info("[linkdesk-mock] settings.list", ..._args); return []; },
|
|
354
|
+
getActive: async (..._args: unknown[]) => { console.info("[linkdesk-mock] settings.getActive", ..._args); },
|
|
355
|
+
setActive: async (..._args: unknown[]) => { console.info("[linkdesk-mock] settings.setActive", ..._args); },
|
|
356
|
+
},
|
|
357
|
+
factorySlots: {
|
|
358
|
+
listRoles: async (..._args: unknown[]) => { console.info("[linkdesk-mock] factorySlots.listRoles", ..._args); return []; },
|
|
359
|
+
list: async (..._args: unknown[]) => { console.info("[linkdesk-mock] factorySlots.list", ..._args); return []; },
|
|
360
|
+
getActive: async (..._args: unknown[]) => { console.info("[linkdesk-mock] factorySlots.getActive", ..._args); },
|
|
361
|
+
setActive: async (..._args: unknown[]) => { console.info("[linkdesk-mock] factorySlots.setActive", ..._args); },
|
|
362
|
+
},
|
|
363
|
+
};
|
package/dev-host/mock.ts
CHANGED
|
@@ -1,34 +1,72 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* dev 宿主 mock 注入锚点(E6#23.5c
|
|
2
|
+
* dev 宿主 mock 注入锚点(E6#23.5c 位置定案)。`injectDevMockApi()` 签名与调用点不变。
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
4
|
+
* 注入体(E6#27 落地替换,2026-09-07):
|
|
5
|
+
* - 方法树 = 自动生成 [linkdesk-mock.generated.ts](./linkdesk-mock.generated.ts)——与 linkdesk.d.ts
|
|
6
|
+
* 同一标注源 `src/core/api/linkdesk-api.ts`(杜绝 mock/preload 双份漂移)。每个方法 = 类型驱动
|
|
7
|
+
* 中性默认 + 调用即打 `[linkdesk-mock] <path>` 日志(mock vs 真 IPC 可感知,不静默假成功)。
|
|
8
|
+
* - #27b 兜底层 = 递归 Proxy:树内路径(契约里真实方法/命名空间)返回真子树/方法;**树外路径**
|
|
9
|
+
* (契约里不存在的方法名,如拼写错)**调用时抛错**「不在 linkdesk API 契约」而非静默 undefined /
|
|
10
|
+
* `undefined is not a function`——单源同构下,mock 缺 = 生产也缺,早抛早纠正。
|
|
7
11
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
12
|
+
* 真数据/真行为(串口/文件系统/IPC)不属于浏览器 mock——走真实 preload(装进 LinkDesk)或
|
|
13
|
+
* `linkdesk-plugin-sdk dev --real` 真机环(E6#28.5)。
|
|
10
14
|
*/
|
|
15
|
+
import { linkdeskMock } from "./linkdesk-mock.generated.js";
|
|
16
|
+
|
|
17
|
+
/** 常见 introspection 键——不当作 linkdesk API 路径,返回 undefined(防 console/JSON/运行时探测误触 throw-stub) */
|
|
18
|
+
const SKIP_INTRINSIC = new Set([
|
|
19
|
+
"then",
|
|
20
|
+
"toJSON",
|
|
21
|
+
"toString",
|
|
22
|
+
"valueOf",
|
|
23
|
+
"constructor",
|
|
24
|
+
"__proto__",
|
|
25
|
+
"hasOwnProperty",
|
|
26
|
+
"isPrototypeOf",
|
|
27
|
+
"propertyIsEnumerable",
|
|
28
|
+
]);
|
|
29
|
+
|
|
30
|
+
/** 树外路径 call-stub——访问不抛(feature-detect 可安全探测),调用才抛(#27b)。
|
|
31
|
+
* 自身是 Proxy:继续取属性返回更深 stub(`linkdesk.foo.bar()` 整链报完整 dotted path,
|
|
32
|
+
* 而非裸 TypeError「not a function」);symbol/intrinsic 键返回 undefined 防运行时探测误触。 */
|
|
33
|
+
function missingApiStub(dotted: string): () => never {
|
|
34
|
+
const stub = () => {
|
|
35
|
+
throw new Error(
|
|
36
|
+
`[dev] window.linkdesk.${dotted} 不是 linkdesk API 方法——dev mock 与 src/core/api/linkdesk-api.ts` +
|
|
37
|
+
` 同源自动生成(方法集与生产一致),契约里没有它 = 生产环境调用同样报错。请核对方法名/拼写。` +
|
|
38
|
+
`确需真实 IPC 行为 → linkdesk-plugin-sdk dev --real(E6#28.5 真机环)。`,
|
|
39
|
+
);
|
|
40
|
+
};
|
|
41
|
+
return new Proxy(stub, {
|
|
42
|
+
get(_t, prop) {
|
|
43
|
+
if (typeof prop === "symbol" || SKIP_INTRINSIC.has(String(prop))) return undefined;
|
|
44
|
+
return missingApiStub(`${dotted}.${String(prop)}`);
|
|
45
|
+
},
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/** 递归 Proxy:树内路径返回真子树(命名空间再包一层 / 方法叶子直返),树外路径调用抛错 */
|
|
50
|
+
function wrapNode(node: Record<string, unknown>, path: string[]): Record<string, unknown> {
|
|
51
|
+
return new Proxy(node, {
|
|
52
|
+
get(t, prop) {
|
|
53
|
+
if (typeof prop === "symbol") return undefined;
|
|
54
|
+
const key = String(prop);
|
|
55
|
+
if (SKIP_INTRINSIC.has(key)) return undefined;
|
|
56
|
+
if (key in t) {
|
|
57
|
+
const v = t[key];
|
|
58
|
+
if (typeof v === "function") return v; // 方法叶子(自打 [linkdesk-mock] 调用日志)
|
|
59
|
+
if (v !== null && typeof v === "object") return wrapNode(v as Record<string, unknown>, [...path, key]);
|
|
60
|
+
return v;
|
|
61
|
+
}
|
|
62
|
+
return missingApiStub([...path, key].join("."));
|
|
63
|
+
},
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
|
|
11
67
|
export function injectDevMockApi(): void {
|
|
12
68
|
if (typeof window === "undefined") return;
|
|
13
69
|
if ((window as unknown as Record<string, unknown>).linkdesk) return;
|
|
14
70
|
|
|
15
|
-
|
|
16
|
-
const makeNs = (path: string[]): unknown =>
|
|
17
|
-
new Proxy(function () {
|
|
18
|
-
/* placeholder: 调用时走 apply trap */
|
|
19
|
-
} as unknown as () => unknown, {
|
|
20
|
-
apply(): never {
|
|
21
|
-
const dotted = path.join(".") || "(根)";
|
|
22
|
-
throw new Error(
|
|
23
|
-
`[dev] window.linkdesk${dotted ? "." + dotted : ""} 未 mock——该 API 仅在生产环境可用` +
|
|
24
|
-
`(build → 装进 LinkDesk 走真实 IPC)。E6#27 生成 mock 落地前,UI 骨架开发请先不调真实 API。`,
|
|
25
|
-
);
|
|
26
|
-
},
|
|
27
|
-
get(_target, prop): unknown {
|
|
28
|
-
if (prop === "then") return undefined; // 防 Promise.resolve(proxy) 探测无限递归
|
|
29
|
-
return makeNs([...path, String(prop)]);
|
|
30
|
-
},
|
|
31
|
-
});
|
|
32
|
-
|
|
33
|
-
(window as unknown as Record<string, unknown>).linkdesk = makeNs([]);
|
|
71
|
+
(window as unknown as Record<string, unknown>).linkdesk = wrapNode(linkdeskMock, []);
|
|
34
72
|
}
|
package/dist/bin.js
CHANGED
|
@@ -14,6 +14,8 @@ import { build } from "vite";
|
|
|
14
14
|
import { validatePluginJson } from "./validate.js";
|
|
15
15
|
import { defineLinkdeskPluginConfig } from "./vite-config.js";
|
|
16
16
|
import { runPluginDev } from "./dev-server.js";
|
|
17
|
+
import { runPluginDevReal } from "./dev-real.js";
|
|
18
|
+
import { runPluginPublish } from "./publish.js";
|
|
17
19
|
import { runPluginLint, renderPluginLintReport } from "./eslint/lint.js";
|
|
18
20
|
const VITE_CONFIG_FILES = [
|
|
19
21
|
"vite.config.ts",
|
|
@@ -28,7 +30,14 @@ const USAGE = `linkdesk-plugin-sdk <command>
|
|
|
28
30
|
命令:
|
|
29
31
|
dev 在插件工程根起 dev 宿主(E6#24)——读 plugin.json → Vite dev server(端口 1421)
|
|
30
32
|
→ 浏览器打开纯前端预览 + HMR。只支持带 entry 的视图插件(脚手架 tab 形态)
|
|
33
|
+
dev --real E6#28.5 真机环——watch 作者源码 → 隔离单插件 build → 直写 {userData}/plugins/<id>
|
|
34
|
+
→ CDP reload「LinkDesk Pool」(LinkDesk 须以 --remote-debugging-port=9222 启动)。
|
|
35
|
+
真 IPC/串口/LSP 类插件的秒级真机调试(壳零新代码;LINKDESK_USER_PLUGINS_DIR /
|
|
36
|
+
LINKDESK_CDP_PORT 可覆盖)
|
|
31
37
|
build 在插件工程根构建 .linkdesk-plugin(读 plugin.json → Vite build → zip)
|
|
38
|
+
publish 一键发布(E6#26)——自动链路:建 GitHub Release → 上传 .linkdesk-plugin → 更新工程
|
|
39
|
+
origin 仓库根 marketplace.json(多市场源模型)。发前预览确认;--yes 跳过(CI);
|
|
40
|
+
--dry-run 只预览不碰网络。token:env LINKDESK_GITHUB_TOKEN,或首跑交互输入存入本机
|
|
32
41
|
validate 校验 plugin.json(参数 = 路径,默认 ./plugin.json)
|
|
33
42
|
lint E6#54d 门禁(eslint 12 规则 + 三 check 双轨,全 WARN 永不 fail;知情绕行 =
|
|
34
43
|
eslint-disable 注释)。参数 = 工程根,默认 process.cwd()
|
|
@@ -62,22 +71,47 @@ function cmdValidate(target) {
|
|
|
62
71
|
return 0;
|
|
63
72
|
}
|
|
64
73
|
async function main() {
|
|
65
|
-
const [, , command
|
|
74
|
+
const [, , command] = process.argv;
|
|
75
|
+
const rest = process.argv.slice(3); // 参数:dev --real / validate <path> / lint <root>
|
|
66
76
|
let code;
|
|
67
77
|
switch (command) {
|
|
68
|
-
case "dev":
|
|
69
|
-
//
|
|
70
|
-
|
|
78
|
+
case "dev": {
|
|
79
|
+
// dev [--real]——真机环(E6#28.5):build→直写 userData/plugins→CDP reload;挂起直到 Ctrl+C
|
|
80
|
+
if (rest.includes("--real")) {
|
|
81
|
+
await runPluginDevReal(process.cwd());
|
|
82
|
+
}
|
|
83
|
+
else if (rest.some((a) => a.startsWith("-") && a !== "--real")) {
|
|
84
|
+
console.error(USAGE);
|
|
85
|
+
code = 1;
|
|
86
|
+
break;
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
// 挂起直到 Ctrl+C(server.close 后 resolve)——dev 无退出码语义,正常退出 = 0
|
|
90
|
+
await runPluginDev(process.cwd());
|
|
91
|
+
}
|
|
71
92
|
code = 0;
|
|
72
93
|
break;
|
|
94
|
+
}
|
|
73
95
|
case "build":
|
|
74
96
|
code = await cmdBuild();
|
|
75
97
|
break;
|
|
98
|
+
case "publish": {
|
|
99
|
+
// publish [--yes|--dry-run]——E6#26 自动发布链路(发前预览确认)
|
|
100
|
+
const flags = rest.filter((a) => a.startsWith("-"));
|
|
101
|
+
const unknown = flags.filter((a) => a !== "--yes" && a !== "--dry-run");
|
|
102
|
+
if (unknown.length > 0 || rest.some((a) => !a.startsWith("-"))) {
|
|
103
|
+
console.error(USAGE);
|
|
104
|
+
code = 1;
|
|
105
|
+
break;
|
|
106
|
+
}
|
|
107
|
+
code = await runPluginPublish(process.cwd(), { yes: rest.includes("--yes"), dryRun: rest.includes("--dry-run") });
|
|
108
|
+
break;
|
|
109
|
+
}
|
|
76
110
|
case "validate":
|
|
77
|
-
code = cmdValidate(
|
|
111
|
+
code = cmdValidate(rest[0] ?? "plugin.json");
|
|
78
112
|
break;
|
|
79
113
|
case "lint":
|
|
80
|
-
code = await cmdLint(
|
|
114
|
+
code = await cmdLint(rest[0] ?? process.cwd());
|
|
81
115
|
break;
|
|
82
116
|
default:
|
|
83
117
|
console.error(USAGE);
|
package/dist/bin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":";AACA;;;;;;;;GAQG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,KAAK,EAAE,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAEzE,MAAM,iBAAiB,GAAG;IACxB,gBAAgB;IAChB,iBAAiB;IACjB,iBAAiB;IACjB,gBAAgB;IAChB,iBAAiB;IACjB,iBAAiB;CAClB,CAAC;AAEF,MAAM,KAAK,GAAG
|
|
1
|
+
{"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/** CDP reload 端口默认 9222(与壳 dev electron:dev 尾部 --remote-debugging-port=9222 对齐);LINKDESK_CDP_PORT 覆盖 */
|
|
2
|
+
export declare const CDP_PORT: number;
|
|
3
|
+
/** 作者当前平台 LinkDesk userData/plugins 代码根(Electron 默认 userData = appData/<appName>,dev/打包同名 "linkdesk")。
|
|
4
|
+
* LINKDESK_USER_PLUGINS_DIR 环境变量可覆盖(自定义安装布局 / CI 隔离 userData 的逃生门)。 */
|
|
5
|
+
export declare function resolveUserPluginsDir(): string;
|
|
6
|
+
/**
|
|
7
|
+
* 经 CDP 刷新「LinkDesk Pool」窗口——renderer 重 import = 直写产物生效。返回是否找到并刷新成功。
|
|
8
|
+
*
|
|
9
|
+
* E6#28.5 真机自验实证(2026-09-07):单发 Page.reload 不足——`protocol.handle` 的 linkdesk:// 响应
|
|
10
|
+
* 无 Cache-Control 头 → Chromium 同 URL 二次请求命中缓存,index.bundle.js 陈旧副本永远被喂(直写磁盘
|
|
11
|
+
* 被遮蔽,protocol-debug.log 无新 200 行可证)。修复 = reload 前 Network.enable + Network.clearBrowserCache,
|
|
12
|
+
* 清掉缓存让 reload 后重 import 落到磁盘逐请求 readFileSync(纯 CDP,壳零代码)。
|
|
13
|
+
*/
|
|
14
|
+
export declare function cdpReloadPool(port?: number): Promise<boolean>;
|
|
15
|
+
export interface RealLoopHooks {
|
|
16
|
+
/** 每次成功 build+直写后回调(默认 = CDP reload;测试/工具可注入) */
|
|
17
|
+
onInstalled?: (pluginId: string, targetDir: string) => Promise<void>;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* 跑真机环并挂起进程(Ctrl+C → 关 watcher + 退出)。每次源码变更:debounce → 全量单插件 build →
|
|
21
|
+
* 直写 {userData}/plugins/<id> → CDP reload「LinkDesk Pool」。
|
|
22
|
+
*/
|
|
23
|
+
export declare function runPluginDevReal(root: string): Promise<void>;
|
|
24
|
+
//# sourceMappingURL=dev-real.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dev-real.d.ts","sourceRoot":"","sources":["../src/dev-real.ts"],"names":[],"mappings":"AA4BA,wGAAwG;AACxG,eAAO,MAAM,QAAQ,QAAgD,CAAC;AAEtE;wEACwE;AACxE,wBAAgB,qBAAqB,IAAI,MAAM,CAY9C;AAyED;;;;;;;GAOG;AACH,wBAAsB,aAAa,CAAC,IAAI,SAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAgCrE;AAeD,MAAM,WAAW,aAAa;IAC5B,iDAAiD;IACjD,WAAW,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACtE;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAgIlE"}
|