Skip to content
Draft
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
15 changes: 15 additions & 0 deletions cli/src/declarations.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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?: {
Expand Down
16 changes: 14 additions & 2 deletions cli/src/util/spm.ts
Original file line number Diff line number Diff line change
Expand Up @@ -98,8 +98,11 @@ 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 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
Expand All @@ -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})`;
}
}

Expand Down