deps: Composer- und npm-Pakete innerhalb der Constraints aktualisiert

Laravel 12.69, Livewire 4.4, Flux 2.20, Cashier 16.8 (Stripe-SDK 21),
Larastan 3.12; Vite 6.4.3, Tailwind 4.3, Alpine 3.17 - npm audit 0.
Drei neue Larastan-Befunde behoben, drei tote Baseline-Einträge entfernt.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Kevin Adametz 2026-09-15 15:04:52 +00:00
parent e7e12b9436
commit 6e159ecf06
7 changed files with 2508 additions and 1457 deletions

View file

@ -161,9 +161,9 @@ class FixApiPortalDuplicates extends Command
->filter(fn (Collection $group): bool => $group->count() >= 2) ->filter(fn (Collection $group): bool => $group->count() >= 2)
->flatMap(function (Collection $group) use ($windowMinutes): array { ->flatMap(function (Collection $group) use ($windowMinutes): array {
$pairs = []; $pairs = [];
$items = $group->values(); $items = $group->values()->all();
for ($i = 0; $i < $items->count() - 1; $i++) { for ($i = 0; $i < count($items) - 1; $i++) {
$first = $items[$i]; $first = $items[$i];
$second = $items[$i + 1]; $second = $items[$i + 1];

View file

@ -132,9 +132,7 @@ class PressReleaseMediaPrivatizer
throw new RuntimeException("Could not write private press release media: {$path}"); throw new RuntimeException("Could not write private press release media: {$path}");
} }
} finally { } finally {
if (is_resource($stream)) { fclose($stream);
fclose($stream);
}
} }
$public->delete($path); $public->delete($path);

View file

@ -736,14 +736,10 @@ class PressReleaseService
return; return;
} }
$mailable = match ($event) { $mailable = $notificationType === EmailNotificationType::PressReleasePublished
'published' => new PressReleasePublished($user, $pressRelease, $recipientName), ? new PressReleasePublished($user, $pressRelease, $recipientName)
'rejected' => new PressReleaseRejected($user, $pressRelease, $reason, $recipientName), : new PressReleaseRejected($user, $pressRelease, $reason, $recipientName);
default => null,
};
if ($mailable) { Mail::to($recipient)->queue($mailable);
Mail::to($recipient)->queue($mailable);
}
} }
} }

2663
composer.lock generated

File diff suppressed because it is too large Load diff

View file

@ -1111,3 +1111,46 @@ Tests: `tests/Feature/MailSuppressionAdminTest.php` (3).
**Damit ist 1b.6 komplett — und Block 1b.** Offen bleibt nur das **Damit ist 1b.6 komplett — und Block 1b.** Offen bleibt nur das
Anlegen des Postfachs und die Live-Konfiguration (siehe Deploy-Hinweise Anlegen des Postfachs und die Live-Konfiguration (siehe Deploy-Hinweise
zu Schritt 1 und 3). zu Schritt 1 und 3).
## Zwischenschritt — Paket-Update (15.09.2026)
Anlass: Auf Live war `composer require webklex/laravel-imap` samt
`composer update` von Hand gelaufen. Das hob dort *alle* Pakete an, die
`composer.lock` wich vom Repo ab, und die im Mai veröffentlichten
Livewire-Assets (`public/vendor/livewire`, gitignored) passten nicht mehr
zum neuen Livewire — Konsolen-Warnung „published assets are out of
date" und verschobene Formatierung, weil der Portal-Build noch gegen die
alte Flux-CSS gebaut war.
Entscheidung: Das Update wird hier nachgezogen und versioniert, statt
Live zurückzusetzen.
- `composer update` innerhalb der Constraints: 71 Pakete. Wesentlich:
Laravel 12.63 → 12.69, Livewire 4.2.4 → 4.4.5, Flux/Flux Pro 2.14 →
2.20, Volt 1.10 → 1.11, Fortify 1.36 → 1.39, Cashier 16.5 → 16.8 (zieht
`stripe/stripe-php` 17 → 21 nach, API-Version bleibt über Cashier
gepinnt), Larastan 3.9 → 3.12, Pint 1.29 → 1.32. Majors (Laravel 13,
Pest 5, spatie/permission 8) bewusst nicht.
- `npm update` + `npm audit fix`: Vite 6.4.0 → 6.4.3, Tailwind 4.1 → 4.3,
Alpine 3.15 → 3.17; vorher 13 gemeldete Schwachstellen (Build-Tooling),
danach 0.
- Larastan 3.12 versteht Query-Scopes jetzt selbst → drei Baseline-Einträge
(`visibleInArchive`, `forPortalValues`) waren tot und sind raus. Drei
neue Befunde behoben: `PressReleaseService::notifyAuthor()` wählt die
Mailable jetzt über den Benachrichtigungstyp statt über ein zweites
`match`; `PressReleaseMediaPrivatizer` prüft vor `fclose()` nicht mehr
auf `is_resource`; `FixApiPortalDuplicates` iteriert über ein Array
statt über Collection-Offsets. phpstan: No errors, Pint sauber.
- Flux-Changelog 2.15–2.20 gesichtet: keine Breaking Changes, aber
Feinkorrekturen an Icon-Buttons (Inset/Padding), Navbar-Abständen,
Sidebar-Tooltips und Tabellen-Padding. Die auf Live gesehenen Sprünge
kamen aus dem alten Build; nach frischem `npm run build` bleiben
allenfalls diese kleinen Anpassungen.
- Tests: 1612 passed.
Deploy: `composer install`, `npm run build`, **`php artisan
livewire:publish --assets`** (gehört dauerhaft ins Ploi-Skript, sonst
läuft `public/vendor/livewire` bei jedem Livewire-Update wieder aus dem
Takt), `optimize:clear`, `config:cache`, `view:cache`, `queue:restart`.
Vorher auf dem Server `git checkout composer.lock`, damit der Pull nicht
an der handgeänderten Datei hängen bleibt.

