typeferry 0.10.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.
- package/dist/application/build.d.ts +2 -2
- package/dist/application/build.js +8 -2
- package/dist/application/build.js.map +1 -1
- package/dist/application/cli-arguments.d.ts +39 -2
- package/dist/application/cli-arguments.js +59 -1
- package/dist/application/cli-arguments.js.map +1 -1
- package/dist/application/config.d.ts +57 -1
- package/dist/application/config.js +36 -0
- package/dist/application/config.js.map +1 -1
- package/dist/application/native-command.d.ts +35 -0
- package/dist/application/native-command.js +148 -0
- package/dist/application/native-command.js.map +1 -0
- package/dist/application/native-devices.d.ts +31 -0
- package/dist/application/native-devices.js +94 -0
- package/dist/application/native-devices.js.map +1 -0
- package/dist/application/native-doctor.d.ts +17 -0
- package/dist/application/native-doctor.js +79 -0
- package/dist/application/native-doctor.js.map +1 -0
- package/dist/application/native-project.d.ts +16 -0
- package/dist/application/native-project.js +82 -0
- package/dist/application/native-project.js.map +1 -0
- package/dist/application/native-simulator-settings.d.ts +24 -0
- package/dist/application/native-simulator-settings.js +55 -0
- package/dist/application/native-simulator-settings.js.map +1 -0
- package/dist/application/native-simulator.d.ts +19 -0
- package/dist/application/native-simulator.js +101 -0
- package/dist/application/native-simulator.js.map +1 -0
- package/dist/application/native.d.ts +2 -0
- package/dist/application/native.js +86 -0
- package/dist/application/native.js.map +1 -0
- package/dist/application/runtime.d.ts +13 -0
- package/dist/application/runtime.js +15 -0
- package/dist/application/runtime.js.map +1 -0
- package/dist/application/vite-config.d.ts +2 -2
- package/dist/application/vite-config.js +16 -2
- package/dist/application/vite-config.js.map +1 -1
- package/dist/auth/client/index.d.ts +4 -0
- package/dist/auth/client/index.js +2 -0
- package/dist/auth/client/index.js.map +1 -1
- package/dist/auth/client/native-http.d.ts +24 -0
- package/dist/auth/client/native-http.js +19 -0
- package/dist/auth/client/native-http.js.map +1 -0
- package/dist/auth/client/native-session.d.ts +34 -0
- package/dist/auth/client/native-session.js +65 -0
- package/dist/auth/client/native-session.js.map +1 -0
- package/dist/auth/index.d.ts +6 -0
- package/dist/auth/index.js +3 -0
- package/dist/auth/index.js.map +1 -1
- package/dist/auth/server/native-handoff.d.ts +69 -0
- package/dist/auth/server/native-handoff.js +65 -0
- package/dist/auth/server/native-handoff.js.map +1 -0
- package/dist/cli/index.js +5 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/run.js +18 -1
- package/dist/cli/run.js.map +1 -1
- package/dist/client/backend-origin.d.ts +17 -0
- package/dist/client/backend-origin.js +25 -0
- package/dist/client/backend-origin.js.map +1 -0
- package/dist/client/client-http.js +8 -3
- package/dist/client/client-http.js.map +1 -1
- package/dist/client/client-socket.js +6 -1
- package/dist/client/client-socket.js.map +1 -1
- package/dist/client/client.d.ts +9 -0
- package/dist/client/client.js.map +1 -1
- package/dist/client/index.d.ts +1 -0
- package/dist/client/index.js +1 -0
- package/dist/client/index.js.map +1 -1
- package/dist/ejson/clone.js +7 -1
- package/dist/ejson/clone.js.map +1 -1
- package/dist/native/index.d.ts +76 -0
- package/dist/native/index.js +5 -0
- package/dist/native/index.js.map +1 -0
- package/dist/native/share-file.d.ts +18 -0
- package/dist/native/share-file.js +41 -0
- package/dist/native/share-file.js.map +1 -0
- package/dist/native/templates/bridge-view-controller.d.ts +4 -0
- package/dist/native/templates/bridge-view-controller.js +86 -0
- package/dist/native/templates/bridge-view-controller.js.map +1 -0
- package/dist/native/templates/file-staging.d.ts +4 -0
- package/dist/native/templates/file-staging.js +77 -0
- package/dist/native/templates/file-staging.js.map +1 -0
- package/dist/native/templates/http-session.d.ts +4 -0
- package/dist/native/templates/http-session.js +117 -0
- package/dist/native/templates/http-session.js.map +1 -0
- package/dist/native/templates/index.d.ts +4 -0
- package/dist/native/templates/index.js +20 -0
- package/dist/native/templates/index.js.map +1 -0
- package/dist/native/templates/keychain.d.ts +4 -0
- package/dist/native/templates/keychain.js +48 -0
- package/dist/native/templates/keychain.js.map +1 -0
- package/dist/native/templates/media-permission-policy.d.ts +4 -0
- package/dist/native/templates/media-permission-policy.js +24 -0
- package/dist/native/templates/media-permission-policy.js.map +1 -0
- package/dist/native/templates/plugin.d.ts +4 -0
- package/dist/native/templates/plugin.js +314 -0
- package/dist/native/templates/plugin.js.map +1 -0
- package/dist/native/templates/wake-locks.d.ts +4 -0
- package/dist/native/templates/wake-locks.js +47 -0
- package/dist/native/templates/wake-locks.js.map +1 -0
- package/dist/native/wake-lock.d.ts +9 -0
- package/dist/native/wake-lock.js +17 -0
- package/dist/native/wake-lock.js.map +1 -0
- package/package.json +18 -2
|
@@ -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":"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"}
|
|
@@ -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,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Updates generated files only when their last generated contents are intact.
|
|
3
|
+
* User edits are never overwritten by synchronization.
|
|
4
|
+
*/
|
|
5
|
+
export declare function writeGeneratedFile(root: string, relativePath: string, contents: string): Promise<void>;
|
|
6
|
+
/**
|
|
7
|
+
* Registers a generated Swift file in Capacitor's conventional App target.
|
|
8
|
+
* Existing IDs and custom project settings remain untouched.
|
|
9
|
+
*/
|
|
10
|
+
export declare function registerNativeSource(project: string): string;
|
|
11
|
+
export declare function fileExists(file: string): Promise<boolean>;
|
|
12
|
+
/**
|
|
13
|
+
* Capacitor's scene lifecycle constructs its controller directly; storyboard
|
|
14
|
+
* registration alone does not install the native bridge in modern projects.
|
|
15
|
+
*/
|
|
16
|
+
export declare function registerNativeScene(source: string): string;
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { access, mkdir, readFile, writeFile } from 'node:fs/promises';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
/**
|
|
5
|
+
* Updates generated files only when their last generated contents are intact.
|
|
6
|
+
* User edits are never overwritten by synchronization.
|
|
7
|
+
*/
|
|
8
|
+
export async function writeGeneratedFile(root, relativePath, contents) {
|
|
9
|
+
const destination = path.join(root, relativePath);
|
|
10
|
+
const ledger = path.join(root, '.typeferry', 'generated', `${createHash('sha256').update(relativePath).digest('hex')}.sha256`);
|
|
11
|
+
let existing;
|
|
12
|
+
try {
|
|
13
|
+
existing = await readFile(destination, 'utf8');
|
|
14
|
+
}
|
|
15
|
+
catch (error) {
|
|
16
|
+
if (!(error instanceof Error && 'code' in error && error.code === 'ENOENT'))
|
|
17
|
+
throw error;
|
|
18
|
+
}
|
|
19
|
+
if (existing === contents) {
|
|
20
|
+
await mkdir(path.dirname(ledger), { recursive: true });
|
|
21
|
+
await writeFile(ledger, hash(contents));
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
if (existing !== undefined) {
|
|
25
|
+
let previousHash;
|
|
26
|
+
try {
|
|
27
|
+
previousHash = await readFile(ledger, 'utf8');
|
|
28
|
+
}
|
|
29
|
+
catch { /* Unowned files cannot be replaced. */ }
|
|
30
|
+
if (previousHash !== hash(existing))
|
|
31
|
+
throw new Error(`Refusing to overwrite edited or app-owned file: ${relativePath}`);
|
|
32
|
+
}
|
|
33
|
+
await mkdir(path.dirname(destination), { recursive: true });
|
|
34
|
+
await mkdir(path.dirname(ledger), { recursive: true });
|
|
35
|
+
await writeFile(destination, contents);
|
|
36
|
+
await writeFile(ledger, hash(contents));
|
|
37
|
+
}
|
|
38
|
+
function hash(value) { return createHash('sha256').update(value).digest('hex'); }
|
|
39
|
+
/**
|
|
40
|
+
* Registers a generated Swift file in Capacitor's conventional App target.
|
|
41
|
+
* Existing IDs and custom project settings remain untouched.
|
|
42
|
+
*/
|
|
43
|
+
export function registerNativeSource(project) {
|
|
44
|
+
if (project.includes('/* TypeFerryNative.swift in Sources */'))
|
|
45
|
+
return project;
|
|
46
|
+
const reference = 'F3A000000000000000000001';
|
|
47
|
+
const build = 'F3A000000000000000000002';
|
|
48
|
+
if (project.includes(reference) || project.includes(build))
|
|
49
|
+
throw new Error('Native project identifier collision');
|
|
50
|
+
const anchors = ['/* Begin PBXBuildFile section */', '/* Begin PBXFileReference section */', /\t+\w+ \/\* AppDelegate.swift \*\/,/u, /\t+\w+ \/\* AppDelegate.swift in Sources \*\/,/u];
|
|
51
|
+
for (const anchor of anchors) {
|
|
52
|
+
if (typeof anchor === 'string' ? !project.includes(anchor) : !anchor.test(project))
|
|
53
|
+
throw new Error('Unsupported Xcode project structure; expected AppDelegate.swift in App target');
|
|
54
|
+
}
|
|
55
|
+
return project
|
|
56
|
+
.replace(anchors[0], `${anchors[0]}\n\t\t${build} /* TypeFerryNative.swift in Sources */ = {isa = PBXBuildFile; fileRef = ${reference} /* TypeFerryNative.swift */; };`)
|
|
57
|
+
.replace(anchors[1], `${anchors[1]}\n\t\t${reference} /* TypeFerryNative.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TypeFerryNative.swift; sourceTree = "<group>"; };`)
|
|
58
|
+
.replace(anchors[2], match => `${match}\n\t\t\t\t${reference} /* TypeFerryNative.swift */,`)
|
|
59
|
+
.replace(anchors[3], match => `${match}\n\t\t\t\t${build} /* TypeFerryNative.swift in Sources */,`);
|
|
60
|
+
}
|
|
61
|
+
export async function fileExists(file) {
|
|
62
|
+
try {
|
|
63
|
+
await access(file);
|
|
64
|
+
return true;
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Capacitor's scene lifecycle constructs its controller directly; storyboard
|
|
72
|
+
* registration alone does not install the native bridge in modern projects.
|
|
73
|
+
*/
|
|
74
|
+
export function registerNativeScene(source) {
|
|
75
|
+
if (/rootViewController\s*=\s*TypeFerryBridgeViewController\(\)/u.test(source))
|
|
76
|
+
return source;
|
|
77
|
+
const stockController = /rootViewController\s*=\s*CAPBridgeViewController\(\)/u;
|
|
78
|
+
if (!stockController.test(source))
|
|
79
|
+
throw new Error('Custom scene controller detected; integrate TypeFerry native registration explicitly');
|
|
80
|
+
return source.replace(stockController, 'rootViewController = TypeFerryBridgeViewController()');
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=native-project.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"native-project.js","sourceRoot":"","sources":["../../src/application/native-project.ts"],"names":[],"mappings":"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"}
|
|
@@ -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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"}
|