@swiftbrowser/cli 0.2.0 → 0.3.1
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/README.md +11 -2
- package/dist/build.d.ts +10 -0
- package/dist/build.js +32 -2
- package/dist/build.js.map +1 -1
- package/dist/cli.d.ts +2 -1
- package/dist/cli.js +9 -1
- package/dist/cli.js.map +1 -1
- package/dist/commands/init.js +5 -3
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/shared.d.ts +4 -1
- package/dist/commands/shared.js +4 -3
- package/dist/commands/shared.js.map +1 -1
- package/dist/commands/test.d.ts +22 -0
- package/dist/commands/test.js +95 -0
- package/dist/commands/test.js.map +1 -0
- package/dist/project.d.ts +52 -0
- package/dist/project.js +66 -2
- package/dist/project.js.map +1 -1
- package/dist/stage.d.ts +21 -2
- package/dist/stage.js +75 -13
- package/dist/stage.js.map +1 -1
- package/dist/template.d.ts +11 -1
- package/dist/template.js +248 -8
- package/dist/template.js.map +1 -1
- package/dist/testRunner.d.ts +1 -0
- package/dist/testRunner.js +44 -0
- package/dist/testRunner.js.map +1 -0
- package/package.json +5 -5
package/README.md
CHANGED
|
@@ -6,6 +6,7 @@ Run an iOS SwiftUI app in the browser, from its Xcode project, without a Mac.
|
|
|
6
6
|
npx @swiftbrowser/cli doctor --install # Swift 6.4, the wasm SDK, wasm-opt
|
|
7
7
|
npx @swiftbrowser/cli init MyApp # a new SwiftUI app, as an Xcode project
|
|
8
8
|
npx @swiftbrowser/cli dev ~/Projects/MyApp # http://localhost:5173, rebuilds on save
|
|
9
|
+
npx @swiftbrowser/cli test ~/Projects/MyApp # the app's unit tests, in WebAssembly
|
|
9
10
|
npx @swiftbrowser/cli build ~/Projects/MyApp # ./dist: a static site to deploy anywhere
|
|
10
11
|
```
|
|
11
12
|
|
|
@@ -18,15 +19,16 @@ the shim does not provide is a compile error, never a wrong rendering.
|
|
|
18
19
|
|
|
19
20
|
| Command | What it does |
|
|
20
21
|
|---|---|
|
|
21
|
-
| `init [<dir>]` | Writes a new SwiftUI app into `<dir>` (default `.`, created if missing): an Xcode 16 project (`<Name>.xcodeproj`,
|
|
22
|
+
| `init [<dir>]` | Writes a new SwiftUI app into `<dir>` (default `.`, created if missing): an Xcode 16 project (`<Name>.xcodeproj`, an app target for iOS 18 and a unit-test target hosted by it, with a shared scheme) whose sources live in synchronized folders: `<Name>/` (`<Name>App.swift`, `ContentView.swift`, an asset catalog) and `<Name>Tests/` (a Swift Testing test of `ContentView`), plus a `.gitignore` and a README. It opens in Xcode as is (⌘U runs the test), runs with `dev` and tests with `test`; any Swift file added under `<Name>/` or `<Name>Tests/` belongs to both. `--name <Name>` sets the app name (default: from the directory, `my-app` → `MyApp`), `--bundle-id` the bundle identifier (default `com.example.<Name>`). An existing directory is fine as long as `<Name>.xcodeproj`, `<Name>/` and `<Name>Tests/` are free; its `.gitignore` gets the missing lines and its README is kept. |
|
|
22
23
|
| `doctor [--install]` | Checks Node ≥ 22, Swift 6.4, the Swift SDK for WebAssembly and `wasm-opt`; `--install` fetches the SDK (`swift sdk install`) and Binaryen into `~/.cache/swiftbrowser`. Swift itself comes from [swiftly](https://www.swift.org/install/) (`swiftly install 6.4.0`), or point `SWIFT_TOOLCHAIN_BIN` at a toolchain's `usr/bin`. |
|
|
23
24
|
| `check <path>` | Lists what the app imports (supported / rewritten / unsupported, with the usual way around each), then compiles the app natively against the shim. Seconds, no wasm; every error names your file and line. |
|
|
24
25
|
| `dev <path>` | Builds the app for WebAssembly and serves it with the SwiftBrowser dev server: landing page with a QR code at `/`, the app at `/app/?app=<Name>`; saving a Swift file rebuilds and reloads with the app's state carried over. `--port`, `--host` (expose on the LAN for phones), `--open`. |
|
|
25
26
|
| `build <path> [-o dist]` | A release build, optimized and stripped with `wasm-opt` (17.4 MB for a small app, 4.5 MB with brotli), and a complete static site around it. `--no-optimize` skips wasm-opt. |
|
|
27
|
+
| `test <path>` | Builds the app's unit tests for WebAssembly against the kit and runs them under Node's WASI, the runtime the browser runs the app in: XCTest and Swift Testing, each when some test imports it. The tests are the Xcode project's unit-test targets that depend on the app or load into it (`TEST_HOST`), each a module that can `@testable import` the app, or for a folder of sources the Swift files under its `Tests` and `*Tests` folders. A failing test, or a trap, fails the command (exit 1); errors name your files. 11 s for a new app's test after the kit is built. UI test targets are not run, and `Bundle.main` holds none of the app's resources yet. |
|
|
26
28
|
| `kit` | Compiles SwiftBrowser for WebAssembly ahead of a build (the first `dev` or `build` does it otherwise) and prints where the kit is. |
|
|
27
29
|
|
|
28
30
|
`<path>` is an `.xcodeproj`, a folder holding one (directly or one level
|
|
29
|
-
down), or a plain folder of Swift sources. Options for all
|
|
31
|
+
down), or a plain folder of Swift sources. Options for all of them:
|
|
30
32
|
`--target <name>` when the project has several app targets, `--config <file>`,
|
|
31
33
|
`--verbose`.
|
|
32
34
|
|
|
@@ -133,6 +135,13 @@ Every change keeps line numbers, so compiler diagnostics point at your files.
|
|
|
133
135
|
The package depends on `@swiftbrowser/swift` (the shim at the version this CLI
|
|
134
136
|
was released with).
|
|
135
137
|
|
|
138
|
+
`test` stages the app the same way in a package of its own,
|
|
139
|
+
`.swiftbrowser/<Name>.tests/`, so that switching between `test` and `dev`
|
|
140
|
+
rebuilds neither from scratch. Each unit-test target is a test target in it
|
|
141
|
+
that depends on the app's. Its files get the same adjustments, along with
|
|
142
|
+
the generated alias file, because a test module imports both Foundation and
|
|
143
|
+
the app. It links the SDK's whole ICU data rather than a trimmed copy.
|
|
144
|
+
|
|
136
145
|
## Foundation
|
|
137
146
|
|
|
138
147
|
Apps link the real Foundation (swift-corelibs-foundation, as the wasm SDK
|
package/dist/build.d.ts
CHANGED
|
@@ -36,6 +36,16 @@ export declare function buildWasm(options: BuildOptions & {
|
|
|
36
36
|
wasmOpt?: string | null;
|
|
37
37
|
swiftFlags?: readonly string[];
|
|
38
38
|
}): Promise<string>;
|
|
39
|
+
/**
|
|
40
|
+
* Builds the staged tests (`stage(…, { tests: true })`) for WebAssembly and
|
|
41
|
+
* returns the test modules to run. Debug: `@testable import` needs testing
|
|
42
|
+
* enabled, which SwiftPM turns on in debug builds, and debug compiles faster.
|
|
43
|
+
* Swift Build links a module per test target (`<Target>-test-runner.wasm`);
|
|
44
|
+
* the native build system, one for the package (`<Package>PackageTests.xctest`).
|
|
45
|
+
*/
|
|
46
|
+
export declare function buildTests(options: BuildOptions & {
|
|
47
|
+
swiftFlags?: readonly string[];
|
|
48
|
+
}): Promise<string[]>;
|
|
39
49
|
/**
|
|
40
50
|
* Optimizes `input` for size and strips it into `output` with wasm-opt: what
|
|
41
51
|
* `build` does after the link, and what CI does to the unoptimized modules
|
package/dist/build.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// Compiling the staging package: natively for `check` (fast, same
|
|
2
|
-
// diagnostics), for WebAssembly for `dev` and `
|
|
2
|
+
// diagnostics), for WebAssembly for `dev`, `build` and `test`, then wasm-opt.
|
|
3
3
|
import { spawn } from 'node:child_process';
|
|
4
|
-
import { copyFileSync, existsSync, mkdirSync, readFileSync, statSync, writeFileSync } from 'node:fs';
|
|
4
|
+
import { copyFileSync, existsSync, mkdirSync, readFileSync, readdirSync, statSync, writeFileSync } from 'node:fs';
|
|
5
5
|
import path from 'node:path';
|
|
6
6
|
import { CliError } from './log.js';
|
|
7
7
|
import { remapDiagnostics, scratchPathArgs, wasmOutput } from './stage.js';
|
|
@@ -113,6 +113,36 @@ export async function buildWasm(options) {
|
|
|
113
113
|
stripAutolink(out);
|
|
114
114
|
return out;
|
|
115
115
|
}
|
|
116
|
+
/**
|
|
117
|
+
* Builds the staged tests (`stage(…, { tests: true })`) for WebAssembly and
|
|
118
|
+
* returns the test modules to run. Debug: `@testable import` needs testing
|
|
119
|
+
* enabled, which SwiftPM turns on in debug builds, and debug compiles faster.
|
|
120
|
+
* Swift Build links a module per test target (`<Target>-test-runner.wasm`);
|
|
121
|
+
* the native build system, one for the package (`<Package>PackageTests.xctest`).
|
|
122
|
+
*/
|
|
123
|
+
export async function buildTests(options) {
|
|
124
|
+
const { toolchain, staged } = options;
|
|
125
|
+
const env = toolchainEnv(toolchain);
|
|
126
|
+
const common = ['--swift-sdk', WASM_SDK, ...scratchPathArgs(), ...(options.swiftFlags ?? []).flatMap((flag) => ['-Xswiftc', flag])];
|
|
127
|
+
const result = await run(toolchain.swift, ['build', '--build-tests', ...common], {
|
|
128
|
+
cwd: staged.dir,
|
|
129
|
+
env,
|
|
130
|
+
...(options.onOutput ? { onOutput: options.onOutput } : {}),
|
|
131
|
+
});
|
|
132
|
+
if (result.status !== 0)
|
|
133
|
+
throw new CliError(remapDiagnostics(diagnosticsOnly(result.output) || result.output, staged));
|
|
134
|
+
const binPath = await run(toolchain.swift, ['build', ...common, '--show-bin-path'], { cwd: staged.dir, env });
|
|
135
|
+
if (binPath.status !== 0)
|
|
136
|
+
throw new CliError(`swift build --show-bin-path failed:\n${binPath.output}`);
|
|
137
|
+
const bin = binPath.output.trim().split('\n').pop();
|
|
138
|
+
const modules = readdirSync(bin)
|
|
139
|
+
.filter((name) => name.endsWith('-test-runner.wasm') || name.endsWith('PackageTests.xctest'))
|
|
140
|
+
.sort()
|
|
141
|
+
.map((name) => path.join(bin, name));
|
|
142
|
+
if (modules.length === 0)
|
|
143
|
+
throw new CliError(`no test module in ${bin} after the build`);
|
|
144
|
+
return modules;
|
|
145
|
+
}
|
|
116
146
|
/**
|
|
117
147
|
* Optimizes `input` for size and strips it into `output` with wasm-opt: what
|
|
118
148
|
* `build` does after the link, and what CI does to the unoptimized modules
|
package/dist/build.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build.js","sourceRoot":"","sources":["../src/build.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,
|
|
1
|
+
{"version":3,"file":"build.js","sourceRoot":"","sources":["../src/build.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
|
|
1
|
+
/** The package's version, from its package.json (beside `src/` and `dist/`), which releases bump. */
|
|
2
|
+
export declare const VERSION: string;
|
|
2
3
|
/**
|
|
3
4
|
* `--host` may stand alone (every interface), which parseArgs cannot express
|
|
4
5
|
* for an option that also takes a value: a bare `--host` becomes `--host=`
|
package/dist/cli.js
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
// `swiftbrowser <command> [path] [options]`: argument parsing and dispatch.
|
|
2
|
+
import { readFileSync } from 'node:fs';
|
|
2
3
|
import { parseArgs } from 'node:util';
|
|
3
4
|
import { isHTTPURL } from './config.js';
|
|
4
5
|
import { CliError, bold, dim, error, info, warn } from './log.js';
|
|
5
|
-
|
|
6
|
+
/** The package's version, from its package.json (beside `src/` and `dist/`), which releases bump. */
|
|
7
|
+
export const VERSION = JSON.parse(readFileSync(new URL('../package.json', import.meta.url), 'utf8')).version;
|
|
6
8
|
const HELP = `${bold('swiftbrowser')} ${VERSION}: run an iOS SwiftUI app in the browser.
|
|
7
9
|
|
|
8
10
|
${bold('Usage')}
|
|
@@ -11,6 +13,7 @@ ${bold('Usage')}
|
|
|
11
13
|
swiftbrowser check <path> [options] import report and a native compile against the shim
|
|
12
14
|
swiftbrowser dev <path> [options] run the app with rebuild on save
|
|
13
15
|
swiftbrowser build <path> [-o <dir>] optimized module and a static site
|
|
16
|
+
swiftbrowser test <path> the app's unit tests (XCTest, Swift Testing) in WebAssembly
|
|
14
17
|
swiftbrowser kit compile SwiftBrowser for WebAssembly ahead of builds
|
|
15
18
|
|
|
16
19
|
${bold('<path>')} is an .xcodeproj, a folder holding one, or a folder of Swift sources
|
|
@@ -154,6 +157,11 @@ export async function main(argv) {
|
|
|
154
157
|
});
|
|
155
158
|
return 0;
|
|
156
159
|
}
|
|
160
|
+
case 'test': {
|
|
161
|
+
const { test } = await import('./commands/test.js');
|
|
162
|
+
await test(needsPath(), { ...appOptions, ...(values.verbose ? { verbose: true } : {}) });
|
|
163
|
+
return 0;
|
|
164
|
+
}
|
|
157
165
|
case 'build': {
|
|
158
166
|
const { build } = await import('./commands/build.js');
|
|
159
167
|
await build(needsPath(), {
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAE5E,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAElE,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/init.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
// `swiftbrowser init [<dir>] [--name <Name>]`: a new SwiftUI app
|
|
2
|
-
// project that also runs with `swiftbrowser dev`
|
|
1
|
+
// `swiftbrowser init [<dir>] [--name <Name>]`: a new SwiftUI app with a unit
|
|
2
|
+
// test, as an Xcode project that also runs with `swiftbrowser dev` and tests
|
|
3
|
+
// with `swiftbrowser test` (template.ts).
|
|
3
4
|
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
4
5
|
import path from 'node:path';
|
|
5
6
|
import { CliError, bold, dim, info, ok } from '../log.js';
|
|
@@ -17,7 +18,7 @@ export function init(dirArg, options = {}) {
|
|
|
17
18
|
if (!APP_NAME.test(name)) {
|
|
18
19
|
throw new CliError(`--name must be a Swift type name (a letter, then letters and digits): ${name}`, 2);
|
|
19
20
|
}
|
|
20
|
-
for (const taken of [`${name}.xcodeproj`, name]) {
|
|
21
|
+
for (const taken of [`${name}.xcodeproj`, name, `${name}Tests`]) {
|
|
21
22
|
if (existsSync(path.join(dir, taken)))
|
|
22
23
|
throw new CliError(`${path.join(dir, taken)} already exists; pick another --name or directory`);
|
|
23
24
|
}
|
|
@@ -47,6 +48,7 @@ export function init(dirArg, options = {}) {
|
|
|
47
48
|
info(` cd ${/[\s"']/.test(shown) ? JSON.stringify(shown) : shown}`);
|
|
48
49
|
const steps = [
|
|
49
50
|
['npx @swiftbrowser/cli dev .', 'run it in the browser, rebuilding on save'],
|
|
51
|
+
['npx @swiftbrowser/cli test .', `run ${name}Tests in WebAssembly`],
|
|
50
52
|
[`open ${name}.xcodeproj`, 'or work on it in Xcode'],
|
|
51
53
|
];
|
|
52
54
|
const width = Math.max(...steps.map(([command]) => command.length)) + 3;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -38,7 +38,10 @@ export interface Shim {
|
|
|
38
38
|
export declare function wasmShim(options?: {
|
|
39
39
|
verbose?: boolean;
|
|
40
40
|
}): Promise<Shim>;
|
|
41
|
-
|
|
41
|
+
/** `stageOptions.tests` stages the app with its test targets (`swiftbrowser test`; stage.ts). */
|
|
42
|
+
export declare function prepare(input: string, options: AppOptions, shimPackage?: string, stageOptions?: {
|
|
43
|
+
tests?: boolean;
|
|
44
|
+
}): Promise<Prepared>;
|
|
42
45
|
export declare function describeApp(app: ResolvedApp): void;
|
|
43
46
|
/** Prints the import report; returns whether anything is known to be unsupported. */
|
|
44
47
|
export declare function describeReport(report: CompatReport, app: ResolvedApp, vendored?: Vendored): boolean;
|
package/dist/commands/shared.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// What `check`, `dev` and `
|
|
1
|
+
// What `check`, `dev`, `build` and `test` share: resolving the app, reporting its
|
|
2
2
|
// imports, staging it and finding the toolchain.
|
|
3
3
|
import path from 'node:path';
|
|
4
4
|
import { swiftPackagePath } from '@swiftbrowser/swift';
|
|
@@ -49,7 +49,8 @@ export async function wasmShim(options = {}) {
|
|
|
49
49
|
info(ok(`SwiftBrowser compiled ${dim(`(${((Date.now() - started) / 1000).toFixed(1)} s, ${kit.dir})`)}`));
|
|
50
50
|
return { path: kit.package, swiftFlags: kitSwiftFlags(kit), kit };
|
|
51
51
|
}
|
|
52
|
-
|
|
52
|
+
/** `stageOptions.tests` stages the app with its test targets (`swiftbrowser test`; stage.ts). */
|
|
53
|
+
export async function prepare(input, options, shimPackage = swiftPackagePath(), stageOptions = {}) {
|
|
53
54
|
const resolveOptions = {};
|
|
54
55
|
if (options.target)
|
|
55
56
|
resolveOptions.target = options.target;
|
|
@@ -74,7 +75,7 @@ export async function prepare(input, options, shimPackage = swiftPackagePath())
|
|
|
74
75
|
modules.set(module, copy.name);
|
|
75
76
|
}
|
|
76
77
|
const report = compatReport(app.sources, modules);
|
|
77
|
-
const staged = stage(app, shimPackage, { vendored });
|
|
78
|
+
const staged = stage(app, shimPackage, { vendored, ...(stageOptions.tests ? { tests: true } : {}) });
|
|
78
79
|
for (const warning of staged.localizationWarnings)
|
|
79
80
|
info(warn(`string tables: ${warning}`));
|
|
80
81
|
return { app, report, staged, vendored };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/commands/shared.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/commands/shared.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { type StagedApp } from '../stage.js';
|
|
2
|
+
import { type AppOptions } from './shared.js';
|
|
3
|
+
export interface TestOptions extends AppOptions {
|
|
4
|
+
verbose?: boolean;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* The testing libraries to run, from the tests' imports: a module runs both
|
|
8
|
+
* XCTest's tests and Swift Testing's, each only when some test imports it
|
|
9
|
+
* (both when neither import is found).
|
|
10
|
+
*/
|
|
11
|
+
export declare function testingLibraries(sources: readonly string[]): {
|
|
12
|
+
xctest: boolean;
|
|
13
|
+
swiftTesting: boolean;
|
|
14
|
+
};
|
|
15
|
+
export declare function test(input: string, options: TestOptions): Promise<void>;
|
|
16
|
+
/**
|
|
17
|
+
* Runs one test module in a child process (testRunner.ts), printing its output
|
|
18
|
+
* with staged paths mapped back to the user's files; resolves to its exit status.
|
|
19
|
+
* Both of its streams print to stdout, where the rest of the command's output
|
|
20
|
+
* goes: XCTest reports on stdout, Swift Testing on stderr.
|
|
21
|
+
*/
|
|
22
|
+
export declare function runTestModule(module: string, args: readonly string[], staged: StagedApp): Promise<number>;
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
// `swiftbrowser test <path>`: the app's unit tests (the Xcode unit-test
|
|
2
|
+
// targets hosted by the app, or a folder's `*Tests` folders) built for
|
|
3
|
+
// WebAssembly against the shim and run under Node's WASI, in the runtime the
|
|
4
|
+
// browser runs the app in. XCTest and Swift Testing both run, as with
|
|
5
|
+
// `swift test`.
|
|
6
|
+
import { spawn } from 'node:child_process';
|
|
7
|
+
import { readFileSync } from 'node:fs';
|
|
8
|
+
import path from 'node:path';
|
|
9
|
+
import { createInterface } from 'node:readline';
|
|
10
|
+
import { fileURLToPath } from 'node:url';
|
|
11
|
+
import { buildTests } from '../build.js';
|
|
12
|
+
import { importsOf } from '../compat.js';
|
|
13
|
+
import { CliError, bold, dim, info, ok } from '../log.js';
|
|
14
|
+
import { remapDiagnostics } from '../stage.js';
|
|
15
|
+
import { describeApp, describeReport, prepare, requireToolchain, wasmShim } from './shared.js';
|
|
16
|
+
/** The runner script (testRunner.ts), beside this command's folder in dist/. */
|
|
17
|
+
const RUNNER = fileURLToPath(new URL('../testRunner.js', import.meta.url));
|
|
18
|
+
/** Swift Testing's exit status when no test ran (EX_UNAVAILABLE): not a failure. */
|
|
19
|
+
const NO_TESTS_RAN = 69;
|
|
20
|
+
/**
|
|
21
|
+
* The testing libraries to run, from the tests' imports: a module runs both
|
|
22
|
+
* XCTest's tests and Swift Testing's, each only when some test imports it
|
|
23
|
+
* (both when neither import is found).
|
|
24
|
+
*/
|
|
25
|
+
export function testingLibraries(sources) {
|
|
26
|
+
const imported = new Set(sources.flatMap((text) => importsOf(text)));
|
|
27
|
+
const xctest = imported.has('XCTest');
|
|
28
|
+
const swiftTesting = imported.has('Testing');
|
|
29
|
+
return xctest || swiftTesting ? { xctest, swiftTesting } : { xctest: true, swiftTesting: true };
|
|
30
|
+
}
|
|
31
|
+
export async function test(input, options) {
|
|
32
|
+
const shim = await wasmShim(options.verbose ? { verbose: true } : {});
|
|
33
|
+
const { app, report, staged, vendored } = await prepare(input, options, shim.path, { tests: true });
|
|
34
|
+
describeApp(app);
|
|
35
|
+
describeReport(report, app, vendored);
|
|
36
|
+
const targets = app.tests ?? [];
|
|
37
|
+
if (targets.length === 0) {
|
|
38
|
+
const where = app.origin.kind === 'xcodeproj'
|
|
39
|
+
? `a Unit Testing Bundle target that tests ${app.origin.target} (Xcode: File › New › Target)`
|
|
40
|
+
: 'Swift files in a Tests or <Name>Tests folder';
|
|
41
|
+
throw new CliError(`no unit tests found for ${app.name}; add ${where}`);
|
|
42
|
+
}
|
|
43
|
+
for (const target of targets)
|
|
44
|
+
info(dim(` tests: ${target.name}, ${target.sources.length} Swift file${target.sources.length === 1 ? '' : 's'}`));
|
|
45
|
+
const toolchain = requireToolchain({ wasm: true });
|
|
46
|
+
info(dim(`\nbuilding ${app.name}'s tests for WebAssembly (debug)…`));
|
|
47
|
+
const started = Date.now();
|
|
48
|
+
const modules = await buildTests({
|
|
49
|
+
toolchain,
|
|
50
|
+
staged,
|
|
51
|
+
app,
|
|
52
|
+
swiftFlags: shim.swiftFlags,
|
|
53
|
+
...(options.verbose ? { onOutput: (chunk) => process.stdout.write(chunk) } : {}),
|
|
54
|
+
});
|
|
55
|
+
info(ok(`built ${dim(`(${((Date.now() - started) / 1000).toFixed(1)} s)`)}`));
|
|
56
|
+
const libraries = testingLibraries(targets.flatMap((target) => target.sources.map((file) => readFileSync(file, 'utf8'))));
|
|
57
|
+
const passes = [
|
|
58
|
+
...(libraries.xctest ? [{ library: 'XCTest', args: [] }] : []),
|
|
59
|
+
...(libraries.swiftTesting ? [{ library: 'Swift Testing', args: ['--testing-library', 'swift-testing'] }] : []),
|
|
60
|
+
];
|
|
61
|
+
const failed = [];
|
|
62
|
+
for (const module of modules) {
|
|
63
|
+
const name = path.basename(module).replace(/(-test-runner\.wasm|\.xctest)$/, '');
|
|
64
|
+
for (const pass of passes) {
|
|
65
|
+
info(dim(`\n${name} · ${pass.library}`));
|
|
66
|
+
const status = await runTestModule(module, pass.args, staged);
|
|
67
|
+
if (status !== 0 && !(pass.library === 'Swift Testing' && status === NO_TESTS_RAN))
|
|
68
|
+
failed.push(`${name} (${pass.library})`);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
const elapsed = dim(`(${((Date.now() - started) / 1000).toFixed(1)} s)`);
|
|
72
|
+
if (failed.length > 0)
|
|
73
|
+
throw new CliError(`\n${bold(`${app.name}'s tests failed`)}: ${failed.join(', ')} ${elapsed}`);
|
|
74
|
+
info('');
|
|
75
|
+
info(ok(`${bold(app.name)}'s tests passed ${elapsed}`));
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Runs one test module in a child process (testRunner.ts), printing its output
|
|
79
|
+
* with staged paths mapped back to the user's files; resolves to its exit status.
|
|
80
|
+
* Both of its streams print to stdout, where the rest of the command's output
|
|
81
|
+
* goes: XCTest reports on stdout, Swift Testing on stderr.
|
|
82
|
+
*/
|
|
83
|
+
export function runTestModule(module, args, staged) {
|
|
84
|
+
return new Promise((resolve, reject) => {
|
|
85
|
+
const child = spawn(process.execPath, ['--no-warnings', RUNNER, module, ...args], { stdio: ['ignore', 'pipe', 'pipe'] });
|
|
86
|
+
const forward = (stream) => {
|
|
87
|
+
createInterface({ input: stream, crlfDelay: Infinity }).on('line', (line) => process.stdout.write(`${remapDiagnostics(line, staged)}\n`));
|
|
88
|
+
};
|
|
89
|
+
forward(child.stdout);
|
|
90
|
+
forward(child.stderr);
|
|
91
|
+
child.on('error', reject);
|
|
92
|
+
child.on('close', (status) => resolve(status ?? 1));
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test.js","sourceRoot":"","sources":["../../src/commands/test.ts"],"names":[],"mappings":"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"}
|
package/dist/project.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { SwiftPackageReference } from '@swiftbrowser/xcodeproj';
|
|
1
2
|
import { type SwiftLanguageMode } from './config.js';
|
|
2
3
|
import { type AppPackage } from './packages.js';
|
|
3
4
|
import { type SwiftSettings } from './buildSettings.js';
|
|
@@ -64,7 +65,22 @@ export interface ResolvedApp {
|
|
|
64
65
|
} | {
|
|
65
66
|
kind: 'folder';
|
|
66
67
|
};
|
|
68
|
+
/**
|
|
69
|
+
* The app's unit tests, for `swiftbrowser test` (testTargets): the Xcode
|
|
70
|
+
* unit-test targets hosted by the app, or a folder's `*Tests` folders.
|
|
71
|
+
* Absent means none.
|
|
72
|
+
*/
|
|
73
|
+
tests?: TestTarget[];
|
|
74
|
+
}
|
|
75
|
+
/** A unit-test target of the app: a module of tests that `@testable import` it. */
|
|
76
|
+
export interface TestTarget {
|
|
77
|
+
/** Swift module name. */
|
|
78
|
+
name: string;
|
|
79
|
+
/** Absolute paths of its Swift sources. */
|
|
80
|
+
sources: string[];
|
|
67
81
|
}
|
|
82
|
+
/** Xcode's product type of a unit-test bundle (UI tests, `bundle.ui-testing`, drive a simulator and are not run). */
|
|
83
|
+
export declare const UNIT_TEST_PRODUCT_TYPE = "com.apple.product-type.bundle.unit-test";
|
|
68
84
|
export interface ResolveOptions {
|
|
69
85
|
target?: string;
|
|
70
86
|
configFile?: string;
|
|
@@ -73,6 +89,18 @@ export interface ResolveOptions {
|
|
|
73
89
|
export declare function moduleName(raw: string): string;
|
|
74
90
|
/** A Core ML model Xcode compiles into a class: an `.mlmodel` file or an `.mlpackage` bundle. */
|
|
75
91
|
export declare function isCoreMLModel(file: string): boolean;
|
|
92
|
+
/**
|
|
93
|
+
* The unit tests of a folder of sources, by convention: the `.swift` files
|
|
94
|
+
* under its `Tests` and `*Tests` folders (`*UITests` excepted), which the app's
|
|
95
|
+
* sources leave out, as one target `<app>Tests`.
|
|
96
|
+
*/
|
|
97
|
+
export declare function discoverTests(dir: string, appName: string): TestTarget[];
|
|
98
|
+
/**
|
|
99
|
+
* The Xcode unit-test targets that test `app`: those that depend on it or
|
|
100
|
+
* load into it (`TEST_HOST`, `BUNDLE_LOADER` naming its product). Each is a
|
|
101
|
+
* module of its own, as in Xcode.
|
|
102
|
+
*/
|
|
103
|
+
export declare function xcodeTestTargets(targets: readonly XcodeTargetLike[], app: XcodeTargetLike): TestTarget[];
|
|
76
104
|
/** Every `.swift` file, Core ML model and `.xcassets` folder under `dir`, by convention. */
|
|
77
105
|
export declare function discoverByConvention(dir: string): {
|
|
78
106
|
sources: string[];
|
|
@@ -84,6 +112,29 @@ export declare function discoverByConvention(dir: string): {
|
|
|
84
112
|
export declare function findAppIcon(catalogs: readonly string[], iconName?: string): string | undefined;
|
|
85
113
|
/** `.xcodeproj` bundles directly in `dir`, else one level down. */
|
|
86
114
|
export declare function xcodeProjectsIn(dir: string): string[];
|
|
115
|
+
interface XcodeTargetLike {
|
|
116
|
+
name: string;
|
|
117
|
+
productName: string;
|
|
118
|
+
productType: string;
|
|
119
|
+
displayName?: string;
|
|
120
|
+
appIconName?: string;
|
|
121
|
+
swiftVersion?: string;
|
|
122
|
+
sources: string[];
|
|
123
|
+
/** Absent in @swiftbrowser/xcodeproj releases before Core ML models were read. */
|
|
124
|
+
models?: string[];
|
|
125
|
+
/** String catalogs and `.strings` / `.stringsdict` files; absent in older @swiftbrowser/xcodeproj releases. */
|
|
126
|
+
localizations?: string[];
|
|
127
|
+
resources: string[];
|
|
128
|
+
assetCatalogs: string[];
|
|
129
|
+
packageDependencies?: {
|
|
130
|
+
product: string;
|
|
131
|
+
package?: SwiftPackageReference;
|
|
132
|
+
}[];
|
|
133
|
+
/** Names of the targets it depends on; absent in older @swiftbrowser/xcodeproj releases' typings. */
|
|
134
|
+
dependencies?: string[];
|
|
135
|
+
/** Build settings (`INFOPLIST_FILE` for the URL schemes); absent in older @swiftbrowser/xcodeproj releases' typings. */
|
|
136
|
+
settings?(configuration?: string): Record<string, string>;
|
|
137
|
+
}
|
|
87
138
|
/** The Xcode target's copied resources: everything but asset catalogs and compiled resources, in project order. */
|
|
88
139
|
export declare function bundleResources(resources: readonly string[]): string[];
|
|
89
140
|
/** Resolves `input` (an .xcodeproj, a folder with one, or a folder of sources) to an app. */
|
|
@@ -95,3 +146,4 @@ export declare function resolveApp(input: string, options?: ResolveOptions): Pro
|
|
|
95
146
|
* against its directory; the path comes back unchanged when nothing matches.
|
|
96
147
|
*/
|
|
97
148
|
export declare function repairCase(file: string): string;
|
|
149
|
+
export {};
|