appium-uiautomator2-driver 6.7.3 → 6.7.4

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.
Files changed (40) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/build/lib/commands/find.js +2 -5
  3. package/build/lib/commands/find.js.map +1 -1
  4. package/build/lib/css-converter.d.ts +9 -42
  5. package/build/lib/css-converter.d.ts.map +1 -1
  6. package/build/lib/css-converter.js +73 -148
  7. package/build/lib/css-converter.js.map +1 -1
  8. package/build/lib/extensions.d.ts +2 -2
  9. package/build/lib/extensions.d.ts.map +1 -1
  10. package/build/lib/extensions.js +2 -4
  11. package/build/lib/extensions.js.map +1 -1
  12. package/build/lib/helpers.d.ts +3 -12
  13. package/build/lib/helpers.d.ts.map +1 -1
  14. package/build/lib/helpers.js +1 -11
  15. package/build/lib/helpers.js.map +1 -1
  16. package/build/lib/logger.d.ts +1 -2
  17. package/build/lib/logger.d.ts.map +1 -1
  18. package/build/lib/logger.js +2 -2
  19. package/build/lib/logger.js.map +1 -1
  20. package/build/lib/uiautomator2.d.ts +1 -1
  21. package/build/lib/uiautomator2.d.ts.map +1 -1
  22. package/build/lib/uiautomator2.js +0 -1
  23. package/build/lib/uiautomator2.js.map +1 -1
  24. package/build/test/unit/css-converter-specs.js +3 -6
  25. package/build/test/unit/css-converter-specs.js.map +1 -1
  26. package/build/test/unit/uiautomator2-specs.js +4 -4
  27. package/build/test/unit/uiautomator2-specs.js.map +1 -1
  28. package/build/tsconfig.tsbuildinfo +1 -1
  29. package/lib/commands/find.js +1 -1
  30. package/lib/css-converter.ts +283 -0
  31. package/lib/extensions.ts +3 -0
  32. package/lib/helpers.ts +31 -0
  33. package/lib/logger.ts +4 -0
  34. package/lib/uiautomator2.ts +0 -1
  35. package/npm-shrinkwrap.json +37 -49
  36. package/package.json +1 -1
  37. package/lib/css-converter.js +0 -329
  38. package/lib/extensions.js +0 -4
  39. package/lib/helpers.js +0 -37
  40. package/lib/logger.js +0 -6
@@ -1,4 +1,4 @@
1
- import CssConverter from '../css-converter';
1
+ import {CssConverter} from '../css-converter';
2
2
 
3
3
  // we override the xpath search for this first-visible-child selector, which
4
4
  // looks like /*[@firstVisible="true"]
