typeferry 0.11.0 → 0.12.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.
@@ -1,12 +1,44 @@
1
1
  export type TestProjectName = 'unit' | 'integration' | 'browser';
2
- export type CliArguments = {
3
- readonly command: 'build';
4
- readonly target?: 'ios';
2
+ /**
3
+ * Native actions carry only the options supported by their command.
4
+ */
5
+ export type NativeCliArguments = {
6
+ readonly command: 'native';
7
+ readonly action: 'add' | 'sync' | 'open';
8
+ readonly target: 'ios';
9
+ } | {
10
+ readonly command: 'native';
11
+ readonly action: 'devices';
12
+ readonly target: 'ios';
13
+ readonly json: boolean;
14
+ } | {
15
+ readonly command: 'native';
16
+ readonly action: 'doctor';
17
+ readonly target: 'ios';
18
+ readonly json: boolean;
19
+ readonly device?: string;
5
20
  } | {
6
21
  readonly command: 'native';
7
- readonly action: 'sync' | 'add' | 'open';
22
+ readonly action: 'run';
8
23
  readonly target: 'ios';
24
+ readonly device?: string;
25
+ readonly headless: boolean;
9
26
  } | {
27
+ readonly command: 'native';
28
+ readonly action: 'logs';
29
+ readonly target: 'ios';
30
+ readonly device?: string;
31
+ } | {
32
+ readonly command: 'native';
33
+ readonly action: 'screenshot';
34
+ readonly target: 'ios';
35
+ readonly device?: string;
36
+ readonly output?: string;
37
+ };
38
+ export type CliArguments = {
39
+ readonly command: 'build';
40
+ readonly target?: 'ios';
41
+ } | NativeCliArguments | {
10
42
  readonly command: 'develop';
11
43
  readonly serverArguments: readonly string[];
12
44
  } | {
@@ -15,5 +47,5 @@ export type CliArguments = {
15
47
  readonly testArguments: readonly string[];
16
48
  readonly watch: boolean;
17
49
  };
18
- export declare const CLI_USAGE = "Usage: typeferry <develop [-- server-args...]|build [--target ios]|native <add|sync|open> ios|test [unit|integration|browser] [--watch] [-- vitest-args...]>";
50
+ export declare const CLI_USAGE = "Usage: typeferry <develop [-- server-args...]|build [--target ios]|native <add|sync|open|devices|doctor|run|logs|screenshot> ios [--device name-or-UDID] [--json] [--output path] [--headless]|test [unit|integration|browser] [--watch] [-- vitest-args...]>";
19
51
  export declare function parseCliArguments(arguments_: readonly string[]): CliArguments;
@@ -3,15 +3,11 @@ const TEST_PROJECTS = new Set([
3
3
  'integration',
4
4
  'browser',
5
5
  ]);
6
- export const CLI_USAGE = 'Usage: typeferry <develop [-- server-args...]|build [--target ios]|native <add|sync|open> ios|test [unit|integration|browser] [--watch] [-- vitest-args...]>';
6
+ export const CLI_USAGE = 'Usage: typeferry <develop [-- server-args...]|build [--target ios]|native <add|sync|open|devices|doctor|run|logs|screenshot> ios [--device name-or-UDID] [--json] [--output path] [--headless]|test [unit|integration|browser] [--watch] [-- vitest-args...]>';
7
7
  export function parseCliArguments(arguments_) {
8
8
  const [command, ...rest] = arguments_;
9
- if (command === 'native') {
10
- const [action, target] = rest;
11
- if (rest.length !== 2 || target !== 'ios' || !['add', 'sync', 'open'].includes(action ?? ''))
12
- throw new Error(CLI_USAGE);
13
- return { command, action: action, target };
14
- }
9
+ if (command === 'native')
10
+ return parseNativeArguments(rest);
15
11
  if (command === 'build') {
16
12
  if (rest.length === 2 && rest[0] === '--target' && rest[1] === 'ios')
17
13
  return { command, target: 'ios' };
@@ -54,4 +50,58 @@ function parseTestArguments(arguments_) {
54
50
  ? { command: 'test', testArguments, watch }
55
51
  : { command: 'test', project, testArguments, watch };
56
52
  }
53
+ function parseNativeArguments(arguments_) {
54
+ const [action, target, ...options] = arguments_;
55
+ const command = 'native';
56
+ if (target !== 'ios')
57
+ throw new Error(CLI_USAGE);
58
+ if (action === 'add' || action === 'sync' || action === 'open') {
59
+ if (options.length > 0)
60
+ throw new Error(CLI_USAGE);
61
+ return { command, action, target };
62
+ }
63
+ if (action !== 'devices' && action !== 'doctor' && action !== 'run' && action !== 'logs' && action !== 'screenshot')
64
+ throw new Error(CLI_USAGE);
65
+ let json = false;
66
+ let headless = false;
67
+ let device;
68
+ let output;
69
+ const seen = new Set();
70
+ for (let index = 0; index < options.length; index += 1) {
71
+ const option = options[index];
72
+ if (option === undefined || seen.has(option))
73
+ throw new Error(`Duplicate native option. ${CLI_USAGE}`);
74
+ seen.add(option);
75
+ if (option === '--headless' && action === 'run') {
76
+ headless = true;
77
+ continue;
78
+ }
79
+ if (option === '--json' && (action === 'devices' || action === 'doctor')) {
80
+ json = true;
81
+ continue;
82
+ }
83
+ if ((option === '--device' && action !== 'devices') || (option === '--output' && action === 'screenshot')) {
84
+ const value = options[index + 1]?.trim();
85
+ if (!value || value.startsWith('--') || value.includes('\0'))
86
+ throw new Error(`Expected a value for ${option}. ${CLI_USAGE}`);
87
+ if (option === '--device')
88
+ device = value;
89
+ else
90
+ output = value;
91
+ index += 1;
92
+ continue;
93
+ }
94
+ throw new Error(`Unknown native option: ${option}. ${CLI_USAGE}`);
95
+ }
96
+ const selection = device === undefined ? {} : { device };
97
+ if (action === 'run')
98
+ return { command, action, target, headless, ...selection };
99
+ if (action === 'devices')
100
+ return { command, action, target, json };
101
+ if (action === 'doctor')
102
+ return { command, action, target, json, ...selection };
103
+ if (action === 'screenshot')
104
+ return { command, action, target, ...selection, ...(output === undefined ? {} : { output }) };
105
+ return { command, action, target, ...selection };
106
+ }
57
107
  //# sourceMappingURL=cli-arguments.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cli-arguments.js","sourceRoot":"","sources":["../../src/application/cli-arguments.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli-arguments.js","sourceRoot":"","sources":["../../src/application/cli-arguments.ts"],"names":[],"mappings":"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"}
@@ -15,8 +15,27 @@ export interface ResolvedDevelopmentProxyRoute {
15
15
  readonly rewriteLocalhostCookies: boolean;
16
16
  }
17
17
  export type ApplicationTarget = 'web' | 'ios';
18
+ /**
19
+ * Optional Xcode build selection. Paths resolve from the application root;
20
+ * select either a project or a workspace, never both.
21
+ */
22
+ export interface IosXcodeConfig {
23
+ readonly project?: string;
24
+ readonly workspace?: string;
25
+ readonly scheme?: string;
26
+ readonly configuration?: string;
27
+ readonly derivedDataPath?: string;
28
+ }
29
+ /**
30
+ * Default simulator selection, overridden by the CLI's explicit device.
31
+ */
32
+ export interface IosSimulatorConfig {
33
+ readonly device?: string;
34
+ }
18
35
  export interface IosApplicationTarget {
19
36
  readonly runtime: 'capacitor';
37
+ readonly xcode?: IosXcodeConfig;
38
+ readonly simulator?: IosSimulatorConfig;
20
39
  readonly backend: {
21
40
  readonly origin: string;
22
41
  };
@@ -44,6 +44,15 @@ const httpsOriginSchema = z.string().refine(value => {
44
44
  }
45
45
  }, 'Expected an HTTPS origin without credentials, path, query or fragment');
46
46
  const permissionSchema = z.object({ purpose: z.string().trim().min(1) }).strict();
47
+ const nativeOptionStringSchema = z.string().trim().min(1).refine(value => !value.includes('\0'), 'Native configuration values must not contain null bytes');
48
+ const iosXcodeSchema = z.object({
49
+ project: nativeOptionStringSchema.refine(value => value.endsWith('.xcodeproj'), 'Expected an .xcodeproj path').optional(),
50
+ workspace: nativeOptionStringSchema.refine(value => value.endsWith('.xcworkspace'), 'Expected an .xcworkspace path').optional(),
51
+ scheme: nativeOptionStringSchema.optional(),
52
+ configuration: nativeOptionStringSchema.optional(),
53
+ derivedDataPath: nativeOptionStringSchema.optional(),
54
+ }).strict().refine(value => value.project === undefined || value.workspace === undefined, 'Select either an Xcode project or workspace, not both');
55
+ const iosSimulatorSchema = z.object({ device: nativeOptionStringSchema.optional() }).strict();
47
56
  const configSchema = z
48
57
  .object({
49
58
  application: z.object({
@@ -52,6 +61,8 @@ const configSchema = z
52
61
  }).strict().optional(),
53
62
  client: z.object({ targets: z.object({ ios: z.object({
54
63
  runtime: z.literal('capacitor'),
64
+ xcode: iosXcodeSchema.optional(),
65
+ simulator: iosSimulatorSchema.optional(),
55
66
  backend: z.object({ origin: httpsOriginSchema }).strict(),
56
67
  permissions: z.object({ camera: permissionSchema.optional(), microphone: permissionSchema.optional() }).strict().optional(),
57
68
  }).strict().optional() }).strict().optional() }).strict().optional(),
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/application/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/application/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import type { Readable, Writable } from 'node:stream';
2
+ export interface NativeCommandOptions {
3
+ readonly cwd?: string;
4
+ readonly timeoutMs?: number;
5
+ readonly stream?: boolean;
6
+ readonly signal?: AbortSignal;
7
+ }
8
+ export interface NativeCommandOutput {
9
+ readonly stdout: string;
10
+ readonly stderr: string;
11
+ }
12
+ export type NativeCommandRunner = (executable: string, arguments_: readonly string[], options?: NativeCommandOptions) => Promise<NativeCommandOutput>;
13
+ /**
14
+ * Allows the CLI to preserve conventional cancellation exit codes without
15
+ * reporting an interrupted log stream as a configuration failure.
16
+ */
17
+ export declare class NativeCommandInterruptedError extends Error {
18
+ readonly exitCode: number;
19
+ constructor(signal: NodeJS.Signals);
20
+ }
21
+ /**
22
+ * Couples one child output channel to its destination without accumulating an
23
+ * unbounded writable queue. Disposal drains remaining child output so a paused
24
+ * pipe cannot prevent cancellation from reaching the child's close event.
25
+ */
26
+ export declare function createNativeOutputWriter(source: Readable, destination: Writable): {
27
+ write(chunk: string): void;
28
+ dispose(): void;
29
+ };
30
+ /**
31
+ * Executes argument arrays directly. Long-running commands stream output while
32
+ * retaining only a bounded diagnostic tail; structured queries have a hard cap.
33
+ * Interruptions and timeouts terminate the child process group on Unix systems.
34
+ */
35
+ export declare const executeNativeCommand: NativeCommandRunner;
@@ -0,0 +1,148 @@
1
+ import { spawn } from 'node:child_process';
2
+ const CAPTURE_LIMIT = 8 * 1024 * 1024;
3
+ const DIAGNOSTIC_LIMIT = 16 * 1024;
4
+ const QUERY_TIMEOUT_MS = 120_000;
5
+ /**
6
+ * Allows the CLI to preserve conventional cancellation exit codes without
7
+ * reporting an interrupted log stream as a configuration failure.
8
+ */
9
+ export class NativeCommandInterruptedError extends Error {
10
+ exitCode;
11
+ constructor(signal) {
12
+ super(`Native command interrupted by ${signal}`);
13
+ this.exitCode = signal === 'SIGINT' ? 130 : 143;
14
+ }
15
+ }
16
+ /**
17
+ * Couples one child output channel to its destination without accumulating an
18
+ * unbounded writable queue. Disposal drains remaining child output so a paused
19
+ * pipe cannot prevent cancellation from reaching the child's close event.
20
+ */
21
+ export function createNativeOutputWriter(source, destination) {
22
+ let disposed = false;
23
+ const resume = () => { source.resume(); };
24
+ return {
25
+ write(chunk) {
26
+ if (disposed)
27
+ return;
28
+ if (!destination.write(chunk)) {
29
+ source.pause();
30
+ destination.once('drain', resume);
31
+ }
32
+ },
33
+ dispose() {
34
+ disposed = true;
35
+ destination.removeListener('drain', resume);
36
+ source.resume();
37
+ },
38
+ };
39
+ }
40
+ /**
41
+ * Executes argument arrays directly. Long-running commands stream output while
42
+ * retaining only a bounded diagnostic tail; structured queries have a hard cap.
43
+ * Interruptions and timeouts terminate the child process group on Unix systems.
44
+ */
45
+ export const executeNativeCommand = (executable, arguments_, options = {}) => {
46
+ if (options.signal?.aborted)
47
+ return Promise.reject(new NativeCommandInterruptedError('SIGINT'));
48
+ return new Promise((resolve, reject) => {
49
+ const child = spawn(executable, [...arguments_], {
50
+ cwd: options.cwd,
51
+ shell: false,
52
+ detached: process.platform !== 'win32',
53
+ stdio: ['ignore', 'pipe', 'pipe'],
54
+ });
55
+ const writers = {
56
+ stdout: createNativeOutputWriter(child.stdout, process.stdout),
57
+ stderr: createNativeOutputWriter(child.stderr, process.stderr),
58
+ };
59
+ const disposeOutput = () => {
60
+ writers.stdout.dispose();
61
+ writers.stderr.dispose();
62
+ };
63
+ let stdout = '';
64
+ let stderr = '';
65
+ let bytes = 0;
66
+ let failure;
67
+ let killTimer;
68
+ let timeout;
69
+ const kill = (signal) => {
70
+ if (!child.pid)
71
+ return;
72
+ try {
73
+ if (process.platform === 'win32')
74
+ child.kill(signal);
75
+ else
76
+ process.kill(-child.pid, signal);
77
+ }
78
+ catch {
79
+ // The process may have exited between cancellation and signal delivery.
80
+ }
81
+ };
82
+ const stop = (error, signal = 'SIGTERM') => {
83
+ if (failure)
84
+ return;
85
+ failure = error;
86
+ disposeOutput();
87
+ kill(signal);
88
+ killTimer = setTimeout(() => kill('SIGKILL'), 2_000);
89
+ killTimer.unref();
90
+ };
91
+ const onInterrupt = () => stop(new NativeCommandInterruptedError('SIGINT'), 'SIGINT');
92
+ const onTerminate = () => stop(new NativeCommandInterruptedError('SIGTERM'));
93
+ const cleanup = () => {
94
+ disposeOutput();
95
+ clearTimeout(timeout);
96
+ clearTimeout(killTimer);
97
+ process.removeListener('SIGINT', onInterrupt);
98
+ process.removeListener('SIGTERM', onTerminate);
99
+ options.signal?.removeEventListener('abort', onInterrupt);
100
+ };
101
+ const consume = (channel, chunk) => {
102
+ if (failure)
103
+ return;
104
+ if (options.stream)
105
+ writers[channel].write(chunk);
106
+ else {
107
+ bytes += Buffer.byteLength(chunk);
108
+ if (bytes > CAPTURE_LIMIT) {
109
+ stop(new Error(`${executable} output exceeded ${CAPTURE_LIMIT} bytes`));
110
+ return;
111
+ }
112
+ }
113
+ const limit = options.stream ? DIAGNOSTIC_LIMIT : CAPTURE_LIMIT;
114
+ if (channel === 'stdout')
115
+ stdout = (stdout + chunk).slice(-limit);
116
+ else
117
+ stderr = (stderr + chunk).slice(-limit);
118
+ };
119
+ child.stdout.setEncoding('utf8');
120
+ child.stderr.setEncoding('utf8');
121
+ child.stdout.on('data', (chunk) => consume('stdout', chunk));
122
+ child.stderr.on('data', (chunk) => consume('stderr', chunk));
123
+ process.on('SIGINT', onInterrupt);
124
+ process.on('SIGTERM', onTerminate);
125
+ options.signal?.addEventListener('abort', onInterrupt, { once: true });
126
+ const timeoutMs = options.timeoutMs ?? (options.stream ? undefined : QUERY_TIMEOUT_MS);
127
+ if (timeoutMs !== undefined) {
128
+ timeout = setTimeout(() => stop(new Error(`${executable} timed out after ${timeoutMs}ms`)), timeoutMs);
129
+ timeout.unref();
130
+ }
131
+ child.once('error', error => {
132
+ cleanup();
133
+ reject(new Error(`Unable to execute ${executable}: ${error.message}`, { cause: error }));
134
+ });
135
+ child.once('close', (code, signal) => {
136
+ cleanup();
137
+ if (failure)
138
+ reject(failure);
139
+ else if (signal)
140
+ reject(new NativeCommandInterruptedError(signal));
141
+ else if (code !== 0)
142
+ reject(new Error(`${executable} failed with exit code ${code}:\n${(stderr || stdout).slice(-DIAGNOSTIC_LIMIT).trim()}`));
143
+ else
144
+ resolve({ stdout, stderr });
145
+ });
146
+ });
147
+ };
148
+ //# sourceMappingURL=native-command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native-command.js","sourceRoot":"","sources":["../../src/application/native-command.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import type { NativeCommandRunner } from './native-command.js';
2
+ /**
3
+ * Simulator discovery data independent of application identity or signing.
4
+ */
5
+ export interface IosSimulator {
6
+ readonly udid: string;
7
+ readonly name: string;
8
+ readonly state: string;
9
+ readonly runtime: string;
10
+ readonly isAvailable: boolean;
11
+ }
12
+ /**
13
+ * Validates consumed simctl fields and discards Apple metadata such as local
14
+ * filesystem paths. Non-iOS runtimes are excluded, unavailable iOS devices are
15
+ * retained for diagnostics, and output order does not depend on JSON key order.
16
+ */
17
+ export declare function parseIosSimulators(value: unknown): readonly IosSimulator[];
18
+ /**
19
+ * Executes read-only device discovery through the supplied command boundary.
20
+ */
21
+ export declare function readIosSimulators(run: NativeCommandRunner): Promise<readonly IosSimulator[]>;
22
+ /**
23
+ * Honors explicit identity before defaults. Duplicate names or multiple booted
24
+ * devices require a human choice; callers always receive a concrete UDID and
25
+ * must never pass simctl's ambiguous "booted" alias.
26
+ */
27
+ export declare function selectIosSimulator(devices: readonly IosSimulator[], selector?: string): IosSimulator;
28
+ /**
29
+ * Read-only diagnostics cannot implicitly boot or otherwise change a device.
30
+ */
31
+ export declare function requireBootedSimulator(device: IosSimulator): void;
@@ -0,0 +1,94 @@
1
+ import { z } from 'zod';
2
+ const IOS_RUNTIME = /^com\.apple\.CoreSimulator\.SimRuntime\.iOS-\d+(?:-\d+)*$/;
3
+ const BOOTED_STATE = 'Booted';
4
+ const DISCOVERY_COMMAND = 'typeferry native devices ios';
5
+ const simulatorSchema = z.object({
6
+ udid: z.uuid(),
7
+ name: z.string().min(1),
8
+ state: z.string().min(1),
9
+ isAvailable: z.boolean(),
10
+ });
11
+ const simulatorListSchema = z.object({
12
+ devices: z.record(z.string(), z.array(simulatorSchema)),
13
+ });
14
+ function compareText(left, right) {
15
+ return left < right ? -1 : left > right ? 1 : 0;
16
+ }
17
+ function compareSimulators(left, right) {
18
+ return compareText(left.runtime, right.runtime)
19
+ || compareText(left.name, right.name)
20
+ || compareText(left.udid, right.udid);
21
+ }
22
+ /**
23
+ * Validates consumed simctl fields and discards Apple metadata such as local
24
+ * filesystem paths. Non-iOS runtimes are excluded, unavailable iOS devices are
25
+ * retained for diagnostics, and output order does not depend on JSON key order.
26
+ */
27
+ export function parseIosSimulators(value) {
28
+ const parsed = simulatorListSchema.safeParse(value);
29
+ if (!parsed.success) {
30
+ throw new Error('Invalid iOS simulator device data from xcrun simctl. Check that a supported Xcode installation is selected.');
31
+ }
32
+ return Object.entries(parsed.data.devices)
33
+ .filter(([runtime]) => IOS_RUNTIME.test(runtime))
34
+ .flatMap(([runtime, devices]) => devices.map(device => ({ ...device, runtime })))
35
+ .sort(compareSimulators);
36
+ }
37
+ /**
38
+ * Executes read-only device discovery through the supplied command boundary.
39
+ */
40
+ export async function readIosSimulators(run) {
41
+ const { stdout } = await run('xcrun', ['simctl', 'list', 'devices', '--json']);
42
+ let value;
43
+ try {
44
+ value = JSON.parse(stdout);
45
+ }
46
+ catch {
47
+ throw new Error('Invalid JSON from xcrun simctl device discovery. Check that a supported Xcode installation is selected.');
48
+ }
49
+ return parseIosSimulators(value);
50
+ }
51
+ function describeCandidates(devices) {
52
+ return [...devices].sort(compareSimulators).map(device => ` ${device.udid} ${JSON.stringify(device.name)} ${device.runtime} ${JSON.stringify(device.state)}`).join('\n');
53
+ }
54
+ function selectUnique(devices) {
55
+ if (devices.length === 1 && devices[0])
56
+ return devices[0];
57
+ throw new Error(`Multiple iOS simulators match. Choose an exact UDID with --device:\n${describeCandidates(devices)}`);
58
+ }
59
+ function selectExplicit(devices, selector) {
60
+ const byUdid = devices.filter(device => device.udid.toLowerCase() === selector.toLowerCase());
61
+ const matches = byUdid.length ? byUdid : devices.filter(device => device.name === selector);
62
+ const availableMatches = matches.filter(device => device.isAvailable);
63
+ if (availableMatches.length)
64
+ return selectUnique(availableMatches);
65
+ if (matches.length) {
66
+ throw new Error(`The selected iOS simulator is unavailable. Install its runtime or choose another device with ${DISCOVERY_COMMAND}:\n${describeCandidates(matches)}`);
67
+ }
68
+ const available = devices.filter(device => device.isAvailable);
69
+ throw new Error(`No available iOS simulator matches ${JSON.stringify(selector)}. Run ${DISCOVERY_COMMAND} and select an exact name or UDID with --device.${available.length ? `\n${describeCandidates(available)}` : ''}`);
70
+ }
71
+ /**
72
+ * Honors explicit identity before defaults. Duplicate names or multiple booted
73
+ * devices require a human choice; callers always receive a concrete UDID and
74
+ * must never pass simctl's ambiguous "booted" alias.
75
+ */
76
+ export function selectIosSimulator(devices, selector) {
77
+ if (selector !== undefined)
78
+ return selectExplicit(devices, selector);
79
+ const available = devices.filter(device => device.isAvailable);
80
+ if (!available.length) {
81
+ throw new Error(`No available iOS simulators. Run ${DISCOVERY_COMMAND} and install an iOS simulator runtime in Xcode if needed.`);
82
+ }
83
+ const booted = available.filter(device => device.state === BOOTED_STATE);
84
+ return selectUnique(booted.length ? booted : available);
85
+ }
86
+ /**
87
+ * Read-only diagnostics cannot implicitly boot or otherwise change a device.
88
+ */
89
+ export function requireBootedSimulator(device) {
90
+ if (device.isAvailable && device.state === BOOTED_STATE)
91
+ return;
92
+ throw new Error(`iOS simulator ${device.udid} (${JSON.stringify(device.name)}) must be available and booted. Boot this device before requesting logs or a screenshot.`);
93
+ }
94
+ //# sourceMappingURL=native-devices.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native-devices.js","sourceRoot":"","sources":["../../src/application/native-devices.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAevB,MAAM,WAAW,GAAG,2DAA2D,CAAA;AAC/E,MAAM,YAAY,GAAG,QAAQ,CAAA;AAC7B,MAAM,iBAAiB,GAAG,8BAA8B,CAAA;AACxD,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC;IAC/B,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;IACd,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACvB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACxB,WAAW,EAAE,CAAC,CAAC,OAAO,EAAE;CACzB,CAAC,CAAA;AACF,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IACnC,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;CACxD,CAAC,CAAA;AAEF,SAAS,WAAW,CAAC,IAAY,EAAE,KAAa;IAC9C,OAAO,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AACjD,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAkB,EAAE,KAAmB;IAChE,OAAO,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC;WAC1C,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC;WAClC,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAA;AACzC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAc;IAC/C,MAAM,MAAM,GAAG,mBAAmB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;IACnD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,6GAA6G,CAAC,CAAA;IAChI,CAAC;IAED,OAAO,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC;SACvC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;SAChD,OAAO,CAAC,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;SAChF,IAAI,CAAC,iBAAiB,CAAC,CAAA;AAC5B,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,GAAwB;IAC9D,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAA;IAC9E,IAAI,KAAc,CAAA;IAClB,IAAI,CAAC;QACH,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,yGAAyG,CAAC,CAAA;IAC5H,CAAC;IACD,OAAO,kBAAkB,CAAC,KAAK,CAAC,CAAA;AAClC,CAAC;AAED,SAAS,kBAAkB,CAAC,OAAgC;IAC1D,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CACvD,KAAK,MAAM,CAAC,IAAI,KAAK,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,OAAO,KAAK,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CACvG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACd,CAAC;AAED,SAAS,YAAY,CAAC,OAAgC;IACpD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC;QAAE,OAAO,OAAO,CAAC,CAAC,CAAC,CAAA;IACzD,MAAM,IAAI,KAAK,CAAC,uEAAuE,kBAAkB,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;AACvH,CAAC;AAED,SAAS,cAAc,CAAC,OAAgC,EAAE,QAAgB;IACxE,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAA;IAC7F,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAA;IAC3F,MAAM,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,CAAA;IACrE,IAAI,gBAAgB,CAAC,MAAM;QAAE,OAAO,YAAY,CAAC,gBAAgB,CAAC,CAAA;IAClE,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,gGAAgG,iBAAiB,MAAM,kBAAkB,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;IACvK,CAAC;IAED,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,CAAA;IAC9D,MAAM,IAAI,KAAK,CAAC,sCAAsC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,SAAS,iBAAiB,mDAAmD,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,kBAAkB,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;AAC5N,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAAgC,EAAE,QAAiB;IACpF,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,cAAc,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;IACpE,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,CAAA;IAC9D,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,oCAAoC,iBAAiB,2DAA2D,CAAC,CAAA;IACnI,CAAC;IACD,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,KAAK,YAAY,CAAC,CAAA;IACxE,OAAO,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;AACzD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,MAAoB;IACzD,IAAI,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,KAAK,KAAK,YAAY;QAAE,OAAM;IAC/D,MAAM,IAAI,KAAK,CAAC,iBAAiB,MAAM,CAAC,IAAI,KAAK,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,0FAA0F,CAAC,CAAA;AACzK,CAAC"}
@@ -0,0 +1,17 @@
1
+ import type { ResolvedApplicationConfig } from './config.js';
2
+ import { type NativeCommandRunner } from './native-command.js';
3
+ export interface NativeDoctorCheck {
4
+ readonly name: string;
5
+ readonly ok: boolean;
6
+ readonly detail: string;
7
+ }
8
+ export interface NativeDoctorReport {
9
+ readonly ok: boolean;
10
+ readonly checks: readonly NativeDoctorCheck[];
11
+ }
12
+ /**
13
+ * Inspects simulator prerequisites without booting devices, compiling products,
14
+ * installing applications or changing signing settings. A successful report is
15
+ * not evidence of distribution signing or developer-account readiness.
16
+ */
17
+ export declare function inspectSimulatorEnvironment(config: ResolvedApplicationConfig, selector?: string, run?: NativeCommandRunner, platform?: NodeJS.Platform): Promise<NativeDoctorReport>;
@@ -0,0 +1,79 @@
1
+ import { access } from 'node:fs/promises';
2
+ import { z } from 'zod';
3
+ import { executeNativeCommand, NativeCommandInterruptedError } from './native-command.js';
4
+ import { readIosSimulators, selectIosSimulator } from './native-devices.js';
5
+ import { resolveSimulatorSettings } from './native-simulator-settings.js';
6
+ const schemeListSchema = z.object({ schemes: z.array(z.string()) });
7
+ const xcodeListSchema = z.object({
8
+ project: schemeListSchema.optional(),
9
+ workspace: schemeListSchema.optional(),
10
+ });
11
+ /**
12
+ * Inspects simulator prerequisites without booting devices, compiling products,
13
+ * installing applications or changing signing settings. A successful report is
14
+ * not evidence of distribution signing or developer-account readiness.
15
+ */
16
+ export async function inspectSimulatorEnvironment(config, selector, run = executeNativeCommand, platform = process.platform) {
17
+ const checks = [];
18
+ const check = async (name, advice, inspect) => {
19
+ try {
20
+ checks.push({ name, ok: true, detail: await inspect() });
21
+ }
22
+ catch (error) {
23
+ if (error instanceof NativeCommandInterruptedError)
24
+ throw error;
25
+ checks.push({ name, ok: false, detail: `${advice}: ${error instanceof Error ? error.message : String(error)}` });
26
+ }
27
+ };
28
+ if (platform !== 'darwin')
29
+ return { ok: false, checks: [{ name: 'platform', ok: false, detail: 'iOS simulator commands require macOS with a full Xcode installation.' }] };
30
+ checks.push({ name: 'platform', ok: true, detail: 'macOS supports the iOS simulator toolchain.' });
31
+ await check('xcode', 'Install and select full Xcode, then complete its first-launch setup', async () => {
32
+ const { stdout } = await run('xcodebuild', ['-version']);
33
+ if (!/^Xcode\s+\S+/mu.test(stdout))
34
+ throw new Error('The selected developer tools did not identify a full Xcode installation');
35
+ return stdout.trim();
36
+ });
37
+ await check('simctl', 'Select an Xcode installation containing Simulator tools', async () => {
38
+ const { stdout } = await run('xcrun', ['--find', 'simctl']);
39
+ if (!stdout.trim())
40
+ throw new Error('simctl was not found');
41
+ return stdout.trim();
42
+ });
43
+ await check('sdk', 'Install the iOS simulator SDK in the selected Xcode installation', async () => {
44
+ const { stdout } = await run('xcrun', ['--sdk', 'iphonesimulator', '--show-sdk-path']);
45
+ if (!stdout.trim())
46
+ throw new Error('The iOS simulator SDK was not found');
47
+ return stdout.trim();
48
+ });
49
+ let settings;
50
+ await check('configuration', 'Configure application identity and client.targets.ios', async () => {
51
+ settings = resolveSimulatorSettings(config);
52
+ return `Simulator configuration for ${settings.bundleId}. Ad-hoc simulator signing preserves project entitlements; distribution signing is not checked.`;
53
+ });
54
+ await check('device', 'Install an available iOS runtime and select an unambiguous device with --device', async () => {
55
+ const device = selectIosSimulator(await readIosSimulators(run), selector ?? settings?.device);
56
+ return `${device.name} (${device.udid}), ${device.runtime}, ${device.state}`;
57
+ });
58
+ if (settings) {
59
+ const resolved = settings;
60
+ await check('container', 'Generate or configure the Xcode project or workspace', async () => {
61
+ await access(resolved.container.path);
62
+ return resolved.container.path;
63
+ });
64
+ await check('scheme', 'Select a shared application scheme from the configured Xcode project or workspace', async () => {
65
+ const { stdout } = await run('xcodebuild', [
66
+ `-${resolved.container.kind}`, resolved.container.path,
67
+ '-list', '-json', '-disableAutomaticPackageResolution', '-skipPackageUpdates',
68
+ ], { cwd: resolved.root });
69
+ const value = JSON.parse(stdout);
70
+ const list = xcodeListSchema.parse(value);
71
+ const schemes = list[resolved.container.kind]?.schemes ?? [];
72
+ if (!schemes.includes(resolved.scheme))
73
+ throw new Error(`Scheme ${JSON.stringify(resolved.scheme)} is unavailable. Available schemes: ${schemes.join(', ') || '(none)'}`);
74
+ return resolved.scheme;
75
+ });
76
+ }
77
+ return { ok: checks.every(item => item.ok), checks };
78
+ }
79
+ //# sourceMappingURL=native-doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native-doctor.js","sourceRoot":"","sources":["../../src/application/native-doctor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AACzC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAGvB,OAAO,EAAE,oBAAoB,EAAE,6BAA6B,EAA4B,MAAM,kBAAkB,CAAA;AAChH,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AACxE,OAAO,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAA;AAatE,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAA;AACnE,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC;IAC/B,OAAO,EAAE,gBAAgB,CAAC,QAAQ,EAAE;IACpC,SAAS,EAAE,gBAAgB,CAAC,QAAQ,EAAE;CACvC,CAAC,CAAA;AAEF;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAC/C,MAAiC,EACjC,QAAiB,EACjB,MAA2B,oBAAoB,EAC/C,WAA4B,OAAO,CAAC,QAAQ;IAE5C,MAAM,MAAM,GAAwB,EAAE,CAAA;IACtC,MAAM,KAAK,GAAG,KAAK,EAAE,IAAY,EAAE,MAAc,EAAE,OAA8B,EAAiB,EAAE;QAClG,IAAI,CAAC;YACH,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,OAAO,EAAE,EAAE,CAAC,CAAA;QAC1D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,6BAA6B;gBAAE,MAAM,KAAK,CAAA;YAC/D,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,KAAK,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAA;QAClH,CAAC;IACH,CAAC,CAAA;IAED,IAAI,QAAQ,KAAK,QAAQ;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,sEAAsE,EAAE,CAAC,EAAE,CAAA;IAC1K,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,6CAA6C,EAAE,CAAC,CAAA;IAElG,MAAM,KAAK,CAAC,OAAO,EAAE,qEAAqE,EAAE,KAAK,IAAI,EAAE;QACrG,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,CAAC,YAAY,EAAE,CAAC,UAAU,CAAC,CAAC,CAAA;QACxD,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,yEAAyE,CAAC,CAAA;QAC9H,OAAO,MAAM,CAAC,IAAI,EAAE,CAAA;IACtB,CAAC,CAAC,CAAA;IACF,MAAM,KAAK,CAAC,QAAQ,EAAE,yDAAyD,EAAE,KAAK,IAAI,EAAE;QAC1F,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAA;QAC3D,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAA;QAC3D,OAAO,MAAM,CAAC,IAAI,EAAE,CAAA;IACtB,CAAC,CAAC,CAAA;IACF,MAAM,KAAK,CAAC,KAAK,EAAE,kEAAkE,EAAE,KAAK,IAAI,EAAE;QAChG,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,CAAC,CAAC,CAAA;QACtF,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAA;QAC1E,OAAO,MAAM,CAAC,IAAI,EAAE,CAAA;IACtB,CAAC,CAAC,CAAA;IAEF,IAAI,QAAiE,CAAA;IACrE,MAAM,KAAK,CAAC,eAAe,EAAE,uDAAuD,EAAE,KAAK,IAAI,EAAE;QAC/F,QAAQ,GAAG,wBAAwB,CAAC,MAAM,CAAC,CAAA;QAC3C,OAAO,+BAA+B,QAAQ,CAAC,QAAQ,iGAAiG,CAAA;IAC1J,CAAC,CAAC,CAAA;IAEF,MAAM,KAAK,CAAC,QAAQ,EAAE,iFAAiF,EAAE,KAAK,IAAI,EAAE;QAClH,MAAM,MAAM,GAAG,kBAAkB,CAAC,MAAM,iBAAiB,CAAC,GAAG,CAAC,EAAE,QAAQ,IAAI,QAAQ,EAAE,MAAM,CAAC,CAAA;QAC7F,OAAO,GAAG,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,MAAM,MAAM,CAAC,OAAO,KAAK,MAAM,CAAC,KAAK,EAAE,CAAA;IAC9E,CAAC,CAAC,CAAA;IACF,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,QAAQ,GAAG,QAAQ,CAAA;QACzB,MAAM,KAAK,CAAC,WAAW,EAAE,sDAAsD,EAAE,KAAK,IAAI,EAAE;YAC1F,MAAM,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;YACrC,OAAO,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAA;QAChC,CAAC,CAAC,CAAA;QACF,MAAM,KAAK,CAAC,QAAQ,EAAE,mFAAmF,EAAE,KAAK,IAAI,EAAE;YACpH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,CAAC,YAAY,EAAE;gBACzC,IAAI,QAAQ,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,QAAQ,CAAC,SAAS,CAAC,IAAI;gBACtD,OAAO,EAAE,OAAO,EAAE,oCAAoC,EAAE,qBAAqB;aAC9E,EAAE,EAAE,GAAG,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAA;YAC1B,MAAM,KAAK,GAAY,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;YACzC,MAAM,IAAI,GAAG,eAAe,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;YACzC,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,OAAO,IAAI,EAAE,CAAA;YAC5D,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,UAAU,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,uCAAuC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,QAAQ,EAAE,CAAC,CAAA;YACzK,OAAO,QAAQ,CAAC,MAAM,CAAA;QACxB,CAAC,CAAC,CAAA;IACJ,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,CAAA;AACtD,CAAC"}
@@ -0,0 +1,24 @@
1
+ import type { ResolvedApplicationConfig } from './config.js';
2
+ export interface SimulatorSettings {
3
+ readonly root: string;
4
+ readonly bundleId: string;
5
+ readonly container: {
6
+ readonly kind: 'project' | 'workspace';
7
+ readonly path: string;
8
+ };
9
+ readonly scheme: string;
10
+ readonly configuration: string;
11
+ readonly derivedDataPath: string;
12
+ readonly device?: string;
13
+ }
14
+ /**
15
+ * Xcode defaults follow the generated Capacitor app. Application signing/team
16
+ * settings are deliberately read from its project rather than framework config.
17
+ */
18
+ export declare function resolveSimulatorSettings(config: ResolvedApplicationConfig): SimulatorSettings;
19
+ export declare function simulatorBuildArguments(settings: SimulatorSettings, udid: string): readonly string[];
20
+ /**
21
+ * Schemes can include extensions and test bundles. Select the actual application
22
+ * by its configured bundle identifier and resolved simulator platform.
23
+ */
24
+ export declare function resolveSimulatorProduct(value: unknown, bundleId: string): string;
@@ -0,0 +1,55 @@
1
+ import path from 'node:path';
2
+ import { z } from 'zod';
3
+ /**
4
+ * Xcode defaults follow the generated Capacitor app. Application signing/team
5
+ * settings are deliberately read from its project rather than framework config.
6
+ */
7
+ export function resolveSimulatorSettings(config) {
8
+ const ios = config.client.targets.ios;
9
+ if (!ios || !config.application)
10
+ throw new Error('Configure application identity and client.targets.ios first');
11
+ const xcode = ios.xcode;
12
+ return {
13
+ root: config.root,
14
+ bundleId: config.application.id,
15
+ container: xcode?.workspace
16
+ ? { kind: 'workspace', path: path.resolve(config.root, xcode.workspace) }
17
+ : { kind: 'project', path: path.resolve(config.root, xcode?.project ?? 'ios/App/App.xcodeproj') },
18
+ scheme: xcode?.scheme ?? 'App',
19
+ configuration: xcode?.configuration ?? 'Debug',
20
+ derivedDataPath: path.resolve(config.root, xcode?.derivedDataPath ?? 'ios/DerivedData/Simulator'),
21
+ device: ios.simulator?.device,
22
+ };
23
+ }
24
+ export function simulatorBuildArguments(settings, udid) {
25
+ return [
26
+ `-${settings.container.kind}`, settings.container.path,
27
+ '-scheme', settings.scheme,
28
+ '-configuration', settings.configuration,
29
+ '-destination', `platform=iOS Simulator,id=${udid}`,
30
+ '-sdk', 'iphonesimulator',
31
+ '-derivedDataPath', settings.derivedDataPath,
32
+ 'CODE_SIGNING_ALLOWED=YES', 'CODE_SIGN_IDENTITY=-',
33
+ ];
34
+ }
35
+ const buildSettingsSchema = z.array(z.object({ buildSettings: z.record(z.string(), z.unknown()) }));
36
+ /**
37
+ * Schemes can include extensions and test bundles. Select the actual application
38
+ * by its configured bundle identifier and resolved simulator platform.
39
+ */
40
+ export function resolveSimulatorProduct(value, bundleId) {
41
+ const candidates = buildSettingsSchema.parse(value).filter(({ buildSettings: settings }) => settings['PRODUCT_BUNDLE_IDENTIFIER'] === bundleId &&
42
+ settings['WRAPPER_EXTENSION'] === 'app' &&
43
+ settings['PLATFORM_NAME'] === 'iphonesimulator');
44
+ if (candidates.length !== 1)
45
+ throw new Error(`Expected one simulator application product for ${bundleId}; found ${candidates.length}. Check the configured scheme.`);
46
+ const settings = candidates[0]?.buildSettings;
47
+ const directory = settings?.['TARGET_BUILD_DIR'];
48
+ const name = settings?.['FULL_PRODUCT_NAME'];
49
+ if (typeof directory !== 'string' || !path.isAbsolute(directory) ||
50
+ typeof name !== 'string' || path.basename(name) !== name || !name.endsWith('.app')) {
51
+ throw new Error('Xcode returned an invalid simulator application product path');
52
+ }
53
+ return path.join(directory, name);
54
+ }
55
+ //# sourceMappingURL=native-simulator-settings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native-simulator-settings.js","sourceRoot":"","sources":["../../src/application/native-simulator-settings.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { NativeCliArguments } from './cli-arguments.js';
2
+ import type { ResolvedApplicationConfig } from './config.js';
3
+ import { type NativeCommandRunner } from './native-command.js';
4
+ type SimulatorCommand = Exclude<NativeCliArguments, {
5
+ readonly action: 'add' | 'sync' | 'open';
6
+ }>;
7
+ export interface SimulatorDependencies {
8
+ readonly run: NativeCommandRunner;
9
+ readonly build: (config: ResolvedApplicationConfig) => Promise<void>;
10
+ readonly sync: (config: ResolvedApplicationConfig) => Promise<void>;
11
+ readonly write: (message: string) => void;
12
+ readonly platform: NodeJS.Platform;
13
+ }
14
+ /**
15
+ * Simulator tooling deliberately has no distribution, account, certificate or
16
+ * data-reset operations. Each mutation targets one resolved device identifier.
17
+ */
18
+ export declare function runNativeSimulator(config: ResolvedApplicationConfig, command: SimulatorCommand, deps?: SimulatorDependencies): Promise<boolean>;
19
+ export {};
@@ -0,0 +1,101 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { access, mkdir, open, rm } from 'node:fs/promises';
3
+ import path from 'node:path';
4
+ import { runBuild } from './build.js';
5
+ import { runNative } from './native.js';
6
+ import { executeNativeCommand } from './native-command.js';
7
+ import { readIosSimulators, requireBootedSimulator, selectIosSimulator } from './native-devices.js';
8
+ import { inspectSimulatorEnvironment } from './native-doctor.js';
9
+ import { resolveSimulatorProduct, resolveSimulatorSettings, simulatorBuildArguments } from './native-simulator-settings.js';
10
+ const dependencies = {
11
+ run: executeNativeCommand,
12
+ build: config => runBuild(config, 'ios'),
13
+ sync: config => runNative(config, 'sync'),
14
+ write: message => process.stdout.write(`${message}\n`),
15
+ platform: process.platform,
16
+ };
17
+ /**
18
+ * Simulator tooling deliberately has no distribution, account, certificate or
19
+ * data-reset operations. Each mutation targets one resolved device identifier.
20
+ */
21
+ export async function runNativeSimulator(config, command, deps = dependencies) {
22
+ if (command.action === 'doctor') {
23
+ const report = await inspectSimulatorEnvironment(config, command.device, deps.run, deps.platform);
24
+ deps.write(command.json ? JSON.stringify(report, null, 2) : report.checks.map(check => `${check.ok ? 'OK' : 'FAIL'} ${check.name}: ${check.detail}`).join('\n'));
25
+ return report.ok;
26
+ }
27
+ if (deps.platform !== 'darwin')
28
+ throw new Error('iOS simulator commands require macOS with full Xcode installed. Run native doctor ios on a Mac.');
29
+ const devices = await readIosSimulators(deps.run);
30
+ if (command.action === 'devices') {
31
+ deps.write(command.json ? JSON.stringify(devices, null, 2) : devices.map(device => `${device.udid} ${device.name} ${device.runtime} ${device.state}${device.isAvailable ? '' : ' (unavailable)'}`).join('\n') || 'No iOS simulators found. Install an iOS runtime in Xcode.');
32
+ return true;
33
+ }
34
+ const settings = resolveSimulatorSettings(config);
35
+ const device = selectIosSimulator(devices, command.device ?? settings.device);
36
+ if (command.action === 'run') {
37
+ await runApplication(config, settings, device.udid, command.headless, deps);
38
+ return true;
39
+ }
40
+ requireBootedSimulator(device);
41
+ if (command.action === 'screenshot') {
42
+ await captureScreenshot(settings, device.udid, command.output, deps);
43
+ }
44
+ else {
45
+ await streamApplicationLogs(settings, device.udid, deps);
46
+ }
47
+ return true;
48
+ }
49
+ async function runApplication(config, settings, udid, headless, deps) {
50
+ await access(settings.container.path).catch(() => { throw new Error(`Xcode ${settings.container.kind} not found: ${settings.container.path}. Create the native project with native add ios or configure its location.`); });
51
+ deps.write(`Building ${settings.bundleId} for simulator ${udid}`);
52
+ await deps.build(config);
53
+ await deps.sync(config);
54
+ await deps.run('xcrun', ['simctl', 'bootstatus', udid, '-b'], { stream: true, timeoutMs: 180_000 });
55
+ if (!headless)
56
+ await deps.run('open', ['-a', 'Simulator', '--args', '-CurrentDeviceUDID', udid]);
57
+ const args = simulatorBuildArguments(settings, udid);
58
+ await deps.run('xcodebuild', [...args, 'build'], { cwd: settings.root, stream: true, timeoutMs: 900_000 });
59
+ const result = await deps.run('xcodebuild', [...args, '-showBuildSettings', '-json'], { cwd: settings.root });
60
+ const product = resolveSimulatorProduct(JSON.parse(result.stdout), settings.bundleId);
61
+ const identity = await deps.run('/usr/bin/plutil', ['-extract', 'CFBundleIdentifier', 'raw', '-o', '-', path.join(product, 'Info.plist')]);
62
+ if (identity.stdout.trim() !== settings.bundleId)
63
+ throw new Error('Built app identity does not match application.id; refusing to install a different application');
64
+ await deps.run('codesign', ['--verify', '--deep', '--strict', product]);
65
+ await deps.run('xcrun', ['simctl', 'install', udid, product]);
66
+ await deps.run('xcrun', ['simctl', 'launch', '--terminate-running-process', udid, settings.bundleId]);
67
+ deps.write(`Launched ${settings.bundleId} on ${udid}\nApplication: ${product}`);
68
+ }
69
+ async function captureScreenshot(settings, udid, requested, deps) {
70
+ const output = requested
71
+ ? path.resolve(settings.root, requested)
72
+ : path.join(settings.derivedDataPath, 'screenshots', `${new Date().toISOString().replaceAll(':', '-')}-${randomUUID()}.png`);
73
+ if (path.extname(output).toLowerCase() !== '.png')
74
+ throw new Error('Screenshot output must use a .png extension');
75
+ await mkdir(path.dirname(output), { recursive: true });
76
+ const reservation = await open(output, 'wx').catch((error) => {
77
+ if (error instanceof Error && 'code' in error && error.code === 'EEXIST')
78
+ throw new Error(`Screenshot already exists: ${output}. Choose a new --output path.`);
79
+ throw error;
80
+ });
81
+ await reservation.close();
82
+ try {
83
+ await deps.run('xcrun', ['simctl', 'io', udid, 'screenshot', '--type=png', output]);
84
+ }
85
+ catch (error) {
86
+ await rm(output, { force: true });
87
+ throw error;
88
+ }
89
+ deps.write(output);
90
+ }
91
+ async function streamApplicationLogs(settings, udid, deps) {
92
+ const container = await deps.run('xcrun', ['simctl', 'get_app_container', udid, settings.bundleId, 'app']);
93
+ const executable = await deps.run('/usr/bin/plutil', ['-extract', 'CFBundleExecutable', 'raw', '-o', '-', path.join(container.stdout.trim(), 'Info.plist')]);
94
+ const name = executable.stdout.trim();
95
+ if (!name || /[\r\n\0]/u.test(name))
96
+ throw new Error('Installed application has an invalid executable name');
97
+ const quotedName = JSON.stringify(name);
98
+ deps.write(`Streaming ${settings.bundleId} on ${udid}. Press Ctrl+C to stop.`);
99
+ await deps.run('xcrun', ['simctl', 'spawn', udid, 'log', 'stream', '--style', 'compact', '--level', 'debug', '--predicate', `process == ${quotedName}`], { stream: true });
100
+ }
101
+ //# sourceMappingURL=native-simulator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native-simulator.js","sourceRoot":"","sources":["../../src/application/native-simulator.ts"],"names":[],"mappings":"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"}
package/dist/cli/index.js CHANGED
@@ -1,7 +1,12 @@
1
1
  #!/usr/bin/env node
2
2
  import { CLI_USAGE, } from '../application/cli-arguments.js';
3
3
  import { runCli } from './run.js';
4
+ import { NativeCommandInterruptedError } from '../application/native-command.js';
4
5
  runCli(process.argv.slice(2)).catch((error) => {
6
+ if (error instanceof NativeCommandInterruptedError) {
7
+ process.exitCode = error.exitCode;
8
+ return;
9
+ }
5
10
  const message = error instanceof Error ? error.message : String(error);
6
11
  console.error(message);
7
12
  console.error(CLI_USAGE);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AAEA,OAAO,EACL,SAAS,GACV,MAAM,8BAA8B,CAAA;AACrC,OAAO,EAAE,MAAM,EAAE,MAAM,OAAO,CAAA;AAE9B,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;IACrD,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IACtE,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;IACtB,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;IACxB,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAA;AACtB,CAAC,CAAC,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AAEA,OAAO,EACL,SAAS,GACV,MAAM,8BAA8B,CAAA;AACrC,OAAO,EAAE,MAAM,EAAE,MAAM,OAAO,CAAA;AAC9B,OAAO,EAAE,6BAA6B,EAAE,MAAM,+BAA+B,CAAA;AAE7E,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;IACrD,IAAI,KAAK,YAAY,6BAA6B,EAAE,CAAC;QACnD,OAAO,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAA;QACjC,OAAM;IACR,CAAC;IACD,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IACtE,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;IACtB,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;IACxB,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAA;AACtB,CAAC,CAAC,CAAA"}
package/dist/cli/run.js CHANGED
@@ -1,4 +1,5 @@
1
1
  import { runNative } from '../application/native.js';
2
+ import { runNativeSimulator } from '../application/native-simulator.js';
2
3
  import { runBuild } from '../application/build.js';
3
4
  import { parseCliArguments } from '../application/cli-arguments.js';
4
5
  import { loadApplicationConfig } from '../application/config.js';
@@ -14,7 +15,18 @@ export async function runCli(arguments_) {
14
15
  return;
15
16
  }
16
17
  if (parsed.command === 'native') {
17
- await runNative(config, parsed.action);
18
+ switch (parsed.action) {
19
+ case 'devices':
20
+ case 'doctor':
21
+ case 'run':
22
+ case 'logs':
23
+ case 'screenshot':
24
+ if (!await runNativeSimulator(config, parsed))
25
+ process.exitCode = 1;
26
+ break;
27
+ default:
28
+ await runNative(config, parsed.action);
29
+ }
18
30
  return;
19
31
  }
20
32
  if (parsed.command === 'develop') {
@@ -1 +1 @@
1
- {"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/cli/run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAA;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAA;AAChE,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAA;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAA;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAA;AAEnD,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,UAA6B;IACxD,MAAM,MAAM,GAAG,iBAAiB,CAAC,UAAU,CAAC,CAAA;IAC5C,MAAM,IAAI,GAAG,MAAM,mBAAmB,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAA;IACrD,MAAM,MAAM,GAAG,MAAM,qBAAqB,CAAC,IAAI,CAAC,CAAA;IAEhD,IAAI,MAAM,CAAC,OAAO,KAAK,OAAO,EAAE,CAAC;QAC/B,MAAM,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAA;QACrC,OAAM;IACR,CAAC;IAED,IAAI,MAAM,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;QAChC,MAAM,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAA;QACtC,OAAM;IACR,CAAC;IAED,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QACjC,MAAM,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,eAAe,CAAC,CAAA;QAChD,OAAM;IACR,CAAC;IAED,MAAM,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,aAAa,CAAC,CAAA;AAC5E,CAAC"}
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/cli/run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAA;AACpE,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAA;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAA;AAChE,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAA;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAA;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAA;AAEnD,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,UAA6B;IACxD,MAAM,MAAM,GAAG,iBAAiB,CAAC,UAAU,CAAC,CAAA;IAC5C,MAAM,IAAI,GAAG,MAAM,mBAAmB,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAA;IACrD,MAAM,MAAM,GAAG,MAAM,qBAAqB,CAAC,IAAI,CAAC,CAAA;IAEhD,IAAI,MAAM,CAAC,OAAO,KAAK,OAAO,EAAE,CAAC;QAC/B,MAAM,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAA;QACrC,OAAM;IACR,CAAC;IAED,IAAI,MAAM,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;QAChC,QAAQ,MAAM,CAAC,MAAM,EAAE,CAAC;YACtB,KAAK,SAAS,CAAC;YACf,KAAK,QAAQ,CAAC;YACd,KAAK,KAAK,CAAC;YACX,KAAK,MAAM,CAAC;YACZ,KAAK,YAAY;gBACf,IAAI,CAAC,MAAM,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC;oBAAE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAA;gBACnE,MAAK;YACP;gBACE,MAAM,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAA;QAC1C,CAAC;QACD,OAAM;IACR,CAAC;IAED,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QACjC,MAAM,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,eAAe,CAAC,CAAA;QAChD,OAAM;IACR,CAAC;IAED,MAAM,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,aAAa,CAAC,CAAA;AAC5E,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "typeferry",
3
- "version": "0.11.0",
3
+ "version": "0.12.0",
4
4
  "description": "Type-safe real-time RPC framework for TypeScript",
5
5
  "type": "module",
6
6
  "sideEffects": false,