appium-uiautomator2-driver 7.3.0 → 7.4.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.
Files changed (60) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/build/lib/commands/app-management.d.ts.map +1 -1
  3. package/build/lib/commands/app-management.js +1 -5
  4. package/build/lib/commands/app-management.js.map +1 -1
  5. package/build/lib/commands/element.d.ts.map +1 -1
  6. package/build/lib/commands/element.js +2 -6
  7. package/build/lib/commands/element.js.map +1 -1
  8. package/build/lib/commands/gestures.d.ts.map +1 -1
  9. package/build/lib/commands/gestures.js +2 -6
  10. package/build/lib/commands/gestures.js.map +1 -1
  11. package/build/lib/commands/keyboard.d.ts.map +1 -1
  12. package/build/lib/commands/keyboard.js +0 -8
  13. package/build/lib/commands/keyboard.js.map +1 -1
  14. package/build/lib/commands/screenshot.js +7 -8
  15. package/build/lib/commands/screenshot.js.map +1 -1
  16. package/build/lib/css-converter.js +9 -12
  17. package/build/lib/css-converter.js.map +1 -1
  18. package/build/lib/driver.d.ts.map +1 -1
  19. package/build/lib/driver.js +9 -10
  20. package/build/lib/driver.js.map +1 -1
  21. package/build/lib/uiautomator2.d.ts.map +1 -1
  22. package/build/lib/uiautomator2.js +1 -2
  23. package/build/lib/uiautomator2.js.map +1 -1
  24. package/build/lib/{helpers.d.ts → utils/app.d.ts} +1 -1
  25. package/build/lib/utils/app.d.ts.map +1 -0
  26. package/build/lib/{helpers.js → utils/app.js} +1 -1
  27. package/build/lib/utils/app.js.map +1 -0
  28. package/build/lib/utils/index.d.ts +5 -0
  29. package/build/lib/utils/index.d.ts.map +1 -0
  30. package/build/lib/utils/index.js +21 -0
  31. package/build/lib/utils/index.js.map +1 -0
  32. package/build/lib/utils/lang.d.ts +15 -0
  33. package/build/lib/utils/lang.d.ts.map +1 -0
  34. package/build/lib/utils/lang.js +37 -0
  35. package/build/lib/utils/lang.js.map +1 -0
  36. package/build/lib/utils/memoize.d.ts +11 -0
  37. package/build/lib/utils/memoize.d.ts.map +1 -0
  38. package/build/lib/utils/memoize.js +26 -0
  39. package/build/lib/utils/memoize.js.map +1 -0
  40. package/build/lib/utils/object.d.ts +6 -0
  41. package/build/lib/utils/object.d.ts.map +1 -0
  42. package/build/lib/utils/object.js +15 -0
  43. package/build/lib/utils/object.js.map +1 -0
  44. package/lib/commands/app-management.ts +1 -2
  45. package/lib/commands/element.ts +2 -3
  46. package/lib/commands/gestures.ts +2 -3
  47. package/lib/commands/keyboard.ts +0 -5
  48. package/lib/commands/screenshot.ts +7 -7
  49. package/lib/css-converter.ts +9 -9
  50. package/lib/driver.ts +8 -9
  51. package/lib/uiautomator2.ts +1 -2
  52. package/lib/utils/index.ts +4 -0
  53. package/lib/utils/lang.ts +34 -0
  54. package/lib/utils/memoize.ts +26 -0
  55. package/lib/utils/object.ts +14 -0
  56. package/npm-shrinkwrap.json +78 -15
  57. package/package.json +1 -3
  58. package/build/lib/helpers.d.ts.map +0 -1
  59. package/build/lib/helpers.js.map +0 -1
  60. /package/lib/{helpers.ts → utils/app.ts} +0 -0
@@ -8,9 +8,9 @@ import type {
8
8
  AstSelector,
9
9
  AstTagName,
10
10
  } from 'css-selector-parser';
11
- import _ from 'lodash';
12
11
  import {errors} from 'appium/driver';
13
12
  import {log} from './logger';
13
+ import {escapeRegExp, isEmpty} from './utils';
14
14
 