@@ -0,0 +1,283 @@
1
+ import {createParser} from 'css-selector-parser';
2
+ import type {
3
+ AstAttribute,
4
+ AstClassName,
5
+ AstId,
6
+ AstPseudoClass,
7
+ AstRule,
8
+ AstSelector,
9
+ AstTagName,
10
+ } from 'css-selector-parser';
11
+ import _ from 'lodash';
12
+ import {errors} from 'appium/driver';
13
+ import {log} from './logger';
14
+
15
+ const parseCssSelector = createParser({
16
+ syntax: {
17
+ pseudoClasses: {
18
+ unknown: 'accept',
19
+ definitions: {
20
+ Selector: ['has'],
21
+ },
22
+ },
23
+ combinators: ['>', '+', '~'],
24
+ attributes: {
25
+ operators: ['^=', '$=', '*=', '~=', '='],
26
+ },
27
+ ids: true,
28
+ classNames: true,
29
+ tag: {
30
+ wildcard: true,
31
+ },
32
+ },
33
+ substitutes: true,
34
+ });
35
+
36
+ const RESOURCE_ID = 'resource-id';
37
+ const ID_LOCATOR_PATTERN = /^[a-zA-Z_][a-zA-Z0-9._]*:id\/[\S]+$/;
38
+
39
+ const BOOLEAN_ATTRS = [
40
+ 'checkable',
41
+ 'checked',
42
+ 'clickable',
43
+ 'enabled',
44
+ 'focusable',
45
+ 'focused',
46
+ 'long-clickable',
47
+ 'scrollable',
48
+ 'selected',
49
+ ] as const;
50
+
51
+ const NUMERIC_ATTRS = ['index', 'instance'] as const;
52
+
53
+ const STR_ATTRS = ['description', RESOURCE_ID, 'text', 'class-name', 'package-name'] as const;
54
+
55
+ const ALL_ATTRS = [...BOOLEAN_ATTRS, ...NUMERIC_ATTRS, ...STR_ATTRS] as readonly string[];
56
+
57
+ const ATTRIBUTE_ALIASES: Array<[string, string[]]> = [
58
+ [RESOURCE_ID, ['id']],
59
+ [
60
+ 'description',
61
+ ['content-description', 'content-desc', 'desc', 'accessibility-id'],
62
+ ],
63
+ ['index', ['nth-child']],
64
+ ];
65
+
66
+ const isAstAttribute = (item: {type?: string}): item is AstAttribute =>
67
+ item.type === 'Attribute';
68
+ const isAstPseudoClass = (item: {type?: string}): item is AstPseudoClass =>
69
+ item.type === 'PseudoClass';
70
+ const isAstClassName = (item: {type?: string}): item is AstClassName =>
71
+ item.type === 'ClassName';
72
+ const isAstTagName = (item: {type?: string}): item is AstTagName => item.type === 'TagName';
73
+ const isAstId = (item: {type?: string}): item is AstId => item.type === 'Id';
74
+
75
+ function toSnakeCase(str?: string | null): string {
76
+ if (!str) {
77
+ return '';
78
+ }
79
+ const tokens = str
80
+ .split('-')
81
+ .map((token) => token.charAt(0).toUpperCase() + token.slice(1).toLowerCase());
82
+ const out = tokens.join('');
83
+ return out.charAt(0).toLowerCase() + out.slice(1);
84
+ }
85
+
86
+ function requireBoolean(css: AstAttribute | AstPseudoClass): 'true' | 'false' {
87
+ const rawValue = (css as any).value?.value ?? (css as any).argument?.value;
88
+ const value = _.toLower(rawValue ?? 'true');
89
+ if (value === 'true') {
90
+ return 'true';
91
+ }
92
+ if (value === 'false') {
93
+ return 'false';
94
+ }
95
+ throw new Error(
96
+ `'${css.name}' must be true, false or empty. Found '${(css as any).value}'`,
97
+ );
98
+ }
99
+
100
+ function requireEntityName(cssEntity: AstAttribute | AstPseudoClass): string {
101
+ const attrName = cssEntity.name.toLowerCase();
102
+
103
+ if (ALL_ATTRS.includes(attrName)) {
104
+ return attrName;
105
+ }
106
+
107
+ for (const [officialAttr, aliasAttrs] of ATTRIBUTE_ALIASES) {
108
+ if (aliasAttrs.includes(attrName)) {
109
+ return officialAttr;
110
+ }
111
+ }
112
+ throw new Error(
113
+ `'${attrName}' is not a valid attribute. Supported attributes are '${ALL_ATTRS.join(', ')}'`,
114
+ );
115
+ }
116
+
117
+ function getWordMatcherRegex(word: string): string {
118
+ return `\\b(\\w*${_.escapeRegExp(word)}\\w*)\\b`;
119
+ }
120
+
121
+ export class CssConverter {
122
+ constructor(
123
+ private readonly selector: string,
124
+ private readonly pkg?: string | null,
125
+ ) {}
126
+
127
+ toUiAutomatorSelector(): string {
128
+ let cssObj: AstSelector;
129
+ try {
130
+ cssObj = parseCssSelector(this.selector) as AstSelector;
131
+ } catch (e: any) {
132
+ log.debug(e.stack);
133
+ throw new errors.InvalidSelectorError(
134
+ `Invalid CSS selector '${this.selector}'. Reason: '${e.message}'`,
135
+ );
136
+ }
137
+ try {
138
+ return this.parseCssObject(cssObj);
139
+ } catch (e: any) {
140
+ log.debug(e.stack);
141
+ throw new errors.InvalidSelectorError(
142
+ `Unsupported CSS selector '${this.selector}'. Reason: '${e.message}'`,
143
+ );
144
+ }
145
+ }
146
+
147
+ private formatIdLocator(locator: string): string {
148
+ return ID_LOCATOR_PATTERN.test(locator) ? locator : `${this.pkg || 'android'}:id/${locator}`;
149
+ }
150
+
151
+ private parseAttr(cssAttr: AstAttribute): string {
152
+ const attrValueNode = cssAttr.value as {value?: string} | undefined;
153
+ const attrValue = attrValueNode?.value;
154
+ if (!_.isString(attrValue) && !_.isEmpty(attrValue)) {
155
+ throw new Error(
156
+ `'${cssAttr.name}=${attrValue}' is an invalid attribute. Only 'string' and empty attribute types are supported. Found '${attrValue}'`,
157
+ );
158
+ }
159
+ const attrName = requireEntityName(cssAttr);
160
+ const methodName = toSnakeCase(attrName);
161
+
162
+ if (!STR_ATTRS.includes(attrName as (typeof STR_ATTRS)[number]) && !BOOLEAN_ATTRS.includes(attrName as (typeof BOOLEAN_ATTRS)[number])) {
163
+ throw new Error(
164
+ `'${attrName}' is not supported. Supported attributes are '${[...STR_ATTRS, ...BOOLEAN_ATTRS].join(', ')}'`,
165
+ );
166
+ }
167
+
168
+ if (BOOLEAN_ATTRS.includes(attrName as (typeof BOOLEAN_ATTRS)[number])) {
169
+ return `.${methodName}(${requireBoolean(cssAttr)})`;
170
+ }
171
+
172
+ let value = attrValue || '';
173
+ if (attrName === RESOURCE_ID) {
174
+ value = this.formatIdLocator(value);
175
+ }
176
+ if (value === '') {
177
+ return `.${methodName}Matches("")`;
178
+ }
179
+
180
+ switch (cssAttr.operator) {
181
+ case '=':
182
+ return `.${methodName}("${value}")`;
183
+ case '*=':
184
+ if (['description', 'text'].includes(attrName)) {
185
+ return `.${methodName}Contains("${value}")`;
186
+ }
187
+ return `.${methodName}Matches("${_.escapeRegExp(value)}")`;
188
+ case '^=':
189
+ if (['description', 'text'].includes(attrName)) {
190
+ return `.${methodName}StartsWith("${value}")`;
191
+ }
192
+ return `.${methodName}Matches("^${_.escapeRegExp(value)}")`;
193
+ case '$=':
194
+ return `.${methodName}Matches("${_.escapeRegExp(value)}$")`;
195
+ case '~=':
196
+ return `.${methodName}Matches("${getWordMatcherRegex(value)}")`;
197
+ default:
198
+ throw new Error(
199
+ `Unsupported CSS attribute operator '${cssAttr.operator}'. '=', '*=', '^=', '$=' and '~=' are supported.`,
200
+ );
201
+ }
202
+ }
203
+
204
+ private parsePseudo(cssPseudo: AstPseudoClass): string | undefined {
205
+ const argValue = (cssPseudo.argument as {value?: string} | undefined)?.value;
206
+ if (!_.isString(argValue) && !_.isEmpty(argValue)) {
207
+ throw new Error(
208
+ `'${cssPseudo.name}=${argValue}'. Unsupported css pseudo class value: '${argValue}'. Only 'string' type or empty is supported.`,
209
+ );
210
+ }
211
+
212
+ const pseudoName = requireEntityName(cssPseudo);
213
+
214
+ if (BOOLEAN_ATTRS.includes(pseudoName as (typeof BOOLEAN_ATTRS)[number])) {
215
+ return `.${toSnakeCase(pseudoName)}(${requireBoolean(cssPseudo)})`;
216
+ }
217
+
218
+ if (NUMERIC_ATTRS.includes(pseudoName as (typeof NUMERIC_ATTRS)[number])) {
219
+ return `.${pseudoName}(${argValue})`;
220
+ }
221
+ }
222
+
223
+ private parseCssRule(cssRule: AstRule): string {
224
+ if (cssRule.combinator && ![' ', '>'].includes(cssRule.combinator)) {
225
+ throw new Error(
226
+ `'${cssRule.combinator}' is not a supported combinator. Only child combinator (>) and descendant combinator are supported.`,
227
+ );
228
+ }
229
+
230
+ const uiAutomatorSelector: string[] = ['new UiSelector()'];
231
+ const items = cssRule.items ?? [];
232
+
233
+ const astClassNames = items.filter(isAstClassName);
234
+ const classNames = astClassNames.map(({name}) => name);
235
+
236
+ const astTag = items.find(isAstTagName);
237
+ const tagName = astTag?.name;
238
+ if (tagName && tagName !== '*') {
239
+ const androidClass = [tagName];
240
+ if (classNames.length) {
241
+ for (const cssClassNames of classNames) {
242
+ androidClass.push(cssClassNames);
243
+ }
244
+ uiAutomatorSelector.push(`.className("${androidClass.join('.')}")`);
245
+ } else {
246
+ uiAutomatorSelector.push(`.classNameMatches("${tagName}")`);
247
+ }
248
+ } else if (classNames.length) {
249
+ uiAutomatorSelector.push(`.classNameMatches("${classNames.join('\\.')}")`);
250
+ }
251
+
252
+ const astIds = items.filter(isAstId);
253
+ const ids = astIds.map(({name}) => name);
254
+ if (ids.length) {
255
+ uiAutomatorSelector.push(`.resourceId("${this.formatIdLocator(ids[0])}")`);
256
+ }
257
+
258
+ const attributes = items.filter(isAstAttribute);
259
+ for (const attr of attributes) {
260
+ uiAutomatorSelector.push(this.parseAttr(attr));
261
+ }
262
+
263
+ const pseudoClasses = items.filter(isAstPseudoClass);
264
+ for (const pseudo of pseudoClasses) {
265
+ const sel = this.parsePseudo(pseudo);
266
+ if (sel) {
267
+ uiAutomatorSelector.push(sel);
268
+ }
269
+ }
270
+ if (cssRule.nestedRule) {
271
+ uiAutomatorSelector.push(`.childSelector(${this.parseCssRule(cssRule.nestedRule)})`);
272
+ }
273
+ return uiAutomatorSelector.join('');
274
+ }
275
+
276
+ private parseCssObject(css: AstSelector): string {
277
+ if (!_.isEmpty(css.rules)) {
278
+ return this.parseCssRule(css.rules[0] as AstRule);
279
+ }
280
+
281
+ throw new Error('No rules could be parsed out of the current selector');
282
+ }
283
+ }
@@ -0,0 +1,3 @@
1
+ export const APK_EXTENSION = '.apk' as const;
2
+ export const APKS_EXTENSION = '.apks' as const;
3
+
package/lib/helpers.ts ADDED
@@ -0,0 +1,31 @@
1
+ import path from 'path';
2
+ import type {ADB} from 'appium-adb';
3
+ import {fs, system} from 'appium/support';
4
+
5
+ export async function isWriteable(filePath: string): Promise<boolean> {
6
+ try {
7
+ await fs.access(filePath, fs.constants.W_OK);
8
+ if (system.isWindows()) {
9
+ // On operating systems, where access-control policies may
10
+ // limit access to the file system, `fs.access` does not work
11
+ // as expected. See https://groups.google.com/forum/#!topic/nodejs/qmZtIwDRSYo
12
+ // for more details
13
+ await fs.close(await fs.open(filePath, 'r+'));
14
+ }
15
+ return true;
16
+ } catch {
17
+ return false;
18
+ }
19
+ }
20
+
21
+ export async function signApp(adb: ADB, appPath: string): Promise<void> {
22
+ if (!(await isWriteable(appPath))) {
23
+ throw new Error(
24
+ `The application at '${appPath}' is not writeable. ` +
25
+ `Please grant write permissions to this file or to its parent folder '${path.dirname(appPath)}' ` +
26
+ `for the Appium process, so it could sign the application`,
27
+ );
28
+ }
29
+ await adb.sign(appPath);
30
+ }
31
+
package/lib/logger.ts ADDED
@@ -0,0 +1,4 @@
1
+ import {logger} from 'appium/support';
2
+
3
+ export const log = logger.getLogger('UiAutomator2');
4
+
@@ -469,7 +469,6 @@ export class UiAutomator2Server {
469
469
  }
