Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 36 additions & 0 deletions cli/src/declarations.ts
Original file line number Diff line number Diff line change
Expand Up @@ -509,6 +509,42 @@ export interface CapacitorConfig {
};
};

experimental?: {
/**
* Experimental iOS-specific configuration.
*
* These options may change or be removed in future versions.
*
* @since 8.2.0
*/
ios?: {
/**
* Swift Package Manager (SPM) specific configuration.
*
* @since 8.2.0
*/
spm?: {
/**
* Swift tools version to use in Package.swift header.
*
* Defines the minimum version of the Swift compiler version required to build your app.
* For more information check the [swift documentation](https://docs.swift.org/swiftpm/documentation/packagemanagerdocs/settingswifttoolsversion/)
*
* Warning: Capacitor does not officially support Swift 6 yet.
* Setting this property to 6.0 or higher may cause issues.
* If you need to set this property to 6.0 or higher, make sure to throughrouly test your iOS app.
*
* This setting may graduate to `ios.spm.swiftToolsVersion` in a future major release.
*
* @since 8.2.0
* @default '5.9'
* @example '6.1'
*/
swiftToolsVersion?: string;
};
};
};

server?: {
/**
* Configure the local hostname of the device.
Expand Down
6 changes: 6 additions & 0 deletions cli/src/ios/common.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import type { Config } from '../definitions';
import { logger } from '../log';
import { PluginType, getPluginPlatform } from '../plugin';
import type { Plugin } from '../plugin';
import { checkSwiftToolsVersion } from '../util/spm';
import { isInstalled, runCommand } from '../util/subprocess';

export async function checkIOSPackage(config: Config): Promise<string | null> {
Expand All @@ -32,6 +33,11 @@ export async function getCommonChecks(config: Config): Promise<CheckFunction[]>
checks.push(() => checkBundler(config));
} else if ((await config.ios.packageManager) === 'Cocoapods') {
checks.push(() => checkCocoaPods(config));
} else if ((await config.ios.packageManager) === 'SPM') {
const swiftToolsVersion = config.app.extConfig.experimental?.ios?.spm?.swiftToolsVersion;
if (swiftToolsVersion) {
checks.push(() => checkSwiftToolsVersion(config, swiftToolsVersion));
}
}
return checks;
}
Expand Down
20 changes: 19 additions & 1 deletion cli/src/util/spm.ts
Original file line number Diff line number Diff line change
Expand Up @@ -98,8 +98,9 @@ export async function removeCocoapodsFiles(config: Config): Promise<void> {
export async function generatePackageText(config: Config, plugins: Plugin[]): Promise<string> {
const iosPlatformVersion = await getCapacitorPackageVersion(config, config.ios.name);
const iosVersion = getMajoriOSVersion(config);
const swiftToolsVersion = config.app.extConfig.experimental?.ios?.spm?.swiftToolsVersion ?? '5.9';

let packageSwiftText = `// swift-tools-version: 5.9
let packageSwiftText = `// swift-tools-version: ${swiftToolsVersion}
import PackageDescription

// DO NOT MODIFY THIS FILE - managed by Capacitor CLI commands
Expand Down Expand Up @@ -188,6 +189,23 @@ export async function addInfoPlistDebugIfNeeded(config: Config): Promise<void> {
}
}

export async function checkSwiftToolsVersion(config: Config, version: string | undefined): Promise<string | null> {
if (!version) {
return null;
}

const swiftToolsVersionRegex = /^[0-9]+\.[0-9]+(\.[0-9]+)?$/;

if (!swiftToolsVersionRegex.test(version)) {
return (
`Invalid Swift tools version: "${version}".\n` +
`The Swift tools version must be in major.minor or major.minor.patch format (e.g., "5.9", "6.0", "5.9.2").`
);
}

return null;
}

// Private Functions

async function pluginsWithPackageSwift(plugins: Plugin[]): Promise<Plugin[]> {
Expand Down