15
15
  const parseCssSelector = createParser({
16
16
  syntax: {
@@ -100,7 +100,7 @@ export class CssConverter {
100
100
  private parseAttr(cssAttr: AstAttribute): string {
101
101
  const attrValueNode = cssAttr.value as {value?: string} | undefined;
102
102
  const attrValue = attrValueNode?.value;
103
- if (!_.isString(attrValue) && !_.isEmpty(attrValue)) {
103
+ if (typeof attrValue !== 'string' && !isEmpty(attrValue)) {
104
104
  throw new Error(
105
105
  `'${cssAttr.name}=${attrValue}' is an invalid attribute. Only 'string' and empty attribute types are supported. Found '${attrValue}'`,
106
106
  );
@@ -136,14 +136,14 @@ export class CssConverter {
136
136
  if (['description', 'text'].includes(attrName)) {
137
137
  return `.${methodName}Contains("${value}")`;
138
138
  }
139
- return `.${methodName}Matches("${_.escapeRegExp(value)}")`;
139
+ return `.${methodName}Matches("${escapeRegExp(value)}")`;
140
140
  case '^=':
141
141
  if (['description', 'text'].includes(attrName)) {
142
142
  return `.${methodName}StartsWith("${value}")`;
143
143
  }
144
- return `.${methodName}Matches("^${_.escapeRegExp(value)}")`;
144
+ return `.${methodName}Matches("^${escapeRegExp(value)}")`;
145
145
  case '$=':
146
- return `.${methodName}Matches("${_.escapeRegExp(value)}$")`;
146
+ return `.${methodName}Matches("${escapeRegExp(value)}$")`;
147
147
  case '~=':
148
148
  return `.${methodName}Matches("${getWordMatcherRegex(value)}")`;
149
149
  default:
@@ -155,7 +155,7 @@ export class CssConverter {
155
155
 
156
156
  private parsePseudo(cssPseudo: AstPseudoClass): string | undefined {
157
157
  const argValue = (cssPseudo.argument as {value?: string} | undefined)?.value;
158
- if (!_.isString(argValue) && !_.isEmpty(argValue)) {
158
+ if (typeof argValue !== 'string' && !isEmpty(argValue)) {
159
159
  throw new Error(
160
160
  `'${cssPseudo.name}=${argValue}'. Unsupported css pseudo class value: '${argValue}'. Only 'string' type or empty is supported.`,
161
161
  );
@@ -226,7 +226,7 @@ export class CssConverter {
226
226
  }
227
227
 
228
228
  private parseCssObject(css: AstSelector): string {
229
- if (!_.isEmpty(css.rules)) {
229
+ if (!isEmpty(css.rules)) {
230
230
  return this.parseCssRule(css.rules[0] as AstRule);
231
231
  }
232
232
 
@@ -247,7 +247,7 @@ function toSnakeCase(str?: string | null): string {
247
247
 
248
248
  function requireBoolean(css: AstAttribute | AstPseudoClass): 'true' | 'false' {
249
249
  const rawValue = (css as any).value?.value ?? (css as any).argument?.value;
250
- const value = _.toLower(rawValue ?? 'true');
250
+ const value = String(rawValue ?? 'true').toLowerCase();
251
251
  if (value === 'true') {
252
252
  return 'true';
253
253
  }
@@ -275,5 +275,5 @@ function requireEntityName(cssEntity: AstAttribute | AstPseudoClass): string {
275
275
  }
276
276
 
277
277
  function getWordMatcherRegex(word: string): string {
278
- return `\\b(\\w*${_.escapeRegExp(word)}\\w*)\\b`;
278
+ return `\\b(\\w*${escapeRegExp(word)}\\w*)\\b`;
279
279
  }
package/lib/driver.ts CHANGED
@@ -15,7 +15,6 @@ import {SETTINGS_HELPER_ID} from 'io.appium.settings';
15
15
  import {BaseDriver, DeviceSettings} from 'appium/driver';
16
16
  import {fs, mjpeg, util} from 'appium/support';
17
17
  import {retryInterval} from 'asyncbox';
18
- import _ from 'lodash';
19
18
  import os from 'node:os';
20
19
  import path from 'node:path';
21
20
  import {checkPortStatus, findAPortNotInUse} from 'portscanner';
@@ -23,7 +22,7 @@ import type {ExecError} from 'teen_process';
23
22
  import UIAUTOMATOR2_CONSTRAINTS, {type Uiautomator2Constraints} from './constraints';
24
23
  import {APKS_EXTENSION, APK_EXTENSION} from './extensions';
25
24
  import {newMethodMap} from './method-map';
26
- import {signApp} from './helpers';
25
+ import {assignDefaults, memoize, signApp} from './utils';
27
26
  import type {
28
27
  Uiautomator2Settings,
29
28
  Uiautomator2DeviceDetails,
@@ -360,7 +359,7 @@ class AndroidUiautomator2Driver
360
359
  'css selector',
361
360
  '-android uiautomator',
362
361
  ];
363
- this.desiredCapConstraints = _.cloneDeep(UIAUTOMATOR2_CONSTRAINTS);
362
+ this.desiredCapConstraints = structuredClone(UIAUTOMATOR2_CONSTRAINTS);
364
363
  this.jwpProxyActive = false;
365
364
  this.jwpProxyAvoid = NO_PROXY;
366
365
  this._originalIme = null;
@@ -375,8 +374,8 @@ class AndroidUiautomator2Driver
375
374
  this.caps = {} as Uiautomator2DriverCaps;
376
375
  this.opts = opts as Uiautomator2DriverOpts;
377
376
  // memoize functions here, so that they are done on a per-instance basis
378
- this.getStatusBarHeight = _.memoize(this.getStatusBarHeight);
379
- this.getDevicePixelRatio = _.memoize(this.getDevicePixelRatio);
377
+ this.getStatusBarHeight = memoize(this.getStatusBarHeight);
378
+ this.getDevicePixelRatio = memoize(this.getDevicePixelRatio);
380
379
  }
381
380
 
382
381
  override get driverData() {
@@ -423,7 +422,7 @@ class AndroidUiautomator2Driver
423
422
  adbPort: DEFAULT_ADB_PORT,
424
423
  androidInstallTimeout: 90000,
425
424
  };
426
- _.defaults(this.opts, defaultOpts);
425
+ assignDefaults(this.opts as Record<string, unknown>, defaultOpts);
427
426
 
428
427
  this.opts.adbPort = this.opts.adbPort || DEFAULT_ADB_PORT;
429
428
  // get device udid for this session
@@ -500,7 +499,7 @@ class AndroidUiautomator2Driver
500
499
  pixelRatio,
501
500
  statBarHeight,
502
501
  viewportRect,
503
- deviceApiLevel: _.parseInt(apiVersion),
502
+ deviceApiLevel: Number.parseInt(String(apiVersion), 10),
504
503
  platformVersion,
505
504
  deviceManufacturer: manufacturer,
506
505
  deviceModel: model,
@@ -921,7 +920,7 @@ class AndroidUiautomator2Driver
921
920
 
922
921
  const screenRecordingStopTasks = [
923
922
  async () => {
924
- if (!_.isEmpty(this._screenRecordingProperties)) {
923
+ if (this._screenRecordingProperties) {
925
924
  await this.stopRecordingScreen();
926
925
  }
927
926
  },
@@ -931,7 +930,7 @@ class AndroidUiautomator2Driver
931
930
  }
932
931
  },
933
932
  async () => {
934
- if (!_.isEmpty(this._screenStreamingProps)) {
933
+ if (this._screenStreamingProps) {
935
934
  await this.mobileStopScreenStreaming();
936
935
  }
937
936
  },
@@ -1,4 +1,3 @@
1
- import _ from 'lodash';
2
1
  import {JWProxy, errors} from 'appium/driver';
3
2
  import {sleep, waitForCondition} from 'asyncbox';
4
3
  import {
@@ -409,7 +408,7 @@ export class UiAutomator2Server {
409
408
  if (this.disableWindowAnimation) {
410
409
  cmd.push('--no-window-animation');
411
410
  }
412
- if (_.isBoolean(this.disableSuppressAccessibilityService)) {
411
+ if (typeof this.disableSuppressAccessibilityService === 'boolean') {
413
412
  cmd.push(
414
413
  '-e',
415
414
  'DISABLE_SUPPRESS_ACCESSIBILITY_SERVICES',
@@ -0,0 +1,4 @@
1
+ export * from './app';
2
+ export * from './lang';
3
+ export * from './memoize';
4
+ export * from './object';
@@ -0,0 +1,34 @@
1
+ // TODO(appium server 3.4.1+): Replace local `isEmpty` / `escapeRegExp` with imports from `appium/support`
2
+ // once this driver declares that minimum server version.
3
+
4
+ /**
5
+ * Returns true when the value has no elements/properties.
6
+ *
7
+ * @param value - Value to check
8
+ * @returns `true` if the value is empty
9
+ */
10
+ export function isEmpty(value: unknown): boolean {
11
+ if (value == null) {
12
+ return true;
13
+ }
14
+ if (typeof value === 'string' || Array.isArray(value) || Buffer.isBuffer(value)) {
15
+ return value.length === 0;
16
+ }
17
+ if (value instanceof Map || value instanceof Set) {
18
+ return value.size === 0;
19
+ }
20
+ if (typeof value === 'object' || typeof value === 'function') {
21
+ return Object.keys(value).length === 0;
22
+ }
23
+ return true;
24
+ }
25
+
26
+ /**
27
+ * Escapes RegExp special characters in a string.
28
+ *
29
+ * @param value - Input string
30
+ * @returns Escaped string safe for RegExp source
31
+ */
32
+ export function escapeRegExp(value: string): string {
33
+ return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
34
+ }
@@ -0,0 +1,26 @@
1
+ // TODO(appium server 3.4.1+): Replace local `memoize` with imports from `appium/support`
2
+ // once this driver declares that minimum server version.
3
+
4
+ /**
5
+ * Creates a memoized version of a function.
6
+ *
7
+ * @param fn - Function to memoize
8
+ * @param resolver - Optional cache key resolver. If omitted, the first argument is used as the cache key.
9
+ * @returns Memoized function with a mutable `.cache` map (compatible with lodash-style cache resets in tests).
10
+ */
11
+ export function memoize<Fn extends (...args: any[]) => any>(
12
+ fn: Fn,
13
+ resolver?: (...args: Parameters<Fn>) => unknown,
14
+ ): Fn & {cache: Map<unknown, ReturnType<Fn>>} {
15
+ const memoizedFn = function (this: unknown, ...args: Parameters<Fn>) {
16
+ const key = resolver ? resolver.apply(this, args) : args[0];
17
+ if (memoizedFn.cache.has(key)) {
18
+ return memoizedFn.cache.get(key) as ReturnType<Fn>;
19
+ }
20
+ const result = fn.apply(this, args);
21
+ memoizedFn.cache.set(key, result);
22
+ return result;
23
+ } as unknown as Fn & {cache: Map<unknown, ReturnType<Fn>>};
24
+ memoizedFn.cache = new Map<unknown, ReturnType<Fn>>();
25
+ return memoizedFn;
26
+ }
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Assigns own enumerable properties of `source` onto `target` only where `target[key] === undefined`
3
+ * (lodash `defaults` semantics).
4
+ */
5
+ export function assignDefaults<T extends Record<string, unknown>>(
6
+ target: T,
7
+ source: Record<string, unknown>,
8
+ ): void {
9
+ for (const key of Object.keys(source)) {
10
+ if (target[key] === undefined) {
11
+ (target as Record<string, unknown>)[key] = source[key];
12
+ }
13
+ }
14
+ }
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "appium-uiautomator2-driver",
3
- "version": "7.3.0",
3
+ "version": "7.4.0",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "appium-uiautomator2-driver",
9
- "version": "7.3.0",
9
+ "version": "7.4.0",
10
10
  "license": "Apache-2.0",
11
11
  "dependencies": {
12
12
  "appium-adb": "^14.0.0",
@@ -16,7 +16,6 @@
16
16
  "axios": "^1.16.0",
17
17
  "css-selector-parser": "^3.0.0",
18
18
  "io.appium.settings": "^7.0.1",
19
- "lodash": "^4.17.4",
20
19
  "portscanner": "^2.2.0",
21
20
  "teen_process": "^4.0.4"
22
21
  },
@@ -30,7 +29,6 @@
30
29
  "@semantic-release/git": "^10.0.1",
31
30
  "@types/chai": "^5.2.3",
32
31
  "@types/chai-as-promised": "^8.0.2",
33
- "@types/lodash": "^4.14.194",
34
32
  "@types/mocha": "^10.0.1",
35
33
  "@types/node": "^25.0.3",
36
34
  "@types/portscanner": "^2.1.1",
@@ -107,6 +105,17 @@
107
105
  "npm": ">=10"
108
106
  }
109
107
  },
108
+ "node_modules/@appium/base-driver/node_modules/axios": {
109
+ "version": "1.16.0",
110
+ "resolved": "https://registry.npmjs.org/axios/-/axios-1.16.0.tgz",
111
+ "integrity": "sha512-6hp5CwvTPlN2A31g5dxnwAX0orzM7pmCRDLnZSX772mv8WDqICwFjowHuPs04Mc8deIld1+ejhtaMn5vp6b+1w==",
112
+ "license": "MIT",
113
+ "dependencies": {
114
+ "follow-redirects": "^1.16.0",
115
+ "form-data": "^4.0.5",
116
+ "proxy-from-env": "^2.1.0"
117
+ }
118
+ },
110
119
  "node_modules/@appium/docutils": {
111
120
  "version": "2.4.2",
112
121
  "resolved": "https://registry.npmjs.org/@appium/docutils/-/docutils-2.4.2.tgz",
@@ -224,6 +233,17 @@
224
233
  "npm": ">=10"
225
234
  }
226
235
  },
236
+ "node_modules/@appium/support/node_modules/axios": {
237
+ "version": "1.16.0",
238
+ "resolved": "https://registry.npmjs.org/axios/-/axios-1.16.0.tgz",
239
+ "integrity": "sha512-6hp5CwvTPlN2A31g5dxnwAX0orzM7pmCRDLnZSX772mv8WDqICwFjowHuPs04Mc8deIld1+ejhtaMn5vp6b+1w==",
240
+ "license": "MIT",
241
+ "dependencies": {
242
+ "follow-redirects": "^1.16.0",
243
+ "form-data": "^4.0.5",
244
+ "proxy-from-env": "^2.1.0"
245
+ }
246
+ },
227
247
  "node_modules/@appium/tsconfig": {
228
248
  "version": "1.1.2",
229
249
  "resolved": "https://registry.npmjs.org/@appium/tsconfig/-/tsconfig-1.1.2.tgz",
@@ -495,6 +515,18 @@
495
515
  "node": ">= 0.6"
496
516
  }
497
517
  },
518
+ "node_modules/agent-base": {
519
+ "version": "6.0.2",
520
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
521
+ "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
522
+ "license": "MIT",
523
+ "dependencies": {
524
+ "debug": "4"
525
+ },
526
+ "engines": {
527
+ "node": ">= 6.0.0"
528
+ }
529
+ },
498
530
  "node_modules/ansi-regex": {
499
531
  "version": "6.2.2",
500
532
  "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz",
@@ -751,13 +783,14 @@
751
783
  "license": "MIT"
752
784
  },
753
785
  "node_modules/axios": {
754
- "version": "1.16.0",
755
- "resolved": "https://registry.npmjs.org/axios/-/axios-1.16.0.tgz",
756
- "integrity": "sha512-6hp5CwvTPlN2A31g5dxnwAX0orzM7pmCRDLnZSX772mv8WDqICwFjowHuPs04Mc8deIld1+ejhtaMn5vp6b+1w==",
786
+ "version": "1.16.1",
787
+ "resolved": "https://registry.npmjs.org/axios/-/axios-1.16.1.tgz",
788
+ "integrity": "sha512-caYkukvroVPO8KrzuJEb50Hm07KwfBZPEC3VeFHTsqWHvKTsy54hjJz9BS/cdaypROE2rH6xvm9mHX4fgWkr3A==",
757
789
  "license": "MIT",
758
790
  "dependencies": {
759
791
  "follow-redirects": "^1.16.0",
760
792
  "form-data": "^4.0.5",
793
+ "https-proxy-agent": "^5.0.1",
761
794
  "proxy-from-env": "^2.1.0"
762
795
  }
763
796
  },
@@ -785,9 +818,9 @@
785
818
  }
786
819
  },
787
820
  "node_modules/bare-events": {
788
- "version": "2.8.2",
789
- "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.8.2.tgz",
790
- "integrity": "sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==",
821
+ "version": "2.8.3",
822
+ "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.8.3.tgz",
823
+ "integrity": "sha512-HdUm8EMQBLaJvGUdidNNbqpA1kYkwNcb+MYxkxCLAPJGQzlv9J0C24h8V65Z4c5GLd/JEALDvpFCQgpLJqc0zw==",
791
824
  "license": "Apache-2.0",
792
825
  "peerDependencies": {
793
826
  "bare-abort-controller": "*"
@@ -2006,6 +2039,19 @@
2006
2039
  "integrity": "sha512-RJ8XvFvpPM/Dmc5SV+dC4y5PCeOhT3x1Hq0NU3rjGeg5a/CqlhZ7uudknPwZFz4aeAXDcbAyaeP7GAo9lvngtA==",
2007
2040
  "license": "MIT"
2008
2041
  },
2042
+ "node_modules/https-proxy-agent": {
2043
+ "version": "5.0.1",
2044
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
2045
+ "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
2046
+ "license": "MIT",
2047
+ "dependencies": {
2048
+ "agent-base": "6",
2049
+ "debug": "4"
2050
+ },
2051
+ "engines": {
2052
+ "node": ">= 6"
2053
+ }
2054
+ },
2009
2055
  "node_modules/iconv-lite": {
2010
2056
  "version": "0.7.2",
2011
2057
  "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz",
@@ -3625,17 +3671,34 @@
3625
3671
  }
3626
3672
  },
3627
3673
  "node_modules/type-is": {
3628
- "version": "2.0.1",
3629
- "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz",
3630
- "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==",
3674
+ "version": "2.1.0",
3675
+ "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.1.0.tgz",
3676
+ "integrity": "sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA==",
3631
3677
  "license": "MIT",
3632
3678
  "dependencies": {
3633
- "content-type": "^1.0.5",
3679
+ "content-type": "^2.0.0",
3634
3680
  "media-typer": "^1.1.0",
3635
3681
  "mime-types": "^3.0.0"
3636
3682
  },
3637
3683
  "engines": {
3638
- "node": ">= 0.6"
3684
+ "node": ">= 18"
3685
+ },
3686
+ "funding": {
3687
+ "type": "opencollective",
3688
+ "url": "https://opencollective.com/express"
3689
+ }
3690
+ },
3691
+ "node_modules/type-is/node_modules/content-type": {
3692
+ "version": "2.0.0",
3693
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.0.0.tgz",
3694
+ "integrity": "sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ==",
3695
+ "license": "MIT",
3696
+ "engines": {
3697
+ "node": ">=18"
3698
+ },
3699
+ "funding": {
3700
+ "type": "opencollective",
3701
+ "url": "https://opencollective.com/express"
3639
3702
  }
3640
3703
  },
3641
3704
  "node_modules/unicorn-magic": {
package/package.json CHANGED
@@ -7,7 +7,7 @@
7
7
  "automated testing",
8
8
  "android"
9
9
  ],
10
- "version": "7.3.0",
10
+ "version": "7.4.0",
11
11
  "bugs": {
12
12
  "url": "https://github.com/appium/appium-uiautomator2-driver/issues"
13
13
  },
@@ -63,7 +63,6 @@
63
63
  "axios": "^1.16.0",
64
64
  "css-selector-parser": "^3.0.0",
65
65
  "io.appium.settings": "^7.0.1",
66
- "lodash": "^4.17.4",
67
66
  "portscanner": "^2.2.0",
68
67
  "teen_process": "^4.0.4"
69
68
  },
@@ -77,7 +76,6 @@
77
76
  "@semantic-release/git": "^10.0.1",
78
77
  "@types/chai": "^5.2.3",
79
78
  "@types/chai-as-promised": "^8.0.2",
80
- "@types/lodash": "^4.14.194",
81
79
  "@types/mocha": "^10.0.1",
82
80
  "@types/node": "^25.0.3",
83
81
  "@types/portscanner": "^2.1.1",
@@ -1 +0,0 @@
1
- {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../lib/helpers.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,GAAG,EAAC,MAAM,YAAY,CAAC;AAGpC;;;GAGG;AACH,wBAAsB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAcpE;AAED;;;;;GAKG;AACH,wBAAsB,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAStE"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../lib/helpers.ts"],"names":[],"mappings":";;;;;AAQA,kCAcC;AAQD,0BASC;AAvCD,0DAA6B;AAE7B,4CAA0C;AAE1C;;;GAGG;AACI,KAAK,UAAU,WAAW,CAAC,QAAgB;IAChD,IAAI,CAAC;QACH,MAAM,YAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,YAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC7C,IAAI,gBAAM,CAAC,SAAS,EAAE,EAAE,CAAC;YACvB,0DAA0D;YAC1D,6DAA6D;YAC7D,8EAA8E;YAC9E,mBAAmB;YACnB,MAAM,YAAE,CAAC,KAAK,CAAC,MAAM,YAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC;QAChD,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACI,KAAK,UAAU,OAAO,CAAC,GAAQ,EAAE,OAAe;IACrD,IAAI,CAAC,CAAC,MAAM,WAAW,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CACb,uBAAuB,OAAO,sBAAsB;YAClD,wEAAwE,mBAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI;YACjG,0DAA0D,CAC7D,CAAC;IACJ,CAAC;IACD,MAAM,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAC1B,CAAC"}
File without changes