470
470
  }
471
471
 
472
- export default UiAutomator2Server;
473
472
 
474
473
  export interface PackageInfo {
475
474
  installState: InstallState;
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "appium-uiautomator2-driver",
3
- "version": "6.7.3",
3
+ "version": "6.7.4",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "appium-uiautomator2-driver",
9
- "version": "6.7.3",
9
+ "version": "6.7.4",
10
10
  "license": "Apache-2.0",
11
11
  "dependencies": {
12
12
  "appium-adb": "^14.0.0",
@@ -626,14 +626,14 @@
626
626
  }
627
627
  },
628
628
  "node_modules/appium-adb": {
629
- "version": "14.1.6",
630
- "resolved": "https://registry.npmjs.org/appium-adb/-/appium-adb-14.1.6.tgz",
631
- "integrity": "sha512-bNLa4iCgwNbgDANP42Gq8jhunkyLncRVubo3/dLDFHfN86i39qRlsU5jnWkI+G4ziZU/cnt8uAY1lYqZo0XpCw==",
629
+ "version": "14.1.7",
630
+ "resolved": "https://registry.npmjs.org/appium-adb/-/appium-adb-14.1.7.tgz",
631
+ "integrity": "sha512-/06TJ7maIJ4RzKmXdnqVNBhBZqoxAwoDeYBEaRm8Dbsa803Io16CJ94R3ncpQwlD5r5bsj4YMmwdZtVZKMjsLw==",
632
632
  "license": "Apache-2.0",
633
633
  "dependencies": {
634
634
  "@appium/support": "^7.0.0-rc.1",
635
635
  "async-lock": "^1.0.0",
636
- "asyncbox": "^3.0.0",
636
+ "asyncbox": "^4.0.1",
637
637
  "bluebird": "^3.4.7",
638
638
  "ini": "^6.0.0",
639
639
  "lodash": "^4.0.0",
@@ -646,24 +646,10 @@
646
646
  "npm": ">=10"
647
647
  }
648
648
  },
