@appium/coresim 1.3.0 → 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/coresim/compare/v1.3.0...v1.4.0) (2026-09-19)
2
+
3
+ ### Features
4
+
5
+ * resolve bare command names in spawnProcess against the runtime's bin dirs ([#16](https://github.com/appium/coresim/issues/16)) ([155654d](https://github.com/appium/coresim/commit/155654d1b2ac1235445cd511c0f7a0d49038bf26))
6
+
1
7
  ## [1.3.0](https://github.com/appium/coresim/compare/v1.2.1...v1.3.0) (2026-09-19)
2
8
 
3
9
  ### Features
@@ -1 +1 @@
1
- {"version":3,"file":"process.d.ts","sourceRoot":"","sources":["../../../src/commands/process.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,qBAAqB,CAAC;AACtD,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,aAAa,CAAC;AAGhD,OAAO,QAAQ,qBAAqB,CAAC;IACnC,UAAU,YAAY;QACpB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;QACvD,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;KACnD;CACF;AAED;;;;;;;GAOG;AACH,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAE1F;AAED;;;;;;GAMG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CA6C/F"}
1
+ {"version":3,"file":"process.d.ts","sourceRoot":"","sources":["../../../src/commands/process.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,qBAAqB,CAAC;AACtD,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,aAAa,CAAC;AAGhD,OAAO,QAAQ,qBAAqB,CAAC;IACnC,UAAU,YAAY;QACpB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;QACvD,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;KACnD;CACF;AAED;;;;;;;GAOG;AACH,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAE1F;AAED;;;;;;GAMG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CA4C/F"}
@@ -20,10 +20,9 @@ export async function getRuntimeRootPath(udid) {
20
20
  */
21
21
  export async function listProcesses(udid) {
22
22
  return runCatchingAsync(async () => {
23
- // spawnProcess() resolves this against the guest runtime root itself (see CLAUDE.md) — the
24
- // guest runtime ships its own launchctl, distinct from the host's /bin/launchctl.
25
- const launchctlPath = '/bin/launchctl';
26
- const proc = await this.spawnProcess(udid, launchctlPath, { arguments: [launchctlPath, 'list'] });
23
+ // Bare name: spawnProcess() resolves it against the guest runtime's own bin dirs, distinct
24
+ // from the host's /bin/launchctl (see CLAUDE.md).
25
+ const proc = await this.spawnProcess(udid, 'launchctl', { arguments: ['launchctl', 'list'] });
27
26
  let stdout = '';
28
27
  let stderr = '';
29
28
  proc.stdout.on('data', (chunk) => {
@@ -1 +1 @@
1
- {"version":3,"file":"process.js","sourceRoot":"","sources":["../../../src/commands/process.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"process.js","sourceRoot":"","sources":["../../../src/commands/process.ts"],"names":[],"mappings":"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"}
@@ -39,11 +39,15 @@ export declare class SpawnedProcess extends EventEmitter<SpawnedProcessEvents> {
39
39
  * exit code/signal — see {@link SpawnedProcess}.
40
40
  *
41
41
  * @param udid — UDID of the target device
42
- * @param path — path to the executable to spawn, relative to the Simulator's own runtime root
43
- * (e.g. `/usr/bin/log`) — resolved and confined there, so this cannot be used to spawn an
44
- * arbitrary host executable. A leading `/` is tolerated (still resolved relative to the runtime
45
- * root, not the host's own `/`). Throws if `path` would resolve outside the runtime (e.g. via
46
- * `..`). Not auto-prepended to `options.arguments`.
42
+ * @param path — path to the executable to spawn. A bare name with no `/` (e.g. `launchctl`) is
43
+ * resolved by searching the Simulator runtime's standard bin dirs (`usr/bin`, `bin`, `usr/sbin`,
44
+ * `sbin`, `usr/local/bin`), mirroring `simctl spawn`'s own bare-name resolution — there's no way
45
+ * to query the guest's actual `$PATH`, so this is a fixed best-effort list, and throws if nothing
46
+ * matches. Anything containing `/` is instead resolved relative to the Simulator's own runtime
47
+ * root (e.g. `/usr/bin/log`) and confined there, so this cannot be used to spawn an arbitrary host
48
+ * executable. A leading `/` is tolerated (still resolved relative to the runtime root, not the
49
+ * host's own `/`). Throws if `path` would resolve outside the runtime (e.g. via `..`). Not
50
+ * auto-prepended to `options.arguments`.
47
51
  * @param options — see {@link SpawnOptions}
48
52
  * @returns a handle to the spawned process
49
53
  */
@@ -1 +1 @@
1
- {"version":3,"file":"spawn.d.ts","sourceRoot":"","sources":["../../../src/commands/spawn.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAC,MAAM,aAAa,CAAC;AACzC,OAAO,EAAC,MAAM,EAAC,MAAM,UAAU,CAAC;AAGhC,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,qBAAqB,CAAC;AACtD,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,aAAa,CAAC;AAG9C,OAAO,QAAQ,qBAAqB,CAAC;IACnC,UAAU,YAAY;QACpB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;KAC3F;CACF;AAYD,UAAU,oBAAoB;IAC5B,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;CAC5D;AAED;;;;;;GAMG;AACH,qBAAa,cAAe,SAAQ,YAAY,CAAC,oBAAoB,CAAC;IAOlE,QAAQ,CAAC,GAAG,EAAE,MAAM;IANtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAQ;IAC/B,UAAU,EAAE,MAAM,CAAC,OAAO,GAAG,IAAI,CAAQ;gBAG9B,GAAG,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM;IAiBlB,kEAAkE;IAClE,IAAI,OAAO,IAAI,OAAO,CAErB;IAED;;;;;OAKG;IACH,IAAI,CAAC,MAAM,GAAE,MAAM,CAAC,OAAO,GAAG,MAAkB,GAAG,OAAO;CAa3D;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,YAAY,CAChC,IAAI,EAAE,YAAY,EAClB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,cAAc,CAAC,CA+BzB"}
1
+ {"version":3,"file":"spawn.d.ts","sourceRoot":"","sources":["../../../src/commands/spawn.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAC,MAAM,aAAa,CAAC;AACzC,OAAO,EAAC,MAAM,EAAC,MAAM,UAAU,CAAC;AAGhC,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,qBAAqB,CAAC;AACtD,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,aAAa,CAAC;AAG9C,OAAO,QAAQ,qBAAqB,CAAC;IACnC,UAAU,YAAY;QACpB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;KAC3F;CACF;AAYD,UAAU,oBAAoB;IAC5B,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;CAC5D;AAED;;;;;;GAMG;AACH,qBAAa,cAAe,SAAQ,YAAY,CAAC,oBAAoB,CAAC;IAOlE,QAAQ,CAAC,GAAG,EAAE,MAAM;IANtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAQ;IAC/B,UAAU,EAAE,MAAM,CAAC,OAAO,GAAG,IAAI,CAAQ;gBAG9B,GAAG,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM;IAiBlB,kEAAkE;IAClE,IAAI,OAAO,IAAI,OAAO,CAErB;IAED;;;;;OAKG;IACH,IAAI,CAAC,MAAM,GAAE,MAAM,CAAC,OAAO,GAAG,MAAkB,GAAG,OAAO;CAa3D;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,YAAY,CAChC,IAAI,EAAE,YAAY,EAClB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,cAAc,CAAC,CA+BzB"}
@@ -68,11 +68,15 @@ export class SpawnedProcess extends EventEmitter {
68
68
  * exit code/signal — see {@link SpawnedProcess}.
69
69
  *
70
70
  * @param udid — UDID of the target device
71
- * @param path — path to the executable to spawn, relative to the Simulator's own runtime root
72
- * (e.g. `/usr/bin/log`) — resolved and confined there, so this cannot be used to spawn an
73
- * arbitrary host executable. A leading `/` is tolerated (still resolved relative to the runtime
74
- * root, not the host's own `/`). Throws if `path` would resolve outside the runtime (e.g. via
75
- * `..`). Not auto-prepended to `options.arguments`.
71
+ * @param path — path to the executable to spawn. A bare name with no `/` (e.g. `launchctl`) is
72
+ * resolved by searching the Simulator runtime's standard bin dirs (`usr/bin`, `bin`, `usr/sbin`,
73
+ * `sbin`, `usr/local/bin`), mirroring `simctl spawn`'s own bare-name resolution — there's no way
74
+ * to query the guest's actual `$PATH`, so this is a fixed best-effort list, and throws if nothing
75
+ * matches. Anything containing `/` is instead resolved relative to the Simulator's own runtime
76
+ * root (e.g. `/usr/bin/log`) and confined there, so this cannot be used to spawn an arbitrary host
77
+ * executable. A leading `/` is tolerated (still resolved relative to the runtime root, not the
78
+ * host's own `/`). Throws if `path` would resolve outside the runtime (e.g. via `..`). Not
79
+ * auto-prepended to `options.arguments`.
76
80
  * @param options — see {@link SpawnOptions}
77
81
  * @returns a handle to the spawned process
78
82
  */
@@ -1 +1 @@
1
- {"version":3,"file":"spawn.js","sourceRoot":"","sources":["../../../src/commands/spawn.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"spawn.js","sourceRoot":"","sources":["../../../src/commands/spawn.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@appium/coresim",
3
- "version": "1.3.0",
3
+ "version": "1.4.0",
4
4
  "description": "Native bindings to CoreSimulator.framework for Apple platform simulator control",
5
5
  "bugs": {
6
6
  "url": "https://github.com/appium/coresim/issues"
@@ -32,10 +32,9 @@ export async function getRuntimeRootPath(this: NativeSimctl, udid: string): Prom
32
32
  */
33
33
  export async function listProcesses(this: NativeSimctl, udid: string): Promise<SimProcessInfo[]> {
34
34
  return runCatchingAsync(async () => {
35
- // spawnProcess() resolves this against the guest runtime root itself (see CLAUDE.md) — the
36
- // guest runtime ships its own launchctl, distinct from the host's /bin/launchctl.
37
- const launchctlPath = '/bin/launchctl';
38
- const proc = await this.spawnProcess(udid, launchctlPath, {arguments: [launchctlPath, 'list']});
35
+ // Bare name: spawnProcess() resolves it against the guest runtime's own bin dirs, distinct
36
+ // from the host's /bin/launchctl (see CLAUDE.md).
37
+ const proc = await this.spawnProcess(udid, 'launchctl', {arguments: ['launchctl', 'list']});
39
38
  let stdout = '';
40
39
  let stderr = '';
41
40
  proc.stdout.on('data', (chunk: Buffer) => {
@@ -90,11 +90,15 @@ export class SpawnedProcess extends EventEmitter<SpawnedProcessEvents> {
90
90
  * exit code/signal — see {@link SpawnedProcess}.
91
91
  *
92
92
  * @param udid — UDID of the target device
93
- * @param path — path to the executable to spawn, relative to the Simulator's own runtime root
94
- * (e.g. `/usr/bin/log`) — resolved and confined there, so this cannot be used to spawn an
95
- * arbitrary host executable. A leading `/` is tolerated (still resolved relative to the runtime
96
- * root, not the host's own `/`). Throws if `path` would resolve outside the runtime (e.g. via
97
- * `..`). Not auto-prepended to `options.arguments`.
93
+ * @param path — path to the executable to spawn. A bare name with no `/` (e.g. `launchctl`) is
94
+ * resolved by searching the Simulator runtime's standard bin dirs (`usr/bin`, `bin`, `usr/sbin`,
95
+ * `sbin`, `usr/local/bin`), mirroring `simctl spawn`'s own bare-name resolution — there's no way
96
+ * to query the guest's actual `$PATH`, so this is a fixed best-effort list, and throws if nothing
97
+ * matches. Anything containing `/` is instead resolved relative to the Simulator's own runtime
98
+ * root (e.g. `/usr/bin/log`) and confined there, so this cannot be used to spawn an arbitrary host
99
+ * executable. A leading `/` is tolerated (still resolved relative to the runtime root, not the
100
+ * host's own `/`). Throws if `path` would resolve outside the runtime (e.g. via `..`). Not
101
+ * auto-prepended to `options.arguments`.
98
102
  * @param options — see {@link SpawnOptions}
99
103
  * @returns a handle to the spawned process
100
104
  */
package/src/coresim.mm CHANGED
@@ -95,11 +95,36 @@ NSError* MakeSpawnPathError(NSString* message) {
95
95
  return [NSError errorWithDomain:@"com.appium.coresim.spawn" code:1 userInfo:@{NSLocalizedDescriptionKey : message}];
96
96
  }
97
97
 
98
+ // Standard bin dirs to search, in order, when `path` is a bare command name (no `/`) — mirrors
99
+ // the guest's default $PATH. There's no way to query the guest's actual $PATH (no shell, no env
100
+ // to read before a process even exists), so this is a fixed best-effort list, not a real PATH
101
+ // search — a binary installed somewhere else won't be found this way.
102
+ NSArray<NSString*>* BareCommandSearchDirs() { return @[ @"usr/bin", @"bin", @"usr/sbin", @"sbin", @"usr/local/bin" ]; }
103
+
104
+ // Resolves a bare command name (e.g. "launchctl") against BareCommandSearchDirs() under
105
+ // `runtimeRoot`, mirroring how `simctl spawn` resolves a bare name against the guest's $PATH —
106
+ // CoreSimulator's own spawn API takes only a literal path, so it does no such resolution itself.
107
+ NSString* ResolveBareCommand(NSString* runtimeRoot, NSString* name, NSError** error) {
108
+ NSFileManager* fm = [NSFileManager defaultManager];
109
+ for (NSString* dir in BareCommandSearchDirs()) {
110
+ NSString* candidate = [runtimeRoot stringByAppendingPathComponent:[dir stringByAppendingPathComponent:name]];
111
+ BOOL isDirectory = NO;
112
+ if ([fm fileExistsAtPath:candidate isDirectory:&isDirectory] && !isDirectory &&
113
+ [fm isExecutableFileAtPath:candidate]) {
114
+ return candidate;
115
+ }
116
+ }
117
+ *error = MakeSpawnPathError(
118
+ [NSString stringWithFormat:@"'%@' not found in the Simulator runtime's standard bin directories", name]);
119
+ return nil;
120
+ }
121
+
98
122
  // `spawnWithPath:options:...` can run anything the host user can execute, so Spawn() confines it
99
123
  // to the Simulator's own runtime image rather than trusting `path` as a literal host path — a
100
- // deliberately breaking restriction (see CLAUDE.md). `path` is resolved as relative to the
101
- // runtime root, then re-verified (via -stringByStandardizingPath, which collapses ".."/".") to
102
- // still fall under it, since `path` may come from arbitrary caller input.
124
+ // deliberately breaking restriction (see CLAUDE.md). A bare name (no `/`) is resolved via
125
+ // ResolveBareCommand above instead; otherwise `path` is resolved as relative to the runtime root,
126
+ // then re-verified (via -stringByStandardizingPath, which collapses ".."/".") to still fall under
127
+ // it, since `path` may come from arbitrary caller input.
103
128
  NSString* ResolveRuntimeBinaryPath(id device, NSString* path, NSError** error) {
104
129
  id runtime = DeviceRuntime(device);
105
130
  if (runtime == nil) {
@@ -107,6 +132,9 @@ NSString* ResolveRuntimeBinaryPath(id device, NSString* path, NSError** error) {
107
132
  return nil;
108
133
  }
109
134
  NSString* runtimeRoot = coresim::RuntimeRootPath(runtime).stringByStandardizingPath;
135
+ if (![path containsString:@"/"]) {
136
+ return ResolveBareCommand(runtimeRoot, path, error);
137
+ }
110
138
  NSString* resolved = [runtimeRoot stringByAppendingPathComponent:path].stringByStandardizingPath;
111
139
  if (resolved != runtimeRoot && ![resolved hasPrefix:[runtimeRoot stringByAppendingString:@"/"]]) {
112
140
  *error = MakeSpawnPathError(