nautogui 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/README.md +212 -0
- package/README.zh-CN.md +212 -0
- package/bin/mouseinfo.mjs +8 -0
- package/dist/backend.d.ts +59 -0
- package/dist/backend.d.ts.map +1 -0
- package/dist/backend.js +210 -0
- package/dist/backend.js.map +1 -0
- package/dist/config.d.ts +38 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +60 -0
- package/dist/config.js.map +1 -0
- package/dist/constants.d.ts +16 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +209 -0
- package/dist/constants.js.map +1 -0
- package/dist/coords.d.ts +12 -0
- package/dist/coords.d.ts.map +1 -0
- package/dist/coords.js +46 -0
- package/dist/coords.js.map +1 -0
- package/dist/display-mouse.d.ts +3 -0
- package/dist/display-mouse.d.ts.map +1 -0
- package/dist/display-mouse.js +25 -0
- package/dist/display-mouse.js.map +1 -0
- package/dist/easing-all.d.ts +77 -0
- package/dist/easing-all.d.ts.map +1 -0
- package/dist/easing-all.js +231 -0
- package/dist/easing-all.js.map +1 -0
- package/dist/easing-base.d.ts +8 -0
- package/dist/easing-base.d.ts.map +1 -0
- package/dist/easing-base.js +3 -0
- package/dist/easing-base.js.map +1 -0
- package/dist/easing.d.ts +9 -0
- package/dist/easing.d.ts.map +1 -0
- package/dist/easing.js +15 -0
- package/dist/easing.js.map +1 -0
- package/dist/exceptions.d.ts +18 -0
- package/dist/exceptions.d.ts.map +1 -0
- package/dist/exceptions.js +30 -0
- package/dist/exceptions.js.map +1 -0
- package/dist/hold-context.d.ts +10 -0
- package/dist/hold-context.d.ts.map +1 -0
- package/dist/hold-context.js +31 -0
- package/dist/hold-context.js.map +1 -0
- package/dist/index.d.ts +104 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +362 -0
- package/dist/index.js.map +1 -0
- package/dist/keyboard-utils.d.ts +7 -0
- package/dist/keyboard-utils.d.ts.map +1 -0
- package/dist/keyboard-utils.js +33 -0
- package/dist/keyboard-utils.js.map +1 -0
- package/dist/locate-haystack.d.ts +14 -0
- package/dist/locate-haystack.d.ts.map +1 -0
- package/dist/locate-haystack.js +90 -0
- package/dist/locate-haystack.js.map +1 -0
- package/dist/locate-window.d.ts +12 -0
- package/dist/locate-window.d.ts.map +1 -0
- package/dist/locate-window.js +78 -0
- package/dist/locate-window.js.map +1 -0
- package/dist/log-screenshots.d.ts +3 -0
- package/dist/log-screenshots.d.ts.map +1 -0
- package/dist/log-screenshots.js +32 -0
- package/dist/log-screenshots.js.map +1 -0
- package/dist/mouseinfo.d.ts +8 -0
- package/dist/mouseinfo.d.ts.map +1 -0
- package/dist/mouseinfo.js +83 -0
- package/dist/mouseinfo.js.map +1 -0
- package/dist/msgbox.d.ts +17 -0
- package/dist/msgbox.d.ts.map +1 -0
- package/dist/msgbox.js +77 -0
- package/dist/msgbox.js.map +1 -0
- package/dist/native-msgbox.d.ts +13 -0
- package/dist/native-msgbox.d.ts.map +1 -0
- package/dist/native-msgbox.js +222 -0
- package/dist/native-msgbox.js.map +1 -0
- package/dist/native-utils.d.ts +8 -0
- package/dist/native-utils.d.ts.map +1 -0
- package/dist/native-utils.js +24 -0
- package/dist/native-utils.js.map +1 -0
- package/dist/pixel.d.ts +9 -0
- package/dist/pixel.d.ts.map +1 -0
- package/dist/pixel.js +14 -0
- package/dist/pixel.js.map +1 -0
- package/dist/region.d.ts +14 -0
- package/dist/region.d.ts.map +1 -0
- package/dist/region.js +13 -0
- package/dist/region.js.map +1 -0
- package/dist/run.d.ts +9 -0
- package/dist/run.d.ts.map +1 -0
- package/dist/run.js +189 -0
- package/dist/run.js.map +1 -0
- package/dist/runtime.d.ts +12 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +53 -0
- package/dist/runtime.js.map +1 -0
- package/dist/windows.d.ts +30 -0
- package/dist/windows.d.ts.map +1 -0
- package/dist/windows.js +62 -0
- package/dist/windows.js.map +1 -0
- package/package.json +63 -0
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/** Template match limited to a window region. */
|
|
2
|
+
import { getNut } from "./backend.js";
|
|
3
|
+
import { USE_IMAGE_NOT_FOUND_EXCEPTION } from "./config.js";
|
|
4
|
+
import { ImageNotFoundException } from "./exceptions.js";
|
|
5
|
+
async function resolveWindow(title) {
|
|
6
|
+
const n = await getNut();
|
|
7
|
+
if (!title?.trim()) {
|
|
8
|
+
return { n, win: await n.getActiveWindow() };
|
|
9
|
+
}
|
|
10
|
+
const wins = await n.getWindows();
|
|
11
|
+
for (const w of wins) {
|
|
12
|
+
if ((await w.title).includes(title)) {
|
|
13
|
+
return { n, win: w };
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
18
|
+
export async function locateOnWindow(imagePath, title, opts) {
|
|
19
|
+
const resolved = await resolveWindow(title);
|
|
20
|
+
if (!resolved) {
|
|
21
|
+
if (USE_IMAGE_NOT_FOUND_EXCEPTION && title) {
|
|
22
|
+
throw new ImageNotFoundException(`No window with title containing: ${title}`);
|
|
23
|
+
}
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
const { n, win } = resolved;
|
|
27
|
+
const img = await n.loadImage(imagePath);
|
|
28
|
+
const region = await win.region;
|
|
29
|
+
const { OptionalSearchParameters, Region } = await import("@nut-tree/shared");
|
|
30
|
+
const params = new OptionalSearchParameters(new Region(region.left, region.top, region.width, region.height), opts?.confidence);
|
|
31
|
+
try {
|
|
32
|
+
const match = await n.screen.find(img, params);
|
|
33
|
+
return {
|
|
34
|
+
left: match.left,
|
|
35
|
+
top: match.top,
|
|
36
|
+
width: match.width,
|
|
37
|
+
height: match.height,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
if (USE_IMAGE_NOT_FOUND_EXCEPTION) {
|
|
42
|
+
throw new ImageNotFoundException(`Could not locate ${imagePath} on window`);
|
|
43
|
+
}
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
export async function locateAllOnWindow(imagePath, title, opts) {
|
|
48
|
+
const resolved = await resolveWindow(title);
|
|
49
|
+
if (!resolved)
|
|
50
|
+
return [];
|
|
51
|
+
const { n, win } = resolved;
|
|
52
|
+
const img = await n.loadImage(imagePath);
|
|
53
|
+
const region = await win.region;
|
|
54
|
+
const { OptionalSearchParameters, Region } = await import("@nut-tree/shared");
|
|
55
|
+
const params = new OptionalSearchParameters(new Region(region.left, region.top, region.width, region.height), opts?.confidence);
|
|
56
|
+
try {
|
|
57
|
+
const regions = await n.screen.findAll(img, params);
|
|
58
|
+
return regions.map((r) => ({
|
|
59
|
+
left: r.left,
|
|
60
|
+
top: r.top,
|
|
61
|
+
width: r.width,
|
|
62
|
+
height: r.height,
|
|
63
|
+
}));
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
return [];
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
export async function locateCenterOnWindow(imagePath, title, opts) {
|
|
70
|
+
const box = await locateOnWindow(imagePath, title, opts);
|
|
71
|
+
if (!box)
|
|
72
|
+
return null;
|
|
73
|
+
return {
|
|
74
|
+
x: Math.round(box.left + box.width / 2),
|
|
75
|
+
y: Math.round(box.top + box.height / 2),
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=locate-window.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"locate-window.js","sourceRoot":"","sources":["../src/locate-window.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log-screenshots.d.ts","sourceRoot":"","sources":["../src/log-screenshots.ts"],"names":[],"mappings":"AAAA,qBAAqB;AAWrB,wBAAsB,aAAa,CACjC,iBAAiB,EAAE,OAAO,GAAG,SAAS,EACtC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,MAAM,SAAM,GACX,OAAO,CAAC,IAAI,CAAC,CA2Bf"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/** _logScreenshot */
|
|
2
|
+
import { unlinkSync } from "node:fs";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { captureScreenPng } from "./backend.js";
|
|
5
|
+
import { G_LOG_SCREENSHOTS_FILENAMES, LOG_SCREENSHOTS, LOG_SCREENSHOTS_LIMIT, } from "./config.js";
|
|
6
|
+
export async function logScreenshot(logScreenshotFlag, funcName, funcArgs, folder = ".") {
|
|
7
|
+
if (logScreenshotFlag === false)
|
|
8
|
+
return;
|
|
9
|
+
if (logScreenshotFlag == null && !LOG_SCREENSHOTS)
|
|
10
|
+
return;
|
|
11
|
+
let args = funcArgs;
|
|
12
|
+
if (args.length > 12)
|
|
13
|
+
args = `${args.slice(0, 12)}...`;
|
|
14
|
+
const now = new Date();
|
|
15
|
+
const stem = `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, "0")}-${String(now.getDate()).padStart(2, "0")}_${now.getHours()}-${now.getMinutes()}-${now.getSeconds()}-${String(now.getMilliseconds()).padStart(3, "0")}_${funcName}_${args}`;
|
|
16
|
+
const filepath = join(folder, `${stem}.png`);
|
|
17
|
+
if (LOG_SCREENSHOTS_LIMIT != null &&
|
|
18
|
+
G_LOG_SCREENSHOTS_FILENAMES.length >= LOG_SCREENSHOTS_LIMIT) {
|
|
19
|
+
const oldest = G_LOG_SCREENSHOTS_FILENAMES.shift();
|
|
20
|
+
if (oldest) {
|
|
21
|
+
try {
|
|
22
|
+
unlinkSync(join(folder, oldest));
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
/* ignore */
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
await captureScreenPng(folder, stem);
|
|
30
|
+
G_LOG_SCREENSHOTS_FILENAMES.push(`${stem}.png`);
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=log-screenshots.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log-screenshots.js","sourceRoot":"","sources":["../src/log-screenshots.ts"],"names":[],"mappings":"AAAA,qBAAqB;AAErB,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EACL,2BAA2B,EAC3B,eAAe,EACf,qBAAqB,GACtB,MAAM,aAAa,CAAC;AAErB,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,iBAAsC,EACtC,QAAgB,EAChB,QAAgB,EAChB,MAAM,GAAG,GAAG;IAEZ,IAAI,iBAAiB,KAAK,KAAK;QAAE,OAAO;IACxC,IAAI,iBAAiB,IAAI,IAAI,IAAI,CAAC,eAAe;QAAE,OAAO;IAE1D,IAAI,IAAI,GAAG,QAAQ,CAAC;IACpB,IAAI,IAAI,CAAC,MAAM,GAAG,EAAE;QAAE,IAAI,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC;IAEvD,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,MAAM,IAAI,GAAG,GAAG,GAAG,CAAC,WAAW,EAAE,IAAI,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,GAAG,CAAC,QAAQ,EAAE,IAAI,GAAG,CAAC,UAAU,EAAE,IAAI,GAAG,CAAC,UAAU,EAAE,IAAI,MAAM,CAAC,GAAG,CAAC,eAAe,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,QAAQ,IAAI,IAAI,EAAE,CAAC;IAC7P,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,MAAM,CAAC,CAAC;IAE7C,IACE,qBAAqB,IAAI,IAAI;QAC7B,2BAA2B,CAAC,MAAM,IAAI,qBAAqB,EAC3D,CAAC;QACD,MAAM,MAAM,GAAG,2BAA2B,CAAC,KAAK,EAAE,CAAC;QACnD,IAAI,MAAM,EAAE,CAAC;YACX,IAAI,CAAC;gBACH,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;YACnC,CAAC;YAAC,MAAM,CAAC;gBACP,YAAY;YACd,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,gBAAgB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACrC,2BAA2B,CAAC,IAAI,CAAC,GAAG,IAAI,MAAM,CAAC,CAAC;AAClD,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MouseInfoWindow / mouseInfo()
|
|
3
|
+
*/
|
|
4
|
+
/** Launch MouseInfo GUI (Windows) or terminal tracker. Blocks until closed. */
|
|
5
|
+
export declare function mouseInfo(): Promise<void>;
|
|
6
|
+
/** Alias for MouseInfoWindow() */
|
|
7
|
+
export declare const MouseInfoWindow: typeof mouseInfo;
|
|
8
|
+
//# sourceMappingURL=mouseinfo.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mouseinfo.d.ts","sourceRoot":"","sources":["../src/mouseinfo.ts"],"names":[],"mappings":"AAAA;;GAEG;AA8CH,+EAA+E;AAC/E,wBAAsB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAoC/C;AAED,kCAAkC;AAClC,eAAO,MAAM,eAAe,kBAAY,CAAC"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MouseInfoWindow / mouseInfo()
|
|
3
|
+
*/
|
|
4
|
+
import { execFile, spawn } from "node:child_process";
|
|
5
|
+
import { mkdtempSync, writeFileSync } from "node:fs";
|
|
6
|
+
import { tmpdir } from "node:os";
|
|
7
|
+
import { join } from "node:path";
|
|
8
|
+
import { promisify } from "node:util";
|
|
9
|
+
import { displayMousePosition } from "./display-mouse.js";
|
|
10
|
+
const execFileAsync = promisify(execFile);
|
|
11
|
+
const WIN_MOUSEINFO_PS1 = [
|
|
12
|
+
"Add-Type -AssemblyName System.Windows.Forms",
|
|
13
|
+
"Add-Type -AssemblyName System.Drawing",
|
|
14
|
+
"$form = New-Object System.Windows.Forms.Form",
|
|
15
|
+
"$form.Text = 'MouseInfo (nautogui)'",
|
|
16
|
+
"$form.Size = New-Object System.Drawing.Size(360, 160)",
|
|
17
|
+
"$form.StartPosition = 'Manual'",
|
|
18
|
+
"$form.Location = New-Object System.Drawing.Point(20, 20)",
|
|
19
|
+
"$form.TopMost = $true",
|
|
20
|
+
"$form.FormBorderStyle = 'FixedDialog'",
|
|
21
|
+
"$form.MaximizeBox = $false",
|
|
22
|
+
"$label = New-Object System.Windows.Forms.Label",
|
|
23
|
+
"$label.AutoSize = $false",
|
|
24
|
+
"$label.Size = New-Object System.Drawing.Size(330, 80)",
|
|
25
|
+
"$label.Location = New-Object System.Drawing.Point(10, 10)",
|
|
26
|
+
"$label.Font = New-Object System.Drawing.Font('Consolas', 10)",
|
|
27
|
+
"$form.Controls.Add($label)",
|
|
28
|
+
"$hint = New-Object System.Windows.Forms.Label",
|
|
29
|
+
"$hint.Text = 'Close window to exit. Live X/Y for nautogui.moveTo / click.'",
|
|
30
|
+
"$hint.AutoSize = $true",
|
|
31
|
+
"$hint.Location = New-Object System.Drawing.Point(10, 95)",
|
|
32
|
+
"$form.Controls.Add($hint)",
|
|
33
|
+
"$timer = New-Object System.Windows.Forms.Timer",
|
|
34
|
+
"$timer.Interval = 100",
|
|
35
|
+
"$timer.Add_Tick({",
|
|
36
|
+
" $p = [System.Windows.Forms.Cursor]::Position",
|
|
37
|
+
' $label.Text = "X: $($p.X)`nY: $($p.Y)"',
|
|
38
|
+
"})",
|
|
39
|
+
"$timer.Start()",
|
|
40
|
+
"[void]$form.ShowDialog()",
|
|
41
|
+
"$timer.Stop()",
|
|
42
|
+
"$timer.Dispose()",
|
|
43
|
+
"$form.Dispose()",
|
|
44
|
+
].join("\n");
|
|
45
|
+
/** Launch MouseInfo GUI (Windows) or terminal tracker. Blocks until closed. */
|
|
46
|
+
export async function mouseInfo() {
|
|
47
|
+
if (process.platform === "win32") {
|
|
48
|
+
try {
|
|
49
|
+
const dir = mkdtempSync(join(tmpdir(), "nautogui-mouseinfo-"));
|
|
50
|
+
const scriptPath = join(dir, "mouseinfo.ps1");
|
|
51
|
+
writeFileSync(scriptPath, WIN_MOUSEINFO_PS1, "utf8");
|
|
52
|
+
await new Promise((resolve, reject) => {
|
|
53
|
+
const child = spawn("powershell", ["-NoProfile", "-STA", "-ExecutionPolicy", "Bypass", "-File", scriptPath], { stdio: "inherit", windowsHide: false });
|
|
54
|
+
child.on("error", reject);
|
|
55
|
+
child.on("exit", (code) => {
|
|
56
|
+
if (code === 0 || code === null)
|
|
57
|
+
resolve();
|
|
58
|
+
else
|
|
59
|
+
reject(new Error(`MouseInfo exited with code ${code}`));
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
/* CLI fallback */
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
if (process.platform === "darwin") {
|
|
69
|
+
try {
|
|
70
|
+
await execFileAsync("osascript", [
|
|
71
|
+
"-e",
|
|
72
|
+
'display notification "Terminal MouseInfo: X/Y/RGB. Ctrl-C to quit." with title "nautogui"',
|
|
73
|
+
]);
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
/* ignore */
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
await displayMousePosition();
|
|
80
|
+
}
|
|
81
|
+
/** Alias for MouseInfoWindow() */
|
|
82
|
+
export const MouseInfoWindow = mouseInfo;
|
|
83
|
+
//# sourceMappingURL=mouseinfo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mouseinfo.js","sourceRoot":"","sources":["../src/mouseinfo.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACrD,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAE1D,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAE1C,MAAM,iBAAiB,GAAG;IACxB,6CAA6C;IAC7C,uCAAuC;IACvC,8CAA8C;IAC9C,qCAAqC;IACrC,uDAAuD;IACvD,gCAAgC;IAChC,0DAA0D;IAC1D,uBAAuB;IACvB,uCAAuC;IACvC,4BAA4B;IAC5B,gDAAgD;IAChD,0BAA0B;IAC1B,uDAAuD;IACvD,2DAA2D;IAC3D,8DAA8D;IAC9D,4BAA4B;IAC5B,+CAA+C;IAC/C,4EAA4E;IAC5E,wBAAwB;IACxB,0DAA0D;IAC1D,2BAA2B;IAC3B,gDAAgD;IAChD,uBAAuB;IACvB,mBAAmB;IACnB,gDAAgD;IAChD,0CAA0C;IAC1C,IAAI;IACJ,gBAAgB;IAChB,0BAA0B;IAC1B,eAAe;IACf,kBAAkB;IAClB,iBAAiB;CAClB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEb,+EAA+E;AAC/E,MAAM,CAAC,KAAK,UAAU,SAAS;IAC7B,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,qBAAqB,CAAC,CAAC,CAAC;YAC/D,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;YAC9C,aAAa,CAAC,UAAU,EAAE,iBAAiB,EAAE,MAAM,CAAC,CAAC;YACrD,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBAC1C,MAAM,KAAK,GAAG,KAAK,CACjB,YAAY,EACZ,CAAC,YAAY,EAAE,MAAM,EAAE,kBAAkB,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,CAAC,EACzE,EAAE,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,KAAK,EAAE,CACzC,CAAC;gBACF,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;gBAC1B,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;oBACxB,IAAI,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,IAAI;wBAAE,OAAO,EAAE,CAAC;;wBACtC,MAAM,CAAC,IAAI,KAAK,CAAC,8BAA8B,IAAI,EAAE,CAAC,CAAC,CAAC;gBAC/D,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAAC,MAAM,CAAC;YACP,kBAAkB;QACpB,CAAC;IACH,CAAC;IAED,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAClC,IAAI,CAAC;YACH,MAAM,aAAa,CAAC,WAAW,EAAE;gBAC/B,IAAI;gBACJ,2FAA2F;aAC5F,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,YAAY;QACd,CAAC;IACH,CAAC;IAED,MAAM,oBAAoB,EAAE,CAAC;AAC/B,CAAC;AAED,kCAAkC;AAClC,MAAM,CAAC,MAAM,eAAe,GAAG,SAAS,CAAC"}
|
package/dist/msgbox.d.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* nautogui msgbox — native OS dialogs with readline fallback.
|
|
3
|
+
*
|
|
4
|
+
* NAUTOGUI_NATIVE_MSGBOX=auto|native|cli (default auto)
|
|
5
|
+
*/
|
|
6
|
+
import { detectNativeMsgboxSupport } from "./native-msgbox.js";
|
|
7
|
+
export type ConfirmOptions = {
|
|
8
|
+
title?: string;
|
|
9
|
+
buttons?: string[];
|
|
10
|
+
default?: string;
|
|
11
|
+
};
|
|
12
|
+
export { detectNativeMsgboxSupport };
|
|
13
|
+
export declare function alert(text: string, title?: string, button?: string): Promise<string>;
|
|
14
|
+
export declare function confirm(text: string, titleOrButtons?: string | ConfirmOptions, buttons?: string[]): Promise<string>;
|
|
15
|
+
export declare function prompt(text: string, defaultText?: string, title?: string): Promise<string | null>;
|
|
16
|
+
export declare function password(text: string, title?: string, defaultText?: string): Promise<string>;
|
|
17
|
+
//# sourceMappingURL=msgbox.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"msgbox.d.ts","sourceRoot":"","sources":["../src/msgbox.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EACL,yBAAyB,EAI1B,MAAM,oBAAoB,CAAC;AAE5B,MAAM,MAAM,cAAc,GAAG;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,OAAO,EAAE,yBAAyB,EAAE,CAAC;AAErC,wBAAsB,KAAK,CACzB,IAAI,EAAE,MAAM,EACZ,KAAK,SAAU,EACf,MAAM,SAAO,GACZ,OAAO,CAAC,MAAM,CAAC,CAKjB;AAED,wBAAsB,OAAO,CAC3B,IAAI,EAAE,MAAM,EACZ,cAAc,GAAE,MAAM,GAAG,cAA0B,EACnD,OAAO,CAAC,EAAE,MAAM,EAAE,GACjB,OAAO,CAAC,MAAM,CAAC,CA2BjB;AAED,wBAAsB,MAAM,CAC1B,IAAI,EAAE,MAAM,EACZ,WAAW,SAAK,EAChB,KAAK,SAAW,GACf,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAcxB;AAED,wBAAsB,QAAQ,CAC5B,IAAI,EAAE,MAAM,EACZ,KAAK,SAAa,EAClB,WAAW,SAAK,GACf,OAAO,CAAC,MAAM,CAAC,CAYjB"}
|
package/dist/msgbox.js
ADDED
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* nautogui msgbox — native OS dialogs with readline fallback.
|
|
3
|
+
*
|
|
4
|
+
* NAUTOGUI_NATIVE_MSGBOX=auto|native|cli (default auto)
|
|
5
|
+
*/
|
|
6
|
+
import { createInterface } from "node:readline/promises";
|
|
7
|
+
import { stdin as input, stdout as output } from "node:process";
|
|
8
|
+
import { detectNativeMsgboxSupport, nativeAlert, nativeConfirm, nativePrompt, } from "./native-msgbox.js";
|
|
9
|
+
export { detectNativeMsgboxSupport };
|
|
10
|
+
export async function alert(text, title = "Alert", button = "OK") {
|
|
11
|
+
const native = await nativeAlert(text, title, button);
|
|
12
|
+
if (native != null)
|
|
13
|
+
return native;
|
|
14
|
+
console.log(`\n[${title}] ${text}\n(${button})\n`);
|
|
15
|
+
return button;
|
|
16
|
+
}
|
|
17
|
+
export async function confirm(text, titleOrButtons = "Confirm", buttons) {
|
|
18
|
+
let title = "Confirm";
|
|
19
|
+
let optsButtons = buttons ?? ["OK", "Cancel"];
|
|
20
|
+
if (typeof titleOrButtons === "object") {
|
|
21
|
+
title = titleOrButtons.title ?? title;
|
|
22
|
+
optsButtons = titleOrButtons.buttons ?? optsButtons;
|
|
23
|
+
}
|
|
24
|
+
else if (typeof titleOrButtons === "string" && !buttons) {
|
|
25
|
+
title = titleOrButtons;
|
|
26
|
+
}
|
|
27
|
+
const native = await nativeConfirm(text, title, optsButtons);
|
|
28
|
+
if (native != null)
|
|
29
|
+
return native;
|
|
30
|
+
const rl = createInterface({ input, output });
|
|
31
|
+
try {
|
|
32
|
+
const options = optsButtons.map((b, i) => `${i + 1}=${b}`).join(", ");
|
|
33
|
+
const answer = await rl.question(`[${title}] ${text} (${options}): `);
|
|
34
|
+
const trimmed = answer.trim();
|
|
35
|
+
const byIndex = parseInt(trimmed, 10);
|
|
36
|
+
if (!Number.isNaN(byIndex) && byIndex >= 1 && byIndex <= optsButtons.length) {
|
|
37
|
+
return optsButtons[byIndex - 1];
|
|
38
|
+
}
|
|
39
|
+
const match = optsButtons.find((b) => b.toLowerCase() === trimmed.toLowerCase());
|
|
40
|
+
return match ?? optsButtons[0];
|
|
41
|
+
}
|
|
42
|
+
finally {
|
|
43
|
+
rl.close();
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
export async function prompt(text, defaultText = "", title = "Prompt") {
|
|
47
|
+
const native = await nativePrompt(text, title, defaultText, "prompt");
|
|
48
|
+
if (native !== undefined)
|
|
49
|
+
return native;
|
|
50
|
+
const rl = createInterface({ input, output });
|
|
51
|
+
try {
|
|
52
|
+
const suffix = defaultText ? ` [${defaultText}]` : "";
|
|
53
|
+
const answer = await rl.question(`[${title}] ${text}${suffix}: `);
|
|
54
|
+
const trimmed = answer.trim();
|
|
55
|
+
if (trimmed.length === 0 && defaultText.length === 0)
|
|
56
|
+
return null;
|
|
57
|
+
return trimmed.length > 0 ? trimmed : defaultText;
|
|
58
|
+
}
|
|
59
|
+
finally {
|
|
60
|
+
rl.close();
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
export async function password(text, title = "Password", defaultText = "") {
|
|
64
|
+
const native = await nativePrompt(text, title, defaultText, "password");
|
|
65
|
+
if (native !== undefined && native != null)
|
|
66
|
+
return native;
|
|
67
|
+
const rl = createInterface({ input, output });
|
|
68
|
+
try {
|
|
69
|
+
const answer = await rl.question(`[${title}] ${text}: `);
|
|
70
|
+
const trimmed = answer.trim();
|
|
71
|
+
return trimmed.length > 0 ? trimmed : defaultText;
|
|
72
|
+
}
|
|
73
|
+
finally {
|
|
74
|
+
rl.close();
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=msgbox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"msgbox.js","sourceRoot":"","sources":["../src/msgbox.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Native OS message boxes.
|
|
3
|
+
*/
|
|
4
|
+
export type NativeSupport = {
|
|
5
|
+
platform: NodeJS.Platform;
|
|
6
|
+
available: boolean;
|
|
7
|
+
tool?: string;
|
|
8
|
+
};
|
|
9
|
+
export declare function detectNativeMsgboxSupport(): Promise<NativeSupport>;
|
|
10
|
+
export declare function nativeAlert(text: string, title?: string, button?: string): Promise<string | null>;
|
|
11
|
+
export declare function nativeConfirm(text: string, title?: string, buttons?: string[]): Promise<string | null>;
|
|
12
|
+
export declare function nativePrompt(text: string, title?: string, defaultText?: string, kind?: "prompt" | "password"): Promise<string | null | undefined>;
|
|
13
|
+
//# sourceMappingURL=native-msgbox.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"native-msgbox.d.ts","sourceRoot":"","sources":["../src/native-msgbox.ts"],"names":[],"mappings":"AAAA;;GAEG;AAQH,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC;IAC1B,SAAS,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,wBAAsB,yBAAyB,IAAI,OAAO,CAAC,aAAa,CAAC,CAgBxE;AAqKD,wBAAsB,WAAW,CAC/B,IAAI,EAAE,MAAM,EACZ,KAAK,SAAU,EACf,MAAM,SAAO,GACZ,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAWxB;AAED,wBAAsB,aAAa,CACjC,IAAI,EAAE,MAAM,EACZ,KAAK,SAAY,EACjB,OAAO,GAAE,MAAM,EAAqB,GACnC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAaxB;AAED,wBAAsB,YAAY,CAChC,IAAI,EAAE,MAAM,EACZ,KAAK,SAAW,EAChB,WAAW,SAAK,EAChB,IAAI,GAAE,QAAQ,GAAG,UAAqB,GACrC,OAAO,CAAC,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,CAgBpC"}
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Native OS message boxes.
|
|
3
|
+
*/
|
|
4
|
+
import { execFile } from "node:child_process";
|
|
5
|
+
import { promisify } from "node:util";
|
|
6
|
+
import { psQuote, resolveNativeMsgboxMode, shQuote, shouldUseNativeMsgbox } from "./native-utils.js";
|
|
7
|
+
const execFileAsync = promisify(execFile);
|
|
8
|
+
export async function detectNativeMsgboxSupport() {
|
|
9
|
+
if (process.platform === "win32") {
|
|
10
|
+
return { platform: "win32", available: true, tool: "powershell+WinForms" };
|
|
11
|
+
}
|
|
12
|
+
if (process.platform === "darwin") {
|
|
13
|
+
return { platform: "darwin", available: true, tool: "osascript" };
|
|
14
|
+
}
|
|
15
|
+
for (const tool of ["zenity", "kdialog"]) {
|
|
16
|
+
try {
|
|
17
|
+
await execFileAsync("which", [tool]);
|
|
18
|
+
return { platform: "linux", available: true, tool };
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
/* next */
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
return { platform: process.platform, available: false };
|
|
25
|
+
}
|
|
26
|
+
async function runPowerShell(script) {
|
|
27
|
+
const { stdout } = await execFileAsync("powershell", ["-NoProfile", "-NonInteractive", "-STA", "-Command", script], { windowsHide: true, maxBuffer: 1024 * 1024 });
|
|
28
|
+
return stdout.trim();
|
|
29
|
+
}
|
|
30
|
+
async function winAlert(text, title, button) {
|
|
31
|
+
const t = psQuote(text);
|
|
32
|
+
const ttl = psQuote(title);
|
|
33
|
+
await runPowerShell(`Add-Type -AssemblyName System.Windows.Forms; [void][System.Windows.Forms.MessageBox]::Show('${t}','${ttl}','OK','Information')`);
|
|
34
|
+
return button;
|
|
35
|
+
}
|
|
36
|
+
async function winConfirm(text, title, buttons) {
|
|
37
|
+
const t = psQuote(text);
|
|
38
|
+
const ttl = psQuote(title);
|
|
39
|
+
if (buttons.length === 2) {
|
|
40
|
+
const script = `Add-Type -AssemblyName System.Windows.Forms
|
|
41
|
+
$r = [System.Windows.Forms.MessageBox]::Show('${t}','${ttl}','YesNoCancel','Question')
|
|
42
|
+
switch ($r) {
|
|
43
|
+
'Yes' { Write-Output '${psQuote(buttons[0])}' ; break }
|
|
44
|
+
'No' { Write-Output '${psQuote(buttons[1])}' ; break }
|
|
45
|
+
default { Write-Output '${psQuote(buttons[buttons.length - 1])}' }
|
|
46
|
+
}`;
|
|
47
|
+
return runPowerShell(script);
|
|
48
|
+
}
|
|
49
|
+
const joined = buttons.map((b, i) => `${i + 1}. ${b}`).join("\\n");
|
|
50
|
+
const script = `Add-Type -AssemblyName System.Windows.Forms
|
|
51
|
+
$msg = '${t}' + [Environment]::NewLine + [Environment]::NewLine + '${psQuote(joined)}'
|
|
52
|
+
[void][System.Windows.Forms.MessageBox]::Show($msg,'${ttl}')
|
|
53
|
+
Write-Output '${psQuote(buttons[0])}'`;
|
|
54
|
+
return runPowerShell(script);
|
|
55
|
+
}
|
|
56
|
+
async function winPrompt(text, title, defaultText) {
|
|
57
|
+
const script = `Add-Type -AssemblyName Microsoft.VisualBasic
|
|
58
|
+
$r = [Microsoft.VisualBasic.Interaction]::InputBox('${psQuote(text)}','${psQuote(title)}','${psQuote(defaultText)}')
|
|
59
|
+
if ($null -eq $r) { exit 2 }
|
|
60
|
+
Write-Output $r`;
|
|
61
|
+
try {
|
|
62
|
+
return await runPowerShell(script);
|
|
63
|
+
}
|
|
64
|
+
catch (err) {
|
|
65
|
+
if (err.code === 2)
|
|
66
|
+
return null;
|
|
67
|
+
throw err;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
async function darwinDialog(text, title, kind, extra) {
|
|
71
|
+
const msg = shQuote(text);
|
|
72
|
+
const ttl = shQuote(title);
|
|
73
|
+
if (kind === "alert") {
|
|
74
|
+
await execFileAsync("osascript", [
|
|
75
|
+
"-e",
|
|
76
|
+
`display dialog "${msg}" with title "${ttl}" buttons {"OK"} default button "OK" with icon note`,
|
|
77
|
+
]);
|
|
78
|
+
return "OK";
|
|
79
|
+
}
|
|
80
|
+
if (kind === "confirm") {
|
|
81
|
+
const btns = extra?.buttons ?? ["OK", "Cancel"];
|
|
82
|
+
const btnSpec = btns.map((b) => `"${shQuote(b)}"`).join(", ");
|
|
83
|
+
const { stdout } = await execFileAsync("osascript", [
|
|
84
|
+
"-e",
|
|
85
|
+
`button returned of (display dialog "${msg}" with title "${ttl}" buttons {${btnSpec}} default button "${shQuote(btns[0])}")`,
|
|
86
|
+
]);
|
|
87
|
+
return stdout.trim();
|
|
88
|
+
}
|
|
89
|
+
const def = extra?.defaultText ?? "";
|
|
90
|
+
const hidden = kind === "password" ? " with hidden answer" : "";
|
|
91
|
+
const { stdout } = await execFileAsync("osascript", [
|
|
92
|
+
"-e",
|
|
93
|
+
`text returned of (display dialog "${msg}" with title "${ttl}" default answer "${shQuote(def)}"${hidden})`,
|
|
94
|
+
]);
|
|
95
|
+
const out = stdout.trim();
|
|
96
|
+
return out.length > 0 ? out : def || null;
|
|
97
|
+
}
|
|
98
|
+
async function linuxDialog(tool, text, title, kind, extra) {
|
|
99
|
+
if (tool === "zenity") {
|
|
100
|
+
if (kind === "alert") {
|
|
101
|
+
await execFileAsync("zenity", ["--info", `--text=${text}`, `--title=${title}`]);
|
|
102
|
+
return "OK";
|
|
103
|
+
}
|
|
104
|
+
if (kind === "confirm") {
|
|
105
|
+
const btns = extra?.buttons ?? ["OK", "Cancel"];
|
|
106
|
+
try {
|
|
107
|
+
await execFileAsync("zenity", [
|
|
108
|
+
"--question",
|
|
109
|
+
`--text=${text}`,
|
|
110
|
+
`--title=${title}`,
|
|
111
|
+
`--ok-label=${btns[0]}`,
|
|
112
|
+
`--cancel-label=${btns[1] ?? "Cancel"}`,
|
|
113
|
+
]);
|
|
114
|
+
return btns[0];
|
|
115
|
+
}
|
|
116
|
+
catch {
|
|
117
|
+
return btns[1] ?? "Cancel";
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
const args = kind === "password"
|
|
121
|
+
? ["--password", `--text=${text}`, `--title=${title}`]
|
|
122
|
+
: ["--entry", `--text=${text}`, `--title=${title}`, `--entry-text=${extra?.defaultText ?? ""}`];
|
|
123
|
+
const { stdout } = await execFileAsync("zenity", args);
|
|
124
|
+
const out = stdout.trim();
|
|
125
|
+
return out.length > 0 ? out : extra?.defaultText ?? null;
|
|
126
|
+
}
|
|
127
|
+
if (kind === "alert") {
|
|
128
|
+
await execFileAsync("kdialog", ["--msgbox", text, "--title", title]);
|
|
129
|
+
return "OK";
|
|
130
|
+
}
|
|
131
|
+
if (kind === "confirm") {
|
|
132
|
+
const btns = extra?.buttons ?? ["OK", "Cancel"];
|
|
133
|
+
try {
|
|
134
|
+
await execFileAsync("kdialog", [
|
|
135
|
+
"--yesno",
|
|
136
|
+
text,
|
|
137
|
+
"--title",
|
|
138
|
+
title,
|
|
139
|
+
"--yes-label",
|
|
140
|
+
btns[0],
|
|
141
|
+
"--no-label",
|
|
142
|
+
btns[1] ?? "Cancel",
|
|
143
|
+
]);
|
|
144
|
+
return btns[0];
|
|
145
|
+
}
|
|
146
|
+
catch {
|
|
147
|
+
return btns[1] ?? "Cancel";
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
const flag = kind === "password" ? "--password" : "--inputbox";
|
|
151
|
+
const { stdout } = await execFileAsync("kdialog", [
|
|
152
|
+
flag,
|
|
153
|
+
text,
|
|
154
|
+
extra?.defaultText ?? "",
|
|
155
|
+
"--title",
|
|
156
|
+
title,
|
|
157
|
+
]);
|
|
158
|
+
const out = stdout.trim();
|
|
159
|
+
return out.length > 0 ? out : extra?.defaultText ?? null;
|
|
160
|
+
}
|
|
161
|
+
async function withNative(fn) {
|
|
162
|
+
try {
|
|
163
|
+
return await fn();
|
|
164
|
+
}
|
|
165
|
+
catch {
|
|
166
|
+
return null;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
export async function nativeAlert(text, title = "Alert", button = "OK") {
|
|
170
|
+
if (!shouldUseNativeMsgbox(resolveNativeMsgboxMode()))
|
|
171
|
+
return null;
|
|
172
|
+
const support = await detectNativeMsgboxSupport();
|
|
173
|
+
if (!support.available)
|
|
174
|
+
return null;
|
|
175
|
+
if (support.platform === "win32")
|
|
176
|
+
return withNative(() => winAlert(text, title, button));
|
|
177
|
+
if (support.platform === "darwin")
|
|
178
|
+
return withNative(() => darwinDialog(text, title, "alert"));
|
|
179
|
+
if (support.tool === "zenity" || support.tool === "kdialog") {
|
|
180
|
+
const tool = support.tool;
|
|
181
|
+
return withNative(() => linuxDialog(tool, text, title, "alert"));
|
|
182
|
+
}
|
|
183
|
+
return null;
|
|
184
|
+
}
|
|
185
|
+
export async function nativeConfirm(text, title = "Confirm", buttons = ["OK", "Cancel"]) {
|
|
186
|
+
if (!shouldUseNativeMsgbox(resolveNativeMsgboxMode()))
|
|
187
|
+
return null;
|
|
188
|
+
const support = await detectNativeMsgboxSupport();
|
|
189
|
+
if (!support.available)
|
|
190
|
+
return null;
|
|
191
|
+
if (support.platform === "win32")
|
|
192
|
+
return withNative(() => winConfirm(text, title, buttons));
|
|
193
|
+
if (support.platform === "darwin") {
|
|
194
|
+
return withNative(() => darwinDialog(text, title, "confirm", { buttons }));
|
|
195
|
+
}
|
|
196
|
+
if (support.tool === "zenity" || support.tool === "kdialog") {
|
|
197
|
+
const tool = support.tool;
|
|
198
|
+
return withNative(() => linuxDialog(tool, text, title, "confirm", { buttons }));
|
|
199
|
+
}
|
|
200
|
+
return null;
|
|
201
|
+
}
|
|
202
|
+
export async function nativePrompt(text, title = "Prompt", defaultText = "", kind = "prompt") {
|
|
203
|
+
if (!shouldUseNativeMsgbox(resolveNativeMsgboxMode()))
|
|
204
|
+
return undefined;
|
|
205
|
+
const support = await detectNativeMsgboxSupport();
|
|
206
|
+
if (!support.available)
|
|
207
|
+
return undefined;
|
|
208
|
+
if (support.platform === "win32") {
|
|
209
|
+
if (kind === "password")
|
|
210
|
+
return undefined;
|
|
211
|
+
return withNative(() => winPrompt(text, title, defaultText));
|
|
212
|
+
}
|
|
213
|
+
if (support.platform === "darwin") {
|
|
214
|
+
return withNative(() => darwinDialog(text, title, kind, { defaultText }));
|
|
215
|
+
}
|
|
216
|
+
if (support.tool === "zenity" || support.tool === "kdialog") {
|
|
217
|
+
const tool = support.tool;
|
|
218
|
+
return withNative(() => linuxDialog(tool, text, title, kind, { defaultText }));
|
|
219
|
+
}
|
|
220
|
+
return undefined;
|
|
221
|
+
}
|
|
222
|
+
//# sourceMappingURL=native-msgbox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"native-msgbox.js","sourceRoot":"","sources":["../src/native-msgbox.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/** Escape user text for embedding in PowerShell single-quoted strings. */
|
|
2
|
+
export declare function psQuote(text: string): string;
|
|
3
|
+
/** Escape for osascript / bash double-quoted strings. */
|
|
4
|
+
export declare function shQuote(text: string): string;
|
|
5
|
+
export type NativeMsgboxMode = "auto" | "native" | "cli";
|
|
6
|
+
export declare function resolveNativeMsgboxMode(): NativeMsgboxMode;
|
|
7
|
+
export declare function shouldUseNativeMsgbox(mode: NativeMsgboxMode): boolean;
|
|
8
|
+
//# sourceMappingURL=native-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"native-utils.d.ts","sourceRoot":"","sources":["../src/native-utils.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE5C;AAED,yDAAyD;AACzD,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE5C;AAED,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;AAEzD,wBAAgB,uBAAuB,IAAI,gBAAgB,CAK1D;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAIrE"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/** Escape user text for embedding in PowerShell single-quoted strings. */
|
|
2
|
+
export function psQuote(text) {
|
|
3
|
+
return text.replace(/'/g, "''");
|
|
4
|
+
}
|
|
5
|
+
/** Escape for osascript / bash double-quoted strings. */
|
|
6
|
+
export function shQuote(text) {
|
|
7
|
+
return text.replace(/\\/g, "\\\\").replace(/"/g, '\\"');
|
|
8
|
+
}
|
|
9
|
+
export function resolveNativeMsgboxMode() {
|
|
10
|
+
const raw = process.env.NAUTOGUI_NATIVE_MSGBOX?.trim().toLowerCase();
|
|
11
|
+
if (raw === "0" || raw === "false" || raw === "cli")
|
|
12
|
+
return "cli";
|
|
13
|
+
if (raw === "1" || raw === "true" || raw === "native")
|
|
14
|
+
return "native";
|
|
15
|
+
return "auto";
|
|
16
|
+
}
|
|
17
|
+
export function shouldUseNativeMsgbox(mode) {
|
|
18
|
+
if (mode === "cli")
|
|
19
|
+
return false;
|
|
20
|
+
if (mode === "native")
|
|
21
|
+
return true;
|
|
22
|
+
return process.stdout.isTTY !== true || process.stdin.isTTY !== true;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=native-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"native-utils.js","sourceRoot":"","sources":["../src/native-utils.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,MAAM,UAAU,OAAO,CAAC,IAAY;IAClC,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AAClC,CAAC;AAED,yDAAyD;AACzD,MAAM,UAAU,OAAO,CAAC,IAAY;IAClC,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AAC1D,CAAC;AAID,MAAM,UAAU,uBAAuB;IACrC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,sBAAsB,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACrE,IAAI,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,OAAO,IAAI,GAAG,KAAK,KAAK;QAAE,OAAO,KAAK,CAAC;IAClE,IAAI,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,QAAQ;QAAE,OAAO,QAAQ,CAAC;IACvE,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,IAAsB;IAC1D,IAAI,IAAI,KAAK,KAAK;QAAE,OAAO,KAAK,CAAC;IACjC,IAAI,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACnC,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,KAAK,IAAI,CAAC;AACvE,CAAC"}
|