Files
Obsidian-Vault/Work/Projects/Laravel-v12-Migration/Logs/upgrade-log-deversspecialist-composer.md
Vincent Verbruggen 1999dbbc11 Add upgrade logs for Laravel 11 to 12 migration across multiple projects
- Created detailed upgrade log for deversspecialist with phases including Composer updates, Filament upgrades, Tailwind migration, Pest updates, and final verification.
- Added upgrade log for goos project, documenting version changes, encountered issues, and resolutions during the migration process.
- Documented Composer dependency upgrades for qlshandling, highlighting significant changes and necessary code adjustments.
- Introduced a template for future upgrade logs to standardize documentation for Laravel migrations.
2026-02-20 10:43:24 +01:00

6.2 KiB

Upgrade Log: Laravel 11 → 12 + Full Ecosystem

Starting State

Package Before Target
laravel/framework 11.48.0 ^12.0
filament/filament 3.3.48 ^5.0
livewire/livewire 3.7.10 ^4.0
tailwindcss 3.4.19 ^4.0
pestphp/pest 3.8.5 ^4.0
barryvdh/laravel-debugbar 3.16.5 ^4.0
jeffgreco13/filament-breezy 2.6.4 ^3.0
ariaieboy/filament-currency 1.13.0 ^3.0
amidesfahani/filament-tinyeditor 3.0.0 ^4.0
mollie/laravel-mollie 3.1.0 ^4.0

Baseline tests: 14 passed (41 assertions) Baseline build: Success (client + SSR)


Phase 1: Pre-Flight

  • Branch created: upgrade/laravel-12-full
  • Baseline tests: 14 passed
  • Baseline build: success

Phase 2: Composer — Laravel 12

  • Replaced codezero/laravel-localized-routes with opgginc/codezero-laravel-localized-routes:^5.0 (drop-in fork)
  • Removed codezero/laravel-localizer (single-locale nl project)
  • Set codezero/composer-preload-files to false in allow-plugins (transitive dep still present)
  • Updated constraints: laravel/framework ^12, symfony/http-client ^8.0, symfony/mailgun-mailer ^8.0, barryvdh/laravel-debugbar ^4.0, mollie/laravel-mollie ^4.0
  • composer update -W — Laravel v12.50.0 installed
  • Tests: 14 passed

Phase 3: Filament v3 → v4 → v5

  • Removed awcodes/filament-table-repeater (no Filament v4/v5 version exists)
  • Replaced TableRepeater with standard Filament\Forms\Components\Repeater in ChildrenRelationManager
  • Ran filament-v4 rector on 197 files
  • Removed filament/spatie-laravel-translatable-plugin (no v4 release), skipped to v5
  • Ran filament-v5 rector on 197 files
  • Installed all Filament v5 packages + lara-zeus/spatie-translatable:^2.0
  • Fixed ~20 files: Filament\Pages\Actions\*Filament\Actions\*
  • Fixed Filament\Forms\SetFilament\Schemas\Components\Utilities\Set (ProductResource, ChildrenRelationManager)
  • Filament v5.2.1, Livewire v4.1.4 installed
  • Tests: 14 passed

Phase 4: Tailwind v3 → v4

  • Installed tailwindcss@^4, @tailwindcss/postcss, @tailwindcss/cli
  • Removed autoprefixer, @tailwindcss/forms, @tailwindcss/typography, @tailwindcss/aspect-ratio, eslint-plugin-tailwindcss
  • Updated postcss.config.js to use @tailwindcss/postcss
  • Migrated tailwind.config.js to CSS-first config in app.css (@theme, @source, @variant directives)
  • Converted utility.css from @layer to @utility directives
  • Deleted tailwind.config.js
  • Removed tailwindcss settings from eslint.config.mjs
  • Installed vite@^7, @vitejs/plugin-vue@^6, laravel-vite-plugin@^2
  • Build: success, Tests: 14 passed

Phase 5: Pest v3 → v4

  • Upgraded pestphp/pest:^4.0 + pestphp/pest-plugin-laravel:^4.0
  • Pest v4.3.2, PHPUnit 12.5.8 installed
  • Tests: 14 passed

Phase 6: NPM Updates

  • Removed eslint-plugin-tailwindcss (re-added by quality:update, incompatible with TW v4)
  • Fixed eslint.config.mjs (removed tailwindcss settings block re-added by quality:update)
  • npm update for minor/patch bumps
  • Major updates: @vuepic/vue-datepicker ^12.1.0, @vueuse/core ^14.2.1, swiper ^12.1.0, vite-imagetools ^9.0.2, imagetools-core ^9.1.0, vite-plugin-vue-devtools ^8.0.6, vue-flatpickr-component ^12.0.0, globals ^17.3.0
  • Fixed VueDatePicker import: default → named export (v12 breaking change)
  • ESLint stays at v9 (intentionally skipped)
  • Build: success

Phase 7: Final Verification

  • Tests: 14 passed (41 assertions)
  • Build: success (client + SSR)
  • Pint: clean (fixed 2 lang files)
  • composer outdated --direct: only predis/predis v2→v3 (out of scope)
  • npm outdated: only eslint v9→v10, @eslint/js v9→v10 (intentionally skipped)
  • php artisan filament:upgrade: assets published successfully
  • php artisan about: Laravel 12.50.0 confirmed

Final State

Package Version
laravel/framework 12.50.0
filament/filament 5.2.1
livewire/livewire 4.1.4
tailwindcss 4.x
pestphp/pest 4.3.2
phpunit/phpunit 12.5.8
vite 7.3.1
@vitejs/plugin-vue 6.x
laravel-vite-plugin 2.x

Exceptions & Issues Log

  1. codezero/composer-preload-files plugin error: After removing codezero packages, composer dump-autoload failed. Fix: set allow-plugins.codezero/composer-preload-files to false.
  2. awcodes/filament-table-repeater blocks Filament v4: No compatible version. Fix: removed package, replaced with standard Repeater.
  3. lara-zeus/spatie-translatable requires Filament v5: Rector changed imports to LaraZeus namespace during v4 step, but package wasn't installable until v5. Caused transient FatalError. Fix: skip translatable during v4, install with v5.
  4. filament-v5 rector MissingInputException: Running without input fails. Fix: pipe echo "app" to rector.
  5. Vite 7 peer dependency conflicts: laravel-vite-plugin@^2 requires Vite 7. Fix: install vite@^7 with --force.
  6. @import must precede @source in TW v4: CSS ordering constraint. Fix: move @import before @source directives.
  7. eslint-plugin-tailwindcss re-added by quality:update: strixi/laravel-quality re-publishes eslint.config.mjs on composer update. Fix: remove the package and tailwindcss settings again after composer operations.
  8. @vuepic/vue-datepicker v12 default export removed: Changed to named export. Fix: import { VueDatePicker } instead of default import.
  9. Add basic browser smoke tests after upgrade: After completing the upgrade, set up pestphp/pest-plugin-browser + Playwright and create browser tests that seed pages (via PageSeeder) and visit key public routes (/, /over-ons, /contact). Use assertNoSmoke() to catch JS errors and console logs. This catches runtime issues (broken Inertia renders, missing assets, JS import errors) that unit/feature tests won't find.