1221
package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -144,12 +144,6 @@ parameters:
count: 1 count: 1
path: app/Http/Controllers/Web/ReportFormController.php path: app/Http/Controllers/Web/ReportFormController.php
-
message: '#^Call to an undefined method Illuminate\\Database\\Eloquent\\Builder\<Illuminate\\Database\\Eloquent\\Model\>\:\:visibleInArchive\(\)\.$#'
identifier: method.notFound
count: 1
path: app/Http/Controllers/Web/SitemapController.php
- -
message: '#^Call to function method_exists\(\) with Laravel\\Sanctum\\PersonalAccessToken and ''getKey'' will always evaluate to true\.$#' message: '#^Call to function method_exists\(\) with Laravel\\Sanctum\\PersonalAccessToken and ''getKey'' will always evaluate to true\.$#'
identifier: function.alreadyNarrowedType identifier: function.alreadyNarrowedType
@ -912,24 +906,12 @@ parameters:
count: 5 count: 5
path: app/Services/Web/HomePageData.php path: app/Services/Web/HomePageData.php
-
message: '#^Call to an undefined method Illuminate\\Database\\Eloquent\\Builder\<Illuminate\\Database\\Eloquent\\Model\>\:\:forPortalValues\(\)\.$#'
identifier: method.notFound
count: 1
path: app/Services/Web/HomePageData.php
- -
message: '#^Using nullsafe property access "\?\-\>name" on left side of \?\? is unnecessary\. Use \-\> instead\.$#' message: '#^Using nullsafe property access "\?\-\>name" on left side of \?\? is unnecessary\. Use \-\> instead\.$#'
identifier: nullsafe.neverNull identifier: nullsafe.neverNull
count: 1 count: 1
path: app/Services/Web/HomePageData.php path: app/Services/Web/HomePageData.php
-
message: '#^Call to an undefined method Illuminate\\Database\\Eloquent\\Builder\<Illuminate\\Database\\Eloquent\\Model\>\:\:visibleInArchive\(\)\.$#'
identifier: method.notFound
count: 1
path: app/Services/Web/HubPageData.php
- -
message: '#^Call to function is_array\(\) with list\<array\{label\: string, value\: string, delta\: string, positive\: bool\}\> will always evaluate to true\.$#' message: '#^Call to function is_array\(\) with list\<array\{label\: string, value\: string, delta\: string, positive\: bool\}\> will always evaluate to true\.$#'
identifier: function.alreadyNarrowedType identifier: function.alreadyNarrowedType