- 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.
6.6 KiB
6.6 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-routeswithopgginc/codezero-laravel-localized-routes:^5.0(drop-in fork) - Removed
codezero/laravel-localizer(single-locale nl project) - Set
codezero/composer-preload-filestofalsein 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\Repeaterin ChildrenRelationManager - Ran
filament-v4rector on 197 files - Removed
filament/spatie-laravel-translatable-plugin(no v4 release), skipped to v5 - Ran
filament-v5rector 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\Set→Filament\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 updatefor 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
VueDatePickerimport: 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 successfullyphp 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
- codezero/composer-preload-files plugin error: After removing codezero packages,
composer dump-autoloadfailed. Fix: setallow-plugins.codezero/composer-preload-filestofalse. - awcodes/filament-table-repeater blocks Filament v4: No compatible version. Fix: removed package, replaced with standard Repeater.
- 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.
- filament-v5 rector MissingInputException: Running without input fails. Fix: pipe
echo "app"to rector. - Vite 7 peer dependency conflicts: laravel-vite-plugin@^2 requires Vite 7. Fix: install vite@^7 with
--force. - @import must precede @source in TW v4: CSS ordering constraint. Fix: move @import before @source directives.
- eslint-plugin-tailwindcss re-added by quality:update:
strixi/laravel-qualityre-publishes eslint.config.mjs oncomposer update. Fix: remove the package and tailwindcss settings again after composer operations. - @vuepic/vue-datepicker v12 default export removed: Changed to named export. Fix:
import { VueDatePicker }instead of default import. - 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 (viaPageSeeder) and visit key public routes (/,/over-ons,/contact). UseassertNoSmoke()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. - @vuepic/vue-datepicker v12 locale + format props changed: The
localeprop now requires a date-fnsLocaleobject instead of a string. Theformatprop was renamed toformatswith sub-properties (e.g.formats.input). Fix:import {nl} from "date-fns/locale", change:locale="'nl'"to:locale="nl", changeformat="dd-MM-yyyy"to:formats="{ input: 'dd-MM-yyyy' }". - Filament v5 evaluates column labels during initialization:
$livewire->tableFiltersis null before filters are populated, causing "Trying to access array offset on null" errors. Fix: use null-safe access with?? nullor?? 'default'defaults when accessing filter values in column labels/formatters.