anandpilania / upgrader
Modular upgrade tool for Laravel, PHP, React, Vue, Tailwind, TypeScript, and JavaScript
Requires
- php: ^8.2
- guzzlehttp/guzzle: ^7.5
- nikic/php-parser: ^5.0
- symfony/console: ^7.0
- symfony/finder: ^7.0
- symfony/process: ^7.0
- symfony/yaml: ^7.0
README
๐ Now with Laravel 13 Support!
A comprehensive, modular upgrade tool for modern web development stacks. Automatically upgrade PHP, Laravel, React, Vue, Tailwind CSS, TypeScript, and JavaScript with intelligent dependency management.
๐ฏ Key Features
- Modular Architecture - Each technology is an independent, pluggable module
- Intelligent Dependencies - Modules automatically upgrade their dependencies
- Multi-Framework Support - Works with Laravel, React, Vue, and more
- Language Awareness - Handles JavaScript โ TypeScript transitions seamlessly
- Auto-Detection - Automatically detects applicable modules in your project
- Version-by-Version - Incremental upgrades for safety
- Dry Run Mode - Preview changes before applying
๐ฆ Available Modules
| Module | Description | Dependencies |
|---|---|---|
php |
PHP version upgrades | None |
javascript |
JavaScript/ES version upgrades | None |
typescript |
TypeScript upgrades | javascript |
laravel |
Laravel framework upgrades | php |
reactjs |
React.js upgrades | javascript OR typescript |
vuejs |
Vue.js upgrades | javascript OR typescript |
tailwindcss |
Tailwind CSS upgrades | None |
๐ Dependency Flow
Laravel Module
โโ depends on โ PHP Module
React Module
โโ depends on โ JavaScript Module OR TypeScript Module
โโ depends on โ JavaScript Module
Vue Module
โโ depends on โ JavaScript Module OR TypeScript Module
โโ depends on โ JavaScript Module
TypeScript Module
โโ depends on โ JavaScript Module
๐ Installation
composer require --dev anandpilania/upgrader
Or install globally:
composer global require anandpilania/upgrader
๐ Usage
List Available Modules
bin/upgrader modules
Output:
โโโโโโโโโโโโโโฌโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโ
โ Module โ Version โ Description โ Dependencies โ Supported โ
โโโโโโโโโโโโโโผโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโค
โ php โ 1.0.0 โ PHP upgrade module โ None โ 7.4, 8.0, 8.1..โ
โ laravel โ 1.0.0 โ Laravel upgrades โ php โ 8.0, 9.0, 10.0..โ
โ reactjs โ 1.0.0 โ React.js upgrades โ None โ 16.0, 17.0, 18.0โ
โโโโโโโโโโโโโโดโโโโโโโโโโดโโโโโโโโโโโโโโโโโโโโโโดโโโโโโโโโโโโโโโดโโโโโโโโโโโโโโโโโโ
Auto-Detect Project Modules
bin/upgrader detect
Output:
Detected Modules
โโ laravel (v9.0 โ v11.0 available)
โโ php (v8.0 โ v8.2 available)
โโ reactjs (v17.0 โ v18.0 available)
โโ typescript (v4.5 โ v5.0 available)
Analyze Upgrade Path
# Analyze specific module bin/upgrader analyze --module=laravel --target=11.0 # Analyze all detected modules bin/upgrader analyze
Upgrade a Module
# Basic upgrade bin/upgrader upgrade --module=laravel --from=9.0 --to=11.0 # Auto-detect current version bin/upgrader upgrade --module=laravel --to=11.0 # Upgrade with dependencies (e.g., PHP will be upgraded first) bin/upgrader upgrade --module=laravel --to=11.0 --with-dependencies # Dry run (preview changes) bin/upgrader upgrade --module=laravel --to=11.0 --dry-run
๐ฏ Real-World Examples
Example 1: Upgrade Laravel (with PHP)
# Laravel module depends on PHP module # When you upgrade Laravel, it will automatically upgrade PHP if needed bin/upgrader upgrade --module=laravel --from=9.0 --to=11.0 --with-dependencies
What happens:
- Detects Laravel 9 requires PHP 8.0
- Detects Laravel 11 requires PHP 8.2
- Automatically upgrades PHP 8.0 โ 8.2 first
- Then upgrades Laravel 9.0 โ 10.0 โ 11.0
Example 2: Upgrade React with TypeScript
# If your React project uses TypeScript, both will be upgraded
bin/upgrader upgrade --module=reactjs --from=17.0 --to=18.0 --with-dependencies
What happens:
- Detects React uses TypeScript
- Detects React 18 needs TypeScript 4.5+
- Automatically upgrades TypeScript if needed
- TypeScript upgrade triggers JavaScript target upgrade
- Then upgrades React 17.0 โ 18.0
Example 3: Full Stack Upgrade
# Detect everything bin/upgrader detect # Upgrade each module bin/upgrader upgrade --module=php --to=8.2 bin/upgrader upgrade --module=laravel --to=11.0 --with-dependencies bin/upgrader upgrade --module=tailwindcss --to=3.4 bin/upgrader upgrade --module=vuejs --to=3.4 --with-dependencies
โ๏ธ Configuration
Create .upgrader.yml in your project root:
modules: laravel: update_frontend: true run_tests: true backup_database: true reactjs: migrate_to_hooks: true enable_strict_mode: true typescript: strict_mode: true update_types: true tailwindcss: enable_jit: true update_plugins: true
Then run:
bin/upgrader upgrade --module=laravel --config=.upgrader.yml
What happens automatically:
Step 1: Dependency Check
โ Laravel 13 requires PHP 8.3
โ Current PHP: 8.2
โ Upgrading PHP 8.2 โ 8.3 first
Step 2: PHP Upgrade
โ Applied PHP 8.3 transformers
โ Updated composer.json PHP requirement
Step 3: Laravel Upgrade
โ Updated composer.json Laravel version
โ Applied CSRF middleware transformer (VerifyCsrfToken โ PreventRequestForgery)
- Updated 12 files
โ Applied cache config transformer
- Added serializable_classes configuration
โ Applied polymorphic pivot transformer
- Found 3 pivot models
- Generated warnings for manual review
Step 4: Frontend Detection
โ Detected Vue.js 3.2
โ Vue uses TypeScript
โ Frontend upgrades available (not applied without --with-dependencies)
Summary:
โ PHP 8.2 โ 8.3
โ Laravel 12.0 โ 13.0
โ 15 files modified
โ 5 manual steps required
Manual Steps:
1. Review config/cache.php - add whitelisted classes if caching objects
2. Check .env for CACHE_PREFIX and SESSION_COOKIE
3. Update JobAttempted event listeners ($exception instead of $exceptionOccurred)
4. Review 3 pivot models - add explicit $table if needed
5. Run: php artisan test
๐๏ธ Architecture
How Modules Work
Each module is self-contained and implements the UpgradeModuleInterface:
interface UpgradeModuleInterface { // Detect if this module applies to the project public function canHandle(string $projectPath): bool; // Detect current version public function detectCurrentVersion(string $projectPath): ?string; // Analyze upgrade compatibility public function analyze(string $projectPath, string $targetVersion): array; // Perform the upgrade public function upgrade(string $from, string $to): array; // Declare dependencies on other modules public function getDependencies(): array; }
Dependency Resolution
The ModuleRegistry automatically resolves and initializes dependencies:
$registry = new ModuleRegistry(); $registry->register(new PHPModule()); $registry->register(new LaravelModule()); // depends on PHP // When you upgrade Laravel, PHP is automatically checked and upgraded if needed
Module Communication
Modules can access their dependencies:
class LaravelModule extends AbstractModule { protected array $dependencies = ['php']; public function upgrade($from, $to): array { // Get PHP module instance $phpModule = $this->getDependency('php'); // Check if PHP upgrade is needed $requiredPhpVersion = $this->getRequiredPhpVersion($to); if ($phpModule) { $phpModule->upgrade($current, $requiredPhpVersion); } // Continue with Laravel upgrade... } }
๐ Creating Custom Modules
Create your own upgrade module:
namespace App\Upgraders; use Upgrader\Core\AbstractModule; class CustomFrameworkModule extends AbstractModule { protected array $dependencies = ['php', 'javascript']; public function getName(): string { return 'my-framework'; } public function canHandle(string $projectPath): bool { return file_exists($projectPath . '/my-framework.json'); } public function detectCurrentVersion(string $projectPath): ?string { // Detection logic } public function getAvailableVersions(): array { return ['1.0', '2.0', '3.0']; } public function upgrade(string $from, string $to): array { // Upgrade logic } }
Register your module:
$loader = new ModuleLoader(); $registry = $loader->loadAllModules(); $registry->register(new CustomFrameworkModule());
๐ Module Details
PHP Module
Upgrades: 7.4, 8.0, 8.1, 8.2, 8.3, 8.4
Features:
- Named arguments support
- Union types migration
- Attributes transformation
- Enum support
- Readonly properties
bin/upgrader upgrade --module=php --from=8.0 --to=8.2
Laravel Module
Upgrades: 8.0, 9.0, 10.0, 11.0, 12.0, 13.0
Dependencies: PHP
Features:
- Route namespace removal (9.0)
- Flysystem 3.x migration (9.0)
- Native type declarations (10.0)
- Application structure updates (11.0)
- Request forgery protection updates (13.0)
- Cache serialization security (13.0)
- Auto-detects and upgrades frontend framework (React/Vue)
bin/upgrader upgrade --module=laravel --to=13.0 --with-dependencies
React Module
Upgrades: 16.0, 16.8, 17.0, 18.0, 19.0
Dependencies: JavaScript OR TypeScript (auto-detected)
Features:
- Hooks migration (16.8)
- JSX transform update (17.0)
- Concurrent features (18.0)
- Auto-detects TypeScript and upgrades if present
bin/upgrader upgrade --module=reactjs --to=18.0 --with-dependencies
Vue Module
Upgrades: 2.6, 2.7, 3.0, 3.1, 3.2, 3.3, 3.4
Dependencies: JavaScript OR TypeScript (auto-detected)
Features:
- Composition API migration
- Script setup transformation
- Global API updates (3.0)
- Auto-detects TypeScript and upgrades if present
bin/upgrader upgrade --module=vuejs --to=3.4 --with-dependencies
TypeScript Module
Upgrades: 4.0 โ 5.4
Dependencies: JavaScript
Features:
- Decorators support
- Const type parameters
- Automatically upgrades JavaScript target (ES2020, ES2022, etc.)
bin/upgrader upgrade --module=typescript --to=5.0 --with-dependencies
Tailwind CSS Module
Upgrades: 2.0 โ 3.4
No Dependencies
Features:
- JIT mode enablement
- Color palette updates
- Purge โ Content migration
- Deprecated class updates
bin/upgrader upgrade --module=tailwindcss --to=3.4
๐งช Testing
# Run all tests composer test # Test specific module composer test -- --filter=LaravelModuleTest
๐ค Contributing
- Fork the repository
- Create your module in
modules/your-module/ - Implement
UpgradeModuleInterface - Add tests
- Submit pull request
๐ License
MIT License
๐ Credits
Built with โค๏ธ for the web development community.
Made modular, made simple.
Ready to upgrade to Laravel 13? Download and start upgrading!