mcpField
C
capacitor-plugin-upgrade-v5-to-v6

capacitor-plugin-upgrade-v5-to-v6

github.com/cap-goDevelopment73639 installsUpdated 2w ago
Repository

About capacitor-plugin-upgrade-v5-to-v6

A skill for migrating Capacitor plugin libraries from v5 to v6. It covers package and native changes, listener typings, and optional SPM support.

Key features

  1. 01Project snapshot and version checks
  2. 02Automated migration command
  3. 03Listener typing and iOS updates
  4. 04Optional SPM migration guidance
  5. 05Build and migration verification

Use cases

  1. 01Preparing a v5 plugin for Capacitor 6 apps
  2. 02Updating addListener declarations and implementations
  3. 03Adding SPM support during a v6 migration

Install

Copy the command and run it in a terminal.

$npx skills add https://github.com/cap-go/capgo-skills --skill capacitor-plugin-upgrade-v5-to-v6

After installing, type/capacitor-plugin-upgrade-v5-to-v6in Claude Code to confirm it loaded.

Bundled filesmetadata.jsonreferences/android.md

Details

From the project README

Capacitor Plugin Upgrade v5 to v6

Move a plugin library to Capacitor 6. Source of truth: https://capacitorjs.com/docs/updating/plugins/6-0

When to Use

  • Snapshot shows @capacitor/core 5.x and the plugin must work in Capacitor 6 apps.
  • definitions.ts still declares Promise<PluginListenerHandle> & PluginListenerHandle.
  • The user wants to add SPM support while moving to 6.

Do not use:

  • Upgrading an app -> capacitor-app-upgrade-v5-to-v6.
  • Plugin on 4.x -> capacitor-plugin-upgrade-v4-to-v5 first; on 6.x -> capacitor-plugin-upgrade-v6-to-v7. Multi-hop -> capacitor-plugin-upgrades.
  • Full SPM conversion details -> capacitor-plugin-spm-support.

Live Project Snapshot

Plugin and Capacitor package snapshot: !node -e "const fs=require('fs');if(!fs.existsSync('package.json'))process.exit(0);const pkg=JSON.parse(fs.readFileSync('package.json','utf8'));const out=['package.name='+(pkg.name||''),'package.version='+(pkg.version||'')];for(const section of ['peerDependencies','dependencies','devDependencies']){for(const [name,version] of Object.entries(pkg[section]||{})){if(name.startsWith('@capacitor/'))out.push(section+'.'+name+'='+version)}}console.log(out.join('\n'))"

Example and native project paths: !find . -maxdepth 3 \( -path './example-app' -o -path './ios' -o -path './android' \)

References

FileLoad when
references/android.mdApplying Gradle or Kotlin changes by hand

Preflight

ToolMinimum
Node.js18+
Xcode15.0+
Java17
AGP / Gradle8.2.1 / 8.2.1
Android SDK defaultscompileSdk 34, targetSdk 34, minSdk 22
iOS deployment target13.0 (unchanged)

Procedure

  1. Confirm 5.x and a clean tree.

  2. From the plugin root:

    npx @capacitor/plugin-migration-v5-to-v6@latest
    

    Review git diff.

  3. Finish manually (references/android.md): dev deps to latest-6, peer @capacitor/core to ^6.0.0, compileSdk (not compileSdkVersion) default 34, targetSdkVersion default 34, AGP 8.2.1, Gradle 8.2.1, Kotlin 1.9.10.

  4. definitions.ts: every addListener overload must return only Promise<PluginListenerHandle>:

      addListener(
        eventName: 'resume',
        listenerFunc: () => void,
    - ): Promise<PluginListenerHandle> & PluginListenerHandle;
    + ): Promise<PluginListenerHandle>;
    

    Update web.ts and README/docgen output to match. This is a breaking change for consumers who used the sync handle.

  5. iOS: delete CAP_PLUGIN_METHOD(removeAllListeners, CAPPluginReturnPromise); from the plugin .m file. It is now built in for all plugins.

  6. Optional SPM: Capacitor 6 adds experimental SPM. Ask the user if they want it now; if yes follow capacitor-plugin-spm-support (adds Package.swift, CAPBridgedPlugin conformance in Swift).

  7. Upgrade the example app via capacitor-app-upgrade-v5-to-v6, bump the plugin major, note "Requires Capacitor 6".

Verification

grep -n "\"@capacitor/" package.json                               # 6.x
grep -rn "& PluginListenerHandle" src/                             # expect none
grep -rn "removeAllListeners" ios/ --include=*.m 2>/dev/null       # expect none
grep -n "compileSdkVersion project\|gradle:8.2.1" android/build.gradle   # compileSdk + 8.2.1
grep -n "distributionUrl" android/gradle/wrapper/gradle-wrapper.properties   # gradle-8.2.1
npm run build
npm run verify        # if the repo has the template verify scripts

Run the example app on both platforms; add and remove each listener.

Error Handling

ErrorFix
TS: Property 'remove' does not exist on type 'Promise<PluginListenerHandle>' in example/testsawait the addListener call.
AGP deprecation warning on compileSdkVersionUse compileSdk.
removeAllListeners still listed in the .m fileRemove the CAP_PLUGIN_METHOD line (step 5); the method is built in.
Example app ERESOLVE on @capacitor/corePeer range still ^5; set ^6.0.0.

Comments

Markdown supported