@swifttui/build 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 CHANGED
@@ -31,7 +31,7 @@ This exposes the `swifttui-web` CLI (`npx swifttui-web build --app <Exe>`) and a
31
31
  programmatic ESM API. The package ships compiled `dist/` JavaScript — the bin
32
32
  runs on plain Node (`#!/usr/bin/env node`), no Bun or TypeScript toolchain
33
33
  required to consume it. Building a SwiftTUI app to wasm does require a Swift
34
- 6.3.x toolchain and the `swift-6.3.1-RELEASE_wasm` SDK on your machine.
34
+ 6.3.x toolchain and the `swift-6.3.3-RELEASE_wasm` SDK on your machine.
35
35
 
36
36
  ## Use
37
37
 
@@ -57,7 +57,7 @@ Toolchain defaults match the repo:
57
57
 
58
58
  - Swift command: `swiftly run swift` when `swiftly` is on `PATH`, otherwise
59
59
  `swift`
60
- - SDK: `swift-6.3.1-RELEASE_wasm`
60
+ - SDK: `swift-6.3.3-RELEASE_wasm`
61
61
  - Release Swift flags:
62
62
  `-Xswiftc -Osize -Xswiftc -Xfrontend -Xswiftc -disable-llvm-merge-functions-pass`
63
63
  - Initial memory: `536870912`
@@ -79,7 +79,7 @@ Callers can override `swiftCommand`, `swiftSDK`, `configuration`,
79
79
  > Only needed if you are working **on** `@swifttui/build` itself. Consuming it
80
80
  > from a project needs only `npm install --save-dev` (above).
81
81
 
82
- Use Bun for the CLI, bundling, and tests, and `swiftly` Swift 6.3.1 for the wasm
82
+ Use Bun for the CLI, bundling, and tests, and `swiftly` Swift 6.3.3 for the wasm
83
83
  build it invokes (not bare `swift`).
84
84
 
85
85
  - `bun test`
@@ -18,7 +18,7 @@ interface SwiftArtifactPaths {
18
18
  wasmPath: string;
19
19
  }
20
20
  declare const requiredWasmSwiftFlags: readonly ["-Xswiftc", "-Osize", "-Xswiftc", "-Xfrontend", "-Xswiftc", "-disable-llvm-merge-functions-pass"];
21
- declare const defaultWasmSwiftSDK = "swift-6.3.1-RELEASE_wasm";
21
+ declare const defaultWasmSwiftSDK = "swift-6.3.3-RELEASE_wasm";
22
22
  declare const defaultInitialMemory = "536870912";
23
23
  declare const defaultMaxMemory = "4294967296";
24
24
  declare const defaultStackSize = "16777216";
@@ -11,7 +11,7 @@ const requiredWasmSwiftFlags = [
11
11
  "-Xswiftc",
12
12
  "-disable-llvm-merge-functions-pass"
13
13
  ];
14
- const defaultWasmSwiftSDK = "swift-6.3.1-RELEASE_wasm";
14
+ const defaultWasmSwiftSDK = "swift-6.3.3-RELEASE_wasm";
15
15
  const defaultInitialMemory = "536870912";
16
16
  const defaultMaxMemory = "4294967296";
17
17
  const defaultStackSize = "16777216";