649
- "node_modules/appium-adb/node_modules/asyncbox": {
650
- "version": "3.0.0",
651
- "resolved": "https://registry.npmjs.org/asyncbox/-/asyncbox-3.0.0.tgz",
652
- "integrity": "sha512-X7U0nedUMKV3nn9c4R0Zgvdvv6cw97tbDlHSZicq1snGPi/oX9DgGmFSURWtxDdnBWd3V0YviKhqAYAVvoWQ/A==",
653
- "license": "Apache-2.0",
654
- "dependencies": {
655
- "bluebird": "^3.5.1",
656
- "lodash": "^4.17.4",
657
- "source-map-support": "^0.x"
658
- },
659
- "engines": {
660
- "node": ">=16"
661
- }
662
- },
663
649
  "node_modules/appium-android-driver": {
664
- "version": "12.4.6",
665
- "resolved": "https://registry.npmjs.org/appium-android-driver/-/appium-android-driver-12.4.6.tgz",
666
- "integrity": "sha512-eqjddgR6IvO6csaJQVhSjMMhfC7O+qvzmbe0u0N/asanLRqRqADqXRGlIqzgaP5xj1HcA45xBmBArD5RFwf4GA==",
650
+ "version": "12.6.1",
651
+ "resolved": "https://registry.npmjs.org/appium-android-driver/-/appium-android-driver-12.6.1.tgz",
652
+ "integrity": "sha512-JFO6ouwGHYgC/knkPBVvKwtAqtaiCIPgUlVGmCngCtnLt2Zk4B0Sv+M1J8Elm1olFpCv/Jmb6kRxcEqHh1yRjg==",
667
653
  "license": "Apache-2.0",
668
654
  "dependencies": {
669
655
  "@appium/support": "^7.0.0-rc.1",
@@ -692,22 +678,22 @@
692
678
  }
693
679
  },
