weapp-ide-cli 5.2.10 → 5.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +51 -0
- package/dist/{commands-5QkUqOoO.js → automator-session-BZzODsJi.js} +1 -330
- package/dist/{cli-pFop_M4C.js → cli-B45DqpiD.js} +14 -4
- package/dist/cli.js +2 -2
- package/dist/commands-BynZfUJ6.js +333 -0
- package/dist/commands-DG-3Zgd0.js +2 -0
- package/dist/index.d.ts +45 -6
- package/dist/index.js +5 -3
- package/dist/run-mcp-DhujWgfX.js +2 -0
- package/dist/run-mcp-TnooVQe8.js +434 -0
- package/package.json +6 -4
- package/dist/commands-DAN1Yl85.js +0 -2
|
@@ -0,0 +1,333 @@
|
|
|
1
|
+
import { A as colors, c as i18nText, j as logger_default, n as closeSharedMiniProgram, o as withMiniProgram } from "./automator-session-BZzODsJi.js";
|
|
2
|
+
import { Buffer } from "node:buffer";
|
|
3
|
+
import fs from "node:fs/promises";
|
|
4
|
+
import { PNG } from "pngjs";
|
|
5
|
+
//#region src/cli/fullPageScreenshot.ts
|
|
6
|
+
function decodeScreenshotBuffer(raw) {
|
|
7
|
+
const buffer = typeof raw === "string" ? Buffer.from(raw, "base64") : Buffer.from(raw);
|
|
8
|
+
if (buffer.length === 0) throw new Error("Failed to capture screenshot");
|
|
9
|
+
return buffer;
|
|
10
|
+
}
|
|
11
|
+
function toPositiveNumber(value) {
|
|
12
|
+
return typeof value === "number" && Number.isFinite(value) && value > 0 ? value : void 0;
|
|
13
|
+
}
|
|
14
|
+
function createScrollPositions(totalHeight, viewportHeight) {
|
|
15
|
+
if (totalHeight <= viewportHeight) return [0];
|
|
16
|
+
const positions = [];
|
|
17
|
+
const lastStart = Math.max(totalHeight - viewportHeight, 0);
|
|
18
|
+
for (let scrollTop = 0; scrollTop < lastStart; scrollTop += viewportHeight) positions.push(scrollTop);
|
|
19
|
+
if (positions[positions.length - 1] !== lastStart) positions.push(lastStart);
|
|
20
|
+
return positions;
|
|
21
|
+
}
|
|
22
|
+
function cropPngRows(source, startRow, rowCount) {
|
|
23
|
+
const cropped = new PNG({
|
|
24
|
+
width: source.width,
|
|
25
|
+
height: rowCount
|
|
26
|
+
});
|
|
27
|
+
const bytesPerRow = source.width * 4;
|
|
28
|
+
for (let row = 0; row < rowCount; row += 1) {
|
|
29
|
+
const sourceStart = (startRow + row) * bytesPerRow;
|
|
30
|
+
const sourceEnd = sourceStart + bytesPerRow;
|
|
31
|
+
cropped.data.set(source.data.subarray(sourceStart, sourceEnd), row * bytesPerRow);
|
|
32
|
+
}
|
|
33
|
+
return cropped;
|
|
34
|
+
}
|
|
35
|
+
async function restoreScrollPosition(miniProgram, page, scrollTop) {
|
|
36
|
+
await miniProgram.pageScrollTo(scrollTop);
|
|
37
|
+
await page.waitFor(150);
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* @description 通过多次滚动和拼接生成整页长截图。
|
|
41
|
+
*/
|
|
42
|
+
async function captureFullPageScreenshotBuffer(options) {
|
|
43
|
+
const { miniProgram, timeoutMs, runWithTimeout, screenshotTimeoutMessage } = options;
|
|
44
|
+
const page = await miniProgram.currentPage();
|
|
45
|
+
const pageSize = await page.size();
|
|
46
|
+
const systemInfo = await miniProgram.systemInfo();
|
|
47
|
+
const initialScrollTop = typeof page.scrollTop === "function" ? await page.scrollTop() : 0;
|
|
48
|
+
const pageHeight = toPositiveNumber(pageSize.height);
|
|
49
|
+
const viewportHeight = toPositiveNumber(systemInfo.windowHeight);
|
|
50
|
+
if (!pageHeight || !viewportHeight) return decodeScreenshotBuffer(await runWithTimeout(miniProgram.screenshot(), timeoutMs, screenshotTimeoutMessage, "DEVTOOLS_SCREENSHOT_TIMEOUT"));
|
|
51
|
+
const segments = [];
|
|
52
|
+
const positions = createScrollPositions(pageHeight, viewportHeight);
|
|
53
|
+
let coveredUntil = 0;
|
|
54
|
+
let scale = 1;
|
|
55
|
+
try {
|
|
56
|
+
for (const scrollTop of positions) {
|
|
57
|
+
await miniProgram.pageScrollTo(scrollTop);
|
|
58
|
+
await page.waitFor(150);
|
|
59
|
+
const rawScreenshot = await runWithTimeout(miniProgram.screenshot(), timeoutMs, screenshotTimeoutMessage, "DEVTOOLS_SCREENSHOT_TIMEOUT");
|
|
60
|
+
const png = PNG.sync.read(decodeScreenshotBuffer(rawScreenshot));
|
|
61
|
+
if (viewportHeight > 0) scale = png.height / viewportHeight;
|
|
62
|
+
const visibleEnd = Math.min(scrollTop + viewportHeight, pageHeight);
|
|
63
|
+
const cropTopCss = Math.max(coveredUntil - scrollTop, 0);
|
|
64
|
+
const segmentHeightCss = Math.max(visibleEnd - scrollTop - cropTopCss, 0);
|
|
65
|
+
if (segmentHeightCss <= 0) continue;
|
|
66
|
+
const cropTopRows = Math.min(Math.max(Math.round(cropTopCss * scale), 0), png.height);
|
|
67
|
+
const segmentRows = Math.min(Math.max(Math.round(segmentHeightCss * scale), 1), png.height - cropTopRows);
|
|
68
|
+
segments.push(cropPngRows(png, cropTopRows, segmentRows));
|
|
69
|
+
coveredUntil = visibleEnd;
|
|
70
|
+
}
|
|
71
|
+
} finally {
|
|
72
|
+
await restoreScrollPosition(miniProgram, page, initialScrollTop);
|
|
73
|
+
}
|
|
74
|
+
if (segments.length === 0) throw new Error("Failed to capture screenshot");
|
|
75
|
+
const width = segments[0].width;
|
|
76
|
+
const merged = new PNG({
|
|
77
|
+
width,
|
|
78
|
+
height: segments.reduce((sum, segment) => sum + segment.height, 0)
|
|
79
|
+
});
|
|
80
|
+
const bytesPerRow = width * 4;
|
|
81
|
+
let offsetY = 0;
|
|
82
|
+
for (const segment of segments) {
|
|
83
|
+
if (segment.width !== width) throw new Error("Full-page screenshots have inconsistent widths");
|
|
84
|
+
for (let row = 0; row < segment.height; row += 1) {
|
|
85
|
+
const sourceStart = row * bytesPerRow;
|
|
86
|
+
const sourceEnd = sourceStart + bytesPerRow;
|
|
87
|
+
merged.data.set(segment.data.subarray(sourceStart, sourceEnd), (offsetY + row) * bytesPerRow);
|
|
88
|
+
}
|
|
89
|
+
offsetY += segment.height;
|
|
90
|
+
}
|
|
91
|
+
return PNG.sync.write(merged);
|
|
92
|
+
}
|
|
93
|
+
//#endregion
|
|
94
|
+
//#region src/cli/commands.ts
|
|
95
|
+
function createTimeoutError(message, code) {
|
|
96
|
+
const error = new Error(message);
|
|
97
|
+
error.code = code;
|
|
98
|
+
return error;
|
|
99
|
+
}
|
|
100
|
+
function normalizePagePath(page) {
|
|
101
|
+
return page.startsWith("/") ? page : `/${page}`;
|
|
102
|
+
}
|
|
103
|
+
function sleep(ms) {
|
|
104
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
105
|
+
}
|
|
106
|
+
function withCommandTimeout(task, timeoutMs, message, code) {
|
|
107
|
+
return new Promise((resolve, reject) => {
|
|
108
|
+
const timeout = setTimeout(() => {
|
|
109
|
+
reject(createTimeoutError(message, code));
|
|
110
|
+
}, timeoutMs);
|
|
111
|
+
task.then((value) => {
|
|
112
|
+
clearTimeout(timeout);
|
|
113
|
+
resolve(value);
|
|
114
|
+
}).catch((error) => {
|
|
115
|
+
clearTimeout(timeout);
|
|
116
|
+
reject(error);
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
async function runRouteCommand(options, startMessage, successMessage, action) {
|
|
121
|
+
await withMiniProgram(options, async (miniProgram) => {
|
|
122
|
+
logger_default.info(startMessage);
|
|
123
|
+
await action(miniProgram);
|
|
124
|
+
logger_default.success(successMessage);
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
function toPageSnapshot(page) {
|
|
128
|
+
return {
|
|
129
|
+
path: page.path ?? "",
|
|
130
|
+
query: page.query
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
function printStructuredResult(result, json, title) {
|
|
134
|
+
if (json) {
|
|
135
|
+
console.log(JSON.stringify(result, null, 2));
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
logger_default.info(title);
|
|
139
|
+
console.log(JSON.stringify(result, null, 2));
|
|
140
|
+
}
|
|
141
|
+
async function requireElement(page, selector) {
|
|
142
|
+
const element = await page.$(selector);
|
|
143
|
+
if (!element) throw new Error(i18nText(`未找到元素: ${selector}`, `Element not found: ${selector}`));
|
|
144
|
+
return element;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* @description 执行保留栈页面跳转。
|
|
148
|
+
*/
|
|
149
|
+
async function navigateTo(options) {
|
|
150
|
+
await runRouteCommand(options, i18nText(`正在跳转到 ${colors.cyan(options.url)}...`, `Navigating to ${colors.cyan(options.url)}...`), i18nText(`已跳转到 ${colors.cyan(options.url)}`, `Navigated to ${colors.cyan(options.url)}`), (miniProgram) => miniProgram.navigateTo(options.url));
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* @description 执行关闭当前页的重定向。
|
|
154
|
+
*/
|
|
155
|
+
async function redirectTo(options) {
|
|
156
|
+
await runRouteCommand(options, i18nText(`正在重定向到 ${colors.cyan(options.url)}...`, `Redirecting to ${colors.cyan(options.url)}...`), i18nText(`已重定向到 ${colors.cyan(options.url)}`, `Redirected to ${colors.cyan(options.url)}`), (miniProgram) => miniProgram.redirectTo(options.url));
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* @description 返回上一页。
|
|
160
|
+
*/
|
|
161
|
+
async function navigateBack(options) {
|
|
162
|
+
await runRouteCommand(options, i18nText("正在返回上一页...", "Navigating back..."), i18nText("已返回上一页", "Navigated back"), (miniProgram) => miniProgram.navigateBack());
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* @description 重启到指定页面。
|
|
166
|
+
*/
|
|
167
|
+
async function reLaunch(options) {
|
|
168
|
+
await runRouteCommand(options, i18nText(`正在重启到 ${colors.cyan(options.url)}...`, `Relaunching to ${colors.cyan(options.url)}...`), i18nText(`已重启到 ${colors.cyan(options.url)}`, `Relaunched to ${colors.cyan(options.url)}`), (miniProgram) => miniProgram.reLaunch(options.url));
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* @description 切换到 tabBar 页面。
|
|
172
|
+
*/
|
|
173
|
+
async function switchTab(options) {
|
|
174
|
+
await runRouteCommand(options, i18nText(`正在切换 tab 到 ${colors.cyan(options.url)}...`, `Switching tab to ${colors.cyan(options.url)}...`), i18nText(`已切换 tab 到 ${colors.cyan(options.url)}`, `Switched tab to ${colors.cyan(options.url)}`), (miniProgram) => miniProgram.switchTab(options.url));
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* @description 获取页面栈。
|
|
178
|
+
*/
|
|
179
|
+
async function pageStack(options) {
|
|
180
|
+
return await withMiniProgram(options, async (miniProgram) => {
|
|
181
|
+
const result = (await miniProgram.pageStack()).map(toPageSnapshot);
|
|
182
|
+
printStructuredResult(result, options.json, i18nText("页面栈:", "Page stack:"));
|
|
183
|
+
return result;
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* @description 获取当前页面信息。
|
|
188
|
+
*/
|
|
189
|
+
async function currentPage(options) {
|
|
190
|
+
return await withMiniProgram(options, async (miniProgram) => {
|
|
191
|
+
const result = toPageSnapshot(await miniProgram.currentPage());
|
|
192
|
+
if (options.json) console.log(JSON.stringify(result, null, 2));
|
|
193
|
+
else logger_default.info(i18nText(`当前页面: ${result.path}${result.query ? ` ${JSON.stringify(result.query)}` : ""}`, `Current page: ${result.path}${result.query ? ` ${JSON.stringify(result.query)}` : ""}`));
|
|
194
|
+
return result;
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* @description 获取系统信息。
|
|
199
|
+
*/
|
|
200
|
+
async function systemInfo(options) {
|
|
201
|
+
return await withMiniProgram(options, async (miniProgram) => {
|
|
202
|
+
const result = await miniProgram.systemInfo();
|
|
203
|
+
printStructuredResult(result, options.json, i18nText("系统信息:", "System info:"));
|
|
204
|
+
return result;
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* @description 获取当前页面数据。
|
|
209
|
+
*/
|
|
210
|
+
async function pageData(options) {
|
|
211
|
+
return await withMiniProgram(options, async (miniProgram) => {
|
|
212
|
+
const result = await (await miniProgram.currentPage()).data(options.path);
|
|
213
|
+
printStructuredResult(result, options.json, i18nText("页面数据:", "Page data:"));
|
|
214
|
+
return result;
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* @description 点击页面元素。
|
|
219
|
+
*/
|
|
220
|
+
async function tap(options) {
|
|
221
|
+
await withMiniProgram(options, async (miniProgram) => {
|
|
222
|
+
logger_default.info(i18nText(`正在点击元素 ${colors.cyan(options.selector)}...`, `Tapping element ${colors.cyan(options.selector)}...`));
|
|
223
|
+
await (await requireElement(await miniProgram.currentPage(), options.selector)).tap();
|
|
224
|
+
logger_default.success(i18nText(`已点击元素 ${colors.cyan(options.selector)}`, `Tapped element ${colors.cyan(options.selector)}`));
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* @description 向页面元素输入文本。
|
|
229
|
+
*/
|
|
230
|
+
async function input(options) {
|
|
231
|
+
await withMiniProgram(options, async (miniProgram) => {
|
|
232
|
+
logger_default.info(i18nText(`正在向 ${colors.cyan(options.selector)} 输入 "${colors.cyan(options.value)}"...`, `Inputting "${colors.cyan(options.value)}" into ${colors.cyan(options.selector)}...`));
|
|
233
|
+
const element = await requireElement(await miniProgram.currentPage(), options.selector);
|
|
234
|
+
if (typeof element.input !== "function") throw new TypeError(i18nText(`元素不支持输入: ${options.selector}`, `Element does not support input: ${options.selector}`));
|
|
235
|
+
await element.input(options.value);
|
|
236
|
+
logger_default.success(i18nText(`已向 ${colors.cyan(options.selector)} 输入 "${colors.cyan(options.value)}"`, `Inputted "${colors.cyan(options.value)}" into ${colors.cyan(options.selector)}`));
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* @description 滚动页面到指定位置。
|
|
241
|
+
*/
|
|
242
|
+
async function scrollTo(options) {
|
|
243
|
+
await withMiniProgram(options, async (miniProgram) => {
|
|
244
|
+
logger_default.info(i18nText(`正在滚动到位置 ${colors.cyan(String(options.scrollTop))}...`, `Scrolling to position ${colors.cyan(String(options.scrollTop))}...`));
|
|
245
|
+
await miniProgram.pageScrollTo(options.scrollTop);
|
|
246
|
+
logger_default.success(i18nText(`已滚动到位置 ${colors.cyan(String(options.scrollTop))}`, `Scrolled to position ${colors.cyan(String(options.scrollTop))}`));
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* @description 执行体验评分审计。
|
|
251
|
+
*/
|
|
252
|
+
async function audit(options) {
|
|
253
|
+
return await withMiniProgram(options, async (miniProgram) => {
|
|
254
|
+
logger_default.info(i18nText("正在执行体验审计...", "Running experience audit..."));
|
|
255
|
+
const result = await miniProgram.stopAudits();
|
|
256
|
+
if (options.outputPath) {
|
|
257
|
+
await fs.writeFile(options.outputPath, JSON.stringify(result, null, 2));
|
|
258
|
+
logger_default.success(i18nText(`审计报告已保存到 ${colors.cyan(options.outputPath)}`, `Audit report saved to ${colors.cyan(options.outputPath)}`));
|
|
259
|
+
return result;
|
|
260
|
+
}
|
|
261
|
+
console.log(JSON.stringify(result, null, 2));
|
|
262
|
+
return result;
|
|
263
|
+
});
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* @description 捕获当前页面截图并返回二进制内容。
|
|
267
|
+
*/
|
|
268
|
+
async function captureScreenshotBuffer(options) {
|
|
269
|
+
return await withMiniProgram(options, async (miniProgram) => {
|
|
270
|
+
const commandTimeout = options.timeout ?? 3e4;
|
|
271
|
+
const screenshotTimeoutMessage = i18nText(`截图请求在 ${commandTimeout}ms 内未收到 DevTools 回包,请检查当前微信开发者工具是否仍停留在目标项目;若近期执行过其他 e2e / screenshot 任务,关闭多余窗口并清理残留 automator 会话后重试。`, `Screenshot request did not receive a DevTools response within ${commandTimeout}ms. Check that the current Wechat DevTools window is still the target project. If you recently ran other e2e or screenshot tasks, close extra windows and clean up stale automator sessions before retrying.`);
|
|
272
|
+
if (!options.miniProgram) logger_default.info(i18nText(`正在连接 DevTools:${colors.cyan(options.projectPath)}...`, `Connecting to DevTools at ${colors.cyan(options.projectPath)}...`));
|
|
273
|
+
if (options.page) {
|
|
274
|
+
const normalizedPage = normalizePagePath(options.page);
|
|
275
|
+
logger_default.info(i18nText(`正在跳转页面 ${colors.cyan(normalizedPage)}...`, `Navigating to page ${colors.cyan(normalizedPage)}...`));
|
|
276
|
+
await miniProgram.reLaunch(normalizedPage);
|
|
277
|
+
if (options.fullPage) await sleep(1e3);
|
|
278
|
+
}
|
|
279
|
+
if (options.fullPage) {
|
|
280
|
+
logger_default.info(i18nText("正在生成整页长截图...", "Capturing full-page screenshot..."));
|
|
281
|
+
return await captureFullPageScreenshotBuffer({
|
|
282
|
+
miniProgram,
|
|
283
|
+
timeoutMs: commandTimeout,
|
|
284
|
+
runWithTimeout: withCommandTimeout,
|
|
285
|
+
screenshotTimeoutMessage
|
|
286
|
+
});
|
|
287
|
+
}
|
|
288
|
+
logger_default.info(i18nText("正在截图...", "Taking screenshot..."));
|
|
289
|
+
const screenshot = await withCommandTimeout(miniProgram.screenshot(), commandTimeout, screenshotTimeoutMessage, "DEVTOOLS_SCREENSHOT_TIMEOUT");
|
|
290
|
+
const buffer = typeof screenshot === "string" ? Buffer.from(screenshot, "base64") : Buffer.from(screenshot);
|
|
291
|
+
if (buffer.length === 0) throw new Error(i18nText("截图失败", "Failed to capture screenshot"));
|
|
292
|
+
return buffer;
|
|
293
|
+
});
|
|
294
|
+
}
|
|
295
|
+
/**
|
|
296
|
+
* @description 获取当前小程序截图。
|
|
297
|
+
*/
|
|
298
|
+
async function takeScreenshot(options) {
|
|
299
|
+
let screenshotBuffer;
|
|
300
|
+
try {
|
|
301
|
+
screenshotBuffer = await captureScreenshotBuffer(options);
|
|
302
|
+
} catch (error) {
|
|
303
|
+
const isProtocolTimeout = error instanceof Error && error.message === "DEVTOOLS_PROTOCOL_TIMEOUT";
|
|
304
|
+
if (!Boolean(options.sharedSession && !options.miniProgram && isProtocolTimeout)) throw error;
|
|
305
|
+
await closeSharedMiniProgram(options.projectPath);
|
|
306
|
+
logger_default.warn(i18nText("当前共享 DevTools 会话截图超时,正在改用全新自动化会话重试一次...", "The current shared DevTools session timed out while capturing screenshot. Retrying once with a fresh automation session..."));
|
|
307
|
+
screenshotBuffer = await captureScreenshotBuffer({
|
|
308
|
+
...options,
|
|
309
|
+
preferOpenedSession: false,
|
|
310
|
+
sharedSession: false
|
|
311
|
+
});
|
|
312
|
+
}
|
|
313
|
+
const base64 = screenshotBuffer.toString("base64");
|
|
314
|
+
if (options.outputPath) {
|
|
315
|
+
await fs.writeFile(options.outputPath, screenshotBuffer);
|
|
316
|
+
logger_default.success(i18nText(`截图已保存到 ${colors.cyan(options.outputPath)}`, `Screenshot saved to ${colors.cyan(options.outputPath)}`));
|
|
317
|
+
return { path: options.outputPath };
|
|
318
|
+
}
|
|
319
|
+
return { base64 };
|
|
320
|
+
}
|
|
321
|
+
/**
|
|
322
|
+
* @description 开关远程调试。
|
|
323
|
+
*/
|
|
324
|
+
async function remote(options) {
|
|
325
|
+
const enable = options.enable ?? true;
|
|
326
|
+
await withMiniProgram(options, async (miniProgram) => {
|
|
327
|
+
logger_default.info(enable ? i18nText("正在开启远程调试...", "Enabling remote debugging...") : i18nText("正在关闭远程调试...", "Disabling remote debugging..."));
|
|
328
|
+
await miniProgram.remote(enable);
|
|
329
|
+
logger_default.success(enable ? i18nText("远程调试已开启", "Remote debugging enabled") : i18nText("远程调试已关闭", "Remote debugging disabled"));
|
|
330
|
+
});
|
|
331
|
+
}
|
|
332
|
+
//#endregion
|
|
333
|
+
export { navigateBack as a, pageStack as c, remote as d, scrollTo as f, tap as g, takeScreenshot as h, input as i, reLaunch as l, systemInfo as m, captureScreenshotBuffer as n, navigateTo as o, switchTab as p, currentPage as r, pageData as s, audit as t, redirectTo as u };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { Buffer } from "node:buffer";
|
|
2
|
-
import { AutomatorElement, AutomatorMiniProgram, AutomatorPage, DevtoolsRuntimeSessionOptions, MiniProgramEventMap, closeSharedMiniProgram, getSharedMiniProgramSessionCount, releaseSharedMiniProgram } from "@weapp-vite/devtools-runtime";
|
|
3
|
-
import
|
|
4
|
-
import * as _$cac from "cac";
|
|
2
|
+
import { AutomatorElement, AutomatorMiniProgram, AutomatorPage, DevtoolsConnectionInput, DevtoolsContext, DevtoolsElementSnapshot, DevtoolsPageSnapshot, DevtoolsRuntimeSessionOptions, DevtoolsToolResult, MiniProgramEventMap, closeSharedMiniProgram, getSharedMiniProgramSessionCount, readDevtoolsElementSnapshot as readElementSnapshot, releaseSharedMiniProgram, resolveDevtoolsProjectPath as resolveProjectPath, toDevtoolsSerializableValue as toSerializableValue } from "@weapp-vite/devtools-runtime";
|
|
3
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
5
4
|
|
|
6
5
|
//#region src/cli/automator.d.ts
|
|
7
6
|
interface AutomatorOptions {
|
|
@@ -98,6 +97,7 @@ declare function withMiniProgram<T>(options: AutomatorSessionOptions, runner: (m
|
|
|
98
97
|
declare const WECHAT_CLI_COMMAND_NAMES: readonly ["open", "login", "islogin", "preview", "auto-preview", "upload", "build-npm", "auto", "auto-replay", "reset-fileutils", "close", "quit", "cache", "engine", "open-other", "build-ipa", "build-apk", "cloud"];
|
|
99
98
|
declare const MINIDEV_NAMESPACE_COMMAND_NAMES: readonly ["alipay", "ali", "minidev"];
|
|
100
99
|
declare const CONFIG_COMMAND_NAME: "config";
|
|
100
|
+
declare const MCP_COMMAND_NAME: "mcp";
|
|
101
101
|
declare const WEAPP_IDE_TOP_LEVEL_COMMAND_NAMES: string[];
|
|
102
102
|
/**
|
|
103
103
|
* @description 判断是否为 weapp-ide-cli 支持的顶层命令。
|
|
@@ -426,7 +426,7 @@ declare function promptWechatIdeLoginRetry(options: WechatIdeLoginRetryOptions):
|
|
|
426
426
|
/**
|
|
427
427
|
* @description 基于 cac 注册顶层命令,用于统一识别入口。
|
|
428
428
|
*/
|
|
429
|
-
declare function createCli():
|
|
429
|
+
declare function createCli(): import("cac").CAC;
|
|
430
430
|
/**
|
|
431
431
|
* @description CLI 入口解析与分发。
|
|
432
432
|
*/
|
|
@@ -468,6 +468,12 @@ interface RetryableCommandExecutorOptions<TResult, TPromptResult> {
|
|
|
468
468
|
*/
|
|
469
469
|
declare function runRetryableCommand<TResult, TPromptResult>(options: RetryableCommandExecutorOptions<TResult, TPromptResult>): Promise<TResult>;
|
|
470
470
|
//#endregion
|
|
471
|
+
//#region src/cli/run-mcp.d.ts
|
|
472
|
+
interface McpCommandOptions {
|
|
473
|
+
workspaceRoot?: string;
|
|
474
|
+
}
|
|
475
|
+
declare function runMcpCommand(argv: string[]): Promise<void>;
|
|
476
|
+
//#endregion
|
|
471
477
|
//#region src/cli/screenshot.d.ts
|
|
472
478
|
/**
|
|
473
479
|
* @description Print help for screenshot command
|
|
@@ -831,6 +837,39 @@ declare function getConfig(): Promise<ResolvedConfig>;
|
|
|
831
837
|
*/
|
|
832
838
|
declare function getConfiguredLocale(): Promise<"zh" | "en" | undefined>;
|
|
833
839
|
//#endregion
|
|
840
|
+
//#region src/mcp/runtime.d.ts
|
|
841
|
+
interface StartWeappIdeMcpServerOptions {
|
|
842
|
+
workspaceRoot?: string;
|
|
843
|
+
}
|
|
844
|
+
declare function startWeappIdeMcpServer(options?: StartWeappIdeMcpServerOptions): Promise<{
|
|
845
|
+
close: () => Promise<void>;
|
|
846
|
+
}>;
|
|
847
|
+
//#endregion
|
|
848
|
+
//#region src/mcp/server.d.ts
|
|
849
|
+
interface ToolRegistrar {
|
|
850
|
+
registerTool: McpServer['registerTool'];
|
|
851
|
+
}
|
|
852
|
+
interface WeappIdeMcpRuntimeHooks {
|
|
853
|
+
withMiniProgram: <T>(options: {
|
|
854
|
+
preferOpenedSession?: boolean;
|
|
855
|
+
projectPath: string;
|
|
856
|
+
sharedSession?: boolean;
|
|
857
|
+
timeout?: number;
|
|
858
|
+
}, runner: (miniProgram: MiniProgramLike) => Promise<T>) => Promise<T>;
|
|
859
|
+
}
|
|
860
|
+
interface WeappIdeMcpServerOptions {
|
|
861
|
+
runtimeHooks: WeappIdeMcpRuntimeHooks;
|
|
862
|
+
workspaceRoot?: string;
|
|
863
|
+
}
|
|
864
|
+
interface WeappIdeMcpServerHandle {
|
|
865
|
+
close: () => Promise<void>;
|
|
866
|
+
}
|
|
867
|
+
declare function registerWeappIdeMcpTools(server: ToolRegistrar, options: WeappIdeMcpServerOptions): void;
|
|
868
|
+
declare function createWeappIdeMcpServer(options: WeappIdeMcpServerOptions): Promise<{
|
|
869
|
+
close: () => Promise<undefined>;
|
|
870
|
+
server: McpServer;
|
|
871
|
+
}>;
|
|
872
|
+
//#endregion
|
|
834
873
|
//#region src/runtime/platform.d.ts
|
|
835
874
|
/**
|
|
836
875
|
* @description 官方微信开发者工具只支持 Windows、macOS,Linux 只有社区版。
|
|
@@ -884,7 +923,7 @@ interface ExecuteOptions {
|
|
|
884
923
|
/**
|
|
885
924
|
* @description 执行 CLI 命令并透传输出
|
|
886
925
|
*/
|
|
887
|
-
declare function execute(cliPath: string, argv: string[], options?: ExecuteOptions): Promise<
|
|
926
|
+
declare function execute(cliPath: string, argv: string[], options?: ExecuteOptions): Promise<import("execa").Result<{}>>;
|
|
888
927
|
//#endregion
|
|
889
928
|
//#region src/utils/path.d.ts
|
|
890
929
|
/**
|
|
@@ -892,4 +931,4 @@ declare function execute(cliPath: string, argv: string[], options?: ExecuteOptio
|
|
|
892
931
|
*/
|
|
893
932
|
declare function resolvePath(filePath: string): string;
|
|
894
933
|
//#endregion
|
|
895
|
-
export { AUTOMATOR_COMMAND_NAMES, ArgvTransform, AuditOptions, AutoPreviewWechatIdeOptions, AutoReplayWechatIdeOptions, AutoWechatIdeOptions, AutomatorCommandOptions, AutomatorOptions, AutomatorSessionOptions, type BaseConfig, BootstrapWechatDevtoolsSettingsOptions, BootstrapWechatDevtoolsSettingsResult, BuildWechatIdeApkOptions, BuildWechatIdeIpaOptions, BuildWechatIdeNpmOptions, CONFIG_COMMAND_NAME, ClearWechatIdeCacheByAutomatorOptions, ClearWechatIdeCacheOptions, CompileWechatIdeByAutomatorOptions, type ConfigSource, DetectWechatDevtoolsServicePortOptions, DetectWechatDevtoolsServicePortResult, DetectedWechatDevtoolsServicePortSettings, ExclusiveKeypressOptions, ForwardConsoleEvent, ForwardConsoleLogLevel, ForwardConsoleOptions, ForwardConsoleSession, InputOptions, LoginWechatIdeOptions, MINIDEV_NAMESPACE_COMMAND_NAMES, MiniProgramElement, type MiniProgramEventMap, MiniProgramLike, MiniProgramPage, NavigateOptions, OpenWechatIdeOptions, OpenWechatIdeOtherProjectOptions, PageDataOptions, PageInfoOptions, ParsedAutomatorArgs, PollWechatIdeEngineBuildResult, PreviewWechatIdeOptions, RETRY_CANCEL_KEYS, RETRY_CONFIRM_KEYS, RETRY_PROMPT_INITIAL_IGNORE_MS, RemoteOptions, ResetWechatIdeFileUtilsOptions, type ResolvedConfig, RetryKeypressOptions, RetryLogger, RetryPromptOptions, RetryPromptResult, RetryableCommandExecutorOptions, RunWechatIdeEngineBuildByHttpOptions, RunWechatIdeEngineBuildOptions,
|
|
934
|
+
export { AUTOMATOR_COMMAND_NAMES, ArgvTransform, AuditOptions, AutoPreviewWechatIdeOptions, AutoReplayWechatIdeOptions, AutoWechatIdeOptions, AutomatorCommandOptions, AutomatorOptions, AutomatorSessionOptions, type BaseConfig, BootstrapWechatDevtoolsSettingsOptions, BootstrapWechatDevtoolsSettingsResult, BuildWechatIdeApkOptions, BuildWechatIdeIpaOptions, BuildWechatIdeNpmOptions, CONFIG_COMMAND_NAME, ClearWechatIdeCacheByAutomatorOptions, ClearWechatIdeCacheOptions, CompileWechatIdeByAutomatorOptions, type ConfigSource, DetectWechatDevtoolsServicePortOptions, DetectWechatDevtoolsServicePortResult, DetectedWechatDevtoolsServicePortSettings, type DevtoolsConnectionInput, type DevtoolsContext, type DevtoolsElementSnapshot, type DevtoolsPageSnapshot, type DevtoolsToolResult, ExclusiveKeypressOptions, ForwardConsoleEvent, ForwardConsoleLogLevel, ForwardConsoleOptions, ForwardConsoleSession, InputOptions, LoginWechatIdeOptions, MCP_COMMAND_NAME, MINIDEV_NAMESPACE_COMMAND_NAMES, McpCommandOptions, MiniProgramElement, type MiniProgramEventMap, MiniProgramLike, MiniProgramPage, NavigateOptions, OpenWechatIdeOptions, OpenWechatIdeOtherProjectOptions, PageDataOptions, PageInfoOptions, ParsedAutomatorArgs, PollWechatIdeEngineBuildResult, PreviewWechatIdeOptions, RETRY_CANCEL_KEYS, RETRY_CONFIRM_KEYS, RETRY_PROMPT_INITIAL_IGNORE_MS, RemoteOptions, ResetWechatIdeFileUtilsOptions, type ResolvedConfig, RetryKeypressOptions, RetryLogger, RetryPromptOptions, RetryPromptResult, RetryableCommandExecutorOptions, RunWechatIdeEngineBuildByHttpOptions, RunWechatIdeEngineBuildOptions, ScreenshotOptions, ScreenshotResult, ScrollOptions, SelectorOptions, SetWechatIdeTicketOptions, SharedInputSession, SharedInputSessionOptions, StartWeappIdeMcpServerOptions, StartWechatIdeEngineBuildResult, SupportedPlatform, SupportedPlatformsMap, TapOptions, UploadWechatIdeOptions, WEAPP_IDE_TOP_LEVEL_COMMAND_NAMES, WECHAT_CLI_COMMAND_NAMES, WECHAT_DEVTOOLS_ENGINE_BUILD_STATUSES, WeappIdeMcpRuntimeHooks, WeappIdeMcpServerHandle, WeappIdeMcpServerOptions, WechatDevtoolsEngineBuildResult, WechatDevtoolsHttpCommandOptions, WechatDevtoolsSecuritySettings, WechatIdeAutomatorSessionOptions, WechatIdeLoginRetryOptions, acquireSharedMiniProgram, audit, autoPreviewWechatIde, autoReplayWechatIde, autoWechatIde, bootstrapWechatDevtoolsSettings, buildWechatIdeApk, buildWechatIdeIpa, buildWechatIdeNpm, captureScreenshotBuffer, clearWechatIdeCache, clearWechatIdeCacheByAutomator, closeSharedMiniProgram, closeWechatIdeProject, compileWechatIdeByAutomator, connectMiniProgram, connectOpenedAutomator, createAlias, createAutoBootstrapDevtoolsConfig, createAutoTrustProjectConfig, createCli, createCustomConfig, createLocaleConfig, createPathCompat, createSharedInputSession, createWeappIdeMcpServer, createWechatIdeLoginRequiredExitError, currentPage, defaultCustomConfigDirPath, defaultCustomConfigFilePath, detectWechatDevtoolsServicePort, dispatchWechatCliCommand, execute, extractExecutionErrorText, formatAutomatorLoginError, formatRetryHotkeyPrompt, formatWechatIdeLoginRequiredError, getAutomatorCommandHelp, getAutomatorProtocolTimeoutMethod, getConfig, getConfiguredLocale, getDefaultCliPath, getSharedMiniProgramSessionCount, getWechatIdeTestAccounts, getWechatIdeTicket, getWechatIdeToolInfo, handleConfigCommand, input, isAutomatorCommand, isAutomatorLoginError, isAutomatorProtocolTimeoutError, isAutomatorWsConnectError, isDevtoolsExtensionContextInvalidatedError, isDevtoolsHttpPortError, isOperatingSystemSupported, isRetryableAutomatorLaunchError, isWeappIdeTopLevelCommand, isWechatIdeLoggedIn, isWechatIdeLoginRequiredError, launchAutomator, loginWechatIde, navigateBack, navigateTo, openWechatIde, openWechatIdeOtherProject, openWechatIdeProjectByHttp, operatingSystemName, overwriteCustomConfig, pageData, pageStack, parse, parseAutomatorArgs, parseCompareArgs, parseScreenshotArgs, pollWechatIdeEngineBuildResultByHttp, previewWechatIde, printCompareHelp, printScreenshotHelp, promptForCliPath, promptRetryKeypress, promptWechatIdeLoginRetry, quitWechatIde, reLaunch, readBooleanOption, readCustomConfig, readElementSnapshot, readOptionValue, redirectTo, refreshWechatIdeTicket, registerWeappIdeMcpTools, releaseSharedMiniProgram, remote, removeCustomConfigKey, removeOption, requestWechatDevtoolsHttp, resetWechatIdeFileUtils, resetWechatIdeFileUtilsByHttp, resolveCliPath, resolveDevtoolsAutomationDefaults, resolvePath, resolveProjectPath, runAutomatorCommand, runMcpCommand, runMinidev, runRetryableCommand, runWechatCliWithRetry, runWechatIdeEngineBuild, runWechatIdeEngineBuildByHttp, runWithSuspendedSharedInput, scrollTo, setWechatIdeTicket, startForwardConsole, startWeappIdeMcpServer, startWechatIdeEngineBuildByHttp, switchTab, systemInfo, takeScreenshot, tap, toSerializableValue, transformArgv, uploadWechatIde, validateWechatCliCommandArgs, waitForExclusiveKeypress, waitForRetryKeypress, withMiniProgram };
|
package/dist/index.js
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { $ as resetWechatIdeFileUtilsByHttp, A as RETRY_CANCEL_KEYS, B as waitForRetryKeypress, C as refreshWechatIdeTicket, D as validateWechatCliCommandArgs, E as uploadWechatIde, F as formatRetryHotkeyPrompt, G as transformArgv, H as execute, I as formatWechatIdeLoginRequiredError, J as runWechatIdeEngineBuildByHttp, K as startForwardConsole, L as isWechatIdeLoginRequiredError, M as RETRY_PROMPT_INITIAL_IGNORE_MS, N as createWechatIdeLoginRequiredExitError, O as runWechatCliWithRetry, P as extractExecutionErrorText, Q as requestWechatDevtoolsHttp, R as promptRetryKeypress, S as quitWechatIde, St as
|
|
3
|
-
|
|
1
|
+
import { B as defaultCustomConfigFilePath, C as getConfig, D as getDefaultCliPath, E as SupportedPlatformsMap, F as createLocaleConfig, I as overwriteCustomConfig, L as readCustomConfig, M as createAutoBootstrapDevtoolsConfig, N as createAutoTrustProjectConfig, O as isOperatingSystemSupported, P as createCustomConfig, R as removeCustomConfigKey, S as resolveCliPath, T as resolveDevtoolsAutomationDefaults, V as resolvePath, _ as isDevtoolsHttpPortError, a as releaseSharedMiniProgram, b as bootstrapWechatDevtoolsSettings, d as formatAutomatorLoginError, f as getAutomatorProtocolTimeoutMethod, g as isDevtoolsExtensionContextInvalidatedError, h as isAutomatorWsConnectError, i as getSharedMiniProgramSessionCount, k as operatingSystemName, m as isAutomatorProtocolTimeoutError, n as closeSharedMiniProgram, o as withMiniProgram, p as isAutomatorLoginError, r as connectMiniProgram, t as acquireSharedMiniProgram, u as connectOpenedAutomator, v as isRetryableAutomatorLaunchError, w as getConfiguredLocale, x as detectWechatDevtoolsServicePort, y as launchAutomator, z as defaultCustomConfigDirPath } from "./automator-session-BZzODsJi.js";
|
|
2
|
+
import { $ as resetWechatIdeFileUtilsByHttp, A as RETRY_CANCEL_KEYS, B as waitForRetryKeypress, C as refreshWechatIdeTicket, Ct as removeOption, D as validateWechatCliCommandArgs, E as uploadWechatIde, F as formatRetryHotkeyPrompt, G as transformArgv, H as execute, I as formatWechatIdeLoginRequiredError, J as runWechatIdeEngineBuildByHttp, K as startForwardConsole, L as isWechatIdeLoginRequiredError, M as RETRY_PROMPT_INITIAL_IGNORE_MS, N as createWechatIdeLoginRequiredExitError, O as runWechatCliWithRetry, P as extractExecutionErrorText, Q as requestWechatDevtoolsHttp, R as promptRetryKeypress, S as quitWechatIde, St as readOptionValue, T as setWechatIdeTicket, U as createAlias, V as runMinidev, W as createPathCompat, X as openWechatIdeProjectByHttp, Y as WECHAT_DEVTOOLS_ENGINE_BUILD_STATUSES, Z as pollWechatIdeEngineBuildResultByHttp, _ as isWechatIdeLoggedIn, _t as printScreenshotHelp, a as autoReplayWechatIde, at as waitForExclusiveKeypress, b as openWechatIdeOtherProject, bt as parseAutomatorArgs, c as buildWechatIdeIpa, ct as MINIDEV_NAMESPACE_COMMAND_NAMES, d as clearWechatIdeCacheByAutomator, dt as isWeappIdeTopLevelCommand, et as startWechatIdeEngineBuildByHttp, f as closeWechatIdeProject, ft as AUTOMATOR_COMMAND_NAMES, g as getWechatIdeToolInfo, gt as parseScreenshotArgs, h as getWechatIdeTicket, ht as runAutomatorCommand, i as autoPreviewWechatIde, it as runWithSuspendedSharedInput, j as RETRY_CONFIRM_KEYS, k as runRetryableCommand, l as buildWechatIdeNpm, lt as WEAPP_IDE_TOP_LEVEL_COMMAND_NAMES, m as getWechatIdeTestAccounts, mt as isAutomatorCommand, n as parse, nt as promptForCliPath, o as autoWechatIde, ot as CONFIG_COMMAND_NAME, p as compileWechatIdeByAutomator, pt as getAutomatorCommandHelp, q as runWechatIdeEngineBuild, r as dispatchWechatCliCommand, rt as createSharedInputSession, s as buildWechatIdeApk, st as MCP_COMMAND_NAME, t as createCli, tt as handleConfigCommand, u as clearWechatIdeCache, ut as WECHAT_CLI_COMMAND_NAMES, v as loginWechatIde, vt as parseCompareArgs, w as resetWechatIdeFileUtils, x as previewWechatIde, xt as readBooleanOption, y as openWechatIde, yt as printCompareHelp, z as promptWechatIdeLoginRetry } from "./cli-B45DqpiD.js";
|
|
3
|
+
import { a as navigateBack, c as pageStack, d as remote, f as scrollTo, g as tap, h as takeScreenshot, i as input, l as reLaunch, m as systemInfo, n as captureScreenshotBuffer, o as navigateTo, p as switchTab, r as currentPage, s as pageData, t as audit, u as redirectTo } from "./commands-BynZfUJ6.js";
|
|
4
|
+
import { a as readElementSnapshot, i as registerWeappIdeMcpTools, n as startWeappIdeMcpServer, o as resolveProjectPath, r as createWeappIdeMcpServer, s as toSerializableValue, t as runMcpCommand } from "./run-mcp-TnooVQe8.js";
|
|
5
|
+
export { AUTOMATOR_COMMAND_NAMES, CONFIG_COMMAND_NAME, MCP_COMMAND_NAME, MINIDEV_NAMESPACE_COMMAND_NAMES, RETRY_CANCEL_KEYS, RETRY_CONFIRM_KEYS, RETRY_PROMPT_INITIAL_IGNORE_MS, SupportedPlatformsMap, WEAPP_IDE_TOP_LEVEL_COMMAND_NAMES, WECHAT_CLI_COMMAND_NAMES, WECHAT_DEVTOOLS_ENGINE_BUILD_STATUSES, acquireSharedMiniProgram, audit, autoPreviewWechatIde, autoReplayWechatIde, autoWechatIde, bootstrapWechatDevtoolsSettings, buildWechatIdeApk, buildWechatIdeIpa, buildWechatIdeNpm, captureScreenshotBuffer, clearWechatIdeCache, clearWechatIdeCacheByAutomator, closeSharedMiniProgram, closeWechatIdeProject, compileWechatIdeByAutomator, connectMiniProgram, connectOpenedAutomator, createAlias, createAutoBootstrapDevtoolsConfig, createAutoTrustProjectConfig, createCli, createCustomConfig, createLocaleConfig, createPathCompat, createSharedInputSession, createWeappIdeMcpServer, createWechatIdeLoginRequiredExitError, currentPage, defaultCustomConfigDirPath, defaultCustomConfigFilePath, detectWechatDevtoolsServicePort, dispatchWechatCliCommand, execute, extractExecutionErrorText, formatAutomatorLoginError, formatRetryHotkeyPrompt, formatWechatIdeLoginRequiredError, getAutomatorCommandHelp, getAutomatorProtocolTimeoutMethod, getConfig, getConfiguredLocale, getDefaultCliPath, getSharedMiniProgramSessionCount, getWechatIdeTestAccounts, getWechatIdeTicket, getWechatIdeToolInfo, handleConfigCommand, input, isAutomatorCommand, isAutomatorLoginError, isAutomatorProtocolTimeoutError, isAutomatorWsConnectError, isDevtoolsExtensionContextInvalidatedError, isDevtoolsHttpPortError, isOperatingSystemSupported, isRetryableAutomatorLaunchError, isWeappIdeTopLevelCommand, isWechatIdeLoggedIn, isWechatIdeLoginRequiredError, launchAutomator, loginWechatIde, navigateBack, navigateTo, openWechatIde, openWechatIdeOtherProject, openWechatIdeProjectByHttp, operatingSystemName, overwriteCustomConfig, pageData, pageStack, parse, parseAutomatorArgs, parseCompareArgs, parseScreenshotArgs, pollWechatIdeEngineBuildResultByHttp, previewWechatIde, printCompareHelp, printScreenshotHelp, promptForCliPath, promptRetryKeypress, promptWechatIdeLoginRetry, quitWechatIde, reLaunch, readBooleanOption, readCustomConfig, readElementSnapshot, readOptionValue, redirectTo, refreshWechatIdeTicket, registerWeappIdeMcpTools, releaseSharedMiniProgram, remote, removeCustomConfigKey, removeOption, requestWechatDevtoolsHttp, resetWechatIdeFileUtils, resetWechatIdeFileUtilsByHttp, resolveCliPath, resolveDevtoolsAutomationDefaults, resolvePath, resolveProjectPath, runAutomatorCommand, runMcpCommand, runMinidev, runRetryableCommand, runWechatCliWithRetry, runWechatIdeEngineBuild, runWechatIdeEngineBuildByHttp, runWithSuspendedSharedInput, scrollTo, setWechatIdeTicket, startForwardConsole, startWeappIdeMcpServer, startWechatIdeEngineBuildByHttp, switchTab, systemInfo, takeScreenshot, tap, toSerializableValue, transformArgv, uploadWechatIde, validateWechatCliCommandArgs, waitForExclusiveKeypress, waitForRetryKeypress, withMiniProgram };
|