From 90cd6ba9ae3844f8e5a176a3961ecceb32c9d051 Mon Sep 17 00:00:00 2001 From: Mark Anderson Date: Tue, 18 Aug 2026 13:55:33 -0400 Subject: [PATCH 1/6] feat: include option to force cordova inclusion Signed-off-by: Mark Anderson --- cli/src/android/update.ts | 2 +- cli/src/config.ts | 2 ++ cli/src/declarations.ts | 9 +++++++++ cli/src/definitions.ts | 1 + cli/src/ios/update.ts | 2 +- cli/src/util/spm.ts | 2 +- 6 files changed, 15 insertions(+), 3 deletions(-) diff --git a/cli/src/android/update.ts b/cli/src/android/update.ts index 8da8d8d9d2..64b8087bab 100644 --- a/cli/src/android/update.ts +++ b/cli/src/android/update.ts @@ -37,7 +37,7 @@ export async function updateAndroid(config: Config): Promise { printPlugins(capacitorPlugins, 'android'); const cordovaPlugins = plugins.filter((p) => getPluginType(p, platform) === PluginType.Cordova); - const enableCordova = cordovaPlugins.length > 0; + const enableCordova = cordovaPlugins.length > 0 || config.app.forceCordova; await writePluginsJson(config, capacitorPlugins, enableCordova); await removePluginsNativeFiles(config); diff --git a/cli/src/config.ts b/cli/src/config.ts index 9c6c5183d8..6a13cfbeaf 100644 --- a/cli/src/config.ts +++ b/cli/src/config.ts @@ -53,6 +53,7 @@ export async function loadConfig(): Promise { const appId = conf.extConfig.appId ?? ''; const appName = conf.extConfig.appName ?? ''; const webDir = conf.extConfig.webDir ?? 'www'; + const forceCordova = conf.extConfig.forceCordovaInclusion ?? false; const cli = await loadCLIConfig(cliRootDir); const config: Config = { @@ -66,6 +67,7 @@ export async function loadConfig(): Promise { appName, webDir, webDirAbs: resolve(appRootDir, webDir), + forceCordova, package: (await tryFn(readJSON, resolve(appRootDir, 'package.json'))) ?? { name: appName, version: '1.0.0', diff --git a/cli/src/declarations.ts b/cli/src/declarations.ts index 1103b65850..1af912f8c1 100644 --- a/cli/src/declarations.ts +++ b/cli/src/declarations.ts @@ -85,6 +85,15 @@ export interface CapacitorConfig { */ initialFocus?: boolean; + /** + * If set, will include Cordova support libraries regardless + * of whether or not they are needed by plugins. + * + * @since 9.0.0 + * @default false + */ + forceCordovaInclusion?: boolean; + android?: { /** * Specify a custom path to the native Android project. diff --git a/cli/src/definitions.ts b/cli/src/definitions.ts index 2df6398e97..56bf3cdb5c 100644 --- a/cli/src/definitions.ts +++ b/cli/src/definitions.ts @@ -65,6 +65,7 @@ export interface AppConfig { readonly extConfigName: string; readonly extConfigFilePath: string; readonly extConfig: ExternalConfig; + readonly forceCordova: boolean; } export interface AndroidConfig extends PlatformConfig { diff --git a/cli/src/ios/update.ts b/cli/src/ios/update.ts index 93a1ad4b55..1cfb6d08b2 100644 --- a/cli/src/ios/update.ts +++ b/cli/src/ios/update.ts @@ -43,7 +43,7 @@ export async function updateIOS(config: Config, deployment: boolean): Promise getPluginType(p, platform) === PluginType.Cordova); - const enableCordova = cordovaPlugins.length > 0; + const enableCordova = cordovaPlugins.length > 0 || config.app.forceCordova; if (enableCordova) { logger.info('Found Cordova Plugins: Including iOS Cordova Support'); diff --git a/cli/src/util/spm.ts b/cli/src/util/spm.ts index 3243c3efd3..1ef002b386 100644 --- a/cli/src/util/spm.ts +++ b/cli/src/util/spm.ts @@ -101,7 +101,7 @@ export async function generatePackageText(config: Config, plugins: Plugin[]): Pr const iosPlatformVersion = await getCapacitorPackageVersion(config, config.ios.name); const iosVersion = getMajoriOSVersion(config); const cordovaPlugins = await getCordovaPlugins(config, 'ios'); - const enableCordova = cordovaPlugins.length > 0; + const enableCordova = cordovaPlugins.length > 0 || config.app.forceCordova; const packageTraits = config.app.extConfig.experimental?.ios?.spm?.packageTraits ?? {}; const packageOptions = config.app.extConfig.experimental?.ios?.spm?.packageOptions ?? {}; const swiftToolsVersion = config.app.extConfig.experimental?.ios?.spm?.swiftToolsVersion ?? '5.9'; From 8935972600aaeedd57ad623d89b479c426acee86 Mon Sep 17 00:00:00 2001 From: Mark Anderson Date: Tue, 18 Aug 2026 14:27:35 -0400 Subject: [PATCH 2/6] npm run fmt --- cli/src/declarations.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cli/src/declarations.ts b/cli/src/declarations.ts index 1af912f8c1..8d1a40e627 100644 --- a/cli/src/declarations.ts +++ b/cli/src/declarations.ts @@ -86,7 +86,7 @@ export interface CapacitorConfig { initialFocus?: boolean; /** - * If set, will include Cordova support libraries regardless + * If set, will include Cordova support libraries regardless * of whether or not they are needed by plugins. * * @since 9.0.0 From bce0fa0001336fde62e75c35e9a98aaa36648f88 Mon Sep 17 00:00:00 2001 From: Mark Anderson Date: Tue, 18 Aug 2026 14:41:33 -0400 Subject: [PATCH 3/6] fix test --- cli/test/framework-detection.spec.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/cli/test/framework-detection.spec.ts b/cli/test/framework-detection.spec.ts index 46727753cd..725398dd4b 100644 --- a/cli/test/framework-detection.spec.ts +++ b/cli/test/framework-detection.spec.ts @@ -15,6 +15,7 @@ describe('framework detection', () => { appName: 'appName', webDir: '', webDirAbs: '', + forceCordova: false, package: { name: 'package-name', version: '0.0.0', From 45bbf874e3e0fce68216c94240cb43ef95927141 Mon Sep 17 00:00:00 2001 From: Mark Anderson Date: Thu, 20 Aug 2026 10:05:05 -0400 Subject: [PATCH 4/6] Fix missing forceCordova check --- cli/src/android/update.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cli/src/android/update.ts b/cli/src/android/update.ts index 64b8087bab..ecd83eb27b 100644 --- a/cli/src/android/update.ts +++ b/cli/src/android/update.ts @@ -157,7 +157,7 @@ export async function installGradlePlugins( ); } - const enableCordova = cordovaPlugins.length > 0; + const enableCordova = cordovaPlugins.length > 0 || config.app.forceCordova; const capacitorAndroidPath = resolve(dirname(capacitorAndroidPackagePath), 'capacitor'); const capacitorCordovaAndroidPath = resolve(dirname(capacitorAndroidPackagePath), 'capacitor-cordova'); From 22b15d74d473d84d12864537aa1b2b705abc8e56 Mon Sep 17 00:00:00 2001 From: Mark Anderson Date: Thu, 20 Aug 2026 10:30:57 -0400 Subject: [PATCH 5/6] Added a log if Cordova Support has been forced --- cli/src/android/update.ts | 3 +++ cli/src/ios/update.ts | 3 +++ 2 files changed, 6 insertions(+) diff --git a/cli/src/android/update.ts b/cli/src/android/update.ts index ecd83eb27b..159754382b 100644 --- a/cli/src/android/update.ts +++ b/cli/src/android/update.ts @@ -43,6 +43,9 @@ export async function updateAndroid(config: Config): Promise { await removePluginsNativeFiles(config); if (enableCordova) { logger.info('Found Cordova Plugins: Including Android Cordova Support'); + if (config.app.forceCordova) { + logger.info('Cordova support installation has been forced') + } await copyPluginsNativeFiles(config, cordovaPlugins); } if (!(await pathExists(config.android.webDirAbs))) { diff --git a/cli/src/ios/update.ts b/cli/src/ios/update.ts index 1cfb6d08b2..65c0754a6a 100644 --- a/cli/src/ios/update.ts +++ b/cli/src/ios/update.ts @@ -47,6 +47,9 @@ async function updatePluginFiles(config: Config, plugins: Plugin[], deployment: if (enableCordova) { logger.info('Found Cordova Plugins: Including iOS Cordova Support'); + if (config.app.forceCordova) { + logger.info('Cordova support installation has been forced') + } await copyPluginsNativeFiles(config, cordovaPlugins); } From 4e61b6b256e61cf0b0a0474a521c2c518d479385 Mon Sep 17 00:00:00 2001 From: Mark Anderson Date: Thu, 20 Aug 2026 10:33:01 -0400 Subject: [PATCH 6/6] npm run fmt --- cli/src/android/update.ts | 2 +- cli/src/ios/update.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cli/src/android/update.ts b/cli/src/android/update.ts index 159754382b..9593ad6f51 100644 --- a/cli/src/android/update.ts +++ b/cli/src/android/update.ts @@ -44,7 +44,7 @@ export async function updateAndroid(config: Config): Promise { if (enableCordova) { logger.info('Found Cordova Plugins: Including Android Cordova Support'); if (config.app.forceCordova) { - logger.info('Cordova support installation has been forced') + logger.info('Cordova support installation has been forced'); } await copyPluginsNativeFiles(config, cordovaPlugins); } diff --git a/cli/src/ios/update.ts b/cli/src/ios/update.ts index 65c0754a6a..ca85595c13 100644 --- a/cli/src/ios/update.ts +++ b/cli/src/ios/update.ts @@ -48,7 +48,7 @@ async function updatePluginFiles(config: Config, plugins: Plugin[], deployment: if (enableCordova) { logger.info('Found Cordova Plugins: Including iOS Cordova Support'); if (config.app.forceCordova) { - logger.info('Cordova support installation has been forced') + logger.info('Cordova support installation has been forced'); } await copyPluginsNativeFiles(config, cordovaPlugins); }