694
680
  "node_modules/appium-chromedriver": {
695
- "version": "8.0.28",
696
- "resolved": "https://registry.npmjs.org/appium-chromedriver/-/appium-chromedriver-8.0.28.tgz",
697
- "integrity": "sha512-EzPDYXE/kp/5EuzPI2Q3bNY32vupfYLwpUhmL6sRlbm2homBHNvU45/S+W4PpCeA2aqsuihXuTaPiolSCGd4Dg==",
681
+ "version": "8.0.31",
682
+ "resolved": "https://registry.npmjs.org/appium-chromedriver/-/appium-chromedriver-8.0.31.tgz",
683
+ "integrity": "sha512-hmamyXXsRwzhYoMbNzfdL1t/lCb0o0vLf63WpK/SgLwlcO2ut6MunT729KQSlFzOlLpndtE1H+LCX5KFyPDuMw==",
698
684
  "license": "Apache-2.0",
699
685
  "dependencies": {
700
686
  "@appium/base-driver": "^10.0.0-rc.2",
701
687
  "@appium/support": "^7.0.0-rc.1",
702
688
  "@xmldom/xmldom": "^0.x",
703
689
  "appium-adb": "^14.0.0",
704
- "asyncbox": "^3.0.0",
690
+ "asyncbox": "^4.0.1",
705
691
  "axios": "^1.6.5",
706
692
  "bluebird": "^3.5.1",
707
693
  "compare-versions": "^6.0.0",
708
694
  "lodash": "^4.17.4",
709
695
  "semver": "^7.0.0",
710
- "teen_process": "^3.0.0",
696
+ "teen_process": "^4.0.4",
711
697
  "xpath": "^0.x"
712
698
  },
713
699
  "engines": {
@@ -715,18 +701,19 @@
715
701
  "npm": ">=10"
716
702
  }
717
703
  },
