appium-adb 14.1.11 → 14.2.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/CHANGELOG.md +12 -0
- package/build/lib/tools/fs-commands.d.ts.map +1 -1
- package/build/lib/tools/fs-commands.js +5 -4
- package/build/lib/tools/fs-commands.js.map +1 -1
- package/build/lib/tools/keyboard-commands.d.ts +0 -1
- package/build/lib/tools/keyboard-commands.d.ts.map +1 -1
- package/build/lib/tools/keyboard-commands.js +5 -12
- package/build/lib/tools/keyboard-commands.js.map +1 -1
- package/lib/tools/fs-commands.ts +6 -5
- package/lib/tools/keyboard-commands.ts +5 -15
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,15 @@
|
|
|
1
|
+
## [14.2.1](https://github.com/appium/appium-adb/compare/v14.2.0...v14.2.1) (2026-02-06)
|
|
2
|
+
|
|
3
|
+
### Miscellaneous Chores
|
|
4
|
+
|
|
5
|
+
* extract the single quote logic and simplify a bit + added tests ([#863](https://github.com/appium/appium-adb/issues/863)) ([7ffc1ce](https://github.com/appium/appium-adb/commit/7ffc1ce80f7ab01850db1e876921d55fafbdb37f))
|
|
6
|
+
|
|
7
|
+
## [14.2.0](https://github.com/appium/appium-adb/compare/v14.1.11...v14.2.0) (2026-02-01)
|
|
8
|
+
|
|
9
|
+
### Features
|
|
10
|
+
|
|
11
|
+
* allow single quotes and double quotes to coexist in inputText value ([#862](https://github.com/appium/appium-adb/issues/862)) ([2c8f3d2](https://github.com/appium/appium-adb/commit/2c8f3d2db8eb0f0bfc9e637c41fbe9c6e5719e9d))
|
|
12
|
+
|
|
1
13
|
## [14.1.11](https://github.com/appium/appium-adb/compare/v14.1.10...v14.1.11) (2026-01-28)
|
|
2
14
|
|
|
3
15
|
### Miscellaneous Chores
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fs-commands.d.ts","sourceRoot":"","sources":["../../../lib/tools/fs-commands.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAC,GAAG,EAAC,MAAM,WAAW,CAAC;AACnC,OAAO,KAAK,EAAC,sBAAsB,EAAC,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"fs-commands.d.ts","sourceRoot":"","sources":["../../../lib/tools/fs-commands.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAC,GAAG,EAAC,MAAM,WAAW,CAAC;AACnC,OAAO,KAAK,EAAC,sBAAsB,EAAC,MAAM,cAAc,CAAC;AAMzD;;;;;GAKG;AACH,wBAAsB,UAAU,CAAC,IAAI,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAQhF;AAED;;;;;;;;GAQG;AACH,wBAAsB,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,GAAE,MAAM,EAAO,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAe9F;AAED;;;;;;GAMG;AACH,wBAAsB,QAAQ,CAAC,IAAI,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAe7E;AAED;;;;;GAKG;AACH,wBAAsB,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEnE;AAED;;;;;;;;;GASG;AACH,wBAAsB,IAAI,CACxB,IAAI,EAAE,GAAG,EACT,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,IAAI,CAAC,EAAE,sBAAsB,GAC5B,OAAO,CAAC,IAAI,CAAC,CAGf;AAED;;;;;;;;;GASG;AACH,wBAAsB,IAAI,CACxB,IAAI,EAAE,GAAG,EACT,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,IAAI,GAAE,sBAA2B,GAChC,OAAO,CAAC,IAAI,CAAC,CAGf;AAED;;;;;GAKG;AACH,wBAAsB,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAE1E"}
|
|
@@ -12,6 +12,9 @@ exports.pull = pull;
|
|
|
12
12
|
exports.mkdir = mkdir;
|
|
13
13
|
const lodash_1 = __importDefault(require("lodash"));
|
|
14
14
|
const node_path_1 = __importDefault(require("node:path"));
|
|
15
|
+
function shellEscapeSingleQuotes(str) {
|
|
16
|
+
return str.replace(/'/g, "'\\''");
|
|
17
|
+
}
|
|
15
18
|
/**
|
|
16
19
|
* Verify whether a remote path exists on the device under test.
|
|
17
20
|
*
|
|
@@ -20,7 +23,7 @@ const node_path_1 = __importDefault(require("node:path"));
|
|
|
20
23
|
*/
|
|
21
24
|
async function fileExists(remotePath) {
|
|
22
25
|
const passFlag = '__PASS__';
|
|
23
|
-
const checkCmd = `[ -e '${remotePath
|
|
26
|
+
const checkCmd = `[ -e '${shellEscapeSingleQuotes(remotePath)}' ] && echo ${passFlag}`;
|
|
24
27
|
try {
|
|
25
28
|
return lodash_1.default.includes(await this.shell([checkCmd]), passFlag);
|
|
26
29
|
}
|
|
@@ -122,8 +125,6 @@ async function pull(remotePath, localPath, opts = {}) {
|
|
|
122
125
|
* @return mkdir command output.
|
|
123
126
|
*/
|
|
124
127
|
async function mkdir(remotePath) {
|
|
125
|
-
return
|
|
126
|
-
? await this.shell([`mkdir -p '${remotePath.replace(/'/g, `\\'`)}'`])
|
|
127
|
-
: await this.shell(['mkdir', '-p', remotePath]);
|
|
128
|
+
return await this.shell([`mkdir -p -- '${shellEscapeSingleQuotes(remotePath)}'`]);
|
|
128
129
|
}
|
|
129
130
|
//# sourceMappingURL=fs-commands.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fs-commands.js","sourceRoot":"","sources":["../../../lib/tools/fs-commands.ts"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"fs-commands.js","sourceRoot":"","sources":["../../../lib/tools/fs-commands.ts"],"names":[],"mappings":"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"}
|
|
@@ -64,7 +64,6 @@ export declare function defaultIME(this: ADB): Promise<string | null>;
|
|
|
64
64
|
* Noop if the text is empty.
|
|
65
65
|
*
|
|
66
66
|
* @param text - The actual text to be sent.
|
|
67
|
-
* @throws {Error} If it is impossible to escape the given string
|
|
68
67
|
*/
|
|
69
68
|
export declare function inputText(this: ADB, text: string | number): Promise<void>;
|
|
70
69
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keyboard-commands.d.ts","sourceRoot":"","sources":["../../../lib/tools/keyboard-commands.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"keyboard-commands.d.ts","sourceRoot":"","sources":["../../../lib/tools/keyboard-commands.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAC,GAAG,EAAC,MAAM,WAAW,CAAC;AACnC,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,YAAY,CAAC;AAK9C;;;;;;;;GAQG;AACH,wBAAsB,YAAY,CAAC,IAAI,EAAE,GAAG,EAAE,SAAS,GAAE,MAAa,GAAG,OAAO,CAAC,OAAO,CAAC,CAwBxF;AAED;;;;GAIG;AACH,wBAAsB,qBAAqB,CAAC,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,aAAa,CAAC,CAY7E;AAED;;;;GAIG;AACH,wBAAsB,QAAQ,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAIjF;AAED;;;;GAIG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAOhE;AAED;;;;GAIG;AACH,wBAAsB,WAAW,CAAC,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAO9D;AAED;;;;GAIG;AACH,wBAAsB,SAAS,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEvE;AAED;;;;GAIG;AACH,wBAAsB,UAAU,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAExE;AAED;;;;GAIG;AACH,wBAAsB,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEpE;AAED;;;;GAIG;AACH,wBAAsB,UAAU,CAAC,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAWlE;AAED;;;;;;GAMG;AACH,wBAAsB,SAAS,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAa/E;AAED;;;;;;;GAOG;AACH,wBAAsB,eAAe,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CA6BjG"}
|
|
@@ -15,7 +15,6 @@ exports.defaultIME = defaultIME;
|
|
|
15
15
|
exports.inputText = inputText;
|
|
16
16
|
exports.runInImeContext = runInImeContext;
|
|
17
17
|
const logger_js_1 = require("../logger.js");
|
|
18
|
-
const lodash_1 = __importDefault(require("lodash"));
|
|
19
18
|
const asyncbox_1 = require("asyncbox");
|
|
20
19
|
const bluebird_1 = __importDefault(require("bluebird"));
|
|
21
20
|
const KEYCODE_ESC = 111;
|
|
@@ -157,24 +156,18 @@ async function defaultIME() {
|
|
|
157
156
|
* Noop if the text is empty.
|
|
158
157
|
*
|
|
159
158
|
* @param text - The actual text to be sent.
|
|
160
|
-
* @throws {Error} If it is impossible to escape the given string
|
|
161
159
|
*/
|
|
162
160
|
async function inputText(text) {
|
|
163
161
|
if (text === '') {
|
|
164
162
|
return;
|
|
165
163
|
}
|
|
166
164
|
const originalStr = `${text}`;
|
|
167
|
-
const escapedText = originalStr.replace(/\$/g, '\\$').replace(/ /g, '%s');
|
|
168
|
-
let args = ['input', 'text', originalStr];
|
|
169
165
|
// https://stackoverflow.com/questions/25791423/adb-shell-input-text-does-not-take-ampersand-character/25791498
|
|
170
|
-
const adbInputEscapePattern = /[()<>|;&*\\~^"']/g;
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
const q = originalStr.includes('"') ? `'` : '"';
|
|
176
|
-
args = [`input text ${q}${escapedText}${q}`];
|
|
177
|
-
}
|
|
166
|
+
const adbInputEscapePattern = /[()<>|;&*\\~^"'$`]/g;
|
|
167
|
+
const escapedText = originalStr.replace(adbInputEscapePattern, '\\$&').replace(/ /g, '%s');
|
|
168
|
+
// https://stackoverflow.com/questions/44338191/android-adb-shell-input-text-apostrophe-signal
|
|
169
|
+
const q = "''";
|
|
170
|
+
const args = ['input', 'text', `${q}${escapedText}${q}`];
|
|
178
171
|
await this.shell(args);
|
|
179
172
|
}
|
|
180
173
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keyboard-commands.js","sourceRoot":"","sources":["../../../lib/tools/keyboard-commands.ts"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"keyboard-commands.js","sourceRoot":"","sources":["../../../lib/tools/keyboard-commands.ts"],"names":[],"mappings":"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"}
|
package/lib/tools/fs-commands.ts
CHANGED
|
@@ -3,6 +3,10 @@ import path from 'node:path';
|
|
|
3
3
|
import type {ADB} from '../adb.js';
|
|
4
4
|
import type {TeenProcessExecOptions} from 'teen_process';
|
|
5
5
|
|
|
6
|
+
function shellEscapeSingleQuotes(str: string): string {
|
|
7
|
+
return str.replace(/'/g, "'\\''");
|
|
8
|
+
}
|
|
9
|
+
|
|
6
10
|
/**
|
|
7
11
|
* Verify whether a remote path exists on the device under test.
|
|
8
12
|
*
|
|
@@ -11,7 +15,7 @@ import type {TeenProcessExecOptions} from 'teen_process';
|
|
|
11
15
|
*/
|
|
12
16
|
export async function fileExists(this: ADB, remotePath: string): Promise<boolean> {
|
|
13
17
|
const passFlag = '__PASS__';
|
|
14
|
-
const checkCmd = `[ -e '${remotePath
|
|
18
|
+
const checkCmd = `[ -e '${shellEscapeSingleQuotes(remotePath)}' ] && echo ${passFlag}`;
|
|
15
19
|
try {
|
|
16
20
|
return _.includes(await this.shell([checkCmd]), passFlag);
|
|
17
21
|
} catch {
|
|
@@ -126,8 +130,5 @@ export async function pull(
|
|
|
126
130
|
* @return mkdir command output.
|
|
127
131
|
*/
|
|
128
132
|
export async function mkdir(this: ADB, remotePath: string): Promise<string> {
|
|
129
|
-
return
|
|
130
|
-
? await this.shell([`mkdir -p '${remotePath.replace(/'/g, `\\'`)}'`])
|
|
131
|
-
: await this.shell(['mkdir', '-p', remotePath]);
|
|
133
|
+
return await this.shell([`mkdir -p -- '${shellEscapeSingleQuotes(remotePath)}'`]);
|
|
132
134
|
}
|
|
133
|
-
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import {log} from '../logger.js';
|
|
2
|
-
import _ from 'lodash';
|
|
3
2
|
import {waitForCondition} from 'asyncbox';
|
|
4
3
|
import B from 'bluebird';
|
|
5
4
|
import type {ADB} from '../adb.js';
|
|
@@ -152,7 +151,6 @@ export async function defaultIME(this: ADB): Promise<string | null> {
|
|
|
152
151
|
* Noop if the text is empty.
|
|
153
152
|
*
|
|
154
153
|
* @param text - The actual text to be sent.
|
|
155
|
-
* @throws {Error} If it is impossible to escape the given string
|
|
156
154
|
*/
|
|
157
155
|
export async function inputText(this: ADB, text: string | number): Promise<void> {
|
|
158
156
|
if (text === '') {
|
|
@@ -160,19 +158,12 @@ export async function inputText(this: ADB, text: string | number): Promise<void>
|
|
|
160
158
|
}
|
|
161
159
|
|
|
162
160
|
const originalStr = `${text}`;
|
|
163
|
-
const escapedText = originalStr.replace(/\$/g, '\\$').replace(/ /g, '%s');
|
|
164
|
-
let args: string[] = ['input', 'text', originalStr];
|
|
165
161
|
// https://stackoverflow.com/questions/25791423/adb-shell-input-text-does-not-take-ampersand-character/25791498
|
|
166
|
-
const adbInputEscapePattern = /[()<>|;&*\\~^"']/g;
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
);
|
|
172
|
-
}
|
|
173
|
-
const q = originalStr.includes('"') ? `'` : '"';
|
|
174
|
-
args = [`input text ${q}${escapedText}${q}`];
|
|
175
|
-
}
|
|
162
|
+
const adbInputEscapePattern = /[()<>|;&*\\~^"'$`]/g;
|
|
163
|
+
const escapedText = originalStr.replace(adbInputEscapePattern, '\\$&').replace(/ /g, '%s');
|
|
164
|
+
// https://stackoverflow.com/questions/44338191/android-adb-shell-input-text-apostrophe-signal
|
|
165
|
+
const q = "''";
|
|
166
|
+
const args = ['input', 'text', `${q}${escapedText}${q}`];
|
|
176
167
|
await this.shell(args);
|
|
177
168
|
}
|
|
178
169
|
|
|
@@ -233,4 +224,3 @@ function getIMEListFromOutput(stdout: string): string[] {
|
|
|
233
224
|
}
|
|
234
225
|
|
|
235
226
|
// #endregion
|
|
236
|
-
|