What problem does it solve?
Migrating an existing Expo native module from the Expo Modules API 1.0 definition DSL to the 2.0 macro API (@ExpoModule, @JS, @Event, @SharedObject, @Record) is error-prone: macro support varies across expo-modules-core versions, wire names can silently change, and async queue semantics differ. This Skill guides an agent through a contract-preserving, incremental migration of the Swift side of a module without changing its JavaScript/TypeScript API.
Core Features & Use Cases
- Contract-first migration: Inventories every exported member (functions, properties, constants, events, records, shared objects, lifecycle hooks) and preserves JS-visible names, arity, nullability, and sync/async behavior.
- Compatibility verification: Checks the actually installed expo-modules-core and macro declarations before migrating each member, classifying items as Migrate, Keep in DSL (mixed mode), or Blocked.
- Incremental mixed-mode support: Keeps unsupported members in the 1.0 definition() DSL alongside @ExpoModule, with a fallback flow that asks the user to co-exist or revert and files a tracking issue on expo/expo.
- Use Case: You maintain an Expo module written against the 1.0 DSL and want to adopt the 2.0 macros after upgrading to expo 57.0.7+. The Skill migrates functions, properties, events, and records group by group, keeps a queue-pinned AsyncFunction in the DSL, and verifies the result with builds, native tests, and the example app.
Quick Start
Use the expo-migrate-module skill to migrate this module's Swift implementation from the 1.0 definition DSL to the 2.0 macro API without changing its JavaScript contract.