@@ -25,7 +25,7 @@ async function resolveSwiftArtifacts(options) {
25
25
  "--package-path",
26
26
  options.packagePath,
27
27
  "--swift-sdk",
28
- options.swiftSDK ?? "swift-6.3.1-RELEASE_wasm",
28
+ options.swiftSDK ?? "swift-6.3.3-RELEASE_wasm",
29
29
  "-c",
30
30
  configuration,
31
31
  ...requiredSwiftFlags(configuration),
@@ -1 +1 @@
1
- {"version":3,"file":"resolveSwiftArtifacts.js","names":[],"sources":["../../../src/build/resolveSwiftArtifacts.ts"],"sourcesContent":["import { access } from \"node:fs/promises\";\nimport { dirname, join, resolve } from \"node:path\";\nimport { runCommand } from \"./runCommand.ts\";\nimport { swiftCommandPrefix } from \"./swiftCommandPrefix.ts\";\n\nexport interface ResolveSwiftArtifactsOptions {\n configuration?: WasmBuildConfiguration;\n extraLinkerFlags?: readonly string[];\n extraSwiftBuildArgs?: readonly string[];\n extraSwiftcFlags?: readonly string[];\n initialMemory?: number | string;\n maxMemory?: number | string;\n packagePath: string;\n product: string;\n stackSize?: number | string;\n swiftCommand?: readonly string[];\n swiftSDK?: string;\n}\n\nexport type WasmBuildConfiguration = \"debug\" | \"release\";\n\nexport interface SwiftArtifactPaths {\n binPath: string;\n wasmPath: string;\n}\n\nexport const requiredWasmSwiftFlags = [\n \"-Xswiftc\",\n \"-Osize\",\n \"-Xswiftc\",\n \"-Xfrontend\",\n \"-Xswiftc\",\n \"-disable-llvm-merge-functions-pass\",\n] as const;\n\nexport const defaultWasmSwiftSDK = \"swift-6.3.1-RELEASE_wasm\";\nexport const defaultInitialMemory = \"536870912\";\nexport const defaultMaxMemory = \"4294967296\";\n// 16 MiB: the resolve descent's linear-memory (shadow) stack usage scales\n// with view-tree depth, and the non-lean profile's deep scenes measurably\n// overflow a 1 MiB stack (wasm \"memory access out of bounds\" at steady\n// state). The reservation is virtual against a 512 MiB initial memory.\nexport const defaultStackSize = \"16777216\";\n\nexport async function resolveSwiftArtifacts(\n options: ResolveSwiftArtifactsOptions\n): Promise<SwiftArtifactPaths> {\n const configuration = options.configuration ?? \"release\";\n const swiftlyWorkingDirectory = await resolveSwiftlyWorkingDirectory(options.packagePath);\n const swiftCommand = [...(options.swiftCommand ?? swiftCommandPrefix())];\n const environment = {\n ...process.env\n };\n\n // The browser WebAssembly API rejects function types with more than 1000\n // parameters. Swift's wasm release builds can trip that limit when LLVM's\n // merge-functions pass combines large outlined-copy helpers. `-Osize` helps,\n // but some Darwin CI runners still reproduce the failure unless we also\n // disable that merge pass explicitly.\n const swiftBuildArgs = [\n \"build\",\n \"--package-path\",\n options.packagePath,\n \"--swift-sdk\",\n options.swiftSDK ?? defaultWasmSwiftSDK,\n \"-c\",\n configuration,\n ...requiredSwiftFlags(configuration),\n ...swiftcFlags(options.extraSwiftcFlags),\n \"-Xlinker\",\n `--initial-memory=${options.initialMemory ?? defaultInitialMemory}`,\n \"-Xlinker\",\n `--max-memory=${options.maxMemory ?? defaultMaxMemory}`,\n \"-Xlinker\",\n \"-z\",\n \"-Xlinker\",\n `stack-size=${options.stackSize ?? defaultStackSize}`,\n ...linkerFlags(options.extraLinkerFlags),\n ...(options.extraSwiftBuildArgs ?? []),\n ];\n\n if (configuration === \"release\") {\n confirmRequiredWasmFlags(swiftBuildArgs);\n }\n\n const buildCommand = [\n ...swiftCommand,\n ...swiftBuildArgs,\n \"--product\",\n options.product,\n ];\n const showBinPathCommand = [\n ...swiftCommand,\n ...swiftBuildArgs,\n \"--show-bin-path\",\n ];\n\n logWasmBuildConfiguration({\n configuration,\n packagePath: options.packagePath,\n product: options.product,\n swiftlyWorkingDirectory,\n buildCommand,\n showBinPathCommand,\n });\n\n await runCommand(buildCommand, {\n cwd: swiftlyWorkingDirectory,\n env: environment,\n });\n\n const binPath = await runCommand(showBinPathCommand, {\n cwd: swiftlyWorkingDirectory,\n env: environment,\n });\n\n const wasmPath = join(binPath.trim(), `${options.product}.wasm`);\n return {\n binPath: binPath.trim(),\n wasmPath,\n };\n}\n\ninterface WasmBuildConfigurationLog {\n configuration?: WasmBuildConfiguration;\n packagePath: string;\n product: string;\n swiftlyWorkingDirectory: string;\n buildCommand: string[];\n showBinPathCommand: string[];\n}\n\nexport function hasRequiredWasmFlags(args: readonly string[]): boolean {\n return containsSubsequence(args, requiredWasmSwiftFlags);\n}\n\nfunction confirmRequiredWasmFlags(args: readonly string[]): void {\n if (hasRequiredWasmFlags(args)) {\n return;\n }\n\n throw new Error(\n `missing required wasm Swift flags: ${requiredWasmSwiftFlags.join(\" \")}`\n );\n}\n\nfunction requiredSwiftFlags(configuration: WasmBuildConfiguration): readonly string[] {\n switch (configuration) {\n case \"debug\":\n return [];\n case \"release\":\n return requiredWasmSwiftFlags;\n }\n}\n\nfunction swiftcFlags(flags: readonly string[] | undefined): string[] {\n return (flags ?? []).flatMap((flag) => [\"-Xswiftc\", flag]);\n}\n\nfunction linkerFlags(flags: readonly string[] | undefined): string[] {\n return (flags ?? []).flatMap((flag) => [\"-Xlinker\", flag]);\n}\n\nfunction logWasmBuildConfiguration(config: WasmBuildConfigurationLog): void {\n for (const line of wasmBuildConfigurationLogLines(config)) {\n console.error(line);\n }\n}\n\nexport function wasmBuildConfigurationLogLines(\n config: WasmBuildConfigurationLog\n): string[] {\n const configuration = config.configuration ?? \"release\";\n return [\n `WASM_BUILD_CONFIGURATION_NAME=${configuration}`,\n `WASM_REQUIRED_FLAGS_CONFIRMED=${configuration === \"release\" ? \"true\" : \"skipped\"}`,\n `WASM_REQUIRED_FLAGS=${requiredWasmSwiftFlags.join(\" \")}`,\n `WASM_REQUIRED_FLAGS_JSON=${JSON.stringify([...requiredWasmSwiftFlags])}`,\n `WASM_BUILD_COMMAND=${formatCommandForLogs(config.buildCommand)}`,\n `WASM_BUILD_COMMAND_ARGS_JSON=${JSON.stringify(config.buildCommand)}`,\n `WASM_SHOW_BIN_PATH_COMMAND=${formatCommandForLogs(config.showBinPathCommand)}`,\n `WASM_SHOW_BIN_PATH_COMMAND_ARGS_JSON=${JSON.stringify(config.showBinPathCommand)}`,\n `WASM_BUILD_CONFIGURATION ${JSON.stringify({\n packagePath: config.packagePath,\n product: config.product,\n configuration,\n swiftlyWorkingDirectory: config.swiftlyWorkingDirectory,\n requiredFlags: [...requiredWasmSwiftFlags],\n buildCommand: formatCommandForLogs(config.buildCommand),\n showBinPathCommand: formatCommandForLogs(config.showBinPathCommand),\n })}`,\n ];\n}\n\nexport function formatCommandForLogs(args: readonly string[]): string {\n return args.map(shellQuote).join(\" \");\n}\n\nfunction containsSubsequence(\n args: readonly string[],\n expected: readonly string[]\n): boolean {\n if (expected.length == 0) {\n return true;\n }\n\n for (let index = 0; index <= args.length - expected.length; index += 1) {\n let matches = true;\n for (let expectedIndex = 0; expectedIndex < expected.length; expectedIndex += 1) {\n if (args[index + expectedIndex] !== expected[expectedIndex]) {\n matches = false;\n break;\n }\n }\n if (matches) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction shellQuote(arg: string): string {\n if (/^[A-Za-z0-9_./:=+-]+$/.test(arg)) {\n return arg;\n }\n\n return `'${arg.replaceAll(\"'\", `'\\\\''`)}'`;\n}\n\nasync function resolveSwiftlyWorkingDirectory(\n startPath: string\n): Promise<string> {\n let currentPath = resolve(startPath);\n\n while (true) {\n if (await fileExists(join(currentPath, \".swift-version\"))) {\n return currentPath;\n }\n\n const parentPath = dirname(currentPath);\n if (parentPath === currentPath) {\n return resolve(startPath);\n }\n\n currentPath = parentPath;\n }\n}\n\nasync function fileExists(path: string): Promise<boolean> {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"resolveSwiftArtifacts.js","names":[],"sources":["../../../src/build/resolveSwiftArtifacts.ts"],"sourcesContent":["import { access } from \"node:fs/promises\";\nimport { dirname, join, resolve } from \"node:path\";\nimport { runCommand } from \"./runCommand.ts\";\nimport { swiftCommandPrefix } from \"./swiftCommandPrefix.ts\";\n\nexport interface ResolveSwiftArtifactsOptions {\n configuration?: WasmBuildConfiguration;\n extraLinkerFlags?: readonly string[];\n extraSwiftBuildArgs?: readonly string[];\n extraSwiftcFlags?: readonly string[];\n initialMemory?: number | string;\n maxMemory?: number | string;\n packagePath: string;\n product: string;\n stackSize?: number | string;\n swiftCommand?: readonly string[];\n swiftSDK?: string;\n}\n\nexport type WasmBuildConfiguration = \"debug\" | \"release\";\n\nexport interface SwiftArtifactPaths {\n binPath: string;\n wasmPath: string;\n}\n\nexport const requiredWasmSwiftFlags = [\n \"-Xswiftc\",\n \"-Osize\",\n \"-Xswiftc\",\n \"-Xfrontend\",\n \"-Xswiftc\",\n \"-disable-llvm-merge-functions-pass\",\n] as const;\n\n// Must track the toolchain pinned in the repo root's `.swift-version`: CI\n// runners install only the wasm SDK matching that version, so a stale id here\n// fails to resolve on a clean runner while still working on any machine that\n// still has the older SDK installed. `resolveSwiftArtifacts.test.ts` pins the\n// two together.\nexport const defaultWasmSwiftSDK = \"swift-6.3.3-RELEASE_wasm\";\nexport const defaultInitialMemory = \"536870912\";\nexport const defaultMaxMemory = \"4294967296\";\n// 16 MiB: the resolve descent's linear-memory (shadow) stack usage scales\n// with view-tree depth, and the non-lean profile's deep scenes measurably\n// overflow a 1 MiB stack (wasm \"memory access out of bounds\" at steady\n// state). The reservation is virtual against a 512 MiB initial memory.\nexport const defaultStackSize = \"16777216\";\n\nexport async function resolveSwiftArtifacts(\n options: ResolveSwiftArtifactsOptions\n): Promise<SwiftArtifactPaths> {\n const configuration = options.configuration ?? \"release\";\n const swiftlyWorkingDirectory = await resolveSwiftlyWorkingDirectory(options.packagePath);\n const swiftCommand = [...(options.swiftCommand ?? swiftCommandPrefix())];\n const environment = {\n ...process.env\n };\n\n // The browser WebAssembly API rejects function types with more than 1000\n // parameters. Swift's wasm release builds can trip that limit when LLVM's\n // merge-functions pass combines large outlined-copy helpers. `-Osize` helps,\n // but some Darwin CI runners still reproduce the failure unless we also\n // disable that merge pass explicitly.\n const swiftBuildArgs = [\n \"build\",\n \"--package-path\",\n options.packagePath,\n \"--swift-sdk\",\n options.swiftSDK ?? defaultWasmSwiftSDK,\n \"-c\",\n configuration,\n ...requiredSwiftFlags(configuration),\n ...swiftcFlags(options.extraSwiftcFlags),\n \"-Xlinker\",\n `--initial-memory=${options.initialMemory ?? defaultInitialMemory}`,\n \"-Xlinker\",\n `--max-memory=${options.maxMemory ?? defaultMaxMemory}`,\n \"-Xlinker\",\n \"-z\",\n \"-Xlinker\",\n `stack-size=${options.stackSize ?? defaultStackSize}`,\n ...linkerFlags(options.extraLinkerFlags),\n ...(options.extraSwiftBuildArgs ?? []),\n ];\n\n if (configuration === \"release\") {\n confirmRequiredWasmFlags(swiftBuildArgs);\n }\n\n const buildCommand = [\n ...swiftCommand,\n ...swiftBuildArgs,\n \"--product\",\n options.product,\n ];\n const showBinPathCommand = [\n ...swiftCommand,\n ...swiftBuildArgs,\n \"--show-bin-path\",\n ];\n\n logWasmBuildConfiguration({\n configuration,\n packagePath: options.packagePath,\n product: options.product,\n swiftlyWorkingDirectory,\n buildCommand,\n showBinPathCommand,\n });\n\n await runCommand(buildCommand, {\n cwd: swiftlyWorkingDirectory,\n env: environment,\n });\n\n const binPath = await runCommand(showBinPathCommand, {\n cwd: swiftlyWorkingDirectory,\n env: environment,\n });\n\n const wasmPath = join(binPath.trim(), `${options.product}.wasm`);\n return {\n binPath: binPath.trim(),\n wasmPath,\n };\n}\n\ninterface WasmBuildConfigurationLog {\n configuration?: WasmBuildConfiguration;\n packagePath: string;\n product: string;\n swiftlyWorkingDirectory: string;\n buildCommand: string[];\n showBinPathCommand: string[];\n}\n\nexport function hasRequiredWasmFlags(args: readonly string[]): boolean {\n return containsSubsequence(args, requiredWasmSwiftFlags);\n}\n\nfunction confirmRequiredWasmFlags(args: readonly string[]): void {\n if (hasRequiredWasmFlags(args)) {\n return;\n }\n\n throw new Error(\n `missing required wasm Swift flags: ${requiredWasmSwiftFlags.join(\" \")}`\n );\n}\n\nfunction requiredSwiftFlags(configuration: WasmBuildConfiguration): readonly string[] {\n switch (configuration) {\n case \"debug\":\n return [];\n case \"release\":\n return requiredWasmSwiftFlags;\n }\n}\n\nfunction swiftcFlags(flags: readonly string[] | undefined): string[] {\n return (flags ?? []).flatMap((flag) => [\"-Xswiftc\", flag]);\n}\n\nfunction linkerFlags(flags: readonly string[] | undefined): string[] {\n return (flags ?? []).flatMap((flag) => [\"-Xlinker\", flag]);\n}\n\nfunction logWasmBuildConfiguration(config: WasmBuildConfigurationLog): void {\n for (const line of wasmBuildConfigurationLogLines(config)) {\n console.error(line);\n }\n}\n\nexport function wasmBuildConfigurationLogLines(\n config: WasmBuildConfigurationLog\n): string[] {\n const configuration = config.configuration ?? \"release\";\n return [\n `WASM_BUILD_CONFIGURATION_NAME=${configuration}`,\n `WASM_REQUIRED_FLAGS_CONFIRMED=${configuration === \"release\" ? \"true\" : \"skipped\"}`,\n `WASM_REQUIRED_FLAGS=${requiredWasmSwiftFlags.join(\" \")}`,\n `WASM_REQUIRED_FLAGS_JSON=${JSON.stringify([...requiredWasmSwiftFlags])}`,\n `WASM_BUILD_COMMAND=${formatCommandForLogs(config.buildCommand)}`,\n `WASM_BUILD_COMMAND_ARGS_JSON=${JSON.stringify(config.buildCommand)}`,\n `WASM_SHOW_BIN_PATH_COMMAND=${formatCommandForLogs(config.showBinPathCommand)}`,\n `WASM_SHOW_BIN_PATH_COMMAND_ARGS_JSON=${JSON.stringify(config.showBinPathCommand)}`,\n `WASM_BUILD_CONFIGURATION ${JSON.stringify({\n packagePath: config.packagePath,\n product: config.product,\n configuration,\n swiftlyWorkingDirectory: config.swiftlyWorkingDirectory,\n requiredFlags: [...requiredWasmSwiftFlags],\n buildCommand: formatCommandForLogs(config.buildCommand),\n showBinPathCommand: formatCommandForLogs(config.showBinPathCommand),\n })}`,\n ];\n}\n\nexport function formatCommandForLogs(args: readonly string[]): string {\n return args.map(shellQuote).join(\" \");\n}\n\nfunction containsSubsequence(\n args: readonly string[],\n expected: readonly string[]\n): boolean {\n if (expected.length == 0) {\n return true;\n }\n\n for (let index = 0; index <= args.length - expected.length; index += 1) {\n let matches = true;\n for (let expectedIndex = 0; expectedIndex < expected.length; expectedIndex += 1) {\n if (args[index + expectedIndex] !== expected[expectedIndex]) {\n matches = false;\n break;\n }\n }\n if (matches) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction shellQuote(arg: string): string {\n if (/^[A-Za-z0-9_./:=+-]+$/.test(arg)) {\n return arg;\n }\n\n return `'${arg.replaceAll(\"'\", `'\\\\''`)}'`;\n}\n\nasync function resolveSwiftlyWorkingDirectory(\n startPath: string\n): Promise<string> {\n let currentPath = resolve(startPath);\n\n while (true) {\n if (await fileExists(join(currentPath, \".swift-version\"))) {\n return currentPath;\n }\n\n const parentPath = dirname(currentPath);\n if (parentPath === currentPath) {\n return resolve(startPath);\n }\n\n currentPath = parentPath;\n }\n}\n\nasync function fileExists(path: string): Promise<boolean> {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@swifttui/build",
3
- "version": "0.2.0",
3
+ "version": "0.3.1",
4
4
  "license": "MIT",
5
5
  "repository": {
6
6
  "type": "git",
@@ -39,7 +39,7 @@
39
39
  "access": "public"
40
40
  },
41
41
  "dependencies": {
42
- "@swifttui/web": "0.2.0"
42
+ "@swifttui/web": "0.3.1"
43
43
  },
44
44
  "devDependencies": {
45
45
  "@types/bun": "1.3.13"