718
- "node_modules/appium-chromedriver/node_modules/asyncbox": {
719
- "version": "3.0.0",
720
- "resolved": "https://registry.npmjs.org/asyncbox/-/asyncbox-3.0.0.tgz",
721
- "integrity": "sha512-X7U0nedUMKV3nn9c4R0Zgvdvv6cw97tbDlHSZicq1snGPi/oX9DgGmFSURWtxDdnBWd3V0YviKhqAYAVvoWQ/A==",
704
+ "node_modules/appium-chromedriver/node_modules/teen_process": {
705
+ "version": "4.0.5",
706
+ "resolved": "https://registry.npmjs.org/teen_process/-/teen_process-4.0.5.tgz",
707
+ "integrity": "sha512-ZQQ2Vjs1/maFzpzfsZRAlQVSZrUBsKzAItaxSLImsHRTdI8hVt9Jm0JHyWFbrvvAf78V55BM3ZgNeQpXcXsWpw==",
722
708
  "license": "Apache-2.0",
723
709
  "dependencies": {
724
- "bluebird": "^3.5.1",
725
- "lodash": "^4.17.4",
726
- "source-map-support": "^0.x"
710
+ "bluebird": "^3.7.2",
711
+ "lodash": "^4.17.21",
712
+ "shell-quote": "^1.8.1"
727
713
  },
728
714
  "engines": {
729
- "node": ">=16"
715
+ "node": "^20.19.0 || ^22.12.0 || >=24.0.0",
716
+ "npm": ">=10"
730
717
  }
731
718
  },
732
719
  "node_modules/appium-uiautomator2-server": {
@@ -2370,35 +2357,36 @@
2370
2357
  }
2371
2358
  },
