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
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import type { ResolvedApplicationConfig } from './config.js';
|
|
2
|
-
export declare function runBuild(config: ResolvedApplicationConfig): Promise<void>;
|
|
1
|
+
import type { ApplicationTarget, ResolvedApplicationConfig } from './config.js';
|
|
2
|
+
export declare function runBuild(config: ResolvedApplicationConfig, target?: ApplicationTarget): Promise<void>;
|
|
@@ -4,7 +4,13 @@ import { build as buildServer } from 'esbuild';
|
|
|
4
4
|
import { build as buildClient } from 'vite';
|
|
5
5
|
import { createServerBuildOptions } from './server-build.js';
|
|
6
6
|
import { createViteConfig } from './vite-config.js';
|
|
7
|
-
export async function runBuild(config) {
|
|
7
|
+
export async function runBuild(config, target = 'web') {
|
|
8
|
+
if (target === 'ios') {
|
|
9
|
+
await buildClient(createViteConfig(config, 'build', target));
|
|
10
|
+
await access(path.join(config.root, config.paths.output, 'ios-web', 'index.html'));
|
|
11
|
+
await config.extensions.afterBuild?.({ target });
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
8
14
|
await Promise.all([
|
|
9
15
|
access(path.join(config.root, config.paths.client, 'index.html')),
|
|
10
16
|
access(path.join(config.root, config.paths.server, 'index.ts')),
|
|
@@ -17,6 +23,6 @@ export async function runBuild(config) {
|
|
|
17
23
|
buildClient(createViteConfig(config, 'build')),
|
|
18
24
|
buildServer(createServerBuildOptions(config)),
|
|
19
25
|
]);
|
|
20
|
-
await config.extensions.afterBuild?.();
|
|
26
|
+
await config.extensions.afterBuild?.({ target });
|
|
21
27
|
}
|
|
22
28
|
//# sourceMappingURL=build.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build.js","sourceRoot":"","sources":["../../src/application/build.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,IAAI,MAAM,WAAW,CAAA;AAE5B,OAAO,EAAE,KAAK,IAAI,WAAW,EAAE,MAAM,SAAS,CAAA;AAC9C,OAAO,EAAE,KAAK,IAAI,WAAW,EAAE,MAAM,MAAM,CAAA;AAG3C,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAA;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAEhD,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,MAAiC;IAEjC,MAAM,OAAO,CAAC,GAAG,CAAC;QAChB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;QACjE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;KAChE,CAAC,CAAA;IAEF,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE;QACpD,KAAK,EAAE,IAAI;QACX,SAAS,EAAE,IAAI;KAChB,CAAC,CAAA;IAEF,MAAM,OAAO,CAAC,GAAG,CAAC;QAChB,WAAW,CAAC,gBAAgB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC9C,WAAW,CAAC,wBAAwB,CAAC,MAAM,CAAC,CAAC;KAC9C,CAAC,CAAA;IAEF,MAAM,MAAM,CAAC,UAAU,CAAC,UAAU,EAAE,EAAE,CAAA;
|
|
1
|
+
{"version":3,"file":"build.js","sourceRoot":"","sources":["../../src/application/build.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,IAAI,MAAM,WAAW,CAAA;AAE5B,OAAO,EAAE,KAAK,IAAI,WAAW,EAAE,MAAM,SAAS,CAAA;AAC9C,OAAO,EAAE,KAAK,IAAI,WAAW,EAAE,MAAM,MAAM,CAAA;AAG3C,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAA;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAEhD,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,MAAiC,EACjC,SAA4B,KAAK;IAEjC,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;QACrB,MAAM,WAAW,CAAC,gBAAgB,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAA;QAC5D,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC,CAAA;QAClF,MAAM,MAAM,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,CAAA;QAChD,OAAM;IACR,CAAC;IACD,MAAM,OAAO,CAAC,GAAG,CAAC;QAChB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;QACjE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;KAChE,CAAC,CAAA;IAEF,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE;QACpD,KAAK,EAAE,IAAI;QACX,SAAS,EAAE,IAAI;KAChB,CAAC,CAAA;IAEF,MAAM,OAAO,CAAC,GAAG,CAAC;QAChB,WAAW,CAAC,gBAAgB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC9C,WAAW,CAAC,wBAAwB,CAAC,MAAM,CAAC,CAAC;KAC9C,CAAC,CAAA;IAEF,MAAM,MAAM,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,CAAA;AAClD,CAAC"}
|
|
@@ -1,7 +1,44 @@
|
|
|
1
1
|
export type TestProjectName = 'unit' | 'integration' | 'browser';
|
|
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;
|
|
20
|
+
} | {
|
|
21
|
+
readonly command: 'native';
|
|
22
|
+
readonly action: 'run';
|
|
23
|
+
readonly target: 'ios';
|
|
24
|
+
readonly device?: string;
|
|
25
|
+
readonly headless: boolean;
|
|
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
|
+
};
|
|
2
38
|
export type CliArguments = {
|
|
3
39
|
readonly command: 'build';
|
|
4
|
-
|
|
40
|
+
readonly target?: 'ios';
|
|
41
|
+
} | NativeCliArguments | {
|
|
5
42
|
readonly command: 'develop';
|
|
6
43
|
readonly serverArguments: readonly string[];
|
|
7
44
|
} | {
|
|
@@ -10,5 +47,5 @@ export type CliArguments = {
|
|
|
10
47
|
readonly testArguments: readonly string[];
|
|
11
48
|
readonly watch: boolean;
|
|
12
49
|
};
|
|
13
|
-
export declare const CLI_USAGE = "Usage: typeferry <develop [-- server-args...]|build|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...]>";
|
|
14
51
|
export declare function parseCliArguments(arguments_: readonly string[]): CliArguments;
|
|
@@ -3,10 +3,14 @@ const TEST_PROJECTS = new Set([
|
|
|
3
3
|
'integration',
|
|
4
4
|
'browser',
|
|
5
5
|
]);
|
|
6
|
-
export const CLI_USAGE = 'Usage: typeferry <develop [-- server-args...]|build|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
|
+
return parseNativeArguments(rest);
|
|
9
11
|
if (command === 'build') {
|
|
12
|
+
if (rest.length === 2 && rest[0] === '--target' && rest[1] === 'ios')
|
|
13
|
+
return { command, target: 'ios' };
|
|
10
14
|
if (rest.length > 0)
|
|
11
15
|
throw new Error(`Unexpected build arguments. ${CLI_USAGE}`);
|
|
12
16
|
return { command };
|
|
@@ -46,4 +50,58 @@ function parseTestArguments(arguments_) {
|
|
|
46
50
|
? { command: 'test', testArguments, watch }
|
|
47
51
|
: { command: 'test', project, testArguments, watch };
|
|
48
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
|
+
}
|
|
49
107
|
//# sourceMappingURL=cli-arguments.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-arguments.js","sourceRoot":"","sources":["../../src/application/cli-arguments.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"cli-arguments.js","sourceRoot":"","sources":["../../src/application/cli-arguments.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,15 +14,62 @@ export interface ResolvedDevelopmentProxyRoute {
|
|
|
14
14
|
readonly preserveHostHeader: boolean;
|
|
15
15
|
readonly rewriteLocalhostCookies: boolean;
|
|
16
16
|
}
|
|
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
|
+
}
|
|
35
|
+
export interface IosApplicationTarget {
|
|
36
|
+
readonly runtime: 'capacitor';
|
|
37
|
+
readonly xcode?: IosXcodeConfig;
|
|
38
|
+
readonly simulator?: IosSimulatorConfig;
|
|
39
|
+
readonly backend: {
|
|
40
|
+
readonly origin: string;
|
|
41
|
+
};
|
|
42
|
+
readonly permissions?: {
|
|
43
|
+
readonly camera?: {
|
|
44
|
+
readonly purpose: string;
|
|
45
|
+
};
|
|
46
|
+
readonly microphone?: {
|
|
47
|
+
readonly purpose: string;
|
|
48
|
+
};
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
export interface ApplicationIdentity {
|
|
52
|
+
readonly id: string;
|
|
53
|
+
readonly name: string;
|
|
54
|
+
}
|
|
17
55
|
export interface ApplicationToolingExtensions {
|
|
18
56
|
readonly vite?: (config: InlineConfig, context: {
|
|
19
57
|
readonly command: "develop" | "build";
|
|
58
|
+
readonly target: ApplicationTarget;
|
|
20
59
|
}) => InlineConfig;
|
|
21
60
|
readonly serverBuild?: (options: BuildOptions) => BuildOptions;
|
|
22
61
|
readonly test?: (config: VitestConfig) => VitestConfig;
|
|
23
|
-
readonly afterBuild?: (
|
|
62
|
+
readonly afterBuild?: (context: {
|
|
63
|
+
readonly target: ApplicationTarget;
|
|
64
|
+
}) => void | Promise<void>;
|
|
24
65
|
}
|
|
25
66
|
export interface TypeFerryConfig {
|
|
67
|
+
readonly application?: ApplicationIdentity;
|
|
68
|
+
readonly client?: {
|
|
69
|
+
readonly targets?: {
|
|
70
|
+
readonly ios?: IosApplicationTarget;
|
|
71
|
+
};
|
|
72
|
+
};
|
|
26
73
|
readonly extensions?: ApplicationToolingExtensions;
|
|
27
74
|
readonly development?: {
|
|
28
75
|
readonly clientPort?: number;
|
|
@@ -47,6 +94,12 @@ export interface TypeFerryConfig {
|
|
|
47
94
|
};
|
|
48
95
|
}
|
|
49
96
|
export interface ResolvedApplicationConfig {
|
|
97
|
+
readonly application?: ApplicationIdentity;
|
|
98
|
+
readonly client: {
|
|
99
|
+
readonly targets: {
|
|
100
|
+
readonly ios?: IosApplicationTarget;
|
|
101
|
+
};
|
|
102
|
+
};
|
|
50
103
|
readonly root: string;
|
|
51
104
|
readonly paths: {
|
|
52
105
|
readonly client: string;
|
|
@@ -79,6 +132,9 @@ export interface ResolvedApplicationConfig {
|
|
|
79
132
|
readonly extensions: ApplicationToolingExtensions;
|
|
80
133
|
}
|
|
81
134
|
export declare const DEFAULT_APPLICATION_CONFIG: {
|
|
135
|
+
readonly client: {
|
|
136
|
+
readonly targets: {};
|
|
137
|
+
};
|
|
82
138
|
readonly paths: {
|
|
83
139
|
readonly client: "client";
|
|
84
140
|
readonly common: "common";
|
|
@@ -34,8 +34,38 @@ const extensionsSchema = z
|
|
|
34
34
|
afterBuild: z.function().optional(),
|
|
35
35
|
})
|
|
36
36
|
.strict();
|
|
37
|
+
const httpsOriginSchema = z.string().refine(value => {
|
|
38
|
+
try {
|
|
39
|
+
const url = new URL(value);
|
|
40
|
+
return url.protocol === 'https:' && url.origin === value && !url.username && !url.password;
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
}, 'Expected an HTTPS origin without credentials, path, query or fragment');
|
|
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();
|
|
37
56
|
const configSchema = z
|
|
38
57
|
.object({
|
|
58
|
+
application: z.object({
|
|
59
|
+
id: z.string().regex(/^[a-zA-Z][a-zA-Z0-9-]*(\.[a-zA-Z][a-zA-Z0-9-]*)+$/u),
|
|
60
|
+
name: z.string().trim().min(1),
|
|
61
|
+
}).strict().optional(),
|
|
62
|
+
client: z.object({ targets: z.object({ ios: z.object({
|
|
63
|
+
runtime: z.literal('capacitor'),
|
|
64
|
+
xcode: iosXcodeSchema.optional(),
|
|
65
|
+
simulator: iosSimulatorSchema.optional(),
|
|
66
|
+
backend: z.object({ origin: httpsOriginSchema }).strict(),
|
|
67
|
+
permissions: z.object({ camera: permissionSchema.optional(), microphone: permissionSchema.optional() }).strict().optional(),
|
|
68
|
+
}).strict().optional() }).strict().optional() }).strict().optional(),
|
|
39
69
|
extensions: extensionsSchema.optional(),
|
|
40
70
|
development: z
|
|
41
71
|
.object({
|
|
@@ -73,6 +103,7 @@ const configSchema = z
|
|
|
73
103
|
})
|
|
74
104
|
.strict();
|
|
75
105
|
export const DEFAULT_APPLICATION_CONFIG = {
|
|
106
|
+
client: { targets: {} },
|
|
76
107
|
paths: {
|
|
77
108
|
client: "client",
|
|
78
109
|
common: "common",
|
|
@@ -126,8 +157,13 @@ export function defineConfig(config) {
|
|
|
126
157
|
}
|
|
127
158
|
export function resolveApplicationConfig(root, input = {}) {
|
|
128
159
|
const config = configSchema.parse(input);
|
|
160
|
+
if (config.client?.targets?.ios && !config.application) {
|
|
161
|
+
throw new Error('An iOS target requires application id and name');
|
|
162
|
+
}
|
|
129
163
|
return {
|
|
130
164
|
root: path.resolve(root),
|
|
165
|
+
...(config.application ? { application: config.application } : {}),
|
|
166
|
+
client: { targets: config.client?.targets ?? {} },
|
|
131
167
|
paths: DEFAULT_APPLICATION_CONFIG.paths,
|
|
132
168
|
development: {
|
|
133
169
|
...DEFAULT_APPLICATION_CONFIG.development,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/application/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAOlC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
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;
|