Date: Sat, 13 Jun 2026 15:15:29 +0200
Subject: [PATCH 3/3] no message
---
API_CHANGELOG.md | 16 +-
.../API/v1/StatisticsController.php | 231 ++-
.../Controllers/API/v1/StatusController.php | 4 +-
.../Backend/StatisticController.php | 471 +++---
app/Repositories/StatisticsRepository.php | 328 +++++
app/Services/Statistics/StatisticsService.php | 195 +++
composer.lock | 1158 ++++++++-------
lang/de.json | 6 +-
lang/en.json | 6 +-
lang/fr.json | 203 +--
package-lock.json | 1294 ++++++++---------
.../components/Stats/AdvancedStats.vue | 239 +--
.../pages/Statistics/Statistics.vue | 347 +++--
resources/types/Api.gen.ts | 145 ++
.../vue/components/Stats/AdvancedStats.vue | 436 ------
.../vue/components/Stats/StatsDashboard.vue | 6 -
routes/api.php | 5 +-
storage/api-docs/api-docs.json | 257 ++++
.../Feature/APIv1/AdvancedStatisticsTest.php | 240 +++
19 files changed, 3240 insertions(+), 2347 deletions(-)
create mode 100644 app/Repositories/StatisticsRepository.php
create mode 100644 app/Services/Statistics/StatisticsService.php
delete mode 100644 resources/vue/components/Stats/AdvancedStats.vue
create mode 100644 tests/Feature/APIv1/AdvancedStatisticsTest.php
diff --git a/API_CHANGELOG.md b/API_CHANGELOG.md
index f87080c32..b16c735bd 100644
--- a/API_CHANGELOG.md
+++ b/API_CHANGELOG.md
@@ -41,6 +41,16 @@ Check back here regularly to stay ahead of removals.
---
+# 2026-06-12
+
+**Three new endpoints for personal statistics (all require `read-statistics` scope):**
+
+- `GET /api/v1/statistics/overview`: Returns a summary (total checkins, distance, active days) plus full `StatusResource` objects for the longest and shortest ride in the requested date range. Cached 1 hour per user and date range.
+- `GET /api/v1/statistics/history`: Returns all-time checkin counts and distances grouped by year, month (ISO `YYYY-MM`), and week (ISO `YYYY-Wnn`). Cached 6 hours per user.
+- `GET /api/v1/statistics/favorites`: Returns the top 10 most visited stations, most used lines, and most frequent origin-to-destination pairs for the requested date range. Cached 1 hour per user and date range.
+
+---
+
# 2026-05-06
**`PUT /api/v1/settings/profile` now supports partial updates:**
@@ -95,7 +105,7 @@ Operators have been migrated from integer IDs to UUIDs. The `OperatorResource` w
# 2026-03-28
-- `DepartureResource`: added `cancelled` (bool) field — `true` when the departure is cancelled according to the data
+- `DepartureResource`: added `cancelled` (bool) field: `true` when the departure is cancelled according to the data
provider
# 2026-03-21
@@ -125,7 +135,7 @@ Added new `POST /api/v1/trips` endpoint for creating manual trips.
---
-# 2026-03-15 (Ticket management – closed beta)
+# 2026-03-15 (Ticket management: closed beta)
Added new `GET|POST|PUT|DELETE /api/v1/tickets` endpoints for managing transit tickets.
Only available to users with the `closed-beta` role.
@@ -160,7 +170,7 @@ The integer ID is **not** deprecated and will continue to work until further not
The `EventDetailsResource` fields `trainDistance` and `trainDuration` are now **deprecated** and will be removed after *
*2026-09-30**.
-Use `totalDistance` and `totalDuration` instead — both fields are now returned alongside the old ones.
+Use `totalDistance` and `totalDuration` instead: both fields are now returned alongside the old ones.
The `CheckinSuccessResource.points.additional` field is now **deprecated** (always `null`) and will be removed after *
*2026-09-30**.
diff --git a/app/Http/Controllers/API/v1/StatisticsController.php b/app/Http/Controllers/API/v1/StatisticsController.php
index d2e6e7f28..c3f1b1d5b 100644
--- a/app/Http/Controllers/API/v1/StatisticsController.php
+++ b/app/Http/Controllers/API/v1/StatisticsController.php
@@ -14,6 +14,8 @@
use App\Http\Resources\StatisticsTravelPurposeResource;
use App\Http\Resources\StatusResource;
use App\Models\Status;
+use App\Models\User;
+use App\Services\Statistics\StatisticsService;
use Carbon\Carbon;
use DateTimeZone;
use Illuminate\Http\JsonResponse;
@@ -30,7 +32,7 @@ class StatisticsController extends Controller
private LeaderboardBackend $leaderboardBackend;
- public function __construct(LeaderboardBackend $leaderboard)
+ public function __construct(LeaderboardBackend $leaderboard, private readonly StatisticsService $statisticsService)
{
$this->leaderboardBackend = $leaderboard;
}
@@ -318,18 +320,6 @@ public function getPersonalStatistics(Request $request): JsonResponse
$categories = StatisticBackend::getTopTravelCategoryByUser(user: auth()->user(), from: $from, until: $until);
$operators = StatisticBackend::getTopTripOperatorByUser(user: auth()->user(), from: $from, until: $until);
$travelTime = StatisticBackend::getDailyTravelTimeByUser(user: auth()->user(), from: $from, until: $until);
-
- // Advanced statistics
- $advancedSummary = StatisticBackend::getAdvancedSummary(user: auth()->user(), from: $from, until: $until);
- $distancePerYear = StatisticBackend::getDistancePerYear(user: auth()->user());
- $distancePerMonth = StatisticBackend::getDistancePerMonth(user: auth()->user());
- $distancePerWeek = StatisticBackend::getDistancePerWeek(user: auth()->user());
- $lastWeek = StatisticBackend::getLastWeekStats(user: auth()->user());
- $lastMonth = StatisticBackend::getLastMonthStats(user: auth()->user());
- $lastYear = StatisticBackend::getLastYearStats(user: auth()->user());
- $favoriteStations = StatisticBackend::getFavoriteStations(user: auth()->user(), from: $from, until: $until);
- $favoriteLines = StatisticBackend::getFavoriteLines(user: auth()->user(), from: $from, until: $until);
- $favoriteRoutes = StatisticBackend::getFavoriteRoutes(user: auth()->user(), from: $from, until: $until);
$returnData = [
'purpose' => $purposes,
@@ -342,22 +332,6 @@ public function getPersonalStatistics(Request $request): JsonResponse
'duration' => $row->duration,
];
}),
- 'summary' => $advancedSummary,
- 'by_period' => [
- 'yearly' => $distancePerYear,
- 'monthly' => $distancePerMonth,
- 'weekly' => $distancePerWeek,
- ],
- 'predefined_periods' => [
- 'last_week' => $lastWeek,
- 'last_month' => $lastMonth,
- 'last_year' => $lastYear,
- ],
- 'favorites' => [
- 'stations' => $favoriteStations,
- 'lines' => $favoriteLines,
- 'routes' => $favoriteRoutes,
- ],
];
$additionalData = [
@@ -539,7 +513,7 @@ public function getGlobalStatistics(): JsonResponse
$globalStats = Cache::remember(
key: CacheKey::getGlobalStatsKey($from, $until),
ttl: config('trwl.cache.global-statistics-retention-seconds'), // 1 hour
- callback: static fn () => StatisticBackend::getGlobalCheckInStats($from, $until)
+ callback: fn () => $this->statisticsService->getGlobalStats($from, $until)
);
$additionalData = [
@@ -551,4 +525,201 @@ public function getGlobalStatistics(): JsonResponse
return $this->sendResponse(data: new StatisticsGlobalData($globalStats), additional: $additionalData);
}
+
+ #[OA\Get(
+ path: '/statistics/overview',
+ operationId: 'getStatisticsOverview',
+ summary: 'Get a summary of personal statistics for a date range',
+ security: [['passport' => ['read-statistics']], ['token' => []]],
+ tags: ['Statistics'],
+ parameters: [
+ new OA\Parameter(name: 'from', description: 'Start date', in: 'query', example: '2024-01-01'),
+ new OA\Parameter(name: 'until', description: 'End date', in: 'query', example: '2024-12-31'),
+ ],
+ responses: [
+ new OA\Response(
+ response: 200,
+ description: 'successful operation',
+ content: new OA\JsonContent(
+ properties: [
+ new OA\Property(
+ property: 'data',
+ properties: [
+ new OA\Property(property: 'summary', properties: [
+ new OA\Property(property: 'total_checkins', type: 'integer', example: 42),
+ new OA\Property(property: 'active_days', type: 'integer', example: 15),
+ new OA\Property(property: 'total_distance_km', type: 'number', format: 'float', example: 1234.56),
+ new OA\Property(property: 'mean_distance_km', type: 'number', format: 'float', example: 29.39),
+ new OA\Property(property: 'longest_ride', ref: StatusResource::class, nullable: true),
+ new OA\Property(property: 'shortest_ride', ref: StatusResource::class, nullable: true),
+ ],
+ type: 'object',
+ ),
+ ],
+ type: 'object',
+ ),
+ ],
+ ),
+ ),
+ new OA\Response(response: 400, description: 'Bad request'),
+ new OA\Response(response: 401, description: 'Unauthorized'),
+ ],
+ )]
+ public function getOverview(Request $request): JsonResponse
+ {
+ $validated = $request->validate([
+ 'from' => ['nullable', 'date'],
+ 'until' => ['nullable', 'date', 'after_or_equal:from'],
+ ]);
+
+ $from = isset($validated['from']) ? Carbon::parse($validated['from']) : Carbon::now()->subWeeks(4);
+ $until = isset($validated['until']) ? Carbon::parse($validated['until']) : Carbon::now();
+
+ /** @var User $user */
+ $user = auth()->user();
+
+ $cacheKey = "stats.overview.{$user->id}.{$from->toDateString()}.{$until->toDateString()}";
+ $data = Cache::remember($cacheKey, 3600, function () use ($user, $from, $until) {
+ $summary = $this->statisticsService->getSummary($user, $from, $until);
+
+ $statusIds = array_filter([
+ $summary['longest_ride']['status_id'] ?? null,
+ $summary['shortest_ride']['status_id'] ?? null,
+ ]);
+
+ $statuses = empty($statusIds) ? collect() : Status::with([
+ 'event',
+ 'likes',
+ 'user',
+ 'createdByUser',
+ 'checkin.originStopover.station',
+ 'checkin.destinationStopover.station',
+ 'checkin.trip.operator',
+ 'checkin.trip.motisSourceLicense',
+ 'checkin.statusTags',
+ 'tags',
+ 'mentions.mentioned',
+ 'ticket',
+ 'client',
+ ])->whereIn('id', $statusIds)->get()->keyBy('id');
+
+ $toStatusResource = static function (?array $ride) use ($statuses): ?array {
+ if ($ride === null) {
+ return null;
+ }
+ $status = $statuses[$ride['status_id']] ?? null;
+
+ return $status ? (new StatusResource($status))->resolve() : null;
+ };
+
+ $summary['longest_ride'] = $toStatusResource($summary['longest_ride']);
+ $summary['shortest_ride'] = $toStatusResource($summary['shortest_ride']);
+
+ return ['summary' => $summary];
+ });
+
+ return $this->sendResponse(data: $data);
+ }
+
+ #[OA\Get(
+ path: '/statistics/history',
+ operationId: 'getStatisticsHistory',
+ summary: 'Get all-time checkin counts and distances grouped by year, month, and week',
+ security: [['passport' => ['read-statistics']], ['token' => []]],
+ tags: ['Statistics'],
+ responses: [
+ new OA\Response(
+ response: 200,
+ description: 'successful operation',
+ content: new OA\JsonContent(
+ properties: [
+ new OA\Property(
+ property: 'data',
+ properties: [
+ new OA\Property(property: 'yearly', type: 'array', items: new OA\Items(
+ properties: [
+ new OA\Property(property: 'period', type: 'string', example: '2024'),
+ new OA\Property(property: 'period_type', type: 'string', example: 'year'),
+ new OA\Property(property: 'checkin_count', type: 'integer', example: 42),
+ new OA\Property(property: 'distance_km', type: 'number', format: 'float', example: 1234.56),
+ ],
+ )),
+ new OA\Property(property: 'monthly', type: 'array', items: new OA\Items()),
+ new OA\Property(property: 'weekly', type: 'array', items: new OA\Items()),
+ ],
+ type: 'object',
+ ),
+ ],
+ ),
+ ),
+ new OA\Response(response: 401, description: 'Unauthorized'),
+ ],
+ )]
+ public function getHistory(): JsonResponse
+ {
+ /** @var User $user */
+ $user = auth()->user();
+
+ $cacheKey = "stats.history.{$user->id}";
+ $data = Cache::remember($cacheKey, 21600, fn () => $this->statisticsService->getHistory($user));
+
+ return $this->sendResponse(data: $data);
+ }
+
+ #[OA\Get(
+ path: '/statistics/favorites',
+ operationId: 'getStatisticsFavorites',
+ summary: 'Get favorite stations, lines, and routes for a date range',
+ security: [['passport' => ['read-statistics']], ['token' => []]],
+ tags: ['Statistics'],
+ parameters: [
+ new OA\Parameter(name: 'from', in: 'query', description: 'Start date', example: '2024-01-01'),
+ new OA\Parameter(name: 'until', in: 'query', description: 'End date', example: '2024-12-31'),
+ ],
+ responses: [
+ new OA\Response(
+ response: 200,
+ description: 'successful operation',
+ content: new OA\JsonContent(
+ properties: [
+ new OA\Property(
+ property: 'data',
+ properties: [
+ new OA\Property(property: 'stations', type: 'array', items: new OA\Items(
+ properties: [
+ new OA\Property(property: 'station_id', type: 'integer', example: 1),
+ new OA\Property(property: 'name', type: 'string', example: 'Frankfurt Hbf'),
+ new OA\Property(property: 'count', type: 'integer', example: 12),
+ ],
+ )),
+ new OA\Property(property: 'lines', type: 'array', items: new OA\Items()),
+ new OA\Property(property: 'routes', type: 'array', items: new OA\Items()),
+ ],
+ type: 'object',
+ ),
+ ],
+ ),
+ ),
+ new OA\Response(response: 400, description: 'Bad request'),
+ new OA\Response(response: 401, description: 'Unauthorized'),
+ ],
+ )]
+ public function getFavorites(Request $request): JsonResponse
+ {
+ $validated = $request->validate([
+ 'from' => ['nullable', 'date'],
+ 'until' => ['nullable', 'date', 'after_or_equal:from'],
+ ]);
+
+ $from = isset($validated['from']) ? Carbon::parse($validated['from']) : Carbon::now()->subWeeks(4);
+ $until = isset($validated['until']) ? Carbon::parse($validated['until']) : Carbon::now();
+
+ /** @var User $user */
+ $user = auth()->user();
+
+ $cacheKey = "stats.favorites.{$user->id}.{$from->toDateString()}.{$until->toDateString()}";
+ $data = Cache::remember($cacheKey, 3600, fn () => $this->statisticsService->getFavorites($user, $from, $until));
+
+ return $this->sendResponse(data: $data);
+ }
}
diff --git a/app/Http/Controllers/API/v1/StatusController.php b/app/Http/Controllers/API/v1/StatusController.php
index c97a4b2e9..8757e316b 100644
--- a/app/Http/Controllers/API/v1/StatusController.php
+++ b/app/Http/Controllers/API/v1/StatusController.php
@@ -955,8 +955,8 @@ public function getActiveStatus(): StatusResource|JsonResponse
$latestStatuses = UserBackend::statusesForUser(Auth::user());
if ($latestStatuses->count() > 0) {
foreach ($latestStatuses as $status) {
- if ($status->checkin->originStopover->departure->isPast()
- && $status->checkin->destinationStopover->arrival->isFuture()) {
+ if ($status->checkin->originStopover?->departure?->isPast()
+ && $status->checkin->destinationStopover?->arrival?->isFuture()) {
return new StatusResource($status);
}
}
diff --git a/app/Http/Controllers/Backend/StatisticController.php b/app/Http/Controllers/Backend/StatisticController.php
index 16325f664..3a9fec056 100644
--- a/app/Http/Controllers/Backend/StatisticController.php
+++ b/app/Http/Controllers/Backend/StatisticController.php
@@ -12,6 +12,20 @@
abstract class StatisticController extends Controller
{
+ private static function diffSeconds(string $from, string $to): string
+ {
+ return DB::getDriverName() === 'sqlite'
+ ? "CAST((julianday($to) - julianday($from)) * 86400 AS INTEGER)"
+ : "TIMESTAMPDIFF(SECOND, $from, $to)";
+ }
+
+ private static function diffMinutes(string $from, string $to): string
+ {
+ return DB::getDriverName() === 'sqlite'
+ ? "CAST((julianday($to) - julianday($from)) * 1440 AS INTEGER)"
+ : "TIMESTAMPDIFF(MINUTE, $from, $to)";
+ }
+
/**
* @api v1
*/
@@ -39,12 +53,7 @@ private static function globalCheckinQuery(?Carbon $from = null, ?Carbon $until
}
$query->selectRaw('SUM(train_checkins.distance) AS distance');
$query->selectRaw('COUNT(DISTINCT train_checkins.user_id) AS userCount');
-
- if (DB::getDriverName() === 'sqlite') {
- $query->selectRaw('1337 AS duration');
- } else {
- $query->selectRaw('SUM(TIMESTAMPDIFF(SECOND, train_checkins.departure, train_checkins.arrival)) AS duration');
- }
+ $query->selectRaw('SUM(' . self::diffSeconds('train_checkins.departure', 'train_checkins.arrival') . ') AS duration');
$result = $query->first();
@@ -81,8 +90,7 @@ public static function getTopTravelCategoryByUser(
->select([
'hafas_trips.category AS name',
DB::raw('COUNT(*) AS count'),
- DB::raw('SUM(TIMESTAMPDIFF(MINUTE, train_checkins.departure,
- train_checkins.arrival)) AS duration'),
+ DB::raw('SUM(' . self::diffMinutes('train_checkins.departure', 'train_checkins.arrival') . ') AS duration'),
])
->orderByDesc(DB::raw('COUNT(*)'))
->limit($limit)
@@ -122,8 +130,7 @@ public static function getTopTripOperatorByUser(
->select([
'operators.name',
DB::raw('COUNT(*) AS count'),
- DB::raw('SUM(TIMESTAMPDIFF(MINUTE, train_checkins.departure,
- train_checkins.arrival)) AS duration'),
+ DB::raw('SUM(' . self::diffMinutes('train_checkins.departure', 'train_checkins.arrival') . ') AS duration'),
])
->orderByDesc(DB::raw('COUNT(*)'))
->limit($limit)
@@ -166,7 +173,7 @@ public static function getDailyTravelTimeByUser(User $user, Carbon $from, Carbon
->select([
DB::raw('DATE(train_checkins.departure) AS date'),
DB::raw('COUNT(*) AS count'),
- DB::raw('SUM(TIMESTAMPDIFF(MINUTE, departure, arrival)) AS duration'),
+ DB::raw('SUM(' . self::diffMinutes('departure', 'arrival') . ') AS duration'),
])
->orderBy(DB::raw('date'))
->get();
@@ -211,7 +218,7 @@ public static function getTravelPurposes(User $user, Carbon $from, Carbon $until
->select([
DB::raw('statuses.business AS reason'),
DB::raw('COUNT(*) AS count'),
- DB::raw('SUM(TIMESTAMPDIFF(MINUTE, departure, arrival)) AS duration'),
+ DB::raw('SUM(' . self::diffMinutes('departure', 'arrival') . ') AS duration'),
])
->orderByDesc('duration')
->get()
@@ -223,349 +230,239 @@ public static function getTravelPurposes(User $user, Carbon $from, Carbon $until
});
}
- /**
- * Get distance and count summary for a user within a date range
- * @api v1
- */
- public static function getAdvancedSummary(
- User $user,
- Carbon $from,
- Carbon $until
- ): array {
- $from->startOfDay();
- $until->endOfDay();
+ public static function getAdvancedSummary(User $user, Carbon $from, Carbon $until): array
+ {
+ $from = $from->clone()->startOfDay();
+ $until = $until->clone()->endOfDay();
if ($from->isAfter($until)) {
throw new InvalidArgumentException('since cannot be after until');
}
$summary = DB::table('train_checkins')
- ->join('statuses', 'train_checkins.status_id', '=', 'statuses.id')
- ->where('statuses.user_id', '=', $user->id)
- ->where('train_checkins.departure', '>=', $from->toIso8601String())
- ->where('train_checkins.departure', '<=', $until->toIso8601String())
+ ->where('train_checkins.user_id', '=', $user->id)
+ ->whereBetween('train_checkins.departure', [$from, $until])
->where('train_checkins.distance', '>', 0)
- ->select([
- DB::raw('COUNT(*) AS total_checkins'),
- DB::raw('COUNT(DISTINCT DATE(train_checkins.departure)) AS active_days'),
- DB::raw('SUM(train_checkins.distance) AS total_distance_meters'),
- DB::raw('AVG(train_checkins.distance) AS mean_distance_meters'),
- DB::raw('MAX(train_checkins.distance) AS max_distance'),
- DB::raw('MIN(train_checkins.distance) AS min_distance'),
- ])
+ ->whereNotNull('train_checkins.origin_stopover_id')
+ ->whereNotNull('train_checkins.destination_stopover_id')
+ ->selectRaw(
+ 'COUNT(*) AS total_checkins,'
+ . ' COUNT(DISTINCT DATE(departure)) AS active_days,'
+ . ' SUM(distance) AS total_distance_meters,'
+ . ' AVG(distance) AS mean_distance_meters'
+ )
->first();
- $longest = DB::table('train_checkins')
- ->join('statuses', 'train_checkins.status_id', '=', 'statuses.id')
- ->join('hafas_trips', 'train_checkins.trip_id', '=', 'hafas_trips.trip_id')
- ->leftJoin('operators', 'operators.id', '=', 'hafas_trips.operator_id')
- ->leftJoin('train_stations as origin_station', 'origin_station.id', '=', 'hafas_trips.origin_id')
- ->leftJoin('train_stations as destination_station', 'destination_station.id', '=', 'hafas_trips.destination_id')
- ->where('statuses.user_id', '=', $user->id)
- ->where('train_checkins.departure', '>=', $from->toIso8601String())
- ->where('train_checkins.departure', '<=', $until->toIso8601String())
- ->where('train_checkins.distance', '>', 0)
- ->orderByDesc('train_checkins.distance')
- ->select([
- 'train_checkins.id',
- 'train_checkins.distance',
- 'train_checkins.departure',
- 'hafas_trips.departure as start',
- 'hafas_trips.arrival as end',
- 'hafas_trips.linename',
- 'hafas_trips.number',
- 'operators.name as operator_name',
- 'origin_station.name as origin_name',
- 'destination_station.name as destination_name',
- ])
- ->first();
+ $rideSelect = [
+ 'train_checkins.id',
+ 'train_checkins.status_id',
+ 'train_checkins.distance',
+ 'train_checkins.departure',
+ 'hafas_trips.departure as start',
+ 'hafas_trips.arrival as end',
+ 'hafas_trips.linename',
+ 'hafas_trips.number',
+ 'operators.name as operator_name',
+ 'origin_station.name as origin_name',
+ 'destination_station.name as destination_name',
+ ];
- $shortest = DB::table('train_checkins')
- ->join('statuses', 'train_checkins.status_id', '=', 'statuses.id')
+ $rideBase = DB::table('train_checkins')
->join('hafas_trips', 'train_checkins.trip_id', '=', 'hafas_trips.trip_id')
->leftJoin('operators', 'operators.id', '=', 'hafas_trips.operator_id')
->leftJoin('train_stations as origin_station', 'origin_station.id', '=', 'hafas_trips.origin_id')
->leftJoin('train_stations as destination_station', 'destination_station.id', '=', 'hafas_trips.destination_id')
- ->where('statuses.user_id', '=', $user->id)
- ->where('train_checkins.departure', '>=', $from->toIso8601String())
- ->where('train_checkins.departure', '<=', $until->toIso8601String())
+ ->where('train_checkins.user_id', '=', $user->id)
+ ->whereBetween('train_checkins.departure', [$from, $until])
->where('train_checkins.distance', '>', 0)
- ->orderBy('train_checkins.distance')
- ->select([
- 'train_checkins.id',
- 'train_checkins.distance',
- 'train_checkins.departure',
- 'hafas_trips.departure as start',
- 'hafas_trips.arrival as end',
- 'hafas_trips.linename',
- 'hafas_trips.number',
- 'operators.name as operator_name',
- 'origin_station.name as origin_name',
- 'destination_station.name as destination_name',
- ])
- ->first();
+ ->whereNotNull('train_checkins.origin_stopover_id')
+ ->whereNotNull('train_checkins.destination_stopover_id')
+ ->select($rideSelect);
+
+ $longest = (clone $rideBase)->orderByDesc('train_checkins.distance')->first();
+ $shortest = (clone $rideBase)->orderBy('train_checkins.distance')->first();
+
+ $toRideArray = static function (?object $ride): ?array {
+ if ($ride === null) {
+ return null;
+ }
+
+ return [
+ 'id' => $ride->id,
+ 'status_id' => $ride->status_id,
+ 'distance_km' => round($ride->distance / 1000, 2),
+ 'departure' => $ride->departure,
+ 'start' => $ride->start,
+ 'end' => $ride->end,
+ 'linename' => $ride->linename,
+ 'number' => $ride->number,
+ 'operator' => $ride->operator_name,
+ 'origin' => $ride->origin_name,
+ 'destination' => $ride->destination_name,
+ ];
+ };
return [
'total_checkins' => (int) ($summary->total_checkins ?? 0),
'active_days' => (int) ($summary->active_days ?? 0),
'total_distance_km' => round(($summary->total_distance_meters ?? 0) / 1000, 2),
'mean_distance_km' => round(($summary->mean_distance_meters ?? 0) / 1000, 2),
- 'longest_ride' => $longest ? [
- 'id' => $longest->id,
- 'distance_km' => round($longest->distance / 1000, 2),
- 'departure' => $longest->departure,
- 'start' => $longest->start,
- 'end' => $longest->end,
- 'linename' => $longest->linename,
- 'number' => $longest->number,
- 'operator' => $longest->operator_name,
- 'origin' => $longest->origin_name,
- 'destination' => $longest->destination_name,
- ] : null,
- 'shortest_ride' => $shortest ? [
- 'id' => $shortest->id,
- 'distance_km' => round($shortest->distance / 1000, 2),
- 'departure' => $shortest->departure,
- 'start' => $shortest->start,
- 'end' => $shortest->end,
- 'linename' => $shortest->linename,
- 'number' => $shortest->number,
- 'operator' => $shortest->operator_name,
- 'origin' => $shortest->origin_name,
- 'destination' => $shortest->destination_name,
- ] : null,
+ 'longest_ride' => $toRideArray($longest),
+ 'shortest_ride' => $toRideArray($shortest),
];
}
- /**
- * Get distance and checkin counts aggregated by year
- * @api v1
- */
public static function getDistancePerYear(User $user): Collection
{
- $driver = DB::getDriverName();
- $periodExpression = $driver === 'sqlite'
- ? 'strftime("%Y", train_checkins.departure)'
- : 'YEAR(train_checkins.departure)';
- $periodSelect = DB::raw($periodExpression . ' AS year');
+ $isSqlite = DB::getDriverName() === 'sqlite';
+ $expr = $isSqlite
+ ? 'strftime("%Y", departure)'
+ : 'YEAR(departure)';
return DB::table('train_checkins')
- ->join('statuses', 'train_checkins.status_id', '=', 'statuses.id')
- ->where('statuses.user_id', '=', $user->id)
- ->where('train_checkins.distance', '>', 0)
- ->groupBy(DB::raw($periodExpression))
- ->select([
- $periodSelect,
- DB::raw('COUNT(*) AS checkin_count'),
- DB::raw('SUM(train_checkins.distance) AS total_distance_meters'),
- ])
- ->orderBy('year')
+ ->where('user_id', '=', $user->id)
+ ->where('distance', '>', 0)
+ ->groupByRaw($expr)
+ ->selectRaw("$expr AS period, COUNT(*) AS checkin_count, SUM(distance) AS total_distance_meters")
+ ->orderByRaw($expr)
->get()
- ->map(function ($row) {
- return [
- 'period' => (string) $row->year,
- 'period_type' => 'year',
- 'checkin_count' => (int) $row->checkin_count,
- 'distance_km' => round($row->total_distance_meters / 1000, 2),
- ];
- });
+ ->map(static fn ($row) => [
+ 'period' => (string) $row->period,
+ 'period_type' => 'year',
+ 'checkin_count' => (int) $row->checkin_count,
+ 'distance_km' => round($row->total_distance_meters / 1000, 2),
+ ]);
}
- /**
- * Get distance and checkin counts aggregated by month
- * @api v1
- */
public static function getDistancePerMonth(User $user, ?int $year = null): Collection
{
+ $isSqlite = DB::getDriverName() === 'sqlite';
+ $expr = $isSqlite
+ ? 'strftime("%Y-%m", departure)'
+ : 'DATE_FORMAT(departure, "%Y-%m")';
+
$query = DB::table('train_checkins')
- ->join('statuses', 'train_checkins.status_id', '=', 'statuses.id')
- ->where('statuses.user_id', '=', $user->id)
- ->where('train_checkins.distance', '>', 0);
+ ->where('user_id', '=', $user->id)
+ ->where('distance', '>', 0);
if ($year !== null) {
- $query->whereYear('train_checkins.departure', $year);
+ $query->whereYear('departure', $year);
}
- $driver = DB::getDriverName();
- $periodExpression = $driver === 'sqlite'
- ? 'strftime("%Y-%m", train_checkins.departure)'
- : 'DATE_FORMAT(train_checkins.departure, "%Y-%m")';
- $periodSelect = DB::raw($periodExpression . ' AS period');
-
return $query
- ->groupBy(DB::raw($periodExpression))
- ->select([
- $periodSelect,
- DB::raw('COUNT(*) AS checkin_count'),
- DB::raw('SUM(train_checkins.distance) AS total_distance_meters'),
- ])
- ->orderBy('period')
+ ->groupByRaw($expr)
+ ->selectRaw("$expr AS period, COUNT(*) AS checkin_count, SUM(distance) AS total_distance_meters")
+ ->orderByRaw($expr)
->get()
- ->map(function ($row) {
- return [
- 'period' => $row->period,
- 'period_type' => 'month',
- 'checkin_count' => (int) $row->checkin_count,
- 'distance_km' => round($row->total_distance_meters / 1000, 2),
- ];
- });
+ ->map(static fn ($row) => [
+ 'period' => $row->period,
+ 'period_type' => 'month',
+ 'checkin_count' => (int) $row->checkin_count,
+ 'distance_km' => round($row->total_distance_meters / 1000, 2),
+ ]);
}
- /**
- * Get distance and checkin counts aggregated by week
- * @api v1
- */
public static function getDistancePerWeek(User $user, ?int $year = null, ?int $month = null): Collection
{
+ $isSqlite = DB::getDriverName() === 'sqlite';
+ // MySQL mode 3 = ISO 8601 (Monday-based, week 1 contains Jan 4)
+ $expr = $isSqlite
+ ? 'strftime("%Y-W%W", departure)'
+ : 'CONCAT(YEAR(departure), "-W", LPAD(WEEK(departure, 3), 2, "0"))';
+
$query = DB::table('train_checkins')
- ->join('statuses', 'train_checkins.status_id', '=', 'statuses.id')
- ->where('statuses.user_id', '=', $user->id)
- ->where('train_checkins.distance', '>', 0);
+ ->where('user_id', '=', $user->id)
+ ->where('distance', '>', 0);
if ($year !== null) {
- $query->whereYear('train_checkins.departure', $year);
+ $query->whereYear('departure', $year);
}
if ($month !== null) {
- $query->whereMonth('train_checkins.departure', $month);
+ $query->whereMonth('departure', $month);
}
- $driver = DB::getDriverName();
- $periodExpression = $driver === 'sqlite'
- ? 'strftime("%Y-W%W", train_checkins.departure)'
- : 'CONCAT(YEAR(train_checkins.departure), "-W", LPAD(WEEK(train_checkins.departure), 2, "0"))';
- $periodSelect = DB::raw($periodExpression . ' AS period');
-
return $query
- ->groupBy(DB::raw($periodExpression))
- ->select([
- $periodSelect,
- DB::raw('COUNT(*) AS checkin_count'),
- DB::raw('SUM(train_checkins.distance) AS total_distance_meters'),
- ])
- ->orderBy('period')
+ ->groupByRaw($expr)
+ ->selectRaw("$expr AS period, COUNT(*) AS checkin_count, SUM(distance) AS total_distance_meters")
+ ->orderByRaw($expr)
->get()
- ->map(function ($row) {
- return [
- 'period' => $row->period,
- 'period_type' => 'week',
- 'checkin_count' => (int) $row->checkin_count,
- 'distance_km' => round($row->total_distance_meters / 1000, 2),
- ];
- });
+ ->map(static fn ($row) => [
+ 'period' => $row->period,
+ 'period_type' => 'week',
+ 'checkin_count' => (int) $row->checkin_count,
+ 'distance_km' => round($row->total_distance_meters / 1000, 2),
+ ]);
}
- /**
- * Get summary statistics for last N days
- * @api v1
- */
public static function getStatsForLastDays(User $user, int $days): array
{
$until = Carbon::now();
- $from = $until->clone()->subDays($days);
+ $from = Carbon::now()->subDays($days);
return self::getAdvancedSummary($user, $from, $until);
}
- /**
- * Get summary statistics for last week (7 days)
- * @api v1
- */
public static function getLastWeekStats(User $user): array
{
return self::getStatsForLastDays($user, 7);
}
- /**
- * Get summary statistics for last month (30 days)
- * @api v1
- */
public static function getLastMonthStats(User $user): array
{
return self::getStatsForLastDays($user, 30);
}
- /**
- * Get summary statistics for last year (365 days)
- * @api v1
- */
public static function getLastYearStats(User $user): array
{
return self::getStatsForLastDays($user, 365);
}
- /**
- * Get most visited stations (as origin or destination) for a user.
- * @api v1
- */
- public static function getFavoriteStations(
- User $user,
- Carbon $from,
- Carbon $until,
- int $limit = 10
- ): Collection {
- $from->startOfDay();
- $until->endOfDay();
+ public static function getFavoriteStations(User $user, Carbon $from, Carbon $until, int $limit = 10): Collection
+ {
+ $from = $from->clone()->startOfDay();
+ $until = $until->clone()->endOfDay();
+
+ $origins = DB::table('train_checkins')
+ ->join('train_stopovers as sv', 'train_checkins.origin_stopover_id', '=', 'sv.id')
+ ->where('train_checkins.user_id', '=', $user->id)
+ ->whereBetween('train_checkins.departure', [$from, $until])
+ ->whereNotNull('train_checkins.origin_stopover_id')
+ ->select('sv.train_station_id as station_id');
$destinations = DB::table('train_checkins')
- ->join('statuses', 'train_checkins.status_id', '=', 'statuses.id')
->join('train_stopovers as sv', 'train_checkins.destination_stopover_id', '=', 'sv.id')
- ->where('statuses.user_id', '=', $user->id)
- ->where('train_checkins.departure', '>=', $from->toIso8601String())
- ->where('train_checkins.departure', '<=', $until->toIso8601String())
+ ->where('train_checkins.user_id', '=', $user->id)
+ ->whereBetween('train_checkins.departure', [$from, $until])
->whereNotNull('train_checkins.destination_stopover_id')
->select('sv.train_station_id as station_id');
- $allStations = DB::table('train_checkins')
- ->join('statuses', 'train_checkins.status_id', '=', 'statuses.id')
- ->join('train_stopovers as sv', 'train_checkins.origin_stopover_id', '=', 'sv.id')
- ->where('statuses.user_id', '=', $user->id)
- ->where('train_checkins.departure', '>=', $from->toIso8601String())
- ->where('train_checkins.departure', '<=', $until->toIso8601String())
- ->whereNotNull('train_checkins.origin_stopover_id')
- ->select('sv.train_station_id as station_id')
- ->unionAll($destinations);
+ $combined = $origins->unionAll($destinations);
- return DB::table(DB::raw("({$allStations->toSql()}) as combined"))
- ->mergeBindings($allStations)
+ return DB::table(DB::raw("({$combined->toSql()}) as combined"))
+ ->mergeBindings($combined)
->join('train_stations', 'combined.station_id', '=', 'train_stations.id')
->groupBy('combined.station_id', 'train_stations.name')
- ->select([
- 'combined.station_id',
- 'train_stations.name',
- DB::raw('COUNT(*) AS visit_count'),
- ])
+ ->select(['combined.station_id', 'train_stations.name', DB::raw('COUNT(*) AS visit_count')])
->orderByDesc('visit_count')
->limit($limit)
->get()
- ->map(function ($row) {
- return [
- 'station_id' => (int) $row->station_id,
- 'name' => $row->name,
- 'count' => (int) $row->visit_count,
- ];
- });
+ ->map(static fn ($row) => [
+ 'station_id' => (int) $row->station_id,
+ 'name' => $row->name,
+ 'count' => (int) $row->visit_count,
+ ]);
}
- /**
- * Get most used train lines (by linename) for a user.
- * @api v1
- */
- public static function getFavoriteLines(
- User $user,
- Carbon $from,
- Carbon $until,
- int $limit = 10
- ): Collection {
- $from->startOfDay();
- $until->endOfDay();
+ public static function getFavoriteLines(User $user, Carbon $from, Carbon $until, int $limit = 10): Collection
+ {
+ $from = $from->clone()->startOfDay();
+ $until = $until->clone()->endOfDay();
return DB::table('train_checkins')
- ->join('statuses', 'train_checkins.status_id', '=', 'statuses.id')
->join('hafas_trips', 'train_checkins.trip_id', '=', 'hafas_trips.trip_id')
- ->where('statuses.user_id', '=', $user->id)
- ->where('train_checkins.departure', '>=', $from->toIso8601String())
- ->where('train_checkins.departure', '<=', $until->toIso8601String())
+ ->where('train_checkins.user_id', '=', $user->id)
+ ->whereBetween('train_checkins.departure', [$from, $until])
->whereNotNull('hafas_trips.linename')
->groupBy('hafas_trips.linename', 'hafas_trips.number')
->select([
@@ -577,38 +474,26 @@ public static function getFavoriteLines(
->orderByDesc('count')
->limit($limit)
->get()
- ->map(function ($row) {
- return [
- 'linename' => $row->linename,
- 'number' => $row->number,
- 'count' => (int) $row->count,
- 'distance_km' => round(($row->total_distance_meters ?? 0) / 1000, 2),
- ];
- });
+ ->map(static fn ($row) => [
+ 'linename' => $row->linename,
+ 'number' => $row->number,
+ 'count' => (int) $row->count,
+ 'distance_km' => round(($row->total_distance_meters ?? 0) / 1000, 2),
+ ]);
}
- /**
- * Get most used origin→destination station pairs for a user.
- * @api v1
- */
- public static function getFavoriteRoutes(
- User $user,
- Carbon $from,
- Carbon $until,
- int $limit = 10
- ): Collection {
- $from->startOfDay();
- $until->endOfDay();
+ public static function getFavoriteRoutes(User $user, Carbon $from, Carbon $until, int $limit = 10): Collection
+ {
+ $from = $from->clone()->startOfDay();
+ $until = $until->clone()->endOfDay();
return DB::table('train_checkins')
- ->join('statuses', 'train_checkins.status_id', '=', 'statuses.id')
->join('train_stopovers as orig_sv', 'train_checkins.origin_stopover_id', '=', 'orig_sv.id')
->join('train_stations as orig_st', 'orig_sv.train_station_id', '=', 'orig_st.id')
->join('train_stopovers as dest_sv', 'train_checkins.destination_stopover_id', '=', 'dest_sv.id')
->join('train_stations as dest_st', 'dest_sv.train_station_id', '=', 'dest_st.id')
- ->where('statuses.user_id', '=', $user->id)
- ->where('train_checkins.departure', '>=', $from->toIso8601String())
- ->where('train_checkins.departure', '<=', $until->toIso8601String())
+ ->where('train_checkins.user_id', '=', $user->id)
+ ->whereBetween('train_checkins.departure', [$from, $until])
->whereNotNull('train_checkins.origin_stopover_id')
->whereNotNull('train_checkins.destination_stopover_id')
->groupBy('orig_sv.train_station_id', 'dest_sv.train_station_id', 'orig_st.name', 'dest_st.name')
@@ -623,15 +508,13 @@ public static function getFavoriteRoutes(
->orderByDesc('count')
->limit($limit)
->get()
- ->map(function ($row) {
- return [
- 'origin_id' => (int) $row->origin_id,
- 'origin' => $row->origin_name,
- 'destination_id' => (int) $row->destination_id,
- 'destination' => $row->destination_name,
- 'count' => (int) $row->count,
- 'distance_km' => round(($row->total_distance_meters ?? 0) / 1000, 2),
- ];
- });
+ ->map(static fn ($row) => [
+ 'origin_id' => (int) $row->origin_id,
+ 'origin' => $row->origin_name,
+ 'destination_id' => (int) $row->destination_id,
+ 'destination' => $row->destination_name,
+ 'count' => (int) $row->count,
+ 'distance_km' => round(($row->total_distance_meters ?? 0) / 1000, 2),
+ ]);
}
}
diff --git a/app/Repositories/StatisticsRepository.php b/app/Repositories/StatisticsRepository.php
new file mode 100644
index 000000000..67e1cd967
--- /dev/null
+++ b/app/Repositories/StatisticsRepository.php
@@ -0,0 +1,328 @@
+where('train_checkins.user_id', '=', $user->id)
+ ->whereBetween('train_checkins.departure', [$from, $until])
+ ->where('train_checkins.distance', '>', 0)
+ ->whereNotNull('train_checkins.origin_stopover_id')
+ ->whereNotNull('train_checkins.destination_stopover_id');
+ }
+
+ public function globalStats(?Carbon $from = null, ?Carbon $until = null): GlobalCheckinStats
+ {
+ $query = DB::table('train_checkins');
+
+ if ($from !== null && $until !== null) {
+ $query->whereBetween('train_checkins.departure', [$from, $until]);
+ }
+
+ $query->selectRaw('SUM(train_checkins.distance) AS distance')
+ ->selectRaw('COUNT(DISTINCT train_checkins.user_id) AS userCount')
+ ->selectRaw('SUM(' . self::diffSeconds('train_checkins.departure', 'train_checkins.arrival') . ') AS duration');
+
+ $result = $query->first();
+
+ return new GlobalCheckinStats(
+ $result->distance ?? 0,
+ $result->duration ?? 0,
+ $result->userCount ?? 0,
+ );
+ }
+
+ public function travelPurposes(User $user, Carbon $from, Carbon $until): Collection
+ {
+ return DB::table('train_checkins')
+ ->join('statuses', 'train_checkins.status_id', '=', 'statuses.id')
+ ->where('statuses.user_id', '=', $user->id)
+ ->whereBetween('train_checkins.departure', [$from, $until])
+ ->groupBy('statuses.business')
+ ->select([
+ DB::raw('statuses.business AS reason'),
+ DB::raw('COUNT(*) AS count'),
+ DB::raw('SUM(' . self::diffMinutes('departure', 'arrival') . ') AS duration'),
+ ])
+ ->orderByDesc('duration')
+ ->get()
+ ->map(static function ($row): object {
+ $row->count = (int) $row->count;
+ $row->duration = (int) $row->duration;
+
+ return $row;
+ });
+ }
+
+ public function travelCategories(User $user, Carbon $from, Carbon $until, int $limit = 10): Collection
+ {
+ return DB::table('train_checkins')
+ ->join('statuses', 'train_checkins.status_id', '=', 'statuses.id')
+ ->join('hafas_trips', 'train_checkins.trip_id', '=', 'hafas_trips.trip_id')
+ ->where('statuses.user_id', '=', $user->id)
+ ->whereBetween('train_checkins.departure', [$from, $until])
+ ->groupBy('hafas_trips.category')
+ ->select([
+ 'hafas_trips.category AS name',
+ DB::raw('COUNT(*) AS count'),
+ DB::raw('SUM(' . self::diffMinutes('train_checkins.departure', 'train_checkins.arrival') . ') AS duration'),
+ ])
+ ->orderByDesc(DB::raw('COUNT(*)'))
+ ->limit($limit)
+ ->get()
+ ->map(static function ($row): object {
+ $row->count = (int) $row->count;
+ $row->duration = (int) $row->duration;
+
+ return $row;
+ });
+ }
+
+ public function tripOperators(User $user, Carbon $from, Carbon $until, int $limit = 10): Collection
+ {
+ return DB::table('train_checkins')
+ ->join('statuses', 'train_checkins.status_id', '=', 'statuses.id')
+ ->join('hafas_trips', 'train_checkins.trip_id', '=', 'hafas_trips.trip_id')
+ ->leftJoin('operators', 'operators.id', '=', 'hafas_trips.operator_id')
+ ->where('statuses.user_id', '=', $user->id)
+ ->whereBetween('train_checkins.departure', [$from, $until])
+ ->groupBy('operators.name')
+ ->select([
+ 'operators.name',
+ DB::raw('COUNT(*) AS count'),
+ DB::raw('SUM(' . self::diffMinutes('train_checkins.departure', 'train_checkins.arrival') . ') AS duration'),
+ ])
+ ->orderByDesc(DB::raw('COUNT(*)'))
+ ->limit($limit)
+ ->get()
+ ->map(static function ($row): object {
+ $row->count = (int) $row->count;
+ $row->duration = (int) $row->duration;
+
+ return $row;
+ });
+ }
+
+ public function dailyTravelTime(User $user, Carbon $from, Carbon $until): Collection
+ {
+ return DB::table('train_checkins')
+ ->join('statuses', 'train_checkins.status_id', '=', 'statuses.id')
+ ->where('statuses.user_id', '=', $user->id)
+ ->whereBetween('train_checkins.departure', [$from, $until])
+ ->groupBy(DB::raw('DATE(train_checkins.departure)'))
+ ->select([
+ DB::raw('DATE(train_checkins.departure) AS date'),
+ DB::raw('COUNT(*) AS count'),
+ DB::raw('SUM(' . self::diffMinutes('departure', 'arrival') . ') AS duration'),
+ ])
+ ->orderBy(DB::raw('date'))
+ ->get();
+ }
+
+ public function checkinAggregate(User $user, Carbon $from, Carbon $until): ?object
+ {
+ return $this->checkinBase($user, $from, $until)
+ ->selectRaw(
+ 'COUNT(*) AS total_checkins,'
+ . ' COUNT(DISTINCT DATE(departure)) AS active_days,'
+ . ' SUM(distance) AS total_distance_meters,'
+ . ' AVG(distance) AS mean_distance_meters'
+ )
+ ->first();
+ }
+
+ public function longestRide(User $user, Carbon $from, Carbon $until): ?object
+ {
+ return $this->rideBaseQuery($user, $from, $until)
+ ->orderByDesc('train_checkins.distance')
+ ->first();
+ }
+
+ public function shortestRide(User $user, Carbon $from, Carbon $until): ?object
+ {
+ return $this->rideBaseQuery($user, $from, $until)
+ ->orderBy('train_checkins.distance')
+ ->first();
+ }
+
+ private function rideBaseQuery(User $user, Carbon $from, Carbon $until): Builder
+ {
+ return $this->checkinBase($user, $from, $until)
+ ->join('hafas_trips', 'train_checkins.trip_id', '=', 'hafas_trips.trip_id')
+ ->leftJoin('operators', 'operators.id', '=', 'hafas_trips.operator_id')
+ ->leftJoin('train_stations as origin_station', 'origin_station.id', '=', 'hafas_trips.origin_id')
+ ->leftJoin('train_stations as destination_station', 'destination_station.id', '=', 'hafas_trips.destination_id')
+ ->select([
+ 'train_checkins.id',
+ 'train_checkins.status_id',
+ 'train_checkins.distance',
+ 'train_checkins.departure',
+ 'hafas_trips.departure as start',
+ 'hafas_trips.arrival as end',
+ 'hafas_trips.linename',
+ 'hafas_trips.number',
+ 'operators.name as operator_name',
+ 'origin_station.name as origin_name',
+ 'destination_station.name as destination_name',
+ ]);
+ }
+
+ public function distanceByYear(User $user): Collection
+ {
+ $expr = DB::getDriverName() === 'sqlite'
+ ? 'strftime("%Y", departure)'
+ : 'YEAR(departure)';
+
+ return DB::table('train_checkins')
+ ->where('user_id', '=', $user->id)
+ ->where('distance', '>', 0)
+ ->groupByRaw($expr)
+ ->selectRaw("$expr AS period, COUNT(*) AS checkin_count, SUM(distance) AS total_distance_meters")
+ ->orderByRaw($expr)
+ ->get();
+ }
+
+ public function distanceByMonth(User $user, ?int $year = null): Collection
+ {
+ $expr = DB::getDriverName() === 'sqlite'
+ ? 'strftime("%Y-%m", departure)'
+ : 'DATE_FORMAT(departure, "%Y-%m")';
+
+ $query = DB::table('train_checkins')
+ ->where('user_id', '=', $user->id)
+ ->where('distance', '>', 0);
+
+ if ($year !== null) {
+ $query->whereYear('departure', $year);
+ }
+
+ return $query
+ ->groupByRaw($expr)
+ ->selectRaw("$expr AS period, COUNT(*) AS checkin_count, SUM(distance) AS total_distance_meters")
+ ->orderByRaw($expr)
+ ->get();
+ }
+
+ public function distanceByWeek(User $user, ?int $year = null, ?int $month = null): Collection
+ {
+ $expr = DB::getDriverName() === 'sqlite'
+ ? 'strftime("%Y-W%W", departure)'
+ : 'CONCAT(YEAR(departure), "-W", LPAD(WEEK(departure, 3), 2, "0"))';
+
+ $query = DB::table('train_checkins')
+ ->where('user_id', '=', $user->id)
+ ->where('distance', '>', 0);
+
+ if ($year !== null) {
+ $query->whereYear('departure', $year);
+ }
+
+ if ($month !== null) {
+ $query->whereMonth('departure', $month);
+ }
+
+ return $query
+ ->groupByRaw($expr)
+ ->selectRaw("$expr AS period, COUNT(*) AS checkin_count, SUM(distance) AS total_distance_meters")
+ ->orderByRaw($expr)
+ ->get();
+ }
+
+ public function favoriteStations(User $user, Carbon $from, Carbon $until, int $limit = 10): Collection
+ {
+ $origins = DB::table('train_checkins')
+ ->join('train_stopovers as sv', 'train_checkins.origin_stopover_id', '=', 'sv.id')
+ ->where('train_checkins.user_id', '=', $user->id)
+ ->whereBetween('train_checkins.departure', [$from, $until])
+ ->whereNotNull('train_checkins.origin_stopover_id')
+ ->select('sv.train_station_id as station_id');
+
+ $destinations = DB::table('train_checkins')
+ ->join('train_stopovers as sv', 'train_checkins.destination_stopover_id', '=', 'sv.id')
+ ->where('train_checkins.user_id', '=', $user->id)
+ ->whereBetween('train_checkins.departure', [$from, $until])
+ ->whereNotNull('train_checkins.destination_stopover_id')
+ ->select('sv.train_station_id as station_id');
+
+ $combined = $origins->unionAll($destinations);
+
+ return DB::table(DB::raw("({$combined->toSql()}) as combined"))
+ ->mergeBindings($combined)
+ ->join('train_stations', 'combined.station_id', '=', 'train_stations.id')
+ ->groupBy('combined.station_id', 'train_stations.name')
+ ->select(['combined.station_id', 'train_stations.name', DB::raw('COUNT(*) AS visit_count')])
+ ->orderByDesc('visit_count')
+ ->limit($limit)
+ ->get();
+ }
+
+ public function favoriteLines(User $user, Carbon $from, Carbon $until, int $limit = 10): Collection
+ {
+ return DB::table('train_checkins')
+ ->join('hafas_trips', 'train_checkins.trip_id', '=', 'hafas_trips.trip_id')
+ ->where('train_checkins.user_id', '=', $user->id)
+ ->whereBetween('train_checkins.departure', [$from, $until])
+ ->whereNotNull('hafas_trips.linename')
+ ->groupBy('hafas_trips.linename', 'hafas_trips.number')
+ ->select([
+ 'hafas_trips.linename',
+ 'hafas_trips.number',
+ DB::raw('COUNT(*) AS count'),
+ DB::raw('SUM(train_checkins.distance) AS total_distance_meters'),
+ ])
+ ->orderByDesc('count')
+ ->limit($limit)
+ ->get();
+ }
+
+ public function favoriteRoutes(User $user, Carbon $from, Carbon $until, int $limit = 10): Collection
+ {
+ return DB::table('train_checkins')
+ ->join('train_stopovers as orig_sv', 'train_checkins.origin_stopover_id', '=', 'orig_sv.id')
+ ->join('train_stations as orig_st', 'orig_sv.train_station_id', '=', 'orig_st.id')
+ ->join('train_stopovers as dest_sv', 'train_checkins.destination_stopover_id', '=', 'dest_sv.id')
+ ->join('train_stations as dest_st', 'dest_sv.train_station_id', '=', 'dest_st.id')
+ ->where('train_checkins.user_id', '=', $user->id)
+ ->whereBetween('train_checkins.departure', [$from, $until])
+ ->whereNotNull('train_checkins.origin_stopover_id')
+ ->whereNotNull('train_checkins.destination_stopover_id')
+ ->groupBy('orig_sv.train_station_id', 'dest_sv.train_station_id', 'orig_st.name', 'dest_st.name')
+ ->select([
+ 'orig_sv.train_station_id as origin_id',
+ 'orig_st.name as origin_name',
+ 'dest_sv.train_station_id as destination_id',
+ 'dest_st.name as destination_name',
+ DB::raw('COUNT(*) AS count'),
+ DB::raw('SUM(train_checkins.distance) AS total_distance_meters'),
+ ])
+ ->orderByDesc('count')
+ ->limit($limit)
+ ->get();
+ }
+}
diff --git a/app/Services/Statistics/StatisticsService.php b/app/Services/Statistics/StatisticsService.php
new file mode 100644
index 000000000..df6e0c3a4
--- /dev/null
+++ b/app/Services/Statistics/StatisticsService.php
@@ -0,0 +1,195 @@
+isAfter($until)) {
+ throw new InvalidArgumentException('from cannot be after until');
+ }
+
+ return $this->repository->globalStats($from, $until);
+ }
+
+ public function getTravelPurposes(User $user, Carbon $from, Carbon $until): Collection
+ {
+ [$from, $until] = $this->dayBounds($from, $until);
+
+ return $this->repository->travelPurposes($user, $from, $until)
+ ->map(static fn ($row) => [
+ 'name' => $row->reason,
+ 'count' => $row->count,
+ 'duration' => $row->duration,
+ ]);
+ }
+
+ public function getTravelCategories(User $user, Carbon $from, Carbon $until, int $limit = 10): Collection
+ {
+ [$from, $until] = $this->dayBounds($from, $until);
+
+ return $this->repository->travelCategories($user, $from, $until, $limit)
+ ->map(static fn ($row) => [
+ 'name' => $row->name,
+ 'count' => $row->count,
+ 'duration' => $row->duration,
+ ]);
+ }
+
+ public function getTripOperators(User $user, Carbon $from, Carbon $until, int $limit = 10): Collection
+ {
+ [$from, $until] = $this->dayBounds($from, $until);
+
+ return $this->repository->tripOperators($user, $from, $until, $limit)
+ ->map(static fn ($row) => [
+ 'name' => $row->name,
+ 'count' => $row->count,
+ 'duration' => $row->duration,
+ ]);
+ }
+
+ public function getDailyTimeline(User $user, Carbon $from, Carbon $until): Collection
+ {
+ [$from, $until] = $this->dayBounds($from, $until);
+
+ $dateList = collect();
+ for ($date = $from->clone(); $date->isBefore($until); $date->addDay()) {
+ $entry = collect();
+ $entry->date = $date->clone();
+ $entry->count = 0;
+ $entry->duration = 0;
+ $dateList->push($entry);
+ }
+
+ foreach ($this->repository->dailyTravelTime($user, $from, $until) as $row) {
+ $obj = $dateList->first(fn ($item) => $item->date->isSameDay(Carbon::parse($row->date)));
+ if ($obj) {
+ $obj->count = (int) $row->count;
+ $obj->duration = (int) $row->duration;
+ }
+ }
+
+ return $dateList->sortBy('date');
+ }
+
+ public function getSummary(User $user, Carbon $from, Carbon $until): array
+ {
+ [$from, $until] = $this->dayBounds($from, $until);
+
+ $aggregate = $this->repository->checkinAggregate($user, $from, $until);
+ $longest = $this->repository->longestRide($user, $from, $until);
+ $shortest = $this->repository->shortestRide($user, $from, $until);
+
+ return [
+ 'total_checkins' => (int) ($aggregate->total_checkins ?? 0),
+ 'active_days' => (int) ($aggregate->active_days ?? 0),
+ 'total_distance_km' => round(($aggregate->total_distance_meters ?? 0) / 1000, 2),
+ 'mean_distance_km' => round(($aggregate->mean_distance_meters ?? 0) / 1000, 2),
+ 'longest_ride' => $this->toRideArray($longest),
+ 'shortest_ride' => $this->toRideArray($shortest),
+ ];
+ }
+
+ public function getHistory(User $user): array
+ {
+ return [
+ 'yearly' => $this->repository->distanceByYear($user)
+ ->map(static fn ($row) => [
+ 'period' => (string) $row->period,
+ 'period_type' => 'year',
+ 'checkin_count' => (int) $row->checkin_count,
+ 'distance_km' => round($row->total_distance_meters / 1000, 2),
+ ]),
+ 'monthly' => $this->repository->distanceByMonth($user)
+ ->map(static fn ($row) => [
+ 'period' => $row->period,
+ 'period_type' => 'month',
+ 'checkin_count' => (int) $row->checkin_count,
+ 'distance_km' => round($row->total_distance_meters / 1000, 2),
+ ]),
+ 'weekly' => $this->repository->distanceByWeek($user)
+ ->map(static fn ($row) => [
+ 'period' => $row->period,
+ 'period_type' => 'week',
+ 'checkin_count' => (int) $row->checkin_count,
+ 'distance_km' => round($row->total_distance_meters / 1000, 2),
+ ]),
+ ];
+ }
+
+ public function getFavorites(User $user, Carbon $from, Carbon $until): array
+ {
+ [$from, $until] = $this->dayBounds($from, $until);
+
+ return [
+ 'stations' => $this->repository->favoriteStations($user, $from, $until)
+ ->map(static fn ($row) => [
+ 'station_id' => (int) $row->station_id,
+ 'name' => $row->name,
+ 'count' => (int) $row->visit_count,
+ ]),
+ 'lines' => $this->repository->favoriteLines($user, $from, $until)
+ ->map(static fn ($row) => [
+ 'linename' => $row->linename,
+ 'number' => $row->number,
+ 'count' => (int) $row->count,
+ 'distance_km' => round(($row->total_distance_meters ?? 0) / 1000, 2),
+ ]),
+ 'routes' => $this->repository->favoriteRoutes($user, $from, $until)
+ ->map(static fn ($row) => [
+ 'origin_id' => (int) $row->origin_id,
+ 'origin' => $row->origin_name,
+ 'destination_id' => (int) $row->destination_id,
+ 'destination' => $row->destination_name,
+ 'count' => (int) $row->count,
+ 'distance_km' => round(($row->total_distance_meters ?? 0) / 1000, 2),
+ ]),
+ ];
+ }
+
+ private function toRideArray(?object $ride): ?array
+ {
+ if ($ride === null) {
+ return null;
+ }
+
+ return [
+ 'id' => $ride->id,
+ 'status_id' => $ride->status_id,
+ 'distance_km' => round($ride->distance / 1000, 2),
+ 'departure' => $ride->departure,
+ 'start' => $ride->start,
+ 'end' => $ride->end,
+ 'linename' => $ride->linename,
+ 'number' => $ride->number,
+ 'operator' => $ride->operator_name,
+ 'origin' => $ride->origin_name,
+ 'destination' => $ride->destination_name,
+ ];
+ }
+
+ /** @return array{Carbon, Carbon} */
+ private function dayBounds(Carbon $from, Carbon $until): array
+ {
+ $from = $from->clone()->startOfDay();
+ $until = $until->clone()->endOfDay();
+
+ if ($from->isAfter($until)) {
+ throw new InvalidArgumentException('from cannot be after until');
+ }
+
+ return [$from, $until];
+ }
+}
diff --git a/composer.lock b/composer.lock
index 0f31c07b6..733b1d340 100644
--- a/composer.lock
+++ b/composer.lock
@@ -214,16 +214,16 @@
},
{
"name": "clickbar/laravel-magellan",
- "version": "2.1.0",
+ "version": "2.2.0",
"source": {
"type": "git",
"url": "https://github.com/clickbar/laravel-magellan.git",
- "reference": "cc16837c97bd6ddce3a85b2d7a4abe801c0f1360"
+ "reference": "263a07726952fef2b374ae5dcdab1d1b05a5bedd"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/clickbar/laravel-magellan/zipball/cc16837c97bd6ddce3a85b2d7a4abe801c0f1360",
- "reference": "cc16837c97bd6ddce3a85b2d7a4abe801c0f1360",
+ "url": "https://api.github.com/repos/clickbar/laravel-magellan/zipball/263a07726952fef2b374ae5dcdab1d1b05a5bedd",
+ "reference": "263a07726952fef2b374ae5dcdab1d1b05a5bedd",
"shasum": ""
},
"require": {
@@ -293,22 +293,22 @@
],
"support": {
"issues": "https://github.com/clickbar/laravel-magellan/issues",
- "source": "https://github.com/clickbar/laravel-magellan/tree/2.1.0"
+ "source": "https://github.com/clickbar/laravel-magellan/tree/2.2.0"
},
- "time": "2026-03-17T08:29:27+00:00"
+ "time": "2026-05-11T12:10:35+00:00"
},
{
"name": "darkaonline/l5-swagger",
- "version": "11.0.1",
+ "version": "11.1.0",
"source": {
"type": "git",
"url": "https://github.com/DarkaOnLine/L5-Swagger.git",
- "reference": "63d737e841533cac6e8c04a007561aa833f69f3a"
+ "reference": "110b59478c9417c13794cef62a82b019433d642a"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/DarkaOnLine/L5-Swagger/zipball/63d737e841533cac6e8c04a007561aa833f69f3a",
- "reference": "63d737e841533cac6e8c04a007561aa833f69f3a",
+ "url": "https://api.github.com/repos/DarkaOnLine/L5-Swagger/zipball/110b59478c9417c13794cef62a82b019433d642a",
+ "reference": "110b59478c9417c13794cef62a82b019433d642a",
"shasum": ""
},
"require": {
@@ -367,7 +367,7 @@
],
"support": {
"issues": "https://github.com/DarkaOnLine/L5-Swagger/issues",
- "source": "https://github.com/DarkaOnLine/L5-Swagger/tree/11.0.1"
+ "source": "https://github.com/DarkaOnLine/L5-Swagger/tree/11.1.0"
},
"funding": [
{
@@ -375,7 +375,7 @@
"type": "github"
}
],
- "time": "2026-04-08T13:14:00+00:00"
+ "time": "2026-06-12T10:04:41+00:00"
},
{
"name": "defuse/php-encryption",
@@ -1087,16 +1087,16 @@
},
{
"name": "firebase/php-jwt",
- "version": "v7.0.5",
+ "version": "v7.1.0",
"source": {
"type": "git",
"url": "https://github.com/googleapis/php-jwt.git",
- "reference": "47ad26bab5e7c70ae8a6f08ed25ff83631121380"
+ "reference": "b374a5d1a4f1f67fadc2165cdb284645945e2fc0"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/googleapis/php-jwt/zipball/47ad26bab5e7c70ae8a6f08ed25ff83631121380",
- "reference": "47ad26bab5e7c70ae8a6f08ed25ff83631121380",
+ "url": "https://api.github.com/repos/googleapis/php-jwt/zipball/b374a5d1a4f1f67fadc2165cdb284645945e2fc0",
+ "reference": "b374a5d1a4f1f67fadc2165cdb284645945e2fc0",
"shasum": ""
},
"require": {
@@ -1105,6 +1105,7 @@
"require-dev": {
"guzzlehttp/guzzle": "^7.4",
"phpfastcache/phpfastcache": "^9.2",
+ "phpseclib/phpseclib": "~3.0",
"phpspec/prophecy-phpunit": "^2.0",
"phpunit/phpunit": "^9.5",
"psr/cache": "^2.0||^3.0",
@@ -1113,7 +1114,8 @@
},
"suggest": {
"ext-sodium": "Support EdDSA (Ed25519) signatures",
- "paragonie/sodium_compat": "Support EdDSA (Ed25519) signatures when libsodium is not present"
+ "paragonie/sodium_compat": "Support EdDSA (Ed25519) signatures when libsodium is not present",
+ "phpseclib/phpseclib": "Support PS256 (RSASSA-PSS) signatures"
},
"type": "library",
"autoload": {
@@ -1138,16 +1140,16 @@
}
],
"description": "A simple library to encode and decode JSON Web Tokens (JWT) in PHP. Should conform to the current spec.",
- "homepage": "https://github.com/firebase/php-jwt",
+ "homepage": "https://github.com/googleapis/php-jwt",
"keywords": [
"jwt",
"php"
],
"support": {
"issues": "https://github.com/googleapis/php-jwt/issues",
- "source": "https://github.com/googleapis/php-jwt/tree/v7.0.5"
+ "source": "https://github.com/googleapis/php-jwt/tree/v7.1.0"
},
- "time": "2026-04-01T20:38:03+00:00"
+ "time": "2026-06-11T17:54:14+00:00"
},
{
"name": "fruitcake/php-cors",
@@ -1284,25 +1286,26 @@
},
{
"name": "guzzlehttp/guzzle",
- "version": "7.10.0",
+ "version": "7.11.1",
"source": {
"type": "git",
"url": "https://github.com/guzzle/guzzle.git",
- "reference": "b51ac707cfa420b7bfd4e4d5e510ba8008e822b4"
+ "reference": "5af96f374e0ab4ebd747b8310888c99d3adb0a8c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/guzzle/guzzle/zipball/b51ac707cfa420b7bfd4e4d5e510ba8008e822b4",
- "reference": "b51ac707cfa420b7bfd4e4d5e510ba8008e822b4",
+ "url": "https://api.github.com/repos/guzzle/guzzle/zipball/5af96f374e0ab4ebd747b8310888c99d3adb0a8c",
+ "reference": "5af96f374e0ab4ebd747b8310888c99d3adb0a8c",
"shasum": ""
},
"require": {
"ext-json": "*",
- "guzzlehttp/promises": "^2.3",
- "guzzlehttp/psr7": "^2.8",
+ "guzzlehttp/promises": "^2.5",
+ "guzzlehttp/psr7": "^2.11",
"php": "^7.2.5 || ^8.0",
"psr/http-client": "^1.0",
- "symfony/deprecation-contracts": "^2.2 || ^3.0"
+ "symfony/deprecation-contracts": "^2.5 || ^3.0",
+ "symfony/polyfill-php80": "^1.24"
},
"provide": {
"psr/http-client-implementation": "1.0"
@@ -1311,8 +1314,9 @@
"bamarni/composer-bin-plugin": "^1.8.2",
"ext-curl": "*",
"guzzle/client-integration-tests": "3.0.2",
+ "guzzlehttp/test-server": "^0.5",
"php-http/message-factory": "^1.1",
- "phpunit/phpunit": "^8.5.39 || ^9.6.20",
+ "phpunit/phpunit": "^8.5.52 || ^9.6.34",
"psr/log": "^1.1 || ^2.0 || ^3.0"
},
"suggest": {
@@ -1390,7 +1394,7 @@
],
"support": {
"issues": "https://github.com/guzzle/guzzle/issues",
- "source": "https://github.com/guzzle/guzzle/tree/7.10.0"
+ "source": "https://github.com/guzzle/guzzle/tree/7.11.1"
},
"funding": [
{
@@ -1406,28 +1410,29 @@
"type": "tidelift"
}
],
- "time": "2025-08-23T22:36:01+00:00"
+ "time": "2026-06-07T22:54:06+00:00"
},
{
"name": "guzzlehttp/promises",
- "version": "2.3.0",
+ "version": "2.5.0",
"source": {
"type": "git",
"url": "https://github.com/guzzle/promises.git",
- "reference": "481557b130ef3790cf82b713667b43030dc9c957"
+ "reference": "4360e982f87f5f258bf872d094647791db2f4c8e"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/guzzle/promises/zipball/481557b130ef3790cf82b713667b43030dc9c957",
- "reference": "481557b130ef3790cf82b713667b43030dc9c957",
+ "url": "https://api.github.com/repos/guzzle/promises/zipball/4360e982f87f5f258bf872d094647791db2f4c8e",
+ "reference": "4360e982f87f5f258bf872d094647791db2f4c8e",
"shasum": ""
},
"require": {
- "php": "^7.2.5 || ^8.0"
+ "php": "^7.2.5 || ^8.0",
+ "symfony/deprecation-contracts": "^2.5 || ^3.0"
},
"require-dev": {
"bamarni/composer-bin-plugin": "^1.8.2",
- "phpunit/phpunit": "^8.5.44 || ^9.6.25"
+ "phpunit/phpunit": "^8.5.52 || ^9.6.34"
},
"type": "library",
"extra": {
@@ -1473,7 +1478,7 @@
],
"support": {
"issues": "https://github.com/guzzle/promises/issues",
- "source": "https://github.com/guzzle/promises/tree/2.3.0"
+ "source": "https://github.com/guzzle/promises/tree/2.5.0"
},
"funding": [
{
@@ -1489,27 +1494,29 @@
"type": "tidelift"
}
],
- "time": "2025-08-22T14:34:08+00:00"
+ "time": "2026-06-02T12:23:43+00:00"
},
{
"name": "guzzlehttp/psr7",
- "version": "2.9.0",
+ "version": "2.11.0",
"source": {
"type": "git",
"url": "https://github.com/guzzle/psr7.git",
- "reference": "7d0ed42f28e42d61352a7a79de682e5e67fec884"
+ "reference": "bbb5e61349fa5cb822b3e87842b951088b76b81f"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/guzzle/psr7/zipball/7d0ed42f28e42d61352a7a79de682e5e67fec884",
- "reference": "7d0ed42f28e42d61352a7a79de682e5e67fec884",
+ "url": "https://api.github.com/repos/guzzle/psr7/zipball/bbb5e61349fa5cb822b3e87842b951088b76b81f",
+ "reference": "bbb5e61349fa5cb822b3e87842b951088b76b81f",
"shasum": ""
},
"require": {
"php": "^7.2.5 || ^8.0",
"psr/http-factory": "^1.0",
"psr/http-message": "^1.1 || ^2.0",
- "ralouphie/getallheaders": "^3.0"
+ "ralouphie/getallheaders": "^3.0",
+ "symfony/deprecation-contracts": "^2.5 || ^3.0",
+ "symfony/polyfill-php80": "^1.24"
},
"provide": {
"psr/http-factory-implementation": "1.0",
@@ -1517,9 +1524,9 @@
},
"require-dev": {
"bamarni/composer-bin-plugin": "^1.8.2",
- "http-interop/http-factory-tests": "0.9.0",
+ "http-interop/http-factory-tests": "1.1.0",
"jshttp/mime-db": "1.54.0.1",
- "phpunit/phpunit": "^8.5.44 || ^9.6.25"
+ "phpunit/phpunit": "^8.5.52 || ^9.6.34"
},
"suggest": {
"laminas/laminas-httphandlerrunner": "Emit PSR-7 responses"
@@ -1590,7 +1597,7 @@
],
"support": {
"issues": "https://github.com/guzzle/psr7/issues",
- "source": "https://github.com/guzzle/psr7/tree/2.9.0"
+ "source": "https://github.com/guzzle/psr7/tree/2.11.0"
},
"funding": [
{
@@ -1606,20 +1613,20 @@
"type": "tidelift"
}
],
- "time": "2026-03-10T16:41:02+00:00"
+ "time": "2026-06-02T12:30:48+00:00"
},
{
"name": "guzzlehttp/uri-template",
- "version": "v1.0.5",
+ "version": "v1.0.7",
"source": {
"type": "git",
"url": "https://github.com/guzzle/uri-template.git",
- "reference": "4f4bbd4e7172148801e76e3decc1e559bdee34e1"
+ "reference": "7fe811c23a9e3cd712b4389eaeb50b5456d8c529"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/guzzle/uri-template/zipball/4f4bbd4e7172148801e76e3decc1e559bdee34e1",
- "reference": "4f4bbd4e7172148801e76e3decc1e559bdee34e1",
+ "url": "https://api.github.com/repos/guzzle/uri-template/zipball/7fe811c23a9e3cd712b4389eaeb50b5456d8c529",
+ "reference": "7fe811c23a9e3cd712b4389eaeb50b5456d8c529",
"shasum": ""
},
"require": {
@@ -1628,7 +1635,7 @@
},
"require-dev": {
"bamarni/composer-bin-plugin": "^1.8.2",
- "phpunit/phpunit": "^8.5.44 || ^9.6.25",
+ "phpunit/phpunit": "^8.5.52 || ^9.6.34",
"uri-template/tests": "1.0.0"
},
"type": "library",
@@ -1676,7 +1683,7 @@
],
"support": {
"issues": "https://github.com/guzzle/uri-template/issues",
- "source": "https://github.com/guzzle/uri-template/tree/v1.0.5"
+ "source": "https://github.com/guzzle/uri-template/tree/v1.0.7"
},
"funding": [
{
@@ -1692,20 +1699,20 @@
"type": "tidelift"
}
],
- "time": "2025-08-22T14:27:06+00:00"
+ "time": "2026-06-12T21:33:43+00:00"
},
{
"name": "intervention/gif",
- "version": "5.0.0",
+ "version": "5.0.1",
"source": {
"type": "git",
"url": "https://github.com/Intervention/gif.git",
- "reference": "d856f59205aec768059d837148d755c079cdb94a"
+ "reference": "bb395af960deffe64d70c976b4df9283f68e762d"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/Intervention/gif/zipball/d856f59205aec768059d837148d755c079cdb94a",
- "reference": "d856f59205aec768059d837148d755c079cdb94a",
+ "url": "https://api.github.com/repos/Intervention/gif/zipball/bb395af960deffe64d70c976b4df9283f68e762d",
+ "reference": "bb395af960deffe64d70c976b4df9283f68e762d",
"shasum": ""
},
"require": {
@@ -1744,7 +1751,7 @@
],
"support": {
"issues": "https://github.com/Intervention/gif/issues",
- "source": "https://github.com/Intervention/gif/tree/5.0.0"
+ "source": "https://github.com/Intervention/gif/tree/5.0.1"
},
"funding": [
{
@@ -1760,20 +1767,20 @@
"type": "ko_fi"
}
],
- "time": "2026-03-21T05:08:17+00:00"
+ "time": "2026-05-03T06:04:47+00:00"
},
{
"name": "intervention/image",
- "version": "4.0.3",
+ "version": "4.1.3",
"source": {
"type": "git",
"url": "https://github.com/Intervention/image.git",
- "reference": "76d4e5a48b78f7b48f84d90160e6973b1e800832"
+ "reference": "afe1f161df8a8fb46f354201328a4d9177dfcff4"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/Intervention/image/zipball/76d4e5a48b78f7b48f84d90160e6973b1e800832",
- "reference": "76d4e5a48b78f7b48f84d90160e6973b1e800832",
+ "url": "https://api.github.com/repos/Intervention/image/zipball/afe1f161df8a8fb46f354201328a4d9177dfcff4",
+ "reference": "afe1f161df8a8fb46f354201328a4d9177dfcff4",
"shasum": ""
},
"require": {
@@ -1820,7 +1827,7 @@
],
"support": {
"issues": "https://github.com/Intervention/image/issues",
- "source": "https://github.com/Intervention/image/tree/4.0.3"
+ "source": "https://github.com/Intervention/image/tree/4.1.3"
},
"funding": [
{
@@ -1836,20 +1843,20 @@
"type": "ko_fi"
}
],
- "time": "2026-05-01T08:19:10+00:00"
+ "time": "2026-06-03T13:21:10+00:00"
},
{
"name": "laravel/framework",
- "version": "v13.8.0",
+ "version": "v13.15.0",
"source": {
"type": "git",
"url": "https://github.com/laravel/framework.git",
- "reference": "e7db333a025a1e93ebca7744953069d7719f4bcf"
+ "reference": "7e23b2aa4e1133a43835c93a810b4bedc40e425b"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/laravel/framework/zipball/e7db333a025a1e93ebca7744953069d7719f4bcf",
- "reference": "e7db333a025a1e93ebca7744953069d7719f4bcf",
+ "url": "https://api.github.com/repos/laravel/framework/zipball/7e23b2aa4e1133a43835c93a810b4bedc40e425b",
+ "reference": "7e23b2aa4e1133a43835c93a810b4bedc40e425b",
"shasum": ""
},
"require": {
@@ -1953,7 +1960,7 @@
"aws/aws-sdk-php": "^3.322.9",
"ext-gmp": "*",
"fakerphp/faker": "^1.24",
- "guzzlehttp/psr7": "^2.4",
+ "guzzlehttp/psr7": "^2.9",
"laravel/pint": "^1.18",
"league/flysystem-aws-s3-v3": "^3.25.1",
"league/flysystem-ftp": "^3.25.1",
@@ -2060,7 +2067,7 @@
"issues": "https://github.com/laravel/framework/issues",
"source": "https://github.com/laravel/framework"
},
- "time": "2026-05-05T21:01:14+00:00"
+ "time": "2026-06-09T13:45:51+00:00"
},
{
"name": "laravel/passport",
@@ -2139,16 +2146,16 @@
},
{
"name": "laravel/prompts",
- "version": "v0.3.17",
+ "version": "v0.3.18",
"source": {
"type": "git",
"url": "https://github.com/laravel/prompts.git",
- "reference": "6a82ac19a28b916ae0885828795dbd4c59d9a818"
+ "reference": "a19af51bb144bf87f08397921fa619f85c7d4e72"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/laravel/prompts/zipball/6a82ac19a28b916ae0885828795dbd4c59d9a818",
- "reference": "6a82ac19a28b916ae0885828795dbd4c59d9a818",
+ "url": "https://api.github.com/repos/laravel/prompts/zipball/a19af51bb144bf87f08397921fa619f85c7d4e72",
+ "reference": "a19af51bb144bf87f08397921fa619f85c7d4e72",
"shasum": ""
},
"require": {
@@ -2192,9 +2199,9 @@
"description": "Add beautiful and user-friendly forms to your command-line applications.",
"support": {
"issues": "https://github.com/laravel/prompts/issues",
- "source": "https://github.com/laravel/prompts/tree/v0.3.17"
+ "source": "https://github.com/laravel/prompts/tree/v0.3.18"
},
- "time": "2026-04-20T16:07:33+00:00"
+ "time": "2026-05-19T00:47:18+00:00"
},
{
"name": "laravel/serializable-closure",
@@ -2848,16 +2855,16 @@
},
{
"name": "league/flysystem",
- "version": "3.33.0",
+ "version": "3.34.0",
"source": {
"type": "git",
"url": "https://github.com/thephpleague/flysystem.git",
- "reference": "570b8871e0ce693764434b29154c54b434905350"
+ "reference": "2daaac3b0d4c83ea7ed5d8586e786f5d00f3540e"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/570b8871e0ce693764434b29154c54b434905350",
- "reference": "570b8871e0ce693764434b29154c54b434905350",
+ "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/2daaac3b0d4c83ea7ed5d8586e786f5d00f3540e",
+ "reference": "2daaac3b0d4c83ea7ed5d8586e786f5d00f3540e",
"shasum": ""
},
"require": {
@@ -2925,9 +2932,9 @@
],
"support": {
"issues": "https://github.com/thephpleague/flysystem/issues",
- "source": "https://github.com/thephpleague/flysystem/tree/3.33.0"
+ "source": "https://github.com/thephpleague/flysystem/tree/3.34.0"
},
- "time": "2026-03-25T07:59:30+00:00"
+ "time": "2026-05-14T10:28:08+00:00"
},
{
"name": "league/flysystem-local",
@@ -3732,16 +3739,16 @@
},
{
"name": "nette/utils",
- "version": "v4.1.3",
+ "version": "v4.1.4",
"source": {
"type": "git",
"url": "https://github.com/nette/utils.git",
- "reference": "bb3ea637e3d131d72acc033cfc2746ee893349fe"
+ "reference": "7da6c396d7ebe142bc857c20479d5e70a5e1aac7"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/nette/utils/zipball/bb3ea637e3d131d72acc033cfc2746ee893349fe",
- "reference": "bb3ea637e3d131d72acc033cfc2746ee893349fe",
+ "url": "https://api.github.com/repos/nette/utils/zipball/7da6c396d7ebe142bc857c20479d5e70a5e1aac7",
+ "reference": "7da6c396d7ebe142bc857c20479d5e70a5e1aac7",
"shasum": ""
},
"require": {
@@ -3817,9 +3824,9 @@
],
"support": {
"issues": "https://github.com/nette/utils/issues",
- "source": "https://github.com/nette/utils/tree/v4.1.3"
+ "source": "https://github.com/nette/utils/tree/v4.1.4"
},
- "time": "2026-02-13T03:05:33+00:00"
+ "time": "2026-05-11T20:49:54+00:00"
},
{
"name": "nikic/php-parser",
@@ -4241,16 +4248,16 @@
},
{
"name": "phpseclib/phpseclib",
- "version": "3.0.52",
+ "version": "3.0.53",
"source": {
"type": "git",
"url": "https://github.com/phpseclib/phpseclib.git",
- "reference": "2adaefc83df2ec548558307690f376dd7d4f4fce"
+ "reference": "511ddc8e352d5d1f1e33bea468b6f4ef48438cf9"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/2adaefc83df2ec548558307690f376dd7d4f4fce",
- "reference": "2adaefc83df2ec548558307690f376dd7d4f4fce",
+ "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/511ddc8e352d5d1f1e33bea468b6f4ef48438cf9",
+ "reference": "511ddc8e352d5d1f1e33bea468b6f4ef48438cf9",
"shasum": ""
},
"require": {
@@ -4331,7 +4338,7 @@
],
"support": {
"issues": "https://github.com/phpseclib/phpseclib/issues",
- "source": "https://github.com/phpseclib/phpseclib/tree/3.0.52"
+ "source": "https://github.com/phpseclib/phpseclib/tree/3.0.53"
},
"funding": [
{
@@ -4347,7 +4354,7 @@
"type": "tidelift"
}
],
- "time": "2026-04-27T07:02:15+00:00"
+ "time": "2026-06-09T18:08:26+00:00"
},
{
"name": "phpstan/phpdoc-parser",
@@ -4398,16 +4405,16 @@
},
{
"name": "predis/predis",
- "version": "v3.4.2",
+ "version": "v3.5.1",
"source": {
"type": "git",
"url": "https://github.com/predis/predis.git",
- "reference": "2033429520d8997a7815a2485f56abe6d2d0e075"
+ "reference": "5c996db191ee2d9bafe651f454b1fca16754271b"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/predis/predis/zipball/2033429520d8997a7815a2485f56abe6d2d0e075",
- "reference": "2033429520d8997a7815a2485f56abe6d2d0e075",
+ "url": "https://api.github.com/repos/predis/predis/zipball/5c996db191ee2d9bafe651f454b1fca16754271b",
+ "reference": "5c996db191ee2d9bafe651f454b1fca16754271b",
"shasum": ""
},
"require": {
@@ -4449,7 +4456,7 @@
],
"support": {
"issues": "https://github.com/predis/predis/issues",
- "source": "https://github.com/predis/predis/tree/v3.4.2"
+ "source": "https://github.com/predis/predis/tree/v3.5.1"
},
"funding": [
{
@@ -4457,20 +4464,20 @@
"type": "github"
}
],
- "time": "2026-03-09T20:33:04+00:00"
+ "time": "2026-06-11T16:56:53+00:00"
},
{
"name": "promphp/prometheus_client_php",
- "version": "v2.15.0",
+ "version": "v2.15.1",
"source": {
"type": "git",
"url": "https://github.com/PromPHP/prometheus_client_php.git",
- "reference": "da86f1507b04dc44dc37ffb766d7d3a1d42c3050"
+ "reference": "e153786bda5ca1d07335a2b5f477742c37195c40"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/PromPHP/prometheus_client_php/zipball/da86f1507b04dc44dc37ffb766d7d3a1d42c3050",
- "reference": "da86f1507b04dc44dc37ffb766d7d3a1d42c3050",
+ "url": "https://api.github.com/repos/PromPHP/prometheus_client_php/zipball/e153786bda5ca1d07335a2b5f477742c37195c40",
+ "reference": "e153786bda5ca1d07335a2b5f477742c37195c40",
"shasum": ""
},
"require": {
@@ -4490,7 +4497,7 @@
"phpstan/phpstan-strict-rules": "^1.1.0",
"phpunit/phpunit": "^9.4",
"predis/predis": "^2.3",
- "squizlabs/php_codesniffer": "^3.6",
+ "squizlabs/php_codesniffer": "^3.6 || ^4.0",
"symfony/polyfill-apcu": "^1.6"
},
"suggest": {
@@ -4525,9 +4532,9 @@
"description": "Prometheus instrumentation library for PHP applications.",
"support": {
"issues": "https://github.com/PromPHP/prometheus_client_php/issues",
- "source": "https://github.com/PromPHP/prometheus_client_php/tree/v2.15.0"
+ "source": "https://github.com/PromPHP/prometheus_client_php/tree/v2.15.1"
},
- "time": "2026-03-24T22:44:50+00:00"
+ "time": "2026-05-28T07:51:04+00:00"
},
{
"name": "psr/clock",
@@ -5056,16 +5063,16 @@
},
{
"name": "psy/psysh",
- "version": "v0.12.22",
+ "version": "v0.12.23",
"source": {
"type": "git",
"url": "https://github.com/bobthecow/psysh.git",
- "reference": "3be75d5b9244936dd4ac62ade2bfb004d13acf0f"
+ "reference": "4dcc0f08047d52bbde475eda481146fd8e27e1a4"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/bobthecow/psysh/zipball/3be75d5b9244936dd4ac62ade2bfb004d13acf0f",
- "reference": "3be75d5b9244936dd4ac62ade2bfb004d13acf0f",
+ "url": "https://api.github.com/repos/bobthecow/psysh/zipball/4dcc0f08047d52bbde475eda481146fd8e27e1a4",
+ "reference": "4dcc0f08047d52bbde475eda481146fd8e27e1a4",
"shasum": ""
},
"require": {
@@ -5129,9 +5136,9 @@
],
"support": {
"issues": "https://github.com/bobthecow/psysh/issues",
- "source": "https://github.com/bobthecow/psysh/tree/v0.12.22"
+ "source": "https://github.com/bobthecow/psysh/tree/v0.12.23"
},
- "time": "2026-03-22T23:03:24+00:00"
+ "time": "2026-05-23T13:41:31+00:00"
},
{
"name": "radebatz/type-info-extras",
@@ -5781,16 +5788,16 @@
},
{
"name": "spatie/crawler",
- "version": "9.3.0",
+ "version": "9.3.2",
"source": {
"type": "git",
"url": "https://github.com/spatie/crawler.git",
- "reference": "1b9ce60037a7fd97eb5489521d99383bd2abad9f"
+ "reference": "3b3a9a1a8c750b0240c2b7c9e2ef22e84092416e"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/spatie/crawler/zipball/1b9ce60037a7fd97eb5489521d99383bd2abad9f",
- "reference": "1b9ce60037a7fd97eb5489521d99383bd2abad9f",
+ "url": "https://api.github.com/repos/spatie/crawler/zipball/3b3a9a1a8c750b0240c2b7c9e2ef22e84092416e",
+ "reference": "3b3a9a1a8c750b0240c2b7c9e2ef22e84092416e",
"shasum": ""
},
"require": {
@@ -5844,7 +5851,7 @@
],
"support": {
"issues": "https://github.com/spatie/crawler/issues",
- "source": "https://github.com/spatie/crawler/tree/9.3.0"
+ "source": "https://github.com/spatie/crawler/tree/9.3.2"
},
"funding": [
{
@@ -5856,7 +5863,7 @@
"type": "github"
}
],
- "time": "2026-04-15T11:16:19+00:00"
+ "time": "2026-06-12T15:45:15+00:00"
},
{
"name": "spatie/icalendar-generator",
@@ -6012,16 +6019,16 @@
},
{
"name": "spatie/laravel-package-tools",
- "version": "1.93.0",
+ "version": "1.93.1",
"source": {
"type": "git",
"url": "https://github.com/spatie/laravel-package-tools.git",
- "reference": "0d097bce95b2bf6802fb1d83e1e753b0f5a948e7"
+ "reference": "d5552849801f2642aea710557463234b59ef65eb"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/spatie/laravel-package-tools/zipball/0d097bce95b2bf6802fb1d83e1e753b0f5a948e7",
- "reference": "0d097bce95b2bf6802fb1d83e1e753b0f5a948e7",
+ "url": "https://api.github.com/repos/spatie/laravel-package-tools/zipball/d5552849801f2642aea710557463234b59ef65eb",
+ "reference": "d5552849801f2642aea710557463234b59ef65eb",
"shasum": ""
},
"require": {
@@ -6061,7 +6068,7 @@
],
"support": {
"issues": "https://github.com/spatie/laravel-package-tools/issues",
- "source": "https://github.com/spatie/laravel-package-tools/tree/1.93.0"
+ "source": "https://github.com/spatie/laravel-package-tools/tree/1.93.1"
},
"funding": [
{
@@ -6069,20 +6076,20 @@
"type": "github"
}
],
- "time": "2026-02-21T12:49:54+00:00"
+ "time": "2026-05-19T14:06:37+00:00"
},
{
"name": "spatie/laravel-permission",
- "version": "7.4.1",
+ "version": "7.4.2",
"source": {
"type": "git",
"url": "https://github.com/spatie/laravel-permission.git",
- "reference": "ef42ecb781e5534d368a3853fa161e420ad51397"
+ "reference": "15a9daf02ba02d3ae77aaa6da582708231ef999b"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/spatie/laravel-permission/zipball/ef42ecb781e5534d368a3853fa161e420ad51397",
- "reference": "ef42ecb781e5534d368a3853fa161e420ad51397",
+ "url": "https://api.github.com/repos/spatie/laravel-permission/zipball/15a9daf02ba02d3ae77aaa6da582708231ef999b",
+ "reference": "15a9daf02ba02d3ae77aaa6da582708231ef999b",
"shasum": ""
},
"require": {
@@ -6148,7 +6155,7 @@
],
"support": {
"issues": "https://github.com/spatie/laravel-permission/issues",
- "source": "https://github.com/spatie/laravel-permission/tree/7.4.1"
+ "source": "https://github.com/spatie/laravel-permission/tree/7.4.2"
},
"funding": [
{
@@ -6156,7 +6163,7 @@
"type": "github"
}
],
- "time": "2026-04-29T07:59:45+00:00"
+ "time": "2026-05-30T19:21:26+00:00"
},
{
"name": "spatie/laravel-personal-data-export",
@@ -6655,16 +6662,16 @@
},
{
"name": "swagger-api/swagger-ui",
- "version": "v5.32.5",
+ "version": "v5.32.6",
"source": {
"type": "git",
"url": "https://github.com/swagger-api/swagger-ui.git",
- "reference": "dcb493cdbf58fa885047513bd176a644f92c4955"
+ "reference": "dcdca62c8b64a0a54e4decd4e1a6c3c712fdcc60"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/swagger-api/swagger-ui/zipball/dcb493cdbf58fa885047513bd176a644f92c4955",
- "reference": "dcb493cdbf58fa885047513bd176a644f92c4955",
+ "url": "https://api.github.com/repos/swagger-api/swagger-ui/zipball/dcdca62c8b64a0a54e4decd4e1a6c3c712fdcc60",
+ "reference": "dcdca62c8b64a0a54e4decd4e1a6c3c712fdcc60",
"shasum": ""
},
"type": "library",
@@ -6710,26 +6717,26 @@
],
"support": {
"issues": "https://github.com/swagger-api/swagger-ui/issues",
- "source": "https://github.com/swagger-api/swagger-ui/tree/v5.32.5"
+ "source": "https://github.com/swagger-api/swagger-ui/tree/v5.32.6"
},
- "time": "2026-04-27T12:54:38+00:00"
+ "time": "2026-05-12T09:35:37+00:00"
},
{
"name": "symfony/clock",
- "version": "v8.0.8",
+ "version": "v8.1.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/clock.git",
- "reference": "b55a638b189a6faa875e0ccdb00908fb87af95b3"
+ "reference": "701ef4de9705d6c32292ebee5e8044094a09fbf6"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/clock/zipball/b55a638b189a6faa875e0ccdb00908fb87af95b3",
- "reference": "b55a638b189a6faa875e0ccdb00908fb87af95b3",
+ "url": "https://api.github.com/repos/symfony/clock/zipball/701ef4de9705d6c32292ebee5e8044094a09fbf6",
+ "reference": "701ef4de9705d6c32292ebee5e8044094a09fbf6",
"shasum": ""
},
"require": {
- "php": ">=8.4",
+ "php": ">=8.4.1",
"psr/clock": "^1.0"
},
"provide": {
@@ -6769,7 +6776,7 @@
"time"
],
"support": {
- "source": "https://github.com/symfony/clock/tree/v8.0.8"
+ "source": "https://github.com/symfony/clock/tree/v8.1.0"
},
"funding": [
{
@@ -6789,27 +6796,33 @@
"type": "tidelift"
}
],
- "time": "2026-03-30T15:14:47+00:00"
+ "time": "2026-05-29T05:06:50+00:00"
},
{
"name": "symfony/console",
- "version": "v8.0.9",
+ "version": "v8.1.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/console.git",
- "reference": "7113778e2e91f4709cb3194a75dfa9c0d028d94d"
+ "reference": "f5a856c6ecb56b3c21ed94a5b7bf940d857d110a"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/console/zipball/7113778e2e91f4709cb3194a75dfa9c0d028d94d",
- "reference": "7113778e2e91f4709cb3194a75dfa9c0d028d94d",
+ "url": "https://api.github.com/repos/symfony/console/zipball/f5a856c6ecb56b3c21ed94a5b7bf940d857d110a",
+ "reference": "f5a856c6ecb56b3c21ed94a5b7bf940d857d110a",
"shasum": ""
},
"require": {
- "php": ">=8.4",
+ "php": ">=8.4.1",
+ "symfony/deprecation-contracts": "^2.5|^3",
"symfony/polyfill-mbstring": "^1.0",
+ "symfony/polyfill-php85": "^1.32",
"symfony/service-contracts": "^2.5|^3",
- "symfony/string": "^7.4|^8.0"
+ "symfony/string": "^7.4.6|^8.0.6"
+ },
+ "conflict": {
+ "symfony/dependency-injection": "<8.1",
+ "symfony/event-dispatcher": "<8.1"
},
"provide": {
"psr/log-implementation": "1.0|2.0|3.0"
@@ -6817,14 +6830,18 @@
"require-dev": {
"psr/log": "^1|^2|^3",
"symfony/config": "^7.4|^8.0",
- "symfony/dependency-injection": "^7.4|^8.0",
- "symfony/event-dispatcher": "^7.4|^8.0",
+ "symfony/dependency-injection": "^8.1",
+ "symfony/event-dispatcher": "^8.1",
+ "symfony/filesystem": "^7.4|^8.0",
"symfony/http-foundation": "^7.4|^8.0",
"symfony/http-kernel": "^7.4|^8.0",
"symfony/lock": "^7.4|^8.0",
"symfony/messenger": "^7.4|^8.0",
+ "symfony/mime": "^7.4|^8.0",
"symfony/process": "^7.4|^8.0",
"symfony/stopwatch": "^7.4|^8.0",
+ "symfony/uid": "^7.4|^8.0",
+ "symfony/validator": "^7.4|^8.0",
"symfony/var-dumper": "^7.4|^8.0"
},
"type": "library",
@@ -6859,7 +6876,7 @@
"terminal"
],
"support": {
- "source": "https://github.com/symfony/console/tree/v8.0.9"
+ "source": "https://github.com/symfony/console/tree/v8.1.0"
},
"funding": [
{
@@ -6879,24 +6896,24 @@
"type": "tidelift"
}
],
- "time": "2026-04-29T15:02:55+00:00"
+ "time": "2026-05-29T05:06:50+00:00"
},
{
"name": "symfony/css-selector",
- "version": "v8.0.9",
+ "version": "v8.1.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/css-selector.git",
- "reference": "3665cfade90565430909b906394c73c8739e57d0"
+ "reference": "dc0e2be45c9b5588c82414f02ac574b4b986abcd"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/css-selector/zipball/3665cfade90565430909b906394c73c8739e57d0",
- "reference": "3665cfade90565430909b906394c73c8739e57d0",
+ "url": "https://api.github.com/repos/symfony/css-selector/zipball/dc0e2be45c9b5588c82414f02ac574b4b986abcd",
+ "reference": "dc0e2be45c9b5588c82414f02ac574b4b986abcd",
"shasum": ""
},
"require": {
- "php": ">=8.4"
+ "php": ">=8.4.1"
},
"type": "library",
"autoload": {
@@ -6928,7 +6945,7 @@
"description": "Converts CSS selectors to XPath expressions",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/css-selector/tree/v8.0.9"
+ "source": "https://github.com/symfony/css-selector/tree/v8.1.0"
},
"funding": [
{
@@ -6948,7 +6965,7 @@
"type": "tidelift"
}
],
- "time": "2026-04-18T13:51:42+00:00"
+ "time": "2026-05-29T05:06:50+00:00"
},
{
"name": "symfony/deprecation-contracts",
@@ -7023,20 +7040,20 @@
},
{
"name": "symfony/dom-crawler",
- "version": "v8.0.8",
+ "version": "v8.1.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/dom-crawler.git",
- "reference": "284ace90732b445b027728b5e0eec6418a17a364"
+ "reference": "77ca351474ea018daba5f2e473cbf1b9b8e72ac6"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/284ace90732b445b027728b5e0eec6418a17a364",
- "reference": "284ace90732b445b027728b5e0eec6418a17a364",
+ "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/77ca351474ea018daba5f2e473cbf1b9b8e72ac6",
+ "reference": "77ca351474ea018daba5f2e473cbf1b9b8e72ac6",
"shasum": ""
},
"require": {
- "php": ">=8.4",
+ "php": ">=8.4.1",
"symfony/polyfill-ctype": "^1.8",
"symfony/polyfill-mbstring": "^1.0"
},
@@ -7069,7 +7086,7 @@
"description": "Eases DOM navigation for HTML and XML documents",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/dom-crawler/tree/v8.0.8"
+ "source": "https://github.com/symfony/dom-crawler/tree/v8.1.0"
},
"funding": [
{
@@ -7089,24 +7106,24 @@
"type": "tidelift"
}
],
- "time": "2026-03-30T15:14:47+00:00"
+ "time": "2026-05-29T05:06:50+00:00"
},
{
"name": "symfony/error-handler",
- "version": "v8.0.8",
+ "version": "v8.1.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/error-handler.git",
- "reference": "c1119fe8dcfc3825ec74ec061b96ef0c8f281517"
+ "reference": "d8aeb1abd3fef84795567850d3a567bdb5945ee5"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/error-handler/zipball/c1119fe8dcfc3825ec74ec061b96ef0c8f281517",
- "reference": "c1119fe8dcfc3825ec74ec061b96ef0c8f281517",
+ "url": "https://api.github.com/repos/symfony/error-handler/zipball/d8aeb1abd3fef84795567850d3a567bdb5945ee5",
+ "reference": "d8aeb1abd3fef84795567850d3a567bdb5945ee5",
"shasum": ""
},
"require": {
- "php": ">=8.4",
+ "php": ">=8.4.1",
"psr/log": "^1|^2|^3",
"symfony/polyfill-php85": "^1.32",
"symfony/var-dumper": "^7.4|^8.0"
@@ -7150,7 +7167,7 @@
"description": "Provides tools to manage errors and ease debugging PHP code",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/error-handler/tree/v8.0.8"
+ "source": "https://github.com/symfony/error-handler/tree/v8.1.0"
},
"funding": [
{
@@ -7170,24 +7187,25 @@
"type": "tidelift"
}
],
- "time": "2026-03-30T15:14:47+00:00"
+ "time": "2026-05-29T05:06:50+00:00"
},
{
"name": "symfony/event-dispatcher",
- "version": "v8.0.9",
+ "version": "v8.1.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/event-dispatcher.git",
- "reference": "0c3c1a17604c4dbbec4b93fe162c538482096e1f"
+ "reference": "f249ae3f680958b6f1f9dd76e5747cf0695b4102"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/0c3c1a17604c4dbbec4b93fe162c538482096e1f",
- "reference": "0c3c1a17604c4dbbec4b93fe162c538482096e1f",
+ "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/f249ae3f680958b6f1f9dd76e5747cf0695b4102",
+ "reference": "f249ae3f680958b6f1f9dd76e5747cf0695b4102",
"shasum": ""
},
"require": {
- "php": ">=8.4",
+ "php": ">=8.4.1",
+ "symfony/deprecation-contracts": "^2.5|^3",
"symfony/event-dispatcher-contracts": "^2.5|^3"
},
"conflict": {
@@ -7235,7 +7253,7 @@
"description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/event-dispatcher/tree/v8.0.9"
+ "source": "https://github.com/symfony/event-dispatcher/tree/v8.1.0"
},
"funding": [
{
@@ -7255,7 +7273,7 @@
"type": "tidelift"
}
],
- "time": "2026-04-18T13:51:42+00:00"
+ "time": "2026-05-29T05:06:50+00:00"
},
{
"name": "symfony/event-dispatcher-contracts",
@@ -7339,20 +7357,20 @@
},
{
"name": "symfony/finder",
- "version": "v8.0.8",
+ "version": "v8.1.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/finder.git",
- "reference": "8da41214757b87d97f181e3d14a4179286151007"
+ "reference": "58d2e767a66052c1487356f953445634a8194c64"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/finder/zipball/8da41214757b87d97f181e3d14a4179286151007",
- "reference": "8da41214757b87d97f181e3d14a4179286151007",
+ "url": "https://api.github.com/repos/symfony/finder/zipball/58d2e767a66052c1487356f953445634a8194c64",
+ "reference": "58d2e767a66052c1487356f953445634a8194c64",
"shasum": ""
},
"require": {
- "php": ">=8.4"
+ "php": ">=8.4.1"
},
"require-dev": {
"symfony/filesystem": "^7.4|^8.0"
@@ -7383,7 +7401,7 @@
"description": "Finds files and directories via an intuitive fluent interface",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/finder/tree/v8.0.8"
+ "source": "https://github.com/symfony/finder/tree/v8.1.0"
},
"funding": [
{
@@ -7403,24 +7421,25 @@
"type": "tidelift"
}
],
- "time": "2026-03-30T15:14:47+00:00"
+ "time": "2026-05-29T05:06:50+00:00"
},
{
"name": "symfony/http-foundation",
- "version": "v8.0.8",
+ "version": "v8.1.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/http-foundation.git",
- "reference": "02656f7ebeae5c155d659e946f6b3a33df24051b"
+ "reference": "af11474600f06718086c2cda4fa6fa8d0a672e7e"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/http-foundation/zipball/02656f7ebeae5c155d659e946f6b3a33df24051b",
- "reference": "02656f7ebeae5c155d659e946f6b3a33df24051b",
+ "url": "https://api.github.com/repos/symfony/http-foundation/zipball/af11474600f06718086c2cda4fa6fa8d0a672e7e",
+ "reference": "af11474600f06718086c2cda4fa6fa8d0a672e7e",
"shasum": ""
},
"require": {
- "php": ">=8.4",
+ "php": ">=8.4.1",
+ "symfony/deprecation-contracts": "^2.5|^3",
"symfony/polyfill-mbstring": "^1.1"
},
"conflict": {
@@ -7463,7 +7482,7 @@
"description": "Defines an object-oriented layer for the HTTP specification",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/http-foundation/tree/v8.0.8"
+ "source": "https://github.com/symfony/http-foundation/tree/v8.1.0"
},
"funding": [
{
@@ -7483,34 +7502,38 @@
"type": "tidelift"
}
],
- "time": "2026-03-30T15:14:47+00:00"
+ "time": "2026-05-29T05:06:50+00:00"
},
{
"name": "symfony/http-kernel",
- "version": "v8.0.10",
+ "version": "v8.1.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/http-kernel.git",
- "reference": "fb3f65b3d4ca2dad31c80d323819a762ca31d6ac"
+ "reference": "cefeb37c82eed3e0c42fa25ba64cd3a908d90f39"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/http-kernel/zipball/fb3f65b3d4ca2dad31c80d323819a762ca31d6ac",
- "reference": "fb3f65b3d4ca2dad31c80d323819a762ca31d6ac",
+ "url": "https://api.github.com/repos/symfony/http-kernel/zipball/cefeb37c82eed3e0c42fa25ba64cd3a908d90f39",
+ "reference": "cefeb37c82eed3e0c42fa25ba64cd3a908d90f39",
"shasum": ""
},
"require": {
- "php": ">=8.4",
+ "php": ">=8.4.1",
"psr/log": "^1|^2|^3",
+ "symfony/deprecation-contracts": "^2.5|^3",
"symfony/error-handler": "^7.4|^8.0",
"symfony/event-dispatcher": "^7.4|^8.0",
"symfony/http-foundation": "^7.4|^8.0",
"symfony/polyfill-ctype": "^1.8"
},
"conflict": {
+ "symfony/dependency-injection": "<8.1",
"symfony/flex": "<2.10",
"symfony/http-client-contracts": "<2.5",
"symfony/translation-contracts": "<2.5",
+ "symfony/var-dumper": "<8.1",
+ "symfony/web-profiler-bundle": "<8.1",
"twig/twig": "<3.21"
},
"provide": {
@@ -7523,13 +7546,14 @@
"symfony/config": "^7.4|^8.0",
"symfony/console": "^7.4|^8.0",
"symfony/css-selector": "^7.4|^8.0",
- "symfony/dependency-injection": "^7.4|^8.0",
+ "symfony/dependency-injection": "^8.1",
"symfony/dom-crawler": "^7.4|^8.0",
"symfony/expression-language": "^7.4|^8.0",
"symfony/finder": "^7.4|^8.0",
"symfony/http-client-contracts": "^2.5|^3",
"symfony/process": "^7.4|^8.0",
"symfony/property-access": "^7.4|^8.0",
+ "symfony/rate-limiter": "^7.4|^8.0",
"symfony/routing": "^7.4|^8.0",
"symfony/serializer": "^7.4|^8.0",
"symfony/stopwatch": "^7.4|^8.0",
@@ -7537,7 +7561,7 @@
"symfony/translation-contracts": "^2.5|^3",
"symfony/uid": "^7.4|^8.0",
"symfony/validator": "^7.4|^8.0",
- "symfony/var-dumper": "^7.4|^8.0",
+ "symfony/var-dumper": "^8.1",
"symfony/var-exporter": "^7.4|^8.0",
"twig/twig": "^3.21"
},
@@ -7567,7 +7591,7 @@
"description": "Provides a structured process for converting a Request into a Response",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/http-kernel/tree/v8.0.10"
+ "source": "https://github.com/symfony/http-kernel/tree/v8.1.0"
},
"funding": [
{
@@ -7587,25 +7611,25 @@
"type": "tidelift"
}
],
- "time": "2026-05-06T12:27:31+00:00"
+ "time": "2026-05-29T08:46:08+00:00"
},
{
"name": "symfony/mailer",
- "version": "v8.0.8",
+ "version": "v8.1.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/mailer.git",
- "reference": "ca5f6edaf8780ece814404b58a4482b22b509c56"
+ "reference": "9418d772df3a03a142e3bc06f602adb2b8724877"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/mailer/zipball/ca5f6edaf8780ece814404b58a4482b22b509c56",
- "reference": "ca5f6edaf8780ece814404b58a4482b22b509c56",
+ "url": "https://api.github.com/repos/symfony/mailer/zipball/9418d772df3a03a142e3bc06f602adb2b8724877",
+ "reference": "9418d772df3a03a142e3bc06f602adb2b8724877",
"shasum": ""
},
"require": {
"egulias/email-validator": "^2.1.10|^3|^4",
- "php": ">=8.4",
+ "php": ">=8.4.1",
"psr/event-dispatcher": "^1",
"psr/log": "^1|^2|^3",
"symfony/event-dispatcher": "^7.4|^8.0",
@@ -7647,7 +7671,7 @@
"description": "Helps sending emails",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/mailer/tree/v8.0.8"
+ "source": "https://github.com/symfony/mailer/tree/v8.1.0"
},
"funding": [
{
@@ -7667,24 +7691,24 @@
"type": "tidelift"
}
],
- "time": "2026-03-30T15:14:47+00:00"
+ "time": "2026-05-29T05:06:50+00:00"
},
{
"name": "symfony/mime",
- "version": "v8.0.9",
+ "version": "v8.1.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/mime.git",
- "reference": "a9fcb293650c054b62a5b406f4e92e7b711ea333"
+ "reference": "b164ae7e3f7915aacfe9ee155f2f358502440664"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/mime/zipball/a9fcb293650c054b62a5b406f4e92e7b711ea333",
- "reference": "a9fcb293650c054b62a5b406f4e92e7b711ea333",
+ "url": "https://api.github.com/repos/symfony/mime/zipball/b164ae7e3f7915aacfe9ee155f2f358502440664",
+ "reference": "b164ae7e3f7915aacfe9ee155f2f358502440664",
"shasum": ""
},
"require": {
- "php": ">=8.4",
+ "php": ">=8.4.1",
"symfony/polyfill-intl-idn": "^1.10",
"symfony/polyfill-mbstring": "^1.0"
},
@@ -7733,7 +7757,7 @@
"mime-type"
],
"support": {
- "source": "https://github.com/symfony/mime/tree/v8.0.9"
+ "source": "https://github.com/symfony/mime/tree/v8.1.0"
},
"funding": [
{
@@ -7753,7 +7777,7 @@
"type": "tidelift"
}
],
- "time": "2026-04-29T15:02:55+00:00"
+ "time": "2026-05-29T05:06:50+00:00"
},
{
"name": "symfony/polyfill-ctype",
@@ -7840,16 +7864,16 @@
},
{
"name": "symfony/polyfill-intl-grapheme",
- "version": "v1.37.0",
+ "version": "v1.38.1",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-intl-grapheme.git",
- "reference": "4864388bfbd3001ce88e234fab652acd91fdc57e"
+ "reference": "e9247d281d694a5120554d9afaf54e070e88a603"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/4864388bfbd3001ce88e234fab652acd91fdc57e",
- "reference": "4864388bfbd3001ce88e234fab652acd91fdc57e",
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/e9247d281d694a5120554d9afaf54e070e88a603",
+ "reference": "e9247d281d694a5120554d9afaf54e070e88a603",
"shasum": ""
},
"require": {
@@ -7898,7 +7922,7 @@
"shim"
],
"support": {
- "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.37.0"
+ "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.38.1"
},
"funding": [
{
@@ -7918,20 +7942,20 @@
"type": "tidelift"
}
],
- "time": "2026-04-26T13:13:48+00:00"
+ "time": "2026-05-26T05:58:03+00:00"
},
{
"name": "symfony/polyfill-intl-idn",
- "version": "v1.37.0",
+ "version": "v1.38.1",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-intl-idn.git",
- "reference": "9614ac4d8061dc257ecc64cba1b140873dce8ad3"
+ "reference": "dc21118016c039a66235cf93d96b435ffb282412"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/9614ac4d8061dc257ecc64cba1b140873dce8ad3",
- "reference": "9614ac4d8061dc257ecc64cba1b140873dce8ad3",
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/dc21118016c039a66235cf93d96b435ffb282412",
+ "reference": "dc21118016c039a66235cf93d96b435ffb282412",
"shasum": ""
},
"require": {
@@ -7985,7 +8009,7 @@
"shim"
],
"support": {
- "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.37.0"
+ "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.38.1"
},
"funding": [
{
@@ -8005,20 +8029,20 @@
"type": "tidelift"
}
],
- "time": "2024-09-10T14:38:51+00:00"
+ "time": "2026-05-25T15:22:23+00:00"
},
{
"name": "symfony/polyfill-intl-normalizer",
- "version": "v1.37.0",
+ "version": "v1.38.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-intl-normalizer.git",
- "reference": "3833d7255cc303546435cb650316bff708a1c75c"
+ "reference": "2d446c214bdbe5b71bde5011b060a05fece3ae6b"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c",
- "reference": "3833d7255cc303546435cb650316bff708a1c75c",
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/2d446c214bdbe5b71bde5011b060a05fece3ae6b",
+ "reference": "2d446c214bdbe5b71bde5011b060a05fece3ae6b",
"shasum": ""
},
"require": {
@@ -8070,7 +8094,7 @@
"shim"
],
"support": {
- "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.37.0"
+ "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.38.0"
},
"funding": [
{
@@ -8090,20 +8114,20 @@
"type": "tidelift"
}
],
- "time": "2024-09-09T11:45:10+00:00"
+ "time": "2026-05-25T13:48:31+00:00"
},
{
"name": "symfony/polyfill-mbstring",
- "version": "v1.37.0",
+ "version": "v1.38.2",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-mbstring.git",
- "reference": "6a21eb99c6973357967f6ce3708cd55a6bec6315"
+ "reference": "d3d318bad5e7a1bfbd026009c8bfb8d8f99ae6b6"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/6a21eb99c6973357967f6ce3708cd55a6bec6315",
- "reference": "6a21eb99c6973357967f6ce3708cd55a6bec6315",
+ "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/d3d318bad5e7a1bfbd026009c8bfb8d8f99ae6b6",
+ "reference": "d3d318bad5e7a1bfbd026009c8bfb8d8f99ae6b6",
"shasum": ""
},
"require": {
@@ -8155,7 +8179,7 @@
"shim"
],
"support": {
- "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.37.0"
+ "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.38.2"
},
"funding": [
{
@@ -8175,7 +8199,7 @@
"type": "tidelift"
}
],
- "time": "2026-04-10T17:25:58+00:00"
+ "time": "2026-05-27T06:59:30+00:00"
},
{
"name": "symfony/polyfill-php80",
@@ -8263,16 +8287,16 @@
},
{
"name": "symfony/polyfill-php84",
- "version": "v1.37.0",
+ "version": "v1.38.1",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-php84.git",
- "reference": "88486db2c389b290bf87ff1de7ebc1e13e42bb06"
+ "reference": "f4e1dfaee5b74aba5964fe1fd4dfc7ba5e3085fa"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/88486db2c389b290bf87ff1de7ebc1e13e42bb06",
- "reference": "88486db2c389b290bf87ff1de7ebc1e13e42bb06",
+ "url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/f4e1dfaee5b74aba5964fe1fd4dfc7ba5e3085fa",
+ "reference": "f4e1dfaee5b74aba5964fe1fd4dfc7ba5e3085fa",
"shasum": ""
},
"require": {
@@ -8319,7 +8343,7 @@
"shim"
],
"support": {
- "source": "https://github.com/symfony/polyfill-php84/tree/v1.37.0"
+ "source": "https://github.com/symfony/polyfill-php84/tree/v1.38.1"
},
"funding": [
{
@@ -8339,20 +8363,20 @@
"type": "tidelift"
}
],
- "time": "2026-04-10T18:47:49+00:00"
+ "time": "2026-05-26T12:51:13+00:00"
},
{
"name": "symfony/polyfill-php85",
- "version": "v1.37.0",
+ "version": "v1.38.1",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-php85.git",
- "reference": "fcfa4973a9917cef23f2e38774da74a2b7d115ee"
+ "reference": "ba2ba04f3352cfa2dcbbcb90aee13ed967f505b1"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-php85/zipball/fcfa4973a9917cef23f2e38774da74a2b7d115ee",
- "reference": "fcfa4973a9917cef23f2e38774da74a2b7d115ee",
+ "url": "https://api.github.com/repos/symfony/polyfill-php85/zipball/ba2ba04f3352cfa2dcbbcb90aee13ed967f505b1",
+ "reference": "ba2ba04f3352cfa2dcbbcb90aee13ed967f505b1",
"shasum": ""
},
"require": {
@@ -8399,7 +8423,7 @@
"shim"
],
"support": {
- "source": "https://github.com/symfony/polyfill-php85/tree/v1.37.0"
+ "source": "https://github.com/symfony/polyfill-php85/tree/v1.38.1"
},
"funding": [
{
@@ -8419,20 +8443,20 @@
"type": "tidelift"
}
],
- "time": "2026-04-26T13:10:57+00:00"
+ "time": "2026-05-26T02:25:22+00:00"
},
{
"name": "symfony/polyfill-php86",
- "version": "v1.37.0",
+ "version": "v1.38.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-php86.git",
- "reference": "33d8fc5a705481e21fe3a81212b26f9b1f61749c"
+ "reference": "fcec68d64f46dc84e1f6ffcf2c6dda40ff3143ad"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-php86/zipball/33d8fc5a705481e21fe3a81212b26f9b1f61749c",
- "reference": "33d8fc5a705481e21fe3a81212b26f9b1f61749c",
+ "url": "https://api.github.com/repos/symfony/polyfill-php86/zipball/fcec68d64f46dc84e1f6ffcf2c6dda40ff3143ad",
+ "reference": "fcec68d64f46dc84e1f6ffcf2c6dda40ff3143ad",
"shasum": ""
},
"require": {
@@ -8479,7 +8503,7 @@
"shim"
],
"support": {
- "source": "https://github.com/symfony/polyfill-php86/tree/v1.37.0"
+ "source": "https://github.com/symfony/polyfill-php86/tree/v1.38.0"
},
"funding": [
{
@@ -8499,7 +8523,7 @@
"type": "tidelift"
}
],
- "time": "2026-04-26T13:13:48+00:00"
+ "time": "2026-05-25T11:52:35+00:00"
},
{
"name": "symfony/polyfill-uuid",
@@ -8586,20 +8610,20 @@
},
{
"name": "symfony/process",
- "version": "v8.0.8",
+ "version": "v8.1.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/process.git",
- "reference": "cb8939aff03470d1a9d1d1b66d08c6fa71b3bbdc"
+ "reference": "c4a9e58f235a6bf7f97ffbfedae2687353ac79e5"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/process/zipball/cb8939aff03470d1a9d1d1b66d08c6fa71b3bbdc",
- "reference": "cb8939aff03470d1a9d1d1b66d08c6fa71b3bbdc",
+ "url": "https://api.github.com/repos/symfony/process/zipball/c4a9e58f235a6bf7f97ffbfedae2687353ac79e5",
+ "reference": "c4a9e58f235a6bf7f97ffbfedae2687353ac79e5",
"shasum": ""
},
"require": {
- "php": ">=8.4"
+ "php": ">=8.4.1"
},
"type": "library",
"autoload": {
@@ -8627,7 +8651,7 @@
"description": "Executes commands in sub-processes",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/process/tree/v8.0.8"
+ "source": "https://github.com/symfony/process/tree/v8.1.0"
},
"funding": [
{
@@ -8647,24 +8671,24 @@
"type": "tidelift"
}
],
- "time": "2026-03-30T15:14:47+00:00"
+ "time": "2026-05-29T05:06:50+00:00"
},
{
"name": "symfony/psr-http-message-bridge",
- "version": "v8.0.8",
+ "version": "v8.1.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/psr-http-message-bridge.git",
- "reference": "94facc221260c1d5f20e31ee43cd6c6a824b4a19"
+ "reference": "67fd34de15ded1763aa1e330fe345f080a94022c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/psr-http-message-bridge/zipball/94facc221260c1d5f20e31ee43cd6c6a824b4a19",
- "reference": "94facc221260c1d5f20e31ee43cd6c6a824b4a19",
+ "url": "https://api.github.com/repos/symfony/psr-http-message-bridge/zipball/67fd34de15ded1763aa1e330fe345f080a94022c",
+ "reference": "67fd34de15ded1763aa1e330fe345f080a94022c",
"shasum": ""
},
"require": {
- "php": ">=8.4",
+ "php": ">=8.4.1",
"psr/http-message": "^1.0|^2.0",
"symfony/http-foundation": "^7.4|^8.0"
},
@@ -8714,7 +8738,7 @@
"psr-7"
],
"support": {
- "source": "https://github.com/symfony/psr-http-message-bridge/tree/v8.0.8"
+ "source": "https://github.com/symfony/psr-http-message-bridge/tree/v8.1.0"
},
"funding": [
{
@@ -8734,24 +8758,24 @@
"type": "tidelift"
}
],
- "time": "2026-03-30T15:14:47+00:00"
+ "time": "2026-05-29T05:06:50+00:00"
},
{
"name": "symfony/routing",
- "version": "v8.0.9",
+ "version": "v8.1.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/routing.git",
- "reference": "75d1bd8e5da3424e4db2fc3ff0222cb4d0c73038"
+ "reference": "fe0bfec72c8a806109fb9c3a5f2b898fe0c76eb3"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/routing/zipball/75d1bd8e5da3424e4db2fc3ff0222cb4d0c73038",
- "reference": "75d1bd8e5da3424e4db2fc3ff0222cb4d0c73038",
+ "url": "https://api.github.com/repos/symfony/routing/zipball/fe0bfec72c8a806109fb9c3a5f2b898fe0c76eb3",
+ "reference": "fe0bfec72c8a806109fb9c3a5f2b898fe0c76eb3",
"shasum": ""
},
"require": {
- "php": ">=8.4",
+ "php": ">=8.4.1",
"symfony/deprecation-contracts": "^2.5|^3"
},
"require-dev": {
@@ -8794,7 +8818,7 @@
"url"
],
"support": {
- "source": "https://github.com/symfony/routing/tree/v8.0.9"
+ "source": "https://github.com/symfony/routing/tree/v8.1.0"
},
"funding": [
{
@@ -8814,7 +8838,7 @@
"type": "tidelift"
}
],
- "time": "2026-04-29T15:02:55+00:00"
+ "time": "2026-05-29T05:06:50+00:00"
},
{
"name": "symfony/service-contracts",
@@ -8905,20 +8929,20 @@
},
{
"name": "symfony/string",
- "version": "v8.0.8",
+ "version": "v8.1.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/string.git",
- "reference": "ae9488f874d7603f9d2dfbf120203882b645d963"
+ "reference": "afd5944f4005862d961efb85c8bbd5c523c4e3c9"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/string/zipball/ae9488f874d7603f9d2dfbf120203882b645d963",
- "reference": "ae9488f874d7603f9d2dfbf120203882b645d963",
+ "url": "https://api.github.com/repos/symfony/string/zipball/afd5944f4005862d961efb85c8bbd5c523c4e3c9",
+ "reference": "afd5944f4005862d961efb85c8bbd5c523c4e3c9",
"shasum": ""
},
"require": {
- "php": ">=8.4",
+ "php": ">=8.4.1",
"symfony/polyfill-ctype": "^1.8",
"symfony/polyfill-intl-grapheme": "^1.33",
"symfony/polyfill-intl-normalizer": "^1.0",
@@ -8971,7 +8995,7 @@
"utf8"
],
"support": {
- "source": "https://github.com/symfony/string/tree/v8.0.8"
+ "source": "https://github.com/symfony/string/tree/v8.1.0"
},
"funding": [
{
@@ -8991,24 +9015,24 @@
"type": "tidelift"
}
],
- "time": "2026-03-30T15:14:47+00:00"
+ "time": "2026-05-29T05:06:50+00:00"
},
{
"name": "symfony/translation",
- "version": "v8.0.10",
+ "version": "v8.1.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/translation.git",
- "reference": "f63e9342e12646a57c91ef8a366a4f9d8e557b67"
+ "reference": "b2bd012ca28c4acae830ee1206a5b6e35dd99693"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/translation/zipball/f63e9342e12646a57c91ef8a366a4f9d8e557b67",
- "reference": "f63e9342e12646a57c91ef8a366a4f9d8e557b67",
+ "url": "https://api.github.com/repos/symfony/translation/zipball/b2bd012ca28c4acae830ee1206a5b6e35dd99693",
+ "reference": "b2bd012ca28c4acae830ee1206a5b6e35dd99693",
"shasum": ""
},
"require": {
- "php": ">=8.4",
+ "php": ">=8.4.1",
"symfony/polyfill-mbstring": "^1.0",
"symfony/translation-contracts": "^3.6.1"
},
@@ -9064,7 +9088,7 @@
"description": "Provides tools to internationalize your application",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/translation/tree/v8.0.10"
+ "source": "https://github.com/symfony/translation/tree/v8.1.0"
},
"funding": [
{
@@ -9084,7 +9108,7 @@
"type": "tidelift"
}
],
- "time": "2026-05-06T11:30:54+00:00"
+ "time": "2026-05-29T05:06:50+00:00"
},
{
"name": "symfony/translation-contracts",
@@ -9170,20 +9194,20 @@
},
{
"name": "symfony/type-info",
- "version": "v8.0.9",
+ "version": "v8.1.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/type-info.git",
- "reference": "08723aceb8c3271e8cb3db8b2565728b0c88e866"
+ "reference": "9f24df8a79781b9b9f030fea7dfd2f3bd1e7e7e7"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/type-info/zipball/08723aceb8c3271e8cb3db8b2565728b0c88e866",
- "reference": "08723aceb8c3271e8cb3db8b2565728b0c88e866",
+ "url": "https://api.github.com/repos/symfony/type-info/zipball/9f24df8a79781b9b9f030fea7dfd2f3bd1e7e7e7",
+ "reference": "9f24df8a79781b9b9f030fea7dfd2f3bd1e7e7e7",
"shasum": ""
},
"require": {
- "php": ">=8.4",
+ "php": ">=8.4.1",
"psr/container": "^1.1|^2.0"
},
"conflict": {
@@ -9228,7 +9252,7 @@
"type"
],
"support": {
- "source": "https://github.com/symfony/type-info/tree/v8.0.9"
+ "source": "https://github.com/symfony/type-info/tree/v8.1.0"
},
"funding": [
{
@@ -9248,24 +9272,24 @@
"type": "tidelift"
}
],
- "time": "2026-04-29T15:02:55+00:00"
+ "time": "2026-05-29T05:06:50+00:00"
},
{
"name": "symfony/uid",
- "version": "v8.0.9",
+ "version": "v8.1.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/uid.git",
- "reference": "4d9d6510bbe88ebb4608b7200d18606cdf80825c"
+ "reference": "7393f157a55f7e70a4de0334435c55a5a8fe749a"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/uid/zipball/4d9d6510bbe88ebb4608b7200d18606cdf80825c",
- "reference": "4d9d6510bbe88ebb4608b7200d18606cdf80825c",
+ "url": "https://api.github.com/repos/symfony/uid/zipball/7393f157a55f7e70a4de0334435c55a5a8fe749a",
+ "reference": "7393f157a55f7e70a4de0334435c55a5a8fe749a",
"shasum": ""
},
"require": {
- "php": ">=8.4",
+ "php": ">=8.4.1",
"symfony/polyfill-uuid": "^1.15"
},
"require-dev": {
@@ -9306,7 +9330,7 @@
"uuid"
],
"support": {
- "source": "https://github.com/symfony/uid/tree/v8.0.9"
+ "source": "https://github.com/symfony/uid/tree/v8.1.0"
},
"funding": [
{
@@ -9326,24 +9350,24 @@
"type": "tidelift"
}
],
- "time": "2026-04-30T16:10:06+00:00"
+ "time": "2026-05-29T05:06:50+00:00"
},
{
"name": "symfony/var-dumper",
- "version": "v8.0.8",
+ "version": "v8.1.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/var-dumper.git",
- "reference": "cfb7badd53bf4177f6e9416cfbbccc13c0e773a1"
+ "reference": "c2c4df1d21477cc21c9f6dc1b14d07c3abc4963e"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/var-dumper/zipball/cfb7badd53bf4177f6e9416cfbbccc13c0e773a1",
- "reference": "cfb7badd53bf4177f6e9416cfbbccc13c0e773a1",
+ "url": "https://api.github.com/repos/symfony/var-dumper/zipball/c2c4df1d21477cc21c9f6dc1b14d07c3abc4963e",
+ "reference": "c2c4df1d21477cc21c9f6dc1b14d07c3abc4963e",
"shasum": ""
},
"require": {
- "php": ">=8.4",
+ "php": ">=8.4.1",
"symfony/polyfill-mbstring": "^1.0"
},
"conflict": {
@@ -9393,7 +9417,7 @@
"dump"
],
"support": {
- "source": "https://github.com/symfony/var-dumper/tree/v8.0.8"
+ "source": "https://github.com/symfony/var-dumper/tree/v8.1.0"
},
"funding": [
{
@@ -9413,31 +9437,32 @@
"type": "tidelift"
}
],
- "time": "2026-03-31T07:15:36+00:00"
+ "time": "2026-05-29T05:06:50+00:00"
},
{
"name": "symfony/yaml",
- "version": "v8.0.10",
+ "version": "v8.1.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/yaml.git",
- "reference": "aa9ee60c41d9b20a2468c41ff0a32e2a7405ac05"
+ "reference": "efb42bd2c6f4f3ccfd4683583449938b5fc146b0"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/yaml/zipball/aa9ee60c41d9b20a2468c41ff0a32e2a7405ac05",
- "reference": "aa9ee60c41d9b20a2468c41ff0a32e2a7405ac05",
+ "url": "https://api.github.com/repos/symfony/yaml/zipball/efb42bd2c6f4f3ccfd4683583449938b5fc146b0",
+ "reference": "efb42bd2c6f4f3ccfd4683583449938b5fc146b0",
"shasum": ""
},
"require": {
- "php": ">=8.4",
+ "php": ">=8.4.1",
"symfony/polyfill-ctype": "^1.8"
},
"conflict": {
"symfony/console": "<7.4"
},
"require-dev": {
- "symfony/console": "^7.4|^8.0"
+ "symfony/console": "^7.4|^8.0",
+ "yaml/yaml-test-suite": "*"
},
"bin": [
"Resources/bin/yaml-lint"
@@ -9468,7 +9493,7 @@
"description": "Loads and dumps YAML files",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/yaml/tree/v8.0.10"
+ "source": "https://github.com/symfony/yaml/tree/v8.1.0"
},
"funding": [
{
@@ -9488,7 +9513,7 @@
"type": "tidelift"
}
],
- "time": "2026-05-05T08:10:04+00:00"
+ "time": "2026-05-29T05:06:50+00:00"
},
{
"name": "thecodingmachine/safe",
@@ -9980,16 +10005,16 @@
"packages-dev": [
{
"name": "barryvdh/laravel-debugbar",
- "version": "v4.2.8",
+ "version": "v4.3.0",
"source": {
"type": "git",
"url": "https://github.com/fruitcake/laravel-debugbar.git",
- "reference": "799d70c1101d3f8840dd76ff68ff6a78f9352905"
+ "reference": "3d76ea8d78b82225b92789de65fc630c1cd8e80c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/fruitcake/laravel-debugbar/zipball/799d70c1101d3f8840dd76ff68ff6a78f9352905",
- "reference": "799d70c1101d3f8840dd76ff68ff6a78f9352905",
+ "url": "https://api.github.com/repos/fruitcake/laravel-debugbar/zipball/3d76ea8d78b82225b92789de65fc630c1cd8e80c",
+ "reference": "3d76ea8d78b82225b92789de65fc630c1cd8e80c",
"shasum": ""
},
"require": {
@@ -10063,7 +10088,7 @@
],
"support": {
"issues": "https://github.com/fruitcake/laravel-debugbar/issues",
- "source": "https://github.com/fruitcake/laravel-debugbar/tree/v4.2.8"
+ "source": "https://github.com/fruitcake/laravel-debugbar/tree/v4.3.0"
},
"funding": [
{
@@ -10075,7 +10100,7 @@
"type": "github"
}
],
- "time": "2026-04-20T13:31:29+00:00"
+ "time": "2026-06-04T07:54:01+00:00"
},
{
"name": "barryvdh/laravel-ide-helper",
@@ -10226,16 +10251,16 @@
},
{
"name": "brianium/paratest",
- "version": "v7.22.3",
+ "version": "v7.23.0",
"source": {
"type": "git",
"url": "https://github.com/paratestphp/paratest.git",
- "reference": "1648aa798a5791babe1ddea6ca3b1aea37e0c5ee"
+ "reference": "6a3adf37c2726fefb66e03cc93bb0e8f75d92134"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/paratestphp/paratest/zipball/1648aa798a5791babe1ddea6ca3b1aea37e0c5ee",
- "reference": "1648aa798a5791babe1ddea6ca3b1aea37e0c5ee",
+ "url": "https://api.github.com/repos/paratestphp/paratest/zipball/6a3adf37c2726fefb66e03cc93bb0e8f75d92134",
+ "reference": "6a3adf37c2726fefb66e03cc93bb0e8f75d92134",
"shasum": ""
},
"require": {
@@ -10246,24 +10271,24 @@
"fidry/cpu-core-counter": "^1.3.0",
"jean85/pretty-package-versions": "^2.1.1",
"php": "~8.4.0 || ~8.5.0",
- "phpunit/php-code-coverage": "^14",
+ "phpunit/php-code-coverage": "^14.2.0",
"phpunit/php-file-iterator": "^7",
"phpunit/php-timer": "^9",
- "phpunit/phpunit": "^13.1.3",
- "sebastian/environment": "^9.2.0",
- "symfony/console": "^7.4.8 || ^8.0.8",
- "symfony/process": "^7.4.8 || ^8.0.8"
+ "phpunit/phpunit": "^13.2.0",
+ "sebastian/environment": "^9.3.2",
+ "symfony/console": "^7.4.8 || ^8.1.0",
+ "symfony/process": "^7.4.8 || ^8.1.0"
},
"require-dev": {
"doctrine/coding-standard": "^14.0.0",
"ext-pcntl": "*",
"ext-pcov": "*",
"ext-posix": "*",
- "phpstan/phpstan": "^2.1.47",
+ "phpstan/phpstan": "^2.2.2",
"phpstan/phpstan-deprecation-rules": "^2.0.4",
"phpstan/phpstan-phpunit": "^2.0.16",
- "phpstan/phpstan-strict-rules": "^2.0.10",
- "symfony/filesystem": "^7.4.8 || ^8.0.8"
+ "phpstan/phpstan-strict-rules": "^2.0.11",
+ "symfony/filesystem": "^7.4.8 || ^8.1.0"
},
"bin": [
"bin/paratest",
@@ -10303,7 +10328,7 @@
],
"support": {
"issues": "https://github.com/paratestphp/paratest/issues",
- "source": "https://github.com/paratestphp/paratest/tree/v7.22.3"
+ "source": "https://github.com/paratestphp/paratest/tree/v7.23.0"
},
"funding": [
{
@@ -10315,7 +10340,7 @@
"type": "paypal"
}
],
- "time": "2026-04-15T05:24:54+00:00"
+ "time": "2026-06-05T10:56:52+00:00"
},
{
"name": "composer/class-map-generator",
@@ -10388,28 +10413,29 @@
},
{
"name": "composer/pcre",
- "version": "3.3.2",
+ "version": "3.4.0",
"source": {
"type": "git",
"url": "https://github.com/composer/pcre.git",
- "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e"
+ "reference": "d5a341b3fb61f3001970940afb1d332968a183ed"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/composer/pcre/zipball/b2bed4734f0cc156ee1fe9c0da2550420d99a21e",
- "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e",
+ "url": "https://api.github.com/repos/composer/pcre/zipball/d5a341b3fb61f3001970940afb1d332968a183ed",
+ "reference": "d5a341b3fb61f3001970940afb1d332968a183ed",
"shasum": ""
},
"require": {
"php": "^7.4 || ^8.0"
},
"conflict": {
- "phpstan/phpstan": "<1.11.10"
+ "phpstan/phpstan": "<2.2.2"
},
"require-dev": {
- "phpstan/phpstan": "^1.12 || ^2",
- "phpstan/phpstan-strict-rules": "^1 || ^2",
- "phpunit/phpunit": "^8 || ^9"
+ "phpstan/phpstan": "^2",
+ "phpstan/phpstan-deprecation-rules": "^2",
+ "phpstan/phpstan-strict-rules": "^2",
+ "phpunit/phpunit": "^9"
},
"type": "library",
"extra": {
@@ -10447,7 +10473,7 @@
],
"support": {
"issues": "https://github.com/composer/pcre/issues",
- "source": "https://github.com/composer/pcre/tree/3.3.2"
+ "source": "https://github.com/composer/pcre/tree/3.4.0"
},
"funding": [
{
@@ -10457,13 +10483,9 @@
{
"url": "https://github.com/composer",
"type": "github"
- },
- {
- "url": "https://tidelift.com/funding/github/packagist/composer/composer",
- "type": "tidelift"
}
],
- "time": "2024-11-12T16:29:46+00:00"
+ "time": "2026-06-07T11:47:49+00:00"
},
{
"name": "fakerphp/faker",
@@ -11366,16 +11388,16 @@
},
{
"name": "phpunit/php-code-coverage",
- "version": "14.1.7",
+ "version": "14.2.2",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/php-code-coverage.git",
- "reference": "da6e6b64940901650abcea62430c8c24926b7a71"
+ "reference": "10d7da3628a99289cdf4c662dd7f0d73f1baec83"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/da6e6b64940901650abcea62430c8c24926b7a71",
- "reference": "da6e6b64940901650abcea62430c8c24926b7a71",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/10d7da3628a99289cdf4c662dd7f0d73f1baec83",
+ "reference": "10d7da3628a99289cdf4c662dd7f0d73f1baec83",
"shasum": ""
},
"require": {
@@ -11387,14 +11409,14 @@
"php": ">=8.4",
"phpunit/php-text-template": "^6.0",
"sebastian/complexity": "^6.0",
- "sebastian/environment": "^9.2",
+ "sebastian/environment": "^9.3.2",
"sebastian/git-state": "^1.0",
- "sebastian/lines-of-code": "^5.0",
+ "sebastian/lines-of-code": "^5.0.1",
"sebastian/version": "^7.0",
"theseer/tokenizer": "^2.0.1"
},
"require-dev": {
- "phpunit/phpunit": "^13.1"
+ "phpunit/phpunit": "^13.2.0"
},
"suggest": {
"ext-pcov": "PHP extension that provides line coverage",
@@ -11403,7 +11425,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "14.1.x-dev"
+ "dev-main": "14.2.x-dev"
}
},
"autoload": {
@@ -11432,7 +11454,7 @@
"support": {
"issues": "https://github.com/sebastianbergmann/php-code-coverage/issues",
"security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy",
- "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/14.1.7"
+ "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/14.2.2"
},
"funding": [
{
@@ -11452,7 +11474,7 @@
"type": "tidelift"
}
],
- "time": "2026-05-04T15:51:53+00:00"
+ "time": "2026-06-08T11:50:38+00:00"
},
{
"name": "phpunit/php-file-iterator",
@@ -11749,16 +11771,16 @@
},
{
"name": "phpunit/phpunit",
- "version": "13.1.8",
+ "version": "13.2.0",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/phpunit.git",
- "reference": "f49a2b5e51ffb33421745368cc099cf66830d71b"
+ "reference": "3796ea973f1e7698f0d432c1c66662af9764fd9a"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/f49a2b5e51ffb33421745368cc099cf66830d71b",
- "reference": "f49a2b5e51ffb33421745368cc099cf66830d71b",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/3796ea973f1e7698f0d432c1c66662af9764fd9a",
+ "reference": "3796ea973f1e7698f0d432c1c66662af9764fd9a",
"shasum": ""
},
"require": {
@@ -11772,21 +11794,22 @@
"phar-io/manifest": "^2.0.4",
"phar-io/version": "^3.2.1",
"php": ">=8.4.1",
- "phpunit/php-code-coverage": "^14.1.6",
+ "phpunit/php-code-coverage": "^14.2",
"phpunit/php-file-iterator": "^7.0.0",
"phpunit/php-invoker": "^7.0.0",
"phpunit/php-text-template": "^6.0.0",
"phpunit/php-timer": "^9.0.0",
"sebastian/cli-parser": "^5.0.0",
- "sebastian/comparator": "^8.1.2",
- "sebastian/diff": "^8.1.0",
- "sebastian/environment": "^9.3.0",
- "sebastian/exporter": "^8.0.2",
+ "sebastian/comparator": "^8.3.0",
+ "sebastian/diff": "^9.0",
+ "sebastian/environment": "^9.3.2",
+ "sebastian/exporter": "^8.1.0",
+ "sebastian/file-filter": "^1.0",
"sebastian/git-state": "^1.0",
- "sebastian/global-state": "^9.0.0",
+ "sebastian/global-state": "^9.0.1",
"sebastian/object-enumerator": "^8.0.0",
"sebastian/recursion-context": "^8.0.0",
- "sebastian/type": "^7.0.0",
+ "sebastian/type": "^7.0.1",
"sebastian/version": "^7.0.0",
"staabm/side-effects-detector": "^1.0.5"
},
@@ -11796,7 +11819,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "13.1-dev"
+ "dev-main": "13.2-dev"
}
},
"autoload": {
@@ -11828,7 +11851,7 @@
"support": {
"issues": "https://github.com/sebastianbergmann/phpunit/issues",
"security": "https://github.com/sebastianbergmann/phpunit/security/policy",
- "source": "https://github.com/sebastianbergmann/phpunit/tree/13.1.8"
+ "source": "https://github.com/sebastianbergmann/phpunit/tree/13.2.0"
},
"funding": [
{
@@ -11836,7 +11859,7 @@
"type": "other"
}
],
- "time": "2026-05-01T04:22:45+00:00"
+ "time": "2026-06-05T03:13:07+00:00"
},
{
"name": "roave/security-advisories",
@@ -11844,18 +11867,18 @@
"source": {
"type": "git",
"url": "https://github.com/Roave/SecurityAdvisories.git",
- "reference": "da5ea382371ce364f5b50de204e3830b6efc6eec"
+ "reference": "810e1d8cfbc718df8dacf74b62b7b9a1780b9698"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/da5ea382371ce364f5b50de204e3830b6efc6eec",
- "reference": "da5ea382371ce364f5b50de204e3830b6efc6eec",
+ "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/810e1d8cfbc718df8dacf74b62b7b9a1780b9698",
+ "reference": "810e1d8cfbc718df8dacf74b62b7b9a1780b9698",
"shasum": ""
},
"conflict": {
"3f/pygmentize": "<1.2",
"adaptcms/adaptcms": "<=1.3",
- "admidio/admidio": "<=5.0.8",
+ "admidio/admidio": "<=5.0.9",
"adodb/adodb-php": "<=5.22.9",
"aheinze/cockpit": "<2.2",
"aimeos/ai-admin-graphql": ">=2022.04.1,<2022.10.10|>=2023.04.1,<2023.10.6|>=2024.04.1,<2024.07.2",
@@ -11904,7 +11927,7 @@
"auth0/login": "<=7.20",
"auth0/symfony": "<=5.7",
"auth0/wordpress": "<=5.5",
- "automad/automad": "<2.0.0.0-alpha5",
+ "automad/automad": "<=2.0.0.0-beta27",
"automattic/jetpack": "<9.8",
"awesome-support/awesome-support": "<=6.0.7",
"aws/aws-sdk-php": "<=3.371.3",
@@ -11912,7 +11935,7 @@
"azuracast/azuracast": "<=0.23.5",
"b13/seo_basics": "<0.8.2",
"backdrop/backdrop": "<=1.32",
- "backpack/crud": "<3.4.9",
+ "backpack/crud": "<4.0.63|>=4.1,<4.1.69|>=5,<5.0.13",
"backpack/filemanager": "<2.0.2|>=3,<3.0.9",
"bacula-web/bacula-web": "<9.7.1",
"badaso/core": "<=2.9.11",
@@ -11929,6 +11952,7 @@
"bedita/bedita": "<4",
"bednee/cooluri": "<1.0.30",
"bigfork/silverstripe-form-capture": ">=3,<3.1.1",
+ "billabear/billabear": "<=2025.01.03",
"billz/raspap-webgui": "<3.3.6",
"binarytorch/larecipe": "<2.8.1",
"bk2k/bootstrap-package": ">=7.1,<7.1.2|>=8,<8.0.8|>=9,<9.0.4|>=9.1,<9.1.3|>=10,<10.0.10|>=11,<11.0.3",
@@ -11964,23 +11988,23 @@
"cesnet/simplesamlphp-module-proxystatistics": "<3.1",
"chriskacerguis/codeigniter-restserver": "<=2.7.1",
"chrome-php/chrome": "<1.14",
- "ci4-cms-erp/ci4ms": "<=0.31.7",
+ "ci4-cms-erp/ci4ms": "<=0.31.8",
"civicrm/civicrm-core": ">=4.2,<4.2.9|>=4.3,<4.3.3",
"ckeditor/ckeditor": "<4.25",
"clickstorm/cs-seo": ">=6,<6.8|>=7,<7.5|>=8,<8.4|>=9,<9.3",
"co-stack/fal_sftp": "<0.2.6",
- "cockpit-hq/cockpit": "<2.14",
- "code16/sharp": "<9.20",
+ "cockpit-hq/cockpit": "<=2.14",
+ "code16/sharp": "<9.22",
"codeception/codeception": "<3.1.3|>=4,<4.1.22",
"codeigniter/framework": "<3.1.10",
- "codeigniter4/framework": "<4.6.2",
+ "codeigniter4/framework": "<4.7.2",
"codeigniter4/shield": "<1.0.0.0-beta8",
"codiad/codiad": "<=2.8.4",
"codingms/additional-tca": ">=1.7,<1.15.17|>=1.16,<1.16.9",
"codingms/modules": "<4.3.11|>=5,<5.7.4|>=6,<6.4.2|>=7,<7.5.5",
"commerceteam/commerce": ">=0.9.6,<0.9.9",
"components/jquery": ">=1.0.3,<3.5",
- "composer/composer": "<2.2.27|>=2.3,<2.9.6",
+ "composer/composer": "<2.2.28|>=2.3,<2.9.8",
"concrete5/concrete5": "<9.4.8",
"concrete5/core": "<8.5.8|>=9,<9.1",
"contao-components/mediaelement": ">=2.14.2,<2.21.1",
@@ -11990,7 +12014,7 @@
"contao/core-bundle": "<4.13.57|>=5,<5.3.42|>=5.4,<5.6.5",
"contao/listing-bundle": ">=3,<=3.5.30|>=4,<4.4.8",
"contao/managed-edition": "<=1.5",
- "coreshop/core-shop": "<4.1.9",
+ "coreshop/core-shop": "<4.1.9|==5",
"corveda/phpsandbox": "<1.3.5",
"cosenary/instagram": "<=2.3",
"couleurcitron/tarteaucitron-wp": "<0.3",
@@ -12038,7 +12062,7 @@
"doctrine/mongodb-odm": "<1.0.2",
"doctrine/mongodb-odm-bundle": "<3.0.1",
"doctrine/orm": ">=1,<1.2.4|>=2,<2.4.8|>=2.5,<2.5.1|>=2.8.3,<2.8.4",
- "dolibarr/dolibarr": "<=22.0.4",
+ "dolibarr/dolibarr": "<=23.0.2",
"dompdf/dompdf": "<2.0.4",
"doublethreedigital/guest-entries": "<3.1.2",
"dreamfactory/df-core": "<1.0.4",
@@ -12053,7 +12077,7 @@
"drupal/commerce_alphabank_redirect": "<1.0.3",
"drupal/commerce_eurobank_redirect": "<2.1.1",
"drupal/config_split": "<1.10|>=2,<2.0.2",
- "drupal/core": ">=6,<6.38|>=7,<7.103|>=8,<10.4.9|>=10.5,<10.5.6|>=11,<11.1.9|>=11.2,<11.2.8",
+ "drupal/core": ">=6,<6.38|>=7,<7.103|>=8,<10.5.9|>=10.6,<10.6.7|>=11,<11.2.11|>=11.3,<11.3.7",
"drupal/core-recommended": ">=7,<7.102|>=8,<10.2.11|>=10.3,<10.3.9|>=11,<11.0.8",
"drupal/currency": "<3.5",
"drupal/drupal": ">=5,<5.11|>=6,<6.38|>=7,<7.102|>=8,<10.2.11|>=10.3,<10.3.9|>=11,<11.0.8",
@@ -12080,6 +12104,7 @@
"drupal/umami_analytics": "<1.0.1",
"duncanmcclean/guest-entries": "<3.1.2",
"dweeves/magmi": "<=0.7.24",
+ "easycorp/easyadmin-bundle": ">=4,<4.29.10|>=5,<5.0.13",
"ec-cube/ec-cube": "<2.4.4|>=2.11,<=2.17.1|>=3,<=3.0.18.0-patch4|>=4,<=4.3.1",
"ecodev/newsletter": "<=4",
"ectouch/ectouch": "<=2.7.2",
@@ -12095,6 +12120,7 @@
"erusev/parsedown": "<1.7.2",
"ether/logs": "<3.0.4",
"evolutioncms/evolution": "<=3.2.3",
+ "evoweb/sf-register": "<13.2.4|>=14,<14.0.2",
"exceedone/exment": "<4.4.3|>=5,<5.0.3",
"exceedone/laravel-admin": "<2.2.3|==3",
"ezsystems/demobundle": ">=5.4,<5.4.6.1-dev",
@@ -12122,10 +12148,10 @@
"feehi/cms": "<=2.1.1",
"feehi/feehicms": "<=2.1.1",
"fenom/fenom": "<=2.12.1",
- "filament/actions": ">=3.2,<3.2.123",
+ "filament/actions": ">=3.2,<3.2.123|>=4,<=4.11.3|>=5,<=5.6.3",
"filament/filament": ">=4,<4.3.1",
"filament/infolists": ">=3,<3.2.115",
- "filament/tables": ">=3,<3.2.115|>=4,<4.8.5|>=5,<5.3.5",
+ "filament/tables": ">=3,<=3.3.50|>=4,<4.8.5|>=5,<5.3.5",
"filegator/filegator": "<7.8",
"filp/whoops": "<2.1.13",
"fineuploader/php-traditional-server": "<=1.2.2",
@@ -12159,21 +12185,22 @@
"friendsofsymfony1/symfony1": ">=1.1,<1.5.19",
"friendsoftypo3/mediace": ">=7.6.2,<7.6.5",
"friendsoftypo3/openid": ">=4.5,<4.5.31|>=4.7,<4.7.16|>=6,<6.0.11|>=6.1,<6.1.6",
+ "friendsoftypo3/tt-address": "<8.1.2|>=9,<9.1.1|>=10,<10.0.1",
"froala/wysiwyg-editor": "<=4.3",
"frosh/adminer-platform": "<2.2.1",
- "froxlor/froxlor": "<2.3.6",
+ "froxlor/froxlor": "<2.3.7",
"frozennode/administrator": "<=5.0.12",
"fuel/core": "<1.8.1",
- "funadmin/funadmin": "<=7.1.0.0-RC4",
+ "funadmin/funadmin": "<=7.1.0.0-RC6",
"gaoming13/wechat-php-sdk": "<=1.10.2",
"genix/cms": "<=1.1.11",
- "georgringer/news": "<1.3.3",
+ "georgringer/news": "<10.0.4|>=11,<11.4.4|>=12,<12.3.2|>=13,<13.0.2|>=14,<14.0.3",
"geshi/geshi": "<=1.0.9.1",
"getformwork/formwork": "<=2.3.3",
- "getgrav/grav": "<2.0.0.0-beta4",
+ "getgrav/grav": "<=2.0.0.0-RC1",
"getgrav/grav-plugin-api": "<1.0.0.0-beta15",
"getgrav/grav-plugin-form": "<9.1",
- "getkirby/cms": "<4.9|>=5,<5.4",
+ "getkirby/cms": "<=4.9|>=5,<=5.4",
"getkirby/kirby": "<3.9.8.3-dev|>=3.10,<3.10.1.2-dev|>=4,<4.7.1",
"getkirby/panel": "<2.5.14",
"getkirby/starterkit": "<=3.7.0.2",
@@ -12188,11 +12215,12 @@
"gp247/core": "<1.1.24",
"gree/jose": "<2.2.1",
"gregwar/rst": "<1.0.3",
- "grumpydictator/firefly-iii": "<6.1.17|>=6.4.23,<=6.5",
+ "grumpydictator/firefly-iii": "<=6.6.2",
"gugoan/economizzer": "<=0.9.0.0-beta1",
"guzzlehttp/guzzle": "<6.5.8|>=7,<7.4.5",
+ "guzzlehttp/guzzle-services": "<1.5.4",
"guzzlehttp/oauth-subscriber": "<0.8.1",
- "guzzlehttp/psr7": "<1.9.1|>=2,<2.4.5",
+ "guzzlehttp/psr7": "<2.10.2",
"haffner/jh_captcha": "<=2.1.3|>=3,<=3.0.2",
"handcraftedinthealps/goodby-csv": "<1.4.3",
"harvesthq/chosen": "<1.8.7",
@@ -12221,6 +12249,7 @@
"illuminate/cookie": ">=4,<=4.0.11|>=4.1,<6.18.31|>=7,<7.22.4",
"illuminate/database": "<6.20.26|>=7,<7.30.5|>=8,<8.40",
"illuminate/encryption": ">=4,<=4.0.11|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.40|>=5.6,<5.6.15",
+ "illuminate/mail": ">=9,<12.60|>=13,<13.10",
"illuminate/view": "<6.20.42|>=7,<7.30.6|>=8,<8.75",
"imdbphp/imdbphp": "<=5.1.1",
"impresscms/impresscms": "<=1.4.5",
@@ -12234,7 +12263,7 @@
"inter-mediator/inter-mediator": "==5.5",
"intercom/intercom-php": "==5.0.2",
"invoiceninja/invoiceninja": "<5.13.4",
- "ipl/web": "<=0.13",
+ "ipl/web": "<=0.10.2|>=0.11,<=0.13",
"islandora/crayfish": "<4.1",
"islandora/islandora": ">=2,<2.4.1",
"ivankristianto/phpwhois": "<=4.3",
@@ -12275,20 +12304,21 @@
"kimai/kimai": "<=2.55",
"kitodo/presentation": "<3.2.3|>=3.3,<3.3.4",
"klaviyo/magento2-extension": ">=1,<3",
- "knplabs/knp-snappy": "<=1.4.2",
+ "knplabs/knp-snappy": "<=1.7",
"kohana/core": "<3.3.3",
"koillection/koillection": "<1.6.12",
"krayin/laravel-crm": "<=2.2",
"kreait/firebase-php": ">=3.2,<3.8.1",
"kumbiaphp/kumbiapp": "<=1.1.1",
"la-haute-societe/tcpdf": "<6.2.22",
+ "laktak/hjson": "<2.3",
"laminas/laminas-diactoros": "<2.18.1|==2.19|==2.20|==2.21|==2.22|==2.23|>=2.24,<2.24.2|>=2.25,<2.25.2",
"laminas/laminas-form": "<2.17.1|>=3,<3.0.2|>=3.1,<3.1.1",
"laminas/laminas-http": "<2.14.2",
"lara-zeus/artemis": ">=1,<=1.0.6",
"lara-zeus/dynamic-dashboard": ">=3,<=3.0.1",
"laravel/fortify": "<1.11.1",
- "laravel/framework": "<10.48.29|>=11,<11.44.1|>=12,<12.1.1",
+ "laravel/framework": "<12.60|>=13,<13.10",
"laravel/laravel": ">=5.4,<5.4.22",
"laravel/passport": ">=13,<13.7.1",
"laravel/pulse": "<1.3.1",
@@ -12330,7 +12360,7 @@
"maikuolan/phpmussel": ">=1,<1.6",
"mainwp/mainwp": "<=4.4.3.3",
"manogi/nova-tiptap": "<=3.2.6",
- "mantisbt/mantisbt": "<2.28.1",
+ "mantisbt/mantisbt": "<2.28.2",
"marcwillmann/turn": "<0.3.3",
"markhuot/craftql": "<=1.3.7",
"marshmallow/nova-tiptap": "<5.7",
@@ -12366,6 +12396,7 @@
"miraheze/ts-portal": "<=33",
"mittwald/typo3_forum": "<1.2.1",
"mix/mix": ">=2,<=2.2.17",
+ "mmc/ceselector": "<3.0.3|>=4,<4.0.2|>=5,<5.0.1|>=6,<6.0.1",
"mobiledetect/mobiledetectlib": "<2.8.32",
"modx/revolution": "<=3.1",
"mojo42/jirafeau": "<4.4",
@@ -12459,7 +12490,8 @@
"pegasus/google-for-jobs": "<1.5.1|>=2,<2.1.1",
"personnummer/personnummer": "<3.0.2",
"ph7software/ph7builder": "<=17.9.1",
- "phanan/koel": "<5.1.4",
+ "phanan/koel": "<=9.3.4",
+ "pheditor/pheditor": ">=2.0.1,<=2.0.3",
"phenx/php-svg-lib": "<0.5.2",
"php-censor/php-censor": "<2.0.13|>=2.1,<2.1.5",
"php-mod/curl": "<2.3.2",
@@ -12469,11 +12501,11 @@
"phpmailer/phpmailer": "<6.5",
"phpmussel/phpmussel": ">=1,<1.6",
"phpmyadmin/phpmyadmin": "<5.2.2",
- "phpmyfaq/phpmyfaq": "<=4.1.1",
+ "phpmyfaq/phpmyfaq": "<4.1.3",
"phpoffice/common": "<0.2.9",
"phpoffice/math": "<=0.2",
"phpoffice/phpexcel": "<=1.8.2",
- "phpoffice/phpspreadsheet": "<=1.30.3|>=2,<=2.1.15|>=2.2,<=2.4.4|>=3,<=3.10.4|>=4,<=5.6",
+ "phpoffice/phpspreadsheet": "<=1.30.4|>=2,<=2.1.15|>=2.2,<=2.4.4|>=3,<=3.10.4|>=4,<=5.6",
"phppgadmin/phppgadmin": "<=7.13",
"phpseclib/phpseclib": "<=2.0.53|>=3,<=3.0.51",
"phpservermon/phpservermon": "<3.6",
@@ -12484,14 +12516,14 @@
"phpxmlrpc/phpxmlrpc": "<4.9.2",
"phraseanet/phraseanet": "==4.0.3",
"pi/pi": "<=2.5",
- "pimcore/admin-ui-classic-bundle": "<=1.7.15|>=2.0.0.0-RC1-dev,<=2.2.2",
+ "pimcore/admin-ui-classic-bundle": "<=2.3.5",
"pimcore/customer-management-framework-bundle": "<4.2.1",
"pimcore/data-hub": "<1.2.4",
"pimcore/data-importer": "<1.8.9|>=1.9,<1.9.3",
"pimcore/demo": "<10.3",
"pimcore/ecommerce-framework-bundle": "<1.0.10",
"pimcore/perspective-editor": "<1.5.1",
- "pimcore/pimcore": "<=11.5.14.1|>=12,<12.3.3|==12.3.3",
+ "pimcore/pimcore": "<=12.3.6",
"pimcore/web2print-tools-bundle": "<=5.2.1|>=6.0.0.0-RC1-dev,<=6.1",
"piwik/piwik": "<1.11",
"pixelfed/pixelfed": "<0.12.5",
@@ -12499,13 +12531,14 @@
"pocketmine/bedrock-protocol": "<8.0.2",
"pocketmine/pocketmine-mp": "<5.42.1",
"pocketmine/raklib": ">=0.14,<0.14.6|>=0.15,<0.15.1",
+ "poweradmin/poweradmin": "<4.2.4|>=4.3,<4.3.3",
"pressbooks/pressbooks": "<5.18",
"prestashop/autoupgrade": ">=4,<4.10.1",
"prestashop/blockreassurance": "<=5.1.3",
"prestashop/blockwishlist": ">=2,<2.1.1",
"prestashop/contactform": ">=1.0.1,<4.3",
"prestashop/gamification": "<2.3.2",
- "prestashop/prestashop": "<8.2.5|>=9.0.0.0-alpha1,<9.1",
+ "prestashop/prestashop": "<8.2.6|>=9,<9.1.1",
"prestashop/productcomments": "<5.0.2",
"prestashop/ps_checkout": "<5.3",
"prestashop/ps_contactinfo": "<=3.3.2",
@@ -12517,7 +12550,7 @@
"propel/propel": ">=2.0.0.0-alpha1,<=2.0.0.0-alpha7",
"propel/propel1": ">=1,<=1.7.1",
"psy/psysh": "<=0.11.22|>=0.12,<=0.12.18",
- "pterodactyl/panel": "<1.12.1",
+ "pterodactyl/panel": "<1.12.3",
"ptheofan/yii2-statemachine": ">=2.0.0.0-RC1-dev,<=2",
"ptrofimov/beanstalk_console": "<1.7.14",
"pubnub/pubnub": "<6.1",
@@ -12560,13 +12593,15 @@
"scheb/two-factor-bundle": "<3.26|>=4,<4.11",
"sensiolabs/connect": "<4.2.3",
"serluck/phpwhois": "<=4.2.6",
- "setasign/fpdi": "<2.6.4",
+ "setasign/fpdi": "<2.6.7",
"sfroemken/url_redirect": "<=1.2.1",
"sheng/yiicms": "<1.2.1",
- "shopware/core": "<6.6.10.15-dev|>=6.7,<6.7.8.1-dev",
- "shopware/platform": "<6.6.10.15-dev|>=6.7,<6.7.8.1-dev",
+ "shopper/cart": "<2.8",
+ "shopper/framework": "<2.8",
+ "shopware/core": "<6.6.10.18-dev|>=6.7,<6.7.10.1-dev",
+ "shopware/platform": "<6.6.10.18-dev|>=6.7,<6.7.10.1-dev",
"shopware/production": "<=6.3.5.2",
- "shopware/shopware": "<=5.7.17|>=6.4.6,<6.6.10.10-dev|>=6.7,<6.7.6.1-dev",
+ "shopware/shopware": "<=6.3.5.2|>=6.4.6,<6.6.10.10-dev|>=6.7,<6.7.6.1-dev",
"shopware/storefront": "<6.6.10.10-dev|>=6.7,<6.7.5.1-dev",
"shopxo/shopxo": "<=6.4",
"showdoc/showdoc": "<3.8.1",
@@ -12594,6 +12629,7 @@
"simplesamlphp/saml2": "<=4.16.15|>=5.0.0.0-alpha1,<=5.0.0.0-alpha19",
"simplesamlphp/saml2-legacy": "<=4.16.15",
"simplesamlphp/simplesamlphp": "<1.18.6",
+ "simplesamlphp/simplesamlphp-module-casserver": "<=7.0.2",
"simplesamlphp/simplesamlphp-module-infocard": "<1.0.1",
"simplesamlphp/simplesamlphp-module-openid": "<1",
"simplesamlphp/simplesamlphp-module-openidprovider": "<0.9",
@@ -12608,13 +12644,14 @@
"slim/slim": "<2.6",
"slub/slub-events": "<3.0.3",
"smarty/smarty": "<4.5.3|>=5,<5.1.1",
- "snipe/snipe-it": "<8.3.7",
+ "snipe/snipe-it": "<8.4.1",
"socalnick/scn-social-auth": "<1.15.2",
"socialiteproviders/steam": "<1.1",
"solspace/craft-freeform": "<4.1.29|>=5,<=5.14.6",
"soosyze/soosyze": "<=2",
"spatie/browsershot": "<5.0.5",
"spatie/image-optimizer": "<1.7.3",
+ "spatie/schema-org": ">=3.23.1,<3.23.2|>=4,<4.0.2",
"spencer14420/sp-php-email-handler": "<1",
"spipu/html2pdf": "<5.2.8",
"spiral/roadrunner": "<2025.1",
@@ -12626,14 +12663,14 @@
"starcitizentools/short-description": ">=4,<4.0.1",
"starcitizentools/tabber-neue": ">=1.9.1,<2.7.2|>=3,<3.1.1",
"starcitizenwiki/embedvideo": "<=4",
- "statamic/cms": "<5.73.21|>=6,<6.15",
+ "statamic/cms": "<5.73.22|>=6,<6.18.1",
"stormpath/sdk": "<9.9.99",
- "studio-42/elfinder": "<2.1.67",
+ "studio-42/elfinder": "<=2.1.67",
"studiomitte/friendlycaptcha": "<0.1.4",
"subhh/libconnect": "<7.0.8|>=8,<8.1",
"sukohi/surpass": "<1",
"sulu/form-bundle": ">=2,<2.5.3",
- "sulu/sulu": "<2.6.22|>=3,<3.0.5",
+ "sulu/sulu": "<=2.6.22|>=3,<=3.0.5",
"sumocoders/framework-user-bundle": "<1.4",
"superbig/craft-audit": "<3.0.2",
"svewap/a21glossary": "<=0.4.10",
@@ -12651,42 +12688,53 @@
"symbiote/silverstripe-seed": "<6.0.3",
"symbiote/silverstripe-versionedfiles": "<=2.0.3",
"symfont/process": ">=0",
- "symfony/cache": ">=3.1,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8",
+ "symfony/cache": "<5.4.52|>=6,<6.4.40|>=7,<7.4.12|>=8,<8.0.12",
"symfony/dependency-injection": ">=2,<2.0.17|>=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7",
+ "symfony/dom-crawler": "<5.4.52|>=6,<6.4.40|>=7,<7.4.12|>=8,<8.0.12",
"symfony/error-handler": ">=4.4,<4.4.4|>=5,<5.0.4",
"symfony/form": ">=2.3,<2.3.35|>=2.4,<2.6.12|>=2.7,<2.7.50|>=2.8,<2.8.49|>=3,<3.4.20|>=4,<4.0.15|>=4.1,<4.1.9|>=4.2,<4.2.1",
"symfony/framework-bundle": ">=2,<2.3.18|>=2.4,<2.4.8|>=2.5,<2.5.2|>=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7|>=5.3.14,<5.3.15|>=5.4.3,<5.4.4|>=6.0.3,<6.0.4",
- "symfony/http-client": ">=4.3,<5.4.47|>=6,<6.4.15|>=7,<7.1.8",
- "symfony/http-foundation": "<5.4.50|>=6,<6.4.29|>=7,<7.3.7",
- "symfony/http-kernel": ">=2,<4.4.50|>=5,<5.4.20|>=6,<6.0.20|>=6.1,<6.1.12|>=6.2,<6.2.6",
+ "symfony/html-sanitizer": ">=6.1,<6.4.41|>=7,<7.4.13|>=8,<8.0.13",
+ "symfony/http-client": ">=4.3,<5.4.53|>=6,<6.4.15|>=7,<7.1.8",
+ "symfony/http-foundation": "<5.4.50|>=6,<6.4.41|>=7,<7.4.13|>=8,<8.0.13",
+ "symfony/http-kernel": ">=2,<4.4.50|>=5,<5.4.20|>=6,<6.0.20|>=6.1,<6.1.12|>=6.2,<6.2.6|>=7.4,<7.4.12|>=8,<8.0.12",
"symfony/intl": ">=2.7,<2.7.38|>=2.8,<2.8.31|>=3,<3.2.14|>=3.3,<3.3.13",
+ "symfony/json-path": ">=7.3,<7.4.12|>=8,<8.0.12",
+ "symfony/lox24-notifier": ">=7.1,<7.4.12|>=8,<8.0.12",
+ "symfony/mailer": "<5.4.52|>=6,<6.4.40|>=7,<7.4.12|>=8,<8.0.12",
+ "symfony/mailjet-mailer": ">=6.4,<6.4.40|>=7,<7.4.12|>=8,<8.0.12",
+ "symfony/mailomat-mailer": ">=7.2,<7.4.13|>=8,<8.0.13",
+ "symfony/mailtrap-mailer": ">=7.2,<7.4.12|>=8,<8.0.12",
"symfony/maker-bundle": ">=1.27,<1.29.2|>=1.30,<1.31.1",
- "symfony/mime": ">=4.3,<4.3.8",
+ "symfony/mime": "<5.4.52|>=6,<6.4.40|>=7,<7.4.12|>=8,<8.0.12",
+ "symfony/monolog-bridge": "<5.4.52|>=6,<6.4.40|>=7,<7.4.12|>=8,<8.0.12",
"symfony/phpunit-bridge": ">=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7",
- "symfony/polyfill": ">=1,<1.10",
+ "symfony/polyfill": ">=1,<1.10|>=1.17.1,<1.38.1",
+ "symfony/polyfill-intl-idn": ">=1.17.1,<1.38.1",
"symfony/polyfill-php55": ">=1,<1.10",
"symfony/process": "<5.4.51|>=6,<6.4.33|>=7,<7.1.7|>=7.3,<7.3.11|>=7.4,<7.4.5|>=8,<8.0.5",
"symfony/proxy-manager-bridge": ">=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7",
- "symfony/routing": ">=2,<2.0.19",
- "symfony/runtime": ">=5.3,<5.4.46|>=6,<6.4.14|>=7,<7.1.7",
+ "symfony/routing": "<5.4.53|>=6,<6.4.41|>=7,<7.4.13|>=8,<8.0.13",
+ "symfony/runtime": ">=5.3,<5.4.52|>=6,<6.4.40|>=7,<7.4.12|>=8,<8.0.12",
"symfony/security": ">=2,<2.7.51|>=2.8,<3.4.49|>=4,<4.4.24|>=5,<5.2.8",
"symfony/security-bundle": ">=2,<4.4.50|>=5,<5.4.20|>=6,<6.0.20|>=6.1,<6.1.12|>=6.2,<6.4.10|>=7,<7.0.10|>=7.1,<7.1.3",
"symfony/security-core": ">=2.4,<2.6.13|>=2.7,<2.7.9|>=2.7.30,<2.7.32|>=2.8,<3.4.49|>=4,<4.4.24|>=5,<5.2.9",
"symfony/security-csrf": ">=2.4,<2.7.48|>=2.8,<2.8.41|>=3,<3.3.17|>=3.4,<3.4.11|>=4,<4.0.11",
"symfony/security-guard": ">=2.8,<3.4.48|>=4,<4.4.23|>=5,<5.2.8",
- "symfony/security-http": ">=2.3,<2.3.41|>=2.4,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.2.12|>=4.3,<4.3.8|>=4.4,<4.4.7|>=5,<5.0.7|>=5.1,<5.2.8|>=5.3,<5.4.47|>=6,<6.4.15|>=7,<7.1.8",
+ "symfony/security-http": "<5.4.53|>=6,<6.4.41|>=7,<7.4.13|>=8,<8.0.13",
"symfony/serializer": ">=2,<2.0.11|>=4.1,<4.4.35|>=5,<5.3.12",
- "symfony/symfony": "<5.4.51|>=6,<6.4.33|>=7,<7.3.11|>=7.4,<7.4.5|>=8,<8.0.5",
+ "symfony/symfony": "<5.4.53|>=6,<6.4.41|>=7,<7.4.13|>=8,<8.0.13",
"symfony/translation": ">=2,<2.0.17",
- "symfony/twig-bridge": ">=2,<4.4.51|>=5,<5.4.31|>=6,<6.3.8",
- "symfony/ux-autocomplete": "<2.11.2",
- "symfony/ux-live-component": "<2.25.1",
+ "symfony/twig-bridge": ">=2,<4.4.51|>=5,<5.4.31|>=6,<6.3.8|>=6.4.24,<6.4.40",
+ "symfony/twilio-notifier": ">=6.4,<6.4.40|>=7,<7.4.12|>=8,<8.0.12",
+ "symfony/ux-autocomplete": "<2.36|>=3,<3.1",
+ "symfony/ux-live-component": "<2.36|>=3,<3.1",
"symfony/ux-twig-component": "<2.25.1",
"symfony/validator": "<5.4.43|>=6,<6.4.11|>=7,<7.1.4",
"symfony/var-exporter": ">=4.2,<4.2.12|>=4.3,<4.3.8",
- "symfony/web-profiler-bundle": ">=2,<2.3.19|>=2.4,<2.4.9|>=2.5,<2.5.4",
+ "symfony/web-profiler-bundle": ">=2,<2.3.19|>=2.4,<2.4.9|>=2.5,<2.5.4|>=7.2.9,<7.4.12|>=8,<8.0.12",
"symfony/webhook": ">=6.3,<6.3.8",
- "symfony/yaml": ">=2,<2.0.22|>=2.1,<2.1.7|>=2.2.0.0-beta1,<2.2.0.0-beta2",
+ "symfony/yaml": "<5.4.52|>=6,<6.4.40|>=7,<7.4.12|>=8,<8.0.12",
"symphonycms/symphony-2": "<2.6.4",
"t3/dce": "<0.11.5|>=2.2,<2.6.2",
"t3g/svg-sanitizer": "<1.0.3",
@@ -12700,42 +12748,47 @@
"thelia/thelia": ">=2.1,<2.1.3",
"theonedemon/phpwhois": "<=4.2.5",
"thinkcmf/thinkcmf": "<6.0.8",
- "thorsten/phpmyfaq": "<=4.1.1",
+ "thorsten/phpmyfaq": "<4.1.3",
"tikiwiki/tiki-manager": "<=17.1",
"timber/timber": ">=0.16.6,<1.23.1|>=1.24,<1.24.1|>=2,<2.1",
- "tinymce/tinymce": "<7.2",
+ "tinymce/tinymce": "<7.9.3|>=8,<8.5.1",
"tinymighty/wiki-seo": "<1.2.2",
"titon/framework": "<9.9.99",
"tltneon/lgsl": "<7",
"tobiasbg/tablepress": "<=2.0.0.0-RC1",
+ "tomasnorre/crawler": "<11.0.13|>=12,<12.0.11",
"topthink/framework": "<6.0.17|>=6.1,<=8.0.4",
"topthink/think": "<=6.1.1",
"topthink/thinkphp": "<=3.2.3|>=6.1.3,<=8.0.4",
"torrentpier/torrentpier": "<=2.8.8",
- "tpwd/ke_search": "<4.0.3|>=4.1,<4.6.6|>=5,<5.0.2",
+ "tpwd/ke_search": "<5.6.2|>=6,<6.6.1|>=7,<7.0.1",
"tribalsystems/zenario": "<=9.7.61188",
"truckersmp/phpwhois": "<=4.3.1",
"ttskch/pagination-service-provider": "<1",
"twbs/bootstrap": "<3.4.1|>=4,<4.3.1",
- "twig/twig": "<3.11.2|>=3.12,<3.14.1|>=3.16,<3.19",
+ "twig/cssinliner-extra": "<3.26",
+ "twig/intl-extra": "<3.26",
+ "twig/markdown-extra": "<3.26",
+ "twig/twig": "<3.27",
"typicms/core": "<16.1.7",
"typo3/cms": "<9.5.29|>=10,<10.4.35|>=11,<11.5.23|>=12,<12.2",
- "typo3/cms-backend": "<4.1.14|>=4.2,<4.2.15|>=4.3,<4.3.7|>=4.4,<4.4.4|>=7,<=7.6.50|>=8,<=8.7.39|>=9,<9.5.55|>=10,<=10.4.54|>=11,<=11.5.48|>=12,<=12.4.40|>=13,<=13.4.22|>=14,<=14.0.1|==14.2",
+ "typo3/cms-backend": "<10.4.57|>=11,<11.5.51|>=12,<12.4.46|>=13,<13.4.31|>=14,<14.3.3",
"typo3/cms-belog": ">=10,<=10.4.47|>=11,<=11.5.41|>=12,<=12.4.24|>=13,<=13.4.2",
"typo3/cms-beuser": ">=9,<9.5.55|>=10,<10.4.54|>=11,<11.5.48|>=12,<12.4.37|>=13,<13.4.18",
- "typo3/cms-core": "<=8.7.56|>=9,<9.5.55|>=10,<=10.4.54|>=11,<=11.5.48|>=12,<=12.4.40|>=13,<=13.4.22|>=14,<=14.0.1",
+ "typo3/cms-core": "<10.4.57|>=11,<11.5.51|>=12,<12.4.46|>=13,<13.4.31|>=14,<14.3.3",
"typo3/cms-dashboard": ">=10,<10.4.54|>=11,<11.5.48|>=12,<12.4.37|>=13,<13.4.18",
"typo3/cms-extbase": "<6.2.24|>=7,<7.6.8|==8.1.1",
"typo3/cms-extensionmanager": ">=10,<=10.4.47|>=11,<=11.5.41|>=12,<=12.4.24|>=13,<=13.4.2",
"typo3/cms-felogin": ">=4.2,<4.2.3",
+ "typo3/cms-filelist": ">=11,<11.5.51|>=12,<12.4.46|>=13,<13.4.31|>=14,<14.3.3",
"typo3/cms-fluid": "<4.3.4|>=4.4,<4.4.1",
- "typo3/cms-form": ">=8,<=8.7.39|>=9,<=9.5.24|>=10,<=10.4.47|>=11,<=11.5.41|>=12,<=12.4.24|>=13,<=13.4.2",
+ "typo3/cms-form": "<10.4.57|>=11,<11.5.51|>=12,<12.4.46|>=13,<13.4.31|>=14,<14.3.3",
"typo3/cms-frontend": "<4.3.9|>=4.4,<4.4.5",
- "typo3/cms-indexed-search": ">=10,<=10.4.47|>=11,<=11.5.41|>=12,<=12.4.24|>=13,<=13.4.2",
+ "typo3/cms-indexed-search": ">=10,<=10.4.47|>=11,<=11.5.41|>=12,<=12.4.24|>=13,<13.4.31|>=14,<14.3.3",
"typo3/cms-install": "<4.1.14|>=4.2,<4.2.16|>=4.3,<4.3.9|>=4.4,<4.4.5|>=12.2,<12.4.8|==13.4.2",
"typo3/cms-lowlevel": ">=11,<=11.5.41",
"typo3/cms-recordlist": ">=11,<11.5.48",
- "typo3/cms-recycler": ">=9,<9.5.55|>=10,<=10.4.54|>=11,<=11.5.48|>=12,<=12.4.40|>=13,<=13.4.22|>=14,<=14.0.1",
+ "typo3/cms-recycler": "<10.4.57|>=11,<11.5.51|>=12,<12.4.46|>=13,<13.4.31|>=14,<14.3.3",
"typo3/cms-redirects": ">=10,<=10.4.54|>=11,<=11.5.48|>=12,<=12.4.40|>=13,<=13.4.22|>=14,<=14.0.1",
"typo3/cms-rte-ckeditor": ">=9.5,<9.5.42|>=10,<10.4.39|>=11,<11.5.30",
"typo3/cms-scheduler": ">=11,<=11.5.41",
@@ -12743,7 +12796,7 @@
"typo3/cms-webhooks": ">=12,<=12.4.30|>=13,<=13.4.11",
"typo3/cms-workspaces": ">=9,<9.5.55|>=10,<10.4.54|>=11,<11.5.48|>=12,<12.4.37|>=13,<13.4.18",
"typo3/flow": ">=1,<1.0.4|>=1.1,<1.1.1|>=2,<2.0.1|>=2.3,<2.3.16|>=3,<3.0.12|>=3.1,<3.1.10|>=3.2,<3.2.13|>=3.3,<3.3.13|>=4,<4.0.6",
- "typo3/html-sanitizer": ">=1,<=1.5.2|>=2,<=2.1.3",
+ "typo3/html-sanitizer": "<2.3.2",
"typo3/neos": ">=1.1,<1.1.3|>=1.2,<1.2.13|>=2,<2.0.4|>=2.3,<2.3.99|>=3,<3.0.20|>=3.1,<3.1.18|>=3.2,<3.2.14|>=3.3,<3.3.23|>=4,<4.0.17|>=4.1,<4.1.16|>=4.2,<4.2.12|>=4.3,<4.3.3",
"typo3/phar-stream-wrapper": ">=1,<2.1.1|>=3,<3.1.1",
"typo3/swiftmailer": ">=4.1,<4.1.99|>=5.4,<5.4.5",
@@ -12759,7 +12812,7 @@
"uvdesk/core-framework": "<=1.1.1",
"vanilla/safecurl": "<0.9.2",
"verbb/comments": "<1.5.5",
- "verbb/formie": "<=2.1.43",
+ "verbb/formie": "<2.2.21|>=3,<3.1.26",
"verbb/image-resizer": "<2.0.9",
"verbb/knock-knock": "<1.2.8",
"verot/class.upload.php": "<=2.1.6",
@@ -12807,12 +12860,12 @@
"xpressengine/xpressengine": "<3.0.15",
"yab/quarx": "<2.4.5",
"yansongda/pay": "<=3.7.19",
- "yeswiki/yeswiki": "<=4.6",
+ "yeswiki/yeswiki": "<4.6.4",
"yetiforce/yetiforce-crm": "<6.5",
"yidashi/yii2cmf": "<=2",
"yii2mod/yii2-cms": "<1.9.2",
"yiisoft/yii": "<1.1.31",
- "yiisoft/yii2": "<2.0.52",
+ "yiisoft/yii2": "<2.0.55",
"yiisoft/yii2-authclient": "<2.2.15",
"yiisoft/yii2-bootstrap": "<2.0.4",
"yiisoft/yii2-dev": "<=2.0.45",
@@ -12902,7 +12955,7 @@
"type": "tidelift"
}
],
- "time": "2026-05-07T21:23:59+00:00"
+ "time": "2026-06-12T20:48:39+00:00"
},
{
"name": "sebastian/cli-parser",
@@ -12975,27 +13028,27 @@
},
{
"name": "sebastian/comparator",
- "version": "8.1.2",
+ "version": "8.3.0",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/comparator.git",
- "reference": "b3d09f4360ad97dcad8f82d1c047ad16ff38b7e1"
+ "reference": "c025fc7604afab3f195fab7cdaf72327331af241"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/b3d09f4360ad97dcad8f82d1c047ad16ff38b7e1",
- "reference": "b3d09f4360ad97dcad8f82d1c047ad16ff38b7e1",
+ "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/c025fc7604afab3f195fab7cdaf72327331af241",
+ "reference": "c025fc7604afab3f195fab7cdaf72327331af241",
"shasum": ""
},
"require": {
"ext-dom": "*",
"ext-mbstring": "*",
"php": ">=8.4",
- "sebastian/diff": "^8.1",
- "sebastian/exporter": "^8.0"
+ "sebastian/diff": "^9.0",
+ "sebastian/exporter": "^8.1.0"
},
"require-dev": {
- "phpunit/phpunit": "^13.0"
+ "phpunit/phpunit": "^13.2"
},
"suggest": {
"ext-bcmath": "For comparing BcMath\\Number objects"
@@ -13003,7 +13056,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "8.1-dev"
+ "dev-main": "8.3-dev"
}
},
"autoload": {
@@ -13043,7 +13096,7 @@
"support": {
"issues": "https://github.com/sebastianbergmann/comparator/issues",
"security": "https://github.com/sebastianbergmann/comparator/security/policy",
- "source": "https://github.com/sebastianbergmann/comparator/tree/8.1.2"
+ "source": "https://github.com/sebastianbergmann/comparator/tree/8.3.0"
},
"funding": [
{
@@ -13063,7 +13116,7 @@
"type": "tidelift"
}
],
- "time": "2026-04-14T08:24:42+00:00"
+ "time": "2026-06-05T03:06:45+00:00"
},
{
"name": "sebastian/complexity",
@@ -13137,29 +13190,29 @@
},
{
"name": "sebastian/diff",
- "version": "8.1.0",
+ "version": "9.0.0",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/diff.git",
- "reference": "9c957d730257f49c873f3761674559bd90098a7d"
+ "reference": "a3fb6a298a265ff487a91bbea46e03cd01dbb226"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/9c957d730257f49c873f3761674559bd90098a7d",
- "reference": "9c957d730257f49c873f3761674559bd90098a7d",
+ "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/a3fb6a298a265ff487a91bbea46e03cd01dbb226",
+ "reference": "a3fb6a298a265ff487a91bbea46e03cd01dbb226",
"shasum": ""
},
"require": {
"php": ">=8.4"
},
"require-dev": {
- "phpunit/phpunit": "^13.0",
- "symfony/process": "^7.2"
+ "phpunit/phpunit": "^13.2",
+ "symfony/process": "^7.4.13"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "8.1-dev"
+ "dev-main": "9.0-dev"
}
},
"autoload": {
@@ -13192,7 +13245,7 @@
"support": {
"issues": "https://github.com/sebastianbergmann/diff/issues",
"security": "https://github.com/sebastianbergmann/diff/security/policy",
- "source": "https://github.com/sebastianbergmann/diff/tree/8.1.0"
+ "source": "https://github.com/sebastianbergmann/diff/tree/9.0.0"
},
"funding": [
{
@@ -13212,27 +13265,27 @@
"type": "tidelift"
}
],
- "time": "2026-04-05T12:02:33+00:00"
+ "time": "2026-06-05T03:04:51+00:00"
},
{
"name": "sebastian/environment",
- "version": "9.3.0",
+ "version": "9.3.2",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/environment.git",
- "reference": "6767059a30e4277ac95ee034809e793528464768"
+ "reference": "6c9e487c9eb706a8d258102a1c0b0a3e53e86c2e"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/6767059a30e4277ac95ee034809e793528464768",
- "reference": "6767059a30e4277ac95ee034809e793528464768",
+ "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/6c9e487c9eb706a8d258102a1c0b0a3e53e86c2e",
+ "reference": "6c9e487c9eb706a8d258102a1c0b0a3e53e86c2e",
"shasum": ""
},
"require": {
"php": ">=8.4"
},
"require-dev": {
- "phpunit/phpunit": "^13.0"
+ "phpunit/phpunit": "^13.1.11"
},
"suggest": {
"ext-posix": "*"
@@ -13268,7 +13321,7 @@
"support": {
"issues": "https://github.com/sebastianbergmann/environment/issues",
"security": "https://github.com/sebastianbergmann/environment/security/policy",
- "source": "https://github.com/sebastianbergmann/environment/tree/9.3.0"
+ "source": "https://github.com/sebastianbergmann/environment/tree/9.3.2"
},
"funding": [
{
@@ -13288,20 +13341,20 @@
"type": "tidelift"
}
],
- "time": "2026-04-15T12:14:03+00:00"
+ "time": "2026-05-25T13:41:38+00:00"
},
{
"name": "sebastian/exporter",
- "version": "8.0.2",
+ "version": "8.1.0",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/exporter.git",
- "reference": "9cee180ebe62259e3ed48df2212d1fc8cfd971bb"
+ "reference": "c0d29a945f8cf82f300a05e69874508e307ca4c6"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/9cee180ebe62259e3ed48df2212d1fc8cfd971bb",
- "reference": "9cee180ebe62259e3ed48df2212d1fc8cfd971bb",
+ "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/c0d29a945f8cf82f300a05e69874508e307ca4c6",
+ "reference": "c0d29a945f8cf82f300a05e69874508e307ca4c6",
"shasum": ""
},
"require": {
@@ -13310,12 +13363,12 @@
"sebastian/recursion-context": "^8.0"
},
"require-dev": {
- "phpunit/phpunit": "^13.0"
+ "phpunit/phpunit": "^13.1.10"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "8.0-dev"
+ "dev-main": "8.1-dev"
}
},
"autoload": {
@@ -13358,7 +13411,7 @@
"support": {
"issues": "https://github.com/sebastianbergmann/exporter/issues",
"security": "https://github.com/sebastianbergmann/exporter/security/policy",
- "source": "https://github.com/sebastianbergmann/exporter/tree/8.0.2"
+ "source": "https://github.com/sebastianbergmann/exporter/tree/8.1.0"
},
"funding": [
{
@@ -13378,7 +13431,76 @@
"type": "tidelift"
}
],
- "time": "2026-04-15T12:38:05+00:00"
+ "time": "2026-05-21T11:50:56+00:00"
+ },
+ {
+ "name": "sebastian/file-filter",
+ "version": "1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/file-filter.git",
+ "reference": "33a26f394330f6faa7684bb9cc73afb7727aae93"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/file-filter/zipball/33a26f394330f6faa7684bb9cc73afb7727aae93",
+ "reference": "33a26f394330f6faa7684bb9cc73afb7727aae93",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.4"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^13.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library for filtering files",
+ "homepage": "https://github.com/sebastianbergmann/file-filter",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/file-filter/issues",
+ "security": "https://github.com/sebastianbergmann/file-filter/security/policy",
+ "source": "https://github.com/sebastianbergmann/file-filter/tree/1.0.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ },
+ {
+ "url": "https://liberapay.com/sebastianbergmann",
+ "type": "liberapay"
+ },
+ {
+ "url": "https://thanks.dev/u/gh/sebastianbergmann",
+ "type": "thanks_dev"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/sebastian/file-filter",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2026-04-22T07:20:04+00:00"
},
{
"name": "sebastian/git-state",
@@ -13451,16 +13573,16 @@
},
{
"name": "sebastian/global-state",
- "version": "9.0.0",
+ "version": "9.0.1",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/global-state.git",
- "reference": "e52e3dc22441e6218c710afe72c3042f8fc41ea7"
+ "reference": "ba68ba79da690cf7eddefd3ce5b78b20b9ba9945"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/e52e3dc22441e6218c710afe72c3042f8fc41ea7",
- "reference": "e52e3dc22441e6218c710afe72c3042f8fc41ea7",
+ "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/ba68ba79da690cf7eddefd3ce5b78b20b9ba9945",
+ "reference": "ba68ba79da690cf7eddefd3ce5b78b20b9ba9945",
"shasum": ""
},
"require": {
@@ -13470,7 +13592,7 @@
},
"require-dev": {
"ext-dom": "*",
- "phpunit/phpunit": "^13.0"
+ "phpunit/phpunit": "^13.1.13"
},
"type": "library",
"extra": {
@@ -13501,7 +13623,7 @@
"support": {
"issues": "https://github.com/sebastianbergmann/global-state/issues",
"security": "https://github.com/sebastianbergmann/global-state/security/policy",
- "source": "https://github.com/sebastianbergmann/global-state/tree/9.0.0"
+ "source": "https://github.com/sebastianbergmann/global-state/tree/9.0.1"
},
"funding": [
{
@@ -13521,28 +13643,28 @@
"type": "tidelift"
}
],
- "time": "2026-02-06T04:45:13+00:00"
+ "time": "2026-06-01T15:11:33+00:00"
},
{
"name": "sebastian/lines-of-code",
- "version": "5.0.0",
+ "version": "5.0.1",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/lines-of-code.git",
- "reference": "4f21bb7768e1c997722ccc7efb1d6b5c11bfd471"
+ "reference": "d2cff273a90c79b0eb590baa682d4b5c318bdbb7"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/4f21bb7768e1c997722ccc7efb1d6b5c11bfd471",
- "reference": "4f21bb7768e1c997722ccc7efb1d6b5c11bfd471",
+ "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/d2cff273a90c79b0eb590baa682d4b5c318bdbb7",
+ "reference": "d2cff273a90c79b0eb590baa682d4b5c318bdbb7",
"shasum": ""
},
"require": {
- "nikic/php-parser": "^5.0",
+ "nikic/php-parser": "^5.7.0",
"php": ">=8.4"
},
"require-dev": {
- "phpunit/phpunit": "^13.0"
+ "phpunit/phpunit": "^13.1.10"
},
"type": "library",
"extra": {
@@ -13571,7 +13693,7 @@
"support": {
"issues": "https://github.com/sebastianbergmann/lines-of-code/issues",
"security": "https://github.com/sebastianbergmann/lines-of-code/security/policy",
- "source": "https://github.com/sebastianbergmann/lines-of-code/tree/5.0.0"
+ "source": "https://github.com/sebastianbergmann/lines-of-code/tree/5.0.1"
},
"funding": [
{
@@ -13591,7 +13713,7 @@
"type": "tidelift"
}
],
- "time": "2026-02-06T04:45:54+00:00"
+ "time": "2026-05-19T16:23:37+00:00"
},
{
"name": "sebastian/object-enumerator",
@@ -13809,23 +13931,23 @@
},
{
"name": "sebastian/type",
- "version": "7.0.0",
+ "version": "7.0.1",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/type.git",
- "reference": "42412224607bd3931241bbd17f38e0f972f5a916"
+ "reference": "fee0309275847fefd7636167085e379c1dbf6990"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/42412224607bd3931241bbd17f38e0f972f5a916",
- "reference": "42412224607bd3931241bbd17f38e0f972f5a916",
+ "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/fee0309275847fefd7636167085e379c1dbf6990",
+ "reference": "fee0309275847fefd7636167085e379c1dbf6990",
"shasum": ""
},
"require": {
"php": ">=8.4"
},
"require-dev": {
- "phpunit/phpunit": "^13.0"
+ "phpunit/phpunit": "^13.1.10"
},
"type": "library",
"extra": {
@@ -13854,7 +13976,7 @@
"support": {
"issues": "https://github.com/sebastianbergmann/type/issues",
"security": "https://github.com/sebastianbergmann/type/security/policy",
- "source": "https://github.com/sebastianbergmann/type/tree/7.0.0"
+ "source": "https://github.com/sebastianbergmann/type/tree/7.0.1"
},
"funding": [
{
@@ -13874,7 +13996,7 @@
"type": "tidelift"
}
],
- "time": "2026-02-06T04:52:09+00:00"
+ "time": "2026-05-20T06:49:11+00:00"
},
{
"name": "sebastian/version",
@@ -14082,16 +14204,16 @@
},
{
"name": "spatie/flare-client-php",
- "version": "1.11.0",
+ "version": "1.11.1",
"source": {
"type": "git",
"url": "https://github.com/spatie/flare-client-php.git",
- "reference": "fb3ffb946675dba811fbde9122224db2f84daca9"
+ "reference": "53f41b08a27cc039e1a8ed2be9a202e924f31bad"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/spatie/flare-client-php/zipball/fb3ffb946675dba811fbde9122224db2f84daca9",
- "reference": "fb3ffb946675dba811fbde9122224db2f84daca9",
+ "url": "https://api.github.com/repos/spatie/flare-client-php/zipball/53f41b08a27cc039e1a8ed2be9a202e924f31bad",
+ "reference": "53f41b08a27cc039e1a8ed2be9a202e924f31bad",
"shasum": ""
},
"require": {
@@ -14139,7 +14261,7 @@
],
"support": {
"issues": "https://github.com/spatie/flare-client-php/issues",
- "source": "https://github.com/spatie/flare-client-php/tree/1.11.0"
+ "source": "https://github.com/spatie/flare-client-php/tree/1.11.1"
},
"funding": [
{
@@ -14147,7 +14269,7 @@
"type": "github"
}
],
- "time": "2026-03-17T08:06:16+00:00"
+ "time": "2026-05-15T09:31:32+00:00"
},
{
"name": "spatie/ignition",
diff --git a/lang/de.json b/lang/de.json
index f8e846c60..abb17aeef 100644
--- a/lang/de.json
+++ b/lang/de.json
@@ -780,12 +780,13 @@
"stats.extremes": "Längste & kürzeste Fahrten",
"stats.favorite-lines": "Beliebteste Linien",
"stats.favorite-routes": "Beliebteste Verbindungen",
- "stats.favorite-stations": "Beliebteste Bahnhöfe",
+ "stats.favorite-stations": "Meistbesuchte Stationen",
+ "stats.breakdown": "Verlauf",
"stats.last-month": "Letzter Monat",
"stats.last-week": "Letzte Woche",
"stats.last-year": "Letztes Jahr",
"stats.longest-ride": "Längste Fahrt",
- "stats.mean-distance": "Durchschnittsdistanz",
+ "stats.mean-distance": "Ø pro Fahrt",
"stats.month": "Monat",
"stats.monthly-breakdown": "Monatsübersicht",
"stats.shortest-ride": "Kürzeste Fahrt",
@@ -1328,6 +1329,7 @@
"user.muted.noMutedUsers": "Du hast keine Nutzer stummgeschaltet.",
"stats.from": "Von",
"stats.to": "Bis",
+ "stats.today": "heute",
"beta.banner.text": "Du siehst gerade ein neues Design, das sich noch in der Entwicklung befindet. Es kann hier und da zu Fehlern kommen. Du kannst die experimentellen Features in deinen",
"beta.banner.settings": "Einstellungen deaktivieren.",
"validation.attributes.body": "Körper",
diff --git a/lang/en.json b/lang/en.json
index 6d64e1951..eb161e836 100644
--- a/lang/en.json
+++ b/lang/en.json
@@ -780,12 +780,13 @@
"stats.extremes": "Extremes",
"stats.favorite-lines": "Favourite Lines",
"stats.favorite-routes": "Favourite Routes",
- "stats.favorite-stations": "Favourite Stations",
+ "stats.favorite-stations": "Most Visited Stations",
+ "stats.breakdown": "Breakdown",
"stats.last-month": "Last Month",
"stats.last-week": "Last Week",
"stats.last-year": "Last Year",
"stats.longest-ride": "Longest Ride",
- "stats.mean-distance": "Mean Distance",
+ "stats.mean-distance": "Avg. per Ride",
"stats.month": "Month",
"stats.monthly-breakdown": "Monthly Breakdown",
"stats.shortest-ride": "Shortest Ride",
@@ -1332,6 +1333,7 @@
"user.muted.noMutedUsers": "You have not muted any users.",
"stats.from": "From",
"stats.to": "To",
+ "stats.today": "today",
"beta.banner.text": "You are viewing a new design that is still under development. You may encounter occasional errors. You can disable experimental features in your",
"beta.banner.settings": "settings."
}
diff --git a/lang/fr.json b/lang/fr.json
index 403d4e145..4b1dc2708 100644
--- a/lang/fr.json
+++ b/lang/fr.json
@@ -29,23 +29,26 @@
"auth.password": "Le mot de passe fourni est incorrect.",
"auth.required": "Tu dois être connecté·e pour utiliser cette fonctionnalité.",
"auth.throttle": "Trop de tentatives de connexion. Réessaye dans :seconds secondes.",
+ "beta.banner.settings": "parametres.",
+ "beta.banner.text": "Tu consultes un nouveau design encore en cours de developpement. Des erreurs peuvent survenir. Tu peux desactiver les fonctionnalites experimentales dans tes",
"cancel": "Annuler",
"carriage": "Voiture",
"carriage-sequence": "Placement des voitures",
"changelog": "Historique des modifications",
- "checkin.select-departure": "Choisir l'arrêt de départ",
+ "changelog.view_on_github": "Afficher les modifications sur GitHub",
"checkin.conflict": "Un enregistrement parallèle existe déjà.",
"checkin.conflict.question": "Tu veux encore t'enregistrer ? Tu ne vas recevoir aucun point pour ça mais tes statistiques personnelles vont tout de même se mettre à jour.",
- "checkin.points.could-have": "Tu aurais pu obtenir plus de points si tu t'étais enregistré·e plus proche de l'heure réelle du départ !",
- "checkin.points.earned": "Tu as gagné :points point|Tu as gagné :points points !",
- "checkin.points.forced": "Tu n'as reçu aucun point pour cet enregistrement car tu as forcé ce dernier.",
- "checkin.points.full": "Tu aurais pu gagner :points points.",
"checkin.duplicates.alert.content": "Tu as des enregistrements en double erronés. Merci de supprimer les doublons avant le 31.05.2026. La page liée affiche tous les trajets concernés. Si tu as encore des enregistrements en double après le 31.05.2026, nous supprimerons automatiquement les doublons.",
"checkin.duplicates.alert.title": "Attention ! Tu as des enregistrements erronés / en double",
"checkin.duplicates.description": "Tu as des enregistrements en double erronés. Merci de supprimer les doublons avant le 31.05.2026. Si tu as encore des enregistrements en double après le 31.05.2026, nous supprimerons automatiquement les doublons.",
"checkin.duplicates.group": "Groupe de :count enregistrements en double",
"checkin.duplicates.none": "Tu n'as pas d'enregistrements en double.",
"checkin.duplicates.title": "Enregistrements en double",
+ "checkin.points.could-have": "Tu aurais pu obtenir plus de points si tu t'étais enregistré·e plus proche de l'heure réelle du départ !",
+ "checkin.points.earned": "Tu as gagné :points point|Tu as gagné :points points !",
+ "checkin.points.forced": "Tu n'as reçu aucun point pour cet enregistrement car tu as forcé ce dernier.",
+ "checkin.points.full": "Tu aurais pu gagner :points points.",
+ "checkin.select-departure": "Choisir l'arrêt de départ",
"checkin.success.body": "Tu t'es enregistré·e avec succès !",
"checkin.success.body2": "Tu vas faire :distance km sur la ligne :lineName de :origin à :destination.",
"checkin.success.title": "Enregistrement réussi !",
@@ -161,6 +164,7 @@
"dates.September": "septembre",
"dates.Sunday": "Dimanche",
"dates.Thursday": "Jeudi",
+ "dates.Today": "Aujourd'hui",
"dates.Tuesday": "Mardi",
"dates.Wednesday": "Mercredi",
"dates.decimal_point": ",",
@@ -176,11 +180,11 @@
"edit-app": "Modifier une application",
"email.change": "Mets à jour ton adresse e-mail en entrant ton adresse et ton mot de passe actuel. Un courriel de confirmation te sera ensuite envoyé pour que tu puisses confirmer ce changement.",
"email.validation": "Confirmer l’adresse e-mail",
+ "email.verification.already-verified": "Cette adresse e-mail a déjà été vérifiée.",
"email.verification.btn": "Clique sur le bouton pour recevoir un lien de confirmation.",
"email.verification.required": "Pour pouvoir profiter pleinement de Träwelling, tu dois encore confirmer ton adresse e-mail.",
- "email.verification.already-verified": "Cette adresse e-mail a déjà été vérifiée.",
- "email.verification.success": "Adresse e-mail vérifiée avec succès.",
"email.verification.sent": "Pour confirmer le changement de ton adresse e-mail, tu dois cliquer sur le lien dans le courriel que nous t’avons envoyé.",
+ "email.verification.success": "Adresse e-mail vérifiée avec succès.",
"email.verification.too-many-requests": "Patiente quelques minutes avant de demander un autre mail de confirmation.",
"empty-en-route": "Actuellement, il n'y a pas de Träwelleur·se en route.",
"empty-input-disable-function": "Laisse ce champ vide pour désactiver la fonction.",
@@ -206,6 +210,7 @@
"events.disclaimer.organizer": "Träwelling n'est pas l'organisateur.",
"events.disclaimer.source": "Cet évènement a été suggéré par un·e utilisateur·rice de Träwelling et approuvé par nous.",
"events.disclaimer.warranty": "Träwelling ne garantit pas l'exactitude ou l'exhaustivité des données.",
+ "events.duration": "Durée de l'événement",
"events.end": "Fin",
"events.hashtag": "Mot-dièse",
"events.header": "Évènement : :name",
@@ -303,10 +308,16 @@
"export.title.status_tags": "Tags des statuts",
"export.title.travel_type": "Type de trajet",
"export.type": "Type",
+ "footer.developed": "Développé avec ❤ au sein de l'Union européenne.",
+ "footer.elsewhere": "Autre part",
+ "footer.legal": "Légal",
+ "footer.services": "Services",
+ "footer.source": "Code source sous licence AGPLv3.",
"generate-token": "Générer un jeton d'accès",
"generic.add": "Ajouter",
"generic.change": "Changer",
"generic.error": "Erreur",
+ "generic.search": "Recherche",
"generic.why": "Pourquoi ?",
"go-to-settings": "Vers les paramètres",
"help": "Aide",
@@ -334,9 +345,24 @@
"mail.account_deletion_notification_two_weeks_before.body2": "Pour des raisons d'économie de données, les comptes non-utilisés pendant plus de 12 mois seront automatiquement supprimés.",
"mail.account_deletion_notification_two_weeks_before.body3": "Si tu souhaites conserver ton compte, merci de te connecter d'ici les 14 prochains jours.",
"mail.account_deletion_notification_two_weeks_before.subject": "Ton compte Träwelling sera supprimé dans deux semaines",
+ "mail.action.trouble": "Si vous rencontrez des difficultés pour cliquer sur le bouton “:actionText”, copiez et collez l'URL ci-dessous :\ndans votre navigateur Web :",
"mail.bye": "Bien à toi,",
+ "mail.email_changed.body1": "Nous avons modifié votre adresse e-mail en **:new_email**.",
+ "mail.email_changed.body2": "Si vous n'avez pas effectué cette modification, veuillez contacter immédiatement notre équipe d'assistance et nous fournir le numéro suivant: _:reference_",
+ "mail.email_changed.body3": "Si vous avez effectué cette modification, vous pouvez ignorer ce courriel. Aucune autre action n'est requise de votre part.",
+ "mail.email_changed.subject": "Votre adresse e-mail a été modifiée.",
"mail.hello": "Salut :username!",
+ "mail.hello2": "Bonjour!",
+ "mail.reset_password.action": "Réinitialiser le mot de passe",
+ "mail.reset_password.line1": "Vous recevez ce courriel car nous avons reçu une demande de réinitialisation de mot de passe pour votre compte.",
+ "mail.reset_password.line2": "Ce lien de réinitialisation de mot de passe expirera dans :count minutes.",
+ "mail.reset_password.line3": "Si vous n'avez pas demandé de réinitialisation de mot de passe, aucune autre action n'est requise.",
+ "mail.reset_password.subject": "Notification de réinitialisation du mot de passe",
"mail.signature": "Ton équipe Träwelling",
+ "mail.verify_email.action": "Vérifier l'adresse e-mail",
+ "mail.verify_email.line1": "Veuillez cliquer sur le bouton ci-dessous pour vérifier votre adresse e-mail.",
+ "mail.verify_email.subject": "Veuillez vérifier votre adresse e-mail",
+ "mail.whoops": "Oups !",
"maintenance.auto-refresh": "Cette page s'actualisera automatiquement une fois la maintenance terminée.",
"maintenance.follow": "Suis-nous sur Mastodon",
"maintenance.follow.desc": "Mises à jour et annonces",
@@ -349,6 +375,8 @@
"maintenance.subtitle": "Ne t'inquiète pas, nous travaillons actuellement à l'amélioration du site.",
"maintenance.title": "Nous effectuons actuellement des mises à jour.",
"maintenance.try-later": "Merci de réessayer ultérieurement.",
+ "map-providers.cargo": "Carto",
+ "map-providers.open-railway-map": "Open Railway Map",
"map.consent.load": "Charger la carte",
"map.consent.notice": "Cette carte charge des tuiles depuis des serveurs externes (Carto / OpenStreetMap). Ton adresse IP sera partagée avec ces fournisseurs.",
"map.consent.remember": "Mémoriser mon choix",
@@ -357,14 +385,15 @@
"map.vector-tiles.consent.decline": "Non merci",
"map.vector-tiles.consent.description": "Les tuiles vectorielles sont fournies par OpenFreeMap. Ton adresse IP sera partagée avec OpenFreeMap lors du chargement de la carte.",
"map.vector-tiles.consent.title": "Charger les tuiles vectorielles depuis OpenFreeMap ?",
- "map-providers.cargo": "Carto",
- "map-providers.open-railway-map": "Open Railway Map",
"menu.abort": "Abandonner",
"menu.about": "À propos",
"menu.active": "En route",
"menu.admin": "Panneau d'administration",
+ "menu.backend": "Backend",
"menu.blog": "Blog",
"menu.close": "Fermer",
+ "menu.copy": "Copie",
+ "menu.copy-link": "Copier le lien",
"menu.dashboard": "Tableau de bord",
"menu.developed": "Codé avec
dans l’Union européenne.
Code source publié sous la licence
AGPLv3.",
"menu.discard": "Rejeter",
@@ -413,6 +442,12 @@
"messages.exception.maybe-too-fast": "Peut-être as-tu accidentellement appuyé plusieurs fois ?",
"messages.exception.motis.502": "L'horaire n'a pas pu être chargé. Merci de réessayer dans un moment.",
"messages.exception.motis.general": "Il y a eu un problème avec l’interface des données horaires. Merci d'essayer à nouveau.",
+ "messages.exception.motis.station-not-found": "La station que vous recherchez est introuvable dans la base de données de notre fournisseur. Veuillez vérifier l'orthographe ou essayer une autre station.",
+ "messages.exception.motis.trip-not-found": "Le voyage que vous recherchez est introuvable dans la base de données de notre fournisseur. Veuillez vérifier les détails ou essayer une autre connexion.",
+ "messages.exception.motis.unknown-error.departures": "Une erreur inconnue s'est produite avec notre fournisseur de données lors de la recherche des départs. Veuillez réessayer.",
+ "messages.exception.motis.unknown-error.journey": "Une erreur inconnue s'est produite avec notre fournisseur de données lors de la récupération des informations d'arrêt. Veuillez réessayer.",
+ "messages.exception.motis.unknown-error.nearby-stations": "Une erreur inconnue s'est produite avec notre fournisseur de données lors de la recherche des stations à proximité. Veuillez réessayer.",
+ "messages.exception.motis.unknown-error.station": "Une erreur inconnue s'est produite lors de la recherche de cette station auprès de notre fournisseur de données. Veuillez vérifier l'orthographe ou essayer une autre station.",
"messages.exception.reference": "Erreur reference : :reference",
"messages.retry-in": "Tu peux réessayer dans :minutes minutes.",
"messages.too-many-likes": "Tu as aimé trop d'enregistrements ces dernières minutes.",
@@ -429,8 +464,6 @@
"modals.setHome-title": "Définir le point d'arrêt de ton domicile",
"modals.tags.new": "Nouveau tag",
"next": "Suivante",
- "time.earlier": "Plus tôt",
- "time.later": "Plus tard",
"no": "Non",
"no-journeys-day": "Tu n'as enregistré aucun trajet ce jour-là.",
"no-map-data": "Aucune donnée cartographique disponible",
@@ -484,6 +517,7 @@
"oauth.redirect": "URL de redirection",
"oauth.secret-confirmed": "Secret confirmé",
"oauth.secret-once": "Le secret client pour \":name\" n'est affiché qu'une seule fois. Veuillez le sauvegarder maintenant.",
+ "optional": "facultatif",
"or-alternative": "ou",
"other": "Autre",
"overlapping-checkin": "Chevauchement d'enregistrement",
@@ -495,14 +529,15 @@
"pagination.back": "« Retour",
"pagination.next": "Page suivante »",
"pagination.previous": "« Page précédente",
- "prev": "Précédente",
"passwords.password": "Le mot de passe doit au moins avoir une longueur de six caractères et doit correspondre à la confirmation.",
"passwords.reset": "Ton mot de passe a été réinitialisé.",
"passwords.sent": "Nous t’avons envoyé un lien pour réinitialiser ton mot de passe par e-mail.",
+ "passwords.sent_if_exists": "Si un compte existe avec cette adresse e-mail, un lien de réinitialisation du mot de passe a été envoyé.",
"passwords.throttled": "Veuillez patienter avant de réessayer.",
"passwords.token": "Ce lien pour réinitialiser un mot de passe n’est pas valide.",
"passwords.user": "Nous n’avons pas pu trouver d’utilisateur·rice avec cette adresse e-mail.",
"platform": "Voie",
+ "prev": "Précédente",
"privacy.not-signed-yet": "
Tu n'as pas encore signé notre politique de confidentialité. Pour utiliser Träwelling, tu dois accepter notre politique de confidentialité. Si tu ne souhaites pas accepter cette politique, tu peux supprimer ton compte en cliquant sur le bouton ci-dessous.",
"privacy.sign": "Signer",
"privacy.sign.more": "Accepter et continuer sur Träwelling",
@@ -582,7 +617,6 @@
"search-results": "Résultats de recherche",
"settings.allow": "Autoriser",
"settings.allow_friend_checkin_for": "Autoriser l'enregistrement d'un ami pour",
- "settings.friend_checkin.description": "Permet à des utilisateur·rice·s sélectionné·e·s de t'enregistrer lors d'un trajet commun.",
"settings.btn-update": "Mettre à jour",
"settings.client-name": "Service",
"settings.colorscheme.auto": "Préférence système",
@@ -592,7 +626,6 @@
"settings.confirm-password": "Confirmer le mot de passe",
"settings.connect": "Connecter",
"settings.connect-mastodon": "Connecter Mastodon",
- "settings.mastodon.description": "Connecte ton compte Mastodon pour partager automatiquement tes check-ins. Seul Mastodon est officiellement pris en charge, les autres implémentations du Fediverse peuvent ne pas fonctionner.",
"settings.create-ics-token": "Créer un nouveau partage",
"settings.created": "Créé",
"settings.current-password": "Mot de passe actuel",
@@ -611,39 +644,42 @@
"settings.expires": "Expire",
"settings.find-users": "Recherche d'utilisateur·rice·s",
"settings.follower.delete": "Supprimer l’abonné·e",
- "settings.social.manage": "Abonné·e·s, blocages & mises en sourdine",
"settings.follower.no-follower": "Tu n’as pas d’abonné·e·s.",
"settings.follower.no-followings": "Tu n'es abonné·e à personne.",
"settings.follower.no-requests": "Tu n‘as aucune demande d'abonnement.",
"settings.friend_checkin": "Enregistrements d'amis",
"settings.friend_checkin.add_user": "Ajout d'un·e utilisateur·rice",
+ "settings.friend_checkin.description": "Permet à des utilisateur·rice·s sélectionné·e·s de t'enregistrer lors d'un trajet commun.",
"settings.friend_checkin.forbidden": "Personne",
"settings.friend_checkin.friends": "Ami·e·s",
"settings.friend_checkin.list": "Utilisateur·rice·s de confiance",
"settings.heading.account": "Paramètres de compte",
"settings.ics.descriptor": "Ici tu peux gérer ton lien ICS. C'est pour montrer tes trajets précédents dans un calendrier compatible.",
"settings.ics.modal": "Jetons ICS délivrés",
- "settings.ics.name-placeholder": "Indication de jeton – par ex. Google Calendrier, Outlook…",
+ "settings.ics.name-placeholder": "Indication de jeton: par ex. Google Calendrier, Outlook…",
"settings.ip": "Adresse IP",
"settings.language.set": "Changer de langue",
"settings.last-accessed": "Dernier accès",
"settings.lastactivity": "Dernière activité",
+ "settings.mastodon.description": "Connecte ton compte Mastodon pour partager automatiquement tes check-ins. Seul Mastodon est officiellement pris en charge, les autres implémentations du Fediverse peuvent ne pas fonctionner.",
"settings.mastodon.import-profile-picture": "Importer la photo de profil depuis Mastodon",
"settings.mastodon.no-profile-picture": "Ton compte Mastodon n'a pas de photo de profil.",
"settings.mastodon.visibility": "Visibilité des messages Mastodon",
- "settings.mastodon.visibility.description": "Définit avec quelle visibilité les prochains check-ins seront partagés sur Mastodon.",
"settings.mastodon.visibility.0": "Public",
"settings.mastodon.visibility.1": "Non listé",
"settings.mastodon.visibility.2": "Uniquement pour tes abonné·e·s",
"settings.mastodon.visibility.3": "Privé",
+ "settings.mastodon.visibility.description": "Définit avec quelle visibilité les prochains check-ins seront partagés sur Mastodon.",
"settings.never": "Jamais",
"settings.new-password": "Nouveau mot de passe",
"settings.no-ics-tokens": "Tu n’as pas créé un partage de calendrier pour tes trajets.",
"settings.no-webhooks": "Aucune application tierce ne sera informée des activités de ton compte.",
+ "settings.password-min-length": "Au moins :min caractères",
+ "settings.password-mismatch": "Les mots de passe ne correspondent pas.",
"settings.picture": "Photo de profil",
"settings.prevent": "Interdire",
"settings.prevent-indexing": "Empêcher l'indexation par les moteurs de recherche",
- "settings.profile.link-placeholder": "URL du profil – p. ex. https://social.example/@username",
+ "settings.profile.link-placeholder": "URL du profil: p. ex. https://social.example/@username",
"settings.profile.links": "Liens de profil",
"settings.profile.links.description": "Gère les liens affichés sur ton profil. Tu peux ajouter des liens vers tes autres réseaux sociaux ou ton site web personnel.",
"settings.profilePicture.deleted": "Ta photo de profil a été supprimée avec succès.",
@@ -653,42 +689,43 @@
"settings.request.reject-success": "La demande d'abonnement a été refusée avec succès.",
"settings.saved": "Changement enregistré",
"settings.search-engines.description": "Ajoute une balise noindex à ton profil. Les moteurs de recherche peuvent tout de même l’indexer.",
+ "settings.sessions.description": "Toutes les connexions actives de ton compte sur différents appareils et navigateurs.",
+ "settings.social.manage": "Abonné·e·s, blocages & mises en sourdine",
"settings.something-wrong": "Ça n’a pas marché. :(",
"settings.tab.account": "Compte",
"settings.tab.wellbeing": "Bien-être numérique",
- "settings.password-min-length": "Au moins :min caractères",
- "settings.password-mismatch": "Les mots de passe ne correspondent pas.",
"settings.title-change-password": "Changer de mot de passe",
- "settings.title-set-password": "Définir un mot de passe",
- "settings.warning-no-email": "Facultatif, mais recommandé. Sans adresse e-mail, vous ne pouvez pas récupérer votre compte si vous perdez l'accès à votre fournisseur SSO.",
- "settings.warning-no-password": "Facultatif, mais recommandé. Sans mot de passe, vous perdrez l'accès à Träwelling si votre fournisseur SSO devient indisponible.",
"settings.title-ics": "Export vers le calendrier",
"settings.title-loginservices": "Services liés",
"settings.title-privacy": "Confidentialité",
"settings.title-profile": "Paramètres du profil",
"settings.title-security": "Sécurité",
"settings.title-services-and-security": "Services & Sécurité",
- "settings.tokens-managed-in-applications": "Les jetons API et les jetons d'accès personnels sont gérés sous \"Applications\".",
"settings.title-sessions": "Sessions",
- "settings.sessions.description": "Toutes les connexions actives de ton compte sur différents appareils et navigateurs.",
+ "settings.title-set-password": "Définir un mot de passe",
"settings.title-tokens": "Jeton API",
"settings.title-webhooks": "Webhooks",
- "settings.webhooks.description": "Notifications enregistrées par les apps connectées pour les activités sur ton compte.",
"settings.token": "Jeton",
+ "settings.tokens-managed-in-applications": "Les jetons API et les jetons d'accès personnels sont gérés sous \"Applications\".",
"settings.upload-image": "Télécharger une photo de profil",
+ "settings.upload-image.image-size": "Taille d'image recommandée: 400x400pixels.",
"settings.visibility": "Visibilité",
"settings.visibility.default": "Visibilité par défaut",
"settings.visibility.default.description": "Présélectionnée lors du check-in, mais modifiable individuellement par check-in. Les check-ins créés par des ami·e·s en ton nom utilisent également cette visibilité.",
"settings.visibility.hide": "Masquer automatiquement les enregistrements après",
"settings.visibility.hide.explain": "Après le nombre de jours que tu as spécifié, tes enregistrements seront considérés comme privés, de sorte que tu seras le seul à pouvoir les voir.",
+ "settings.warning-no-email": "Facultatif, mais recommandé. Sans adresse e-mail, vous ne pouvez pas récupérer votre compte si vous perdez l'accès à votre fournisseur SSO.",
+ "settings.warning-no-password": "Facultatif, mais recommandé. Sans mot de passe, vous perdrez l'accès à Träwelling si votre fournisseur SSO devient indisponible.",
"settings.webhook-description": "Les webhooks sont une technologie permettant d'informer des applications externes sur les activités de votre compte Träwelling. Dans le tableau suivant, tu peux voir quelles applications externes ont enregistré des webhooks et de quelles activités elles seront informées.",
"settings.webhook-event-notifications-description": "Activités",
"settings.webhook_event.checkin_create": "Création d'un enregistrement",
"settings.webhook_event.checkin_delete": "Suppression d'un enregistrement",
"settings.webhook_event.checkin_update": "Modification d'un enregistrement",
"settings.webhook_event.notification": "Recevoir une notification",
+ "settings.webhooks.description": "Notifications enregistrées par les apps connectées pour les activités sur ton compte.",
"show-notifications": "Afficher les notifications",
"sr.dropdown.toggle": "Afficher/masquer le menu déroulant",
+ "station.technical-details": "Détails techniques",
"stationboard.arr": "arr",
"stationboard.btn-checkin": "S’enregistrer !",
"stationboard.business.business": "Professionnel",
@@ -736,19 +773,35 @@
"stationboard.timezone": "Nous avons détecté que ton fuseau horaire est différent de celui de cette station. Les heures indiquées ici sont affichées avec le fuseau horaire que tu as défini
:timezone.",
"stationboard.timezone.settings": "Si tu le souhaites, tu peux le modifier dans les
paramètres.",
"stationboard.to": "à",
- "station.technical-details": "Détails techniques",
"stationboard.where-are-you": "Où es-tu ?",
"stats": "Statistiques",
"stats-day": "Tes trajets le :date",
+ "stats.avg": "Moyenne",
+ "stats.avg-per-ride": "Moy/Trajet",
"stats.categories": "Moyens de transport de tes déplacements",
+ "stats.checkins": "Enregistrements",
"stats.companies": "Opérateurs de transport",
"stats.daily": "Statistiques quotidiennes",
"stats.daily.description": "Journal de tes trajets, carte incluse",
+ "stats.distance": "Distance",
+ "stats.extremes": "Extrêmes",
+ "stats.breakdown": "Historique",
+ "stats.favorite-lines": "Lignes favorites",
+ "stats.favorite-routes": "Trajets favoris",
+ "stats.favorite-stations": "Gares les plus fréquentées",
+ "stats.from": "Du",
"stats.global": "Statistiques globales",
"stats.global.active": "Träwelleur·se·s actif·ve·s",
"stats.global.distance": "Distance parcourue par toustes les Träwelleur·se·s",
"stats.global.duration": "Temps de parcours de toustes les Träwelleur·se·s",
"stats.global.explain": "Les statistiques globales se réfèrent aux enregistrements de toustes les Träwelleur·e·s du :fromDate au :toDate.",
+ "stats.last-month": "Mois dernier",
+ "stats.last-week": "Semaine dernière",
+ "stats.last-year": "Année dernière",
+ "stats.longest-ride": "Trajet le plus long",
+ "stats.mean-distance": "Moy. par trajet",
+ "stats.month": "Mois",
+ "stats.monthly-breakdown": "Vue mensuelle",
"stats.no-data": "Il n'y a pas de données disponibles pour cette période.",
"stats.per-week": "par semaine",
"stats.personal": "Statistiques personnelles du :fromDate au :toDate",
@@ -756,11 +809,19 @@
"stats.range": "Période",
"stats.range.days": "Derniers :days jours",
"stats.range.picker": "Choisir la période",
+ "stats.shortest-ride": "Trajet le plus court",
"stats.time": "Ton temps de trajet quotidien",
+ "stats.time-comparison": "Rétrospective",
"stats.time-in-minutes": "Temps de parcours en minutes",
+ "stats.to": "Au",
+ "stats.today": "aujourd'hui",
+ "stats.total-distance": "Distance totale",
+ "stats.travel-days": "Jours de voyage",
"stats.trips": ":count trajet|:count trajets",
"stats.volume": "Ton volume de trajets",
"stats.week-short": "S",
+ "stats.year": "Année",
+ "stats.yearly-breakdown": "Vue annuelle",
"status.arrival-now": "Arrivée immédiate",
"status.departure-now": "Départ immédiat",
"status.hidden-body": "Le texte de ce statut n'est pas visible par les autres utilisateur·rice·s.",
@@ -791,22 +852,27 @@
"support.privacy.description": "Ton numéro d'identification, ton nom d'utilisateur·rice et ton adresse e-mail sont enregistrés ensemble avec ta demande dans notre système de ticket.",
"support.privacy.description2": "Les données seront supprimées après un an indépendamment de ton compte Träwelling.",
"support.rate_limit_exceeded": "Tu as récemment créé une demande d'assistance. Merci d'attendre quelques jours avant d'en créer une autre.",
+ "tag.add": "Ajouter un tag",
+ "tag.custom_key": "Type personnalisé",
+ "tag.custom_key.placeholder": "ex. occupation",
+ "tag.key": "Type",
"tag.title.trwl:journey_number": "Numéro du service",
"tag.title.trwl:locomotive_class": "Série",
"tag.title.trwl:passenger_rights": "Droits des voyageur·se·s",
"tag.title.trwl:price": "Prix",
"tag.title.trwl:role": "Rôle",
"tag.title.trwl:seat": "Siège",
+ "tag.title.trwl:social_status": "Statut social",
"tag.title.trwl:ticket": "Billet",
"tag.title.trwl:travel_class": "Classe de service",
"tag.title.trwl:vehicle_number": "Numéro de la rame",
"tag.title.trwl:wagon": "Voiture",
"tag.title.trwl:wagon_class": "Classe de la voiture",
- "tag.add": "Ajouter un tag",
- "tag.key": "Type",
- "tag.custom_key": "Type personnalisé",
- "tag.custom_key.placeholder": "ex. occupation",
"tag.value": "Valeur",
+ "tag.value.trwl:social_status.do_not_disturb": "🚫 Ne pas déranger",
+ "tag.value.trwl:social_status.open": "👋 Ouvert à la discussion",
+ "tag.value.trwl:social_status.open_find_me": "🕵️ Viens me trouver",
+ "tag.value.trwl:social_status.open_lets_hang": "🚶 Retrouvons-nous",
"tickets.add": "Ajouter un billet",
"tickets.assign": "Attribuer",
"tickets.assign-ticket": "Attribuer un billet",
@@ -849,15 +915,17 @@
"time-is-real": "Temps réel (à partir de l'API des horaires)",
"time.days": "jours",
"time.days.short": "j",
+ "time.duration": "Durée",
+ "time.earlier": "Plus tôt",
"time.hours": "heures",
"time.hours.short": "h",
+ "time.later": "Plus tard",
"time.minutes": "minutes",
"time.minutes.short": "min",
"time.months": "mois",
"time.months.short": "mo",
"time.years": "ans",
"time.years.short": "a",
- "time.duration": "Durée",
"toggle-navigation": "Changer la navigation",
"transport_types.bus": "Bus",
"transport_types.business": "Voyage professionnel",
@@ -876,6 +944,7 @@
"transport_types.subway": "Métro",
"transport_types.taxi": "Taxi",
"transport_types.tram": "Tram",
+ "trip-info.also-in-this-connection": "Également dans ce contexte",
"trip-info.arrival": "Arrivée",
"trip-info.departure": "Départ",
"trip-info.destination": "Destination",
@@ -904,11 +973,10 @@
"trip_creation.csv_import.subtitle": "Importation de l'origine, des points d'arrêt intermédiaires et de la destination. La première ligne correspond à l'origine, la dernière ligne à la destination.",
"trip_creation.csv_import.title": "Importation CSV des points d'arrêt",
"trip_creation.form.add_stopover": "Ajouter un arrêt intermédiaire",
- "trip_creation.form.stations": "Arrêts",
- "trip_creation.form.distribute-times": "Répartir les horaires uniformément",
"trip_creation.form.arrival": "Arrivée",
"trip_creation.form.departure": "Départ",
"trip_creation.form.destination": "Point d'arrêt d'arrivée",
+ "trip_creation.form.distribute-times": "Répartir les horaires uniformément",
"trip_creation.form.line": "Ligne",
"trip_creation.form.line.placeholder": "M11, TGV inOui, TER Fluo, ...",
"trip_creation.form.map": "Informations sur le trajet",
@@ -917,6 +985,7 @@
"trip_creation.form.operator_search": "Rechercher un opérateur...",
"trip_creation.form.origin": "Point d'arrêt de départ",
"trip_creation.form.save": "Sauvegarder",
+ "trip_creation.form.stations": "Arrêts",
"trip_creation.form.stopover": "Arrêt intermédiaire",
"trip_creation.form.travel_type": "Type de trajet",
"trip_creation.form.trip_data": "Informations sur le trajet",
@@ -936,6 +1005,7 @@
"user.blocked": "Tu as bloqué l'utilisateur·rice :@username.",
"user.blocked.heading": "Utilisateur·rice bloqué·e",
"user.blocked.heading2": "Utilisateur·rice·s bloqué·e·s",
+ "user.blocked.noBlockedUsers": "Tu n'as bloqué aucun utilisateur.",
"user.blocked.text": "Tu ne peux pas voir les enregistrements de :username, car tu as bloqué cet·te utilisateur·rice.",
"user.complete-registration": "Terminer l’inscription",
"user.data_provider": "Fournisseur de données",
@@ -966,6 +1036,7 @@
"user.muted": "Tu as masqué l‘utilisateur·rice :username.",
"user.muted.heading": "Utilisateur·rice masqué·e",
"user.muted.heading2": "Utilisateur·rice·s masqué·e·s",
+ "user.muted.noMutedUsers": "Tu n'as mis aucun utilisateur en sourdine.",
"user.muted.text": "Tu ne peux pas voir les enregistrements de :username car tu l‘as masqué.",
"user.no-account": "Tu n'as pas encore de compte ?",
"user.no-user": "Aucun·e utilisateur·rice trouvé·e.",
@@ -1101,6 +1172,7 @@
"validation.attributes.address": "adresse",
"validation.attributes.age": "âge",
"validation.attributes.available": "disponible",
+ "validation.attributes.body": "Corps",
"validation.attributes.city": "ville",
"validation.attributes.content": "contenu",
"validation.attributes.country": "pays",
@@ -1114,6 +1186,7 @@
"validation.attributes.gender": "genre",
"validation.attributes.hour": "heure",
"validation.attributes.last_name": "nom",
+ "validation.attributes.message": "Message",
"validation.attributes.minute": "minute",
"validation.attributes.mobile": "portable",
"validation.attributes.month": "mois",
@@ -1121,9 +1194,14 @@
"validation.attributes.password": "mot de passe",
"validation.attributes.password_confirmation": "confirmation du mot de passe",
"validation.attributes.phone": "téléphone",
+ "validation.attributes.photo": "Photo",
+ "validation.attributes.price": "Prix",
+ "validation.attributes.role": "Rôle",
"validation.attributes.second": "seconde",
"validation.attributes.sex": "sexe",
"validation.attributes.size": "taille",
+ "validation.attributes.subject": "Sujet",
+ "validation.attributes.terms": "Termes",
"validation.attributes.time": "heure",
"validation.attributes.title": "titre",
"validation.attributes.username": "nom d'utilisateur",
@@ -1262,60 +1340,5 @@
"your-access-token": "Tes jetons d'accès",
"your-access-token-description": "Tu peux générer un jeton d'accès pour accéder à ton propre compte.",
"your-access-token.ask": "Chez Träwelling, nous ne te demanderons jamais ton jeton d'accès. Si on te le demande, il s'agit probablement d'une usurpation d'identité.",
- "your-apps": "Tes applications",
- "user.blocked.noBlockedUsers": "Tu n'as bloqué aucun utilisateur.",
- "user.muted.noMutedUsers": "Tu n'as mis aucun utilisateur en sourdine.",
- "stats.from": "Du",
- "stats.to": "Au",
- "beta.banner.text": "Tu consultes un nouveau design encore en cours de developpement. Des erreurs peuvent survenir. Tu peux desactiver les fonctionnalites experimentales dans tes",
- "beta.banner.settings": "parametres.",
- "changelog.view_on_github": "Afficher les modifications sur GitHub",
- "dates.Today": "Aujourd'hui",
- "events.duration": "Durée de l'événement",
- "footer.developed": "Développé avec ❤ au sein de l'Union européenne.",
- "footer.elsewhere": "Autre part",
- "footer.legal": "Légal",
- "footer.services": "Services",
- "footer.source": "Code source sous licence AGPLv3.",
- "generic.search": "Recherche",
- "mail.action.trouble": "Si vous rencontrez des difficultés pour cliquer sur le bouton “:actionText”, copiez et collez l'URL ci-dessous :\ndans votre navigateur Web :",
- "mail.email_changed.body1": "Nous avons modifié votre adresse e-mail en **:new_email**.",
- "mail.email_changed.body2": "Si vous n'avez pas effectué cette modification, veuillez contacter immédiatement notre équipe d'assistance et nous fournir le numéro suivant: _:reference_",
- "mail.email_changed.body3": "Si vous avez effectué cette modification, vous pouvez ignorer ce courriel. Aucune autre action n'est requise de votre part.",
- "mail.email_changed.subject": "Votre adresse e-mail a été modifiée.",
- "mail.hello2": "Bonjour!",
- "mail.reset_password.action": "Réinitialiser le mot de passe",
- "mail.reset_password.line1": "Vous recevez ce courriel car nous avons reçu une demande de réinitialisation de mot de passe pour votre compte.",
- "mail.reset_password.line2": "Ce lien de réinitialisation de mot de passe expirera dans :count minutes.",
- "mail.reset_password.line3": "Si vous n'avez pas demandé de réinitialisation de mot de passe, aucune autre action n'est requise.",
- "mail.reset_password.subject": "Notification de réinitialisation du mot de passe",
- "mail.verify_email.action": "Vérifier l'adresse e-mail",
- "mail.verify_email.line1": "Veuillez cliquer sur le bouton ci-dessous pour vérifier votre adresse e-mail.",
- "mail.verify_email.subject": "Veuillez vérifier votre adresse e-mail",
- "mail.whoops": "Oups !",
- "menu.backend": "Backend",
- "menu.copy": "Copie",
- "menu.copy-link": "Copier le lien",
- "messages.exception.motis.station-not-found": "La station que vous recherchez est introuvable dans la base de données de notre fournisseur. Veuillez vérifier l'orthographe ou essayer une autre station.",
- "messages.exception.motis.trip-not-found": "Le voyage que vous recherchez est introuvable dans la base de données de notre fournisseur. Veuillez vérifier les détails ou essayer une autre connexion.",
- "messages.exception.motis.unknown-error.departures": "Une erreur inconnue s'est produite avec notre fournisseur de données lors de la recherche des départs. Veuillez réessayer.",
- "messages.exception.motis.unknown-error.journey": "Une erreur inconnue s'est produite avec notre fournisseur de données lors de la récupération des informations d'arrêt. Veuillez réessayer.",
- "messages.exception.motis.unknown-error.nearby-stations": "Une erreur inconnue s'est produite avec notre fournisseur de données lors de la recherche des stations à proximité. Veuillez réessayer.",
- "messages.exception.motis.unknown-error.station": "Une erreur inconnue s'est produite lors de la recherche de cette station auprès de notre fournisseur de données. Veuillez vérifier l'orthographe ou essayer une autre station.",
- "optional": "facultatif",
- "passwords.sent_if_exists": "Si un compte existe avec cette adresse e-mail, un lien de réinitialisation du mot de passe a été envoyé.",
- "settings.upload-image.image-size": "Taille d'image recommandée: 400x400pixels.",
- "tag.title.trwl:social_status": "Statut social",
- "tag.value.trwl:social_status.do_not_disturb": "🚫 Ne pas déranger",
- "tag.value.trwl:social_status.open": "👋 Ouvert à la discussion",
- "tag.value.trwl:social_status.open_find_me": "🕵️ Viens me trouver",
- "tag.value.trwl:social_status.open_lets_hang": "🚶 Retrouvons-nous",
- "trip-info.also-in-this-connection": "Également dans ce contexte",
- "validation.attributes.body": "Corps",
- "validation.attributes.message": "Message",
- "validation.attributes.photo": "Photo",
- "validation.attributes.price": "Prix",
- "validation.attributes.role": "Rôle",
- "validation.attributes.subject": "Sujet",
- "validation.attributes.terms": "Termes"
+ "your-apps": "Tes applications"
}
diff --git a/package-lock.json b/package-lock.json
index e27a8060e..bef56acb0 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -153,46 +153,93 @@
"license": "MIT"
},
"node_modules/@babel/generator": {
- "version": "7.29.1",
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz",
- "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==",
+ "version": "8.0.0-rc.6",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-8.0.0-rc.6.tgz",
+ "integrity": "sha512-6mIzgVK8DgEzvIapoQwhXTMnnkuE4STQmVv9H03i/tZ2ml8oev3TRvZJgTenK2Bsq0YWNtzOrFdTyNzCMFtjJQ==",
"license": "MIT",
"dependencies": {
- "@babel/parser": "^7.29.0",
- "@babel/types": "^7.29.0",
+ "@babel/parser": "^8.0.0-rc.6",
+ "@babel/types": "^8.0.0-rc.6",
"@jridgewell/gen-mapping": "^0.3.12",
"@jridgewell/trace-mapping": "^0.3.28",
+ "@types/jsesc": "^2.5.0",
"jsesc": "^3.0.2"
},
"engines": {
- "node": ">=6.9.0"
+ "node": "^22.18.0 || >=24.11.0"
+ }
+ },
+ "node_modules/@babel/generator/node_modules/@babel/helper-string-parser": {
+ "version": "8.0.0-rc.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-8.0.0-rc.6.tgz",
+ "integrity": "sha512-BCkFy+zN6kXQed3YOT7aJl93NfDSzQc3pBfsvTVPs9gU9X3V0aefEF5kwBT0E+mDWH9QgKaZstYUQN9VdQZT4g==",
+ "license": "MIT",
+ "engines": {
+ "node": "^22.18.0 || >=24.11.0"
+ }
+ },
+ "node_modules/@babel/generator/node_modules/@babel/helper-validator-identifier": {
+ "version": "8.0.0-rc.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-8.0.0-rc.6.tgz",
+ "integrity": "sha512-nVJ+1JcCgntv8d78rRo++o2wuODT0Irknx2BF8Np4Ft2CRgjLqIs4qzSZ8b66yGbBdMWGmZBO9WEZv1hhNiSpg==",
+ "license": "MIT",
+ "engines": {
+ "node": "^22.18.0 || >=24.11.0"
+ }
+ },
+ "node_modules/@babel/generator/node_modules/@babel/parser": {
+ "version": "8.0.0-rc.6",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-8.0.0-rc.6.tgz",
+ "integrity": "sha512-rOS8IpdO7mQELkTPlCsTgPejO0bFuZdEDCGQJouYbYf9e1FLTym7Fei2pEjq8q7MWbX0ravcd7QQYKs1TxOuog==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^8.0.0-rc.6"
+ },
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": "^22.18.0 || >=24.11.0"
+ }
+ },
+ "node_modules/@babel/generator/node_modules/@babel/types": {
+ "version": "8.0.0-rc.6",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-8.0.0-rc.6.tgz",
+ "integrity": "sha512-p7/ABylAYlexb31wtRdIfH9L9A0Z2T/9H6zAqzqndkY2PLkvNNc580wGhp/gGKN4Sp9sQvSkhc6Oga8/O+wTyw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-string-parser": "^8.0.0-rc.6",
+ "@babel/helper-validator-identifier": "^8.0.0-rc.6"
+ },
+ "engines": {
+ "node": "^22.18.0 || >=24.11.0"
}
},
"node_modules/@babel/helper-string-parser": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz",
- "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==",
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz",
+ "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==",
"license": "MIT",
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-validator-identifier": {
- "version": "7.28.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz",
- "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==",
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz",
+ "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==",
"license": "MIT",
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/parser": {
- "version": "7.29.3",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.3.tgz",
- "integrity": "sha512-b3ctpQwp+PROvU/cttc4OYl4MzfJUWy6FZg+PMXfzmt/+39iHVF0sDfqay8TQM3JA2EUOyKcFZt75jWriQijsA==",
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz",
+ "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==",
"license": "MIT",
"dependencies": {
- "@babel/types": "^7.29.0"
+ "@babel/types": "^7.29.7"
},
"bin": {
"parser": "bin/babel-parser.js"
@@ -202,13 +249,13 @@
}
},
"node_modules/@babel/types": {
- "version": "7.29.0",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz",
- "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==",
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz",
+ "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==",
"license": "MIT",
"dependencies": {
- "@babel/helper-string-parser": "^7.27.1",
- "@babel/helper-validator-identifier": "^7.28.5"
+ "@babel/helper-string-parser": "^7.29.7",
+ "@babel/helper-validator-identifier": "^7.29.7"
},
"engines": {
"node": ">=6.9.0"
@@ -238,23 +285,22 @@
}
},
"node_modules/@biomejs/wasm-nodejs": {
- "version": "2.4.14",
- "resolved": "https://registry.npmjs.org/@biomejs/wasm-nodejs/-/wasm-nodejs-2.4.14.tgz",
- "integrity": "sha512-XFDMqwQepkYtd7JdXkwDKAEP5z1yFM+vL6Wd8ych7bTCKyacZ0m+KUvb6j3WW/py11q0WRoNHvF47yjCINKD/A==",
+ "version": "2.4.16",
+ "resolved": "https://registry.npmjs.org/@biomejs/wasm-nodejs/-/wasm-nodejs-2.4.16.tgz",
+ "integrity": "sha512-3BSGXHJ25Is+9gRgV+Gwz7YdMktrMOBP+Vw3RwXy3Y/CHqXbbNSyhaMt6VFk1J/WAGutdYfBy+NzhlvOftwd+g==",
"dev": true,
"license": "MIT OR Apache-2.0"
},
"node_modules/@date-fns/tz": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/@date-fns/tz/-/tz-1.4.1.tgz",
- "integrity": "sha512-P5LUNhtbj6YfI3iJjw5EL9eUAG6OitD0W3fWQcpQjDRc/QIsL0tRNuO1PcDvPccWL1fSTXXdE1ds+l95DV/OFA==",
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/@date-fns/tz/-/tz-1.5.0.tgz",
+ "integrity": "sha512-lwYN/vDPeNRULcepoE/LO2Pgx+7/RV+S9ARfbc9lr2DtGkOD7pAiruHvbR1RX3Qyf6ja47EWJDMsNK5vK08DJg==",
"license": "MIT"
},
"node_modules/@emnapi/core": {
"version": "1.10.0",
"resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz",
"integrity": "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==",
- "dev": true,
"license": "MIT",
"optional": true,
"dependencies": {
@@ -266,7 +312,6 @@
"version": "1.10.0",
"resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz",
"integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==",
- "dev": true,
"license": "MIT",
"optional": true,
"dependencies": {
@@ -277,7 +322,6 @@
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz",
"integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==",
- "dev": true,
"license": "MIT",
"optional": true,
"dependencies": {
@@ -329,9 +373,9 @@
}
},
"node_modules/@eslint/config-helpers": {
- "version": "0.5.5",
- "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.5.5.tgz",
- "integrity": "sha512-eIJYKTCECbP/nsKaaruF6LW967mtbQbsw4JTtSVkUQc9MneSkbrgPJAbKl9nWr0ZeowV8BfsarBmPpBzGelA2w==",
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.6.0.tgz",
+ "integrity": "sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
@@ -386,9 +430,9 @@
}
},
"node_modules/@eslint/plugin-kit": {
- "version": "0.7.1",
- "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.7.1.tgz",
- "integrity": "sha512-rZAP3aVgB9ds9KOeUSL+zZ21hPmo8dh6fnIFwRQj5EAZl9gzR7wxYbYXYysAM8CTqGmUGyp2S4kUdV17MnGuWQ==",
+ "version": "0.7.2",
+ "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.7.2.tgz",
+ "integrity": "sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
@@ -634,14 +678,14 @@
"license": "BSD-2-Clause"
},
"node_modules/@mapbox/vector-tile": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/@mapbox/vector-tile/-/vector-tile-2.0.4.tgz",
- "integrity": "sha512-AkOLcbgGTdXScosBWwmmD7cDlvOjkg/DetGva26pIRiZPdeJYjYKarIlb4uxVzi6bwHO6EWH82eZ5Nuv4T5DUg==",
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@mapbox/vector-tile/-/vector-tile-2.0.5.tgz",
+ "integrity": "sha512-pXj8m7KTsqZt+1jsE0xIpGvqTSbblfkuEJL/NJmNePMtEwxO8V3XMDo9WMSfDeqHvCtBI9Lmt4mGcGR10zecmw==",
"license": "BSD-3-Clause",
"dependencies": {
"@mapbox/point-geometry": "~1.1.0",
"@types/geojson": "^7946.0.16",
- "pbf": "^4.0.1"
+ "pbf": "^4.0.2"
}
},
"node_modules/@mapbox/whoots-js": {
@@ -663,13 +707,13 @@
}
},
"node_modules/@maplibre/maplibre-gl-style-spec": {
- "version": "24.8.5",
- "resolved": "https://registry.npmjs.org/@maplibre/maplibre-gl-style-spec/-/maplibre-gl-style-spec-24.8.5.tgz",
- "integrity": "sha512-EzEJmMt6thioRH7GI9LWS7ahXTcAhAPGWCe6oTP2Ps4YnsXOOAfeqx854lZaiDnwURfHmcCKV1mr6oo0i23x6w==",
+ "version": "24.10.0",
+ "resolved": "https://registry.npmjs.org/@maplibre/maplibre-gl-style-spec/-/maplibre-gl-style-spec-24.10.0.tgz",
+ "integrity": "sha512-lichxSiagMEBBrqHF0trtMQH9RKh+9jUlIJl0qW0QHvt2H/tbvUWdE+ZzI2Jd0/pT7j/iavLonlPu7EQ/ixTOw==",
"license": "ISC",
"dependencies": {
"@mapbox/jsonlint-lines-primitives": "~2.0.2",
- "@mapbox/unitbezier": "^0.0.1",
+ "@mapbox/unitbezier": "^1.0.0",
"json-stringify-pretty-compact": "^4.0.0",
"minimist": "^1.2.8",
"quickselect": "^3.0.0",
@@ -681,45 +725,52 @@
"gl-style-validate": "dist/gl-style-validate.mjs"
}
},
+ "node_modules/@maplibre/maplibre-gl-style-spec/node_modules/@mapbox/unitbezier": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@mapbox/unitbezier/-/unitbezier-1.0.0.tgz",
+ "integrity": "sha512-fqd515fjBmANKGGsQ286E2Wvj/XvDFpGzwJxq4CI6jMQue6Oy04uCKp+JWKF00xRTmk6cEu1jPJ9p3xqH8YWqQ==",
+ "license": "BSD-2-Clause"
+ },
"node_modules/@maplibre/mlt": {
- "version": "1.1.9",
- "resolved": "https://registry.npmjs.org/@maplibre/mlt/-/mlt-1.1.9.tgz",
- "integrity": "sha512-g/tD8EYJB97udq33ipuJ9a4Q7fcbZnTEnUrgnEc/tLMmEL+zaCbR+X5fkDBO2dgpaAMsLH179qE3UXg2N0Nc/g==",
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/@maplibre/mlt/-/mlt-1.1.11.tgz",
+ "integrity": "sha512-dKvjKdITw9d0y3ndGkSqLUEpWCizMtdq8NB06cHohH/JZ2sJoM7dClR9wzJLUWykjbw9RXDFmhjjNBnNW27mzw==",
"license": "(MIT OR Apache-2.0)",
"dependencies": {
"@mapbox/point-geometry": "^1.1.0"
}
},
"node_modules/@maplibre/vt-pbf": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/@maplibre/vt-pbf/-/vt-pbf-4.3.0.tgz",
- "integrity": "sha512-jIvp8F5hQCcreqOOpEt42TJMUlsrEcpf/kI1T2v85YrQRV6PPXUcEXUg5karKtH6oh47XJZ4kHu56pUkOuqA7w==",
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/@maplibre/vt-pbf/-/vt-pbf-4.3.2.tgz",
+ "integrity": "sha512-j6p0AdjvAR19Z3XaCysle7A4ZSo08tYOzxD0Y9NQylwPAkwJJeYub5b2eVucdeDh7erhv69DahoLOevDRERRUw==",
"license": "MIT",
"dependencies": {
"@mapbox/point-geometry": "^1.1.0",
- "@mapbox/vector-tile": "^2.0.4",
- "@maplibre/geojson-vt": "^5.0.4",
"@types/geojson": "^7946.0.16",
- "@types/supercluster": "^7.1.3",
- "pbf": "^4.0.1",
- "supercluster": "^8.0.1"
+ "pbf": "^5.1.0"
}
},
- "node_modules/@maplibre/vt-pbf/node_modules/@maplibre/geojson-vt": {
- "version": "5.0.4",
- "resolved": "https://registry.npmjs.org/@maplibre/geojson-vt/-/geojson-vt-5.0.4.tgz",
- "integrity": "sha512-KGg9sma45S+stfH9vPCJk1J0lSDLWZgCT9Y8u8qWZJyjFlP8MNP1WGTxIMYJZjDvVT3PDn05kN1C95Sut1HpgQ==",
- "license": "ISC"
+ "node_modules/@maplibre/vt-pbf/node_modules/pbf": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/pbf/-/pbf-5.1.0.tgz",
+ "integrity": "sha512-Wv0yo0+uZepnoNEKsquhar1F18LogB8oeEikIhUXG16udbiXG7JecHGySwoo6kuMgjmbQYzdrTZlO+/K9t8eZg==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "resolve-protobuf-schema": "^2.1.0"
+ },
+ "bin": {
+ "pbf": "bin/pbf"
+ }
},
"node_modules/@napi-rs/wasm-runtime": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.4.tgz",
- "integrity": "sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==",
- "dev": true,
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.5.tgz",
+ "integrity": "sha512-AWPoBRJ9tsnVhor4sjO7rkni+7p+2IAEFj6cx06UgP10jkQHqay/36uRV/bFkgrh18D9vb4cr8Q0Pthskgzy+Q==",
"license": "MIT",
"optional": true,
"dependencies": {
- "@tybys/wasm-util": "^0.10.1"
+ "@tybys/wasm-util": "^0.10.2"
},
"funding": {
"type": "github",
@@ -769,10 +820,10 @@
}
},
"node_modules/@oxc-project/types": {
- "version": "0.128.0",
- "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.128.0.tgz",
- "integrity": "sha512-huv1Y/LzBJkBVHt3OlC7u0zHBW9qXf1FdD7sGmc1rXc2P1mTwHssYv7jyGx5KAACSCH+9B3Bhn6Z9luHRvf7pQ==",
- "dev": true,
+ "version": "0.133.0",
+ "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.133.0.tgz",
+ "integrity": "sha512-KzkdCd6Uxqnf6l3HOw1xfatAlUURA0g14cvBYFyJ5SaNOQbOUvBr9PKArcPcrNIeRsBdgcUzOGrhKveVpvOIGA==",
+ "devOptional": true,
"license": "MIT",
"funding": {
"url": "https://github.com/sponsors/Boshen"
@@ -782,7 +833,6 @@
"version": "2.5.6",
"resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.6.tgz",
"integrity": "sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ==",
- "dev": true,
"hasInstallScript": true,
"license": "MIT",
"optional": true,
@@ -822,7 +872,6 @@
"cpu": [
"arm64"
],
- "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -843,7 +892,6 @@
"cpu": [
"arm64"
],
- "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -864,7 +912,6 @@
"cpu": [
"x64"
],
- "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -885,7 +932,6 @@
"cpu": [
"x64"
],
- "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -906,7 +952,6 @@
"cpu": [
"arm"
],
- "dev": true,
"libc": [
"glibc"
],
@@ -930,7 +975,6 @@
"cpu": [
"arm"
],
- "dev": true,
"libc": [
"musl"
],
@@ -954,7 +998,6 @@
"cpu": [
"arm64"
],
- "dev": true,
"libc": [
"glibc"
],
@@ -978,7 +1021,6 @@
"cpu": [
"arm64"
],
- "dev": true,
"libc": [
"musl"
],
@@ -1002,7 +1044,6 @@
"cpu": [
"x64"
],
- "dev": true,
"libc": [
"glibc"
],
@@ -1026,7 +1067,6 @@
"cpu": [
"x64"
],
- "dev": true,
"libc": [
"musl"
],
@@ -1050,7 +1090,6 @@
"cpu": [
"arm64"
],
- "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -1071,7 +1110,6 @@
"cpu": [
"ia32"
],
- "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -1092,7 +1130,6 @@
"cpu": [
"x64"
],
- "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -1110,7 +1147,6 @@
"version": "4.0.4",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz",
"integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==",
- "dev": true,
"license": "MIT",
"optional": true,
"engines": {
@@ -1121,13 +1157,13 @@
}
},
"node_modules/@pkgr/core": {
- "version": "0.2.9",
- "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.9.tgz",
- "integrity": "sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==",
+ "version": "0.3.6",
+ "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.3.6.tgz",
+ "integrity": "sha512-SEeaJLb3qBNF/OaXnaR1NmmBbFYk1zC0ZH/52fATcRPLFg/p791YrcyFFy44Bo9sLaGuSuLp5Q6axbb/O+v/RA==",
"dev": true,
"license": "MIT",
"engines": {
- "node": "^12.20.0 || ^14.18.0 || >=16.0.0"
+ "node": "^14.18.0 || >=16.0.0"
},
"funding": {
"url": "https://opencollective.com/pkgr"
@@ -1145,13 +1181,12 @@
}
},
"node_modules/@rolldown/binding-android-arm64": {
- "version": "1.0.0-rc.18",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-rc.18.tgz",
- "integrity": "sha512-lIDyUAfD7U3+BWKzdxMbJcsYHuqXqmGz40aeRqvuAm3y5TkJSYTBW2RDrn65DJFPQqVjUAUqq5uz8urzQ8aBdQ==",
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.3.tgz",
+ "integrity": "sha512-454rs7jHngixp/NMxd5srYD57OnzSlZ/eFTETjORQHLwJG1lRtmNOJcBerZlfu4GjKqeq8aCCIQrMdHyhI51Hw==",
"cpu": [
"arm64"
],
- "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -1162,13 +1197,12 @@
}
},
"node_modules/@rolldown/binding-darwin-arm64": {
- "version": "1.0.0-rc.18",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-rc.18.tgz",
- "integrity": "sha512-apJq2ktnGp27nSInMR5Vcj8kY6xJzDAvfdIFlpDcAK/w4cDO58qVoi1YQsES/SKiFNge/6e4CUzgjfHduYqWpQ==",
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.3.tgz",
+ "integrity": "sha512-PcAhP+ynjURNyy8SKGl5DQP94aGuB/7JrXJb/t7P+hanXvQVMWzUvRRhBAcg/lNRadBhoUPqSoP4xw5tR/KBEA==",
"cpu": [
"arm64"
],
- "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -1179,13 +1213,12 @@
}
},
"node_modules/@rolldown/binding-darwin-x64": {
- "version": "1.0.0-rc.18",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-rc.18.tgz",
- "integrity": "sha512-5Ofot8xbs+pxRHJqm9/9N/4sTQOvdrwEsmPE9pdLEEoAbdZtG6F2LMDfO1sp6ZAtXJuJV/21ew2srq3W8NXB5g==",
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.3.tgz",
+ "integrity": "sha512-9YpfeUvSE2RS7wysJ81uOZkXJz7f7Q55H2Gvp3VEw/EsahqDtrphrZ0EwDLK5vvKOzaCrBsjF8JmnMLcUt78Gg==",
"cpu": [
"x64"
],
- "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -1196,13 +1229,12 @@
}
},
"node_modules/@rolldown/binding-freebsd-x64": {
- "version": "1.0.0-rc.18",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-rc.18.tgz",
- "integrity": "sha512-7h8eeOTT1eyqJyx64BFCnWZpNm486hGWt2sqeLLgDxA0xI1oGZ9H7gK1S85uNGmBhkdPwa/6reTxfFFKvIsebw==",
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.3.tgz",
+ "integrity": "sha512-yB1IlAsSNHncV6SCTL27/MVGR5htvQsoGxIv5KMGXALp+Ll1wYsn+x98M9MW7qa+NdSbvrrY7ANI4wLJ0n1e6g==",
"cpu": [
"x64"
],
- "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -1213,13 +1245,12 @@
}
},
"node_modules/@rolldown/binding-linux-arm-gnueabihf": {
- "version": "1.0.0-rc.18",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-rc.18.tgz",
- "integrity": "sha512-eRcm/HVt9U/JFu5RKAEKwGQYtDCKWLiaH6wOnsSEp6NMBb/3Os8LgHZlNyzMpFVNmiiMFlfb2zEnebfzJrHFmg==",
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.3.tgz",
+ "integrity": "sha512-Yi30IVAAfLUCy2MseFjbB1jAMDl1VMCAas5StnYp8da9+CKvMd2H2cbEjWcw5NPaPqzvYkVIaF1nNUG+b7u/sw==",
"cpu": [
"arm"
],
- "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -1230,13 +1261,12 @@
}
},
"node_modules/@rolldown/binding-linux-arm64-gnu": {
- "version": "1.0.0-rc.18",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-rc.18.tgz",
- "integrity": "sha512-SOrT/cT4ukTmgnrEz/Hg3m7LBnuCLW9psDeMKrimRWY4I8DmnO7Lco8W2vtqPmMkbVu8iJ+g4GFLVLLOVjJ9DQ==",
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.3.tgz",
+ "integrity": "sha512-jsO7R8To+AdlYgUmN5sHSCZbfhtMBkO0WUx8iORQnPcMMdgr7qM2DQmMwgabs3GhNztdmoKkMKQFHD6DTMCIQw==",
"cpu": [
"arm64"
],
- "dev": true,
"libc": [
"glibc"
],
@@ -1250,13 +1280,12 @@
}
},
"node_modules/@rolldown/binding-linux-arm64-musl": {
- "version": "1.0.0-rc.18",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-rc.18.tgz",
- "integrity": "sha512-QWjdxN1HJCpBTAcZ5N5F7wju3gVPzRzSpmGzx7na0c/1qpN9CFil+xt+l9lV/1M6/gqHSNXCiqPfwhVJPeLnug==",
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.3.tgz",
+ "integrity": "sha512-VWkUHwWriDciit80wleYwKILoR/KMvxh/IdwS/paX+ZgpuRpCrKLUdadJbc0NpBEiyhpYawsJ73j9aCvOH+f7Q==",
"cpu": [
"arm64"
],
- "dev": true,
"libc": [
"musl"
],
@@ -1270,13 +1299,12 @@
}
},
"node_modules/@rolldown/binding-linux-ppc64-gnu": {
- "version": "1.0.0-rc.18",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.0-rc.18.tgz",
- "integrity": "sha512-ugCOyj7a4d9h3q9B+wXmf6g3a68UsjGh6dob5DHevHGMwDUbhsYNbSPxJsENcIttJZ9jv7qGM2UesLw5jqIhdg==",
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.3.tgz",
+ "integrity": "sha512-5f1laC0SlIR0yDbFCd8acUhvJIag6N3zC5P7oUPN6wX0aOma+uKJ0wBDH5aq7I1PVI2ttTlhJwzwRIBnLiSGEg==",
"cpu": [
"ppc64"
],
- "dev": true,
"libc": [
"glibc"
],
@@ -1290,13 +1318,12 @@
}
},
"node_modules/@rolldown/binding-linux-s390x-gnu": {
- "version": "1.0.0-rc.18",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.0-rc.18.tgz",
- "integrity": "sha512-kKWRhbsotpXkGbcd5dllUWg5gEXcDAa8u5YnP9AV5DYNbvJHGzzuwv7dpmhc8NqKMJldl0a+x76IHbspEpEmdA==",
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.3.tgz",
+ "integrity": "sha512-Iq4ko0r4XsgbrF/LunNgHtAGLRRVE2kXonAXQ/MV0mC6jQpMOhW1SvtZja2EhC/kd05++bP78dsqBeIQyYJ6Yg==",
"cpu": [
"s390x"
],
- "dev": true,
"libc": [
"glibc"
],
@@ -1310,13 +1337,12 @@
}
},
"node_modules/@rolldown/binding-linux-x64-gnu": {
- "version": "1.0.0-rc.18",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-rc.18.tgz",
- "integrity": "sha512-uCo8ElcCIAMyYAZyuIZ81oFkhTSIllNvUCHCAlbhlN4ji3uC28h7IIdlXyIvGO7HsuqnV9p3rD/bpH7XhIyhRw==",
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.3.tgz",
+ "integrity": "sha512-B8m6tD5+/N5FeNQFbKlLA/2yVq9ycQP1SeedyEYYKWBNR3ZQbkvIUcNnDNM03lO1l5F2roiiFJGgvoLLyZXtSg==",
"cpu": [
"x64"
],
- "dev": true,
"libc": [
"glibc"
],
@@ -1330,13 +1356,12 @@
}
},
"node_modules/@rolldown/binding-linux-x64-musl": {
- "version": "1.0.0-rc.18",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-rc.18.tgz",
- "integrity": "sha512-XNOQZtuE6yUIvx4rwGemwh8kpL1xvU41FXy/s9K7T/3JVcqGzo3NfKM2HrbrGgfPYGFW42f07Wk++aOC6B9NWA==",
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.3.tgz",
+ "integrity": "sha512-pSdpdUJHkuCxun9LE7jvgUB9qsRgaiyNNCX7m/AvHTcq67AiT/Yhoxvw5zPfhrM8k/BfP8ce/hMOpthKDpEUow==",
"cpu": [
"x64"
],
- "dev": true,
"libc": [
"musl"
],
@@ -1350,13 +1375,12 @@
}
},
"node_modules/@rolldown/binding-openharmony-arm64": {
- "version": "1.0.0-rc.18",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-rc.18.tgz",
- "integrity": "sha512-tSn/kzrfa7tNOXr7sEacDBN4YsIqTyLqh45IO0nHDwtpKIDNDJr+VFojt+4klSpChxB29JLyduSsE0MKEwa65A==",
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.3.tgz",
+ "integrity": "sha512-OXXS3RKJgX2uLwM+gYyuH5omcH8fL1LJs96pZGgtetVCahON57+d4SJHzTgZiOjxgGkSnpXpOsWuPDGAKAigEg==",
"cpu": [
"arm64"
],
- "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -1367,13 +1391,12 @@
}
},
"node_modules/@rolldown/binding-wasm32-wasi": {
- "version": "1.0.0-rc.18",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-rc.18.tgz",
- "integrity": "sha512-+J9YGmc+czgqlhYmwun3S3O0FIZhsH8ep2456xwjAdIOmuJxM7xz4P4PtrxU+Bz17a/5bqPA8o3HAAoX0teUdg==",
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.3.tgz",
+ "integrity": "sha512-JTtb8BWFynicNSoPrehsCzBtOKjZ6jhMiPFEmOiuXg1Fl8dn2KHQob+GuPSGR0dryQa1PQJbzjF3dqO/whhjLg==",
"cpu": [
"wasm32"
],
- "dev": true,
"license": "MIT",
"optional": true,
"dependencies": {
@@ -1386,13 +1409,12 @@
}
},
"node_modules/@rolldown/binding-win32-arm64-msvc": {
- "version": "1.0.0-rc.18",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-rc.18.tgz",
- "integrity": "sha512-zsu47DgU0FQzSwi6sU9dZoEdUv7pc1AptSEz/Z8HBg54sV0Pbs3N0+CrIbTsgiu6EyoaNN9CHboqbLaz9lhOyQ==",
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.3.tgz",
+ "integrity": "sha512-gEdFFEN70A/jxb2svrWsN3aDL7OUtmvlOy+6fa2jxG8K0wQ1ZbdeLGnidov6Yu5/733dI5ySfzFlQ/cb0bSz1g==",
"cpu": [
"arm64"
],
- "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -1403,13 +1425,12 @@
}
},
"node_modules/@rolldown/binding-win32-x64-msvc": {
- "version": "1.0.0-rc.18",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-rc.18.tgz",
- "integrity": "sha512-7H+3yqGgmnlDTRRhw/xpYY9J1kf4GC681nVc4GqKhExZTDrVVrV2tsOR9kso0fvgBdcTCcQShx4SLLoHgaLwhg==",
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.3.tgz",
+ "integrity": "sha512-eXB7CHuaQdqmJcc3koCNtNPmT/bj2gc999kUFgBxG8Ac0NdgXc4rkCHhqrgrhN3zddvvvrgzj1e90SuSfmyIXA==",
"cpu": [
"x64"
],
- "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -1420,56 +1441,56 @@
}
},
"node_modules/@rolldown/pluginutils": {
- "version": "1.0.0-rc.13",
- "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.13.tgz",
- "integrity": "sha512-3ngTAv6F/Py35BsYbeeLeecvhMKdsKm4AoOETVhAA+Qc8nrA2I0kF7oa93mE9qnIurngOSpMnQ0x2nQY2FPviA==",
- "dev": true,
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz",
+ "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==",
+ "devOptional": true,
"license": "MIT"
},
"node_modules/@tailwindcss/node": {
- "version": "4.2.4",
- "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.2.4.tgz",
- "integrity": "sha512-Ai7+yQPxz3ddrDQzFfBKdHEVBg0w3Zl83jnjuwxnZOsnH9pGn93QHQtpU0p/8rYWxvbFZHneni6p1BSLK4DkGA==",
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.3.1.tgz",
+ "integrity": "sha512-6NDaqRoAMSXD1mr/RXu0HBvNE9a2n5tHPsxu9XHLws8o4Twes5rBM2205SUUiJ9goAtadrN6xTGX0UDEwp/N4A==",
"dev": true,
"license": "MIT",
"dependencies": {
"@jridgewell/remapping": "^2.3.5",
- "enhanced-resolve": "^5.19.0",
- "jiti": "^2.6.1",
+ "enhanced-resolve": "5.21.6",
+ "jiti": "^2.7.0",
"lightningcss": "1.32.0",
"magic-string": "^0.30.21",
"source-map-js": "^1.2.1",
- "tailwindcss": "4.2.4"
+ "tailwindcss": "4.3.1"
}
},
"node_modules/@tailwindcss/oxide": {
- "version": "4.2.4",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.2.4.tgz",
- "integrity": "sha512-9El/iI069DKDSXwTvB9J4BwdO5JhRrOweGaK25taBAvBXyXqJAX+Jqdvs8r8gKpsI/1m0LeJLyQYTf/WLrBT1Q==",
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.3.1.tgz",
+ "integrity": "sha512-yVPyo8RNkabVr3O2EhHEE0Rewu7YKzc1DhIqfL46LKveFrmu9XbDazNOJY7/GRuvw1h6u3utWnR29H/p5JPlgA==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 20"
},
"optionalDependencies": {
- "@tailwindcss/oxide-android-arm64": "4.2.4",
- "@tailwindcss/oxide-darwin-arm64": "4.2.4",
- "@tailwindcss/oxide-darwin-x64": "4.2.4",
- "@tailwindcss/oxide-freebsd-x64": "4.2.4",
- "@tailwindcss/oxide-linux-arm-gnueabihf": "4.2.4",
- "@tailwindcss/oxide-linux-arm64-gnu": "4.2.4",
- "@tailwindcss/oxide-linux-arm64-musl": "4.2.4",
- "@tailwindcss/oxide-linux-x64-gnu": "4.2.4",
- "@tailwindcss/oxide-linux-x64-musl": "4.2.4",
- "@tailwindcss/oxide-wasm32-wasi": "4.2.4",
- "@tailwindcss/oxide-win32-arm64-msvc": "4.2.4",
- "@tailwindcss/oxide-win32-x64-msvc": "4.2.4"
+ "@tailwindcss/oxide-android-arm64": "4.3.1",
+ "@tailwindcss/oxide-darwin-arm64": "4.3.1",
+ "@tailwindcss/oxide-darwin-x64": "4.3.1",
+ "@tailwindcss/oxide-freebsd-x64": "4.3.1",
+ "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.1",
+ "@tailwindcss/oxide-linux-arm64-gnu": "4.3.1",
+ "@tailwindcss/oxide-linux-arm64-musl": "4.3.1",
+ "@tailwindcss/oxide-linux-x64-gnu": "4.3.1",
+ "@tailwindcss/oxide-linux-x64-musl": "4.3.1",
+ "@tailwindcss/oxide-wasm32-wasi": "4.3.1",
+ "@tailwindcss/oxide-win32-arm64-msvc": "4.3.1",
+ "@tailwindcss/oxide-win32-x64-msvc": "4.3.1"
}
},
"node_modules/@tailwindcss/oxide-android-arm64": {
- "version": "4.2.4",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.2.4.tgz",
- "integrity": "sha512-e7MOr1SAn9U8KlZzPi1ZXGZHeC5anY36qjNwmZv9pOJ8E4Q6jmD1vyEHkQFmNOIN7twGPEMXRHmitN4zCMN03g==",
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.3.1.tgz",
+ "integrity": "sha512-SVlyf61g374l5cHyg8x9kf5xmLcOaxvOTsbsqDnSsDJaKOEFZ7GCvi84VAVGpxojYOs1+3K6M0UjXfqPU8vmOQ==",
"cpu": [
"arm64"
],
@@ -1484,9 +1505,9 @@
}
},
"node_modules/@tailwindcss/oxide-darwin-arm64": {
- "version": "4.2.4",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.2.4.tgz",
- "integrity": "sha512-tSC/Kbqpz/5/o/C2sG7QvOxAKqyd10bq+ypZNf+9Fi2TvbVbv1zNpcEptcsU7DPROaSbVgUXmrzKhurFvo5eDg==",
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.3.1.tgz",
+ "integrity": "sha512-hVnWLwv+e/l7c4WKyVtHVrIPvYdqWHjRB3MDIqARynzFtnQg85kmQEFCbV9Ja0VVx4xXTIiDWY60Y7iz/iNoDA==",
"cpu": [
"arm64"
],
@@ -1501,9 +1522,9 @@
}
},
"node_modules/@tailwindcss/oxide-darwin-x64": {
- "version": "4.2.4",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.2.4.tgz",
- "integrity": "sha512-yPyUXn3yO/ufR6+Kzv0t4fCg2qNr90jxXc5QqBpjlPNd0NqyDXcmQb/6weunH/MEDXW5dhyEi+agTDiqa3WsGg==",
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.3.1.tgz",
+ "integrity": "sha512-Cf7abu0WVgbhU7ANgPUnSAvm7nCvMweusHb8FnaHlLfv/Caq4GYaEZg7ZImzzmjx4lIAfuS8q+eLIS7A7IzxIg==",
"cpu": [
"x64"
],
@@ -1518,9 +1539,9 @@
}
},
"node_modules/@tailwindcss/oxide-freebsd-x64": {
- "version": "4.2.4",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.2.4.tgz",
- "integrity": "sha512-BoMIB4vMQtZsXdGLVc2z+P9DbETkiopogfWZKbWwM8b/1Vinbs4YcUwo+kM/KeLkX3Ygrf4/PsRndKaYhS8Eiw==",
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.3.1.tgz",
+ "integrity": "sha512-ZZqzX2Y+GXtXXfqSfpJhDm60OoZfvLHLCgm+J7NVqgHHJjG/m9ugZI77RwTsVd4fnBJuCFP6Ae6kTJb71UdS8g==",
"cpu": [
"x64"
],
@@ -1535,9 +1556,9 @@
}
},
"node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": {
- "version": "4.2.4",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.2.4.tgz",
- "integrity": "sha512-7pIHBLTHYRAlS7V22JNuTh33yLH4VElwKtB3bwchK/UaKUPpQ0lPQiOWcbm4V3WP2I6fNIJ23vABIvoy2izdwA==",
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.3.1.tgz",
+ "integrity": "sha512-/Ah/xik0LaMYfv9DZ0S/t4pBlBNYOcqtRwusjgovHkvT8ixueWCLyJjsaF5kQIckjb4IT8Q6K6p/iPmZMixYgg==",
"cpu": [
"arm"
],
@@ -1552,9 +1573,9 @@
}
},
"node_modules/@tailwindcss/oxide-linux-arm64-gnu": {
- "version": "4.2.4",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.2.4.tgz",
- "integrity": "sha512-+E4wxJ0ZGOzSH325reXTWB48l42i93kQqMvDyz5gqfRzRZ7faNhnmvlV4EPGJU3QJM/3Ab5jhJ5pCRUsKn6OQw==",
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.3.1.tgz",
+ "integrity": "sha512-gqdFoVJlw444GvpnheZLHmvTzSxI/cOUUh2KSNejQjTcYkW062SVD+En0rUgD+QV91bz1XGIGtt1HJd48xUGbQ==",
"cpu": [
"arm64"
],
@@ -1572,9 +1593,9 @@
}
},
"node_modules/@tailwindcss/oxide-linux-arm64-musl": {
- "version": "4.2.4",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.2.4.tgz",
- "integrity": "sha512-bBADEGAbo4ASnppIziaQJelekCxdMaxisrk+fB7Thit72IBnALp9K6ffA2G4ruj90G9XRS2VQ6q2bCKbfFV82g==",
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.3.1.tgz",
+ "integrity": "sha512-Bwv9KwOvE0VKa86xPFif9b9c3Y1NxOV1P0gLti/IYaWEsQYZXDlxfGEtA8mdDZ7SG3wyNXAWYT5SIn3giL57oA==",
"cpu": [
"arm64"
],
@@ -1592,9 +1613,9 @@
}
},
"node_modules/@tailwindcss/oxide-linux-x64-gnu": {
- "version": "4.2.4",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.2.4.tgz",
- "integrity": "sha512-7Mx25E4WTfnht0TVRTyC00j3i0M+EeFe7wguMDTlX4mRxafznw0CA8WJkFjWYH5BlgELd1kSjuU2JiPnNZbJDA==",
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.3.1.tgz",
+ "integrity": "sha512-Ymi8O8T15HYQdOUWUtTI6ldN0neHP85FC+Qz32xTcZ7iJXtem/x8ITev0o1e9e5rkqj4lONZfTRLvkmin1+tKg==",
"cpu": [
"x64"
],
@@ -1612,9 +1633,9 @@
}
},
"node_modules/@tailwindcss/oxide-linux-x64-musl": {
- "version": "4.2.4",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.2.4.tgz",
- "integrity": "sha512-2wwJRF7nyhOR0hhHoChc04xngV3iS+akccHTGtz965FwF0up4b2lOdo6kI1EbDaEXKgvcrFBYcYQQ/rrnWFVfA==",
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.3.1.tgz",
+ "integrity": "sha512-M+P/91qJ6uILLw4k2G93GMDRAXj61SMvFQYt39AqvUqYgExXpLL5aepfns7sj4HiAQeolirQF9E0lzRvdf4zPQ==",
"cpu": [
"x64"
],
@@ -1632,9 +1653,9 @@
}
},
"node_modules/@tailwindcss/oxide-wasm32-wasi": {
- "version": "4.2.4",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.2.4.tgz",
- "integrity": "sha512-FQsqApeor8Fo6gUEklzmaa9994orJZZDBAlQpK2Mq+DslRKFJeD6AjHpBQ0kZFQohVr8o85PPh8eOy86VlSCmw==",
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.3.1.tgz",
+ "integrity": "sha512-zsM8uOeqvVGHsAXsJxsT28ttosFahLJKCLOTUBqRAtKnVgGSRitds9T432QiT8b77Yga7JIBkulIRRlJPtYhRA==",
"bundleDependencies": [
"@napi-rs/wasm-runtime",
"@emnapi/core",
@@ -1650,11 +1671,11 @@
"license": "MIT",
"optional": true,
"dependencies": {
- "@emnapi/core": "^1.8.1",
- "@emnapi/runtime": "^1.8.1",
- "@emnapi/wasi-threads": "^1.1.0",
- "@napi-rs/wasm-runtime": "^1.1.1",
- "@tybys/wasm-util": "^0.10.1",
+ "@emnapi/core": "^1.10.0",
+ "@emnapi/runtime": "^1.10.0",
+ "@emnapi/wasi-threads": "^1.2.1",
+ "@napi-rs/wasm-runtime": "^1.1.4",
+ "@tybys/wasm-util": "^0.10.2",
"tslib": "^2.8.1"
},
"engines": {
@@ -1662,9 +1683,9 @@
}
},
"node_modules/@tailwindcss/oxide-win32-arm64-msvc": {
- "version": "4.2.4",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.2.4.tgz",
- "integrity": "sha512-L9BXqxC4ToVgwMFqj3pmZRqyHEztulpUJzCxUtLjobMCzTPsGt1Fa9enKbOpY2iIyVtaHNeNvAK8ERP/64sqGQ==",
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.3.1.tgz",
+ "integrity": "sha512-aiNvSq9BsVk8V513lDKlrCFAgf8qBMPZTpgEhInL+NwQqs97mYmupVMrPrgBBSL8Pv/0zXu9MrMF9rMun1ZeNg==",
"cpu": [
"arm64"
],
@@ -1679,9 +1700,9 @@
}
},
"node_modules/@tailwindcss/oxide-win32-x64-msvc": {
- "version": "4.2.4",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.2.4.tgz",
- "integrity": "sha512-ESlKG0EpVJQwRjXDDa9rLvhEAh0mhP1sF7sap9dNZT0yyl9SAG6T7gdP09EH0vIv0UNTlo6jPWyujD6559fZvw==",
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.3.1.tgz",
+ "integrity": "sha512-xDEyu1rg290472FEGaKHnzyDyh5QH+AlWvsU5hMoMtPpzmKlRI0jaYKCgSHDYtaQWZOYbMaduSyCwFwY4n1HmA==",
"cpu": [
"x64"
],
@@ -1696,28 +1717,28 @@
}
},
"node_modules/@tailwindcss/typography": {
- "version": "0.5.19",
- "resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.19.tgz",
- "integrity": "sha512-w31dd8HOx3k9vPtcQh5QHP9GwKcgbMp87j58qi6xgiBnFFtKEAgCWnDw4qUT8aHwkCp8bKvb/KGKWWHedP0AAg==",
+ "version": "0.5.20",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.20.tgz",
+ "integrity": "sha512-hwbzQuNUfcPvbegQFatVPl/MY/tcM9KLl963hQ5laJKPh81TEZ1+dNG9PirGvcaDBkp+BCshExAyKVPW91dozw==",
"dev": true,
"license": "MIT",
"dependencies": {
"postcss-selector-parser": "6.0.10"
},
"peerDependencies": {
- "tailwindcss": ">=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1"
+ "tailwindcss": ">=3.0.0 || >=4.0.0 || insiders"
}
},
"node_modules/@tailwindcss/vite": {
- "version": "4.2.4",
- "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.2.4.tgz",
- "integrity": "sha512-pCvohwOCspk3ZFn6eJzrrX3g4n2JY73H6MmYC87XfGPyTty4YsCjYTMArRZm/zOI8dIt3+EcrLHAFPe5A4bgtw==",
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.3.1.tgz",
+ "integrity": "sha512-hItDHuIIlEV61R+faXu66s1K36aTurO/Qw0e45Vskz57gXl9pWOT6eg3zmcEui6CZXddbN7zd41bwmvag4JGwQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@tailwindcss/node": "4.2.4",
- "@tailwindcss/oxide": "4.2.4",
- "tailwindcss": "4.2.4"
+ "@tailwindcss/node": "4.3.1",
+ "@tailwindcss/oxide": "4.3.1",
+ "tailwindcss": "4.3.1"
},
"peerDependencies": {
"vite": "^5.2.0 || ^6 || ^7 || ^8"
@@ -1727,7 +1748,6 @@
"version": "0.10.2",
"resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.2.tgz",
"integrity": "sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==",
- "dev": true,
"license": "MIT",
"optional": true,
"dependencies": {
@@ -1754,6 +1774,12 @@
"integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==",
"license": "MIT"
},
+ "node_modules/@types/jsesc": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/@types/jsesc/-/jsesc-2.5.1.tgz",
+ "integrity": "sha512-9VN+6yxLOPLOav+7PwjZbxiID2bVaeq0ED4qSQmdQTdjnXJSaCVKTR58t15oqH1H5t8Ng2ZX1SabJVoN9Q34bw==",
+ "license": "MIT"
+ },
"node_modules/@types/json-schema": {
"version": "7.0.15",
"resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
@@ -1775,15 +1801,6 @@
"dev": true,
"license": "MIT"
},
- "node_modules/@types/supercluster": {
- "version": "7.1.3",
- "resolved": "https://registry.npmjs.org/@types/supercluster/-/supercluster-7.1.3.tgz",
- "integrity": "sha512-Z0pOY34GDFl3Q6hUFYf3HkTwKEE02e7QgtJppBt+beEAxnyOpJua+voGFvxINBHa06GwLFFym7gRPY2SiKIfIA==",
- "license": "MIT",
- "dependencies": {
- "@types/geojson": "*"
- }
- },
"node_modules/@types/swagger-schema-official": {
"version": "2.0.25",
"resolved": "https://registry.npmjs.org/@types/swagger-schema-official/-/swagger-schema-official-2.0.25.tgz",
@@ -1806,17 +1823,17 @@
"license": "MIT"
},
"node_modules/@typescript-eslint/eslint-plugin": {
- "version": "8.59.2",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.59.2.tgz",
- "integrity": "sha512-j/bwmkBvHUtPNxzuWe5z6BEk3q54YRyGlBXkSsmfoih7zNrBvl5A9A98anlp/7JbyZcWIJ8KXo/3Tq/DjFLtuQ==",
+ "version": "8.61.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.61.0.tgz",
+ "integrity": "sha512-bFNvl9ZczlVb+wR2Akszf3gHfKVj/8WanXaGJ3UstTA7brNKg0cNdk6X1Psu5V7MZ2oQtzZKOEzIUehaoxbDGw==",
"dev": true,
"license": "MIT",
"dependencies": {
"@eslint-community/regexpp": "^4.12.2",
- "@typescript-eslint/scope-manager": "8.59.2",
- "@typescript-eslint/type-utils": "8.59.2",
- "@typescript-eslint/utils": "8.59.2",
- "@typescript-eslint/visitor-keys": "8.59.2",
+ "@typescript-eslint/scope-manager": "8.61.0",
+ "@typescript-eslint/type-utils": "8.61.0",
+ "@typescript-eslint/utils": "8.61.0",
+ "@typescript-eslint/visitor-keys": "8.61.0",
"ignore": "^7.0.5",
"natural-compare": "^1.4.0",
"ts-api-utils": "^2.5.0"
@@ -1829,7 +1846,7 @@
"url": "https://opencollective.com/typescript-eslint"
},
"peerDependencies": {
- "@typescript-eslint/parser": "^8.59.2",
+ "@typescript-eslint/parser": "^8.61.0",
"eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
"typescript": ">=4.8.4 <6.1.0"
}
@@ -1845,16 +1862,16 @@
}
},
"node_modules/@typescript-eslint/parser": {
- "version": "8.59.2",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.59.2.tgz",
- "integrity": "sha512-plR3pp6D+SSUn1HM7xvSkx12/DhoHInI2YF35KAcVFNZvlC0gtrWqx7Qq1oH2Ssgi0vlFRCTbP+DZc7B9+TtsQ==",
+ "version": "8.61.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.61.0.tgz",
+ "integrity": "sha512-5B7PfA2e1NQGCnDHd/0lW7W3gvp3d59Ryw54FYO8Uswxo9f6ikw3AZV+Xj/TvpImmpsiYyUqAfhC6kJID1jF6w==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@typescript-eslint/scope-manager": "8.59.2",
- "@typescript-eslint/types": "8.59.2",
- "@typescript-eslint/typescript-estree": "8.59.2",
- "@typescript-eslint/visitor-keys": "8.59.2",
+ "@typescript-eslint/scope-manager": "8.61.0",
+ "@typescript-eslint/types": "8.61.0",
+ "@typescript-eslint/typescript-estree": "8.61.0",
+ "@typescript-eslint/visitor-keys": "8.61.0",
"debug": "^4.4.3"
},
"engines": {
@@ -1870,14 +1887,14 @@
}
},
"node_modules/@typescript-eslint/project-service": {
- "version": "8.59.2",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.2.tgz",
- "integrity": "sha512-+2hqvEkeyf/0FBor67duF0Ll7Ot8jyKzDQOSrxazF/danillRq2DwR9dLptsXpoZQqxE1UisSmoZewrlPas9Vw==",
+ "version": "8.61.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.61.0.tgz",
+ "integrity": "sha512-DV42F7MLJO6Rax7SK1yg43tcnEfGUrurSpSxKuVX+a3RCTzBlH3fuxprrOJXKCJGAaw82xXocikJ0uQaqwXgGA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@typescript-eslint/tsconfig-utils": "^8.59.2",
- "@typescript-eslint/types": "^8.59.2",
+ "@typescript-eslint/tsconfig-utils": "^8.61.0",
+ "@typescript-eslint/types": "^8.61.0",
"debug": "^4.4.3"
},
"engines": {
@@ -1892,14 +1909,14 @@
}
},
"node_modules/@typescript-eslint/scope-manager": {
- "version": "8.59.2",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.2.tgz",
- "integrity": "sha512-JzfyEpEtOU89CcFSwyNS3mu4MLvLSXqnmX05+aKBDM+TdR5jzcGOEBwxwGNxrEQ7p/z6kK2WyioCGBf2zZBnvg==",
+ "version": "8.61.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.61.0.tgz",
+ "integrity": "sha512-IWdXFHFSb6mlC3HPc7QsLDm5zYEbUla6trDEHf32D3/dnuUyXd87plScSNXSbm0/RxMvObpI17sv/EDTGrGZkA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@typescript-eslint/types": "8.59.2",
- "@typescript-eslint/visitor-keys": "8.59.2"
+ "@typescript-eslint/types": "8.61.0",
+ "@typescript-eslint/visitor-keys": "8.61.0"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -1910,9 +1927,9 @@
}
},
"node_modules/@typescript-eslint/tsconfig-utils": {
- "version": "8.59.2",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.2.tgz",
- "integrity": "sha512-BKK4alN7oi4C/zv4VqHQ+uRU+lTa6JGIZ7s1juw7b3RHo9OfKB+bKX3u0iVZetdsUCBBkSbdWbarJbmN0fTeSw==",
+ "version": "8.61.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.61.0.tgz",
+ "integrity": "sha512-O5Amvdv9ztMpxpf+vmFULGG78IE6Qwdr3bCGvqwG4nwc9H2qXkOYJJnRbRHyMkQTjv1d03olqwwwzHLMqpFePQ==",
"dev": true,
"license": "MIT",
"engines": {
@@ -1927,15 +1944,15 @@
}
},
"node_modules/@typescript-eslint/type-utils": {
- "version": "8.59.2",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.59.2.tgz",
- "integrity": "sha512-nhqaj1nmTdVVl/BP5omXNRGO38jn5iosis2vbdmupF2txCf8ylWT8lx+JlvMYYVqzGVKtjojUFoQ3JRWK+mfzQ==",
+ "version": "8.61.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.61.0.tgz",
+ "integrity": "sha512-TuBiQYIkd97yBfInHCTKVYMbX4kvEmpOEuixIuzCU9p8BGT1SfyyO0d0IfDMbPIHcjn/hWnusUX5e8v5Xg+X8A==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@typescript-eslint/types": "8.59.2",
- "@typescript-eslint/typescript-estree": "8.59.2",
- "@typescript-eslint/utils": "8.59.2",
+ "@typescript-eslint/types": "8.61.0",
+ "@typescript-eslint/typescript-estree": "8.61.0",
+ "@typescript-eslint/utils": "8.61.0",
"debug": "^4.4.3",
"ts-api-utils": "^2.5.0"
},
@@ -1952,9 +1969,9 @@
}
},
"node_modules/@typescript-eslint/types": {
- "version": "8.59.2",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.2.tgz",
- "integrity": "sha512-e82GVOE8Ps3E++Egvb6Y3Dw0S10u8NkQ9KXmtRhCWJJ8kDhOJTvtMAWnFL16kB1583goCWXsr0NieKCZMs2/0Q==",
+ "version": "8.61.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.61.0.tgz",
+ "integrity": "sha512-9QTQpZ5Iin4CdIodfbDQFSeiSJKidgYJYug1P9CC2xWgUTvlmixViqDZNciMjwLBZyJnG4tGmPl97rVAFb1AJg==",
"dev": true,
"license": "MIT",
"engines": {
@@ -1966,16 +1983,16 @@
}
},
"node_modules/@typescript-eslint/typescript-estree": {
- "version": "8.59.2",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.2.tgz",
- "integrity": "sha512-o0XPGNwcWw+FIwStOWn+BwBuEmL6QXP0rsvAFg7ET1dey1Nr6Wb1ac8p5HEsK0ygO/6mUxlk+YWQD9xcb/nnXg==",
+ "version": "8.61.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.61.0.tgz",
+ "integrity": "sha512-42zatd5qSvvcV1JdDBCLxYRznvP4eIHpPoZXdkPFnAmanA4FuZ5dibSnCBggY8hQnqajPpoGjXFdZ7fIJKQnlA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@typescript-eslint/project-service": "8.59.2",
- "@typescript-eslint/tsconfig-utils": "8.59.2",
- "@typescript-eslint/types": "8.59.2",
- "@typescript-eslint/visitor-keys": "8.59.2",
+ "@typescript-eslint/project-service": "8.61.0",
+ "@typescript-eslint/tsconfig-utils": "8.61.0",
+ "@typescript-eslint/types": "8.61.0",
+ "@typescript-eslint/visitor-keys": "8.61.0",
"debug": "^4.4.3",
"minimatch": "^10.2.2",
"semver": "^7.7.3",
@@ -1994,16 +2011,16 @@
}
},
"node_modules/@typescript-eslint/utils": {
- "version": "8.59.2",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.59.2.tgz",
- "integrity": "sha512-Juw3EinkXqjaffxz6roowvV7GZT/kET5vSKKZT6upl5TXdWkLkYmNPXwDDL2Vkt2DPn0nODIS4egC/0AGxKo/Q==",
+ "version": "8.61.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.61.0.tgz",
+ "integrity": "sha512-3bzFt7ImFMW/jVYwJamDoe/dMOdFLSC6pom6rRjdh4SZJEYupyMzem8e7vKZLclLfpHjlwSAXOUxtKxGXUiLqA==",
"dev": true,
"license": "MIT",
"dependencies": {
"@eslint-community/eslint-utils": "^4.9.1",
- "@typescript-eslint/scope-manager": "8.59.2",
- "@typescript-eslint/types": "8.59.2",
- "@typescript-eslint/typescript-estree": "8.59.2"
+ "@typescript-eslint/scope-manager": "8.61.0",
+ "@typescript-eslint/types": "8.61.0",
+ "@typescript-eslint/typescript-estree": "8.61.0"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -2018,13 +2035,13 @@
}
},
"node_modules/@typescript-eslint/visitor-keys": {
- "version": "8.59.2",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.2.tgz",
- "integrity": "sha512-NwjLUnGy8/Zfx23fl50tRC8rYaYnM52xNRYFAXvmiil9yh1+K6aRVQMnzW6gQB/1DLgWt977lYQn7C+wtgXZiA==",
+ "version": "8.61.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.61.0.tgz",
+ "integrity": "sha512-QVLZu3ZPQEE+HICQyAMZ2yLQhxf0meY/wx6Hx14YcTNj13JB3qHlX3lJ02L3fLGHgERRH71kvYDwiXIguT3AjQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@typescript-eslint/types": "8.59.2",
+ "@typescript-eslint/types": "8.61.0",
"eslint-visitor-keys": "^5.0.0"
},
"engines": {
@@ -2049,13 +2066,13 @@
}
},
"node_modules/@vitejs/plugin-vue": {
- "version": "6.0.6",
- "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-6.0.6.tgz",
- "integrity": "sha512-u9HHgfrq3AjXlysn0eINFnWQOJQLO9WN6VprZ8FXl7A2bYisv3Hui9Ij+7QZ41F/WYWarHjwBbXtD7dKg3uxbg==",
+ "version": "6.0.7",
+ "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-6.0.7.tgz",
+ "integrity": "sha512-km+p+XdSz9Sxm5rqUbqcSfZYaAniKxWBj1KURl+Jr7UaPvvX7BmaWMdP69I5rrFDeQGyxAG7NXdc57vz+snhWg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@rolldown/pluginutils": "1.0.0-rc.13"
+ "@rolldown/pluginutils": "^1.0.1"
},
"engines": {
"node": "^20.19.0 || >=22.12.0"
@@ -2122,53 +2139,53 @@
}
},
"node_modules/@vue/compiler-core": {
- "version": "3.5.34",
- "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.34.tgz",
- "integrity": "sha512-s9cLyK5mLcvZ4Agva5QgRsQyLKvts9WbU9DB6NqiZkkGEdwmcEiylj5Jbwkp680drF/NNCV8OlAJSe+yMLxaJw==",
+ "version": "3.5.38",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.38.tgz",
+ "integrity": "sha512-s99aGxWYig9ErHbct27KXEGhrBYlRI6c4MwAgXErOAbX9xiW37/uMa+XUDO69zLz83dng8UUZ70CTOJrLrYrEQ==",
"license": "MIT",
"dependencies": {
- "@babel/parser": "^7.29.3",
- "@vue/shared": "3.5.34",
+ "@babel/parser": "^7.29.7",
+ "@vue/shared": "3.5.38",
"entities": "^7.0.1",
"estree-walker": "^2.0.2",
"source-map-js": "^1.2.1"
}
},
"node_modules/@vue/compiler-dom": {
- "version": "3.5.34",
- "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.34.tgz",
- "integrity": "sha512-EbF/T++k0e2MMZlJsBhzK8Sgwt0HcIPOhzn1CTB/lv6sQcyk+OWf8YeiLxZp3ro7MbbLcAfAJ6sEvjFWuNgUCw==",
+ "version": "3.5.38",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.38.tgz",
+ "integrity": "sha512-JTqp25l8aFfJYF7/KmsXZjAxJz7T+SjmTJLoXVjHtc2BrSgSiW2n9Aem/cWq1OPe68A8JL06B3eVdhlP0H4TVw==",
"license": "MIT",
"dependencies": {
- "@vue/compiler-core": "3.5.34",
- "@vue/shared": "3.5.34"
+ "@vue/compiler-core": "3.5.38",
+ "@vue/shared": "3.5.38"
}
},
"node_modules/@vue/compiler-sfc": {
- "version": "3.5.34",
- "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.34.tgz",
- "integrity": "sha512-D/ihr6uZeIt6r+pVZf46RWT1fAsLFMbUP7k8G1VkiiWexriED9GrX3echHd4Abbt17zjlfiFJ8z7a3BxZOPNjg==",
+ "version": "3.5.38",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.38.tgz",
+ "integrity": "sha512-DuA2GiZawSEW442iw/9+Fkol8hTgb4Ke5KkhmSry65QA7YuyMbIdy8p0XZRMvNwJdgRz307W8g1CSzdvS4nuNg==",
"license": "MIT",
"dependencies": {
- "@babel/parser": "^7.29.3",
- "@vue/compiler-core": "3.5.34",
- "@vue/compiler-dom": "3.5.34",
- "@vue/compiler-ssr": "3.5.34",
- "@vue/shared": "3.5.34",
+ "@babel/parser": "^7.29.7",
+ "@vue/compiler-core": "3.5.38",
+ "@vue/compiler-dom": "3.5.38",
+ "@vue/compiler-ssr": "3.5.38",
+ "@vue/shared": "3.5.38",
"estree-walker": "^2.0.2",
"magic-string": "^0.30.21",
- "postcss": "^8.5.14",
+ "postcss": "^8.5.15",
"source-map-js": "^1.2.1"
}
},
"node_modules/@vue/compiler-ssr": {
- "version": "3.5.34",
- "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.34.tgz",
- "integrity": "sha512-cDtTHKibkThKGHH1SP+WdccquNRYQDFH6rRjQCqT9G2ltFAfoR5pUftpab/z+aM5mW9HLLVQW7hfKKQe/1GBeQ==",
+ "version": "3.5.38",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.38.tgz",
+ "integrity": "sha512-7s+W5Gc42FGxZMcuwl8H5B29T8BJPMdBT7KHFE+BbAuZ/iTEdTtv7z2XiMjiaUUw4w3ZcCEdHs36RuYJ2VA7bA==",
"license": "MIT",
"dependencies": {
- "@vue/compiler-dom": "3.5.34",
- "@vue/shared": "3.5.34"
+ "@vue/compiler-dom": "3.5.38",
+ "@vue/shared": "3.5.38"
}
},
"node_modules/@vue/devtools-api": {
@@ -2220,15 +2237,15 @@
}
},
"node_modules/@vue/eslint-config-typescript": {
- "version": "14.7.0",
- "resolved": "https://registry.npmjs.org/@vue/eslint-config-typescript/-/eslint-config-typescript-14.7.0.tgz",
- "integrity": "sha512-iegbMINVc+seZ/QxtzWiOBozctrHiF2WvGedruu2EbLujg9VuU0FQiNcN2z1ycuaoKKpF4m2qzB5HDEMKbxtIg==",
+ "version": "14.8.0",
+ "resolved": "https://registry.npmjs.org/@vue/eslint-config-typescript/-/eslint-config-typescript-14.8.0.tgz",
+ "integrity": "sha512-yIquzhXH7ZsrwSSm+rYvoGCRY6wcuF4qBi76e0l7hHLq7YU0f9aC+RcR5fL+XJNfmBZxgX5cVl4sppt4x7ZCBg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@typescript-eslint/utils": "^8.56.0",
+ "@typescript-eslint/utils": "^8.60.0",
"fast-glob": "^3.3.3",
- "typescript-eslint": "^8.56.0",
+ "typescript-eslint": "^8.60.0",
"vue-eslint-parser": "^10.4.0"
},
"engines": {
@@ -2246,16 +2263,16 @@
}
},
"node_modules/@vue/language-core": {
- "version": "3.2.8",
- "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-3.2.8.tgz",
- "integrity": "sha512-9OiSPQFiAAWNVnXb0d2dcTmcKnFQamhuNES6ayyISrb/mwPWVgoGdAqSfCWqKhQpa3D5gDTcYD+w7ObiheZ81g==",
+ "version": "3.3.5",
+ "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-3.3.5.tgz",
+ "integrity": "sha512-UkKu5nhX89fg4VhlG/FOeI10G3cj/7radKT/cy9BT4Q9qJmJlSTAc/dP63Xqs29aypN4f39xUV6PsLNk/dcD6g==",
"dev": true,
"license": "MIT",
"dependencies": {
"@volar/language-core": "2.4.28",
"@vue/compiler-dom": "^3.5.0",
"@vue/shared": "^3.5.0",
- "alien-signals": "^3.1.2",
+ "alien-signals": "^3.2.0",
"muggle-string": "^0.4.1",
"path-browserify": "^1.0.1",
"picomatch": "^4.0.4"
@@ -2275,53 +2292,53 @@
}
},
"node_modules/@vue/reactivity": {
- "version": "3.5.34",
- "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.34.tgz",
- "integrity": "sha512-y9XDjCEuBp+98k+UL5dbYkh57AHU4o6cxZedOPXw3bmrZZYLQsVHguGurq7hVrPCSrQtrnz1f9dssyFr+dMXfQ==",
+ "version": "3.5.38",
+ "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.38.tgz",
+ "integrity": "sha512-pG6LV/NDNRbKizcUjFFLAfjaL8mcv4DmR9avNcUw2gDHBzZneuS2TWCmp633ynzxz9YYKNeEPK2I8Wraqy2HUQ==",
"license": "MIT",
"dependencies": {
- "@vue/shared": "3.5.34"
+ "@vue/shared": "3.5.38"
}
},
"node_modules/@vue/runtime-core": {
- "version": "3.5.34",
- "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.34.tgz",
- "integrity": "sha512-mKeBYvu8tcMSLhypAHBmriUFfWXKTCF/23Z4jiCoYK3UtWepkliViNLuR90V9XOyD62mUxs9p1jsrpK3CCGIzw==",
+ "version": "3.5.38",
+ "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.38.tgz",
+ "integrity": "sha512-iyW8WVfF1CpCXxncZY5Ei6rSd6oZr5DgEom//fUjRBRl56AXPD+s9ATvukRt77ZFTuYlnVA1bxY+dJB94tWVYw==",
"license": "MIT",
"dependencies": {
- "@vue/reactivity": "3.5.34",
- "@vue/shared": "3.5.34"
+ "@vue/reactivity": "3.5.38",
+ "@vue/shared": "3.5.38"
}
},
"node_modules/@vue/runtime-dom": {
- "version": "3.5.34",
- "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.34.tgz",
- "integrity": "sha512-e8kZzERmCwUnBRVsgSQlAfrfU2rGoy0FFKPBXSlfEjc/O3KfA7QP0t1/2ZylrbchjmIKB4dPTd07A6WPr0eOrg==",
+ "version": "3.5.38",
+ "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.38.tgz",
+ "integrity": "sha512-apX2wt9sdfDshS+a2xueFZLVpt0GkRJZSoPmrW/SA4yzXTznhfcMVW59gr7h4YQeY0vJhdJkk2rsIDwgfFgC5A==",
"license": "MIT",
"dependencies": {
- "@vue/reactivity": "3.5.34",
- "@vue/runtime-core": "3.5.34",
- "@vue/shared": "3.5.34",
+ "@vue/reactivity": "3.5.38",
+ "@vue/runtime-core": "3.5.38",
+ "@vue/shared": "3.5.38",
"csstype": "^3.2.3"
}
},
"node_modules/@vue/server-renderer": {
- "version": "3.5.34",
- "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.34.tgz",
- "integrity": "sha512-nHxmJoTrKsmrkbILRhkC9gY1G3moZbJTqCzDd7DOOzG5KH9oeJ0Unqrff5f9v0pW//jES05ZkJcNtfE8JjOIew==",
+ "version": "3.5.38",
+ "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.38.tgz",
+ "integrity": "sha512-vue8vbf2QlV4quHqzwmJy6dWfmRhP1J8l4wtZg60CL6VoKqcPY2oe7may3+1d9qfpedjK5PRLFqd5k3Isj9mUw==",
"license": "MIT",
"dependencies": {
- "@vue/compiler-ssr": "3.5.34",
- "@vue/shared": "3.5.34"
+ "@vue/compiler-ssr": "3.5.38",
+ "@vue/shared": "3.5.38"
},
"peerDependencies": {
- "vue": "3.5.34"
+ "vue": "3.5.38"
}
},
"node_modules/@vue/shared": {
- "version": "3.5.34",
- "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.34.tgz",
- "integrity": "sha512-24uqU4OIiX29ryC3MeWid/Xf2fa2EFRUVLb77nRhk+UrTVrh/XiGtFAFmJBAtBRbjwNdsPRP+jj/OL27Eg1NDA==",
+ "version": "3.5.38",
+ "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.38.tgz",
+ "integrity": "sha512-FTW0AFZNaK5/mOqvGBwVfUlNLU38TiQn4+DQgIFUnrBBJQ1crMJ82yeGQLV5jyKFsO8yRukpbuP7x+nRbH6aug==",
"license": "MIT"
},
"node_modules/@vuepic/vue-datepicker": {
@@ -2381,9 +2398,9 @@
}
},
"node_modules/acorn": {
- "version": "8.16.0",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz",
- "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==",
+ "version": "8.17.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.17.0.tgz",
+ "integrity": "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==",
"license": "MIT",
"bin": {
"acorn": "bin/acorn"
@@ -2402,6 +2419,18 @@
"acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
}
},
+ "node_modules/agent-base": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
+ "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
+ "license": "MIT",
+ "dependencies": {
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 6.0.0"
+ }
+ },
"node_modules/ajv": {
"version": "6.15.0",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz",
@@ -2420,9 +2449,9 @@
}
},
"node_modules/alien-signals": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/alien-signals/-/alien-signals-3.1.2.tgz",
- "integrity": "sha512-d9dYqZTS90WLiU0I5c6DHj/HcKkF8ZyGN3G5x8wSbslulz70KOxaqCT0hQCo9KOyhVqzqGojvNdJXoTumZOtcw==",
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/alien-signals/-/alien-signals-3.2.1.tgz",
+ "integrity": "sha512-I8FjmltrfnDFoZedi5CG8DghVYNhzb/Ijluz7tCSJH0xpd0484Kowhbb1XDYOxfJpU1p5wnM2X54dA+IfGyD1g==",
"dev": true,
"license": "MIT"
},
@@ -2453,9 +2482,9 @@
}
},
"node_modules/apexcharts": {
- "version": "5.11.0",
- "resolved": "https://registry.npmjs.org/apexcharts/-/apexcharts-5.11.0.tgz",
- "integrity": "sha512-iIXnZ1DhndVgY4G5fmAbyUtGBTR5j4LlMEb561eAd4+wkJB7wJXXKLMr9u+4V5aQEPXeVYWgkAbuw9Y1z6MIrg==",
+ "version": "5.15.0",
+ "resolved": "https://registry.npmjs.org/apexcharts/-/apexcharts-5.15.0.tgz",
+ "integrity": "sha512-ATswoiZi8wynKcwqf0eyE0Is5mBQoDpxZN3PlSVy41OrD+9GMBp2kZQRjyGK+5/j0GFjHkuAd7GKOrt5VMoPrw==",
"license": "SEE LICENSE IN LICENSE"
},
"node_modules/argparse": {
@@ -2482,13 +2511,14 @@
}
},
"node_modules/ast-walker-scope": {
- "version": "0.8.3",
- "resolved": "https://registry.npmjs.org/ast-walker-scope/-/ast-walker-scope-0.8.3.tgz",
- "integrity": "sha512-cbdCP0PGOBq0ASG+sjnKIoYkWMKhhz+F/h9pRexUdX2Hd38+WOlBkRKlqkGOSm0YQpcFMQBJeK4WspUAkwsEdg==",
+ "version": "0.9.0",
+ "resolved": "https://registry.npmjs.org/ast-walker-scope/-/ast-walker-scope-0.9.0.tgz",
+ "integrity": "sha512-IJdzo2vLiElBxKzwS36VsCue/62d6IdWjnPB2v3nuPKeWGynp6FF/CYoLa5i/3jXH/z97ZDdsXz6abpgM6w07A==",
"license": "MIT",
"dependencies": {
- "@babel/parser": "^7.28.4",
- "ast-kit": "^2.1.3"
+ "@babel/parser": "^7.29.2",
+ "@babel/types": "^7.29.0",
+ "ast-kit": "^2.2.0"
},
"engines": {
"node": ">=20.19.0"
@@ -2540,13 +2570,14 @@
}
},
"node_modules/axios": {
- "version": "1.16.0",
- "resolved": "https://registry.npmjs.org/axios/-/axios-1.16.0.tgz",
- "integrity": "sha512-6hp5CwvTPlN2A31g5dxnwAX0orzM7pmCRDLnZSX772mv8WDqICwFjowHuPs04Mc8deIld1+ejhtaMn5vp6b+1w==",
+ "version": "1.17.0",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-1.17.0.tgz",
+ "integrity": "sha512-J8SwNxprqqpbfenehxWYXE7CW+wM1BB4w3+N+g+/Wx40xM4rsLrfPmHHxSWIxJLYDgSY/HqlFPIYb2/S3rxafw==",
"license": "MIT",
"dependencies": {
"follow-redirects": "^1.16.0",
"form-data": "^4.0.5",
+ "https-proxy-agent": "^5.0.1",
"proxy-from-env": "^2.1.0"
}
},
@@ -2561,9 +2592,9 @@
}
},
"node_modules/baseline-browser-mapping": {
- "version": "2.10.28",
- "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.28.tgz",
- "integrity": "sha512-Ic44hnOtFIgravCunj1ifSoQPSUrkNiJuH9Mf6jr2jjoA74icqV8wU0KuadXeOR8zuIJMOoTv0GuQjZ9ZYNMeA==",
+ "version": "2.10.37",
+ "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.37.tgz",
+ "integrity": "sha512-girxaJ7WZssDOFhzCGZTDKoTa1gk6A1TbflaYTpykLJ4UU9Fz9kx1aREM8JCuoVHbL8X8T/mJg7w2oYSq72Oig==",
"license": "Apache-2.0",
"bin": {
"baseline-browser-mapping": "dist/cli.cjs"
@@ -2702,22 +2733,6 @@
}
}
},
- "node_modules/c12/node_modules/chokidar": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz",
- "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "readdirp": "^5.0.0"
- },
- "engines": {
- "node": ">= 20.19.0"
- },
- "funding": {
- "url": "https://paulmillr.com/funding/"
- }
- },
"node_modules/c12/node_modules/perfect-debounce": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-2.1.0.tgz",
@@ -2725,20 +2740,6 @@
"dev": true,
"license": "MIT"
},
- "node_modules/c12/node_modules/readdirp": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz",
- "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 20.19.0"
- },
- "funding": {
- "type": "individual",
- "url": "https://paulmillr.com/funding/"
- }
- },
"node_modules/call-bind-apply-helpers": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
@@ -2760,9 +2761,9 @@
"license": "MIT"
},
"node_modules/caniuse-lite": {
- "version": "1.0.30001792",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001792.tgz",
- "integrity": "sha512-hVLMUZFgR4JJ6ACt1uEESvQN1/dBVqPAKY0hgrV70eN3391K6juAfTjKZLKvOMsx8PxA7gsY1/tLMMTcfFLLpw==",
+ "version": "1.0.30001799",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001799.tgz",
+ "integrity": "sha512-hG1bReV+OUU+MOqK4t/ZWI0tZOyz3rqS9XuhOUz1cIcbwBKjOyJEJuw9ER5JuNyqxNk8u/JUVbGibBOL1yrjFw==",
"funding": [
{
"type": "opencollective",
@@ -2802,16 +2803,15 @@
}
},
"node_modules/chokidar": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz",
- "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==",
- "dev": true,
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz",
+ "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==",
"license": "MIT",
"dependencies": {
- "readdirp": "^4.0.1"
+ "readdirp": "^5.0.0"
},
"engines": {
- "node": ">= 14.16.0"
+ "node": ">= 20.19.0"
},
"funding": {
"url": "https://paulmillr.com/funding/"
@@ -2960,9 +2960,9 @@
"license": "MIT"
},
"node_modules/daisyui": {
- "version": "5.5.19",
- "resolved": "https://registry.npmjs.org/daisyui/-/daisyui-5.5.19.tgz",
- "integrity": "sha512-pbFAkl1VCEh/MPCeclKL61I/MqRIFFhNU7yiXoDDRapXN4/qNCoMxeCCswyxEEhqL5eiTTfwHvucFtOE71C9sA==",
+ "version": "5.5.23",
+ "resolved": "https://registry.npmjs.org/daisyui/-/daisyui-5.5.23.tgz",
+ "integrity": "sha512-xuheNUSL4T6ZVtWXoioqcNkjoyGX85QTDz4HTw2aBPfqk4fuMjax5HDo8qCmpV6M1YN8bGvfx5BpYCoDeRlt+A==",
"dev": true,
"license": "MIT",
"funding": {
@@ -2970,9 +2970,9 @@
}
},
"node_modules/date-fns": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-4.1.0.tgz",
- "integrity": "sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==",
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-4.4.0.tgz",
+ "integrity": "sha512-+1UMbeh68lH1SegH83CGWwpb6OHHbpSgr3+s5Eww5M4CAgswBpoWS0AjTOfEJ33HiYKz1hdj/KTFprzXHmq/6w==",
"license": "MIT",
"funding": {
"type": "github",
@@ -2980,9 +2980,9 @@
}
},
"node_modules/dayjs": {
- "version": "1.11.20",
- "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.20.tgz",
- "integrity": "sha512-YbwwqR/uYpeoP4pu043q+LTDLFBLApUP6VxRihdfNTqu4ubqMlGDLd6ErXhEgsyvY0K6nCs7nggYumAN+9uEuQ==",
+ "version": "1.11.21",
+ "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.21.tgz",
+ "integrity": "sha512-98IT+HOahAisibz/yjKbzuOBwYcjJ7BCLPzARyHiyEBmRz4fatF+KPJszEHXsGYjUG234aH/cOjW1wwTbKUZlA==",
"dev": true,
"license": "MIT"
},
@@ -2990,7 +2990,6 @@
"version": "4.4.3",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
"integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
- "dev": true,
"license": "MIT",
"dependencies": {
"ms": "^2.1.3"
@@ -3037,16 +3036,16 @@
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
"integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==",
- "dev": true,
+ "devOptional": true,
"license": "Apache-2.0",
"engines": {
"node": ">=8"
}
},
"node_modules/dompurify": {
- "version": "3.4.2",
- "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.4.2.tgz",
- "integrity": "sha512-lHeS9SA/IKeIFFyYciHBr2n0v1VMPlSj843HdLOwjb2OxNwdq9Xykxqhk+FE42MzAdHvInbAolSE4mhahPpjXA==",
+ "version": "3.4.10",
+ "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.4.10.tgz",
+ "integrity": "sha512-0xzNv0e7oYC6yyuOGZIABPM4qtg3QxLFniDNPP4ZP90wR8Yq3zgwpRbrNiT4N3IKqDbbYFEJLV+JWEs19aZ//w==",
"dev": true,
"license": "(MPL-2.0 OR Apache-2.0)",
"optionalDependencies": {
@@ -3087,9 +3086,9 @@
"license": "ISC"
},
"node_modules/electron-to-chromium": {
- "version": "1.5.352",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.352.tgz",
- "integrity": "sha512-9wHk8x6dyuimoe18EdiDPWKExNdxYqo4fn4FwOVVper6RxT3cmpBwBkWWfSOCYJjQdIco/nPhJhNLmn4Ufg1Yg==",
+ "version": "1.5.372",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.372.tgz",
+ "integrity": "sha512-M3yhbAlilnwqC8D21t28UCDGHyitShTmmLRU/H+b74P6Ski16Nb9HONYEaVpMj/pwC7BEo5B95FpjODLCWbtfA==",
"license": "ISC"
},
"node_modules/emoji-regex": {
@@ -3100,9 +3099,9 @@
"license": "MIT"
},
"node_modules/enhanced-resolve": {
- "version": "5.21.2",
- "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.21.2.tgz",
- "integrity": "sha512-xe9vQb5kReirPUxgQrXA3ihgbCqssmTiM7cOZ+Gzu+VeGWgpV98lLZvp0dl4yriyAePcewxGUs9UpKD8PET9KQ==",
+ "version": "5.21.6",
+ "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.21.6.tgz",
+ "integrity": "sha512-aNnGCvbJ/RIyWo1IuhNdVjnNF+EjH9wpzpNHt+ci/m9He9LJvUN8wrCcXjp9cWsGNAuvSpVFTx/vraAFQ8qGjQ==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -3144,9 +3143,9 @@
}
},
"node_modules/es-object-atoms": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
- "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz",
+ "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==",
"license": "MIT",
"dependencies": {
"es-errors": "^1.3.0"
@@ -3171,9 +3170,9 @@
}
},
"node_modules/es-toolkit": {
- "version": "1.46.1",
- "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.46.1.tgz",
- "integrity": "sha512-5eNtXOs3tbfxXOj04tjjseeWkRWaoCjdEI+96DgwzZoe6c9juL49pXlzAFTI72aWC9Y8p7168g6XIKjh7k6pyQ==",
+ "version": "1.47.1",
+ "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.47.1.tgz",
+ "integrity": "sha512-5RAqEwf4P4E17p+W75KLOWw/nOvKZzSQpxM32IpI2KZLaVonjTrZ0Ai5ghMaVI9eKC2p8eoQgcBdkEDgzFk6+Q==",
"dev": true,
"license": "MIT",
"workspaces": [
@@ -3211,18 +3210,21 @@
}
},
"node_modules/eslint": {
- "version": "10.3.0",
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.3.0.tgz",
- "integrity": "sha512-XbEXaRva5cF0ZQB8w6MluHA0kZZfV2DuCMJ3ozyEOHLwDpZX2Lmm/7Pp0xdJmI0GL1W05VH5VwIFHEm1Vcw2gw==",
+ "version": "10.5.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.5.0.tgz",
+ "integrity": "sha512-1y+7C+vi12bUK1IpZeaV3gsH9fHLBmPvYmPx42pvT/E9yG0IC8g3PUZZgp0+JLJl7ZDK0flc2gc+Aw9dpCvIsQ==",
"dev": true,
"license": "MIT",
+ "workspaces": [
+ "packages/*"
+ ],
"dependencies": {
"@eslint-community/eslint-utils": "^4.8.0",
"@eslint-community/regexpp": "^4.12.2",
"@eslint/config-array": "^0.23.5",
- "@eslint/config-helpers": "^0.5.5",
+ "@eslint/config-helpers": "^0.6.0",
"@eslint/core": "^1.2.1",
- "@eslint/plugin-kit": "^0.7.1",
+ "@eslint/plugin-kit": "^0.7.2",
"@humanfs/node": "^0.16.6",
"@humanwhocodes/module-importer": "^1.0.1",
"@humanwhocodes/retry": "^0.4.2",
@@ -3283,14 +3285,14 @@
}
},
"node_modules/eslint-plugin-prettier": {
- "version": "5.5.5",
- "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.5.tgz",
- "integrity": "sha512-hscXkbqUZ2sPithAuLm5MXL+Wph+U7wHngPBv9OMWwlP8iaflyxpjTYZkmdgB4/vPIhemRlBEoLrH7UC1n7aUw==",
+ "version": "5.5.6",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.6.tgz",
+ "integrity": "sha512-ifetmTcxWfz+4qRW3pH/ujdTq2jQIj59AxJMIN26K5avYgU8dxycUETQonWiW+wPrYXA0j3Try0l1CnwVQtDqQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"prettier-linter-helpers": "^1.0.1",
- "synckit": "^0.11.12"
+ "synckit": "^0.11.13"
},
"engines": {
"node": "^14.18.0 || >=16.0.0"
@@ -3314,9 +3316,9 @@
}
},
"node_modules/eslint-plugin-vue": {
- "version": "10.9.1",
- "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-10.9.1.tgz",
- "integrity": "sha512-cHB0Tf4Duvzwecwd/AqWzZvF/QszE13BhjVUpVXWCy9AeMR5GjkAjP3i85vqgLgOuTmkHR1OJ5oMeqLHtuw8zg==",
+ "version": "10.9.2",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-10.9.2.tgz",
+ "integrity": "sha512-4g7ZP3pYcuqd7Zp0pzUKcos0W+RkjBz4EGdhJ92FcYk6v03Ti/GK5NwjgsjxHK+98eXDbHeK7VtX1az7/8doZA==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -3346,9 +3348,9 @@
}
},
"node_modules/eslint-plugin-vue/node_modules/postcss-selector-parser": {
- "version": "7.1.1",
- "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz",
- "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==",
+ "version": "7.1.4",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.4.tgz",
+ "integrity": "sha512-HeP7D2wyhkR+XaK6v4W8oRF62Dsz4flyuczALJp61GckGm42u1saSSJ/0auvcBqxs3jMRFEcPK34At/0JBKdOg==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -3683,16 +3685,16 @@
}
},
"node_modules/form-data": {
- "version": "4.0.5",
- "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz",
- "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==",
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.6.tgz",
+ "integrity": "sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==",
"license": "MIT",
"dependencies": {
"asynckit": "^0.4.0",
"combined-stream": "^1.0.8",
"es-set-tostringtag": "^2.1.0",
- "hasown": "^2.0.2",
- "mime-types": "^2.1.12"
+ "hasown": "^2.0.4",
+ "mime-types": "^2.1.35"
},
"engines": {
"node": ">= 6"
@@ -3715,7 +3717,6 @@
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
"integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
- "dev": true,
"hasInstallScript": true,
"license": "MIT",
"optional": true,
@@ -3783,9 +3784,9 @@
}
},
"node_modules/giget": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/giget/-/giget-3.2.0.tgz",
- "integrity": "sha512-GvHTWcykIR/fP8cj8dMpuMMkvaeJfPvYnhq0oW+chSeIr+ldX21ifU2Ms6KBoyKZQZmVaUAAhQ2EZ68KJF8a7A==",
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/giget/-/giget-3.3.0.tgz",
+ "integrity": "sha512-gzi2D96p+AMfDcmJHGDj3KJ9NRiwvlFAU5yfa3ROwWZmFUjX4P43x3BcyRaOMMLto1vUo7C+86+MFhYTl6Ryiw==",
"dev": true,
"license": "MIT",
"bin": {
@@ -3877,9 +3878,9 @@
}
},
"node_modules/hasown": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.3.tgz",
- "integrity": "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==",
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz",
+ "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==",
"license": "MIT",
"dependencies": {
"function-bind": "^1.1.2"
@@ -3901,6 +3902,19 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/https-proxy-agent": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
+ "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
+ "license": "MIT",
+ "dependencies": {
+ "agent-base": "6",
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
"node_modules/ignore": {
"version": "5.3.2",
"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
@@ -3912,10 +3926,10 @@
}
},
"node_modules/immutable": {
- "version": "5.1.5",
- "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.5.tgz",
- "integrity": "sha512-t7xcm2siw+hlUM68I+UEOK+z84RzmN59as9DZ7P1l0994DKUWV7UXBMQZVxaoMSRQ+PBZbHCOoBt7a2wxOMt+A==",
- "dev": true,
+ "version": "5.1.6",
+ "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.6.tgz",
+ "integrity": "sha512-q1swsS8K7L8usSHuOqF2TAoCCkonYz0SG38wLAggaa4Wml70zixIvt2ql4coQ2C2B3hTjltJry4r6bULwgAXLQ==",
+ "devOptional": true,
"license": "MIT"
},
"node_modules/imurmurhash": {
@@ -3932,7 +3946,7 @@
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
"integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
- "dev": true,
+ "devOptional": true,
"license": "MIT",
"engines": {
"node": ">=0.10.0"
@@ -3952,7 +3966,7 @@
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
"integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
- "dev": true,
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"is-extglob": "^2.1.1"
@@ -3994,17 +4008,27 @@
"version": "2.7.0",
"resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz",
"integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==",
- "dev": true,
+ "devOptional": true,
"license": "MIT",
"bin": {
"jiti": "lib/jiti-cli.mjs"
}
},
"node_modules/js-yaml": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz",
- "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==",
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.2.0.tgz",
+ "integrity": "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==",
"dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/puzrin"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/nodeca"
+ }
+ ],
"license": "MIT",
"dependencies": {
"argparse": "^2.0.1"
@@ -4065,9 +4089,9 @@
}
},
"node_modules/kdbush": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/kdbush/-/kdbush-4.0.2.tgz",
- "integrity": "sha512-WbCVYJ27Sz8zi9Q7Q0xHC+05iwkm3Znipc2XTlrnJbsHMYktW4hPhXUE8Ys1engBrvffoSCqbil1JQAa7clRpA==",
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/kdbush/-/kdbush-4.1.0.tgz",
+ "integrity": "sha512-e9vurzrXJQrFX6ckpHP3bvj5l+9CnYzkxDNnNQ1h2QTqdWsUAJgXiKdGNcOa1EY85dU8KbQ+z/FdQdB7P+9yfQ==",
"license": "ISC"
},
"node_modules/keyv": {
@@ -4152,7 +4176,7 @@
"version": "1.32.0",
"resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz",
"integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==",
- "dev": true,
+ "devOptional": true,
"license": "MPL-2.0",
"dependencies": {
"detect-libc": "^2.0.3"
@@ -4185,7 +4209,6 @@
"cpu": [
"arm64"
],
- "dev": true,
"license": "MPL-2.0",
"optional": true,
"os": [
@@ -4206,7 +4229,6 @@
"cpu": [
"arm64"
],
- "dev": true,
"license": "MPL-2.0",
"optional": true,
"os": [
@@ -4227,7 +4249,6 @@
"cpu": [
"x64"
],
- "dev": true,
"license": "MPL-2.0",
"optional": true,
"os": [
@@ -4248,7 +4269,6 @@
"cpu": [
"x64"
],
- "dev": true,
"license": "MPL-2.0",
"optional": true,
"os": [
@@ -4269,7 +4289,6 @@
"cpu": [
"arm"
],
- "dev": true,
"license": "MPL-2.0",
"optional": true,
"os": [
@@ -4290,7 +4309,6 @@
"cpu": [
"arm64"
],
- "dev": true,
"libc": [
"glibc"
],
@@ -4314,7 +4332,6 @@
"cpu": [
"arm64"
],
- "dev": true,
"libc": [
"musl"
],
@@ -4338,7 +4355,6 @@
"cpu": [
"x64"
],
- "dev": true,
"libc": [
"glibc"
],
@@ -4362,7 +4378,6 @@
"cpu": [
"x64"
],
- "dev": true,
"libc": [
"musl"
],
@@ -4386,7 +4401,6 @@
"cpu": [
"arm64"
],
- "dev": true,
"license": "MPL-2.0",
"optional": true,
"os": [
@@ -4407,7 +4421,6 @@
"cpu": [
"x64"
],
- "dev": true,
"license": "MPL-2.0",
"optional": true,
"os": [
@@ -4422,9 +4435,9 @@
}
},
"node_modules/local-pkg": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-1.1.2.tgz",
- "integrity": "sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==",
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-1.2.1.tgz",
+ "integrity": "sha512-++gUqRDEvcnN6Zhqrr+y/CkVEHhlrR96vZn3nZZPYzMcBUyBtTKzB9NadClFIsIVSsu+3i9tfk/erqy9kAmt7Q==",
"license": "MIT",
"dependencies": {
"mlly": "^1.7.4",
@@ -4465,6 +4478,7 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/lucide-vue-next/-/lucide-vue-next-1.0.0.tgz",
"integrity": "sha512-V6SPvx1IHTj/UY+FrIYWV5faISsPSb8BnWSFDxAtezWKvWc9ZZ40PDrdu1/Qb5vg4lHWr1hs1BAMGVGm6V1Xdg==",
+ "deprecated": "Package deprecated. Please use @lucide/vue instead.",
"license": "ISC",
"peerDependencies": {
"vue": ">=3.0.1"
@@ -4538,9 +4552,9 @@
}
},
"node_modules/marked": {
- "version": "18.0.3",
- "resolved": "https://registry.npmjs.org/marked/-/marked-18.0.3.tgz",
- "integrity": "sha512-7VT90JOkDeaRWpfjOReRGPEKn0ecdARBkDGL+tT1wZY0efPPqkUxLUSmzy/C7TIylQYJC9STISEsCHrqb/7VIA==",
+ "version": "18.0.5",
+ "resolved": "https://registry.npmjs.org/marked/-/marked-18.0.5.tgz",
+ "integrity": "sha512-S6GcvALHg6K4ohtu4E7x0a1AqhAjp6cV8KhLSyN9qVapnzJkusVBxZRcIU9AeYsbe6P1hKDusSbEOzGyyuce6w==",
"license": "MIT",
"bin": {
"marked": "bin/marked.js"
@@ -4667,7 +4681,6 @@
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
- "dev": true,
"license": "MIT"
},
"node_modules/muggle-string": {
@@ -4711,7 +4724,6 @@
"version": "7.1.1",
"resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz",
"integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==",
- "dev": true,
"license": "MIT",
"optional": true
},
@@ -4760,10 +4772,13 @@
}
},
"node_modules/node-releases": {
- "version": "2.0.38",
- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.38.tgz",
- "integrity": "sha512-3qT/88Y3FbH/Kx4szpQQ4HzUbVrHPKTLVpVocKiLfoYvw9XSGOX2FmD2d6DrXbVYyAQTF2HeF6My8jmzx7/CRw==",
- "license": "MIT"
+ "version": "2.0.47",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.47.tgz",
+ "integrity": "sha512-Uzmd6LXpouKo8EUK68IjH4+E01w/hXyV3R3g/geCJo+rXLNfh1xucB+LOzYEOQPSiUK3h/xZf0cQGcSsmyL2Og==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ }
},
"node_modules/notyf": {
"version": "3.10.0",
@@ -4993,9 +5008,9 @@
"license": "MIT"
},
"node_modules/pbf": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/pbf/-/pbf-4.0.1.tgz",
- "integrity": "sha512-SuLdBvS42z33m8ejRbInMapQe8n0D3vN/Xd5fmWM3tufNgRQFBpaW2YVJxQZV4iPNqb0vEFvssMEo5w9c6BTIA==",
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/pbf/-/pbf-4.0.2.tgz",
+ "integrity": "sha512-J0ajxARhZfpUEebxYs1vhMGMuLSXtBe1e+fFPDrf2uA2hgo+UshKfNUWOz92HJNz6/NFEXseQPddnHkTreWRqg==",
"license": "BSD-3-Clause",
"dependencies": {
"resolve-protobuf-schema": "^2.1.0"
@@ -5093,9 +5108,9 @@
}
},
"node_modules/postcss": {
- "version": "8.5.14",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.14.tgz",
- "integrity": "sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg==",
+ "version": "8.5.15",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz",
+ "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==",
"funding": [
{
"type": "opencollective",
@@ -5112,7 +5127,7 @@
],
"license": "MIT",
"dependencies": {
- "nanoid": "^3.3.11",
+ "nanoid": "^3.3.12",
"picocolors": "^1.1.1",
"source-map-js": "^1.2.1"
},
@@ -5157,9 +5172,9 @@
}
},
"node_modules/prettier": {
- "version": "3.8.3",
- "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.3.tgz",
- "integrity": "sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw==",
+ "version": "3.8.4",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.4.tgz",
+ "integrity": "sha512-N2MylSdi48+5N/6S5j+maeHbUSIzzZ5uOcX5Hm4QpV8Dkb1HFjfAKTKX6yNPJQD9AhcT3ifHNB66tWTTJDi11Q==",
"dev": true,
"license": "MIT",
"bin": {
@@ -5282,13 +5297,12 @@
}
},
"node_modules/readdirp": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz",
- "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==",
- "dev": true,
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz",
+ "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==",
"license": "MIT",
"engines": {
- "node": ">= 14.18.0"
+ "node": ">= 20.19.0"
},
"funding": {
"type": "individual",
@@ -5352,14 +5366,14 @@
"license": "MIT"
},
"node_modules/rolldown": {
- "version": "1.0.0-rc.18",
- "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-rc.18.tgz",
- "integrity": "sha512-phmyKBpuBdRYDf4hgyynGAYn/rDDe+iZXKVJ7WX5b1zQzpLkP5oJRPGsfJuHdzPMlyyEO/4sPW6yfSx2gf7lVg==",
- "dev": true,
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.3.tgz",
+ "integrity": "sha512-i00lAJ2ks1BYr7rjNjKC7BcqAS7nVfiT3QX1SI5aY+AFHblCmaUf9OE9dbdzDvW6dJxbi2ZCZiy9v3CcwOiX3g==",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
- "@oxc-project/types": "=0.128.0",
- "@rolldown/pluginutils": "1.0.0-rc.18"
+ "@oxc-project/types": "=0.133.0",
+ "@rolldown/pluginutils": "^1.0.0"
},
"bin": {
"rolldown": "bin/cli.mjs"
@@ -5368,29 +5382,22 @@
"node": "^20.19.0 || >=22.12.0"
},
"optionalDependencies": {
- "@rolldown/binding-android-arm64": "1.0.0-rc.18",
- "@rolldown/binding-darwin-arm64": "1.0.0-rc.18",
- "@rolldown/binding-darwin-x64": "1.0.0-rc.18",
- "@rolldown/binding-freebsd-x64": "1.0.0-rc.18",
- "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-rc.18",
- "@rolldown/binding-linux-arm64-gnu": "1.0.0-rc.18",
- "@rolldown/binding-linux-arm64-musl": "1.0.0-rc.18",
- "@rolldown/binding-linux-ppc64-gnu": "1.0.0-rc.18",
- "@rolldown/binding-linux-s390x-gnu": "1.0.0-rc.18",
- "@rolldown/binding-linux-x64-gnu": "1.0.0-rc.18",
- "@rolldown/binding-linux-x64-musl": "1.0.0-rc.18",
- "@rolldown/binding-openharmony-arm64": "1.0.0-rc.18",
- "@rolldown/binding-wasm32-wasi": "1.0.0-rc.18",
- "@rolldown/binding-win32-arm64-msvc": "1.0.0-rc.18",
- "@rolldown/binding-win32-x64-msvc": "1.0.0-rc.18"
- }
- },
- "node_modules/rolldown/node_modules/@rolldown/pluginutils": {
- "version": "1.0.0-rc.18",
- "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.18.tgz",
- "integrity": "sha512-CUY5Mnhe64xQBGZEEXQ5WyZwsc1JU3vAZLIxtrsBt3LO6UOb+C8GunVKqe9sT8NeWb4lqSaoJtp2xo6GxT1MNw==",
- "dev": true,
- "license": "MIT"
+ "@rolldown/binding-android-arm64": "1.0.3",
+ "@rolldown/binding-darwin-arm64": "1.0.3",
+ "@rolldown/binding-darwin-x64": "1.0.3",
+ "@rolldown/binding-freebsd-x64": "1.0.3",
+ "@rolldown/binding-linux-arm-gnueabihf": "1.0.3",
+ "@rolldown/binding-linux-arm64-gnu": "1.0.3",
+ "@rolldown/binding-linux-arm64-musl": "1.0.3",
+ "@rolldown/binding-linux-ppc64-gnu": "1.0.3",
+ "@rolldown/binding-linux-s390x-gnu": "1.0.3",
+ "@rolldown/binding-linux-x64-gnu": "1.0.3",
+ "@rolldown/binding-linux-x64-musl": "1.0.3",
+ "@rolldown/binding-openharmony-arm64": "1.0.3",
+ "@rolldown/binding-wasm32-wasi": "1.0.3",
+ "@rolldown/binding-win32-arm64-msvc": "1.0.3",
+ "@rolldown/binding-win32-x64-msvc": "1.0.3"
+ }
},
"node_modules/run-parallel": {
"version": "1.2.0",
@@ -5417,13 +5424,13 @@
}
},
"node_modules/sass": {
- "version": "1.99.0",
- "resolved": "https://registry.npmjs.org/sass/-/sass-1.99.0.tgz",
- "integrity": "sha512-kgW13M54DUB7IsIRM5LvJkNlpH+WhMpooUcaWGFARkF1Tc82v9mIWkCbCYf+MBvpIUBSeSOTilpZjEPr2VYE6Q==",
- "dev": true,
+ "version": "1.101.0",
+ "resolved": "https://registry.npmjs.org/sass/-/sass-1.101.0.tgz",
+ "integrity": "sha512-OL3GoQyoUdDt843DpVmDO6y2k1sc5IhUDSpu8XucEI+35neq5QivZ1iuegnpraEVTJXlQGK1gl27zKcTLEPbQw==",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
- "chokidar": "^4.0.0",
+ "chokidar": "^5.0.0",
"immutable": "^5.1.5",
"source-map-js": ">=0.6.2 <2.0.0"
},
@@ -5431,7 +5438,7 @@
"sass": "sass.js"
},
"engines": {
- "node": ">=14.0.0"
+ "node": ">=20.19.0"
},
"optionalDependencies": {
"@parcel/watcher": "^2.4.1"
@@ -5444,9 +5451,9 @@
"license": "MIT"
},
"node_modules/semver": {
- "version": "7.7.4",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
- "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
+ "version": "7.8.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.4.tgz",
+ "integrity": "sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==",
"dev": true,
"license": "ISC",
"bin": {
@@ -5585,15 +5592,6 @@
"node": ">=8"
}
},
- "node_modules/supercluster": {
- "version": "8.0.1",
- "resolved": "https://registry.npmjs.org/supercluster/-/supercluster-8.0.1.tgz",
- "integrity": "sha512-IiOea5kJ9iqzD2t7QJq/cREyLHTtSmUT6gQsweojg9WH2sYJqZK9SswTu6jrscO6D1G5v5vYZ9ru/eq85lXeZQ==",
- "license": "ISC",
- "dependencies": {
- "kdbush": "^4.0.2"
- }
- },
"node_modules/superjson": {
"version": "2.2.6",
"resolved": "https://registry.npmjs.org/superjson/-/superjson-2.2.6.tgz",
@@ -5614,32 +5612,31 @@
"license": "ISC"
},
"node_modules/swagger-typescript-api": {
- "version": "13.9.0",
- "resolved": "https://registry.npmjs.org/swagger-typescript-api/-/swagger-typescript-api-13.9.0.tgz",
- "integrity": "sha512-IrAWVx9BE5ihkrAqwU7sMoAJxbcyukxhuBPLcJ+2207HEarJiwgbxSOZLKb/gsT06KMRGcE+9rOxBqx+c2ICmw==",
+ "version": "13.12.2",
+ "resolved": "https://registry.npmjs.org/swagger-typescript-api/-/swagger-typescript-api-13.12.2.tgz",
+ "integrity": "sha512-HRLF0FYxJ5bRJ5FCClvgOXC+RtKDuk+/moH8qfcw0SoIRZO4Tzle4trkglpx+1f5PkqkU1qlPNlhTTLUGRWdxA==",
"dev": true,
"license": "MIT",
"dependencies": {
"@apidevtools/swagger-parser": "12.1.0",
"@biomejs/js-api": "4.0.0",
- "@biomejs/wasm-nodejs": "2.4.14",
+ "@biomejs/wasm-nodejs": "2.4.16",
"@types/swagger-schema-official": "^2.0.25",
- "c12": "^3.3.3",
- "citty": "^0.2.1",
+ "c12": "^3.3.4",
+ "citty": "^0.2.2",
"consola": "^3.4.2",
- "es-toolkit": "^1.44.0",
+ "es-toolkit": "^1.47.0",
"eta": "^3.5.0",
- "nanoid": "^5.1.6",
+ "nanoid": "^5.1.11",
"openapi-types": "^12.1.3",
"swagger-schema-official": "2.0.0-bab6bed",
"swagger2openapi": "^7.0.8",
- "type-fest": "^5.4.4",
- "typescript": "~6.0.2",
- "yaml": "^2.8.2",
+ "type-fest": "^5.7.0",
+ "typescript": "^6.0.3",
+ "yaml": "^2.9.0",
"yummies": "7.19.4"
},
"bin": {
- "sta": "dist/cli.mjs",
"swagger-typescript-api": "dist/cli.mjs"
},
"engines": {
@@ -5704,13 +5701,13 @@
}
},
"node_modules/synckit": {
- "version": "0.11.12",
- "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.12.tgz",
- "integrity": "sha512-Bh7QjT8/SuKUIfObSXNHNSK6WHo6J1tHCqJsuaFDP7gP0fkzSfTxI8y85JrppZ0h8l0maIgc2tfuZQ6/t3GtnQ==",
+ "version": "0.11.13",
+ "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.13.tgz",
+ "integrity": "sha512-eNRKgb3z66Yp3D2CixVujOUvXLFUTij/zVnV8KRyvFdQwpz7I5DS8UfRkTeLzb64u+dkzDSdelE24izu+zSSUg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@pkgr/core": "^0.2.9"
+ "@pkgr/core": "^0.3.6"
},
"engines": {
"node": "^14.18.0 || >=16.0.0"
@@ -5733,9 +5730,9 @@
}
},
"node_modules/tailwind-merge": {
- "version": "3.5.0",
- "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.5.0.tgz",
- "integrity": "sha512-I8K9wewnVDkL1NTGoqWmVEIlUcB9gFriAEkXkfCjX5ib8ezGxtR3xD7iZIxrfArjEsH7F1CHD4RFUtxefdqV/A==",
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.6.0.tgz",
+ "integrity": "sha512-uxL7qAVQriqRQPAyK3pj66VqskWqoZ37PW94jwOTwNfq/z9oyu1V+eqrZqtR2+fCiXdYOZe/Modt8GtvqNzu+w==",
"dev": true,
"license": "MIT",
"funding": {
@@ -5744,9 +5741,9 @@
}
},
"node_modules/tailwindcss": {
- "version": "4.2.4",
- "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.2.4.tgz",
- "integrity": "sha512-HhKppgO81FQof5m6TEnuBWCZGgfRAWbaeOaGT00KOy/Pf/j6oUihdvBpA7ltCeAvZpFhW3j0PTclkxsd4IXYDA==",
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.1.tgz",
+ "integrity": "sha512-hk+TB1m+K8CYNrP6rjQaq/Y+4Zylwpa87mLYBKCunwnnQ9p+fHb7kmSfGqyEJoxF/O6CDyABWVFEafNSYKll+Q==",
"dev": true,
"license": "MIT"
},
@@ -5765,9 +5762,9 @@
}
},
"node_modules/tinyglobby": {
- "version": "0.2.16",
- "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz",
- "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==",
+ "version": "0.2.17",
+ "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz",
+ "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==",
"license": "MIT",
"dependencies": {
"fdir": "^6.5.0",
@@ -5852,7 +5849,6 @@
"version": "2.8.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
- "dev": true,
"license": "0BSD",
"optional": true
},
@@ -5870,9 +5866,9 @@
}
},
"node_modules/type-fest": {
- "version": "5.6.0",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.6.0.tgz",
- "integrity": "sha512-8ZiHFm91orbSAe2PSAiSVBVko18pbhbiB3U9GglSzF/zCGkR+rxpHx6sEMCUm4kxY4LjDIUGgCfUMtwfZfjfUA==",
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.7.0.tgz",
+ "integrity": "sha512-1URUxUqfHFM1c+zfSPsa3gnkO7Aq21qyH75SIduNYz4SzY964rn1X2vCMQaHSHhktiw+0kPa2iyb6PUpXqB6Vg==",
"dev": true,
"license": "(MIT OR CC0-1.0)",
"dependencies": {
@@ -5900,16 +5896,16 @@
}
},
"node_modules/typescript-eslint": {
- "version": "8.59.2",
- "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.59.2.tgz",
- "integrity": "sha512-pJw051uomb3ZeCzGTpRb8RbEqB5Y4WWet8gl/GcTlU35BSx0PVdZ86/bqkQCyKKuraVQEK7r6kBHQXF+fBhkoQ==",
+ "version": "8.61.0",
+ "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.61.0.tgz",
+ "integrity": "sha512-8y31Rd0eGTrDKqhy6vT0HtzhN+YLjQizwX3aA3hPXP/ynSfnrBXcQY5IzsP9/DM7+klX4IUncZZjkchP0z+rUw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@typescript-eslint/eslint-plugin": "8.59.2",
- "@typescript-eslint/parser": "8.59.2",
- "@typescript-eslint/typescript-estree": "8.59.2",
- "@typescript-eslint/utils": "8.59.2"
+ "@typescript-eslint/eslint-plugin": "8.61.0",
+ "@typescript-eslint/parser": "8.61.0",
+ "@typescript-eslint/typescript-estree": "8.61.0",
+ "@typescript-eslint/utils": "8.61.0"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -6031,17 +6027,17 @@
"license": "MIT"
},
"node_modules/vite": {
- "version": "8.0.11",
- "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.11.tgz",
- "integrity": "sha512-Jz1mxtUBR5xTT65VOdJZUUeoyLtqljmFkiUXhPTLZka3RDc9vpi/xXkyrnsdRcm2lIi3l3GPMnAidTsEGIj3Ow==",
- "dev": true,
+ "version": "8.0.16",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.16.tgz",
+ "integrity": "sha512-h9bXPmJichP5fLmVQo3PyaGSDE2n3aPuomeAlVRm0JLmt4rY6zmPKd59HYI4LNW8oTK7tlTsuC7l/m7awx9Jcw==",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"lightningcss": "^1.32.0",
"picomatch": "^4.0.4",
- "postcss": "^8.5.14",
- "rolldown": "1.0.0-rc.18",
- "tinyglobby": "^0.2.16"
+ "postcss": "^8.5.15",
+ "rolldown": "1.0.3",
+ "tinyglobby": "^0.2.17"
},
"bin": {
"vite": "bin/vite.js"
@@ -6123,7 +6119,7 @@
"version": "4.0.4",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz",
"integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==",
- "dev": true,
+ "devOptional": true,
"license": "MIT",
"engines": {
"node": ">=12"
@@ -6140,16 +6136,16 @@
"license": "MIT"
},
"node_modules/vue": {
- "version": "3.5.34",
- "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.34.tgz",
- "integrity": "sha512-WdLBG9gm02OgJIG9axd5Hpx0TFLdzVgfG2evFFu8Rur5O/IoGc5cMjnjh3tPL6GnRGsYvUhBSKVPYVcxRKpMCA==",
+ "version": "3.5.38",
+ "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.38.tgz",
+ "integrity": "sha512-vAMKHfImQlYSy0C+PBue4s3ERZ2xGKfgZg5GXAsLInq1dyh2H78ILVP5sK0KPFPVW4kv+OGCIvBEondcjpZp7A==",
"license": "MIT",
"dependencies": {
- "@vue/compiler-dom": "3.5.34",
- "@vue/compiler-sfc": "3.5.34",
- "@vue/runtime-dom": "3.5.34",
- "@vue/server-renderer": "3.5.34",
- "@vue/shared": "3.5.34"
+ "@vue/compiler-dom": "3.5.38",
+ "@vue/compiler-sfc": "3.5.38",
+ "@vue/runtime-dom": "3.5.38",
+ "@vue/server-renderer": "3.5.38",
+ "@vue/shared": "3.5.38"
},
"peerDependencies": {
"typescript": "*"
@@ -6161,9 +6157,9 @@
}
},
"node_modules/vue-eslint-parser": {
- "version": "10.4.0",
- "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-10.4.0.tgz",
- "integrity": "sha512-Vxi9pJdbN3ZnVGLODVtZ7y4Y2kzAAE2Cm0CZ3ZDRvydVYxZ6VrnBhLikBsRS+dpwj4Jv4UCv21PTEwF5rQ9WXg==",
+ "version": "10.4.1",
+ "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-10.4.1.tgz",
+ "integrity": "sha512-Gk6gRDj0n/fkRa3C3l0bBheoBckUq/Rs0F/TvMWIS6nzzx67amAViMe9CkNgsP2tXyQONvGiHQESHwFtZ3aYDA==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -6198,37 +6194,38 @@
}
},
"node_modules/vue-router": {
- "version": "5.0.6",
- "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-5.0.6.tgz",
- "integrity": "sha512-9+kmUTGbKMyW9Asoy98IXXYIzrTMT7JDAdpDDeEkorHvybpUvBI2wsrSM5jFOXrFydpzRFJ9vAh+80DN2PGu9w==",
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-5.1.0.tgz",
+ "integrity": "sha512-HAbiLzLEHQwxPgvsbOJDAwtavszEgLwri6XfyrsPECIFez8+59xc9LofWVdc/HEaSRT822lJ8H9Ns38VVond5g==",
"license": "MIT",
"dependencies": {
- "@babel/generator": "^7.28.6",
+ "@babel/generator": "^8.0.0-rc.4",
"@vue-macros/common": "^3.1.1",
- "@vue/devtools-api": "^8.0.6",
- "ast-walker-scope": "^0.8.3",
+ "@vue/devtools-api": "^8.1.2",
+ "ast-walker-scope": "^0.9.0",
"chokidar": "^5.0.0",
"json5": "^2.2.3",
"local-pkg": "^1.1.2",
"magic-string": "^0.30.21",
- "mlly": "^1.8.0",
+ "mlly": "^1.8.2",
"muggle-string": "^0.4.1",
"pathe": "^2.0.3",
"picomatch": "^4.0.3",
"scule": "^1.3.0",
- "tinyglobby": "^0.2.15",
+ "tinyglobby": "^0.2.16",
"unplugin": "^3.0.0",
"unplugin-utils": "^0.3.1",
- "yaml": "^2.8.2"
+ "yaml": "^2.9.0"
},
"funding": {
"url": "https://github.com/sponsors/posva"
},
"peerDependencies": {
"@pinia/colada": ">=0.21.2",
- "@vue/compiler-sfc": "^3.5.17",
+ "@vue/compiler-sfc": "^3.5.34",
"pinia": "^3.0.4",
- "vue": "^3.5.0"
+ "vite": "^7.0.0 || ^8.0.0",
+ "vue": "^3.5.34"
},
"peerDependenciesMeta": {
"@pinia/colada": {
@@ -6239,6 +6236,9 @@
},
"pinia": {
"optional": true
+ },
+ "vite": {
+ "optional": true
}
}
},
@@ -6269,21 +6269,6 @@
"integrity": "sha512-X9RyVFYAdkBe4IUf5v48TxBF/6QPmF8CmWrDAjXzfUHrgQ/HGfTC1A6TqgXqZ03ye66l3AD51BAGD69IvKM9sw==",
"license": "MIT"
},
- "node_modules/vue-router/node_modules/chokidar": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz",
- "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==",
- "license": "MIT",
- "dependencies": {
- "readdirp": "^5.0.0"
- },
- "engines": {
- "node": ">= 20.19.0"
- },
- "funding": {
- "url": "https://paulmillr.com/funding/"
- }
- },
"node_modules/vue-router/node_modules/perfect-debounce": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-2.1.0.tgz",
@@ -6302,28 +6287,15 @@
"url": "https://github.com/sponsors/jonschlinkert"
}
},
- "node_modules/vue-router/node_modules/readdirp": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz",
- "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==",
- "license": "MIT",
- "engines": {
- "node": ">= 20.19.0"
- },
- "funding": {
- "type": "individual",
- "url": "https://paulmillr.com/funding/"
- }
- },
"node_modules/vue-tsc": {
- "version": "3.2.8",
- "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-3.2.8.tgz",
- "integrity": "sha512-27vTLJ6Q2370obOd0PFYoYoKnmXJ521uUIedrs3Zhhhg/8YG10VOCMmwt+JQslatpAMTDbnWiitLnoD5VlIvog==",
+ "version": "3.3.5",
+ "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-3.3.5.tgz",
+ "integrity": "sha512-Rzh/G2MmNlMSAMTiQEjDrsb4dgB/jbtEM47rVN2NtidF1dfb/q4w4QvpQBtW5+y3y5H27Hjh7deVwk+YB02fNg==",
"dev": true,
"license": "MIT",
"dependencies": {
"@volar/typescript": "2.4.28",
- "@vue/language-core": "3.2.8"
+ "@vue/language-core": "3.3.5"
},
"bin": {
"vue-tsc": "bin/vue-tsc.js"
@@ -6436,9 +6408,9 @@
}
},
"node_modules/yaml": {
- "version": "2.8.4",
- "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.4.tgz",
- "integrity": "sha512-ml/JPOj9fOQK8RNnWojA67GbZ0ApXAUlN2UQclwv2eVgTgn7O9gg9o7paZWKMp4g0H3nTLtS9LVzhkpOFIKzog==",
+ "version": "2.9.0",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz",
+ "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==",
"license": "ISC",
"bin": {
"yaml": "bin.mjs"
diff --git a/resources/tailwind-app/components/Stats/AdvancedStats.vue b/resources/tailwind-app/components/Stats/AdvancedStats.vue
index 011e8fec4..0a68915b0 100644
--- a/resources/tailwind-app/components/Stats/AdvancedStats.vue
+++ b/resources/tailwind-app/components/Stats/AdvancedStats.vue
@@ -1,48 +1,20 @@
@@ -102,147 +41,51 @@ function averageDistance(distanceKm: number, checkins: number) {
-
{{ trans('stats.checkins', {}, 'Check-ins') }}
+
+ {{ trans('stats.checkins') }}
+
{{ data!.summary.total_checkins }}
-
{{ trans('stats.total-distance', {}, 'Total Distance') }}
+
+ {{ trans('stats.total-distance') }}
+
{{ data!.summary.total_distance_km }} km
-
{{ trans('stats.mean-distance', {}, 'Mean Distance') }}
+
+ {{ trans('stats.mean-distance') }}
+
{{ data!.summary.mean_distance_km }} km
-
{{ trans('stats.travel-days', {}, 'Travel Days') }}
+
+ {{ trans('stats.travel-days') }}
+
{{ data!.summary.active_days }}
-
{{ trans('stats.extremes', {}, 'Extremes') }}
-
-
-
{{ trans('stats.longest-ride', {}, 'Longest Ride') }}
-
{{ data!.summary.longest_ride.distance_km }} km
-
- {{ data!.summary.longest_ride.origin ?? '?' }} → {{ data!.summary.longest_ride.destination ?? '?' }}
-
-
{{ formatDate(data!.summary.longest_ride.departure) }}
-
- {{ data!.summary.longest_ride.operator }}
-
-
-
-
-
-
{{ trans('stats.shortest-ride', {}, 'Shortest Ride') }}
-
{{ data!.summary.shortest_ride.distance_km }} km
-
- {{ data!.summary.shortest_ride.origin ?? '?' }} → {{ data!.summary.shortest_ride.destination ?? '?' }}
-
-
{{ formatDate(data!.summary.shortest_ride.departure) }}
-
- {{ data!.summary.shortest_ride.operator }}
-
-
-
-
-
-
-
-
{{ trans('stats.time-comparison', {}, 'Time Comparison') }}
-
-
-
-
{{ trans('stats.last-week', {}, 'Last Week') }}
-
{{ trans('stats.checkins', {}, 'Check-ins') }}
-
{{ data!.predefined_periods.last_week.total_checkins }}
-
{{ trans('stats.distance', {}, 'Distance') }}
-
{{ data!.predefined_periods.last_week.total_distance_km }} km
-
-
-
-
-
{{ trans('stats.last-month', {}, 'Last Month') }}
-
{{ trans('stats.checkins', {}, 'Check-ins') }}
-
{{ data!.predefined_periods.last_month.total_checkins }}
-
{{ trans('stats.distance', {}, 'Distance') }}
-
{{ data!.predefined_periods.last_month.total_distance_km }} km
-
-
-
-
-
{{ trans('stats.last-year', {}, 'Last Year') }}
-
{{ trans('stats.checkins', {}, 'Check-ins') }}
-
{{ data!.predefined_periods.last_year.total_checkins }}
-
{{ trans('stats.distance', {}, 'Distance') }}
-
{{ data!.predefined_periods.last_year.total_distance_km }} km
-
-
-
-
-
-
-
-
-
{{ trans('stats.yearly-breakdown', {}, 'Yearly Breakdown') }}
-
-
-
-
-
- | {{ trans('stats.year', {}, 'Year') }} |
- {{ trans('stats.checkins', {}, 'Check-ins') }} |
- {{ trans('stats.distance', {}, 'Distance') }} |
- {{ trans('stats.avg', {}, 'Average') }} |
-
-
-
-
- | {{ getPeriodLabel(row.period, row.period_type) }} |
- {{ row.checkin_count }} |
- {{ row.distance_km }} km |
- {{ averageDistance(row.distance_km, row.checkin_count) }} km |
-
-
-
-
-
-
-
-
-
-
-
{{ trans('stats.monthly-breakdown', {}, 'Monthly Breakdown') }}
-
-
-
-
-
- | {{ trans('stats.month', {}, 'Month') }} |
- {{ trans('stats.checkins', {}, 'Check-ins') }} |
- {{ trans('stats.distance', {}, 'Distance') }} |
- {{ trans('stats.avg', {}, 'Average') }} |
-
-
-
-
- | {{ getPeriodLabel(row.period, row.period_type) }} |
- {{ row.checkin_count }} |
- {{ row.distance_km }} km |
- {{ averageDistance(row.distance_km, row.checkin_count) }} km |
-
-
-
+
+
+ {{ trans('stats.longest-ride') }}
+
+
+
+
+
+ {{ trans('stats.shortest-ride') }}
+
+
@@ -251,7 +94,7 @@ function averageDistance(distanceKm: number, checkins: number) {
-
{{ trans('stats.favorite-stations', {}, 'Favourite Stations') }}
+ {{ trans('stats.favorite-stations') }}
@@ -259,7 +102,9 @@ function averageDistance(distanceKm: number, checkins: number) {
| #{{ i + 1 }} |
{{ station.name }} |
- {{ station.count }}x |
+
+ {{ station.count }}x
+ |
@@ -270,18 +115,23 @@ function averageDistance(distanceKm: number, checkins: number) {
-
{{ trans('stats.favorite-lines', {}, 'Favourite Lines') }}
+ {{ trans('stats.favorite-lines') }}
-
+
| #{{ i + 1 }} |
{{ line.linename }}
{{ line.distance_km }} km total
|
- {{ line.count }}x |
+
+ {{ line.count }}x
+ |
@@ -292,18 +142,23 @@ function averageDistance(distanceKm: number, checkins: number) {
-
{{ trans('stats.favorite-routes', {}, 'Favourite Routes') }}
+ {{ trans('stats.favorite-routes') }}
-
+
| #{{ i + 1 }} |
{{ route.origin }} → {{ route.destination }}
{{ route.distance_km }} km total
|
- {{ route.count }}x |
+
+ {{ route.count }}x
+ |
diff --git a/resources/tailwind-app/pages/Statistics/Statistics.vue b/resources/tailwind-app/pages/Statistics/Statistics.vue
index 80917bed1..c82dedbf5 100644
--- a/resources/tailwind-app/pages/Statistics/Statistics.vue
+++ b/resources/tailwind-app/pages/Statistics/Statistics.vue
@@ -3,7 +3,7 @@ import { trans } from 'laravel-vue-i18n';
import { ChartNoAxesCombined } from 'lucide-vue-next';
import { Notyf } from 'notyf';
import { computed, inject, onMounted, ref, watch } from 'vue';
-import { Api, type StatisticsGlobalData } from '../../../types/Api.gen';
+import { Api, type StatisticsGlobalData, type StatusResource } from '../../../types/Api.gen';
import AdvancedStats from '../../components/Stats/AdvancedStats.vue';
import ChartDoughnut from '../../components/Stats/ChartDoughnut.vue';
import ChartHorizontalBar from '../../components/Stats/ChartHorizontalBar.vue';
@@ -19,101 +19,35 @@ type StatsData = {
categories: { name: string; duration: number; count: number }[];
operators: { name: string; duration: number; count: number }[];
time: { date: string; duration: number; count: number }[];
- summary: AdvancedSummary | null;
- by_period: {
- yearly: PeriodData[];
- monthly: PeriodData[];
- weekly: PeriodData[];
- };
- predefined_periods: {
- last_week: AdvancedSummary | null;
- last_month: AdvancedSummary | null;
- last_year: AdvancedSummary | null;
- } | null;
- favorites: {
- stations: { station_id: number; name: string; count: number }[];
- lines: { linename: string; number: string | null; count: number; distance_km: number }[];
- routes: {
- origin_id: number;
- origin: string;
- destination_id: number;
- destination: string;
- count: number;
- distance_km: number;
- }[];
- } | null;
};
-type RideSummary = {
- id: number;
- distance_km: number;
- departure: string;
- start: string;
- end: string;
- linename: string | null;
- number: string | null;
- operator: string | null;
- origin: string | null;
- destination: string | null;
+type PeriodData = { period: string; period_type: string; checkin_count: number; distance_km: number };
+
+type AdvancedData = {
+ summary: object | null;
+ by_period: { yearly: PeriodData[]; monthly: PeriodData[]; weekly: PeriodData[] };
+ favorites: object | null;
};
-type AdvancedSummary = {
+type PeriodSummary = {
+ labelKey: string;
+ from: string;
+ until: string;
total_checkins: number;
- active_days: number;
total_distance_km: number;
mean_distance_km: number;
- longest_ride: RideSummary | null;
- shortest_ride: RideSummary | null;
-};
-
-type PeriodData = {
- period: string;
- period_type: string;
- checkin_count: number;
- distance_km: number;
-};
-
-type AdvancedStatsApiData = {
- purpose?: { name?: string | number; duration?: number; count?: number }[];
- categories?: { name?: string; duration?: number; count?: number }[];
- operators?: { name?: string; duration?: number; count?: number }[];
- time?: { date?: string; duration?: number; count?: number }[];
- summary?: AdvancedSummary | null;
- by_period?: {
- yearly?: PeriodData[];
- monthly?: PeriodData[];
- weekly?: PeriodData[];
- };
- predefined_periods?: {
- last_week?: AdvancedSummary | null;
- last_month?: AdvancedSummary | null;
- last_year?: AdvancedSummary | null;
- } | null;
- favorites?: {
- stations?: { station_id: number; name: string; count: number }[];
- lines?: { linename: string; number: string | null; count: number; distance_km: number }[];
- routes?: {
- origin_id: number;
- origin: string;
- destination_id: number;
- destination: string;
- count: number;
- distance_km: number;
- }[];
- } | null;
+ longest_ride: StatusResource | null;
+ shortest_ride: StatusResource | null;
};
const loading = ref(true);
-const data = ref
({
- purpose: [],
- categories: [],
- operators: [],
- time: [],
+const data = ref({ purpose: [], categories: [], operators: [], time: [] });
+const advancedData = ref({
summary: null,
by_period: { yearly: [], monthly: [], weekly: [] },
- predefined_periods: null,
favorites: null,
});
+const periods = ref(null);
const globalStats = ref(null);
const globalFrom = ref(null);
const globalUntil = ref(null);
@@ -146,6 +80,7 @@ const transportKeyMap: Record = {
tram: 'transport_types.tram',
taxi: 'transport_types.taxi',
plane: 'transport_types.plane',
+ freightTrain: 'transport_types.freightTrain',
};
const purposeLabels = computed(() =>
@@ -175,8 +110,14 @@ function isPresetActive(days: number): boolean {
async function fetchStats(): Promise {
loading.value = true;
try {
- const res = await api.statistics.getStatistics({ from: fromStr.value, until: untilStr.value });
- const d = res.data.data as AdvancedStatsApiData | undefined;
+ const dateParams = { from: fromStr.value, until: untilStr.value };
+ const [mainRes, summaryRes, favoritesRes] = await Promise.all([
+ api.statistics.getStatistics(dateParams),
+ api.statistics.getStatisticsOverview(dateParams),
+ api.statistics.getStatisticsFavorites(dateParams),
+ ]);
+
+ const d = mainRes.data.data;
data.value = {
purpose: (d?.purpose ?? []).map((p) => ({
name: String(p.name ?? ''),
@@ -198,27 +139,12 @@ async function fetchStats(): Promise {
duration: t.duration ?? 0,
count: t.count ?? 0,
})),
- summary: d?.summary ?? null,
- by_period: {
- yearly: d?.by_period?.yearly ?? [],
- monthly: d?.by_period?.monthly ?? [],
- weekly: d?.by_period?.weekly ?? [],
- },
- predefined_periods: d?.predefined_periods
- ? {
- last_week: d.predefined_periods.last_week ?? null,
- last_month: d.predefined_periods.last_month ?? null,
- last_year: d.predefined_periods.last_year ?? null,
- }
- : null,
- favorites: d?.favorites
- ? {
- stations: d.favorites.stations ?? [],
- lines: d.favorites.lines ?? [],
- routes: d.favorites.routes ?? [],
- }
- : null,
};
+
+ const s = summaryRes.data.data;
+ advancedData.value.summary = s?.summary ?? null;
+
+ advancedData.value.favorites = favoritesRes.data.data ?? null;
} catch (e: unknown) {
notyf.error(e instanceof Error ? e.message : trans('generic.error'));
} finally {
@@ -226,6 +152,36 @@ async function fetchStats(): Promise {
}
}
+async function fetchPeriodStats(): Promise {
+ try {
+ const res = await api.statistics.getStatisticsHistory();
+ advancedData.value.by_period = res.data.data ?? { yearly: [], monthly: [], weekly: [] };
+ } catch {
+ // non-critical, fail silently
+ }
+}
+
+async function fetchPeriods(): Promise {
+ const now = new Date();
+ const toStr = (d: Date) => d.toISOString().split('T')[0];
+ const configs: { labelKey: string; from: string; until: string }[] = [
+ { labelKey: 'stats.last-week', from: toStr(new Date(now.getTime() - 7 * 86400000)), until: toStr(now) },
+ { labelKey: 'stats.last-month', from: toStr(new Date(now.getTime() - 30 * 86400000)), until: toStr(now) },
+ { labelKey: 'stats.last-year', from: toStr(new Date(now.getTime() - 365 * 86400000)), until: toStr(now) },
+ ];
+ try {
+ const results = await Promise.all(
+ configs.map(({ from, until }) => api.statistics.getStatisticsOverview({ from, until })),
+ );
+ periods.value = results.map((res, i) => {
+ const s = (res.data.data as { summary: PeriodSummary }).summary;
+ return { ...s, labelKey: configs[i].labelKey, from: configs[i].from, until: configs[i].until };
+ });
+ } catch {
+ // non-critical
+ }
+}
+
async function fetchGlobalStats(): Promise {
try {
const res = await api.statistics.getGlobalStatistics();
@@ -244,6 +200,39 @@ async function fetchGlobalStats(): Promise {
}
}
+const PAGE_SIZE = 5;
+const yearlyPage = ref(0);
+const monthlyPage = ref(0);
+
+const yearlyRows = computed(() =>
+ [...(advancedData.value.by_period.yearly ?? [])].sort((a, b) => b.period.localeCompare(a.period)),
+);
+const monthlyRows = computed(() =>
+ [...(advancedData.value.by_period.monthly ?? [])].sort((a, b) => b.period.localeCompare(a.period)),
+);
+const yearlyPaged = computed(() =>
+ yearlyRows.value.slice(yearlyPage.value * PAGE_SIZE, (yearlyPage.value + 1) * PAGE_SIZE),
+);
+const monthlyPaged = computed(() =>
+ monthlyRows.value.slice(monthlyPage.value * PAGE_SIZE, (monthlyPage.value + 1) * PAGE_SIZE),
+);
+const yearlyTotalPages = computed(() => Math.ceil(yearlyRows.value.length / PAGE_SIZE));
+const monthlyTotalPages = computed(() => Math.ceil(monthlyRows.value.length / PAGE_SIZE));
+
+function getPeriodLabel(period: string, periodType: string): string {
+ if (periodType === 'month') {
+ return new Date(period + '-01').toLocaleDateString(undefined, { year: 'numeric', month: 'long' });
+ }
+ if (periodType === 'week') {
+ return `${trans('stats.week-short')} ${period.split('-W')[1]}`;
+ }
+ return period;
+}
+
+function avgDistance(distanceKm: number, checkins: number): string {
+ return checkins > 0 ? (distanceKm / checkins).toFixed(2) : '0.00';
+}
+
function syncUrlParams(): void {
const url = new URL(window.location.href);
url.searchParams.set('from', fromStr.value);
@@ -273,6 +262,8 @@ watch([from, until], () => {
onMounted(() => {
readUrlParams();
fetchStats();
+ fetchPeriodStats();
+ fetchPeriods();
fetchGlobalStats();
window.addEventListener('popstate', readUrlParams);
});
@@ -287,10 +278,6 @@ onMounted(() => {
{{ trans('stats') }}
-
- {{ trans('stats.personal', { fromDate: from.toLocaleDateString(), toDate: until.toLocaleDateString() }) }}
-
-
@@ -344,7 +331,7 @@ onMounted(() => {
-
+
{
-
+
+
+
+ {{ trans('stats.breakdown') }}
+
+
+
+
+
+
{{ trans('stats.yearly-breakdown') }}
+
+
+
+
+
+ | {{ trans('stats.year') }} |
+ {{ trans('stats.checkins') }} |
+ {{ trans('stats.distance') }} |
+ {{ trans('stats.avg') }} |
+
+
+
+
+ | {{ getPeriodLabel(row.period, row.period_type) }} |
+ {{ row.checkin_count }} |
+ {{ row.distance_km }} km |
+
+ {{ avgDistance(row.distance_km, row.checkin_count) }} km
+ |
+
+
+
+
+
+
+
+ {{ yearlyPage + 1 }} / {{ yearlyTotalPages }}
+
+
+
+
+
+
+
+
+
{{ trans('stats.monthly-breakdown') }}
+
+
+
+
+
+ | {{ trans('stats.month') }} |
+ {{ trans('stats.checkins') }} |
+ {{ trans('stats.distance') }} |
+ {{ trans('stats.avg') }} |
+
+
+
+
+ | {{ getPeriodLabel(row.period, row.period_type) }} |
+ {{ row.checkin_count }} |
+ {{ row.distance_km }} km |
+
+ {{ avgDistance(row.distance_km, row.checkin_count) }} km
+ |
+
+
+
+
+
+
+
+ {{ monthlyPage + 1 }} / {{ monthlyTotalPages }}
+
+
+
+
+
+
+
+
+
+
+
+ {{ trans('stats.time-comparison') }}
+
+
+
+
+
+
+ {{ trans(period.labelKey) }}
+
+
+ {{ new Date(period.from).toLocaleDateString() }}
+ {{ trans('stats.to').toLowerCase() }}
+ {{ trans('stats.today') }}
+
+
+
+
+
{{ period.total_checkins }}
+
{{ trans('stats.checkins') }}
+
+
+
{{ period.total_distance_km }}
+
km
+
+
+
+
+
+
+
+
{{ trans('stats.global') }}
diff --git a/resources/types/Api.gen.ts b/resources/types/Api.gen.ts
index da2ef4328..8e711f7f0 100644
--- a/resources/types/Api.gen.ts
+++ b/resources/types/Api.gen.ts
@@ -6287,6 +6287,151 @@ export class Api<
format: "json",
...params,
}),
+
+ /**
+ * No description
+ *
+ * @tags Statistics
+ * @name GetStatisticsOverview
+ * @summary Get a summary of personal statistics for a date range
+ * @request GET:/statistics/overview
+ * @secure
+ */
+ getStatisticsOverview: (
+ query?: {
+ /**
+ * Start date
+ * @example "2024-01-01"
+ */
+ from?: any;
+ /**
+ * End date
+ * @example "2024-12-31"
+ */
+ until?: any;
+ },
+ params: RequestParams = {},
+ ) =>
+ this.request<
+ {
+ data?: {
+ summary?: {
+ /** @example 42 */
+ total_checkins?: number;
+ /** @example 15 */
+ active_days?: number;
+ /**
+ * @format float
+ * @example 1234.56
+ */
+ total_distance_km?: number;
+ /**
+ * @format float
+ * @example 29.39
+ */
+ mean_distance_km?: number;
+ longest_ride?: StatusResource | null;
+ shortest_ride?: StatusResource | null;
+ };
+ };
+ },
+ void
+ >({
+ path: `/statistics/overview`,
+ method: "GET",
+ query: query,
+ secure: true,
+ format: "json",
+ ...params,
+ }),
+
+ /**
+ * No description
+ *
+ * @tags Statistics
+ * @name GetStatisticsHistory
+ * @summary Get all-time checkin counts and distances grouped by year, month, and week
+ * @request GET:/statistics/history
+ * @secure
+ */
+ getStatisticsHistory: (params: RequestParams = {}) =>
+ this.request<
+ {
+ data?: {
+ yearly?: {
+ /** @example "2024" */
+ period?: string;
+ /** @example "year" */
+ period_type?: string;
+ /** @example 42 */
+ checkin_count?: number;
+ /**
+ * @format float
+ * @example 1234.56
+ */
+ distance_km?: number;
+ }[];
+ monthly?: any[];
+ weekly?: any[];
+ };
+ },
+ void
+ >({
+ path: `/statistics/history`,
+ method: "GET",
+ secure: true,
+ format: "json",
+ ...params,
+ }),
+
+ /**
+ * No description
+ *
+ * @tags Statistics
+ * @name GetStatisticsFavorites
+ * @summary Get favorite stations, lines, and routes for a date range
+ * @request GET:/statistics/favorites
+ * @secure
+ */
+ getStatisticsFavorites: (
+ query?: {
+ /**
+ * Start date
+ * @example "2024-01-01"
+ */
+ from?: any;
+ /**
+ * End date
+ * @example "2024-12-31"
+ */
+ until?: any;
+ },
+ params: RequestParams = {},
+ ) =>
+ this.request<
+ {
+ data?: {
+ stations?: {
+ /** @example 1 */
+ station_id?: number;
+ /** @example "Frankfurt Hbf" */
+ name?: string;
+ /** @example 12 */
+ count?: number;
+ }[];
+ lines?: any[];
+ routes?: any[];
+ };
+ },
+ void
+ >({
+ path: `/statistics/favorites`,
+ method: "GET",
+ query: query,
+ secure: true,
+ format: "json",
+ ...params,
+ }),
};
dashboard = {
/**
diff --git a/resources/vue/components/Stats/AdvancedStats.vue b/resources/vue/components/Stats/AdvancedStats.vue
deleted file mode 100644
index 6303506fe..000000000
--- a/resources/vue/components/Stats/AdvancedStats.vue
+++ /dev/null
@@ -1,436 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
{{ trans('stats.checkins', {}, 'Check-ins') }}
-
{{ data.summary.total_checkins }}
-
-
-
-
-
-
-
-
{{ trans('stats.total-distance', {}, 'Total Distance') }}
-
{{ data.summary.total_distance_km }} km
-
-
-
-
-
-
-
-
{{ trans('stats.mean-distance', {}, 'Mean Distance') }}
-
{{ data.summary.mean_distance_km }} km
-
-
-
-
-
-
-
-
{{ trans('stats.travel-days', {}, 'Travel Days') }}
-
{{ data.summary.active_days }}
-
-
-
-
-
-
-
-
-
{{ trans('stats.extremes', {}, 'Extremes') }}
-
-
-
-
-
- {{ trans('stats.longest-ride', {}, 'Longest Ride') }}
-
-
- {{ data.summary.longest_ride.distance_km }} km
-
- · {{ data.summary.longest_ride.linename }}
-
-
- · {{ data.summary.longest_ride.number }}
-
-
-
- {{ data.summary.longest_ride.origin ?? '?' }} → {{ data.summary.longest_ride.destination ?? '?' }}
-
-
-
- {{ formatDate(data.summary.longest_ride.departure) }}
-
-
-
- {{ data.summary.longest_ride.operator }}
-
-
-
-
-
-
-
-
- {{ trans('stats.shortest-ride', {}, 'Shortest Ride') }}
-
-
- {{ data.summary.shortest_ride.distance_km }} km
-
- · {{ data.summary.shortest_ride.linename }}
-
-
- · {{ data.summary.shortest_ride.number }}
-
-
-
- {{ data.summary.shortest_ride.origin ?? '?' }} → {{ data.summary.shortest_ride.destination ?? '?' }}
-
-
-
- {{ formatDate(data.summary.shortest_ride.departure) }}
-
-
-
- {{ data.summary.shortest_ride.operator }}
-
-
-
-
-
-
-
-
-
-
{{ trans('stats.time-comparison', {}, 'Time Comparison') }}
-
-
-
-
-
{{ trans('stats.last-week', {}, 'Last Week') }}
-
-
{{ trans('stats.checkins', {}, 'Check-ins') }}
-
{{ data.predefined_periods.last_week.total_checkins }}
-
-
-
{{ trans('stats.distance', {}, 'Distance') }}
-
{{ data.predefined_periods.last_week.total_distance_km }} km
-
-
-
-
-
-
-
-
{{ trans('stats.last-month', {}, 'Last Month') }}
-
-
{{ trans('stats.checkins', {}, 'Check-ins') }}
-
{{ data.predefined_periods.last_month.total_checkins }}
-
-
-
{{ trans('stats.distance', {}, 'Distance') }}
-
{{ data.predefined_periods.last_month.total_distance_km }} km
-
-
-
-
-
-
-
-
{{ trans('stats.last-year', {}, 'Last Year') }}
-
-
{{ trans('stats.checkins', {}, 'Check-ins') }}
-
{{ data.predefined_periods.last_year.total_checkins }}
-
-
-
{{ trans('stats.distance', {}, 'Distance') }}
-
{{ data.predefined_periods.last_year.total_distance_km }} km
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- | {{ trans('stats.year', {}, 'Year') }} |
- {{ trans('stats.checkins', {}, 'Check-ins') }} |
- {{ trans('stats.distance', {}, 'Distance') }} |
- {{ trans('stats.avg', {}, 'Average') }} |
-
-
-
-
- | {{ getPeriodLabel(row.period, row.period_type) }} |
- {{ row.checkin_count }} |
- {{ row.distance_km }} km |
-
- {{
- row.checkin_count > 0
- ? (row.distance_km / row.checkin_count).toFixed(2)
- : '0.00'
- }}
- km
- |
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- | {{ trans('stats.month', {}, 'Month') }} |
- {{ trans('stats.checkins', {}, 'Check-ins') }} |
- {{ trans('stats.distance', {}, 'Distance') }} |
- {{ trans('stats.avg', {}, 'Average') }} |
-
-
-
-
- | {{ getPeriodLabel(row.period, row.period_type) }} |
- {{ row.checkin_count }} |
- {{ row.distance_km }} km |
-
- {{
- row.checkin_count > 0
- ? (row.distance_km / row.checkin_count).toFixed(2)
- : '0.00'
- }}
- km
- |
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- | #{{ Number(i) + 1 }} |
- {{ station.name }} |
-
- {{ station.count }}x
- |
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- | #{{ Number(i) + 1 }} |
-
- {{ line.linename }}
- {{ line.distance_km }} km total
- |
-
- {{ line.count }}x
- |
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- | #{{ Number(i) + 1 }} |
-
- {{ route.origin }} → {{ route.destination }}
- {{ route.distance_km }} km total
- |
-
- {{ route.count }}x
- |
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/resources/vue/components/Stats/StatsDashboard.vue b/resources/vue/components/Stats/StatsDashboard.vue
index 15e39575c..738e1b69d 100644
--- a/resources/vue/components/Stats/StatsDashboard.vue
+++ b/resources/vue/components/Stats/StatsDashboard.vue
@@ -7,7 +7,6 @@ import { Notyf } from 'notyf';
import 'notyf/notyf.min.css';
import Chart from 'chart.js/auto';
-import AdvancedStats from './AdvancedStats.vue';
import ChartCategories from './ChartCategories.vue';
import ChartCompanies from './ChartCompanies.vue';
import ChartPurpose from './ChartPurpose.vue';
@@ -150,11 +149,6 @@ onMounted(() => {
/>
-
-
-
-
-
'export', 'middleware' => 'scope:write-exports'], static function () {
Route::post('statuses', [ExportController::class, 'generateStatusExport']); // TODO: undocumented endpoint - document when stable
@@ -235,7 +238,7 @@
Route::apiResource('user.trusted', TrustedUserController::class)->only(['index', 'store', 'destroy']);
Route::apiResource('reports', ReportController::class);
- Route::apiResource('report', ReportController::class); // deprecated, use /reports — safe to remove after 2026-09-30
+ Route::apiResource('report', ReportController::class); // deprecated, use /reports: safe to remove after 2026-09-30
Route::apiResource('operators', OperatorController::class)->only(['index']);
Route::apiResource('alerts', AlertController::class);
Route::put('/operators/{oldOperatorId}/merge/{newOperatorId}', [OperatorController::class, 'merge']); // currently admin/backend only
diff --git a/storage/api-docs/api-docs.json b/storage/api-docs/api-docs.json
index 874f62706..f8989a81e 100644
--- a/storage/api-docs/api-docs.json
+++ b/storage/api-docs/api-docs.json
@@ -5431,6 +5431,263 @@
]
}
},
+ "/statistics/overview": {
+ "get": {
+ "tags": [
+ "Statistics"
+ ],
+ "summary": "Get a summary of personal statistics for a date range",
+ "operationId": "getStatisticsOverview",
+ "parameters": [
+ {
+ "name": "from",
+ "in": "query",
+ "description": "Start date",
+ "example": "2024-01-01"
+ },
+ {
+ "name": "until",
+ "in": "query",
+ "description": "End date",
+ "example": "2024-12-31"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "successful operation",
+ "content": {
+ "application/json": {
+ "schema": {
+ "properties": {
+ "data": {
+ "properties": {
+ "summary": {
+ "properties": {
+ "total_checkins": {
+ "type": "integer",
+ "example": 42
+ },
+ "active_days": {
+ "type": "integer",
+ "example": 15
+ },
+ "total_distance_km": {
+ "type": "number",
+ "format": "float",
+ "example": 1234.56
+ },
+ "mean_distance_km": {
+ "type": "number",
+ "format": "float",
+ "example": 29.39
+ },
+ "longest_ride": {
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/StatusResource"
+ }
+ ],
+ "nullable": true
+ },
+ "shortest_ride": {
+ "oneOf": [
+ {
+ "$ref": "#/components/schemas/StatusResource"
+ }
+ ],
+ "nullable": true
+ }
+ },
+ "type": "object"
+ }
+ },
+ "type": "object"
+ }
+ },
+ "type": "object"
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Bad request"
+ },
+ "401": {
+ "description": "Unauthorized"
+ }
+ },
+ "security": [
+ {
+ "passport": [
+ "read-statistics"
+ ]
+ },
+ {
+ "token": []
+ }
+ ]
+ }
+ },
+ "/statistics/history": {
+ "get": {
+ "tags": [
+ "Statistics"
+ ],
+ "summary": "Get all-time checkin counts and distances grouped by year, month, and week",
+ "operationId": "getStatisticsHistory",
+ "responses": {
+ "200": {
+ "description": "successful operation",
+ "content": {
+ "application/json": {
+ "schema": {
+ "properties": {
+ "data": {
+ "properties": {
+ "yearly": {
+ "type": "array",
+ "items": {
+ "properties": {
+ "period": {
+ "type": "string",
+ "example": "2024"
+ },
+ "period_type": {
+ "type": "string",
+ "example": "year"
+ },
+ "checkin_count": {
+ "type": "integer",
+ "example": 42
+ },
+ "distance_km": {
+ "type": "number",
+ "format": "float",
+ "example": 1234.56
+ }
+ },
+ "type": "object"
+ }
+ },
+ "monthly": {
+ "type": "array",
+ "items": {}
+ },
+ "weekly": {
+ "type": "array",
+ "items": {}
+ }
+ },
+ "type": "object"
+ }
+ },
+ "type": "object"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Unauthorized"
+ }
+ },
+ "security": [
+ {
+ "passport": [
+ "read-statistics"
+ ]
+ },
+ {
+ "token": []
+ }
+ ]
+ }
+ },
+ "/statistics/favorites": {
+ "get": {
+ "tags": [
+ "Statistics"
+ ],
+ "summary": "Get favorite stations, lines, and routes for a date range",
+ "operationId": "getStatisticsFavorites",
+ "parameters": [
+ {
+ "name": "from",
+ "in": "query",
+ "description": "Start date",
+ "example": "2024-01-01"
+ },
+ {
+ "name": "until",
+ "in": "query",
+ "description": "End date",
+ "example": "2024-12-31"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "successful operation",
+ "content": {
+ "application/json": {
+ "schema": {
+ "properties": {
+ "data": {
+ "properties": {
+ "stations": {
+ "type": "array",
+ "items": {
+ "properties": {
+ "station_id": {
+ "type": "integer",
+ "example": 1
+ },
+ "name": {
+ "type": "string",
+ "example": "Frankfurt Hbf"
+ },
+ "count": {
+ "type": "integer",
+ "example": 12
+ }
+ },
+ "type": "object"
+ }
+ },
+ "lines": {
+ "type": "array",
+ "items": {}
+ },
+ "routes": {
+ "type": "array",
+ "items": {}
+ }
+ },
+ "type": "object"
+ }
+ },
+ "type": "object"
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Bad request"
+ },
+ "401": {
+ "description": "Unauthorized"
+ }
+ },
+ "security": [
+ {
+ "passport": [
+ "read-statistics"
+ ]
+ },
+ {
+ "token": []
+ }
+ ]
+ }
+ },
"/dashboard": {
"get": {
"tags": [
diff --git a/tests/Feature/APIv1/AdvancedStatisticsTest.php b/tests/Feature/APIv1/AdvancedStatisticsTest.php
new file mode 100644
index 000000000..a6fa4d3c9
--- /dev/null
+++ b/tests/Feature/APIv1/AdvancedStatisticsTest.php
@@ -0,0 +1,240 @@
+ $user->id, 'distance' => $distance])->create();
+ $checkin->status->update(['user_id' => $user->id]);
+
+ return $checkin;
+ }
+
+ public function test_overview_requires_authentication(): void
+ {
+ $response = $this->getJson('/api/v1/statistics/overview');
+ $response->assertUnauthorized();
+ }
+
+ public function test_overview_returns_summary_for_authenticated_user(): void
+ {
+ $user = User::factory()->create();
+ Passport::actingAs($user, ['*']);
+ $this->createCheckinForUser($user);
+
+ $response = $this->getJson('/api/v1/statistics/overview');
+
+ $response->assertOk();
+ $response->assertJsonStructure([
+ 'data' => [
+ 'summary' => [
+ 'total_checkins',
+ 'active_days',
+ 'total_distance_km',
+ 'mean_distance_km',
+ 'longest_ride',
+ 'shortest_ride',
+ ],
+ ],
+ ]);
+ }
+
+ public function test_overview_with_no_checkins_returns_zeros(): void
+ {
+ $user = User::factory()->create();
+ Passport::actingAs($user, ['*']);
+
+ $response = $this->getJson('/api/v1/statistics/overview');
+
+ $response->assertOk();
+ $response->assertJson([
+ 'data' => [
+ 'summary' => [
+ 'total_checkins' => 0,
+ 'active_days' => 0,
+ 'total_distance_km' => 0.0,
+ ],
+ ],
+ ]);
+ $this->assertNull($response->json('data.summary.longest_ride'));
+ $this->assertNull($response->json('data.summary.shortest_ride'));
+ }
+
+ public function test_overview_counts_only_own_checkins(): void
+ {
+ $user = User::factory()->create();
+ $other = User::factory()->create();
+ Passport::actingAs($user, ['*']);
+ $this->createCheckinForUser($user);
+ $this->createCheckinForUser($user);
+ $this->createCheckinForUser($other);
+
+ $response = $this->getJson('/api/v1/statistics/overview');
+
+ $response->assertOk();
+ $this->assertSame(2, $response->json('data.summary.total_checkins'));
+ }
+
+ public function test_overview_accepts_date_range_params(): void
+ {
+ $user = User::factory()->create();
+ Passport::actingAs($user, ['*']);
+
+ $response = $this->getJson('/api/v1/statistics/overview?from=2024-01-01&until=2024-12-31');
+
+ $response->assertOk();
+ $response->assertJsonStructure(['data' => ['summary']]);
+ }
+
+ public function test_overview_rejects_invalid_date_range(): void
+ {
+ $user = User::factory()->create();
+ Passport::actingAs($user, ['*']);
+
+ $response = $this->getJson('/api/v1/statistics/overview?from=2024-12-31&until=2024-01-01');
+
+ $response->assertStatus(422);
+ }
+
+ public function test_history_requires_authentication(): void
+ {
+ $response = $this->getJson('/api/v1/statistics/history');
+ $response->assertUnauthorized();
+ }
+
+ public function test_history_returns_period_breakdown(): void
+ {
+ $user = User::factory()->create();
+ Passport::actingAs($user, ['*']);
+ $this->createCheckinForUser($user);
+
+ $response = $this->getJson('/api/v1/statistics/history');
+
+ $response->assertOk();
+ $response->assertJsonStructure([
+ 'data' => [
+ 'yearly',
+ 'monthly',
+ 'weekly',
+ ],
+ ]);
+ }
+
+ public function test_history_yearly_entry_has_correct_shape(): void
+ {
+ $user = User::factory()->create();
+ Passport::actingAs($user, ['*']);
+ $this->createCheckinForUser($user);
+
+ $response = $this->getJson('/api/v1/statistics/history');
+
+ $response->assertOk();
+ $yearly = $response->json('data.yearly');
+ $this->assertNotEmpty($yearly);
+ $this->assertArrayHasKey('period', $yearly[0]);
+ $this->assertArrayHasKey('period_type', $yearly[0]);
+ $this->assertArrayHasKey('checkin_count', $yearly[0]);
+ $this->assertArrayHasKey('distance_km', $yearly[0]);
+ $this->assertSame('year', $yearly[0]['period_type']);
+ }
+
+ public function test_history_returns_empty_arrays_when_no_checkins(): void
+ {
+ $user = User::factory()->create();
+ Passport::actingAs($user, ['*']);
+
+ $response = $this->getJson('/api/v1/statistics/history');
+
+ $response->assertOk();
+ $this->assertEmpty($response->json('data.yearly'));
+ $this->assertEmpty($response->json('data.monthly'));
+ $this->assertEmpty($response->json('data.weekly'));
+ }
+
+ public function test_favorites_requires_authentication(): void
+ {
+ $response = $this->getJson('/api/v1/statistics/favorites');
+ $response->assertUnauthorized();
+ }
+
+ public function test_favorites_returns_stations_lines_routes(): void
+ {
+ $user = User::factory()->create();
+ Passport::actingAs($user, ['*']);
+ $this->createCheckinForUser($user);
+
+ $response = $this->getJson('/api/v1/statistics/favorites');
+
+ $response->assertOk();
+ $response->assertJsonStructure([
+ 'data' => [
+ 'stations',
+ 'lines',
+ 'routes',
+ ],
+ ]);
+ }
+
+ public function test_favorites_station_entry_has_correct_shape(): void
+ {
+ $user = User::factory()->create();
+ Passport::actingAs($user, ['*']);
+ $this->createCheckinForUser($user);
+
+ $response = $this->getJson('/api/v1/statistics/favorites');
+
+ $response->assertOk();
+ $stations = $response->json('data.stations');
+ $this->assertNotEmpty($stations);
+ $this->assertArrayHasKey('station_id', $stations[0]);
+ $this->assertArrayHasKey('name', $stations[0]);
+ $this->assertArrayHasKey('count', $stations[0]);
+ }
+
+ public function test_favorites_returns_empty_arrays_when_no_checkins(): void
+ {
+ $user = User::factory()->create();
+ Passport::actingAs($user, ['*']);
+
+ $response = $this->getJson('/api/v1/statistics/favorites');
+
+ $response->assertOk();
+ $this->assertEmpty($response->json('data.stations'));
+ $this->assertEmpty($response->json('data.lines'));
+ $this->assertEmpty($response->json('data.routes'));
+ }
+
+ public function test_favorites_accepts_date_range_params(): void
+ {
+ $user = User::factory()->create();
+ Passport::actingAs($user, ['*']);
+
+ $response = $this->getJson('/api/v1/statistics/favorites?from=2024-01-01&until=2024-12-31');
+
+ $response->assertOk();
+ $response->assertJsonStructure(['data' => ['stations', 'lines', 'routes']]);
+ }
+
+ public function test_favorites_only_shows_own_data(): void
+ {
+ $user = User::factory()->create();
+ $other = User::factory()->create();
+ Passport::actingAs($user, ['*']);
+ $this->createCheckinForUser($other);
+
+ $response = $this->getJson('/api/v1/statistics/favorites');
+
+ $response->assertOk();
+ $this->assertEmpty($response->json('data.stations'));
+ }
+}