node-devicectl 1.3.1 → 1.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.
package/CHANGELOG.md CHANGED
@@ -1,3 +1,9 @@
1
+ ## [1.4.0](https://github.com/appium/node-devicectl/compare/v1.3.1...v1.4.0) (2026-05-16)
2
+
3
+ ### Features
4
+
5
+ * Add API for app termination ([#18](https://github.com/appium/node-devicectl/issues/18)) ([20601e3](https://github.com/appium/node-devicectl/commit/20601e39e63176dc988d2ed02bd799b0f7c9ffeb))
6
+
1
7
  ## [1.3.1](https://github.com/appium/node-devicectl/compare/v1.3.0...v1.3.1) (2026-05-08)
2
8
 
3
9
  ### Miscellaneous Chores
package/README.md CHANGED
@@ -28,6 +28,8 @@ await devicectl.launchApp('com.example.app', {
28
28
  env: { DEBUG: '1' },
29
29
  terminateExisting: true
30
30
  });
31
+ await devicectl.terminateApp('com.example.app');
32
+ await devicectl.terminateApp('com.example.app', { force: true });
31
33
  ```
32
34
 
33
35
  When Node is running under `sudo`, `node-devicectl` runs `xcrun devicectl` as the original
@@ -16,6 +16,7 @@ export declare class Devicectl {
16
16
  sendMemoryWarning: typeof processMixins.sendMemoryWarning;
17
17
  sendSignalToProcess: typeof processMixins.sendSignalToProcess;
18
18
  launchApp: typeof processMixins.launchApp;
19
+ terminateApp: typeof processMixins.terminateApp;
19
20
  listProcesses: typeof infoMixins.listProcesses;
20
21
  listApps: typeof infoMixins.listApps;
21
22
  listFiles: typeof copyMixins.listFiles;
@@ -1 +1 @@
1
- {"version":3,"file":"devicectl.d.ts","sourceRoot":"","sources":["../../lib/devicectl.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAC,gBAAgB,EAAE,cAAc,EAAE,aAAa,EAAC,MAAM,SAAS,CAAC;AAC7E,OAAO,KAAK,aAAa,MAAM,kBAAkB,CAAC;AAClD,OAAO,KAAK,UAAU,MAAM,eAAe,CAAC;AAC5C,OAAO,KAAK,UAAU,MAAM,eAAe,CAAC;AAC5C,OAAO,KAAK,UAAU,MAAM,eAAe,CAAC;AAM5C;;;;;;GAMG;AACH,qBAAa,SAAS;IACpB,mCAAmC;IACnC,SAAgB,IAAI,EAAE,MAAM,CAAC;IAE7B,iBAAiB,yCAAmC;IACpD,mBAAmB,2CAAqC;IACxD,SAAS,iCAA2B;IAEpC,aAAa,kCAA4B;IACzC,QAAQ,6BAAuB;IAE/B,SAAS,8BAAwB;IACjC,QAAQ,6BAAuB;IAE/B,WAAW,gCAA0B;IAErC,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAU;IAChD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAkB;IAE3C;;;;OAIG;gBACS,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,gBAAgB;IAMjD;;;;;;OAMG;IACG,OAAO,CAAC,CAAC,SAAS,cAAc,EACpC,UAAU,EAAE,MAAM,EAAE,EACpB,IAAI,CAAC,EAAE,CAAC,GACP,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;IAoD5B,OAAO,CAAC,eAAe;CAYxB"}
1
+ {"version":3,"file":"devicectl.d.ts","sourceRoot":"","sources":["../../lib/devicectl.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAC,gBAAgB,EAAE,cAAc,EAAE,aAAa,EAAC,MAAM,SAAS,CAAC;AAC7E,OAAO,KAAK,aAAa,MAAM,kBAAkB,CAAC;AAClD,OAAO,KAAK,UAAU,MAAM,eAAe,CAAC;AAC5C,OAAO,KAAK,UAAU,MAAM,eAAe,CAAC;AAC5C,OAAO,KAAK,UAAU,MAAM,eAAe,CAAC;AAM5C;;;;;;GAMG;AACH,qBAAa,SAAS;IACpB,mCAAmC;IACnC,SAAgB,IAAI,EAAE,MAAM,CAAC;IAE7B,iBAAiB,yCAAmC;IACpD,mBAAmB,2CAAqC;IACxD,SAAS,iCAA2B;IACpC,YAAY,oCAA8B;IAE1C,aAAa,kCAA4B;IACzC,QAAQ,6BAAuB;IAE/B,SAAS,8BAAwB;IACjC,QAAQ,6BAAuB;IAE/B,WAAW,gCAA0B;IAErC,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAU;IAChD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAkB;IAE3C;;;;OAIG;gBACS,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,gBAAgB;IAMjD;;;;;;OAMG;IACG,OAAO,CAAC,CAAC,SAAS,cAAc,EACpC,UAAU,EAAE,MAAM,EAAE,EACpB,IAAI,CAAC,EAAE,CAAC,GACP,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;IAoD5B,OAAO,CAAC,eAAe;CAYxB"}
@@ -58,6 +58,7 @@ class Devicectl {
58
58
  sendMemoryWarning = processMixins.sendMemoryWarning;
59
59
  sendSignalToProcess = processMixins.sendSignalToProcess;
60
60
  launchApp = processMixins.launchApp;
61
+ terminateApp = processMixins.terminateApp;
61
62
  listProcesses = infoMixins.listProcesses;
62
63
  listApps = infoMixins.listApps;
63
64
  listFiles = copyMixins.listFiles;
@@ -1 +1 @@
1
- {"version":3,"file":"devicectl.js","sourceRoot":"","sources":["../../lib/devicectl.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,+CAA8C;AAC9C,4DAAoC;AAEpC,gEAAkD;AAClD,0DAA4C;AAC5C,0DAA4C;AAC5C,0DAA4C;AAE5C,MAAM,KAAK,GAAG,OAAO,CAAC;AACtB,MAAM,OAAO,GAAG,WAAW,CAAC;AAG5B;;;;;;GAMG;AACH,MAAa,SAAS;IACpB,mCAAmC;IACnB,IAAI,CAAS;IAE7B,iBAAiB,GAAG,aAAa,CAAC,iBAAiB,CAAC;IACpD,mBAAmB,GAAG,aAAa,CAAC,mBAAmB,CAAC;IACxD,SAAS,GAAG,aAAa,CAAC,SAAS,CAAC;IAEpC,aAAa,GAAG,UAAU,CAAC,aAAa,CAAC;IACzC,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC;IAE/B,SAAS,GAAG,UAAU,CAAC,SAAS,CAAC;IACjC,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC;IAE/B,WAAW,GAAG,UAAU,CAAC,WAAW,CAAC;IAEpB,qBAAqB,CAAU;IAC/B,QAAQ,CAAkB;IAE3C;;;;OAIG;IACH,YAAY,IAAY,EAAE,IAAuB;QAC/C,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,qBAAqB,GAAG,IAAI,EAAE,qBAAqB,IAAI,IAAI,CAAC;QACjE,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;IACzC,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,OAAO,CACX,UAAoB,EACpB,IAAQ;QAER,MAAM,EACJ,SAAS,GAAG,KAAK,EACjB,YAAY,GAAG,KAAK,EACpB,MAAM,GAAG,IAAI,EACb,QAAQ,GAAG,KAAK,EAChB,iBAAiB,EACjB,OAAO,EACP,oBAAoB,GAAG,IAAI,CAAC,qBAAqB,GAClD,GAAG,IAAI,IAAI,EAAE,CAAC;QAEf,MAAM,SAAS,GAAG,CAAC,WAAW,EAAE,GAAG,UAAU,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAE7F,IAAI,iBAAiB,IAAI,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtD,SAAS,CAAC,IAAI,CACZ,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAChF,CAAC;QACJ,CAAC;QAED,IAAI,MAAM,EAAE,CAAC;YACX,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,eAAe,EAAE,GAAG,CAAC,CAAC;QAClD,CAAC;QAED,MAAM,QAAQ,GAAG,oBAAoB,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;QACnF,MAAM,MAAM,GAAG,CAAC,KAAK,EAAE,GAAG,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACxE,gBAAM,CAAC,KAAK,CAAC,OAAO,EAAE,aAAa,MAAM,EAAE,CAAC,CAAC;QAE7C,IAAI,CAAC;YACH,IAAI,YAAY,EAAE,CAAC;gBACjB,MAAM,MAAM,GAAG,IAAI,yBAAU,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;gBAC1D,MAAM,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBACtB,OAAO,MAA0B,CAAC;YACpC,CAAC;YAED,MAAM,QAAQ,GAAG;gBACf,GAAG,QAAQ;gBACX,GAAG,CAAC,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAC,OAAO,EAAC,CAAC,CAAC,CAAC,EAAE,CAAC;aAClD,CAAC;YACF,MAAM,MAAM,GAAG,MAAM,IAAA,mBAAI,EAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;YAEtD,IAAI,SAAS,EAAE,CAAC;gBACd,gBAAM,CAAC,KAAK,CAAC,OAAO,EAAE,mBAAmB,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;YAC5D,CAAC;YAED,OAAO,MAA0B,CAAC;QACpC,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,IAAI,MAAM,6BAA6B,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE;gBAC1F,KAAK,EAAE,CAAC;aACT,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAEO,eAAe;QACrB,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC;YAChD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACzC,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACzC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;YACrD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,EAAC,GAAG,EAAE,GAAG,EAAC,CAAC;IACpB,CAAC;CACF;AAxGD,8BAwGC"}
1
+ {"version":3,"file":"devicectl.js","sourceRoot":"","sources":["../../lib/devicectl.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import type { LaunchAppOptions } from '../types';
1
+ import type { LaunchAppOptions, TerminateAppOptions } from '../types';
2
2
  import type { Devicectl } from '../devicectl';
3
3
  /**
4
4
  * Simulates memory warning for the process with the given PID
@@ -14,4 +14,18 @@ export declare function sendSignalToProcess(this: Devicectl, pid: number | strin
14
14
  * Please use via WDA or via appium-ios-device as primary method to launch app if possible.
15
15
  */
16
16
  export declare function launchApp(this: Devicectl, bundleId: string, opts?: LaunchAppOptions): Promise<void>;
17
+ /**
18
+ * Terminates all running processes for the app with the given bundle identifier.
19
+ *
20
+ * Resolves the app's install path via {@link Devicectl.listApps}, finds matching
21
+ * processes with `devicectl device info processes --filter`, then terminates each
22
+ * via `devicectl device process terminate`.
23
+ *
24
+ * @returns `true` if at least one process was terminated, otherwise `false`
25
+ */
26
+ export declare function terminateApp(this: Devicectl, bundleId: string, opts?: TerminateAppOptions): Promise<boolean>;
27
+ /** Converts a devicectl app URL to a filesystem path for process filters. */
28
+ export declare function appUrlToFilesystemPath(appUrl: string): string;
29
+ /** Escapes a value for use inside a devicectl process filter string. */
30
+ export declare function escapeProcessFilterValue(value: string): string;
17
31
  //# sourceMappingURL=process.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"process.d.ts","sourceRoot":"","sources":["../../../lib/mixins/process.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,gBAAgB,EAAC,MAAM,UAAU,CAAC;AAC/C,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAE5C;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAI5F;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,SAAS,EACf,GAAG,EAAE,MAAM,GAAG,MAAM,EACpB,MAAM,EAAE,MAAM,GAAG,MAAM,GACtB,OAAO,CAAC,IAAI,CAAC,CAIf;AAED;;;;GAIG;AACH,wBAAsB,SAAS,CAC7B,IAAI,EAAE,SAAS,EACf,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE,gBAAqB,GAC1B,OAAO,CAAC,IAAI,CAAC,CA0Bf"}
1
+ {"version":3,"file":"process.d.ts","sourceRoot":"","sources":["../../../lib/mixins/process.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,gBAAgB,EAAe,mBAAmB,EAAC,MAAM,UAAU,CAAC;AACjF,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAE5C;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAI5F;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,SAAS,EACf,GAAG,EAAE,MAAM,GAAG,MAAM,EACpB,MAAM,EAAE,MAAM,GAAG,MAAM,GACtB,OAAO,CAAC,IAAI,CAAC,CAIf;AAED;;;;GAIG;AACH,wBAAsB,SAAS,CAC7B,IAAI,EAAE,SAAS,EACf,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE,gBAAqB,GAC1B,OAAO,CAAC,IAAI,CAAC,CA0Bf;AAED;;;;;;;;GAQG;AACH,wBAAsB,YAAY,CAChC,IAAI,EAAE,SAAS,EACf,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE,mBAAwB,GAC7B,OAAO,CAAC,OAAO,CAAC,CA0BlB;AAED,6EAA6E;AAC7E,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAG7D;AAED,wEAAwE;AACxE,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE9D"}
@@ -3,6 +3,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.sendMemoryWarning = sendMemoryWarning;
4
4
  exports.sendSignalToProcess = sendSignalToProcess;
5
5
  exports.launchApp = launchApp;
6
+ exports.terminateApp = terminateApp;
7
+ exports.appUrlToFilesystemPath = appUrlToFilesystemPath;
8
+ exports.escapeProcessFilterValue = escapeProcessFilterValue;
6
9
  /**
7
10
  * Simulates memory warning for the process with the given PID
8
11
  */
@@ -41,4 +44,48 @@ async function launchApp(bundleId, opts = {}) {
41
44
  asJson: false,
42
45
  });
43
46
  }
47
+ /**
48
+ * Terminates all running processes for the app with the given bundle identifier.
49
+ *
50
+ * Resolves the app's install path via {@link Devicectl.listApps}, finds matching
51
+ * processes with `devicectl device info processes --filter`, then terminates each
52
+ * via `devicectl device process terminate`.
53
+ *
54
+ * @returns `true` if at least one process was terminated, otherwise `false`
55
+ */
56
+ async function terminateApp(bundleId, opts = {}) {
57
+ const apps = await this.listApps(bundleId);
58
+ if (apps.length === 0) {
59
+ return false;
60
+ }
61
+ const processes = await listProcessesForAppPath(this, appUrlToFilesystemPath(apps[0].url));
62
+ if (processes.length === 0) {
63
+ return false;
64
+ }
65
+ const { force = false } = opts;
66
+ const subcommandOptions = [];
67
+ if (force) {
68
+ subcommandOptions.push('--kill');
69
+ }
70
+ await Promise.all(processes.map(({ processIdentifier }) => this.execute(['device', 'process', 'terminate'], {
71
+ subcommandOptions: [...subcommandOptions, '--pid', `${processIdentifier}`],
72
+ })));
73
+ return true;
74
+ }
75
+ /** Converts a devicectl app URL to a filesystem path for process filters. */
76
+ function appUrlToFilesystemPath(appUrl) {
77
+ const path = appUrl.startsWith('file:') ? new URL(appUrl).pathname : appUrl;
78
+ return path.replace(/\/$/, '') || '/';
79
+ }
80
+ /** Escapes a value for use inside a devicectl process filter string. */
81
+ function escapeProcessFilterValue(value) {
82
+ return value.replace(/\\/g, '\\\\').replace(/"/g, '\\"');
83
+ }
84
+ async function listProcessesForAppPath(devicectl, appPath) {
85
+ const filter = `executable.path BEGINSWITH "${escapeProcessFilterValue(appPath)}"`;
86
+ const { stdout } = await devicectl.execute(['device', 'info', 'processes'], {
87
+ subcommandOptions: ['--filter', filter],
88
+ });
89
+ return JSON.parse(stdout).result.runningProcesses;
90
+ }
44
91
  //# sourceMappingURL=process.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"process.js","sourceRoot":"","sources":["../../../lib/mixins/process.ts"],"names":[],"mappings":";;AAMA,8CAIC;AAKD,kDAQC;AAOD,8BA8BC;AAzDD;;GAEG;AACI,KAAK,UAAU,iBAAiB,CAAkB,GAAoB;IAC3E,MAAM,IAAI,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,SAAS,EAAE,mBAAmB,CAAC,EAAE;QAC7D,iBAAiB,EAAE,CAAC,OAAO,EAAE,GAAG,GAAG,EAAE,CAAC;KACvC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,mBAAmB,CAEvC,GAAoB,EACpB,MAAuB;IAEvB,MAAM,IAAI,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC,EAAE;QAClD,iBAAiB,EAAE,CAAC,UAAU,EAAE,GAAG,MAAM,EAAE,EAAE,OAAO,EAAE,GAAG,GAAG,EAAE,CAAC;KAChE,CAAC,CAAC;AACL,CAAC;AAED;;;;GAIG;AACI,KAAK,UAAU,SAAS,CAE7B,QAAgB,EAChB,OAAyB,EAAE;IAE3B,MAAM,EAAC,GAAG,EAAE,iBAAiB,GAAG,KAAK,EAAC,GAAG,IAAI,CAAC;IAE9C,MAAM,iBAAiB,GAAa,EAAE,CAAC;IAEvC,IAAI,iBAAiB,EAAE,CAAC;QACtB,iBAAiB,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IACjD,CAAC;IAED,IAAI,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvC,iBAAiB,CAAC,IAAI,CACpB,yBAAyB,EACzB,IAAI,CAAC,SAAS,CACZ,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CACpF,CACF,CAAC;IACJ,CAAC;IAED,gEAAgE;IAChE,wEAAwE;IACxE,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAEjC,MAAM,IAAI,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC,EAAE;QAClD,iBAAiB;QACjB,MAAM,EAAE,KAAK;KACd,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"process.js","sourceRoot":"","sources":["../../../lib/mixins/process.ts"],"names":[],"mappings":"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"}
@@ -117,6 +117,16 @@ export interface LaunchAppOptions {
117
117
  /** Whether to terminate the already running app */
118
118
  terminateExisting?: boolean;
119
119
  }
120
+ /**
121
+ * Options for terminating an app
122
+ */
123
+ export interface TerminateAppOptions {
124
+ /**
125
+ * Send SIGKILL instead of SIGTERM so the process cannot catch the signal
126
+ * @default false
127
+ */
128
+ force?: boolean;
129
+ }
120
130
  /**
121
131
  * Result type for synchronous execution
122
132
  */
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../lib/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../lib/types.ts"],"names":[],"mappings":"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"}
package/lib/devicectl.ts CHANGED
@@ -24,6 +24,7 @@ export class Devicectl {
24
24
  sendMemoryWarning = processMixins.sendMemoryWarning;
25
25
  sendSignalToProcess = processMixins.sendSignalToProcess;
26
26
  launchApp = processMixins.launchApp;
27
+ terminateApp = processMixins.terminateApp;
27
28
 
28
29
  listProcesses = infoMixins.listProcesses;
29
30
  listApps = infoMixins.listApps;
@@ -1,4 +1,4 @@
1
- import type {LaunchAppOptions} from '../types';
1
+ import type {LaunchAppOptions, ProcessInfo, TerminateAppOptions} from '../types';
2
2
  import type {Devicectl} from '../devicectl';
3
3
 
4
4
  /**
@@ -59,3 +59,66 @@ export async function launchApp(
59
59
  asJson: false,
60
60
  });
61
61
  }
62
+
63
+ /**
64
+ * Terminates all running processes for the app with the given bundle identifier.
65
+ *
66
+ * Resolves the app's install path via {@link Devicectl.listApps}, finds matching
67
+ * processes with `devicectl device info processes --filter`, then terminates each
68
+ * via `devicectl device process terminate`.
69
+ *
70
+ * @returns `true` if at least one process was terminated, otherwise `false`
71
+ */
72
+ export async function terminateApp(
73
+ this: Devicectl,
74
+ bundleId: string,
75
+ opts: TerminateAppOptions = {},
76
+ ): Promise<boolean> {
77
+ const apps = await this.listApps(bundleId);
78
+ if (apps.length === 0) {
79
+ return false;
80
+ }
81
+
82
+ const processes = await listProcessesForAppPath(this, appUrlToFilesystemPath(apps[0].url));
83
+ if (processes.length === 0) {
84
+ return false;
85
+ }
86
+
87
+ const {force = false} = opts;
88
+ const subcommandOptions: string[] = [];
89
+ if (force) {
90
+ subcommandOptions.push('--kill');
91
+ }
92
+
93
+ await Promise.all(
94
+ processes.map(({processIdentifier}) =>
95
+ this.execute(['device', 'process', 'terminate'], {
96
+ subcommandOptions: [...subcommandOptions, '--pid', `${processIdentifier}`],
97
+ }),
98
+ ),
99
+ );
100
+
101
+ return true;
102
+ }
103
+
104
+ /** Converts a devicectl app URL to a filesystem path for process filters. */
105
+ export function appUrlToFilesystemPath(appUrl: string): string {
106
+ const path = appUrl.startsWith('file:') ? new URL(appUrl).pathname : appUrl;
107
+ return path.replace(/\/$/, '') || '/';
108
+ }
109
+
110
+ /** Escapes a value for use inside a devicectl process filter string. */
111
+ export function escapeProcessFilterValue(value: string): string {
112
+ return value.replace(/\\/g, '\\\\').replace(/"/g, '\\"');
113
+ }
114
+
115
+ async function listProcessesForAppPath(
116
+ devicectl: Devicectl,
117
+ appPath: string,
118
+ ): Promise<ProcessInfo[]> {
119
+ const filter = `executable.path BEGINSWITH "${escapeProcessFilterValue(appPath)}"`;
120
+ const {stdout} = await devicectl.execute(['device', 'info', 'processes'], {
121
+ subcommandOptions: ['--filter', filter],
122
+ });
123
+ return JSON.parse(stdout).result.runningProcesses;
124
+ }
package/lib/types.ts CHANGED
@@ -126,6 +126,17 @@ export interface LaunchAppOptions {
126
126
  terminateExisting?: boolean;
127
127
  }
128
128
 
129
+ /**
130
+ * Options for terminating an app
131
+ */
132
+ export interface TerminateAppOptions {
133
+ /**
134
+ * Send SIGKILL instead of SIGTERM so the process cannot catch the signal
135
+ * @default false
136
+ */
137
+ force?: boolean;
138
+ }
139
+
129
140
  /**
130
141
  * Result type for synchronous execution
131
142
  */
package/package.json CHANGED
@@ -8,7 +8,7 @@
8
8
  "device",
9
9
  "xcode"
10
10
  ],
11
- "version": "1.3.1",
11
+ "version": "1.4.0",
12
12
  "author": "Appium Contributors",
13
13
  "license": "Apache-2.0",
14
14
  "repository": {