diff --git a/cli/src/declarations.ts b/cli/src/declarations.ts index 6612eec77..41987e932 100644 --- a/cli/src/declarations.ts +++ b/cli/src/declarations.ts @@ -507,6 +507,21 @@ export interface CapacitorConfig { */ provisioningProfile?: string; }; + + spm?: { + /** + * Define package traits for SPM plugin dependencies. + * + * The key is the plugin ID (e.g. `@capacitor-firebase/analytics`) + * and the value is an array of trait names. + * + * Packages can have default traits. If you use this property, and + * want to preserve the defaults, include ".defaults" in the array. + * + * @since 8.2.0 + */ + packageTraits?: { [pluginId: string]: string[] }; + }; }; server?: { diff --git a/cli/src/util/spm.ts b/cli/src/util/spm.ts index 30e51cf1a..2bf8aea94 100644 --- a/cli/src/util/spm.ts +++ b/cli/src/util/spm.ts @@ -98,8 +98,11 @@ export async function removeCocoapodsFiles(config: Config): Promise { export async function generatePackageText(config: Config, plugins: Plugin[]): Promise { const iosPlatformVersion = await getCapacitorPackageVersion(config, config.ios.name); const iosVersion = getMajoriOSVersion(config); + const packageTraits = config.app.extConfig.ios?.spm?.packageTraits ?? {}; + const hasTraits = Object.keys(packageTraits).length > 0; + const swiftToolsVersion = hasTraits ? '6.1' : '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 @@ -119,7 +122,16 @@ let package = Package( packageSwiftText += `,\n .package(name: "${plugin.name}", path: "../../capacitor-cordova-ios-plugins/sources/${plugin.name}")`; } else { const relPath = relative(config.ios.nativeXcodeProjDirAbs, plugin.rootPath); - packageSwiftText += `,\n .package(name: "${plugin.ios?.name}", path: "${relPath}")`; + const traits = packageTraits[plugin.id]; + const traitsSuffix = traits?.length + ? `, traits: [${traits + .map((t) => { + // Any trait is written with quotes, with the exception of .defaults + return /^\.?defaults?$/i.test(t) ? '.defaults' : `"${t}"`; + }) + .join(', ')}]` + : ''; + packageSwiftText += `,\n .package(name: "${plugin.ios?.name}", path: "${relPath}"${traitsSuffix})`; } }