2372
2359
  "node_modules/io.appium.settings": {
2373
- "version": "7.0.6",
2374
- "resolved": "https://registry.npmjs.org/io.appium.settings/-/io.appium.settings-7.0.6.tgz",
2375
- "integrity": "sha512-OJF8IgZNZLt7ClWlMOUUhH9q5J5DFL0yDko1jIeMU/Np9wMIf06Y5RmiJosFOKc64Xe51zFB+a4LQ67VJaEuGg==",
2360
+ "version": "7.0.8",
2361
+ "resolved": "https://registry.npmjs.org/io.appium.settings/-/io.appium.settings-7.0.8.tgz",
2362
+ "integrity": "sha512-KScrHILMWgEGbKvN37OHqTyROaez6yLdndK5ceF/BXS8eEnhBjrSk9xd9yZiUv+22u2ZbYcYMUJglp0aGUhXPA==",
2376
2363
  "license": "Apache-2.0",
2377
2364
  "dependencies": {
2378
2365
  "@appium/logger": "^2.0.0-rc.1",
2379
- "asyncbox": "^3.0.0",
2366
+ "asyncbox": "^4.0.1",
2380
2367
  "bluebird": "^3.5.1",
2381
2368
  "lodash": "^4.2.1",
2382
2369
  "semver": "^7.5.4",
2383
- "teen_process": "^3.0.0"
2370
+ "teen_process": "^4.0.4"
2384
2371
  },
2385
2372
  "engines": {
2386
2373
  "node": "^20.19.0 || ^22.12.0 || >=24.0.0",
2387
2374
  "npm": ">=10"
2388
2375
  }
2389
2376
  },
2390
- "node_modules/io.appium.settings/node_modules/asyncbox": {
2391
- "version": "3.0.0",
2392
- "resolved": "https://registry.npmjs.org/asyncbox/-/asyncbox-3.0.0.tgz",
2393
- "integrity": "sha512-X7U0nedUMKV3nn9c4R0Zgvdvv6cw97tbDlHSZicq1snGPi/oX9DgGmFSURWtxDdnBWd3V0YviKhqAYAVvoWQ/A==",
2377
+ "node_modules/io.appium.settings/node_modules/teen_process": {
2378
+ "version": "4.0.5",
2379
+ "resolved": "https://registry.npmjs.org/teen_process/-/teen_process-4.0.5.tgz",
2380
+ "integrity": "sha512-ZQQ2Vjs1/maFzpzfsZRAlQVSZrUBsKzAItaxSLImsHRTdI8hVt9Jm0JHyWFbrvvAf78V55BM3ZgNeQpXcXsWpw==",
2394
2381
  "license": "Apache-2.0",
2395
2382
  "dependencies": {
2396
- "bluebird": "^3.5.1",
2397
- "lodash": "^4.17.4",
2398
- "source-map-support": "^0.x"
2383
+ "bluebird": "^3.7.2",
2384
+ "lodash": "^4.17.21",
2385
+ "shell-quote": "^1.8.1"
2399
2386
  },
2400
2387
  "engines": {
2401
- "node": ">=16"
2388
+ "node": "^20.19.0 || ^22.12.0 || >=24.0.0",
2389
+ "npm": ">=10"
2402
2390
  }
2403
2391
  },
2404
2392
  "node_modules/ipaddr.js": {
package/package.json CHANGED
@@ -7,7 +7,7 @@
7
7
  "automated testing",
8
8
  "android"
9
9
  ],
10
- "version": "6.7.3",
10
+ "version": "6.7.4",
11
11
  "bugs": {
12
12
  "url": "https://github.com/appium/appium-uiautomator2-driver/issues"
13
13
  },