diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 95e5da17a..d46ffa822 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -21,15 +21,14 @@ name: Build and Deploy on: push: branches: - - main # Calculates version, deploys to production, then creates release - - development # Development environment + - main + - development permissions: id-token: write contents: read jobs: - # Calculate the next version number — deployment and release creation happen in subsequent jobs calculate-version: runs-on: ubuntu-latest if: "github.ref == 'refs/heads/main' && !contains(github.event.head_commit.message, '[skip deploy]') && !contains(github.event.head_commit.message, '[no deploy]')" @@ -39,7 +38,7 @@ jobs: steps: - uses: actions/checkout@v6 with: - fetch-depth: 0 # Fetch all history for proper versioning + fetch-depth: 0 - name: Determine version bump id: version_bump @@ -80,7 +79,7 @@ jobs: run: | CURRENT="${{ steps.version_bump.outputs.current_version }}" BUMP_TYPE="${{ steps.version_bump.outputs.bump_type }}" - + # Parse current version if [[ $CURRENT =~ ^([0-9]+)\.([0-9]+)\.([0-9]+) ]]; then MAJOR=${BASH_REMATCH[1]} @@ -91,7 +90,7 @@ jobs: MINOR=0 PATCH=0 fi - + # Increment based on bump type case $BUMP_TYPE in "major") @@ -107,12 +106,11 @@ jobs: PATCH=$((PATCH + 1)) ;; esac - + NEW_VERSION="$MAJOR.$MINOR.$PATCH" echo "New version: $NEW_VERSION" - echo "new_version=$NEW_VERSION" >> $GITHUB_OUTPUT + echo "new_version=$NEW_VERSION" >> "$GITHUB_OUTPUT" - # Production deployment (runs after version is calculated) build-and-deploy-production: needs: calculate-version runs-on: ubuntu-latest @@ -120,14 +118,17 @@ jobs: if: "github.ref == 'refs/heads/main' && !contains(github.event.head_commit.message, '[skip deploy]') && !contains(github.event.head_commit.message, '[no deploy]')" steps: - uses: actions/checkout@v6 + - name: Get Runner IP id: ip - uses: haythem/public-ip@v1.3 + run: echo "ipv4=$(curl -s https://checkip.amazonaws.com)" >> "$GITHUB_OUTPUT" + - name: Configure AWS Credentials uses: aws-actions/configure-aws-credentials@v6 with: role-to-assume: arn:aws:iam::147899039648:role/GitHubActionsDeployRole aws-region: ${{ secrets.AWS_REGION }} + - name: Whitelist Runner IP in AWS Security Group run: | aws ec2 authorize-security-group-ingress \ @@ -135,11 +136,13 @@ jobs: --protocol tcp \ --port 22 \ --cidr ${{ steps.ip.outputs.ipv4 }}/32 + - name: Setup PHP uses: shivammathur/setup-php@v2 with: - php-version: '8.3' + php-version: '8.5' extensions: mbstring, xml, bcmath, ctype, json, tokenizer, pdo, pdo_mysql + - name: Cache Composer packages id: composer-cache uses: actions/cache@v5 @@ -148,15 +151,19 @@ jobs: key: ${{ runner.os }}-php-${{ hashFiles('**/composer.lock') }} restore-keys: | ${{ runner.os }}-php- - - name: Install Composer dependencies - run: composer install --prefer-dist --no-progress --no-suggest --no-dev --optimize-autoloader --no-scripts + + - name: Install Composer dependencies for deployment runner + run: composer install --prefer-dist --no-progress --no-suggest --optimize-autoloader --no-scripts + - name: Setup Node.js uses: actions/setup-node@v6 with: - node-version: '20' + node-version: '24' cache: 'yarn' + - name: Install Yarn dependencies run: yarn install --frozen-lockfile --ignore-engines + - name: Build assets for Production run: npm run production env: @@ -164,14 +171,15 @@ jobs: MIX_REVERB_HOST: ${{ vars.PROD_REVERB_HOST }} MIX_REVERB_PORT: ${{ vars.PROD_REVERB_PORT }} MIX_REVERB_SCHEME: ${{ vars.PROD_REVERB_SCHEME }} + - name: Create deployment package run: | # Clean any prior rm -rf deployment-package || true - + # Create isolated temp dir TEMP_DIR=$(mktemp -d) - + # Sync repo files to temp (exclusions prevent bloat/self-ref) rsync -av \ --exclude=node_modules \ @@ -181,28 +189,45 @@ jobs: --exclude=storage/logs \ --exclude=vendor \ . "$TEMP_DIR/" - + # Copy assets into temp/public/ (these are already built via npm run production) cp -r public/css public/js public/fonts public/images public/svg public/mix-manifest.json "$TEMP_DIR/public/" || true - + # Rename to package name mv "$TEMP_DIR" deployment-package + - name: Upload deployment artifact uses: actions/upload-artifact@v7 with: name: biospex-${{ github.sha }} path: deployment-package/ retention-days: 30 - - name: Deploy with Deployer - uses: deployphp/action@v1 + + - name: Setup SSH key + uses: webfactory/ssh-agent@v0.10.0 with: - private-key: ${{ secrets.DEPLOY_PRIVATE_KEY }} - dep: deploy production + ssh-private-key: ${{ secrets.DEPLOY_PRIVATE_KEY }} + + - name: Configure SSH host key checking + run: | + mkdir -p ~/.ssh + cat > ~/.ssh/config <<'EOF' + Host * + StrictHostKeyChecking no + UserKnownHostsFile=/dev/null + EOF + chmod 700 ~/.ssh + chmod 600 ~/.ssh/config + + - name: Deploy with Deployer + run: vendor/bin/dep deploy production env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_SHA: ${{ github.sha }} GITHUB_REPO: ${{ github.repository }} + API_TOKEN: ${{ secrets.API_TOKEN }} OPCACHE_WEBHOOK_TOKEN: ${{ secrets.OPCACHE_WEBHOOK_TOKEN }} + - name: Revoke Runner IP from AWS Security Group if: always() run: | @@ -212,7 +237,6 @@ jobs: --port 22 \ --cidr ${{ steps.ip.outputs.ipv4 }}/32 - # Create release only after a successful production deployment create-release: needs: [calculate-version, build-and-deploy-production] runs-on: ubuntu-latest @@ -254,18 +278,20 @@ jobs: build-and-deploy-development: runs-on: ubuntu-latest environment: development - # Skip deployment if commit message contains [skip deploy] or [no deploy] if: "github.ref == 'refs/heads/development' && !contains(github.event.head_commit.message, '[skip deploy]') && !contains(github.event.head_commit.message, '[no deploy]')" steps: - uses: actions/checkout@v6 + - name: Get Runner IP id: ip - uses: haythem/public-ip@v1.3 + run: echo "ipv4=$(curl -s https://checkip.amazonaws.com)" >> "$GITHUB_OUTPUT" + - name: Configure AWS Credentials uses: aws-actions/configure-aws-credentials@v6 with: role-to-assume: arn:aws:iam::147899039648:role/GitHubActionsDeployRole aws-region: ${{ secrets.AWS_REGION }} + - name: Whitelist Runner IP in AWS Security Group run: | aws ec2 authorize-security-group-ingress \ @@ -273,11 +299,13 @@ jobs: --protocol tcp \ --port 22 \ --cidr ${{ steps.ip.outputs.ipv4 }}/32 + - name: Setup PHP uses: shivammathur/setup-php@v2 with: - php-version: '8.3' + php-version: '8.5' extensions: mbstring, xml, bcmath, ctype, json, tokenizer, pdo, pdo_mysql + - name: Cache Composer packages id: composer-cache uses: actions/cache@v5 @@ -286,15 +314,19 @@ jobs: key: ${{ runner.os }}-php-${{ hashFiles('**/composer.lock') }} restore-keys: | ${{ runner.os }}-php- - - name: Install Composer dependencies - run: composer install --prefer-dist --no-progress --no-suggest --no-dev --optimize-autoloader --no-scripts + + - name: Install Composer dependencies for deployment runner + run: composer install --prefer-dist --no-progress --no-suggest --optimize-autoloader --no-scripts + - name: Setup Node.js uses: actions/setup-node@v6 with: - node-version: '20' + node-version: '24' cache: 'yarn' + - name: Install Yarn dependencies run: yarn install --frozen-lockfile --ignore-engines + - name: Build assets for Development run: npm run production env: @@ -302,14 +334,15 @@ jobs: MIX_REVERB_HOST: ${{ vars.DEV_REVERB_HOST }} MIX_REVERB_PORT: ${{ vars.DEV_REVERB_PORT }} MIX_REVERB_SCHEME: ${{ vars.DEV_REVERB_SCHEME }} + - name: Create deployment package run: | # Clean any prior rm -rf deployment-package || true - + # Create isolated temp dir TEMP_DIR=$(mktemp -d) - + # Sync repo files to temp (exclusions prevent bloat/self-ref) rsync -av \ --exclude=node_modules \ @@ -319,28 +352,45 @@ jobs: --exclude=storage/logs \ --exclude=vendor \ . "$TEMP_DIR/" - + # Copy assets into temp/public/ (these are already built via npm run production) cp -r public/css public/js public/fonts public/images public/svg public/mix-manifest.json "$TEMP_DIR/public/" || true - + # Rename to package name mv "$TEMP_DIR" deployment-package + - name: Upload deployment artifact uses: actions/upload-artifact@v7 with: name: biospex-${{ github.sha }} path: deployment-package/ retention-days: 30 - - name: Deploy with Deployer - uses: deployphp/action@v1 + + - name: Setup SSH key + uses: webfactory/ssh-agent@v0.10.0 with: - private-key: ${{ secrets.DEPLOY_PRIVATE_KEY }} - dep: deploy development + ssh-private-key: ${{ secrets.DEPLOY_PRIVATE_KEY }} + + - name: Configure SSH host key checking + run: | + mkdir -p ~/.ssh + cat > ~/.ssh/config <<'EOF' + Host * + StrictHostKeyChecking no + UserKnownHostsFile=/dev/null + EOF + chmod 700 ~/.ssh + chmod 600 ~/.ssh/config + + - name: Deploy with Deployer + run: vendor/bin/dep deploy development env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_SHA: ${{ github.sha }} GITHUB_REPO: ${{ github.repository }} + API_TOKEN: ${{ secrets.API_TOKEN }} OPCACHE_WEBHOOK_TOKEN: ${{ secrets.OPCACHE_WEBHOOK_TOKEN }} + - name: Revoke Runner IP from AWS Security Group if: always() run: | diff --git a/AGENTS.md b/AGENTS.md index 63b58c76e..cbf300237 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -59,13 +59,13 @@ The Laravel Boost guidelines are specifically curated by Laravel maintainers for This application is a Laravel application and its main Laravel ecosystems package & versions are below. You are an expert with them all. Ensure you abide by these specific packages & versions. -- php - 8.3.30 -- filament/filament (FILAMENT) - v4 -- laravel/framework (LARAVEL) - v12 +- php - 8.5 +- filament/filament (FILAMENT) - v5 +- laravel/framework (LARAVEL) - v13 - laravel/prompts (PROMPTS) - v0 - laravel/reverb (REVERB) - v1 - laravel/sanctum (SANCTUM) - v4 -- livewire/livewire (LIVEWIRE) - v3 +- livewire/livewire (LIVEWIRE) - v4 - laravel/boost (BOOST) - v2 - laravel/breeze (BREEZE) - v2 - laravel/mcp (MCP) - v0 @@ -79,11 +79,7 @@ This application is a Laravel application and its main Laravel ecosystems packag ## Skills Activation -This project has domain-specific skills available. You MUST activate the relevant skill whenever you work in that domain—don't wait until you're stuck. - -- `livewire-development` — Develops reactive Livewire 3 components. Activates when creating, updating, or modifying Livewire components; working with wire:model, wire:click, wire:loading, or any wire: directives; adding real-time updates, loading states, or reactivity; debugging component behavior; writing Livewire tests; or when the user mentions Livewire, component, counter, or reactive UI. -- `pest-testing` — Tests applications using the Pest 4 PHP framework. Activates when writing tests, creating unit or feature tests, adding assertions, testing Livewire components, browser testing, debugging test failures, working with datasets or mocking; or when the user mentions test, spec, TDD, expects, assertion, coverage, or needs to verify functionality works. -- `tailwindcss-development` — Styles applications using Tailwind CSS v3 utilities. Activates when adding styles, restyling components, working with gradients, spacing, layout, flex, grid, responsive design, dark mode, colors, typography, or borders; or when the user mentions CSS, styling, classes, Tailwind, restyle, hero section, cards, buttons, or any visual/UI changes. +This project has domain-specific skills available in `**/skills/**`. You MUST activate the relevant skill whenever you work in that domain—don't wait until you're stuck. ## Conventions @@ -116,77 +112,56 @@ This project has domain-specific skills available. You MUST activate the relevan # Laravel Boost -- Laravel Boost is an MCP server that comes with powerful tools designed specifically for this application. Use them. - -## Artisan Commands +## Tools -- Run Artisan commands directly via the command line (e.g., `php artisan route:list`, `php artisan tinker --execute "..."`). -- Use `php artisan list` to discover available commands and `php artisan [command] --help` to check parameters. +- Laravel Boost is an MCP server with tools designed specifically for this application. Prefer Boost tools over manual alternatives like shell commands or file reads. +- Use `database-query` to run read-only queries against the database instead of writing raw SQL in tinker. +- Use `database-schema` to inspect table structure before writing migrations or models. +- Use `get-absolute-url` to resolve the correct scheme, domain, and port for project URLs. Always use this before sharing a URL with the user. -## URLs +## Searching Documentation (IMPORTANT) -- Whenever you share a project URL with the user, you should use the `get-absolute-url` tool to ensure you're using the correct scheme, domain/IP, and port. +- Always use `search-docs` before making code changes. Do not skip this step. It returns version-specific docs based on installed packages automatically. +- Pass a `packages` array to scope results when you know which packages are relevant. +- Use multiple broad, topic-based queries: `['rate limiting', 'routing rate limiting', 'routing']`. Expect the most relevant results first. +- Do not add package names to queries because package info is already shared. Use `test resource table`, not `filament 4 test resource table`. -## Debugging +### Search Syntax -- Use the `database-query` tool when you only need to read from the database. -- Use the `database-schema` tool to inspect table structure before writing migrations or models. -- To execute PHP code for debugging, run `php artisan tinker --execute "your code here"` directly. -- To read configuration values, read the config files directly or run `php artisan config:show [key]`. -- To inspect routes, run `php artisan route:list` directly. -- To check environment variables, read the `.env` file directly. +1. Use words for auto-stemmed AND logic: `rate limit` matches both "rate" AND "limit". +2. Use `"quoted phrases"` for exact position matching: `"infinite scroll"` requires adjacent words in order. +3. Combine words and phrases for mixed queries: `middleware "rate limit"`. +4. Use multiple queries for OR logic: `queries=["authentication", "middleware"]`. -## Searching Documentation (Critically Important) +## Artisan -- Boost comes with a powerful `search-docs` tool you should use before trying other approaches when working with Laravel or Laravel ecosystem packages. This tool automatically passes a list of installed packages and their versions to the remote Boost API, so it returns only version-specific documentation for the user's circumstance. You should pass an array of packages to filter on if you know you need docs for particular packages. -- Search the documentation before making code changes to ensure we are taking the correct approach. -- Use multiple, broad, simple, topic-based queries at once. For example: `['rate limiting', 'routing rate limiting', 'routing']`. The most relevant results will be returned first. -- Do not add package names to queries; package information is already shared. For example, use `test resource table`, not `filament 4 test resource table`. +- Run Artisan commands directly via the command line (e.g., `php artisan route:list`). Use `php artisan list` to discover available commands and `php artisan [command] --help` to check parameters. +- Inspect routes with `php artisan route:list`. Filter with: `--method=GET`, `--name=users`, `--path=api`, `--except-vendor`, `--only-vendor`. +- Read configuration values using dot notation: `php artisan config:show app.name`, `php artisan config:show database.default`. Or read config files directly from the `config/` directory. +- To check environment variables, read the `.env` file directly. -### Available Search Syntax +## Tinker -1. Simple Word Searches with auto-stemming - query=authentication - finds 'authenticate' and 'auth'. -2. Multiple Words (AND Logic) - query=rate limit - finds knowledge containing both "rate" AND "limit". -3. Quoted Phrases (Exact Position) - query="infinite scroll" - words must be adjacent and in that order. -4. Mixed Queries - query=middleware "rate limit" - "middleware" AND exact phrase "rate limit". -5. Multiple Queries - queries=["authentication", "middleware"] - ANY of these terms. +- Execute PHP in app context for debugging and testing code. Do not create models without user approval, prefer tests with factories instead. Prefer existing Artisan commands over custom tinker code. +- Always use single quotes to prevent shell expansion: `php artisan tinker --execute 'Your::code();'` + - Double quotes for PHP strings inside: `php artisan tinker --execute 'User::where("active", true)->count();'` === php rules === # PHP - Always use curly braces for control structures, even for single-line bodies. +- Use PHP 8 constructor property promotion: `public function __construct(public GitHub $github) { }`. Do not leave empty zero-parameter `__construct()` methods unless the constructor is private. +- Use explicit return type declarations and type hints for all method parameters: `function isAccessible(User $user, ?string $path = null): bool` +- Use TitleCase for Enum keys: `FavoritePerson`, `BestLake`, `Monthly`. +- Prefer PHPDoc blocks over inline comments. Only add inline comments for exceptionally complex logic. +- Use array shape type definitions in PHPDoc blocks. -## Constructors - -- Use PHP 8 constructor property promotion in `__construct()`. - - `public function __construct(public GitHub $github) { }` -- Do not allow empty `__construct()` methods with zero parameters unless the constructor is private. - -## Type Declarations - -- Always use explicit return type declarations for methods and functions. -- Use appropriate PHP type hints for method parameters. - - -```php -protected function isAccessible(User $user, ?string $path = null): bool -{ - ... -} -``` - -## Enums - -- Typically, keys in an Enum should be TitleCase. For example: `FavoritePerson`, `BestLake`, `Monthly`. - -## Comments +=== deployments rules === -- Prefer PHPDoc blocks over inline comments. Never use comments within the code itself unless the logic is exceptionally complex. +# Deployment -## PHPDoc Blocks - -- Add useful array shape type definitions when appropriate. +- Laravel can be deployed using [Laravel Cloud](https://cloud.laravel.com/), which is the fastest way to deploy and scale production Laravel applications. === tests rules === @@ -203,43 +178,18 @@ protected function isAccessible(User $user, ?string $path = null): bool - If you're creating a generic PHP class, use `php artisan make:class`. - Pass `--no-interaction` to all Artisan commands to ensure they work without user input. You should also pass the correct `--options` to ensure correct behavior. -## Database - -- Always use proper Eloquent relationship methods with return type hints. Prefer relationship methods over raw queries or manual joins. -- Use Eloquent models and relationships before suggesting raw database queries. -- Avoid `DB::`; prefer `Model::query()`. Generate code that leverages Laravel's ORM capabilities rather than bypassing them. -- Generate code that prevents N+1 query problems by using eager loading. -- Use Laravel's query builder for very complex database operations. - ### Model Creation - When creating new models, create useful factories and seeders for them too. Ask the user if they need any other things, using `php artisan make:model --help` to check the available options. -### APIs & Eloquent Resources +## APIs & Eloquent Resources - For APIs, default to using Eloquent API Resources and API versioning unless existing API routes do not, then you should follow existing application convention. -## Controllers & Validation - -- Always create Form Request classes for validation rather than inline validation in controllers. Include both validation rules and custom error messages. -- Check sibling Form Requests to see if the application uses array or string based validation rules. - -## Authentication & Authorization - -- Use Laravel's built-in authentication and authorization features (gates, policies, Sanctum, etc.). - ## URL Generation - When generating links to other pages, prefer named routes and the `route()` function. -## Queues - -- Use queued jobs for time-consuming operations with the `ShouldQueue` interface. - -## Configuration - -- Use environment variables only in configuration files - never use the `env()` function directly outside of config files. Always use `config('app.name')`, not `env('APP_NAME')`. - ## Testing - When creating models for tests, use the factories for the models. Check if the factory has custom states that can be used before manually setting up the model. @@ -250,39 +200,13 @@ protected function isAccessible(User $user, ?string $path = null): bool - If you receive an "Illuminate\Foundation\ViteException: Unable to locate file in Vite manifest" error, you can run `yarn run build` or ask the user to run `yarn run dev` or `composer run dev`. -=== laravel/v12 rules === - -# Laravel 12 - -- CRITICAL: ALWAYS use `search-docs` tool for version-specific Laravel documentation and updated code examples. -- Since Laravel 11, Laravel has a new streamlined file structure which this project uses. - -## Laravel 12 Structure - -- In Laravel 12, middleware are no longer registered in `app/Http/Kernel.php`. -- Middleware are configured declaratively in `bootstrap/app.php` using `Application::configure()->withMiddleware()`. -- `bootstrap/app.php` is the file to register middleware, exceptions, and routing files. -- `bootstrap/providers.php` contains application specific service providers. -- The `app\Console\Kernel.php` file no longer exists; use `bootstrap/app.php` or `routes/console.php` for console configuration. -- Console commands in `app/Console/Commands/` are automatically available and do not require manual registration. - -## Database - -- When modifying a column, the migration must include all of the attributes that were previously defined on the column. Otherwise, they will be dropped and lost. -- Laravel 12 allows limiting eagerly loaded records natively, without external packages: `$query->latest()->limit(10);`. - -### Models - -- Casts can and likely should be set in a `casts()` method on a model rather than the `$casts` property. Follow existing conventions from other models. - === livewire/core rules === # Livewire -- Livewire allows you to build dynamic, reactive interfaces using only PHP — no JavaScript required. -- Instead of writing frontend code in JavaScript frameworks, you use Alpine.js to build the UI when client-side interactions are required. -- State lives on the server; the UI reflects it. Validate and authorize in actions (they're like HTTP requests). -- IMPORTANT: Activate `livewire-development` every time you're working with Livewire-related tasks. +- Livewire allow to build dynamic, reactive interfaces in PHP without writing JavaScript. +- You can use Alpine.js for client-side interactions instead of JavaScript frameworks. +- Keep state server-side so the UI reflects it. Validate and authorize in actions as you would in HTTP requests. === pint/core rules === @@ -296,31 +220,21 @@ protected function isAccessible(User $user, ?string $path = null): bool ## Pest - This project uses Pest for testing. Create tests: `php artisan make:test --pest {name}`. +- The `{name}` argument should not include the test suite directory. Use `php artisan make:test --pest SomeFeatureTest` instead of `php artisan make:test --pest Feature/SomeFeatureTest`. - Run tests: `php artisan test --compact` or filter: `php artisan test --compact --filter=testName`. - Do NOT delete tests without approval. -- CRITICAL: ALWAYS use `search-docs` tool for version-specific Pest documentation and updated code examples. -- IMPORTANT: Activate `pest-testing` every time you're working with a Pest or testing-related task. - -=== tailwindcss/core rules === - -# Tailwind CSS - -- Always use existing Tailwind conventions; check project patterns before adding new ones. -- IMPORTANT: Always use `search-docs` tool for version-specific Tailwind CSS documentation and updated code examples. Never rely on training data. -- IMPORTANT: Activate `tailwindcss-development` every time you're working with a Tailwind CSS or styling-related task. === filament/filament rules === ## Filament -- Filament is used by this application. Follow the existing conventions for how and where it is implemented. -- Filament is a Server-Driven UI (SDUI) framework for Laravel that lets you define user interfaces in PHP using structured configuration objects. Built on Livewire, Alpine.js, and Tailwind CSS. +- Filament is a Laravel UI framework built on Livewire, Alpine.js, and Tailwind CSS. UIs are defined in PHP via fluent, chainable components. Follow existing conventions in this app. - Use the `search-docs` tool for official documentation on Artisan commands, code examples, testing, relationships, and idiomatic practices. If `search-docs` is unavailable, refer to https://filamentphp.com/docs. ### Artisan - Always use Filament-specific Artisan commands to create files. Find available commands with the `list-artisan-commands` tool, or run `php artisan --help`. -- Always inspect required options before running a command, and always pass `--no-interaction`. +- Inspect required options before running, and always pass `--no-interaction`. ### Patterns @@ -344,6 +258,62 @@ TextInput::make('company_name') +Use `Set $set` inside `->afterStateUpdated()` on a `->live()` field to mutate another field reactively. Prefer `->live(onBlur: true)` on text inputs to avoid per-keystroke updates: + + +use Filament\Schemas\Components\Utilities\Set; +use Illuminate\Support\Str; + +TextInput::make('title') + ->required() + ->live(onBlur: true) + ->afterStateUpdated(fn (Set $set, ?string $state) => $set( + 'slug', + Str::slug($state ?? ''), + )), + +TextInput::make('slug') + ->required(), + + + +Compose layout by nesting `Section` and `Grid`. Children need explicit `->columnSpan()` or `->columnSpanFull()`: + + +use Filament\Schemas\Components\Grid; +use Filament\Schemas\Components\Section; + +Section::make('Details') + ->schema([ + Grid::make(2)->schema([ + TextInput::make('first_name') + ->columnSpan(1), + TextInput::make('last_name') + ->columnSpan(1), + TextInput::make('bio') + ->columnSpanFull(), + ]), + ]), + + + +Use `Repeater` for inline `HasMany` management. `->relationship()` with no args binds to the relationship matching the field name: + + +use Filament\Forms\Components\Repeater; + +Repeater::make('qualifications') + ->relationship() + ->schema([ + TextInput::make('institution') + ->required(), + TextInput::make('qualification') + ->required(), + ]) + ->columns(2), + + + Use `state()` with a `Closure` to compute derived column values: @@ -354,11 +324,28 @@ TextColumn::make('full_name') -Actions encapsulate a button with an optional modal form and logic: +Use `SelectFilter` for enum or relationship filters, and `Filter` with a `->query()` closure for custom logic: + + +use Filament\Tables\Filters\Filter; +use Filament\Tables\Filters\SelectFilter; +use Illuminate\Database\Eloquent\Builder; + +SelectFilter::make('status') + ->options(UserStatus::class), + +SelectFilter::make('author') + ->relationship('author', 'name'), + +Filter::make('verified') + ->query(fn (Builder $query) => $query->whereNotNull('email_verified_at')), + + + +Actions are buttons that encapsulate optional modal forms and behavior: use Filament\Actions\Action; -use Filament\Forms\Components\TextInput; Action::make('updateEmail') ->schema([ @@ -366,13 +353,16 @@ Action::make('updateEmail') ->email() ->required(), ]) - ->action(fn (array $data, User $record) => $record->update($data)) + ->action(fn (array $data, User $record) => $record->update($data)), ### Testing -Always authenticate before testing panel functionality. Filament uses Livewire, so use `Livewire::test()` or `livewire()` (available when `pestphp/pest-plugin-livewire` is in `composer.json`): +Testing setup (requires `pestphp/pest-plugin-livewire` in `composer.json`): + +- Always call `$this->actingAs(User::factory()->create())` before testing panel functionality. +- For edit pages, pass `['record' => $user->id]`, use `->call('save')` (not `->call('create')`), and do not assert `->assertRedirect()` (edit pages do not redirect after save). use function Pest\Livewire\livewire; @@ -387,7 +377,6 @@ livewire(ListUsers::class) use function Pest\Laravel\assertDatabaseHas; -use function Pest\Livewire\livewire; livewire(CreateUser::class) ->fillForm([ @@ -396,6 +385,7 @@ livewire(CreateUser::class) ]) ->call('create') ->assertNotified() + ->assertHasNoFormErrors() ->assertRedirect(); assertDatabaseHas(User::class, [ @@ -405,9 +395,21 @@ assertDatabaseHas(User::class, [ - -use function Pest\Livewire\livewire; + +livewire(EditUser::class, ['record' => $user->id]) + ->fillForm(['name' => 'Updated']) + ->call('save') + ->assertNotified() + ->assertHasNoFormErrors(); +assertDatabaseHas(User::class, [ + 'id' => $user->id, + 'name' => 'Updated', +]); + + + + livewire(CreateUser::class) ->fillForm([ 'name' => null, @@ -422,20 +424,10 @@ livewire(CreateUser::class) - -use Filament\Actions\DeleteAction; -use function Pest\Livewire\livewire; - -livewire(EditUser::class, ['record' => $user->id]) - ->callAction(DeleteAction::class) - ->assertNotified() - ->assertRedirect(); - - +Use `->callAction(DeleteAction::class)` for page actions, or `->callAction(TestAction::make('name')->table($record))` for table actions: - + use Filament\Actions\Testing\TestAction; -use function Pest\Livewire\livewire; livewire(ListUsers::class) ->callAction(TestAction::make('promote')->table($user), [ @@ -447,16 +439,25 @@ livewire(ListUsers::class) ### Correct Namespaces -- Form fields (`TextInput`, `Select`, etc.): `Filament\Forms\Components\` +- Form fields (`TextInput`, `Select`, `Repeater`, etc.): `Filament\Forms\Components\` - Infolist entries (`TextEntry`, `IconEntry`, etc.): `Filament\Infolists\Components\` - Layout components (`Grid`, `Section`, `Fieldset`, `Tabs`, `Wizard`, etc.): `Filament\Schemas\Components\` - Schema utilities (`Get`, `Set`, etc.): `Filament\Schemas\Components\Utilities\` +- Table columns (`TextColumn`, `IconColumn`, etc.): `Filament\Tables\Columns\` +- Table filters (`SelectFilter`, `Filter`, etc.): `Filament\Tables\Filters\` - Actions (`DeleteAction`, `CreateAction`, etc.): `Filament\Actions\`. Never use `Filament\Tables\Actions\`, `Filament\Forms\Actions\`, or any other sub-namespace for actions. - Icons: `Filament\Support\Icons\Heroicon` enum (e.g., `Heroicon::PencilSquare`) ### Common Mistakes - **Never assume public file visibility.** File visibility is `private` by default. Always use `->visibility('public')` when public access is needed. -- **Never assume full-width layout.** `Grid`, `Section`, and `Fieldset` do not span all columns by default. Explicitly set column spans when needed. +- **Never assume full-width layout.** `Grid`, `Section`, `Fieldset`, and `Repeater` do not span all columns by default. +- **Use `Select::make('author_id')->relationship('author', 'name')` for BelongsTo fields.** `BelongsToSelect` does not exist in v4. +- **`Repeater` uses `->schema()`, not `->fields()`.** +- **Never add `->dehydrated(false)` to fields that need to be saved.** It strips the value from form state before `->action()` or the save handler runs. Only use it for helper/UI-only fields. +- **Use correct property types when overriding `Page`, `Resource`, and `Widget` properties.** These properties have union types or changed modifiers that must be preserved: + - `$navigationIcon`: `protected static string | BackedEnum | null` (not `?string`) + - `$navigationGroup`: `protected static string | UnitEnum | null` (not `?string`) + - `$view`: `protected string` (not `protected static string`) on `Page` and `Widget` classes diff --git a/CLAUDE.md b/CLAUDE.md index 63b58c76e..cbf300237 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -59,13 +59,13 @@ The Laravel Boost guidelines are specifically curated by Laravel maintainers for This application is a Laravel application and its main Laravel ecosystems package & versions are below. You are an expert with them all. Ensure you abide by these specific packages & versions. -- php - 8.3.30 -- filament/filament (FILAMENT) - v4 -- laravel/framework (LARAVEL) - v12 +- php - 8.5 +- filament/filament (FILAMENT) - v5 +- laravel/framework (LARAVEL) - v13 - laravel/prompts (PROMPTS) - v0 - laravel/reverb (REVERB) - v1 - laravel/sanctum (SANCTUM) - v4 -- livewire/livewire (LIVEWIRE) - v3 +- livewire/livewire (LIVEWIRE) - v4 - laravel/boost (BOOST) - v2 - laravel/breeze (BREEZE) - v2 - laravel/mcp (MCP) - v0 @@ -79,11 +79,7 @@ This application is a Laravel application and its main Laravel ecosystems packag ## Skills Activation -This project has domain-specific skills available. You MUST activate the relevant skill whenever you work in that domain—don't wait until you're stuck. - -- `livewire-development` — Develops reactive Livewire 3 components. Activates when creating, updating, or modifying Livewire components; working with wire:model, wire:click, wire:loading, or any wire: directives; adding real-time updates, loading states, or reactivity; debugging component behavior; writing Livewire tests; or when the user mentions Livewire, component, counter, or reactive UI. -- `pest-testing` — Tests applications using the Pest 4 PHP framework. Activates when writing tests, creating unit or feature tests, adding assertions, testing Livewire components, browser testing, debugging test failures, working with datasets or mocking; or when the user mentions test, spec, TDD, expects, assertion, coverage, or needs to verify functionality works. -- `tailwindcss-development` — Styles applications using Tailwind CSS v3 utilities. Activates when adding styles, restyling components, working with gradients, spacing, layout, flex, grid, responsive design, dark mode, colors, typography, or borders; or when the user mentions CSS, styling, classes, Tailwind, restyle, hero section, cards, buttons, or any visual/UI changes. +This project has domain-specific skills available in `**/skills/**`. You MUST activate the relevant skill whenever you work in that domain—don't wait until you're stuck. ## Conventions @@ -116,77 +112,56 @@ This project has domain-specific skills available. You MUST activate the relevan # Laravel Boost -- Laravel Boost is an MCP server that comes with powerful tools designed specifically for this application. Use them. - -## Artisan Commands +## Tools -- Run Artisan commands directly via the command line (e.g., `php artisan route:list`, `php artisan tinker --execute "..."`). -- Use `php artisan list` to discover available commands and `php artisan [command] --help` to check parameters. +- Laravel Boost is an MCP server with tools designed specifically for this application. Prefer Boost tools over manual alternatives like shell commands or file reads. +- Use `database-query` to run read-only queries against the database instead of writing raw SQL in tinker. +- Use `database-schema` to inspect table structure before writing migrations or models. +- Use `get-absolute-url` to resolve the correct scheme, domain, and port for project URLs. Always use this before sharing a URL with the user. -## URLs +## Searching Documentation (IMPORTANT) -- Whenever you share a project URL with the user, you should use the `get-absolute-url` tool to ensure you're using the correct scheme, domain/IP, and port. +- Always use `search-docs` before making code changes. Do not skip this step. It returns version-specific docs based on installed packages automatically. +- Pass a `packages` array to scope results when you know which packages are relevant. +- Use multiple broad, topic-based queries: `['rate limiting', 'routing rate limiting', 'routing']`. Expect the most relevant results first. +- Do not add package names to queries because package info is already shared. Use `test resource table`, not `filament 4 test resource table`. -## Debugging +### Search Syntax -- Use the `database-query` tool when you only need to read from the database. -- Use the `database-schema` tool to inspect table structure before writing migrations or models. -- To execute PHP code for debugging, run `php artisan tinker --execute "your code here"` directly. -- To read configuration values, read the config files directly or run `php artisan config:show [key]`. -- To inspect routes, run `php artisan route:list` directly. -- To check environment variables, read the `.env` file directly. +1. Use words for auto-stemmed AND logic: `rate limit` matches both "rate" AND "limit". +2. Use `"quoted phrases"` for exact position matching: `"infinite scroll"` requires adjacent words in order. +3. Combine words and phrases for mixed queries: `middleware "rate limit"`. +4. Use multiple queries for OR logic: `queries=["authentication", "middleware"]`. -## Searching Documentation (Critically Important) +## Artisan -- Boost comes with a powerful `search-docs` tool you should use before trying other approaches when working with Laravel or Laravel ecosystem packages. This tool automatically passes a list of installed packages and their versions to the remote Boost API, so it returns only version-specific documentation for the user's circumstance. You should pass an array of packages to filter on if you know you need docs for particular packages. -- Search the documentation before making code changes to ensure we are taking the correct approach. -- Use multiple, broad, simple, topic-based queries at once. For example: `['rate limiting', 'routing rate limiting', 'routing']`. The most relevant results will be returned first. -- Do not add package names to queries; package information is already shared. For example, use `test resource table`, not `filament 4 test resource table`. +- Run Artisan commands directly via the command line (e.g., `php artisan route:list`). Use `php artisan list` to discover available commands and `php artisan [command] --help` to check parameters. +- Inspect routes with `php artisan route:list`. Filter with: `--method=GET`, `--name=users`, `--path=api`, `--except-vendor`, `--only-vendor`. +- Read configuration values using dot notation: `php artisan config:show app.name`, `php artisan config:show database.default`. Or read config files directly from the `config/` directory. +- To check environment variables, read the `.env` file directly. -### Available Search Syntax +## Tinker -1. Simple Word Searches with auto-stemming - query=authentication - finds 'authenticate' and 'auth'. -2. Multiple Words (AND Logic) - query=rate limit - finds knowledge containing both "rate" AND "limit". -3. Quoted Phrases (Exact Position) - query="infinite scroll" - words must be adjacent and in that order. -4. Mixed Queries - query=middleware "rate limit" - "middleware" AND exact phrase "rate limit". -5. Multiple Queries - queries=["authentication", "middleware"] - ANY of these terms. +- Execute PHP in app context for debugging and testing code. Do not create models without user approval, prefer tests with factories instead. Prefer existing Artisan commands over custom tinker code. +- Always use single quotes to prevent shell expansion: `php artisan tinker --execute 'Your::code();'` + - Double quotes for PHP strings inside: `php artisan tinker --execute 'User::where("active", true)->count();'` === php rules === # PHP - Always use curly braces for control structures, even for single-line bodies. +- Use PHP 8 constructor property promotion: `public function __construct(public GitHub $github) { }`. Do not leave empty zero-parameter `__construct()` methods unless the constructor is private. +- Use explicit return type declarations and type hints for all method parameters: `function isAccessible(User $user, ?string $path = null): bool` +- Use TitleCase for Enum keys: `FavoritePerson`, `BestLake`, `Monthly`. +- Prefer PHPDoc blocks over inline comments. Only add inline comments for exceptionally complex logic. +- Use array shape type definitions in PHPDoc blocks. -## Constructors - -- Use PHP 8 constructor property promotion in `__construct()`. - - `public function __construct(public GitHub $github) { }` -- Do not allow empty `__construct()` methods with zero parameters unless the constructor is private. - -## Type Declarations - -- Always use explicit return type declarations for methods and functions. -- Use appropriate PHP type hints for method parameters. - - -```php -protected function isAccessible(User $user, ?string $path = null): bool -{ - ... -} -``` - -## Enums - -- Typically, keys in an Enum should be TitleCase. For example: `FavoritePerson`, `BestLake`, `Monthly`. - -## Comments +=== deployments rules === -- Prefer PHPDoc blocks over inline comments. Never use comments within the code itself unless the logic is exceptionally complex. +# Deployment -## PHPDoc Blocks - -- Add useful array shape type definitions when appropriate. +- Laravel can be deployed using [Laravel Cloud](https://cloud.laravel.com/), which is the fastest way to deploy and scale production Laravel applications. === tests rules === @@ -203,43 +178,18 @@ protected function isAccessible(User $user, ?string $path = null): bool - If you're creating a generic PHP class, use `php artisan make:class`. - Pass `--no-interaction` to all Artisan commands to ensure they work without user input. You should also pass the correct `--options` to ensure correct behavior. -## Database - -- Always use proper Eloquent relationship methods with return type hints. Prefer relationship methods over raw queries or manual joins. -- Use Eloquent models and relationships before suggesting raw database queries. -- Avoid `DB::`; prefer `Model::query()`. Generate code that leverages Laravel's ORM capabilities rather than bypassing them. -- Generate code that prevents N+1 query problems by using eager loading. -- Use Laravel's query builder for very complex database operations. - ### Model Creation - When creating new models, create useful factories and seeders for them too. Ask the user if they need any other things, using `php artisan make:model --help` to check the available options. -### APIs & Eloquent Resources +## APIs & Eloquent Resources - For APIs, default to using Eloquent API Resources and API versioning unless existing API routes do not, then you should follow existing application convention. -## Controllers & Validation - -- Always create Form Request classes for validation rather than inline validation in controllers. Include both validation rules and custom error messages. -- Check sibling Form Requests to see if the application uses array or string based validation rules. - -## Authentication & Authorization - -- Use Laravel's built-in authentication and authorization features (gates, policies, Sanctum, etc.). - ## URL Generation - When generating links to other pages, prefer named routes and the `route()` function. -## Queues - -- Use queued jobs for time-consuming operations with the `ShouldQueue` interface. - -## Configuration - -- Use environment variables only in configuration files - never use the `env()` function directly outside of config files. Always use `config('app.name')`, not `env('APP_NAME')`. - ## Testing - When creating models for tests, use the factories for the models. Check if the factory has custom states that can be used before manually setting up the model. @@ -250,39 +200,13 @@ protected function isAccessible(User $user, ?string $path = null): bool - If you receive an "Illuminate\Foundation\ViteException: Unable to locate file in Vite manifest" error, you can run `yarn run build` or ask the user to run `yarn run dev` or `composer run dev`. -=== laravel/v12 rules === - -# Laravel 12 - -- CRITICAL: ALWAYS use `search-docs` tool for version-specific Laravel documentation and updated code examples. -- Since Laravel 11, Laravel has a new streamlined file structure which this project uses. - -## Laravel 12 Structure - -- In Laravel 12, middleware are no longer registered in `app/Http/Kernel.php`. -- Middleware are configured declaratively in `bootstrap/app.php` using `Application::configure()->withMiddleware()`. -- `bootstrap/app.php` is the file to register middleware, exceptions, and routing files. -- `bootstrap/providers.php` contains application specific service providers. -- The `app\Console\Kernel.php` file no longer exists; use `bootstrap/app.php` or `routes/console.php` for console configuration. -- Console commands in `app/Console/Commands/` are automatically available and do not require manual registration. - -## Database - -- When modifying a column, the migration must include all of the attributes that were previously defined on the column. Otherwise, they will be dropped and lost. -- Laravel 12 allows limiting eagerly loaded records natively, without external packages: `$query->latest()->limit(10);`. - -### Models - -- Casts can and likely should be set in a `casts()` method on a model rather than the `$casts` property. Follow existing conventions from other models. - === livewire/core rules === # Livewire -- Livewire allows you to build dynamic, reactive interfaces using only PHP — no JavaScript required. -- Instead of writing frontend code in JavaScript frameworks, you use Alpine.js to build the UI when client-side interactions are required. -- State lives on the server; the UI reflects it. Validate and authorize in actions (they're like HTTP requests). -- IMPORTANT: Activate `livewire-development` every time you're working with Livewire-related tasks. +- Livewire allow to build dynamic, reactive interfaces in PHP without writing JavaScript. +- You can use Alpine.js for client-side interactions instead of JavaScript frameworks. +- Keep state server-side so the UI reflects it. Validate and authorize in actions as you would in HTTP requests. === pint/core rules === @@ -296,31 +220,21 @@ protected function isAccessible(User $user, ?string $path = null): bool ## Pest - This project uses Pest for testing. Create tests: `php artisan make:test --pest {name}`. +- The `{name}` argument should not include the test suite directory. Use `php artisan make:test --pest SomeFeatureTest` instead of `php artisan make:test --pest Feature/SomeFeatureTest`. - Run tests: `php artisan test --compact` or filter: `php artisan test --compact --filter=testName`. - Do NOT delete tests without approval. -- CRITICAL: ALWAYS use `search-docs` tool for version-specific Pest documentation and updated code examples. -- IMPORTANT: Activate `pest-testing` every time you're working with a Pest or testing-related task. - -=== tailwindcss/core rules === - -# Tailwind CSS - -- Always use existing Tailwind conventions; check project patterns before adding new ones. -- IMPORTANT: Always use `search-docs` tool for version-specific Tailwind CSS documentation and updated code examples. Never rely on training data. -- IMPORTANT: Activate `tailwindcss-development` every time you're working with a Tailwind CSS or styling-related task. === filament/filament rules === ## Filament -- Filament is used by this application. Follow the existing conventions for how and where it is implemented. -- Filament is a Server-Driven UI (SDUI) framework for Laravel that lets you define user interfaces in PHP using structured configuration objects. Built on Livewire, Alpine.js, and Tailwind CSS. +- Filament is a Laravel UI framework built on Livewire, Alpine.js, and Tailwind CSS. UIs are defined in PHP via fluent, chainable components. Follow existing conventions in this app. - Use the `search-docs` tool for official documentation on Artisan commands, code examples, testing, relationships, and idiomatic practices. If `search-docs` is unavailable, refer to https://filamentphp.com/docs. ### Artisan - Always use Filament-specific Artisan commands to create files. Find available commands with the `list-artisan-commands` tool, or run `php artisan --help`. -- Always inspect required options before running a command, and always pass `--no-interaction`. +- Inspect required options before running, and always pass `--no-interaction`. ### Patterns @@ -344,6 +258,62 @@ TextInput::make('company_name') +Use `Set $set` inside `->afterStateUpdated()` on a `->live()` field to mutate another field reactively. Prefer `->live(onBlur: true)` on text inputs to avoid per-keystroke updates: + + +use Filament\Schemas\Components\Utilities\Set; +use Illuminate\Support\Str; + +TextInput::make('title') + ->required() + ->live(onBlur: true) + ->afterStateUpdated(fn (Set $set, ?string $state) => $set( + 'slug', + Str::slug($state ?? ''), + )), + +TextInput::make('slug') + ->required(), + + + +Compose layout by nesting `Section` and `Grid`. Children need explicit `->columnSpan()` or `->columnSpanFull()`: + + +use Filament\Schemas\Components\Grid; +use Filament\Schemas\Components\Section; + +Section::make('Details') + ->schema([ + Grid::make(2)->schema([ + TextInput::make('first_name') + ->columnSpan(1), + TextInput::make('last_name') + ->columnSpan(1), + TextInput::make('bio') + ->columnSpanFull(), + ]), + ]), + + + +Use `Repeater` for inline `HasMany` management. `->relationship()` with no args binds to the relationship matching the field name: + + +use Filament\Forms\Components\Repeater; + +Repeater::make('qualifications') + ->relationship() + ->schema([ + TextInput::make('institution') + ->required(), + TextInput::make('qualification') + ->required(), + ]) + ->columns(2), + + + Use `state()` with a `Closure` to compute derived column values: @@ -354,11 +324,28 @@ TextColumn::make('full_name') -Actions encapsulate a button with an optional modal form and logic: +Use `SelectFilter` for enum or relationship filters, and `Filter` with a `->query()` closure for custom logic: + + +use Filament\Tables\Filters\Filter; +use Filament\Tables\Filters\SelectFilter; +use Illuminate\Database\Eloquent\Builder; + +SelectFilter::make('status') + ->options(UserStatus::class), + +SelectFilter::make('author') + ->relationship('author', 'name'), + +Filter::make('verified') + ->query(fn (Builder $query) => $query->whereNotNull('email_verified_at')), + + + +Actions are buttons that encapsulate optional modal forms and behavior: use Filament\Actions\Action; -use Filament\Forms\Components\TextInput; Action::make('updateEmail') ->schema([ @@ -366,13 +353,16 @@ Action::make('updateEmail') ->email() ->required(), ]) - ->action(fn (array $data, User $record) => $record->update($data)) + ->action(fn (array $data, User $record) => $record->update($data)), ### Testing -Always authenticate before testing panel functionality. Filament uses Livewire, so use `Livewire::test()` or `livewire()` (available when `pestphp/pest-plugin-livewire` is in `composer.json`): +Testing setup (requires `pestphp/pest-plugin-livewire` in `composer.json`): + +- Always call `$this->actingAs(User::factory()->create())` before testing panel functionality. +- For edit pages, pass `['record' => $user->id]`, use `->call('save')` (not `->call('create')`), and do not assert `->assertRedirect()` (edit pages do not redirect after save). use function Pest\Livewire\livewire; @@ -387,7 +377,6 @@ livewire(ListUsers::class) use function Pest\Laravel\assertDatabaseHas; -use function Pest\Livewire\livewire; livewire(CreateUser::class) ->fillForm([ @@ -396,6 +385,7 @@ livewire(CreateUser::class) ]) ->call('create') ->assertNotified() + ->assertHasNoFormErrors() ->assertRedirect(); assertDatabaseHas(User::class, [ @@ -405,9 +395,21 @@ assertDatabaseHas(User::class, [ - -use function Pest\Livewire\livewire; + +livewire(EditUser::class, ['record' => $user->id]) + ->fillForm(['name' => 'Updated']) + ->call('save') + ->assertNotified() + ->assertHasNoFormErrors(); +assertDatabaseHas(User::class, [ + 'id' => $user->id, + 'name' => 'Updated', +]); + + + + livewire(CreateUser::class) ->fillForm([ 'name' => null, @@ -422,20 +424,10 @@ livewire(CreateUser::class) - -use Filament\Actions\DeleteAction; -use function Pest\Livewire\livewire; - -livewire(EditUser::class, ['record' => $user->id]) - ->callAction(DeleteAction::class) - ->assertNotified() - ->assertRedirect(); - - +Use `->callAction(DeleteAction::class)` for page actions, or `->callAction(TestAction::make('name')->table($record))` for table actions: - + use Filament\Actions\Testing\TestAction; -use function Pest\Livewire\livewire; livewire(ListUsers::class) ->callAction(TestAction::make('promote')->table($user), [ @@ -447,16 +439,25 @@ livewire(ListUsers::class) ### Correct Namespaces -- Form fields (`TextInput`, `Select`, etc.): `Filament\Forms\Components\` +- Form fields (`TextInput`, `Select`, `Repeater`, etc.): `Filament\Forms\Components\` - Infolist entries (`TextEntry`, `IconEntry`, etc.): `Filament\Infolists\Components\` - Layout components (`Grid`, `Section`, `Fieldset`, `Tabs`, `Wizard`, etc.): `Filament\Schemas\Components\` - Schema utilities (`Get`, `Set`, etc.): `Filament\Schemas\Components\Utilities\` +- Table columns (`TextColumn`, `IconColumn`, etc.): `Filament\Tables\Columns\` +- Table filters (`SelectFilter`, `Filter`, etc.): `Filament\Tables\Filters\` - Actions (`DeleteAction`, `CreateAction`, etc.): `Filament\Actions\`. Never use `Filament\Tables\Actions\`, `Filament\Forms\Actions\`, or any other sub-namespace for actions. - Icons: `Filament\Support\Icons\Heroicon` enum (e.g., `Heroicon::PencilSquare`) ### Common Mistakes - **Never assume public file visibility.** File visibility is `private` by default. Always use `->visibility('public')` when public access is needed. -- **Never assume full-width layout.** `Grid`, `Section`, and `Fieldset` do not span all columns by default. Explicitly set column spans when needed. +- **Never assume full-width layout.** `Grid`, `Section`, `Fieldset`, and `Repeater` do not span all columns by default. +- **Use `Select::make('author_id')->relationship('author', 'name')` for BelongsTo fields.** `BelongsToSelect` does not exist in v4. +- **`Repeater` uses `->schema()`, not `->fields()`.** +- **Never add `->dehydrated(false)` to fields that need to be saved.** It strips the value from form state before `->action()` or the save handler runs. Only use it for helper/UI-only fields. +- **Use correct property types when overriding `Page`, `Resource`, and `Widget` properties.** These properties have union types or changed modifiers that must be preserved: + - `$navigationIcon`: `protected static string | BackedEnum | null` (not `?string`) + - `$navigationGroup`: `protected static string | UnitEnum | null` (not `?string`) + - `$view`: `protected string` (not `protected static string`) on `Page` and `Widget` classes diff --git a/app/Filament/Components/JsonEditor.php b/app/Filament/Components/JsonEditor.php new file mode 100644 index 000000000..58ca5302d --- /dev/null +++ b/app/Filament/Components/JsonEditor.php @@ -0,0 +1,73 @@ +. + */ + +namespace App\Filament\Components; + +use Filament\Forms\Components\CodeEditor; +use Filament\Forms\Components\CodeEditor\Enums\Language; + +class JsonEditor extends CodeEditor +{ + protected function setUp(): void + { + parent::setUp(); + + $this->language(Language::Json); + $this->columnSpanFull(); + + // Validate that the input is valid JSON + $this->rule(function () { + return function (string $attribute, mixed $value, \Closure $fail) { + if (is_string($value) && ! blank($value)) { + json_decode($value); + if (json_last_error() !== JSON_ERROR_NONE) { + $fail("The {$this->getLabel()} must be a valid JSON string."); + } + } + }; + }); + + // Format array data from database for the UI + $this->formatStateUsing(function ($state) { + if (is_string($state)) { + $decoded = json_decode($state, associative: true); + + return json_last_error() === JSON_ERROR_NONE ? json_encode($decoded, JSON_PRETTY_PRINT) : $state; + } + + return is_array($state) ? json_encode($state, JSON_PRETTY_PRINT) : $state; + }); + + // Handle saving back as an array + $this->dehydrateStateUsing(function (?string $state) { + if (blank($state)) { + return null; + } + $decoded = json_decode($state, associative: true); + + return json_last_error() === JSON_ERROR_NONE ? $decoded : $state; + }); + + // Keep Livewire state in sync + $this->afterStateUpdated(function (?string $state, $set, $component) { + $set($component->getStatePath(), $state ? json_decode($state, associative: true) : null); + }); + } +} diff --git a/app/Filament/Resources/AmCharts/Schemas/AmChartForm.php b/app/Filament/Resources/AmCharts/Schemas/AmChartForm.php index ec967aa29..0a7326965 100644 --- a/app/Filament/Resources/AmCharts/Schemas/AmChartForm.php +++ b/app/Filament/Resources/AmCharts/Schemas/AmChartForm.php @@ -1,11 +1,29 @@ . + */ + namespace App\Filament\Resources\AmCharts\Schemas; +use App\Filament\Components\JsonEditor; use Filament\Forms\Components\Select; use Filament\Forms\Components\TextInput; use Filament\Schemas\Schema; -use ValentinMorice\FilamentJsonColumn\JsonColumn; class AmChartForm { @@ -20,8 +38,8 @@ public static function configure(Schema $schema): Schema ->required() ->numeric() ->default(0), - JsonColumn::make('series'), - JsonColumn::make('data'), + JsonEditor::make('series'), + JsonEditor::make('data'), ]); } } diff --git a/app/Filament/Resources/GeoLocateCommunities/Schemas/GeoLocateCommunityForm.php b/app/Filament/Resources/GeoLocateCommunities/Schemas/GeoLocateCommunityForm.php index b3bea4099..053659a3c 100644 --- a/app/Filament/Resources/GeoLocateCommunities/Schemas/GeoLocateCommunityForm.php +++ b/app/Filament/Resources/GeoLocateCommunities/Schemas/GeoLocateCommunityForm.php @@ -1,11 +1,29 @@ . + */ + namespace App\Filament\Resources\GeoLocateCommunities\Schemas; +use App\Filament\Components\JsonEditor; use Filament\Forms\Components\Select; use Filament\Forms\Components\TextInput; use Filament\Schemas\Schema; -use ValentinMorice\FilamentJsonColumn\JsonColumn; class GeoLocateCommunityForm { @@ -18,7 +36,7 @@ public static function configure(Schema $schema): Schema ->required(), TextInput::make('name') ->required(), - JsonColumn::make('data') + JsonEditor::make('data') ->required(), ]); } diff --git a/app/Filament/Resources/GeoLocateDataSources/Schemas/GeoLocateDataSourceForm.php b/app/Filament/Resources/GeoLocateDataSources/Schemas/GeoLocateDataSourceForm.php index a4b620712..ffcf3759d 100644 --- a/app/Filament/Resources/GeoLocateDataSources/Schemas/GeoLocateDataSourceForm.php +++ b/app/Filament/Resources/GeoLocateDataSources/Schemas/GeoLocateDataSourceForm.php @@ -1,11 +1,29 @@ . + */ + namespace App\Filament\Resources\GeoLocateDataSources\Schemas; +use App\Filament\Components\JsonEditor; use Filament\Forms\Components\Select; use Filament\Forms\Components\TextInput; use Filament\Schemas\Schema; -use ValentinMorice\FilamentJsonColumn\JsonColumn; class GeoLocateDataSourceForm { @@ -26,7 +44,7 @@ public static function configure(Schema $schema): Schema ->relationship('geoLocateCommunity', 'name'), Select::make('download_id') ->relationship('download', 'file'), - JsonColumn::make('data_source'), + JsonEditor::make('data_source'), TextInput::make('data'), ]); } diff --git a/app/Filament/Resources/GeoLocateForms/Schemas/GeoLocateFormForm.php b/app/Filament/Resources/GeoLocateForms/Schemas/GeoLocateFormForm.php index cbae1d0b2..a844a886a 100644 --- a/app/Filament/Resources/GeoLocateForms/Schemas/GeoLocateFormForm.php +++ b/app/Filament/Resources/GeoLocateForms/Schemas/GeoLocateFormForm.php @@ -1,11 +1,29 @@ . + */ + namespace App\Filament\Resources\GeoLocateForms\Schemas; +use App\Filament\Components\JsonEditor; use Filament\Forms\Components\Select; use Filament\Forms\Components\TextInput; use Filament\Schemas\Schema; -use ValentinMorice\FilamentJsonColumn\JsonColumn; class GeoLocateFormForm { @@ -18,7 +36,7 @@ public static function configure(Schema $schema): Schema ->required(), TextInput::make('name') ->required(), - JsonColumn::make('fields') + JsonEditor::make('fields') ->required(), ]); } diff --git a/app/Filament/Resources/Headers/Schemas/HeaderForm.php b/app/Filament/Resources/Headers/Schemas/HeaderForm.php index 1f1cfb89d..adefa9e47 100644 --- a/app/Filament/Resources/Headers/Schemas/HeaderForm.php +++ b/app/Filament/Resources/Headers/Schemas/HeaderForm.php @@ -1,10 +1,28 @@ . + */ + namespace App\Filament\Resources\Headers\Schemas; +use App\Filament\Components\JsonEditor; use Filament\Forms\Components\TextInput; use Filament\Schemas\Schema; -use ValentinMorice\FilamentJsonColumn\JsonColumn; class HeaderForm { @@ -15,7 +33,7 @@ public static function configure(Schema $schema): Schema TextInput::make('project_id') ->required() ->numeric(), - JsonColumn::make('header') + JsonEditor::make('header') ->columnSpanFull(), ]); } diff --git a/app/Http/Controllers/Api/IndexController.php b/app/Http/Controllers/Api/IndexController.php index 74e8650a8..156a6aa0f 100644 --- a/app/Http/Controllers/Api/IndexController.php +++ b/app/Http/Controllers/Api/IndexController.php @@ -20,33 +20,24 @@ namespace App\Http\Controllers\Api; +use Illuminate\Http\Request; +use Illuminate\Http\Response; + /** * Class IndexController */ class IndexController extends ApiController { - /** - * @return string - */ - public function index() + public function index(): string { return \View::make('front.api-index'); } /** * Reset OpCache - * - * @return \Illuminate\Http\Response */ - public function resetOpcache(\Illuminate\Http\Request $request) + public function resetOpcache(Request $request): Response { - $token = $request->input('token'); - $validToken = config('app.opcache_webhook_token', null); - - if (empty($validToken) || $token !== $validToken) { - return $this->errorUnauthorized('Invalid reset token.'); - } - if (function_exists('opcache_reset')) { if (opcache_reset()) { return $this->respondWithArray(['message' => 'OpCache reset successful']); diff --git a/app/Http/Middleware/VerifyCsrfToken.php b/app/Http/Middleware/VerifyCsrfToken.php deleted file mode 100644 index a1886c8b2..000000000 --- a/app/Http/Middleware/VerifyCsrfToken.php +++ /dev/null @@ -1,36 +0,0 @@ -. - */ - -namespace App\Http\Middleware; - -use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as Middleware; - -class VerifyCsrfToken extends Middleware -{ - /** - * The URIs that should be excluded from CSRF verification. - * - * @var array - */ - protected $except = [ - // - 'aws-sns-webhook/', - ]; -} diff --git a/app/Jobs/LabelReconciliationJob.php b/app/Jobs/LabelReconciliationJob.php index 094f5199b..9c689e5ca 100644 --- a/app/Jobs/LabelReconciliationJob.php +++ b/app/Jobs/LabelReconciliationJob.php @@ -68,9 +68,9 @@ public function handle( public function failed(Throwable $throwable): void { $attributes = [ - 'subject' => t('SnsLabelReconciliationJob Failed'), + 'subject' => t('LabelReconciliationJob Failed'), 'html' => [ - t('SnsLabelReconciliationJob failed'), + t('LabelReconciliationJob failed'), t('Error: %s', $throwable->getMessage()), t('File: %s', $throwable->getFile()), t('Line: %s', $throwable->getLine()), diff --git a/app/Listeners/GroupEventSubscriber.php b/app/Listeners/GroupEventSubscriber.php index 6ec597484..a08b7bf4b 100644 --- a/app/Listeners/GroupEventSubscriber.php +++ b/app/Listeners/GroupEventSubscriber.php @@ -68,7 +68,6 @@ public function subscribe($events) */ public function onUserLogin($event) { - \Log::info('User logged in: '.Auth::id()); $this->setUserGroupSession(); } @@ -77,7 +76,6 @@ public function onUserLogin($event) */ public function onUserLogout($event) { - \Log::info('User logged out: '.Auth::id()); Session::flush(); } diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index 597d17e43..50e62b990 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -69,10 +69,5 @@ public function boot(): void * Registers IDE helper service provider in non-production environments * to provide enhanced IDE support and autocompletion. */ - public function register(): void - { - if ($this->app->environment() !== 'production') { - $this->app->register(\Barryvdh\LaravelIdeHelper\IdeHelperServiceProvider::class); - } - } + public function register(): void {} } diff --git a/app/Providers/Filament/AdminPanelProvider.php b/app/Providers/Filament/AdminPanelProvider.php index b7ce43db1..261c4a04f 100644 --- a/app/Providers/Filament/AdminPanelProvider.php +++ b/app/Providers/Filament/AdminPanelProvider.php @@ -13,7 +13,7 @@ use Filament\PanelProvider; use Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse; use Illuminate\Cookie\Middleware\EncryptCookies; -use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken; +use Illuminate\Foundation\Http\Middleware\PreventRequestForgery; use Illuminate\Routing\Middleware\SubstituteBindings; use Illuminate\Session\Middleware\StartSession; use Illuminate\View\Middleware\ShareErrorsFromSession; @@ -78,7 +78,7 @@ public function panel(Panel $panel): Panel StartSession::class, AuthenticateSession::class, ShareErrorsFromSession::class, - VerifyCsrfToken::class, + PreventRequestForgery::class, SubstituteBindings::class, DisableBladeIconComponents::class, DispatchServingFilamentEvent::class, diff --git a/app/Services/Asset/ImageUploadService.php b/app/Services/Asset/ImageUploadService.php index 1a47b7d46..a22a098e0 100644 --- a/app/Services/Asset/ImageUploadService.php +++ b/app/Services/Asset/ImageUploadService.php @@ -103,7 +103,7 @@ protected function createVariants($file, string $filename, string $baseStoragePa $variantPath = $baseStoragePath.'/'.$variant.'/'.$filename; // Encode image and store - $imageData = $image->encode(); + $imageData = (string) $image->encode(); Storage::disk($disk)->put($variantPath, $imageData); } catch (\Exception $e) { diff --git a/bootstrap/app.php b/bootstrap/app.php index 5565a50b4..fd3a42a20 100644 --- a/bootstrap/app.php +++ b/bootstrap/app.php @@ -1,11 +1,27 @@ withRouting( @@ -48,44 +64,43 @@ ) ->withMiddleware(function (Middleware $middleware) { $middleware->web(append: [ - \Spatie\Honeypot\ProtectAgainstSpam::class, + ProtectAgainstSpam::class, ]); // Global middleware stack (runs on every request) $middleware->use([ - \Illuminate\Foundation\Http\Middleware\InvokeDeferredCallbacks::class, - \App\Http\Middleware\TrustProxies::class, - \Illuminate\Http\Middleware\HandleCors::class, - \App\Http\Middleware\PreventRequestsDuringMaintenance::class, - \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class, - \App\Http\Middleware\TrimStrings::class, - \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class, + InvokeDeferredCallbacks::class, + TrustProxies::class, + HandleCors::class, + PreventRequestsDuringMaintenance::class, + ValidatePostSize::class, + TrimStrings::class, + ConvertEmptyStringsToNull::class, ]); // Web middleware group (applied to routes/web.php) $middleware->web( append: [ - \App\Http\Middleware\FlashHelperMessage::class, - \Spatie\ResponseCache\Middlewares\CacheResponse::class, + FlashHelperMessage::class, + CacheResponse::class, ], replace: [ - \Illuminate\Cookie\Middleware\EncryptCookies::class => \App\Http\Middleware\EncryptCookies::class, - \Illuminate\Foundation\Http\Middleware\ValidateCsrfToken::class => \App\Http\Middleware\VerifyCsrfToken::class, + EncryptCookies::class => App\Http\Middleware\EncryptCookies::class, ] ); // API middleware group (applied to routes/api.php) $middleware->api( append: [ - \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class, + EnsureFrontendRequestsAreStateful::class, ], remove: ['throttle:api'] ); // Middleware aliases (for use in route definitions) $middleware->alias([ - 'auth' => \App\Http\Middleware\Authenticate::class, - 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, - 'ability' => \Laravel\Sanctum\Http\Middleware\CheckForAnyAbility::class, - 'doNotCacheResponse' => \Spatie\ResponseCache\Middlewares\DoNotCacheResponse::class, + 'auth' => Authenticate::class, + 'guest' => RedirectIfAuthenticated::class, + 'ability' => CheckForAnyAbility::class, + 'doNotCacheResponse' => DoNotCacheResponse::class, ]); }) ->withExceptions(function (Exceptions $exceptions) { diff --git a/composer.json b/composer.json index 98603d828..1d0073084 100644 --- a/composer.json +++ b/composer.json @@ -8,55 +8,52 @@ ], "license": "MIT", "require": { - "php": "^8.2", + "php": "^8.5", "ext-curl": "*", "ext-dom": "*", "ext-fileinfo": "*", "ext-memcached": "*", "ext-mongodb": "*", "ext-redis": "*", - "aws/aws-php-sns-message-validator": "^1.0", - "aws/aws-sdk-php": "~3.0", - "filament/filament": "^4.0", - "graham-campbell/markdown": "^v16.0.0.0", - "intervention/image-laravel": "^1.5", + "aws/aws-sdk-php": "^3.0", + "filament/filament": "^5.0", + "graham-campbell/markdown": "^16.0", + "intervention/image-laravel": "^4.0", "laracasts/utilities": "^3.2", - "laravel/framework": "^v12.0.0", + "laravel/framework": "^13.0", "laravel/reverb": "^1.0", - "laravel/sanctum": "^v4.0.0", - "laravel/tinker": "^2.5", + "laravel/sanctum": "^4.0", + "laravel/tinker": "^3.0", "laravel/ui": "^4.0", - "league/csv": "^9.6", + "league/csv": "^9.0", "league/flysystem-aws-s3-v3": "^3.0", - "league/oauth2-client": "^2.6", - "livewire/livewire": "^3.6", - "lstrojny/fxmlrpc": "^0.22.0", + "league/oauth2-client": "^2.0", + "livewire/livewire": "^4.0", + "lstrojny/fxmlrpc": "^0.22", "mongodb/laravel-mongodb": "^5.0", - "pda/pheanstalk": "^v8.0.0", + "pda/pheanstalk": "^8.0", "pusher/pusher-php-server": "^7.0", - "ratchet/pawl": "^0.4.3", - "react/event-loop": "^1.5", - "react/socket": "^1.16", - "spatie/laravel-honeypot": "^4.6", - "spatie/laravel-responsecache": "^7.7", - "supervisorphp/supervisor": "^5.1", - "tio/laravel": "^1.10", - "valentin-morice/filament-json-column": "dev-dev" + "ratchet/pawl": "^0.4", + "react/event-loop": "^1.0", + "react/socket": "^1.0", + "spatie/laravel-honeypot": "^4.0", + "spatie/laravel-responsecache": "^8.0", + "supervisorphp/supervisor": "^5.0", + "tio/laravel": "^1.0" }, "require-dev": { - "barryvdh/laravel-debugbar": "^3.5", - "barryvdh/laravel-ide-helper": "^v3.0.0", - "deployer/deployer": "^7.5", - "fakerphp/faker": "^1.23", - "kitloong/laravel-migrations-generator": "^v7.0.1", - "laradumps/laradumps": "^4.0", - "laravel/boost": "^v2.0.0", - "laravel/breeze": "^2.3", - "laravel/pail": "^1.2.2", - "laravel/pint": "^1.24", - "mockery/mockery": "^1.6", - "nunomaduro/collision": "^8.6", - "pestphp/pest": "^4.3", + "deployer/deployer": "^8.0", + "fakerphp/faker": "^1.0", + "fruitcake/laravel-debugbar": "^4.0", + "kitloong/laravel-migrations-generator": "^7.0", + "laradumps/laradumps": "^5.0", + "laravel/boost": "^2.0", + "laravel/breeze": "^2.0", + "laravel/pail": "^1.0", + "laravel/pint": "^1.0", + "mockery/mockery": "^1.0", + "nunomaduro/collision": "^8.9", + "pestphp/pest": "^4.0", "pestphp/pest-plugin-laravel": "^4.0", "spatie/laravel-ignition": "^2.0" }, diff --git a/composer.lock b/composer.lock index b338c7544..9c41f830d 100644 --- a/composer.lock +++ b/composer.lock @@ -4,74 +4,8 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "5b192631153357c32e46574d4b41b71a", + "content-hash": "625d580257ba816cc4971c579b7db6e8", "packages": [ - { - "name": "anourvalar/eloquent-serialize", - "version": "1.3.5", - "source": { - "type": "git", - "url": "https://github.com/AnourValar/eloquent-serialize.git", - "reference": "1a7dead8d532657e5358f8f27c0349373517681e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/AnourValar/eloquent-serialize/zipball/1a7dead8d532657e5358f8f27c0349373517681e", - "reference": "1a7dead8d532657e5358f8f27c0349373517681e", - "shasum": "" - }, - "require": { - "laravel/framework": "^8.0|^9.0|^10.0|^11.0|^12.0", - "php": "^7.4|^8.0" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "^3.26", - "laravel/legacy-factories": "^1.1", - "orchestra/testbench": "^6.0|^7.0|^8.0|^9.0|^10.0", - "phpstan/phpstan": "^2.0", - "phpunit/phpunit": "^9.5|^10.5|^11.0", - "psalm/plugin-laravel": "^2.8|^3.0", - "squizlabs/php_codesniffer": "^3.7" - }, - "type": "library", - "extra": { - "laravel": { - "aliases": { - "EloquentSerialize": "AnourValar\\EloquentSerialize\\Facades\\EloquentSerializeFacade" - } - } - }, - "autoload": { - "psr-4": { - "AnourValar\\EloquentSerialize\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Laravel Query Builder (Eloquent) serialization", - "homepage": "https://github.com/AnourValar/eloquent-serialize", - "keywords": [ - "anourvalar", - "builder", - "copy", - "eloquent", - "job", - "laravel", - "query", - "querybuilder", - "queue", - "serializable", - "serialization", - "serialize" - ], - "support": { - "issues": "https://github.com/AnourValar/eloquent-serialize/issues", - "source": "https://github.com/AnourValar/eloquent-serialize/tree/1.3.5" - }, - "time": "2025-12-04T13:38:21+00:00" - }, { "name": "aws/aws-crt-php", "version": "v1.2.7", @@ -126,77 +60,18 @@ }, "time": "2024-10-18T22:15:13+00:00" }, - { - "name": "aws/aws-php-sns-message-validator", - "version": "1.10.0", - "source": { - "type": "git", - "url": "https://github.com/aws/aws-php-sns-message-validator.git", - "reference": "d92d199179cbbf4d99601d4f23f61b9b8cc5da28" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/aws/aws-php-sns-message-validator/zipball/d92d199179cbbf4d99601d4f23f61b9b8cc5da28", - "reference": "d92d199179cbbf4d99601d4f23f61b9b8cc5da28", - "shasum": "" - }, - "require": { - "ext-openssl": "*", - "php": ">=8.1", - "psr/http-message": "^2.0" - }, - "require-dev": { - "guzzlehttp/psr7": "^2.4.5", - "phpunit/phpunit": "^5.6.3 || ^8.5 || ^9.5", - "squizlabs/php_codesniffer": "^2.3", - "yoast/phpunit-polyfills": "^1.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Aws\\Sns\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "authors": [ - { - "name": "Amazon Web Services", - "homepage": "http://aws.amazon.com" - } - ], - "description": "Amazon SNS message validation for PHP", - "homepage": "http://aws.amazon.com/sdkforphp", - "keywords": [ - "SNS", - "amazon", - "aws", - "cloud", - "message", - "sdk", - "webhooks" - ], - "support": { - "forum": "https://forums.aws.amazon.com/forum.jspa?forumID=80", - "issues": "https://github.com/aws/aws-sns-message-validator/issues", - "source": "https://github.com/aws/aws-php-sns-message-validator/tree/1.10.0" - }, - "time": "2025-03-05T22:22:58+00:00" - }, { "name": "aws/aws-sdk-php", - "version": "3.373.1", + "version": "3.381.2", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "f4c615488707167871699401cf153f23b75ad3f4" + "reference": "ffa8a93faafea878155853ae2caf61871363869d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/f4c615488707167871699401cf153f23b75ad3f4", - "reference": "f4c615488707167871699401cf153f23b75ad3f4", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/ffa8a93faafea878155853ae2caf61871363869d", + "reference": "ffa8a93faafea878155853ae2caf61871363869d", "shasum": "" }, "require": { @@ -278,32 +153,32 @@ "support": { "forum": "https://github.com/aws/aws-sdk-php/discussions", "issues": "https://github.com/aws/aws-sdk-php/issues", - "source": "https://github.com/aws/aws-sdk-php/tree/3.373.1" + "source": "https://github.com/aws/aws-sdk-php/tree/3.381.2" }, - "time": "2026-03-12T18:21:41+00:00" + "time": "2026-05-15T18:08:57+00:00" }, { "name": "blade-ui-kit/blade-heroicons", - "version": "2.6.0", + "version": "2.7.0", "source": { "type": "git", "url": "https://github.com/driesvints/blade-heroicons.git", - "reference": "4553b2a1f6c76f0ac7f3bc0de4c0cfa06a097d19" + "reference": "66fa8ba09dba12e0cdb410b8cb94f3b890eca440" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/driesvints/blade-heroicons/zipball/4553b2a1f6c76f0ac7f3bc0de4c0cfa06a097d19", - "reference": "4553b2a1f6c76f0ac7f3bc0de4c0cfa06a097d19", + "url": "https://api.github.com/repos/driesvints/blade-heroicons/zipball/66fa8ba09dba12e0cdb410b8cb94f3b890eca440", + "reference": "66fa8ba09dba12e0cdb410b8cb94f3b890eca440", "shasum": "" }, "require": { "blade-ui-kit/blade-icons": "^1.6", - "illuminate/support": "^9.0|^10.0|^11.0|^12.0", + "illuminate/support": "^9.0|^10.0|^11.0|^12.0|^13.0", "php": "^8.0" }, "require-dev": { - "orchestra/testbench": "^7.0|^8.0|^9.0|^10.0", - "phpunit/phpunit": "^9.0|^10.5|^11.0" + "orchestra/testbench": "^7.0|^8.0|^9.0|^10.0|^11.0", + "phpunit/phpunit": "^9.0|^10.5|^11.0|^12.0" }, "type": "library", "extra": { @@ -329,7 +204,7 @@ } ], "description": "A package to easily make use of Heroicons in your Laravel Blade views.", - "homepage": "https://github.com/blade-ui-kit/blade-heroicons", + "homepage": "https://github.com/driesvints/blade-heroicons", "keywords": [ "Heroicons", "blade", @@ -337,7 +212,7 @@ ], "support": { "issues": "https://github.com/driesvints/blade-heroicons/issues", - "source": "https://github.com/driesvints/blade-heroicons/tree/2.6.0" + "source": "https://github.com/driesvints/blade-heroicons/tree/2.7.0" }, "funding": [ { @@ -349,20 +224,20 @@ "type": "paypal" } ], - "time": "2025-02-13T20:53:33+00:00" + "time": "2026-03-16T13:00:23+00:00" }, { "name": "blade-ui-kit/blade-icons", - "version": "1.9.0", + "version": "1.10.0", "source": { "type": "git", "url": "https://github.com/driesvints/blade-icons.git", - "reference": "caa92fde675d7a651c38bf73ca582ddada56f318" + "reference": "74189a80bbaa4966aebaee54fec3a3c2ef0a5f3a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/driesvints/blade-icons/zipball/caa92fde675d7a651c38bf73ca582ddada56f318", - "reference": "caa92fde675d7a651c38bf73ca582ddada56f318", + "url": "https://api.github.com/repos/driesvints/blade-icons/zipball/74189a80bbaa4966aebaee54fec3a3c2ef0a5f3a", + "reference": "74189a80bbaa4966aebaee54fec3a3c2ef0a5f3a", "shasum": "" }, "require": { @@ -430,7 +305,7 @@ "type": "paypal" } ], - "time": "2026-02-23T10:42:23+00:00" + "time": "2026-04-23T19:03:45+00:00" }, { "name": "brick/math", @@ -656,16 +531,16 @@ }, { "name": "chillerlan/php-settings-container", - "version": "3.2.1", + "version": "3.3.0", "source": { "type": "git", "url": "https://github.com/chillerlan/php-settings-container.git", - "reference": "95ed3e9676a1d47cab2e3174d19b43f5dbf52681" + "reference": "a0a487cbf5344f721eb504bf0f59bada40c381b7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/chillerlan/php-settings-container/zipball/95ed3e9676a1d47cab2e3174d19b43f5dbf52681", - "reference": "95ed3e9676a1d47cab2e3174d19b43f5dbf52681", + "url": "https://api.github.com/repos/chillerlan/php-settings-container/zipball/a0a487cbf5344f721eb504bf0f59bada40c381b7", + "reference": "a0a487cbf5344f721eb504bf0f59bada40c381b7", "shasum": "" }, "require": { @@ -673,11 +548,13 @@ "php": "^8.1" }, "require-dev": { + "phan/phan": "^5.5.2", "phpmd/phpmd": "^2.15", - "phpstan/phpstan": "^1.11", - "phpstan/phpstan-deprecation-rules": "^1.2", + "phpstan/phpstan": "^2.1.31", + "phpstan/phpstan-deprecation-rules": "^2.0.3", "phpunit/phpunit": "^10.5", - "squizlabs/php_codesniffer": "^3.10" + "slevomat/coding-standard": "^8.22", + "squizlabs/php_codesniffer": "^4.0" }, "type": "library", "autoload": { @@ -702,7 +579,8 @@ "Settings", "configuration", "container", - "helper" + "helper", + "property hook" ], "support": { "issues": "https://github.com/chillerlan/php-settings-container/issues", @@ -718,7 +596,7 @@ "type": "ko_fi" } ], - "time": "2024-07-16T11:13:48+00:00" + "time": "2026-03-20T21:10:52+00:00" }, { "name": "clue/redis-protocol", @@ -903,27 +781,27 @@ }, { "name": "danharrin/livewire-rate-limiting", - "version": "v2.1.0", + "version": "v2.2.0", "source": { "type": "git", "url": "https://github.com/danharrin/livewire-rate-limiting.git", - "reference": "14dde653a9ae8f38af07a0ba4921dc046235e1a0" + "reference": "c03e649220089f6e5a52d422e24e3f98c73e456d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/danharrin/livewire-rate-limiting/zipball/14dde653a9ae8f38af07a0ba4921dc046235e1a0", - "reference": "14dde653a9ae8f38af07a0ba4921dc046235e1a0", + "url": "https://api.github.com/repos/danharrin/livewire-rate-limiting/zipball/c03e649220089f6e5a52d422e24e3f98c73e456d", + "reference": "c03e649220089f6e5a52d422e24e3f98c73e456d", "shasum": "" }, "require": { - "illuminate/support": "^9.0|^10.0|^11.0|^12.0", + "illuminate/support": "^9.0|^10.0|^11.0|^12.0|^13.0", "php": "^8.0" }, "require-dev": { "livewire/livewire": "^3.0", "livewire/volt": "^1.3", - "orchestra/testbench": "^7.0|^8.0|^9.0|^10.0", - "phpunit/phpunit": "^9.0|^10.0|^11.5.3" + "orchestra/testbench": "^7.0|^8.0|^9.0|^10.0|^11.0", + "phpunit/phpunit": "^9.0|^10.0|^11.5.3|^12.5.12" }, "type": "library", "autoload": { @@ -953,7 +831,7 @@ "type": "github" } ], - "time": "2025-02-21T08:52:11+00:00" + "time": "2026-03-16T11:29:23+00:00" }, { "name": "dflydev/dot-access-data", @@ -1377,20 +1255,19 @@ }, { "name": "filament/actions", - "version": "v4.8.4", + "version": "v5.6.3", "source": { "type": "git", "url": "https://github.com/filamentphp/actions.git", - "reference": "eb98736211f2209dc7df47eac254e32c5cfb2d15" + "reference": "38acd89eb7fa90ef97001b1be46742160554b05a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filamentphp/actions/zipball/eb98736211f2209dc7df47eac254e32c5cfb2d15", - "reference": "eb98736211f2209dc7df47eac254e32c5cfb2d15", + "url": "https://api.github.com/repos/filamentphp/actions/zipball/38acd89eb7fa90ef97001b1be46742160554b05a", + "reference": "38acd89eb7fa90ef97001b1be46742160554b05a", "shasum": "" }, "require": { - "anourvalar/eloquent-serialize": "^1.2", "filament/forms": "self.version", "filament/infolists": "self.version", "filament/notifications": "self.version", @@ -1422,20 +1299,20 @@ "issues": "https://github.com/filamentphp/filament/issues", "source": "https://github.com/filamentphp/filament" }, - "time": "2026-03-12T11:46:23+00:00" + "time": "2026-05-11T09:59:40+00:00" }, { "name": "filament/filament", - "version": "v4.8.4", + "version": "v5.6.3", "source": { "type": "git", "url": "https://github.com/filamentphp/panels.git", - "reference": "6bc3bfb932130b486614090438a68ac3a43c8fbe" + "reference": "01e18f82af33576291ea08d0880553a00e42f131" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filamentphp/panels/zipball/6bc3bfb932130b486614090438a68ac3a43c8fbe", - "reference": "6bc3bfb932130b486614090438a68ac3a43c8fbe", + "url": "https://api.github.com/repos/filamentphp/panels/zipball/01e18f82af33576291ea08d0880553a00e42f131", + "reference": "01e18f82af33576291ea08d0880553a00e42f131", "shasum": "" }, "require": { @@ -1479,20 +1356,20 @@ "issues": "https://github.com/filamentphp/filament/issues", "source": "https://github.com/filamentphp/filament" }, - "time": "2026-03-12T11:46:29+00:00" + "time": "2026-05-11T09:58:09+00:00" }, { "name": "filament/forms", - "version": "v4.8.4", + "version": "v5.6.3", "source": { "type": "git", "url": "https://github.com/filamentphp/forms.git", - "reference": "848ad8209d9470d88632464ac00abeae5dbde747" + "reference": "b140ab0f249d6ea9678fef896910af93d74b50c8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filamentphp/forms/zipball/848ad8209d9470d88632464ac00abeae5dbde747", - "reference": "848ad8209d9470d88632464ac00abeae5dbde747", + "url": "https://api.github.com/repos/filamentphp/forms/zipball/b140ab0f249d6ea9678fef896910af93d74b50c8", + "reference": "b140ab0f249d6ea9678fef896910af93d74b50c8", "shasum": "" }, "require": { @@ -1529,20 +1406,20 @@ "issues": "https://github.com/filamentphp/filament/issues", "source": "https://github.com/filamentphp/filament" }, - "time": "2026-03-12T14:21:07+00:00" + "time": "2026-05-11T09:57:47+00:00" }, { "name": "filament/infolists", - "version": "v4.8.4", + "version": "v5.6.3", "source": { "type": "git", "url": "https://github.com/filamentphp/infolists.git", - "reference": "9488c65ce965b248948bf6c69d7e782891944ca9" + "reference": "f7fbfe6d705e930f0a5f2e01286e4ec76b12cb7a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filamentphp/infolists/zipball/9488c65ce965b248948bf6c69d7e782891944ca9", - "reference": "9488c65ce965b248948bf6c69d7e782891944ca9", + "url": "https://api.github.com/repos/filamentphp/infolists/zipball/f7fbfe6d705e930f0a5f2e01286e4ec76b12cb7a", + "reference": "f7fbfe6d705e930f0a5f2e01286e4ec76b12cb7a", "shasum": "" }, "require": { @@ -1574,20 +1451,20 @@ "issues": "https://github.com/filamentphp/filament/issues", "source": "https://github.com/filamentphp/filament" }, - "time": "2026-03-12T11:52:13+00:00" + "time": "2026-05-11T09:57:44+00:00" }, { "name": "filament/notifications", - "version": "v4.8.4", + "version": "v5.6.3", "source": { "type": "git", "url": "https://github.com/filamentphp/notifications.git", - "reference": "7ac27f7702794a25a91cd8d305ddfb2f2a8d1088" + "reference": "970765bd93b6d5aee2e110e67586f28e3199c0c0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filamentphp/notifications/zipball/7ac27f7702794a25a91cd8d305ddfb2f2a8d1088", - "reference": "7ac27f7702794a25a91cd8d305ddfb2f2a8d1088", + "url": "https://api.github.com/repos/filamentphp/notifications/zipball/970765bd93b6d5aee2e110e67586f28e3199c0c0", + "reference": "970765bd93b6d5aee2e110e67586f28e3199c0c0", "shasum": "" }, "require": { @@ -1621,20 +1498,20 @@ "issues": "https://github.com/filamentphp/filament/issues", "source": "https://github.com/filamentphp/filament" }, - "time": "2026-03-12T11:47:14+00:00" + "time": "2026-04-24T08:57:15+00:00" }, { "name": "filament/query-builder", - "version": "v4.8.4", + "version": "v5.6.3", "source": { "type": "git", "url": "https://github.com/filamentphp/query-builder.git", - "reference": "35bc37dadb1e8294dbabf47b3b25ce52acc70f11" + "reference": "870972a57682c32dae18c9708241eb2c0f92a626" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filamentphp/query-builder/zipball/35bc37dadb1e8294dbabf47b3b25ce52acc70f11", - "reference": "35bc37dadb1e8294dbabf47b3b25ce52acc70f11", + "url": "https://api.github.com/repos/filamentphp/query-builder/zipball/870972a57682c32dae18c9708241eb2c0f92a626", + "reference": "870972a57682c32dae18c9708241eb2c0f92a626", "shasum": "" }, "require": { @@ -1667,20 +1544,20 @@ "issues": "https://github.com/filamentphp/filament/issues", "source": "https://github.com/filamentphp/filament" }, - "time": "2026-03-12T11:46:41+00:00" + "time": "2026-05-11T09:58:01+00:00" }, { "name": "filament/schemas", - "version": "v4.8.4", + "version": "v5.6.3", "source": { "type": "git", "url": "https://github.com/filamentphp/schemas.git", - "reference": "d32cb88b05abe6221ebe5f317e73e354d4067b6b" + "reference": "d2f79fe2dc22b0fa41dc24a35a8fdeb09a8a6765" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filamentphp/schemas/zipball/d32cb88b05abe6221ebe5f317e73e354d4067b6b", - "reference": "d32cb88b05abe6221ebe5f317e73e354d4067b6b", + "url": "https://api.github.com/repos/filamentphp/schemas/zipball/d2f79fe2dc22b0fa41dc24a35a8fdeb09a8a6765", + "reference": "d2f79fe2dc22b0fa41dc24a35a8fdeb09a8a6765", "shasum": "" }, "require": { @@ -1712,36 +1589,36 @@ "issues": "https://github.com/filamentphp/filament/issues", "source": "https://github.com/filamentphp/filament" }, - "time": "2026-03-12T11:51:18+00:00" + "time": "2026-05-11T09:57:37+00:00" }, { "name": "filament/support", - "version": "v4.8.4", + "version": "v5.6.3", "source": { "type": "git", "url": "https://github.com/filamentphp/support.git", - "reference": "18b3730decc6670e7824314002f39cba742a796e" + "reference": "c407ad2841d80866cc029bbad7eda0aa931c792c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filamentphp/support/zipball/18b3730decc6670e7824314002f39cba742a796e", - "reference": "18b3730decc6670e7824314002f39cba742a796e", + "url": "https://api.github.com/repos/filamentphp/support/zipball/c407ad2841d80866cc029bbad7eda0aa931c792c", + "reference": "c407ad2841d80866cc029bbad7eda0aa931c792c", "shasum": "" }, "require": { "blade-ui-kit/blade-heroicons": "^2.5", "danharrin/livewire-rate-limiting": "^2.0", "ext-intl": "*", - "illuminate/contracts": "^11.28|^12.0", + "illuminate/contracts": "^11.28|^12.0|^13.0", "kirschbaum-development/eloquent-power-joins": "^4.0", "league/uri-components": "^7.0", - "livewire/livewire": "^3.5", + "livewire/livewire": "^4.1", "nette/php-generator": "^4.0", "php": "^8.2", "ryangjchandler/blade-capture-directive": "^1.0", "spatie/invade": "^2.0", "spatie/laravel-package-tools": "^1.9", - "symfony/console": "^7.0", + "symfony/console": "^7.0|^8.0", "symfony/html-sanitizer": "^7.0|^8.0" }, "type": "library", @@ -1770,20 +1647,20 @@ "issues": "https://github.com/filamentphp/filament/issues", "source": "https://github.com/filamentphp/filament" }, - "time": "2026-03-12T11:48:52+00:00" + "time": "2026-05-11T09:58:44+00:00" }, { "name": "filament/tables", - "version": "v4.8.4", + "version": "v5.6.3", "source": { "type": "git", "url": "https://github.com/filamentphp/tables.git", - "reference": "da6f3e4813ea21bf7017bd4de8aa70c6668db1a7" + "reference": "ca6356a486f608c5b5d2a64575388dde0d1b6023" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filamentphp/tables/zipball/da6f3e4813ea21bf7017bd4de8aa70c6668db1a7", - "reference": "da6f3e4813ea21bf7017bd4de8aa70c6668db1a7", + "url": "https://api.github.com/repos/filamentphp/tables/zipball/ca6356a486f608c5b5d2a64575388dde0d1b6023", + "reference": "ca6356a486f608c5b5d2a64575388dde0d1b6023", "shasum": "" }, "require": { @@ -1816,20 +1693,20 @@ "issues": "https://github.com/filamentphp/filament/issues", "source": "https://github.com/filamentphp/filament" }, - "time": "2026-03-12T11:48:26+00:00" + "time": "2026-05-11T09:57:57+00:00" }, { "name": "filament/widgets", - "version": "v4.8.4", + "version": "v5.6.3", "source": { "type": "git", "url": "https://github.com/filamentphp/widgets.git", - "reference": "b4f124324a607fc43665a6947384a6664aaa7976" + "reference": "d395af226cdd63aeae7848ab52619201ee582bfd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filamentphp/widgets/zipball/b4f124324a607fc43665a6947384a6664aaa7976", - "reference": "b4f124324a607fc43665a6947384a6664aaa7976", + "url": "https://api.github.com/repos/filamentphp/widgets/zipball/d395af226cdd63aeae7848ab52619201ee582bfd", + "reference": "d395af226cdd63aeae7848ab52619201ee582bfd", "shasum": "" }, "require": { @@ -1860,7 +1737,7 @@ "issues": "https://github.com/filamentphp/filament/issues", "source": "https://github.com/filamentphp/filament" }, - "time": "2026-03-12T11:50:53+00:00" + "time": "2026-05-11T09:59:57+00:00" }, { "name": "fruitcake/php-cors", @@ -2081,31 +1958,31 @@ }, { "name": "graham-campbell/markdown", - "version": "v16.0.0", + "version": "v16.1.0", "source": { "type": "git", "url": "https://github.com/GrahamCampbell/Laravel-Markdown.git", - "reference": "040221ff01f167fbe53a047b0e9ac15cbb3b6d79" + "reference": "2f951f7cba4f2ab6af75b4b2821e93a81f6a70c0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/GrahamCampbell/Laravel-Markdown/zipball/040221ff01f167fbe53a047b0e9ac15cbb3b6d79", - "reference": "040221ff01f167fbe53a047b0e9ac15cbb3b6d79", + "url": "https://api.github.com/repos/GrahamCampbell/Laravel-Markdown/zipball/2f951f7cba4f2ab6af75b4b2821e93a81f6a70c0", + "reference": "2f951f7cba4f2ab6af75b4b2821e93a81f6a70c0", "shasum": "" }, "require": { - "illuminate/contracts": "^10.44 || ^11.0 || ^12.0", - "illuminate/filesystem": "^10.44 || ^11.0 || ^12.0", - "illuminate/support": "^10.44 || ^11.0 || ^12.0", - "illuminate/view": "^10.44 || ^11.0 || ^12.0", - "league/commonmark": "^2.6.1", + "illuminate/contracts": "^10.44 || ^11.0 || ^12.0 || ^13.0", + "illuminate/filesystem": "^10.44 || ^11.0 || ^12.0 || ^13.0", + "illuminate/support": "^10.44 || ^11.0 || ^12.0 || ^13.0", + "illuminate/view": "^10.44 || ^11.0 || ^12.0 || ^13.0", + "league/commonmark": "^2.8.2", "php": "^8.1" }, "require-dev": { - "graham-campbell/analyzer": "^5.0", + "graham-campbell/analyzer": "^5.1", "graham-campbell/testbench": "^6.2", - "mockery/mockery": "^1.6.6", - "phpunit/phpunit": "^10.5.45 || ^11.5.10" + "mockery/mockery": "^1.6.12", + "phpunit/phpunit": "^10.5.63 || ^11.5.55 || ^12.5.14" }, "type": "library", "extra": { @@ -2145,7 +2022,7 @@ ], "support": { "issues": "https://github.com/GrahamCampbell/Laravel-Markdown/issues", - "source": "https://github.com/GrahamCampbell/Laravel-Markdown/tree/v16.0.0" + "source": "https://github.com/GrahamCampbell/Laravel-Markdown/tree/v16.1.0" }, "funding": [ { @@ -2157,7 +2034,7 @@ "type": "tidelift" } ], - "time": "2025-03-02T23:41:30+00:00" + "time": "2026-03-19T20:52:58+00:00" }, { "name": "graham-campbell/result-type", @@ -2635,26 +2512,26 @@ }, { "name": "intervention/gif", - "version": "4.2.4", + "version": "5.0.1", "source": { "type": "git", "url": "https://github.com/Intervention/gif.git", - "reference": "c3598a16ebe7690cd55640c44144a9df383ea73c" + "reference": "bb395af960deffe64d70c976b4df9283f68e762d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Intervention/gif/zipball/c3598a16ebe7690cd55640c44144a9df383ea73c", - "reference": "c3598a16ebe7690cd55640c44144a9df383ea73c", + "url": "https://api.github.com/repos/Intervention/gif/zipball/bb395af960deffe64d70c976b4df9283f68e762d", + "reference": "bb395af960deffe64d70c976b4df9283f68e762d", "shasum": "" }, "require": { - "php": "^8.1" + "php": "^8.3" }, "require-dev": { "phpstan/phpstan": "^2.1", - "phpunit/phpunit": "^10.0 || ^11.0 || ^12.0", + "phpunit/phpunit": "^12.0", "slevomat/coding-standard": "~8.0", - "squizlabs/php_codesniffer": "^3.8" + "squizlabs/php_codesniffer": "^4" }, "type": "library", "autoload": { @@ -2673,7 +2550,7 @@ "homepage": "https://intervention.io/" } ], - "description": "Native PHP GIF Encoder/Decoder", + "description": "PHP GIF Encoder/Decoder", "homepage": "https://github.com/intervention/gif", "keywords": [ "animation", @@ -2683,7 +2560,7 @@ ], "support": { "issues": "https://github.com/Intervention/gif/issues", - "source": "https://github.com/Intervention/gif/tree/4.2.4" + "source": "https://github.com/Intervention/gif/tree/5.0.1" }, "funding": [ { @@ -2699,33 +2576,33 @@ "type": "ko_fi" } ], - "time": "2026-01-04T09:27:23+00:00" + "time": "2026-05-03T06:04:47+00:00" }, { "name": "intervention/image", - "version": "3.11.7", + "version": "4.1.0", "source": { "type": "git", "url": "https://github.com/Intervention/image.git", - "reference": "2159bcccff18f09d2a392679b81a82c5a003f9bb" + "reference": "fb795553f76afbe55c80d32b6bfe2090a6b1a0af" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Intervention/image/zipball/2159bcccff18f09d2a392679b81a82c5a003f9bb", - "reference": "2159bcccff18f09d2a392679b81a82c5a003f9bb", + "url": "https://api.github.com/repos/Intervention/image/zipball/fb795553f76afbe55c80d32b6bfe2090a6b1a0af", + "reference": "fb795553f76afbe55c80d32b6bfe2090a6b1a0af", "shasum": "" }, "require": { "ext-mbstring": "*", - "intervention/gif": "^4.2", - "php": "^8.1" + "intervention/gif": "^5", + "php": "^8.3" }, "require-dev": { "mockery/mockery": "^1.6", "phpstan/phpstan": "^2.1", - "phpunit/phpunit": "^10.0 || ^11.0 || ^12.0", + "phpunit/phpunit": "^12.0", "slevomat/coding-standard": "~8.0", - "squizlabs/php_codesniffer": "^3.8" + "squizlabs/php_codesniffer": "^4" }, "suggest": { "ext-exif": "Recommended to be able to read EXIF data properly." @@ -2759,7 +2636,7 @@ ], "support": { "issues": "https://github.com/Intervention/image/issues", - "source": "https://github.com/Intervention/image/tree/3.11.7" + "source": "https://github.com/Intervention/image/tree/4.1.0" }, "funding": [ { @@ -2775,28 +2652,28 @@ "type": "ko_fi" } ], - "time": "2026-02-19T13:11:17+00:00" + "time": "2026-05-15T06:52:36+00:00" }, { "name": "intervention/image-laravel", - "version": "1.5.7", + "version": "4.0.0", "source": { "type": "git", "url": "https://github.com/Intervention/image-laravel.git", - "reference": "86a53a154024e8b2f52cbdeac13f6bdb1aaedfaa" + "reference": "03660a35e1007389db35f54fb44f4ae8fbfe0b2b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Intervention/image-laravel/zipball/86a53a154024e8b2f52cbdeac13f6bdb1aaedfaa", - "reference": "86a53a154024e8b2f52cbdeac13f6bdb1aaedfaa", + "url": "https://api.github.com/repos/Intervention/image-laravel/zipball/03660a35e1007389db35f54fb44f4ae8fbfe0b2b", + "reference": "03660a35e1007389db35f54fb44f4ae8fbfe0b2b", "shasum": "" }, "require": { "illuminate/http": "^8|^9|^10|^11|^12|^13", "illuminate/routing": "^8|^9|^10|^11|^12|^13", "illuminate/support": "^8|^9|^10|^11|^12|^13", - "intervention/image": "^3.11", - "php": "^8.1" + "intervention/image": "^4.0", + "php": "^8.3" }, "require-dev": { "ext-fileinfo": "*", @@ -2843,7 +2720,7 @@ ], "support": { "issues": "https://github.com/Intervention/image-laravel/issues", - "source": "https://github.com/Intervention/image-laravel/tree/1.5.7" + "source": "https://github.com/Intervention/image-laravel/tree/4.0.0" }, "funding": [ { @@ -2859,32 +2736,32 @@ "type": "ko_fi" } ], - "time": "2026-02-28T06:49:50+00:00" + "time": "2026-03-28T07:12:58+00:00" }, { "name": "kirschbaum-development/eloquent-power-joins", - "version": "4.2.11", + "version": "4.3.1", "source": { "type": "git", "url": "https://github.com/kirschbaum-development/eloquent-power-joins.git", - "reference": "0e3e3372992e4bf82391b3c7b84b435c3db73588" + "reference": "3f77b096c1e8b5aa1fc40d7080e55e795f3430ae" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/kirschbaum-development/eloquent-power-joins/zipball/0e3e3372992e4bf82391b3c7b84b435c3db73588", - "reference": "0e3e3372992e4bf82391b3c7b84b435c3db73588", + "url": "https://api.github.com/repos/kirschbaum-development/eloquent-power-joins/zipball/3f77b096c1e8b5aa1fc40d7080e55e795f3430ae", + "reference": "3f77b096c1e8b5aa1fc40d7080e55e795f3430ae", "shasum": "" }, "require": { - "illuminate/database": "^11.42|^12.0", - "illuminate/support": "^11.42|^12.0", + "illuminate/database": "^11.42|^12.0|^13.0", + "illuminate/support": "^11.42|^12.0|^13.0", "php": "^8.2" }, "require-dev": { "friendsofphp/php-cs-fixer": "dev-master", - "laravel/legacy-factories": "^1.0@dev", - "orchestra/testbench": "^9.0|^10.0", - "phpunit/phpunit": "^10.0|^11.0" + "laravel/legacy-factories": "^1.0@dev|dev-master", + "orchestra/testbench": "^9.0|^10.0|^11.0", + "phpunit/phpunit": "^10.0|^11.0|^12.0" }, "type": "library", "extra": { @@ -2920,9 +2797,9 @@ ], "support": { "issues": "https://github.com/kirschbaum-development/eloquent-power-joins/issues", - "source": "https://github.com/kirschbaum-development/eloquent-power-joins/tree/4.2.11" + "source": "https://github.com/kirschbaum-development/eloquent-power-joins/tree/4.3.1" }, - "time": "2025-12-17T00:37:48+00:00" + "time": "2026-03-29T12:05:03+00:00" }, { "name": "laracasts/utilities", @@ -2987,24 +2864,24 @@ }, { "name": "laravel/framework", - "version": "v12.54.1", + "version": "v13.9.0", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "325497463e7599cd14224c422c6e5dd2fe832868" + "reference": "a0c6ad03b380287015287d8d5a0fa2459e2332fd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/325497463e7599cd14224c422c6e5dd2fe832868", - "reference": "325497463e7599cd14224c422c6e5dd2fe832868", + "url": "https://api.github.com/repos/laravel/framework/zipball/a0c6ad03b380287015287d8d5a0fa2459e2332fd", + "reference": "a0c6ad03b380287015287d8d5a0fa2459e2332fd", "shasum": "" }, "require": { - "brick/math": "^0.11|^0.12|^0.13|^0.14", + "brick/math": "^0.14.2 || ^0.15 || ^0.16 || ^0.17", "composer-runtime-api": "^2.2", "doctrine/inflector": "^2.0.5", "dragonmantank/cron-expression": "^3.4", - "egulias/email-validator": "^3.2.1|^4.0", + "egulias/email-validator": "^4.0", "ext-ctype": "*", "ext-filter": "*", "ext-hash": "*", @@ -3014,9 +2891,10 @@ "ext-tokenizer": "*", "fruitcake/php-cors": "^1.3", "guzzlehttp/guzzle": "^7.8.2", + "guzzlehttp/promises": "^2.0.3", "guzzlehttp/uri-template": "^1.0", "laravel/prompts": "^0.3.0", - "laravel/serializable-closure": "^1.3|^2.0", + "laravel/serializable-closure": "^2.0.10", "league/commonmark": "^2.8.1", "league/flysystem": "^3.25.1", "league/flysystem-local": "^3.25.1", @@ -3024,25 +2902,25 @@ "monolog/monolog": "^3.0", "nesbot/carbon": "^3.8.4", "nunomaduro/termwind": "^2.0", - "php": "^8.2", - "psr/container": "^1.1.1|^2.0.1", - "psr/log": "^1.0|^2.0|^3.0", - "psr/simple-cache": "^1.0|^2.0|^3.0", + "php": "^8.3", + "psr/container": "^1.1.1 || ^2.0.1", + "psr/log": "^1.0 || ^2.0 || ^3.0", + "psr/simple-cache": "^1.0 || ^2.0 || ^3.0", "ramsey/uuid": "^4.7", - "symfony/console": "^7.2.0", - "symfony/error-handler": "^7.2.0", - "symfony/finder": "^7.2.0", - "symfony/http-foundation": "^7.2.0", - "symfony/http-kernel": "^7.2.0", - "symfony/mailer": "^7.2.0", - "symfony/mime": "^7.2.0", - "symfony/polyfill-php83": "^1.33", - "symfony/polyfill-php84": "^1.33", - "symfony/polyfill-php85": "^1.33", - "symfony/process": "^7.2.0", - "symfony/routing": "^7.2.0", - "symfony/uid": "^7.2.0", - "symfony/var-dumper": "^7.2.0", + "symfony/console": "^7.4.0 || ^8.0.0", + "symfony/error-handler": "^7.4.0 || ^8.0.0", + "symfony/finder": "^7.4.0 || ^8.0.0", + "symfony/http-foundation": "^7.4.0 || ^8.0.0", + "symfony/http-kernel": "^7.4.0 || ^8.0.0", + "symfony/mailer": "^7.4.0 || ^8.0.0", + "symfony/mime": "^7.4.0 || ^8.0.0", + "symfony/polyfill-php84": "^1.36", + "symfony/polyfill-php85": "^1.36", + "symfony/polyfill-php86": "^1.36", + "symfony/process": "^7.4.5 || ^8.0.5", + "symfony/routing": "^7.4.0 || ^8.0.0", + "symfony/uid": "^7.4.0 || ^8.0.0", + "symfony/var-dumper": "^7.4.0 || ^8.0.0", "tijsverkoyen/css-to-inline-styles": "^2.2.5", "vlucas/phpdotenv": "^5.6.1", "voku/portable-ascii": "^2.0.2" @@ -3051,9 +2929,9 @@ "tightenco/collect": "<5.5.33" }, "provide": { - "psr/container-implementation": "1.1|2.0", - "psr/log-implementation": "1.0|2.0|3.0", - "psr/simple-cache-implementation": "1.0|2.0|3.0" + "psr/container-implementation": "1.1 || 2.0", + "psr/log-implementation": "1.0 || 2.0 || 3.0", + "psr/simple-cache-implementation": "1.0 || 2.0 || 3.0" }, "replace": { "illuminate/auth": "self.version", @@ -3099,8 +2977,7 @@ "aws/aws-sdk-php": "^3.322.9", "ext-gmp": "*", "fakerphp/faker": "^1.24", - "guzzlehttp/promises": "^2.0.3", - "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", @@ -3109,22 +2986,23 @@ "league/flysystem-sftp-v3": "^3.25.1", "mockery/mockery": "^1.6.10", "opis/json-schema": "^2.4.1", - "orchestra/testbench-core": "^10.9.0", - "pda/pheanstalk": "^5.0.6|^7.0.0", + "orchestra/testbench-core": "^11.0.0", + "pda/pheanstalk": "^7.0.0 || ^8.0.0", "php-http/discovery": "^1.15", "phpstan/phpstan": "^2.0", - "phpunit/phpunit": "^10.5.35|^11.5.3|^12.0.1", - "predis/predis": "^2.3|^3.0", - "resend/resend-php": "^0.10.0|^1.0", - "symfony/cache": "^7.2.0", - "symfony/http-client": "^7.2.0", - "symfony/psr-http-message-bridge": "^7.2.0", - "symfony/translation": "^7.2.0" + "phpunit/phpunit": "^11.5.50 || ^12.5.8 || ^13.0.3", + "predis/predis": "^2.3 || ^3.0", + "rector/rector": "^2.3", + "resend/resend-php": "^1.0", + "symfony/cache": "^7.4.0 || ^8.0.0", + "symfony/http-client": "^7.4.0 || ^8.0.0", + "symfony/psr-http-message-bridge": "^7.4.0 || ^8.0.0", + "symfony/translation": "^7.4.0 || ^8.0.0" }, "suggest": { "ably/ably-php": "Required to use the Ably broadcast driver (^1.0).", "aws/aws-sdk-php": "Required to use the SQS queue driver, DynamoDb failed job storage, and SES mail driver (^3.322.9).", - "brianium/paratest": "Required to run tests in parallel (^7.0|^8.0).", + "brianium/paratest": "Required to run tests in parallel (^7.0 || ^8.0).", "ext-apcu": "Required to use the APC cache driver.", "ext-fileinfo": "Required to use the Filesystem class.", "ext-ftp": "Required to use the Flysystem FTP driver.", @@ -3133,7 +3011,7 @@ "ext-pcntl": "Required to use all features of the queue worker and console signal trapping.", "ext-pdo": "Required to use all database features.", "ext-posix": "Required to use all features of the queue worker.", - "ext-redis": "Required to use the Redis cache and queue drivers (^4.0|^5.0|^6.0).", + "ext-redis": "Required to use the Redis cache and queue drivers (^4.0 || ^5.0 || ^6.0).", "fakerphp/faker": "Required to generate fake data using the fake() helper (^1.23).", "filp/whoops": "Required for friendly error pages in development (^2.14.3).", "laravel/tinker": "Required to use the tinker console command (^2.0).", @@ -3143,24 +3021,25 @@ "league/flysystem-read-only": "Required to use read-only disks (^3.25.1)", "league/flysystem-sftp-v3": "Required to use the Flysystem SFTP driver (^3.25.1).", "mockery/mockery": "Required to use mocking (^1.6).", - "pda/pheanstalk": "Required to use the beanstalk queue driver (^5.0).", + "pda/pheanstalk": "Required to use the beanstalk queue driver (^7.0 || ^8.0).", "php-http/discovery": "Required to use PSR-7 bridging features (^1.15).", - "phpunit/phpunit": "Required to use assertions and run tests (^10.5.35|^11.5.3|^12.0.1).", - "predis/predis": "Required to use the predis connector (^2.3|^3.0).", + "phpunit/phpunit": "Required to use assertions and run tests (^11.5.50 || ^12.5.8 || ^13.0.3).", + "predis/predis": "Required to use the predis connector (^2.3 || ^3.0).", "psr/http-message": "Required to allow Storage::put to accept a StreamInterface (^1.0).", - "pusher/pusher-php-server": "Required to use the Pusher broadcast driver (^6.0|^7.0).", - "resend/resend-php": "Required to enable support for the Resend mail transport (^0.10.0|^1.0).", - "symfony/cache": "Required to PSR-6 cache bridge (^7.2).", - "symfony/filesystem": "Required to enable support for relative symbolic links (^7.2).", - "symfony/http-client": "Required to enable support for the Symfony API mail transports (^7.2).", - "symfony/mailgun-mailer": "Required to enable support for the Mailgun mail transport (^7.2).", - "symfony/postmark-mailer": "Required to enable support for the Postmark mail transport (^7.2).", - "symfony/psr-http-message-bridge": "Required to use PSR-7 bridging features (^7.2)." + "pusher/pusher-php-server": "Required to use the Pusher broadcast driver (^6.0 || ^7.0).", + "resend/resend-php": "Required to enable support for the Resend mail transport (^0.10.0 || ^1.0).", + "spatie/fork": "Required to use the 'fork' concurrency driver (^1.2).", + "symfony/cache": "Required to PSR-6 cache bridge (^7.4 || ^8.0).", + "symfony/filesystem": "Required to enable support for relative symbolic links (^7.4 || ^8.0).", + "symfony/http-client": "Required to enable support for the Symfony API mail transports (^7.4 || ^8.0).", + "symfony/mailgun-mailer": "Required to enable support for the Mailgun mail transport (^7.4 || ^8.0).", + "symfony/postmark-mailer": "Required to enable support for the Postmark mail transport (^7.4 || ^8.0).", + "symfony/psr-http-message-bridge": "Required to use PSR-7 bridging features (^7.4 || ^8.0)." }, "type": "library", "extra": { "branch-alias": { - "dev-master": "12.x-dev" + "dev-master": "13.0.x-dev" } }, "autoload": { @@ -3205,20 +3084,20 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2026-03-10T20:25:56+00:00" + "time": "2026-05-13T15:38:40+00:00" }, { "name": "laravel/prompts", - "version": "v0.3.14", + "version": "v0.3.17", "source": { "type": "git", "url": "https://github.com/laravel/prompts.git", - "reference": "9f0e371244eedfe2ebeaa72c79c54bb5df6e0176" + "reference": "6a82ac19a28b916ae0885828795dbd4c59d9a818" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/prompts/zipball/9f0e371244eedfe2ebeaa72c79c54bb5df6e0176", - "reference": "9f0e371244eedfe2ebeaa72c79c54bb5df6e0176", + "url": "https://api.github.com/repos/laravel/prompts/zipball/6a82ac19a28b916ae0885828795dbd4c59d9a818", + "reference": "6a82ac19a28b916ae0885828795dbd4c59d9a818", "shasum": "" }, "require": { @@ -3262,22 +3141,22 @@ "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.14" + "source": "https://github.com/laravel/prompts/tree/v0.3.17" }, - "time": "2026-03-01T09:02:38+00:00" + "time": "2026-04-20T16:07:33+00:00" }, { "name": "laravel/reverb", - "version": "v1.8.0", + "version": "v1.10.2", "source": { "type": "git", "url": "https://github.com/laravel/reverb.git", - "reference": "53753b72035f1b13899fa57d2ad4dfe9480c8d61" + "reference": "43a5c0a99b1aaba33dc32f97fcf51f182dd8c8ac" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/reverb/zipball/53753b72035f1b13899fa57d2ad4dfe9480c8d61", - "reference": "53753b72035f1b13899fa57d2ad4dfe9480c8d61", + "url": "https://api.github.com/repos/laravel/reverb/zipball/43a5c0a99b1aaba33dc32f97fcf51f182dd8c8ac", + "reference": "43a5c0a99b1aaba33dc32f97fcf51f182dd8c8ac", "shasum": "" }, "require": { @@ -3341,22 +3220,22 @@ ], "support": { "issues": "https://github.com/laravel/reverb/issues", - "source": "https://github.com/laravel/reverb/tree/v1.8.0" + "source": "https://github.com/laravel/reverb/tree/v1.10.2" }, - "time": "2026-02-21T14:37:48+00:00" + "time": "2026-05-10T15:47:52+00:00" }, { "name": "laravel/sanctum", - "version": "v4.3.1", + "version": "v4.3.2", "source": { "type": "git", "url": "https://github.com/laravel/sanctum.git", - "reference": "e3b85d6e36ad00e5db2d1dcc27c81ffdf15cbf76" + "reference": "2a9bccc18e9907808e0018dd15fa643937886b1e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/sanctum/zipball/e3b85d6e36ad00e5db2d1dcc27c81ffdf15cbf76", - "reference": "e3b85d6e36ad00e5db2d1dcc27c81ffdf15cbf76", + "url": "https://api.github.com/repos/laravel/sanctum/zipball/2a9bccc18e9907808e0018dd15fa643937886b1e", + "reference": "2a9bccc18e9907808e0018dd15fa643937886b1e", "shasum": "" }, "require": { @@ -3406,20 +3285,20 @@ "issues": "https://github.com/laravel/sanctum/issues", "source": "https://github.com/laravel/sanctum" }, - "time": "2026-02-07T17:19:31+00:00" + "time": "2026-04-30T11:46:25+00:00" }, { "name": "laravel/serializable-closure", - "version": "v2.0.10", + "version": "v2.0.13", "source": { "type": "git", "url": "https://github.com/laravel/serializable-closure.git", - "reference": "870fc81d2f879903dfc5b60bf8a0f94a1609e669" + "reference": "b566ee0dd251f3c4078bed003a7ce015f5ea6dce" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/870fc81d2f879903dfc5b60bf8a0f94a1609e669", - "reference": "870fc81d2f879903dfc5b60bf8a0f94a1609e669", + "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/b566ee0dd251f3c4078bed003a7ce015f5ea6dce", + "reference": "b566ee0dd251f3c4078bed003a7ce015f5ea6dce", "shasum": "" }, "require": { @@ -3467,37 +3346,37 @@ "issues": "https://github.com/laravel/serializable-closure/issues", "source": "https://github.com/laravel/serializable-closure" }, - "time": "2026-02-20T19:59:49+00:00" + "time": "2026-04-16T14:03:50+00:00" }, { "name": "laravel/tinker", - "version": "v2.11.1", + "version": "v3.0.2", "source": { "type": "git", "url": "https://github.com/laravel/tinker.git", - "reference": "c9f80cc835649b5c1842898fb043f8cc098dd741" + "reference": "4faba77764bd33411735936acdf30446d058c78b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/tinker/zipball/c9f80cc835649b5c1842898fb043f8cc098dd741", - "reference": "c9f80cc835649b5c1842898fb043f8cc098dd741", + "url": "https://api.github.com/repos/laravel/tinker/zipball/4faba77764bd33411735936acdf30446d058c78b", + "reference": "4faba77764bd33411735936acdf30446d058c78b", "shasum": "" }, "require": { - "illuminate/console": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0", - "illuminate/contracts": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0", - "illuminate/support": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0", - "php": "^7.2.5|^8.0", - "psy/psysh": "^0.11.1|^0.12.0", - "symfony/var-dumper": "^4.3.4|^5.0|^6.0|^7.0|^8.0" + "illuminate/console": "^8.0|^9.0|^10.0|^11.0|^12.0|^13.0", + "illuminate/contracts": "^8.0|^9.0|^10.0|^11.0|^12.0|^13.0", + "illuminate/support": "^8.0|^9.0|^10.0|^11.0|^12.0|^13.0", + "php": "^8.1", + "psy/psysh": "^0.12.0", + "symfony/var-dumper": "^5.4|^6.0|^7.0|^8.0" }, "require-dev": { "mockery/mockery": "~1.3.3|^1.4.2", "phpstan/phpstan": "^1.10", - "phpunit/phpunit": "^8.5.8|^9.3.3|^10.0" + "phpunit/phpunit": "^10.5|^11.5" }, "suggest": { - "illuminate/database": "The Illuminate Database package (^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0)." + "illuminate/database": "The Illuminate Database package (^8.0|^9.0|^10.0|^11.0|^12.0|^13.0)." }, "type": "library", "extra": { @@ -3505,6 +3384,9 @@ "providers": [ "Laravel\\Tinker\\TinkerServiceProvider" ] + }, + "branch-alias": { + "dev-master": "3.x-dev" } }, "autoload": { @@ -3531,35 +3413,35 @@ ], "support": { "issues": "https://github.com/laravel/tinker/issues", - "source": "https://github.com/laravel/tinker/tree/v2.11.1" + "source": "https://github.com/laravel/tinker/tree/v3.0.2" }, - "time": "2026-02-06T14:12:35+00:00" + "time": "2026-03-17T14:54:13+00:00" }, { "name": "laravel/ui", - "version": "v4.6.2", + "version": "v4.6.3", "source": { "type": "git", "url": "https://github.com/laravel/ui.git", - "reference": "4acfa331aa073f169a22d87851dc51eb2f7ac6be" + "reference": "ff27db15416c1ed8ad9848f5692e47595dd5de27" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/ui/zipball/4acfa331aa073f169a22d87851dc51eb2f7ac6be", - "reference": "4acfa331aa073f169a22d87851dc51eb2f7ac6be", + "url": "https://api.github.com/repos/laravel/ui/zipball/ff27db15416c1ed8ad9848f5692e47595dd5de27", + "reference": "ff27db15416c1ed8ad9848f5692e47595dd5de27", "shasum": "" }, "require": { - "illuminate/console": "^9.21|^10.0|^11.0|^12.0", - "illuminate/filesystem": "^9.21|^10.0|^11.0|^12.0", - "illuminate/support": "^9.21|^10.0|^11.0|^12.0", - "illuminate/validation": "^9.21|^10.0|^11.0|^12.0", + "illuminate/console": "^9.21|^10.0|^11.0|^12.0|^13.0", + "illuminate/filesystem": "^9.21|^10.0|^11.0|^12.0|^13.0", + "illuminate/support": "^9.21|^10.0|^11.0|^12.0|^13.0", + "illuminate/validation": "^9.21|^10.0|^11.0|^12.0|^13.0", "php": "^8.0", - "symfony/console": "^6.0|^7.0" + "symfony/console": "^6.0|^7.0|^8.0" }, "require-dev": { - "orchestra/testbench": "^7.35|^8.15|^9.0|^10.0", - "phpunit/phpunit": "^9.3|^10.4|^11.5" + "orchestra/testbench": "^7.35|^8.15|^9.0|^10.0|^11.0", + "phpunit/phpunit": "^9.3|^10.4|^11.5|^12.5|^13.0" }, "type": "library", "extra": { @@ -3594,22 +3476,22 @@ "ui" ], "support": { - "source": "https://github.com/laravel/ui/tree/v4.6.2" + "source": "https://github.com/laravel/ui/tree/v4.6.3" }, - "time": "2026-03-10T20:00:50+00:00" + "time": "2026-03-17T13:41:52+00:00" }, { "name": "league/commonmark", - "version": "2.8.1", + "version": "2.8.2", "source": { "type": "git", "url": "https://github.com/thephpleague/commonmark.git", - "reference": "84b1ca48347efdbe775426f108622a42735a6579" + "reference": "59fb075d2101740c337c7216e3f32b36c204218b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/84b1ca48347efdbe775426f108622a42735a6579", - "reference": "84b1ca48347efdbe775426f108622a42735a6579", + "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/59fb075d2101740c337c7216e3f32b36c204218b", + "reference": "59fb075d2101740c337c7216e3f32b36c204218b", "shasum": "" }, "require": { @@ -3703,7 +3585,7 @@ "type": "tidelift" } ], - "time": "2026-03-05T21:37:03+00:00" + "time": "2026-03-19T13:16:38+00:00" }, { "name": "league/config", @@ -3880,16 +3762,16 @@ }, { "name": "league/flysystem", - "version": "3.32.0", + "version": "3.34.0", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem.git", - "reference": "254b1595b16b22dbddaaef9ed6ca9fdac4956725" + "reference": "2daaac3b0d4c83ea7ed5d8586e786f5d00f3540e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/254b1595b16b22dbddaaef9ed6ca9fdac4956725", - "reference": "254b1595b16b22dbddaaef9ed6ca9fdac4956725", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/2daaac3b0d4c83ea7ed5d8586e786f5d00f3540e", + "reference": "2daaac3b0d4c83ea7ed5d8586e786f5d00f3540e", "shasum": "" }, "require": { @@ -3957,26 +3839,26 @@ ], "support": { "issues": "https://github.com/thephpleague/flysystem/issues", - "source": "https://github.com/thephpleague/flysystem/tree/3.32.0" + "source": "https://github.com/thephpleague/flysystem/tree/3.34.0" }, - "time": "2026-02-25T17:01:41+00:00" + "time": "2026-05-14T10:28:08+00:00" }, { "name": "league/flysystem-aws-s3-v3", - "version": "3.32.0", + "version": "3.34.0", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem-aws-s3-v3.git", - "reference": "a1979df7c9784d334ea6df356aed3d18ac6673d0" + "reference": "0c62fdac907791d8649ad3c61cb7a77628344fb8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem-aws-s3-v3/zipball/a1979df7c9784d334ea6df356aed3d18ac6673d0", - "reference": "a1979df7c9784d334ea6df356aed3d18ac6673d0", + "url": "https://api.github.com/repos/thephpleague/flysystem-aws-s3-v3/zipball/0c62fdac907791d8649ad3c61cb7a77628344fb8", + "reference": "0c62fdac907791d8649ad3c61cb7a77628344fb8", "shasum": "" }, "require": { - "aws/aws-sdk-php": "^3.295.10", + "aws/aws-sdk-php": "^3.371.5", "league/flysystem": "^3.10.0", "league/mime-type-detection": "^1.0.0", "php": "^8.0.2" @@ -4012,9 +3894,9 @@ "storage" ], "support": { - "source": "https://github.com/thephpleague/flysystem-aws-s3-v3/tree/3.32.0" + "source": "https://github.com/thephpleague/flysystem-aws-s3-v3/tree/3.34.0" }, - "time": "2026-02-25T16:46:44+00:00" + "time": "2026-05-04T08:24:00+00:00" }, { "name": "league/flysystem-local", @@ -4188,20 +4070,20 @@ }, { "name": "league/uri", - "version": "7.8.0", + "version": "7.8.1", "source": { "type": "git", "url": "https://github.com/thephpleague/uri.git", - "reference": "4436c6ec8d458e4244448b069cc572d088230b76" + "reference": "08cf38e3924d4f56238125547b5720496fac8fd4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/uri/zipball/4436c6ec8d458e4244448b069cc572d088230b76", - "reference": "4436c6ec8d458e4244448b069cc572d088230b76", + "url": "https://api.github.com/repos/thephpleague/uri/zipball/08cf38e3924d4f56238125547b5720496fac8fd4", + "reference": "08cf38e3924d4f56238125547b5720496fac8fd4", "shasum": "" }, "require": { - "league/uri-interfaces": "^7.8", + "league/uri-interfaces": "^7.8.1", "php": "^8.1", "psr/http-factory": "^1" }, @@ -4274,7 +4156,7 @@ "docs": "https://uri.thephpleague.com", "forum": "https://thephpleague.slack.com", "issues": "https://github.com/thephpleague/uri-src/issues", - "source": "https://github.com/thephpleague/uri/tree/7.8.0" + "source": "https://github.com/thephpleague/uri/tree/7.8.1" }, "funding": [ { @@ -4282,24 +4164,24 @@ "type": "github" } ], - "time": "2026-01-14T17:24:56+00:00" + "time": "2026-03-15T20:22:25+00:00" }, { "name": "league/uri-components", - "version": "7.8.0", + "version": "7.8.1", "source": { "type": "git", "url": "https://github.com/thephpleague/uri-components.git", - "reference": "8b5ffcebcc0842b76eb80964795bd56a8333b2ba" + "reference": "848ff9db2f0be06229d6034b7c2e33d41b4fd675" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/uri-components/zipball/8b5ffcebcc0842b76eb80964795bd56a8333b2ba", - "reference": "8b5ffcebcc0842b76eb80964795bd56a8333b2ba", + "url": "https://api.github.com/repos/thephpleague/uri-components/zipball/848ff9db2f0be06229d6034b7c2e33d41b4fd675", + "reference": "848ff9db2f0be06229d6034b7c2e33d41b4fd675", "shasum": "" }, "require": { - "league/uri": "^7.8", + "league/uri": "^7.8.1", "php": "^8.1" }, "suggest": { @@ -4358,7 +4240,7 @@ "docs": "https://uri.thephpleague.com", "forum": "https://thephpleague.slack.com", "issues": "https://github.com/thephpleague/uri-src/issues", - "source": "https://github.com/thephpleague/uri-components/tree/7.8.0" + "source": "https://github.com/thephpleague/uri-components/tree/7.8.1" }, "funding": [ { @@ -4366,20 +4248,20 @@ "type": "github" } ], - "time": "2026-01-14T17:24:56+00:00" + "time": "2026-03-15T20:22:25+00:00" }, { "name": "league/uri-interfaces", - "version": "7.8.0", + "version": "7.8.1", "source": { "type": "git", "url": "https://github.com/thephpleague/uri-interfaces.git", - "reference": "c5c5cd056110fc8afaba29fa6b72a43ced42acd4" + "reference": "85d5c77c5d6d3af6c54db4a78246364908f3c928" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/uri-interfaces/zipball/c5c5cd056110fc8afaba29fa6b72a43ced42acd4", - "reference": "c5c5cd056110fc8afaba29fa6b72a43ced42acd4", + "url": "https://api.github.com/repos/thephpleague/uri-interfaces/zipball/85d5c77c5d6d3af6c54db4a78246364908f3c928", + "reference": "85d5c77c5d6d3af6c54db4a78246364908f3c928", "shasum": "" }, "require": { @@ -4442,7 +4324,7 @@ "docs": "https://uri.thephpleague.com", "forum": "https://thephpleague.slack.com", "issues": "https://github.com/thephpleague/uri-src/issues", - "source": "https://github.com/thephpleague/uri-interfaces/tree/7.8.0" + "source": "https://github.com/thephpleague/uri-interfaces/tree/7.8.1" }, "funding": [ { @@ -4450,20 +4332,20 @@ "type": "github" } ], - "time": "2026-01-15T06:54:53+00:00" + "time": "2026-03-08T20:05:35+00:00" }, { "name": "livewire/livewire", - "version": "v3.7.11", + "version": "v4.3.0", "source": { "type": "git", "url": "https://github.com/livewire/livewire.git", - "reference": "addd6e8e9234df75f29e6a327ee2a745a7d67bb6" + "reference": "19ebb1ee4d057debceccf70ff01950e6a6114edc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/livewire/livewire/zipball/addd6e8e9234df75f29e6a327ee2a745a7d67bb6", - "reference": "addd6e8e9234df75f29e6a327ee2a745a7d67bb6", + "url": "https://api.github.com/repos/livewire/livewire/zipball/19ebb1ee4d057debceccf70ff01950e6a6114edc", + "reference": "19ebb1ee4d057debceccf70ff01950e6a6114edc", "shasum": "" }, "require": { @@ -4518,7 +4400,7 @@ "description": "A front-end framework for Laravel.", "support": { "issues": "https://github.com/livewire/livewire/issues", - "source": "https://github.com/livewire/livewire/tree/v3.7.11" + "source": "https://github.com/livewire/livewire/tree/v4.3.0" }, "funding": [ { @@ -4526,7 +4408,7 @@ "type": "github" } ], - "time": "2026-02-26T00:58:19+00:00" + "time": "2026-05-01T00:46:07+00:00" }, { "name": "lstrojny/fxmlrpc", @@ -4607,95 +4489,28 @@ }, "time": "2021-06-21T09:30:29+00:00" }, - { - "name": "masterminds/html5", - "version": "2.10.0", - "source": { - "type": "git", - "url": "https://github.com/Masterminds/html5-php.git", - "reference": "fcf91eb64359852f00d921887b219479b4f21251" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Masterminds/html5-php/zipball/fcf91eb64359852f00d921887b219479b4f21251", - "reference": "fcf91eb64359852f00d921887b219479b4f21251", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "php": ">=5.3.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.7.21 || ^6 || ^7 || ^8 || ^9" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.7-dev" - } - }, - "autoload": { - "psr-4": { - "Masterminds\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Matt Butcher", - "email": "technosophos@gmail.com" - }, - { - "name": "Matt Farina", - "email": "matt@mattfarina.com" - }, - { - "name": "Asmir Mustafic", - "email": "goetas@gmail.com" - } - ], - "description": "An HTML5 parser and serializer.", - "homepage": "http://masterminds.github.io/html5-php", - "keywords": [ - "HTML5", - "dom", - "html", - "parser", - "querypath", - "serializer", - "xml" - ], - "support": { - "issues": "https://github.com/Masterminds/html5-php/issues", - "source": "https://github.com/Masterminds/html5-php/tree/2.10.0" - }, - "time": "2025-07-25T09:04:22+00:00" - }, { "name": "mongodb/laravel-mongodb", - "version": "5.6.0", + "version": "5.7.1", "source": { "type": "git", "url": "https://github.com/mongodb/laravel-mongodb", - "reference": "0828c481e166793fc359226b9de1eb836082aa45" + "reference": "6e371e8e6deb9193f99a84c578e6c9d0a960e43a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/mongodb/laravel-mongodb/zipball/0828c481e166793fc359226b9de1eb836082aa45", - "reference": "0828c481e166793fc359226b9de1eb836082aa45", + "url": "https://api.github.com/repos/mongodb/laravel-mongodb/zipball/6e371e8e6deb9193f99a84c578e6c9d0a960e43a", + "reference": "6e371e8e6deb9193f99a84c578e6c9d0a960e43a", "shasum": "" }, "require": { "composer-runtime-api": "^2.0.0", "ext-mongodb": "^1.21|^2", - "illuminate/cache": "^10.36|^11|^12", - "illuminate/container": "^10.0|^11|^12", - "illuminate/database": "^10.30|^11|^12", - "illuminate/events": "^10.0|^11|^12", - "illuminate/support": "^10.0|^11|^12", + "illuminate/cache": "^10.36|^11|^12|^13.0", + "illuminate/container": "^10.0|^11|^12|^13.0", + "illuminate/database": "^10.30|^11|^12|^13.0", + "illuminate/events": "^10.0|^11|^12|^13.0", + "illuminate/support": "^10.0|^11|^12|^13.0", "mongodb/mongodb": "^1.21|^2", "php": "^8.1" }, @@ -4706,15 +4521,15 @@ "jenssegers/mongodb": "self.version" }, "require-dev": { - "doctrine/coding-standard": "12.0.x-dev", + "doctrine/coding-standard": "^12.0", "laravel/scout": "^10.3", "league/flysystem-gridfs": "^3.28", "league/flysystem-read-only": "^3.0", "mockery/mockery": "^1.4.4", - "orchestra/testbench": "^8.0|^9.0|^10.0", - "phpstan/phpstan": "^1.10", - "phpunit/phpunit": "^10.3|^11.5.3", - "rector/rector": "^1.2", + "orchestra/testbench": "^8.0|^9.0|^10.0|^11.0", + "phpstan/phpstan": "^1.10|^2.1", + "phpunit/phpunit": "^10.3|^11.5.3|^12.5.12", + "rector/rector": "^1.2|^2.3", "spatie/laravel-query-builder": "^5.6|^6" }, "suggest": { @@ -4779,7 +4594,7 @@ "issues": "https://www.mongodb.com/support", "security": "https://www.mongodb.com/security" }, - "time": "2026-02-12T13:07:48+00:00" + "time": "2026-04-15T12:18:12+00:00" }, { "name": "mongodb/mongodb", @@ -5029,16 +4844,16 @@ }, { "name": "nesbot/carbon", - "version": "3.11.3", + "version": "3.11.4", "source": { "type": "git", "url": "https://github.com/CarbonPHP/carbon.git", - "reference": "6a7e652845bb018c668220c2a545aded8594fbbf" + "reference": "e890471a3494740f7d9326d72ce6a8c559ffee60" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/6a7e652845bb018c668220c2a545aded8594fbbf", - "reference": "6a7e652845bb018c668220c2a545aded8594fbbf", + "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/e890471a3494740f7d9326d72ce6a8c559ffee60", + "reference": "e890471a3494740f7d9326d72ce6a8c559ffee60", "shasum": "" }, "require": { @@ -5130,7 +4945,7 @@ "type": "tidelift" } ], - "time": "2026-03-11T17:23:39+00:00" + "time": "2026-04-07T09:57:54+00:00" }, { "name": "nette/php-generator", @@ -5275,16 +5090,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": { @@ -5360,9 +5175,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", @@ -6519,16 +6334,16 @@ }, { "name": "psy/psysh", - "version": "v0.12.21", + "version": "v0.12.22", "source": { "type": "git", "url": "https://github.com/bobthecow/psysh.git", - "reference": "4821fab5b7cd8c49a673a9fd5754dc9162bb9e97" + "reference": "3be75d5b9244936dd4ac62ade2bfb004d13acf0f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/bobthecow/psysh/zipball/4821fab5b7cd8c49a673a9fd5754dc9162bb9e97", - "reference": "4821fab5b7cd8c49a673a9fd5754dc9162bb9e97", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/3be75d5b9244936dd4ac62ade2bfb004d13acf0f", + "reference": "3be75d5b9244936dd4ac62ade2bfb004d13acf0f", "shasum": "" }, "require": { @@ -6592,9 +6407,9 @@ ], "support": { "issues": "https://github.com/bobthecow/psysh/issues", - "source": "https://github.com/bobthecow/psysh/tree/v0.12.21" + "source": "https://github.com/bobthecow/psysh/tree/v0.12.22" }, - "time": "2026-03-06T21:21:28+00:00" + "time": "2026-03-22T23:03:24+00:00" }, { "name": "pusher/pusher-php-server", @@ -7500,33 +7315,33 @@ }, { "name": "ryangjchandler/blade-capture-directive", - "version": "v1.1.0", + "version": "v1.1.1", "source": { "type": "git", "url": "https://github.com/ryangjchandler/blade-capture-directive.git", - "reference": "bbb1513dfd89eaec87a47fe0c449a7e3d4a1976d" + "reference": "3f9e80b56ff60b78755ef320e3e16d88850101d6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ryangjchandler/blade-capture-directive/zipball/bbb1513dfd89eaec87a47fe0c449a7e3d4a1976d", - "reference": "bbb1513dfd89eaec87a47fe0c449a7e3d4a1976d", + "url": "https://api.github.com/repos/ryangjchandler/blade-capture-directive/zipball/3f9e80b56ff60b78755ef320e3e16d88850101d6", + "reference": "3f9e80b56ff60b78755ef320e3e16d88850101d6", "shasum": "" }, "require": { - "illuminate/contracts": "^10.0|^11.0|^12.0", + "illuminate/contracts": "^10.0|^11.0|^12.0|^13.0", "php": "^8.1", "spatie/laravel-package-tools": "^1.9.2" }, "require-dev": { "nunomaduro/collision": "^7.0|^8.0", "nunomaduro/larastan": "^2.0|^3.0", - "orchestra/testbench": "^8.0|^9.0|^10.0", - "pestphp/pest": "^2.0|^3.7", - "pestphp/pest-plugin-laravel": "^2.0|^3.1", + "orchestra/testbench": "^8.0|^9.0|^10.0|^11.0", + "pestphp/pest": "^2.0|^3.7|^4.1", + "pestphp/pest-plugin-laravel": "^2.0|^3.1|^v4.1.0", "phpstan/extension-installer": "^1.1", "phpstan/phpstan-deprecation-rules": "^1.0|^2.0", "phpstan/phpstan-phpunit": "^1.0|^2.0", - "phpunit/phpunit": "^10.0|^11.5.3", + "phpunit/phpunit": "^10.0|^11.5.3|^12.0", "spatie/laravel-ray": "^1.26" }, "type": "library", @@ -7566,7 +7381,7 @@ ], "support": { "issues": "https://github.com/ryangjchandler/blade-capture-directive/issues", - "source": "https://github.com/ryangjchandler/blade-capture-directive/tree/v1.1.0" + "source": "https://github.com/ryangjchandler/blade-capture-directive/tree/v1.1.1" }, "funding": [ { @@ -7574,7 +7389,7 @@ "type": "github" } ], - "time": "2025-02-25T09:09:36+00:00" + "time": "2026-03-19T10:36:26+00:00" }, { "name": "scrivo/highlight.php", @@ -7852,33 +7667,36 @@ }, { "name": "spatie/laravel-responsecache", - "version": "7.7.2", + "version": "8.4.0", "source": { "type": "git", "url": "https://github.com/spatie/laravel-responsecache.git", - "reference": "039f8b9c2e2b2d838d0bfce32cfe52cf5d1cb8fc" + "reference": "a8a685cceafdebc201c6cc228d330f38b9b55e2c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-responsecache/zipball/039f8b9c2e2b2d838d0bfce32cfe52cf5d1cb8fc", - "reference": "039f8b9c2e2b2d838d0bfce32cfe52cf5d1cb8fc", + "url": "https://api.github.com/repos/spatie/laravel-responsecache/zipball/a8a685cceafdebc201c6cc228d330f38b9b55e2c", + "reference": "a8a685cceafdebc201c6cc228d330f38b9b55e2c", "shasum": "" }, "require": { - "illuminate/cache": "^10.0|^11.0|^12.0", - "illuminate/console": "^10.0|^11.0|^12.0", - "illuminate/container": "^10.0|^11.0|^12.0", - "illuminate/http": "^10.0|^11.0|^12.0", - "illuminate/support": "^10.0|^11.0|^12.0", - "nesbot/carbon": "^2.63|^3.0", - "php": "^8.2", - "spatie/laravel-package-tools": "^1.9" + "illuminate/cache": "^12.0|^13.0", + "illuminate/console": "^12.0|^13.0", + "illuminate/container": "^12.0|^13.0", + "illuminate/http": "^12.0|^13.0", + "illuminate/support": "^12.0|^13.0", + "nesbot/carbon": "^3.0", + "php": "^8.4", + "spatie/laravel-package-tools": "^1.9", + "spatie/php-attribute-reader": "^1.0" }, "require-dev": { - "laravel/framework": "^10.0|^11.0|^12.0", - "mockery/mockery": "^1.4", - "orchestra/testbench": "^8.0|^9.0|^10.0", - "pestphp/pest": "^2.22|^3.0" + "larastan/larastan": "^3.9", + "laravel/framework": "^12.0|^13.0", + "laravel/pint": "^1.13.7", + "mockery/mockery": "^1.6", + "orchestra/testbench": "^10.0|^11.0", + "pestphp/pest": "^4.0" }, "type": "library", "extra": { @@ -7919,7 +7737,8 @@ "spatie" ], "support": { - "source": "https://github.com/spatie/laravel-responsecache/tree/7.7.2" + "issues": "https://github.com/spatie/laravel-responsecache/issues", + "source": "https://github.com/spatie/laravel-responsecache/tree/8.4.0" }, "funding": [ { @@ -7931,20 +7750,78 @@ "type": "github" } ], - "time": "2025-08-28T20:22:23+00:00" + "time": "2026-05-11T08:22:08+00:00" + }, + { + "name": "spatie/php-attribute-reader", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/spatie/php-attribute-reader.git", + "reference": "46e7484d7b51f5b22d672745c541e48c5a385404" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/php-attribute-reader/zipball/46e7484d7b51f5b22d672745c541e48c5a385404", + "reference": "46e7484d7b51f5b22d672745c541e48c5a385404", + "shasum": "" + }, + "require": { + "php": "^8.0" + }, + "require-dev": { + "pestphp/pest": "^1.0|^2.0|^3.0|^4.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spatie\\Attributes\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "A clean API for working with PHP attributes", + "homepage": "https://github.com/spatie/php-attribute-reader", + "keywords": [ + "attributes", + "php-attribute-reader", + "reflection", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/php-attribute-reader/issues", + "source": "https://github.com/spatie/php-attribute-reader/tree/1.1.0" + }, + "funding": [ + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2026-02-23T09:01:55+00:00" }, { "name": "spatie/shiki-php", - "version": "2.3.3", + "version": "2.4.0", "source": { "type": "git", "url": "https://github.com/spatie/shiki-php.git", - "reference": "9d50ff4d9825d87d3283a6695c65ae9c3c3caa6b" + "reference": "b8b0ca32d3a82bc5c533e68ffab96c5d4ec1b9ba" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/shiki-php/zipball/9d50ff4d9825d87d3283a6695c65ae9c3c3caa6b", - "reference": "9d50ff4d9825d87d3283a6695c65ae9c3c3caa6b", + "url": "https://api.github.com/repos/spatie/shiki-php/zipball/b8b0ca32d3a82bc5c533e68ffab96c5d4ec1b9ba", + "reference": "b8b0ca32d3a82bc5c533e68ffab96c5d4ec1b9ba", "shasum": "" }, "require": { @@ -7988,7 +7865,7 @@ "spatie" ], "support": { - "source": "https://github.com/spatie/shiki-php/tree/2.3.3" + "source": "https://github.com/spatie/shiki-php/tree/2.4.0" }, "funding": [ { @@ -7996,7 +7873,7 @@ "type": "github" } ], - "time": "2026-02-01T09:30:04+00:00" + "time": "2026-04-27T14:27:52+00:00" }, { "name": "supervisorphp/supervisor", @@ -8066,22 +7943,21 @@ }, { "name": "symfony/clock", - "version": "v7.4.0", + "version": "v8.0.8", "source": { "type": "git", "url": "https://github.com/symfony/clock.git", - "reference": "9169f24776edde469914c1e7a1442a50f7a4e110" + "reference": "b55a638b189a6faa875e0ccdb00908fb87af95b3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/clock/zipball/9169f24776edde469914c1e7a1442a50f7a4e110", - "reference": "9169f24776edde469914c1e7a1442a50f7a4e110", + "url": "https://api.github.com/repos/symfony/clock/zipball/b55a638b189a6faa875e0ccdb00908fb87af95b3", + "reference": "b55a638b189a6faa875e0ccdb00908fb87af95b3", "shasum": "" }, "require": { - "php": ">=8.2", - "psr/clock": "^1.0", - "symfony/polyfill-php83": "^1.28" + "php": ">=8.4", + "psr/clock": "^1.0" }, "provide": { "psr/clock-implementation": "1.0" @@ -8120,7 +7996,7 @@ "time" ], "support": { - "source": "https://github.com/symfony/clock/tree/v7.4.0" + "source": "https://github.com/symfony/clock/tree/v8.0.8" }, "funding": [ { @@ -8140,51 +8016,43 @@ "type": "tidelift" } ], - "time": "2025-11-12T15:39:26+00:00" + "time": "2026-03-30T15:14:47+00:00" }, { "name": "symfony/console", - "version": "v7.4.7", + "version": "v8.0.11", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "e1e6770440fb9c9b0cf725f81d1361ad1835329d" + "reference": "3156577f46a38aa1b9323aad223de7a9cd426782" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/e1e6770440fb9c9b0cf725f81d1361ad1835329d", - "reference": "e1e6770440fb9c9b0cf725f81d1361ad1835329d", + "url": "https://api.github.com/repos/symfony/console/zipball/3156577f46a38aa1b9323aad223de7a9cd426782", + "reference": "3156577f46a38aa1b9323aad223de7a9cd426782", "shasum": "" }, "require": { - "php": ">=8.2", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/polyfill-mbstring": "~1.0", + "php": ">=8.4", + "symfony/polyfill-mbstring": "^1.0", "symfony/service-contracts": "^2.5|^3", - "symfony/string": "^7.2|^8.0" - }, - "conflict": { - "symfony/dependency-injection": "<6.4", - "symfony/dotenv": "<6.4", - "symfony/event-dispatcher": "<6.4", - "symfony/lock": "<6.4", - "symfony/process": "<6.4" + "symfony/string": "^7.4|^8.0" }, "provide": { "psr/log-implementation": "1.0|2.0|3.0" }, "require-dev": { "psr/log": "^1|^2|^3", - "symfony/config": "^6.4|^7.0|^8.0", - "symfony/dependency-injection": "^6.4|^7.0|^8.0", - "symfony/event-dispatcher": "^6.4|^7.0|^8.0", - "symfony/http-foundation": "^6.4|^7.0|^8.0", - "symfony/http-kernel": "^6.4|^7.0|^8.0", - "symfony/lock": "^6.4|^7.0|^8.0", - "symfony/messenger": "^6.4|^7.0|^8.0", - "symfony/process": "^6.4|^7.0|^8.0", - "symfony/stopwatch": "^6.4|^7.0|^8.0", - "symfony/var-dumper": "^6.4|^7.0|^8.0" + "symfony/config": "^7.4|^8.0", + "symfony/dependency-injection": "^7.4|^8.0", + "symfony/event-dispatcher": "^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/process": "^7.4|^8.0", + "symfony/stopwatch": "^7.4|^8.0", + "symfony/var-dumper": "^7.4|^8.0" }, "type": "library", "autoload": { @@ -8218,7 +8086,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v7.4.7" + "source": "https://github.com/symfony/console/tree/v8.0.11" }, "funding": [ { @@ -8238,24 +8106,24 @@ "type": "tidelift" } ], - "time": "2026-03-06T14:06:20+00:00" + "time": "2026-05-13T12:07:53+00:00" }, { "name": "symfony/css-selector", - "version": "v7.4.6", + "version": "v8.0.9", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "2e7c52c647b406e2107dd867db424a4dbac91864" + "reference": "3665cfade90565430909b906394c73c8739e57d0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/2e7c52c647b406e2107dd867db424a4dbac91864", - "reference": "2e7c52c647b406e2107dd867db424a4dbac91864", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/3665cfade90565430909b906394c73c8739e57d0", + "reference": "3665cfade90565430909b906394c73c8739e57d0", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=8.4" }, "type": "library", "autoload": { @@ -8287,7 +8155,7 @@ "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/css-selector/tree/v7.4.6" + "source": "https://github.com/symfony/css-selector/tree/v8.0.9" }, "funding": [ { @@ -8307,20 +8175,20 @@ "type": "tidelift" } ], - "time": "2026-02-17T07:53:42+00:00" + "time": "2026-04-18T13:51:42+00:00" }, { "name": "symfony/deprecation-contracts", - "version": "v3.6.0", + "version": "v3.7.0", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62" + "reference": "50f59d1f3ca46d41ac911f97a78626b6756af35b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/63afe740e99a13ba87ec199bb07bbdee937a5b62", - "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/50f59d1f3ca46d41ac911f97a78626b6756af35b", + "reference": "50f59d1f3ca46d41ac911f97a78626b6756af35b", "shasum": "" }, "require": { @@ -8333,7 +8201,7 @@ "name": "symfony/contracts" }, "branch-alias": { - "dev-main": "3.6-dev" + "dev-main": "3.7-dev" } }, "autoload": { @@ -8358,7 +8226,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v3.6.0" + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.7.0" }, "funding": [ { @@ -8369,42 +8237,45 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-09-25T14:21:43+00:00" + "time": "2026-04-13T15:52:40+00:00" }, { "name": "symfony/error-handler", - "version": "v7.4.4", + "version": "v8.0.8", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "8da531f364ddfee53e36092a7eebbbd0b775f6b8" + "reference": "c1119fe8dcfc3825ec74ec061b96ef0c8f281517" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/8da531f364ddfee53e36092a7eebbbd0b775f6b8", - "reference": "8da531f364ddfee53e36092a7eebbbd0b775f6b8", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/c1119fe8dcfc3825ec74ec061b96ef0c8f281517", + "reference": "c1119fe8dcfc3825ec74ec061b96ef0c8f281517", "shasum": "" }, "require": { - "php": ">=8.2", + "php": ">=8.4", "psr/log": "^1|^2|^3", "symfony/polyfill-php85": "^1.32", - "symfony/var-dumper": "^6.4|^7.0|^8.0" + "symfony/var-dumper": "^7.4|^8.0" }, "conflict": { - "symfony/deprecation-contracts": "<2.5", - "symfony/http-kernel": "<6.4" + "symfony/deprecation-contracts": "<2.5" }, "require-dev": { - "symfony/console": "^6.4|^7.0|^8.0", + "symfony/console": "^7.4|^8.0", "symfony/deprecation-contracts": "^2.5|^3", - "symfony/http-kernel": "^6.4|^7.0|^8.0", - "symfony/serializer": "^6.4|^7.0|^8.0", + "symfony/http-kernel": "^7.4|^8.0", + "symfony/serializer": "^7.4|^8.0", "symfony/webpack-encore-bundle": "^1.0|^2.0" }, "bin": [ @@ -8436,7 +8307,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/v7.4.4" + "source": "https://github.com/symfony/error-handler/tree/v8.0.8" }, "funding": [ { @@ -8456,28 +8327,28 @@ "type": "tidelift" } ], - "time": "2026-01-20T16:42:42+00:00" + "time": "2026-03-30T15:14:47+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v7.4.4", + "version": "v8.0.9", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "dc2c0eba1af673e736bb851d747d266108aea746" + "reference": "0c3c1a17604c4dbbec4b93fe162c538482096e1f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/dc2c0eba1af673e736bb851d747d266108aea746", - "reference": "dc2c0eba1af673e736bb851d747d266108aea746", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/0c3c1a17604c4dbbec4b93fe162c538482096e1f", + "reference": "0c3c1a17604c4dbbec4b93fe162c538482096e1f", "shasum": "" }, "require": { - "php": ">=8.2", + "php": ">=8.4", "symfony/event-dispatcher-contracts": "^2.5|^3" }, "conflict": { - "symfony/dependency-injection": "<6.4", + "symfony/security-http": "<7.4", "symfony/service-contracts": "<2.5" }, "provide": { @@ -8486,14 +8357,14 @@ }, "require-dev": { "psr/log": "^1|^2|^3", - "symfony/config": "^6.4|^7.0|^8.0", - "symfony/dependency-injection": "^6.4|^7.0|^8.0", - "symfony/error-handler": "^6.4|^7.0|^8.0", - "symfony/expression-language": "^6.4|^7.0|^8.0", - "symfony/framework-bundle": "^6.4|^7.0|^8.0", - "symfony/http-foundation": "^6.4|^7.0|^8.0", + "symfony/config": "^7.4|^8.0", + "symfony/dependency-injection": "^7.4|^8.0", + "symfony/error-handler": "^7.4|^8.0", + "symfony/expression-language": "^7.4|^8.0", + "symfony/framework-bundle": "^7.4|^8.0", + "symfony/http-foundation": "^7.4|^8.0", "symfony/service-contracts": "^2.5|^3", - "symfony/stopwatch": "^6.4|^7.0|^8.0" + "symfony/stopwatch": "^7.4|^8.0" }, "type": "library", "autoload": { @@ -8521,7 +8392,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/v7.4.4" + "source": "https://github.com/symfony/event-dispatcher/tree/v8.0.9" }, "funding": [ { @@ -8541,20 +8412,20 @@ "type": "tidelift" } ], - "time": "2026-01-05T11:45:34+00:00" + "time": "2026-04-18T13:51:42+00:00" }, { "name": "symfony/event-dispatcher-contracts", - "version": "v3.6.0", + "version": "v3.7.0", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "59eb412e93815df44f05f342958efa9f46b1e586" + "reference": "ccba7060602b7fed0b03c85bf025257f76d9ef32" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/59eb412e93815df44f05f342958efa9f46b1e586", - "reference": "59eb412e93815df44f05f342958efa9f46b1e586", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/ccba7060602b7fed0b03c85bf025257f76d9ef32", + "reference": "ccba7060602b7fed0b03c85bf025257f76d9ef32", "shasum": "" }, "require": { @@ -8568,7 +8439,7 @@ "name": "symfony/contracts" }, "branch-alias": { - "dev-main": "3.6-dev" + "dev-main": "3.7-dev" } }, "autoload": { @@ -8601,7 +8472,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.6.0" + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.7.0" }, "funding": [ { @@ -8612,34 +8483,38 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-09-25T14:21:43+00:00" + "time": "2026-01-05T13:30:16+00:00" }, { "name": "symfony/filesystem", - "version": "v7.4.6", + "version": "v8.0.11", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "3ebc794fa5315e59fd122561623c2e2e4280538e" + "reference": "224db910898ce1317b892a9a1338f1f8f17eb7c7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/3ebc794fa5315e59fd122561623c2e2e4280538e", - "reference": "3ebc794fa5315e59fd122561623c2e2e4280538e", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/224db910898ce1317b892a9a1338f1f8f17eb7c7", + "reference": "224db910898ce1317b892a9a1338f1f8f17eb7c7", "shasum": "" }, "require": { - "php": ">=8.2", + "php": ">=8.4", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-mbstring": "~1.8" }, "require-dev": { - "symfony/process": "^6.4|^7.0|^8.0" + "symfony/process": "^7.4|^8.0" }, "type": "library", "autoload": { @@ -8667,7 +8542,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v7.4.6" + "source": "https://github.com/symfony/filesystem/tree/v8.0.11" }, "funding": [ { @@ -8687,27 +8562,27 @@ "type": "tidelift" } ], - "time": "2026-02-25T16:50:00+00:00" + "time": "2026-05-11T16:39:47+00:00" }, { "name": "symfony/finder", - "version": "v7.4.6", + "version": "v8.0.8", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "8655bf1076b7a3a346cb11413ffdabff50c7ffcf" + "reference": "8da41214757b87d97f181e3d14a4179286151007" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/8655bf1076b7a3a346cb11413ffdabff50c7ffcf", - "reference": "8655bf1076b7a3a346cb11413ffdabff50c7ffcf", + "url": "https://api.github.com/repos/symfony/finder/zipball/8da41214757b87d97f181e3d14a4179286151007", + "reference": "8da41214757b87d97f181e3d14a4179286151007", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=8.4" }, "require-dev": { - "symfony/filesystem": "^6.4|^7.0|^8.0" + "symfony/filesystem": "^7.4|^8.0" }, "type": "library", "autoload": { @@ -8735,7 +8610,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v7.4.6" + "source": "https://github.com/symfony/finder/tree/v8.0.8" }, "funding": [ { @@ -8755,28 +8630,26 @@ "type": "tidelift" } ], - "time": "2026-01-29T09:40:50+00:00" + "time": "2026-03-30T15:14:47+00:00" }, { "name": "symfony/html-sanitizer", - "version": "v7.4.7", + "version": "v8.0.8", "source": { "type": "git", "url": "https://github.com/symfony/html-sanitizer.git", - "reference": "e4df2abd9391ce3263baa1aea9e993f6da74a3c7" + "reference": "b0e4a2d9a82ab6bdcc742a63398781f6dae64fe5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/html-sanitizer/zipball/e4df2abd9391ce3263baa1aea9e993f6da74a3c7", - "reference": "e4df2abd9391ce3263baa1aea9e993f6da74a3c7", + "url": "https://api.github.com/repos/symfony/html-sanitizer/zipball/b0e4a2d9a82ab6bdcc742a63398781f6dae64fe5", + "reference": "b0e4a2d9a82ab6bdcc742a63398781f6dae64fe5", "shasum": "" }, "require": { "ext-dom": "*", "league/uri": "^6.5|^7.0", - "masterminds/html5": "^2.7.2", - "php": ">=8.2", - "symfony/deprecation-contracts": "^2.5|^3" + "php": ">=8.4" }, "type": "library", "autoload": { @@ -8809,7 +8682,7 @@ "sanitizer" ], "support": { - "source": "https://github.com/symfony/html-sanitizer/tree/v7.4.7" + "source": "https://github.com/symfony/html-sanitizer/tree/v8.0.8" }, "funding": [ { @@ -8829,41 +8702,39 @@ "type": "tidelift" } ], - "time": "2026-03-06T13:15:18+00:00" + "time": "2026-03-30T15:14:47+00:00" }, { "name": "symfony/http-foundation", - "version": "v7.4.7", + "version": "v8.0.8", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "f94b3e7b7dafd40e666f0c9ff2084133bae41e81" + "reference": "02656f7ebeae5c155d659e946f6b3a33df24051b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/f94b3e7b7dafd40e666f0c9ff2084133bae41e81", - "reference": "f94b3e7b7dafd40e666f0c9ff2084133bae41e81", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/02656f7ebeae5c155d659e946f6b3a33df24051b", + "reference": "02656f7ebeae5c155d659e946f6b3a33df24051b", "shasum": "" }, "require": { - "php": ">=8.2", - "symfony/deprecation-contracts": "^2.5|^3", + "php": ">=8.4", "symfony/polyfill-mbstring": "^1.1" }, "conflict": { - "doctrine/dbal": "<3.6", - "symfony/cache": "<6.4.12|>=7.0,<7.1.5" + "doctrine/dbal": "<4.3" }, "require-dev": { - "doctrine/dbal": "^3.6|^4", + "doctrine/dbal": "^4.3", "predis/predis": "^1.1|^2.0", - "symfony/cache": "^6.4.12|^7.1.5|^8.0", - "symfony/clock": "^6.4|^7.0|^8.0", - "symfony/dependency-injection": "^6.4|^7.0|^8.0", - "symfony/expression-language": "^6.4|^7.0|^8.0", - "symfony/http-kernel": "^6.4|^7.0|^8.0", - "symfony/mime": "^6.4|^7.0|^8.0", - "symfony/rate-limiter": "^6.4|^7.0|^8.0" + "symfony/cache": "^7.4|^8.0", + "symfony/clock": "^7.4|^8.0", + "symfony/dependency-injection": "^7.4|^8.0", + "symfony/expression-language": "^7.4|^8.0", + "symfony/http-kernel": "^7.4|^8.0", + "symfony/mime": "^7.4|^8.0", + "symfony/rate-limiter": "^7.4|^8.0" }, "type": "library", "autoload": { @@ -8891,7 +8762,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v7.4.7" + "source": "https://github.com/symfony/http-foundation/tree/v8.0.8" }, "funding": [ { @@ -8911,78 +8782,63 @@ "type": "tidelift" } ], - "time": "2026-03-06T13:15:18+00:00" + "time": "2026-03-30T15:14:47+00:00" }, { "name": "symfony/http-kernel", - "version": "v7.4.7", + "version": "v8.0.11", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "3b3fcf386c809be990c922e10e4c620d6367cab1" + "reference": "20d3680373f4b791903c09e74b45402b4aeda71c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/3b3fcf386c809be990c922e10e4c620d6367cab1", - "reference": "3b3fcf386c809be990c922e10e4c620d6367cab1", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/20d3680373f4b791903c09e74b45402b4aeda71c", + "reference": "20d3680373f4b791903c09e74b45402b4aeda71c", "shasum": "" }, "require": { - "php": ">=8.2", + "php": ">=8.4", "psr/log": "^1|^2|^3", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/error-handler": "^6.4|^7.0|^8.0", - "symfony/event-dispatcher": "^7.3|^8.0", + "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/browser-kit": "<6.4", - "symfony/cache": "<6.4", - "symfony/config": "<6.4", - "symfony/console": "<6.4", - "symfony/dependency-injection": "<6.4", - "symfony/doctrine-bridge": "<6.4", "symfony/flex": "<2.10", - "symfony/form": "<6.4", - "symfony/http-client": "<6.4", "symfony/http-client-contracts": "<2.5", - "symfony/mailer": "<6.4", - "symfony/messenger": "<6.4", - "symfony/translation": "<6.4", "symfony/translation-contracts": "<2.5", - "symfony/twig-bridge": "<6.4", - "symfony/validator": "<6.4", - "symfony/var-dumper": "<6.4", - "twig/twig": "<3.12" + "twig/twig": "<3.21" }, "provide": { "psr/log-implementation": "1.0|2.0|3.0" }, "require-dev": { "psr/cache": "^1.0|^2.0|^3.0", - "symfony/browser-kit": "^6.4|^7.0|^8.0", - "symfony/clock": "^6.4|^7.0|^8.0", - "symfony/config": "^6.4|^7.0|^8.0", - "symfony/console": "^6.4|^7.0|^8.0", - "symfony/css-selector": "^6.4|^7.0|^8.0", - "symfony/dependency-injection": "^6.4.1|^7.0.1|^8.0", - "symfony/dom-crawler": "^6.4|^7.0|^8.0", - "symfony/expression-language": "^6.4|^7.0|^8.0", - "symfony/finder": "^6.4|^7.0|^8.0", + "symfony/browser-kit": "^7.4|^8.0", + "symfony/clock": "^7.4|^8.0", + "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/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": "^6.4|^7.0|^8.0", - "symfony/property-access": "^7.1|^8.0", - "symfony/routing": "^6.4|^7.0|^8.0", - "symfony/serializer": "^7.1|^8.0", - "symfony/stopwatch": "^6.4|^7.0|^8.0", - "symfony/translation": "^6.4|^7.0|^8.0", + "symfony/process": "^7.4|^8.0", + "symfony/property-access": "^7.4|^8.0", + "symfony/routing": "^7.4|^8.0", + "symfony/serializer": "^7.4|^8.0", + "symfony/stopwatch": "^7.4|^8.0", + "symfony/translation": "^7.4|^8.0", "symfony/translation-contracts": "^2.5|^3", - "symfony/uid": "^6.4|^7.0|^8.0", - "symfony/validator": "^6.4|^7.0|^8.0", - "symfony/var-dumper": "^6.4|^7.0|^8.0", - "symfony/var-exporter": "^6.4|^7.0|^8.0", - "twig/twig": "^3.12" + "symfony/uid": "^7.4|^8.0", + "symfony/validator": "^7.4|^8.0", + "symfony/var-dumper": "^7.4|^8.0", + "symfony/var-exporter": "^7.4|^8.0", + "twig/twig": "^3.21" }, "type": "library", "autoload": { @@ -9010,7 +8866,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/v7.4.7" + "source": "https://github.com/symfony/http-kernel/tree/v8.0.11" }, "funding": [ { @@ -9030,43 +8886,39 @@ "type": "tidelift" } ], - "time": "2026-03-06T16:33:18+00:00" + "time": "2026-05-13T18:07:14+00:00" }, { "name": "symfony/mailer", - "version": "v7.4.6", + "version": "v8.0.8", "source": { "type": "git", "url": "https://github.com/symfony/mailer.git", - "reference": "b02726f39a20bc65e30364f5c750c4ddbf1f58e9" + "reference": "ca5f6edaf8780ece814404b58a4482b22b509c56" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mailer/zipball/b02726f39a20bc65e30364f5c750c4ddbf1f58e9", - "reference": "b02726f39a20bc65e30364f5c750c4ddbf1f58e9", + "url": "https://api.github.com/repos/symfony/mailer/zipball/ca5f6edaf8780ece814404b58a4482b22b509c56", + "reference": "ca5f6edaf8780ece814404b58a4482b22b509c56", "shasum": "" }, "require": { "egulias/email-validator": "^2.1.10|^3|^4", - "php": ">=8.2", + "php": ">=8.4", "psr/event-dispatcher": "^1", "psr/log": "^1|^2|^3", - "symfony/event-dispatcher": "^6.4|^7.0|^8.0", - "symfony/mime": "^7.2|^8.0", + "symfony/event-dispatcher": "^7.4|^8.0", + "symfony/mime": "^7.4|^8.0", "symfony/service-contracts": "^2.5|^3" }, "conflict": { - "symfony/http-client-contracts": "<2.5", - "symfony/http-kernel": "<6.4", - "symfony/messenger": "<6.4", - "symfony/mime": "<6.4", - "symfony/twig-bridge": "<6.4" + "symfony/http-client-contracts": "<2.5" }, "require-dev": { - "symfony/console": "^6.4|^7.0|^8.0", - "symfony/http-client": "^6.4|^7.0|^8.0", - "symfony/messenger": "^6.4|^7.0|^8.0", - "symfony/twig-bridge": "^6.4|^7.0|^8.0" + "symfony/console": "^7.4|^8.0", + "symfony/http-client": "^7.4|^8.0", + "symfony/messenger": "^7.4|^8.0", + "symfony/twig-bridge": "^7.4|^8.0" }, "type": "library", "autoload": { @@ -9094,7 +8946,7 @@ "description": "Helps sending emails", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/mailer/tree/v7.4.6" + "source": "https://github.com/symfony/mailer/tree/v8.0.8" }, "funding": [ { @@ -9114,44 +8966,41 @@ "type": "tidelift" } ], - "time": "2026-02-25T16:50:00+00:00" + "time": "2026-03-30T15:14:47+00:00" }, { "name": "symfony/mime", - "version": "v7.4.7", + "version": "v8.0.9", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "da5ab4fde3f6c88ab06e96185b9922f48b677cd1" + "reference": "a9fcb293650c054b62a5b406f4e92e7b711ea333" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/da5ab4fde3f6c88ab06e96185b9922f48b677cd1", - "reference": "da5ab4fde3f6c88ab06e96185b9922f48b677cd1", + "url": "https://api.github.com/repos/symfony/mime/zipball/a9fcb293650c054b62a5b406f4e92e7b711ea333", + "reference": "a9fcb293650c054b62a5b406f4e92e7b711ea333", "shasum": "" }, "require": { - "php": ">=8.2", - "symfony/deprecation-contracts": "^2.5|^3", + "php": ">=8.4", "symfony/polyfill-intl-idn": "^1.10", "symfony/polyfill-mbstring": "^1.0" }, "conflict": { "egulias/email-validator": "~3.0.0", "phpdocumentor/reflection-docblock": "<5.2|>=7", - "phpdocumentor/type-resolver": "<1.5.1", - "symfony/mailer": "<6.4", - "symfony/serializer": "<6.4.3|>7.0,<7.0.3" + "phpdocumentor/type-resolver": "<1.5.1" }, "require-dev": { "egulias/email-validator": "^2.1.10|^3.1|^4", "league/html-to-markdown": "^5.0", "phpdocumentor/reflection-docblock": "^5.2|^6.0", - "symfony/dependency-injection": "^6.4|^7.0|^8.0", - "symfony/process": "^6.4|^7.0|^8.0", - "symfony/property-access": "^6.4|^7.0|^8.0", - "symfony/property-info": "^6.4|^7.0|^8.0", - "symfony/serializer": "^6.4.3|^7.0.3|^8.0" + "symfony/dependency-injection": "^7.4|^8.0", + "symfony/process": "^7.4|^8.0", + "symfony/property-access": "^7.4|^8.0", + "symfony/property-info": "^7.4|^8.0", + "symfony/serializer": "^7.4|^8.0" }, "type": "library", "autoload": { @@ -9183,7 +9032,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v7.4.7" + "source": "https://github.com/symfony/mime/tree/v8.0.9" }, "funding": [ { @@ -9203,20 +9052,20 @@ "type": "tidelift" } ], - "time": "2026-03-05T15:24:09+00:00" + "time": "2026-04-29T15:02:55+00:00" }, { "name": "symfony/polyfill-ctype", - "version": "v1.33.0", + "version": "v1.37.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638" + "reference": "141046a8f9477948ff284fa65be2095baafb94f2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/a3cc8b044a6ea513310cbd48ef7333b384945638", - "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/141046a8f9477948ff284fa65be2095baafb94f2", + "reference": "141046a8f9477948ff284fa65be2095baafb94f2", "shasum": "" }, "require": { @@ -9266,7 +9115,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.37.0" }, "funding": [ { @@ -9286,20 +9135,20 @@ "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2026-04-10T16:19:22+00:00" }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.33.0", + "version": "v1.37.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "380872130d3a5dd3ace2f4010d95125fde5d5c70" + "reference": "4864388bfbd3001ce88e234fab652acd91fdc57e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/380872130d3a5dd3ace2f4010d95125fde5d5c70", - "reference": "380872130d3a5dd3ace2f4010d95125fde5d5c70", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/4864388bfbd3001ce88e234fab652acd91fdc57e", + "reference": "4864388bfbd3001ce88e234fab652acd91fdc57e", "shasum": "" }, "require": { @@ -9348,7 +9197,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.37.0" }, "funding": [ { @@ -9368,11 +9217,11 @@ "type": "tidelift" } ], - "time": "2025-06-27T09:58:17+00:00" + "time": "2026-04-26T13:13:48+00:00" }, { "name": "symfony/polyfill-intl-idn", - "version": "v1.33.0", + "version": "v1.37.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-idn.git", @@ -9435,7 +9284,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.37.0" }, "funding": [ { @@ -9459,7 +9308,7 @@ }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.33.0", + "version": "v1.37.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", @@ -9520,7 +9369,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.37.0" }, "funding": [ { @@ -9544,16 +9393,16 @@ }, { "name": "symfony/polyfill-mbstring", - "version": "v1.33.0", + "version": "v1.37.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493" + "reference": "6a21eb99c6973357967f6ce3708cd55a6bec6315" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/6d857f4d76bd4b343eac26d6b539585d2bc56493", - "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/6a21eb99c6973357967f6ce3708cd55a6bec6315", + "reference": "6a21eb99c6973357967f6ce3708cd55a6bec6315", "shasum": "" }, "require": { @@ -9605,7 +9454,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.37.0" }, "funding": [ { @@ -9625,20 +9474,20 @@ "type": "tidelift" } ], - "time": "2024-12-23T08:48:59+00:00" + "time": "2026-04-10T17:25:58+00:00" }, { "name": "symfony/polyfill-php80", - "version": "v1.33.0", + "version": "v1.37.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608" + "reference": "dfb55726c3a76ea3b6459fcfda1ec2d80a682411" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/0cc9dd0f17f61d8131e7df6b84bd344899fe2608", - "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/dfb55726c3a76ea3b6459fcfda1ec2d80a682411", + "reference": "dfb55726c3a76ea3b6459fcfda1ec2d80a682411", "shasum": "" }, "require": { @@ -9689,7 +9538,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.37.0" }, "funding": [ { @@ -9709,20 +9558,20 @@ "type": "tidelift" } ], - "time": "2025-01-02T08:10:11+00:00" + "time": "2026-04-10T16:19:22+00:00" }, { - "name": "symfony/polyfill-php83", - "version": "v1.33.0", + "name": "symfony/polyfill-php84", + "version": "v1.37.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-php83.git", - "reference": "17f6f9a6b1735c0f163024d959f700cfbc5155e5" + "url": "https://github.com/symfony/polyfill-php84.git", + "reference": "88486db2c389b290bf87ff1de7ebc1e13e42bb06" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/17f6f9a6b1735c0f163024d959f700cfbc5155e5", - "reference": "17f6f9a6b1735c0f163024d959f700cfbc5155e5", + "url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/88486db2c389b290bf87ff1de7ebc1e13e42bb06", + "reference": "88486db2c389b290bf87ff1de7ebc1e13e42bb06", "shasum": "" }, "require": { @@ -9740,7 +9589,7 @@ "bootstrap.php" ], "psr-4": { - "Symfony\\Polyfill\\Php83\\": "" + "Symfony\\Polyfill\\Php84\\": "" }, "classmap": [ "Resources/stubs" @@ -9760,7 +9609,7 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill backporting some PHP 8.3+ features to lower PHP versions", + "description": "Symfony polyfill backporting some PHP 8.4+ features to lower PHP versions", "homepage": "https://symfony.com", "keywords": [ "compatibility", @@ -9769,7 +9618,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php83/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-php84/tree/v1.37.0" }, "funding": [ { @@ -9789,20 +9638,20 @@ "type": "tidelift" } ], - "time": "2025-07-08T02:45:35+00:00" + "time": "2026-04-10T18:47:49+00:00" }, { - "name": "symfony/polyfill-php84", - "version": "v1.33.0", + "name": "symfony/polyfill-php85", + "version": "v1.37.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-php84.git", - "reference": "d8ced4d875142b6a7426000426b8abc631d6b191" + "url": "https://github.com/symfony/polyfill-php85.git", + "reference": "fcfa4973a9917cef23f2e38774da74a2b7d115ee" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/d8ced4d875142b6a7426000426b8abc631d6b191", - "reference": "d8ced4d875142b6a7426000426b8abc631d6b191", + "url": "https://api.github.com/repos/symfony/polyfill-php85/zipball/fcfa4973a9917cef23f2e38774da74a2b7d115ee", + "reference": "fcfa4973a9917cef23f2e38774da74a2b7d115ee", "shasum": "" }, "require": { @@ -9820,7 +9669,7 @@ "bootstrap.php" ], "psr-4": { - "Symfony\\Polyfill\\Php84\\": "" + "Symfony\\Polyfill\\Php85\\": "" }, "classmap": [ "Resources/stubs" @@ -9840,7 +9689,7 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill backporting some PHP 8.4+ features to lower PHP versions", + "description": "Symfony polyfill backporting some PHP 8.5+ features to lower PHP versions", "homepage": "https://symfony.com", "keywords": [ "compatibility", @@ -9849,7 +9698,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php84/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-php85/tree/v1.37.0" }, "funding": [ { @@ -9869,20 +9718,20 @@ "type": "tidelift" } ], - "time": "2025-06-24T13:30:11+00:00" + "time": "2026-04-26T13:10:57+00:00" }, { - "name": "symfony/polyfill-php85", - "version": "v1.33.0", + "name": "symfony/polyfill-php86", + "version": "v1.37.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-php85.git", - "reference": "d4e5fcd4ab3d998ab16c0db48e6cbb9a01993f91" + "url": "https://github.com/symfony/polyfill-php86.git", + "reference": "33d8fc5a705481e21fe3a81212b26f9b1f61749c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php85/zipball/d4e5fcd4ab3d998ab16c0db48e6cbb9a01993f91", - "reference": "d4e5fcd4ab3d998ab16c0db48e6cbb9a01993f91", + "url": "https://api.github.com/repos/symfony/polyfill-php86/zipball/33d8fc5a705481e21fe3a81212b26f9b1f61749c", + "reference": "33d8fc5a705481e21fe3a81212b26f9b1f61749c", "shasum": "" }, "require": { @@ -9900,7 +9749,7 @@ "bootstrap.php" ], "psr-4": { - "Symfony\\Polyfill\\Php85\\": "" + "Symfony\\Polyfill\\Php86\\": "" }, "classmap": [ "Resources/stubs" @@ -9920,7 +9769,7 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill backporting some PHP 8.5+ features to lower PHP versions", + "description": "Symfony polyfill backporting some PHP 8.6+ features to lower PHP versions", "homepage": "https://symfony.com", "keywords": [ "compatibility", @@ -9929,7 +9778,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php85/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-php86/tree/v1.37.0" }, "funding": [ { @@ -9949,20 +9798,20 @@ "type": "tidelift" } ], - "time": "2025-06-23T16:12:55+00:00" + "time": "2026-04-26T13:13:48+00:00" }, { "name": "symfony/polyfill-uuid", - "version": "v1.33.0", + "version": "v1.37.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-uuid.git", - "reference": "21533be36c24be3f4b1669c4725c7d1d2bab4ae2" + "reference": "26dfec253c4cf3e51b541b52ddf7e42cb0908e94" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/21533be36c24be3f4b1669c4725c7d1d2bab4ae2", - "reference": "21533be36c24be3f4b1669c4725c7d1d2bab4ae2", + "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/26dfec253c4cf3e51b541b52ddf7e42cb0908e94", + "reference": "26dfec253c4cf3e51b541b52ddf7e42cb0908e94", "shasum": "" }, "require": { @@ -10012,7 +9861,7 @@ "uuid" ], "support": { - "source": "https://github.com/symfony/polyfill-uuid/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-uuid/tree/v1.37.0" }, "funding": [ { @@ -10032,24 +9881,24 @@ "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2026-04-10T16:19:22+00:00" }, { "name": "symfony/process", - "version": "v7.4.5", + "version": "v8.0.11", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "608476f4604102976d687c483ac63a79ba18cc97" + "reference": "26d89e459f037d2873300605d0a07e7a8ef84db0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/608476f4604102976d687c483ac63a79ba18cc97", - "reference": "608476f4604102976d687c483ac63a79ba18cc97", + "url": "https://api.github.com/repos/symfony/process/zipball/26d89e459f037d2873300605d0a07e7a8ef84db0", + "reference": "26d89e459f037d2873300605d0a07e7a8ef84db0", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=8.4" }, "type": "library", "autoload": { @@ -10077,7 +9926,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v7.4.5" + "source": "https://github.com/symfony/process/tree/v8.0.11" }, "funding": [ { @@ -10097,38 +9946,33 @@ "type": "tidelift" } ], - "time": "2026-01-26T15:07:59+00:00" + "time": "2026-05-11T16:56:32+00:00" }, { "name": "symfony/routing", - "version": "v7.4.6", + "version": "v8.0.9", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "238d749c56b804b31a9bf3e26519d93b65a60938" + "reference": "75d1bd8e5da3424e4db2fc3ff0222cb4d0c73038" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/238d749c56b804b31a9bf3e26519d93b65a60938", - "reference": "238d749c56b804b31a9bf3e26519d93b65a60938", + "url": "https://api.github.com/repos/symfony/routing/zipball/75d1bd8e5da3424e4db2fc3ff0222cb4d0c73038", + "reference": "75d1bd8e5da3424e4db2fc3ff0222cb4d0c73038", "shasum": "" }, "require": { - "php": ">=8.2", + "php": ">=8.4", "symfony/deprecation-contracts": "^2.5|^3" }, - "conflict": { - "symfony/config": "<6.4", - "symfony/dependency-injection": "<6.4", - "symfony/yaml": "<6.4" - }, "require-dev": { "psr/log": "^1|^2|^3", - "symfony/config": "^6.4|^7.0|^8.0", - "symfony/dependency-injection": "^6.4|^7.0|^8.0", - "symfony/expression-language": "^6.4|^7.0|^8.0", - "symfony/http-foundation": "^6.4|^7.0|^8.0", - "symfony/yaml": "^6.4|^7.0|^8.0" + "symfony/config": "^7.4|^8.0", + "symfony/dependency-injection": "^7.4|^8.0", + "symfony/expression-language": "^7.4|^8.0", + "symfony/http-foundation": "^7.4|^8.0", + "symfony/yaml": "^7.4|^8.0" }, "type": "library", "autoload": { @@ -10162,7 +10006,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v7.4.6" + "source": "https://github.com/symfony/routing/tree/v8.0.9" }, "funding": [ { @@ -10182,20 +10026,20 @@ "type": "tidelift" } ], - "time": "2026-02-25T16:50:00+00:00" + "time": "2026-04-29T15:02:55+00:00" }, { "name": "symfony/service-contracts", - "version": "v3.6.1", + "version": "v3.7.0", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "45112560a3ba2d715666a509a0bc9521d10b6c43" + "reference": "d25d82433a80eba6aa0e6c24b61d7370d99e444a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/45112560a3ba2d715666a509a0bc9521d10b6c43", - "reference": "45112560a3ba2d715666a509a0bc9521d10b6c43", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/d25d82433a80eba6aa0e6c24b61d7370d99e444a", + "reference": "d25d82433a80eba6aa0e6c24b61d7370d99e444a", "shasum": "" }, "require": { @@ -10213,7 +10057,7 @@ "name": "symfony/contracts" }, "branch-alias": { - "dev-main": "3.6-dev" + "dev-main": "3.7-dev" } }, "autoload": { @@ -10249,7 +10093,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v3.6.1" + "source": "https://github.com/symfony/service-contracts/tree/v3.7.0" }, "funding": [ { @@ -10269,39 +10113,38 @@ "type": "tidelift" } ], - "time": "2025-07-15T11:30:57+00:00" + "time": "2026-03-28T09:44:51+00:00" }, { "name": "symfony/string", - "version": "v7.4.6", + "version": "v8.0.11", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "9f209231affa85aa930a5e46e6eb03381424b30b" + "reference": "39be2ad058a3c0bd558edca23e65f009865d75ff" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/9f209231affa85aa930a5e46e6eb03381424b30b", - "reference": "9f209231affa85aa930a5e46e6eb03381424b30b", + "url": "https://api.github.com/repos/symfony/string/zipball/39be2ad058a3c0bd558edca23e65f009865d75ff", + "reference": "39be2ad058a3c0bd558edca23e65f009865d75ff", "shasum": "" }, "require": { - "php": ">=8.2", - "symfony/deprecation-contracts": "^2.5|^3.0", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-intl-grapheme": "~1.33", - "symfony/polyfill-intl-normalizer": "~1.0", - "symfony/polyfill-mbstring": "~1.0" + "php": ">=8.4", + "symfony/polyfill-ctype": "^1.8", + "symfony/polyfill-intl-grapheme": "^1.33", + "symfony/polyfill-intl-normalizer": "^1.0", + "symfony/polyfill-mbstring": "^1.0" }, "conflict": { "symfony/translation-contracts": "<2.5" }, "require-dev": { - "symfony/emoji": "^7.1|^8.0", - "symfony/http-client": "^6.4|^7.0|^8.0", - "symfony/intl": "^6.4|^7.0|^8.0", + "symfony/emoji": "^7.4|^8.0", + "symfony/http-client": "^7.4|^8.0", + "symfony/intl": "^7.4|^8.0", "symfony/translation-contracts": "^2.5|^3.0", - "symfony/var-exporter": "^6.4|^7.0|^8.0" + "symfony/var-exporter": "^7.4|^8.0" }, "type": "library", "autoload": { @@ -10340,7 +10183,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v7.4.6" + "source": "https://github.com/symfony/string/tree/v8.0.11" }, "funding": [ { @@ -10360,38 +10203,31 @@ "type": "tidelift" } ], - "time": "2026-02-09T09:33:46+00:00" + "time": "2026-05-13T12:07:53+00:00" }, { "name": "symfony/translation", - "version": "v7.4.6", + "version": "v8.0.10", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "1888cf064399868af3784b9e043240f1d89d25ce" + "reference": "f63e9342e12646a57c91ef8a366a4f9d8e557b67" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/1888cf064399868af3784b9e043240f1d89d25ce", - "reference": "1888cf064399868af3784b9e043240f1d89d25ce", + "url": "https://api.github.com/repos/symfony/translation/zipball/f63e9342e12646a57c91ef8a366a4f9d8e557b67", + "reference": "f63e9342e12646a57c91ef8a366a4f9d8e557b67", "shasum": "" }, "require": { - "php": ">=8.2", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/polyfill-mbstring": "~1.0", - "symfony/translation-contracts": "^2.5.3|^3.3" + "php": ">=8.4", + "symfony/polyfill-mbstring": "^1.0", + "symfony/translation-contracts": "^3.6.1" }, "conflict": { "nikic/php-parser": "<5.0", - "symfony/config": "<6.4", - "symfony/console": "<6.4", - "symfony/dependency-injection": "<6.4", "symfony/http-client-contracts": "<2.5", - "symfony/http-kernel": "<6.4", - "symfony/service-contracts": "<2.5", - "symfony/twig-bundle": "<6.4", - "symfony/yaml": "<6.4" + "symfony/service-contracts": "<2.5" }, "provide": { "symfony/translation-implementation": "2.3|3.0" @@ -10399,17 +10235,17 @@ "require-dev": { "nikic/php-parser": "^5.0", "psr/log": "^1|^2|^3", - "symfony/config": "^6.4|^7.0|^8.0", - "symfony/console": "^6.4|^7.0|^8.0", - "symfony/dependency-injection": "^6.4|^7.0|^8.0", - "symfony/finder": "^6.4|^7.0|^8.0", + "symfony/config": "^7.4|^8.0", + "symfony/console": "^7.4|^8.0", + "symfony/dependency-injection": "^7.4|^8.0", + "symfony/finder": "^7.4|^8.0", "symfony/http-client-contracts": "^2.5|^3.0", - "symfony/http-kernel": "^6.4|^7.0|^8.0", - "symfony/intl": "^6.4|^7.0|^8.0", + "symfony/http-kernel": "^7.4|^8.0", + "symfony/intl": "^7.4|^8.0", "symfony/polyfill-intl-icu": "^1.21", - "symfony/routing": "^6.4|^7.0|^8.0", + "symfony/routing": "^7.4|^8.0", "symfony/service-contracts": "^2.5|^3", - "symfony/yaml": "^6.4|^7.0|^8.0" + "symfony/yaml": "^7.4|^8.0" }, "type": "library", "autoload": { @@ -10440,7 +10276,7 @@ "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/translation/tree/v7.4.6" + "source": "https://github.com/symfony/translation/tree/v8.0.10" }, "funding": [ { @@ -10460,20 +10296,20 @@ "type": "tidelift" } ], - "time": "2026-02-17T07:53:42+00:00" + "time": "2026-05-06T11:30:54+00:00" }, { "name": "symfony/translation-contracts", - "version": "v3.6.1", + "version": "v3.7.0", "source": { "type": "git", "url": "https://github.com/symfony/translation-contracts.git", - "reference": "65a8bc82080447fae78373aa10f8d13b38338977" + "reference": "0ab302977a952b42fd51475c4ebac81f8da0a95d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/65a8bc82080447fae78373aa10f8d13b38338977", - "reference": "65a8bc82080447fae78373aa10f8d13b38338977", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/0ab302977a952b42fd51475c4ebac81f8da0a95d", + "reference": "0ab302977a952b42fd51475c4ebac81f8da0a95d", "shasum": "" }, "require": { @@ -10486,7 +10322,7 @@ "name": "symfony/contracts" }, "branch-alias": { - "dev-main": "3.6-dev" + "dev-main": "3.7-dev" } }, "autoload": { @@ -10522,7 +10358,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/translation-contracts/tree/v3.6.1" + "source": "https://github.com/symfony/translation-contracts/tree/v3.7.0" }, "funding": [ { @@ -10542,28 +10378,28 @@ "type": "tidelift" } ], - "time": "2025-07-15T13:41:35+00:00" + "time": "2026-01-05T13:30:16+00:00" }, { "name": "symfony/uid", - "version": "v7.4.4", + "version": "v8.0.9", "source": { "type": "git", "url": "https://github.com/symfony/uid.git", - "reference": "7719ce8aba76be93dfe249192f1fbfa52c588e36" + "reference": "4d9d6510bbe88ebb4608b7200d18606cdf80825c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/uid/zipball/7719ce8aba76be93dfe249192f1fbfa52c588e36", - "reference": "7719ce8aba76be93dfe249192f1fbfa52c588e36", + "url": "https://api.github.com/repos/symfony/uid/zipball/4d9d6510bbe88ebb4608b7200d18606cdf80825c", + "reference": "4d9d6510bbe88ebb4608b7200d18606cdf80825c", "shasum": "" }, "require": { - "php": ">=8.2", + "php": ">=8.4", "symfony/polyfill-uuid": "^1.15" }, "require-dev": { - "symfony/console": "^6.4|^7.0|^8.0" + "symfony/console": "^7.4|^8.0" }, "type": "library", "autoload": { @@ -10600,7 +10436,7 @@ "uuid" ], "support": { - "source": "https://github.com/symfony/uid/tree/v7.4.4" + "source": "https://github.com/symfony/uid/tree/v8.0.9" }, "funding": [ { @@ -10620,35 +10456,35 @@ "type": "tidelift" } ], - "time": "2026-01-03T23:30:35+00:00" + "time": "2026-04-30T16:10:06+00:00" }, { "name": "symfony/var-dumper", - "version": "v7.4.6", + "version": "v8.0.8", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "045321c440ac18347b136c63d2e9bf28a2dc0291" + "reference": "cfb7badd53bf4177f6e9416cfbbccc13c0e773a1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/045321c440ac18347b136c63d2e9bf28a2dc0291", - "reference": "045321c440ac18347b136c63d2e9bf28a2dc0291", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/cfb7badd53bf4177f6e9416cfbbccc13c0e773a1", + "reference": "cfb7badd53bf4177f6e9416cfbbccc13c0e773a1", "shasum": "" }, "require": { - "php": ">=8.2", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/polyfill-mbstring": "~1.0" + "php": ">=8.4", + "symfony/polyfill-mbstring": "^1.0" }, "conflict": { - "symfony/console": "<6.4" + "symfony/console": "<7.4", + "symfony/error-handler": "<7.4" }, "require-dev": { - "symfony/console": "^6.4|^7.0|^8.0", - "symfony/http-kernel": "^6.4|^7.0|^8.0", - "symfony/process": "^6.4|^7.0|^8.0", - "symfony/uid": "^6.4|^7.0|^8.0", + "symfony/console": "^7.4|^8.0", + "symfony/http-kernel": "^7.4|^8.0", + "symfony/process": "^7.4|^8.0", + "symfony/uid": "^7.4|^8.0", "twig/twig": "^3.12" }, "bin": [ @@ -10687,7 +10523,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v7.4.6" + "source": "https://github.com/symfony/var-dumper/tree/v8.0.8" }, "funding": [ { @@ -10707,7 +10543,7 @@ "type": "tidelift" } ], - "time": "2026-02-15T10:53:20+00:00" + "time": "2026-03-31T07:15:36+00:00" }, { "name": "tijsverkoyen/css-to-inline-styles", @@ -10766,16 +10602,16 @@ }, { "name": "tio/laravel", - "version": "v1.23", + "version": "v1.25", "source": { "type": "git", "url": "https://github.com/translation/laravel.git", - "reference": "bbcf9ae4c48abb6737040e908f6a03d6c5e42b5c" + "reference": "6b18b2ab18708faa689ee8e23d3f2437fb62944d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/translation/laravel/zipball/bbcf9ae4c48abb6737040e908f6a03d6c5e42b5c", - "reference": "bbcf9ae4c48abb6737040e908f6a03d6c5e42b5c", + "url": "https://api.github.com/repos/translation/laravel/zipball/6b18b2ab18708faa689ee8e23d3f2437fb62944d", + "reference": "6b18b2ab18708faa689ee8e23d3f2437fb62944d", "shasum": "" }, "require": { @@ -10836,9 +10672,9 @@ ], "support": { "issues": "https://github.com/translation/laravel/issues", - "source": "https://github.com/translation/laravel/tree/v1.23" + "source": "https://github.com/translation/laravel/tree/v1.25" }, - "time": "2023-04-13T09:53:38+00:00" + "time": "2026-04-29T16:27:45+00:00" }, { "name": "ueberdosis/tiptap-php", @@ -10909,79 +10745,6 @@ ], "time": "2026-01-10T16:40:02+00:00" }, - { - "name": "valentin-morice/filament-json-column", - "version": "dev-dev", - "source": { - "type": "git", - "url": "https://github.com/valentin-morice/filament-json-column.git", - "reference": "04207c663b3af4aa8686926c4659fa188cb569bd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/valentin-morice/filament-json-column/zipball/04207c663b3af4aa8686926c4659fa188cb569bd", - "reference": "04207c663b3af4aa8686926c4659fa188cb569bd", - "shasum": "" - }, - "require": { - "filament/forms": "^4.0", - "filament/infolists": "^4.0", - "filament/notifications": "^4.0", - "php": "^8.2", - "spatie/laravel-package-tools": "^1.15.0" - }, - "require-dev": { - "laravel/pint": "^1.0", - "nunomaduro/collision": "^7.9|^8.0", - "nunomaduro/larastan": "^2.0.1", - "orchestra/testbench": "^8.0|^9.0", - "pestphp/pest": "^2.1", - "pestphp/pest-plugin-arch": "^2.0", - "pestphp/pest-plugin-laravel": "^2.0", - "phpstan/extension-installer": "^1.1", - "phpstan/phpstan-deprecation-rules": "^1.0", - "phpstan/phpstan-phpunit": "^1.0" - }, - "type": "library", - "extra": { - "laravel": { - "aliases": { - "FilamentJsonColumn": "ValentinMorice\\FilamentJsonColumn\\Facades\\FilamentJsonColumn" - }, - "providers": [ - "ValentinMorice\\FilamentJsonColumn\\FilamentJsonColumnServiceProvider" - ] - } - }, - "autoload": { - "psr-4": { - "ValentinMorice\\FilamentJsonColumn\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "valentin-morice", - "email": "valentinmorice1@gmail.com", - "role": "Developer" - } - ], - "description": "A simple package to view and edit your JSON columns in Filament", - "homepage": "https://github.com/valentin-morice/filament-json-column", - "keywords": [ - "filament-json-column", - "laravel", - "valentin-morice" - ], - "support": { - "issues": "https://github.com/valentin-morice/filament-json-column/issues", - "source": "https://github.com/valentin-morice/filament-json-column" - }, - "time": "2025-12-21T11:08:02+00:00" - }, { "name": "vlucas/phpdotenv", "version": "v5.6.3", @@ -11068,23 +10831,23 @@ }, { "name": "voku/portable-ascii", - "version": "2.0.3", + "version": "2.1.1", "source": { "type": "git", "url": "https://github.com/voku/portable-ascii.git", - "reference": "b1d923f88091c6bf09699efcd7c8a1b1bfd7351d" + "reference": "8e1051fe39379367aecf014f41744ce7539a856f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/voku/portable-ascii/zipball/b1d923f88091c6bf09699efcd7c8a1b1bfd7351d", - "reference": "b1d923f88091c6bf09699efcd7c8a1b1bfd7351d", + "url": "https://api.github.com/repos/voku/portable-ascii/zipball/8e1051fe39379367aecf014f41744ce7539a856f", + "reference": "8e1051fe39379367aecf014f41744ce7539a856f", "shasum": "" }, "require": { - "php": ">=7.0.0" + "php": ">=7.1.0" }, "require-dev": { - "phpunit/phpunit": "~6.0 || ~7.0 || ~9.0" + "phpunit/phpunit": "~8.5 || ~9.6 || ~10.5 || ~11.5" }, "suggest": { "ext-intl": "Use Intl for transliterator_transliterate() support" @@ -11114,7 +10877,7 @@ ], "support": { "issues": "https://github.com/voku/portable-ascii/issues", - "source": "https://github.com/voku/portable-ascii/tree/2.0.3" + "source": "https://github.com/voku/portable-ascii/tree/2.1.1" }, "funding": [ { @@ -11138,253 +10901,22 @@ "type": "tidelift" } ], - "time": "2024-11-21T01:49:47+00:00" + "time": "2026-04-26T05:33:54+00:00" } ], "packages-dev": [ - { - "name": "barryvdh/laravel-debugbar", - "version": "v3.16.5", - "source": { - "type": "git", - "url": "https://github.com/fruitcake/laravel-debugbar.git", - "reference": "e85c0a8464da67e5b4a53a42796d46a43fc06c9a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/fruitcake/laravel-debugbar/zipball/e85c0a8464da67e5b4a53a42796d46a43fc06c9a", - "reference": "e85c0a8464da67e5b4a53a42796d46a43fc06c9a", - "shasum": "" - }, - "require": { - "illuminate/routing": "^10|^11|^12", - "illuminate/session": "^10|^11|^12", - "illuminate/support": "^10|^11|^12", - "php": "^8.1", - "php-debugbar/php-debugbar": "^2.2.4", - "symfony/finder": "^6|^7|^8" - }, - "require-dev": { - "mockery/mockery": "^1.3.3", - "orchestra/testbench-dusk": "^7|^8|^9|^10", - "phpunit/phpunit": "^9.5.10|^10|^11", - "squizlabs/php_codesniffer": "^3.5" - }, - "type": "library", - "extra": { - "laravel": { - "aliases": { - "Debugbar": "Barryvdh\\Debugbar\\Facades\\Debugbar" - }, - "providers": [ - "Barryvdh\\Debugbar\\ServiceProvider" - ] - }, - "branch-alias": { - "dev-master": "3.16-dev" - } - }, - "autoload": { - "files": [ - "src/helpers.php" - ], - "psr-4": { - "Barryvdh\\Debugbar\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Barry vd. Heuvel", - "email": "barryvdh@gmail.com" - } - ], - "description": "PHP Debugbar integration for Laravel", - "keywords": [ - "debug", - "debugbar", - "dev", - "laravel", - "profiler", - "webprofiler" - ], - "support": { - "issues": "https://github.com/fruitcake/laravel-debugbar/issues", - "source": "https://github.com/fruitcake/laravel-debugbar/tree/v3.16.5" - }, - "funding": [ - { - "url": "https://fruitcake.nl", - "type": "custom" - }, - { - "url": "https://github.com/barryvdh", - "type": "github" - } - ], - "time": "2026-01-23T15:03:22+00:00" - }, - { - "name": "barryvdh/laravel-ide-helper", - "version": "v3.6.1", - "source": { - "type": "git", - "url": "https://github.com/barryvdh/laravel-ide-helper.git", - "reference": "b106f7ee85f263c4f103eca49e7bf3862c2e5e75" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/barryvdh/laravel-ide-helper/zipball/b106f7ee85f263c4f103eca49e7bf3862c2e5e75", - "reference": "b106f7ee85f263c4f103eca49e7bf3862c2e5e75", - "shasum": "" - }, - "require": { - "barryvdh/reflection-docblock": "^2.4", - "composer/class-map-generator": "^1.0", - "ext-json": "*", - "illuminate/console": "^11.15 || ^12", - "illuminate/database": "^11.15 || ^12", - "illuminate/filesystem": "^11.15 || ^12", - "illuminate/support": "^11.15 || ^12", - "php": "^8.2" - }, - "require-dev": { - "ext-pdo_sqlite": "*", - "friendsofphp/php-cs-fixer": "^3", - "illuminate/config": "^11.15 || ^12", - "illuminate/view": "^11.15 || ^12", - "mockery/mockery": "^1.4", - "orchestra/testbench": "^9.2 || ^10", - "phpunit/phpunit": "^10.5 || ^11.5.3", - "spatie/phpunit-snapshot-assertions": "^4 || ^5", - "vimeo/psalm": "^5.4", - "vlucas/phpdotenv": "^5" - }, - "suggest": { - "illuminate/events": "Required for automatic helper generation (^6|^7|^8|^9|^10|^11)." - }, - "type": "library", - "extra": { - "laravel": { - "providers": [ - "Barryvdh\\LaravelIdeHelper\\IdeHelperServiceProvider" - ] - }, - "branch-alias": { - "dev-master": "3.5-dev" - } - }, - "autoload": { - "psr-4": { - "Barryvdh\\LaravelIdeHelper\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Barry vd. Heuvel", - "email": "barryvdh@gmail.com" - } - ], - "description": "Laravel IDE Helper, generates correct PHPDocs for all Facade classes, to improve auto-completion.", - "keywords": [ - "autocomplete", - "codeintel", - "dev", - "helper", - "ide", - "laravel", - "netbeans", - "phpdoc", - "phpstorm", - "sublime" - ], - "support": { - "issues": "https://github.com/barryvdh/laravel-ide-helper/issues", - "source": "https://github.com/barryvdh/laravel-ide-helper/tree/v3.6.1" - }, - "funding": [ - { - "url": "https://fruitcake.nl", - "type": "custom" - }, - { - "url": "https://github.com/barryvdh", - "type": "github" - } - ], - "time": "2025-12-10T09:11:07+00:00" - }, - { - "name": "barryvdh/reflection-docblock", - "version": "v2.4.1", - "source": { - "type": "git", - "url": "https://github.com/barryvdh/ReflectionDocBlock.git", - "reference": "4f5ba70c30c81f2ce03a16a9965832cfcc31ed3b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/barryvdh/ReflectionDocBlock/zipball/4f5ba70c30c81f2ce03a16a9965832cfcc31ed3b", - "reference": "4f5ba70c30c81f2ce03a16a9965832cfcc31ed3b", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "require-dev": { - "phpunit/phpunit": "^8.5.14|^9" - }, - "suggest": { - "dflydev/markdown": "~1.0", - "erusev/parsedown": "~1.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.3.x-dev" - } - }, - "autoload": { - "psr-0": { - "Barryvdh": [ - "src/" - ] - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mike van Riel", - "email": "mike.vanriel@naenius.com" - } - ], - "support": { - "source": "https://github.com/barryvdh/ReflectionDocBlock/tree/v2.4.1" - }, - "time": "2026-03-05T20:09:01+00:00" - }, { "name": "brianium/paratest", - "version": "v7.19.0", + "version": "v7.20.0", "source": { "type": "git", "url": "https://github.com/paratestphp/paratest.git", - "reference": "7c6c29af7c4b406b49ce0c6b0a3a81d3684474e6" + "reference": "81c80677c9ec0ed4ef16b246167f11dec81a6e3d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/paratestphp/paratest/zipball/7c6c29af7c4b406b49ce0c6b0a3a81d3684474e6", - "reference": "7c6c29af7c4b406b49ce0c6b0a3a81d3684474e6", + "url": "https://api.github.com/repos/paratestphp/paratest/zipball/81c80677c9ec0ed4ef16b246167f11dec81a6e3d", + "reference": "81c80677c9ec0ed4ef16b246167f11dec81a6e3d", "shasum": "" }, "require": { @@ -11398,9 +10930,9 @@ "phpunit/php-code-coverage": "^12.5.3 || ^13.0.1", "phpunit/php-file-iterator": "^6.0.1 || ^7", "phpunit/php-timer": "^8 || ^9", - "phpunit/phpunit": "^12.5.9 || ^13", + "phpunit/phpunit": "^12.5.14 || ^13.0.5", "sebastian/environment": "^8.0.3 || ^9", - "symfony/console": "^7.4.4 || ^8.0.4", + "symfony/console": "^7.4.7 || ^8.0.7", "symfony/process": "^7.4.5 || ^8.0.5" }, "require-dev": { @@ -11408,11 +10940,11 @@ "ext-pcntl": "*", "ext-pcov": "*", "ext-posix": "*", - "phpstan/phpstan": "^2.1.38", - "phpstan/phpstan-deprecation-rules": "^2.0.3", - "phpstan/phpstan-phpunit": "^2.0.12", - "phpstan/phpstan-strict-rules": "^2.0.8", - "symfony/filesystem": "^7.4.0 || ^8.0.1" + "phpstan/phpstan": "^2.1.44", + "phpstan/phpstan-deprecation-rules": "^2.0.4", + "phpstan/phpstan-phpunit": "^2.0.16", + "phpstan/phpstan-strict-rules": "^2.0.10", + "symfony/filesystem": "^7.4.6 || ^8.0.6" }, "bin": [ "bin/paratest", @@ -11452,7 +10984,7 @@ ], "support": { "issues": "https://github.com/paratestphp/paratest/issues", - "source": "https://github.com/paratestphp/paratest/tree/v7.19.0" + "source": "https://github.com/paratestphp/paratest/tree/v7.20.0" }, "funding": [ { @@ -11464,44 +10996,47 @@ "type": "paypal" } ], - "time": "2026-02-06T10:53:26+00:00" + "time": "2026-03-29T15:46:14+00:00" }, { - "name": "composer/class-map-generator", - "version": "1.7.1", + "name": "composer/pcre", + "version": "3.3.2", "source": { "type": "git", - "url": "https://github.com/composer/class-map-generator.git", - "reference": "8f5fa3cc214230e71f54924bd0197a3bcc705eb1" + "url": "https://github.com/composer/pcre.git", + "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/class-map-generator/zipball/8f5fa3cc214230e71f54924bd0197a3bcc705eb1", - "reference": "8f5fa3cc214230e71f54924bd0197a3bcc705eb1", + "url": "https://api.github.com/repos/composer/pcre/zipball/b2bed4734f0cc156ee1fe9c0da2550420d99a21e", + "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e", "shasum": "" }, "require": { - "composer/pcre": "^2.1 || ^3.1", - "php": "^7.2 || ^8.0", - "symfony/finder": "^4.4 || ^5.3 || ^6 || ^7 || ^8" + "php": "^7.4 || ^8.0" + }, + "conflict": { + "phpstan/phpstan": "<1.11.10" }, "require-dev": { "phpstan/phpstan": "^1.12 || ^2", - "phpstan/phpstan-deprecation-rules": "^1 || ^2", - "phpstan/phpstan-phpunit": "^1 || ^2", - "phpstan/phpstan-strict-rules": "^1.1 || ^2", - "phpunit/phpunit": "^8", - "symfony/filesystem": "^5.4 || ^6 || ^7 || ^8" + "phpstan/phpstan-strict-rules": "^1 || ^2", + "phpunit/phpunit": "^8 || ^9" }, "type": "library", "extra": { + "phpstan": { + "includes": [ + "extension.neon" + ] + }, "branch-alias": { - "dev-main": "1.x-dev" + "dev-main": "3.x-dev" } }, "autoload": { "psr-4": { - "Composer\\ClassMapGenerator\\": "src" + "Composer\\Pcre\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -11512,16 +11047,19 @@ { "name": "Jordi Boggiano", "email": "j.boggiano@seld.be", - "homepage": "https://seld.be" + "homepage": "http://seld.be" } ], - "description": "Utilities to scan PHP code and generate class maps.", + "description": "PCRE wrapping library that offers type-safe preg_* replacements.", "keywords": [ - "classmap" + "PCRE", + "preg", + "regex", + "regular expression" ], "support": { - "issues": "https://github.com/composer/class-map-generator/issues", - "source": "https://github.com/composer/class-map-generator/tree/1.7.1" + "issues": "https://github.com/composer/pcre/issues", + "source": "https://github.com/composer/pcre/tree/3.3.2" }, "funding": [ { @@ -11531,49 +11069,42 @@ { "url": "https://github.com/composer", "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" } ], - "time": "2025-12-29T13:15:25+00:00" + "time": "2024-11-12T16:29:46+00:00" }, { - "name": "composer/pcre", - "version": "3.3.2", + "name": "composer/xdebug-handler", + "version": "3.0.5", "source": { "type": "git", - "url": "https://github.com/composer/pcre.git", - "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e" + "url": "https://github.com/composer/xdebug-handler.git", + "reference": "6c1925561632e83d60a44492e0b344cf48ab85ef" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/pcre/zipball/b2bed4734f0cc156ee1fe9c0da2550420d99a21e", - "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e", + "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/6c1925561632e83d60a44492e0b344cf48ab85ef", + "reference": "6c1925561632e83d60a44492e0b344cf48ab85ef", "shasum": "" }, "require": { - "php": "^7.4 || ^8.0" - }, - "conflict": { - "phpstan/phpstan": "<1.11.10" - }, - "require-dev": { - "phpstan/phpstan": "^1.12 || ^2", - "phpstan/phpstan-strict-rules": "^1 || ^2", - "phpunit/phpunit": "^8 || ^9" + "composer/pcre": "^1 || ^2 || ^3", + "php": "^7.2.5 || ^8.0", + "psr/log": "^1 || ^2 || ^3" }, - "type": "library", - "extra": { - "phpstan": { - "includes": [ - "extension.neon" - ] - }, - "branch-alias": { - "dev-main": "3.x-dev" - } + "require-dev": { + "phpstan/phpstan": "^1.0", + "phpstan/phpstan-strict-rules": "^1.1", + "phpunit/phpunit": "^8.5 || ^9.6 || ^10.5" }, + "type": "library", "autoload": { "psr-4": { - "Composer\\Pcre\\": "src" + "Composer\\XdebugHandler\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -11582,21 +11113,19 @@ ], "authors": [ { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" + "name": "John Stevenson", + "email": "john-stevenson@blueyonder.co.uk" } ], - "description": "PCRE wrapping library that offers type-safe preg_* replacements.", + "description": "Restarts a process without Xdebug.", "keywords": [ - "PCRE", - "preg", - "regex", - "regular expression" + "Xdebug", + "performance" ], "support": { - "issues": "https://github.com/composer/pcre/issues", - "source": "https://github.com/composer/pcre/tree/3.3.2" + "irc": "ircs://irc.libera.chat:6697/composer", + "issues": "https://github.com/composer/xdebug-handler/issues", + "source": "https://github.com/composer/xdebug-handler/tree/3.0.5" }, "funding": [ { @@ -11612,37 +11141,48 @@ "type": "tidelift" } ], - "time": "2024-11-12T16:29:46+00:00" + "time": "2024-05-06T16:37:16+00:00" }, { "name": "deployer/deployer", - "version": "v7.5.12", + "version": "v8.0.4", "source": { "type": "git", "url": "https://github.com/deployphp/deployer.git", - "reference": "efc71dac9ccc86b3f9946e75d50cb106b775aae2" + "reference": "927c9efcac7b1ad4af2c6fa5d031e0475a35820a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/deployphp/deployer/zipball/efc71dac9ccc86b3f9946e75d50cb106b775aae2", - "reference": "efc71dac9ccc86b3f9946e75d50cb106b775aae2", + "url": "https://api.github.com/repos/deployphp/deployer/zipball/927c9efcac7b1ad4af2c6fa5d031e0475a35820a", + "reference": "927c9efcac7b1ad4af2c6fa5d031e0475a35820a", "shasum": "" }, "require": { - "ext-json": "*", - "php": "^8.0|^7.3" + "maml/maml": "^3.2", + "php": "^8.3", + "symfony/console": "^7.4.0 || ^8.0.0", + "symfony/process": "^7.4.0 || ^8.0.0", + "symfony/yaml": "^7.4.0 || ^8.0.0" }, "require-dev": { - "friendsofphp/php-cs-fixer": "^3.64", - "pestphp/pest": "^3.3", - "phpstan/phpstan": "^1.4", - "phpunit/php-code-coverage": "^11.0", - "phpunit/phpunit": "^11.4" + "friendsofphp/php-cs-fixer": "^3.68", + "phpstan/phpstan": "^2.1", + "phpunit/php-code-coverage": "^12.0", + "phpunit/phpunit": "^12.5" }, "bin": [ "bin/dep" ], "type": "library", + "autoload": { + "files": [ + "src/functions.php", + "src/Support/helpers.php" + ], + "psr-4": { + "Deployer\\": "src/" + } + }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" @@ -11666,7 +11206,7 @@ "type": "github" } ], - "time": "2025-02-19T16:45:27+00:00" + "time": "2026-05-16T09:54:43+00:00" }, { "name": "doctrine/deprecations", @@ -11911,6 +11451,108 @@ ], "time": "2025-08-08T12:00:00+00:00" }, + { + "name": "fruitcake/laravel-debugbar", + "version": "v4.2.8", + "source": { + "type": "git", + "url": "https://github.com/fruitcake/laravel-debugbar.git", + "reference": "799d70c1101d3f8840dd76ff68ff6a78f9352905" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/fruitcake/laravel-debugbar/zipball/799d70c1101d3f8840dd76ff68ff6a78f9352905", + "reference": "799d70c1101d3f8840dd76ff68ff6a78f9352905", + "shasum": "" + }, + "require": { + "illuminate/routing": "^11|^12|^13.0", + "illuminate/session": "^11|^12|^13.0", + "illuminate/support": "^11|^12|^13.0", + "php": "^8.2", + "php-debugbar/php-debugbar": "^3.7.2", + "php-debugbar/symfony-bridge": "^1.1" + }, + "replace": { + "barryvdh/laravel-debugbar": "self.version" + }, + "require-dev": { + "larastan/larastan": "^3", + "laravel/octane": "^2", + "laravel/pennant": "^1", + "laravel/pint": "^1", + "laravel/telescope": "^5.16", + "livewire/livewire": "^3.7|^4", + "mockery/mockery": "^1.3.3", + "orchestra/testbench-dusk": "^9|^10|^11", + "php-debugbar/twig-bridge": "^2.0", + "phpstan/phpstan-phpunit": "^2", + "phpstan/phpstan-strict-rules": "^2.0", + "phpunit/phpunit": "^11", + "shipmonk/phpstan-rules": "^4.3" + }, + "type": "library", + "extra": { + "laravel": { + "aliases": { + "Debugbar": "Fruitcake\\LaravelDebugbar\\Facades\\Debugbar" + }, + "providers": [ + "Fruitcake\\LaravelDebugbar\\ServiceProvider" + ] + }, + "branch-alias": { + "dev-master": "4.2-dev" + } + }, + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "Fruitcake\\LaravelDebugbar\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fruitcake", + "homepage": "https://fruitcake.nl" + }, + { + "name": "Barry vd. Heuvel", + "email": "barryvdh@gmail.com" + } + ], + "description": "PHP Debugbar integration for Laravel", + "keywords": [ + "barryvdh", + "debug", + "debugbar", + "dev", + "laravel", + "profiler", + "webprofiler" + ], + "support": { + "issues": "https://github.com/fruitcake/laravel-debugbar/issues", + "source": "https://github.com/fruitcake/laravel-debugbar/tree/v4.2.8" + }, + "funding": [ + { + "url": "https://fruitcake.nl", + "type": "custom" + }, + { + "url": "https://github.com/barryvdh", + "type": "github" + } + ], + "time": "2026-04-20T13:31:29+00:00" + }, { "name": "hamcrest/hamcrest-php", "version": "v2.1.1", @@ -12024,21 +11666,21 @@ }, { "name": "kitloong/laravel-migrations-generator", - "version": "v7.2.0", + "version": "v7.4.0", "source": { "type": "git", "url": "https://github.com/kitloong/laravel-migrations-generator.git", - "reference": "37f29a99671a5dde3a598e40157e2e245f077878" + "reference": "706366afcef5be8a01a92c3a12bfa04c01a1eed2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/kitloong/laravel-migrations-generator/zipball/37f29a99671a5dde3a598e40157e2e245f077878", - "reference": "37f29a99671a5dde3a598e40157e2e245f077878", + "url": "https://api.github.com/repos/kitloong/laravel-migrations-generator/zipball/706366afcef5be8a01a92c3a12bfa04c01a1eed2", + "reference": "706366afcef5be8a01a92c3a12bfa04c01a1eed2", "shasum": "" }, "require": { "ext-pdo": "*", - "illuminate/support": "^11.0|^12.0", + "illuminate/support": "^11.0|^12.0|^13.0", "php": "^8.2" }, "require-dev": { @@ -12046,7 +11688,7 @@ "friendsofphp/php-cs-fixer": "^3.1", "larastan/larastan": "^2.0|^3.0", "mockery/mockery": "^1.0", - "orchestra/testbench": "^9.0|^10.0", + "orchestra/testbench": "^9.0|^10.0|^11.0", "phpmd/phpmd": "^2.10", "phpstan/phpstan-mockery": "^1.0|^2.0", "slevomat/coding-standard": "^8.0", @@ -12086,7 +11728,7 @@ ], "support": { "issues": "https://github.com/kitloong/laravel-migrations-generator/issues", - "source": "https://github.com/kitloong/laravel-migrations-generator/tree/v7.2.0" + "source": "https://github.com/kitloong/laravel-migrations-generator/tree/v7.4.0" }, "funding": [ { @@ -12098,38 +11740,36 @@ "type": "github" } ], - "time": "2025-08-10T07:31:19+00:00" + "time": "2026-05-10T14:54:43+00:00" }, { "name": "laradumps/laradumps", - "version": "v4.6.2", + "version": "v5.3.0", "source": { "type": "git", "url": "https://github.com/laradumps/laradumps.git", - "reference": "805d45f060d2b3badd1d3fc229a9bb893360d776" + "reference": "22ac20bb88e960eb1f68535958adefbc963074ce" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laradumps/laradumps/zipball/805d45f060d2b3badd1d3fc229a9bb893360d776", - "reference": "805d45f060d2b3badd1d3fc229a9bb893360d776", + "url": "https://api.github.com/repos/laradumps/laradumps/zipball/22ac20bb88e960eb1f68535958adefbc963074ce", + "reference": "22ac20bb88e960eb1f68535958adefbc963074ce", "shasum": "" }, "require": { - "illuminate/mail": "^10.0|^11.0|^12.0", - "illuminate/support": "^10.0|^11.0|^12.0", - "laradumps/laradumps-core": "^3.2.2", - "nunomaduro/termwind": "^1.15.1|^2.0.1", - "php": "^8.1" + "illuminate/mail": "^11.0 || ^12.0 || ^13.0", + "illuminate/support": "^11.0 || ^12.0 || ^13.0", + "laradumps/laradumps-core": "^4.0.3", + "php": "^8.2" }, "require-dev": { - "larastan/larastan": "^2.0|^3.0", - "laravel/framework": "^10.0|^11.0|^12.0", - "laravel/pint": "^1.17.2", - "livewire/livewire": "^3.5.6", + "larastan/larastan": "^3.8", + "laravel/framework": "^11.0 || ^12.0 || ^13.0", + "laravel/pint": "^1.26.0", "mockery/mockery": "^1.6.12", - "orchestra/testbench-core": "^8.0|^9.4|^10.0", - "pestphp/pest": "^4.0.0|^3.7.0|^2.35.1", - "symfony/var-dumper": "^6.4.0|^7.1.3" + "orchestra/testbench-core": "^9.4 || ^10.0 || ^11.0", + "pestphp/pest": "^3.7.0 || ^4.0.0", + "symfony/var-dumper": "^7.1.3|^8.0" }, "type": "library", "extra": { @@ -12162,7 +11802,7 @@ "homepage": "https://github.com/laradumps/laradumps", "support": { "issues": "https://github.com/laradumps/laradumps/issues", - "source": "https://github.com/laradumps/laradumps/tree/v4.6.2" + "source": "https://github.com/laradumps/laradumps/tree/v5.3.0" }, "funding": [ { @@ -12170,40 +11810,42 @@ "type": "github" } ], - "time": "2025-12-11T11:38:20+00:00" + "time": "2026-03-25T12:27:54+00:00" }, { "name": "laradumps/laradumps-core", - "version": "v3.2.11", + "version": "v4.0.6", "source": { "type": "git", "url": "https://github.com/laradumps/laradumps-core.git", - "reference": "cfc91afd1a6217ec568960eb996f371c08c380eb" + "reference": "41acc4a0dba81232287bed4d98de112b1c466244" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laradumps/laradumps-core/zipball/cfc91afd1a6217ec568960eb996f371c08c380eb", - "reference": "cfc91afd1a6217ec568960eb996f371c08c380eb", + "url": "https://api.github.com/repos/laradumps/laradumps-core/zipball/41acc4a0dba81232287bed4d98de112b1c466244", + "reference": "41acc4a0dba81232287bed4d98de112b1c466244", "shasum": "" }, "require": { "ext-curl": "*", - "nunomaduro/termwind": "^1.15|^2.0", - "php": "^8.1", - "ramsey/uuid": "^4.7.5", + "php": "^8.2", + "ramsey/uuid": "^4.9.1", "spatie/backtrace": "^1.5", - "symfony/console": "^5.4|^6.4|^7.0", - "symfony/finder": "^5.4|^6.4|^7.0", - "symfony/process": "^5.4|^6.4|^7.0", - "symfony/var-dumper": "^5.4|^6.4|^7.0", - "symfony/yaml": "^5.4|^6.4|^7.0" + "symfony/console": "^6.4|^7.0|^8.0", + "symfony/finder": "^6.4|^7.0|^8.0", + "symfony/process": "^6.4|^7.0|^8.0", + "symfony/var-dumper": "^6.4|^7.0|^8.0", + "symfony/yaml": "^6.4|^7.0|^8.0" }, "require-dev": { - "illuminate/support": "^10.46", - "laravel/pint": "^1.13.7", - "pestphp/pest": "^2.0|^3.0", + "illuminate/support": "^12", + "laravel/pint": "^1.26.0", + "pestphp/pest": "^3.0|^4.0", "phpstan/phpstan": "^1.10.50" }, + "suggest": { + "nunomaduro/termwind": "For a better terminal experience" + }, "bin": [ "bin/laradumps" ], @@ -12231,7 +11873,7 @@ "homepage": "https://github.com/laradumps/laradumps-core", "support": { "issues": "https://github.com/laradumps/laradumps-core/issues", - "source": "https://github.com/laradumps/laradumps-core/tree/v3.2.11" + "source": "https://github.com/laradumps/laradumps-core/tree/v4.0.6" }, "funding": [ { @@ -12239,20 +11881,20 @@ "type": "github" } ], - "time": "2025-12-11T14:41:59+00:00" + "time": "2026-03-19T15:05:22+00:00" }, { "name": "laravel/boost", - "version": "v2.3.1", + "version": "v2.4.6", "source": { "type": "git", "url": "https://github.com/laravel/boost.git", - "reference": "ba0a9e6497398b6ce8243f5517b67d6761509150" + "reference": "c9ea6368c66f7c0e6a9b26706b401de900cdb9ac" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/boost/zipball/ba0a9e6497398b6ce8243f5517b67d6761509150", - "reference": "ba0a9e6497398b6ce8243f5517b67d6761509150", + "url": "https://api.github.com/repos/laravel/boost/zipball/c9ea6368c66f7c0e6a9b26706b401de900cdb9ac", + "reference": "c9ea6368c66f7c0e6a9b26706b401de900cdb9ac", "shasum": "" }, "require": { @@ -12261,7 +11903,7 @@ "illuminate/contracts": "^11.45.3|^12.41.1|^13.0", "illuminate/routing": "^11.45.3|^12.41.1|^13.0", "illuminate/support": "^11.45.3|^12.41.1|^13.0", - "laravel/mcp": "^0.5.1|^0.6.0", + "laravel/mcp": "^0.5.1|^0.6.0|^0.7.0", "laravel/prompts": "^0.3.10", "laravel/roster": "^0.5.0", "php": "^8.2" @@ -12305,7 +11947,7 @@ "issues": "https://github.com/laravel/boost/issues", "source": "https://github.com/laravel/boost" }, - "time": "2026-03-12T09:06:47+00:00" + "time": "2026-04-28T11:52:01+00:00" }, { "name": "laravel/breeze", @@ -12370,16 +12012,16 @@ }, { "name": "laravel/mcp", - "version": "v0.6.2", + "version": "v0.7.0", "source": { "type": "git", "url": "https://github.com/laravel/mcp.git", - "reference": "f696e44735b95ff275392eab8ce5a3b4b42a2223" + "reference": "3513b4feca5f1678be4d2261dcfa8e456436d02a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/mcp/zipball/f696e44735b95ff275392eab8ce5a3b4b42a2223", - "reference": "f696e44735b95ff275392eab8ce5a3b4b42a2223", + "url": "https://api.github.com/repos/laravel/mcp/zipball/3513b4feca5f1678be4d2261dcfa8e456436d02a", + "reference": "3513b4feca5f1678be4d2261dcfa8e456436d02a", "shasum": "" }, "require": { @@ -12439,7 +12081,7 @@ "issues": "https://github.com/laravel/mcp/issues", "source": "https://github.com/laravel/mcp" }, - "time": "2026-03-10T20:00:23+00:00" + "time": "2026-04-21T10:23:03+00:00" }, { "name": "laravel/pail", @@ -12523,16 +12165,16 @@ }, { "name": "laravel/pint", - "version": "v1.29.0", + "version": "v1.29.1", "source": { "type": "git", "url": "https://github.com/laravel/pint.git", - "reference": "bdec963f53172c5e36330f3a400604c69bf02d39" + "reference": "0770e9b7fafd50d4586881d456d6eb41c9247a80" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/pint/zipball/bdec963f53172c5e36330f3a400604c69bf02d39", - "reference": "bdec963f53172c5e36330f3a400604c69bf02d39", + "url": "https://api.github.com/repos/laravel/pint/zipball/0770e9b7fafd50d4586881d456d6eb41c9247a80", + "reference": "0770e9b7fafd50d4586881d456d6eb41c9247a80", "shasum": "" }, "require": { @@ -12543,14 +12185,14 @@ "php": "^8.2.0" }, "require-dev": { - "friendsofphp/php-cs-fixer": "^3.94.2", - "illuminate/view": "^12.54.1", - "larastan/larastan": "^3.9.3", - "laravel-zero/framework": "^12.0.5", + "friendsofphp/php-cs-fixer": "^3.95.1", + "illuminate/view": "^12.56.0", + "larastan/larastan": "^3.9.6", + "laravel-zero/framework": "^12.1.0", "mockery/mockery": "^1.6.12", "nunomaduro/termwind": "^2.4.0", "pestphp/pest": "^3.8.6", - "shipfastlabs/agent-detector": "^1.1.0" + "shipfastlabs/agent-detector": "^1.1.3" }, "bin": [ "builds/pint" @@ -12587,7 +12229,7 @@ "issues": "https://github.com/laravel/pint/issues", "source": "https://github.com/laravel/pint" }, - "time": "2026-03-12T15:51:39+00:00" + "time": "2026-04-20T15:26:14+00:00" }, { "name": "laravel/roster", @@ -12650,6 +12292,60 @@ }, "time": "2026-03-05T07:58:43+00:00" }, + { + "name": "maml/maml", + "version": "v3.2.0", + "source": { + "type": "git", + "url": "https://github.com/maml-dev/maml-php.git", + "reference": "f11cdff4325bf399f23c33fc1995450e40ac0854" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/maml-dev/maml-php/zipball/f11cdff4325bf399f23c33fc1995450e40ac0854", + "reference": "f11cdff4325bf399f23c33fc1995450e40ac0854", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": ">=8.2" + }, + "require-dev": { + "php-cs-fixer/shim": "^3.94", + "phpstan/phpstan": "^2.1", + "phpunit/phpunit": "^10.0 || ^11.0 || ^12.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Maml\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Anton Medvedev", + "email": "anton@medv.io" + } + ], + "description": "MAML Parser", + "homepage": "https://maml.dev", + "keywords": [ + "config", + "configuration", + "maml", + "parser", + "serializer" + ], + "support": { + "issues": "https://github.com/maml-dev/maml-php/issues", + "source": "https://github.com/maml-dev/maml-php/tree/v3.2.0" + }, + "time": "2026-04-12T16:50:36+00:00" + }, { "name": "mockery/mockery", "version": "1.6.12", @@ -12795,23 +12491,23 @@ }, { "name": "nunomaduro/collision", - "version": "v8.9.1", + "version": "v8.9.4", "source": { "type": "git", "url": "https://github.com/nunomaduro/collision.git", - "reference": "a1ed3fa530fd60bc515f9303e8520fcb7d4bd935" + "reference": "716af8f95a470e9094cfca09ed897b023be191a5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nunomaduro/collision/zipball/a1ed3fa530fd60bc515f9303e8520fcb7d4bd935", - "reference": "a1ed3fa530fd60bc515f9303e8520fcb7d4bd935", + "url": "https://api.github.com/repos/nunomaduro/collision/zipball/716af8f95a470e9094cfca09ed897b023be191a5", + "reference": "716af8f95a470e9094cfca09ed897b023be191a5", "shasum": "" }, "require": { "filp/whoops": "^2.18.4", "nunomaduro/termwind": "^2.4.0", "php": "^8.2.0", - "symfony/console": "^7.4.4 || ^8.0.4" + "symfony/console": "^7.4.8 || ^8.0.8" }, "conflict": { "laravel/framework": "<11.48.0 || >=14.0.0", @@ -12819,12 +12515,12 @@ }, "require-dev": { "brianium/paratest": "^7.8.5", - "larastan/larastan": "^3.9.2", - "laravel/framework": "^11.48.0 || ^12.52.0", - "laravel/pint": "^1.27.1", - "orchestra/testbench-core": "^9.12.0 || ^10.9.0", - "pestphp/pest": "^3.8.5 || ^4.4.1 || ^5.0.0", - "sebastian/environment": "^7.2.1 || ^8.0.3 || ^9.0.0" + "larastan/larastan": "^3.9.6", + "laravel/framework": "^11.48.0 || ^12.56.0 || ^13.5.0", + "laravel/pint": "^1.29.1", + "orchestra/testbench-core": "^9.12.0 || ^10.12.1 || ^11.2.1", + "pestphp/pest": "^3.8.5 || ^4.4.3 || ^5.0.0", + "sebastian/environment": "^7.2.1 || ^8.0.4 || ^9.3.0" }, "type": "library", "extra": { @@ -12887,45 +12583,47 @@ "type": "patreon" } ], - "time": "2026-02-17T17:33:08+00:00" + "time": "2026-04-21T14:04:20+00:00" }, { "name": "pestphp/pest", - "version": "v4.4.2", + "version": "v4.7.0", "source": { "type": "git", "url": "https://github.com/pestphp/pest.git", - "reference": "5d42e8fe3ae1d9fdf7c9f73ee88138fd30265701" + "reference": "2fc75cfcf03c041c804778fa894282234adc3c66" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pestphp/pest/zipball/5d42e8fe3ae1d9fdf7c9f73ee88138fd30265701", - "reference": "5d42e8fe3ae1d9fdf7c9f73ee88138fd30265701", + "url": "https://api.github.com/repos/pestphp/pest/zipball/2fc75cfcf03c041c804778fa894282234adc3c66", + "reference": "2fc75cfcf03c041c804778fa894282234adc3c66", "shasum": "" }, "require": { - "brianium/paratest": "^7.19.0", - "nunomaduro/collision": "^8.9.1", + "brianium/paratest": "^7.20.0", + "composer/xdebug-handler": "^3.0.5", + "nunomaduro/collision": "^8.9.4", "nunomaduro/termwind": "^2.4.0", "pestphp/pest-plugin": "^4.0.0", - "pestphp/pest-plugin-arch": "^4.0.0", + "pestphp/pest-plugin-arch": "^4.0.2", "pestphp/pest-plugin-mutate": "^4.0.1", "pestphp/pest-plugin-profanity": "^4.2.1", "php": "^8.3.0", - "phpunit/phpunit": "^12.5.12", - "symfony/process": "^7.4.5|^8.0.5" + "phpunit/phpunit": "^12.5.24", + "symfony/process": "^7.4.8|^8.0.8" }, "conflict": { "filp/whoops": "<2.18.3", - "phpunit/phpunit": ">12.5.12", + "phpunit/phpunit": ">12.5.24", "sebastian/exporter": "<7.0.0", "webmozart/assert": "<1.11.0" }, "require-dev": { + "mrpunyapal/peststan": "^0.2.9", "pestphp/pest-dev-tools": "^4.1.0", - "pestphp/pest-plugin-browser": "^4.3.0", - "pestphp/pest-plugin-type-coverage": "^4.0.3", - "psy/psysh": "^0.12.21" + "pestphp/pest-plugin-browser": "^4.3.1", + "pestphp/pest-plugin-type-coverage": "^4.0.4", + "psy/psysh": "^0.12.22" }, "bin": [ "bin/pest" @@ -12952,6 +12650,7 @@ "Pest\\Plugins\\Verbose", "Pest\\Plugins\\Version", "Pest\\Plugins\\Shard", + "Pest\\Plugins\\Tia", "Pest\\Plugins\\Parallel" ] }, @@ -12991,7 +12690,7 @@ ], "support": { "issues": "https://github.com/pestphp/pest/issues", - "source": "https://github.com/pestphp/pest/tree/v4.4.2" + "source": "https://github.com/pestphp/pest/tree/v4.7.0" }, "funding": [ { @@ -13003,7 +12702,7 @@ "type": "github" } ], - "time": "2026-03-10T21:09:12+00:00" + "time": "2026-05-03T16:09:32+00:00" }, { "name": "pestphp/pest-plugin", @@ -13077,26 +12776,26 @@ }, { "name": "pestphp/pest-plugin-arch", - "version": "v4.0.0", + "version": "v4.0.2", "source": { "type": "git", "url": "https://github.com/pestphp/pest-plugin-arch.git", - "reference": "25bb17e37920ccc35cbbcda3b00d596aadf3e58d" + "reference": "3fb0d02a91b9da504b139dc7ab2a31efb7c3215c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pestphp/pest-plugin-arch/zipball/25bb17e37920ccc35cbbcda3b00d596aadf3e58d", - "reference": "25bb17e37920ccc35cbbcda3b00d596aadf3e58d", + "url": "https://api.github.com/repos/pestphp/pest-plugin-arch/zipball/3fb0d02a91b9da504b139dc7ab2a31efb7c3215c", + "reference": "3fb0d02a91b9da504b139dc7ab2a31efb7c3215c", "shasum": "" }, "require": { "pestphp/pest-plugin": "^4.0.0", "php": "^8.3", - "ta-tikoma/phpunit-architecture-test": "^0.8.5" + "ta-tikoma/phpunit-architecture-test": "^0.8.7" }, "require-dev": { - "pestphp/pest": "^4.0.0", - "pestphp/pest-dev-tools": "^4.0.0" + "pestphp/pest": "^4.4.6", + "pestphp/pest-dev-tools": "^4.1.0" }, "type": "library", "extra": { @@ -13131,7 +12830,7 @@ "unit" ], "support": { - "source": "https://github.com/pestphp/pest-plugin-arch/tree/v4.0.0" + "source": "https://github.com/pestphp/pest-plugin-arch/tree/v4.0.2" }, "funding": [ { @@ -13143,7 +12842,7 @@ "type": "github" } ], - "time": "2025-08-20T13:10:51+00:00" + "time": "2026-04-10T17:20:19+00:00" }, { "name": "pestphp/pest-plugin-laravel", @@ -13471,47 +13170,63 @@ }, { "name": "php-debugbar/php-debugbar", - "version": "v2.2.6", + "version": "v3.7.6", "source": { "type": "git", "url": "https://github.com/php-debugbar/php-debugbar.git", - "reference": "abb9fa3c5c8dbe7efe03ddba56782917481de3e8" + "reference": "1690ee1728827f9deb4b60457fa387cf44672c56" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-debugbar/php-debugbar/zipball/abb9fa3c5c8dbe7efe03ddba56782917481de3e8", - "reference": "abb9fa3c5c8dbe7efe03ddba56782917481de3e8", + "url": "https://api.github.com/repos/php-debugbar/php-debugbar/zipball/1690ee1728827f9deb4b60457fa387cf44672c56", + "reference": "1690ee1728827f9deb4b60457fa387cf44672c56", "shasum": "" }, "require": { - "php": "^8.1", + "php": "^8.2", "psr/log": "^1|^2|^3", - "symfony/var-dumper": "^5.4|^6.4|^7.3|^8.0" + "symfony/var-dumper": "^5.4|^6|^7|^8" }, "replace": { "maximebf/debugbar": "self.version" }, "require-dev": { - "dbrekelmans/bdi": "^1", + "dbrekelmans/bdi": "^1.4", + "friendsofphp/php-cs-fixer": "^3.92", + "monolog/monolog": "^3.9", + "php-debugbar/doctrine-bridge": "^3@dev", + "php-debugbar/monolog-bridge": "^1@dev", + "php-debugbar/symfony-bridge": "^1@dev", + "php-debugbar/twig-bridge": "^2@dev", + "phpstan/phpstan": "^2.1", + "phpstan/phpstan-phpunit": "^2.0", + "phpstan/phpstan-strict-rules": "^2.0", "phpunit/phpunit": "^10", - "symfony/browser-kit": "^6.0|7.0", + "predis/predis": "^3.3", + "shipmonk/phpstan-rules": "^4.3", + "symfony/browser-kit": "^6.4|7.0", + "symfony/dom-crawler": "^6.4|^7", + "symfony/event-dispatcher": "^5.4|^6.4|^7.3|^8.0", + "symfony/http-foundation": "^5.4|^6.4|^7.3|^8.0", + "symfony/mailer": "^5.4|^6.4|^7.3|^8.0", "symfony/panther": "^1|^2.1", "twig/twig": "^3.11.2" }, "suggest": { - "kriswallsmith/assetic": "The best way to manage assets", - "monolog/monolog": "Log using Monolog", - "predis/predis": "Redis storage" + "php-debugbar/doctrine-bridge": "To integrate Doctrine with php-debugbar.", + "php-debugbar/monolog-bridge": "To integrate Monolog with php-debugbar.", + "php-debugbar/symfony-bridge": "To integrate Symfony with php-debugbar.", + "php-debugbar/twig-bridge": "To integrate Twig with php-debugbar." }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.2-dev" + "dev-master": "3.0-dev" } }, "autoload": { "psr-4": { - "DebugBar\\": "src/DebugBar/" + "DebugBar\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -13535,13 +13250,91 @@ "debug", "debug bar", "debugbar", - "dev" + "dev", + "profiler", + "toolbar" ], "support": { "issues": "https://github.com/php-debugbar/php-debugbar/issues", - "source": "https://github.com/php-debugbar/php-debugbar/tree/v2.2.6" + "source": "https://github.com/php-debugbar/php-debugbar/tree/v3.7.6" + }, + "funding": [ + { + "url": "https://fruitcake.nl", + "type": "custom" + }, + { + "url": "https://github.com/barryvdh", + "type": "github" + } + ], + "time": "2026-04-30T07:31:44+00:00" + }, + { + "name": "php-debugbar/symfony-bridge", + "version": "v1.1.0", + "source": { + "type": "git", + "url": "https://github.com/php-debugbar/symfony-bridge.git", + "reference": "e37d2debe5d316408b00d0ab2688d9c2cf59b5ad" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-debugbar/symfony-bridge/zipball/e37d2debe5d316408b00d0ab2688d9c2cf59b5ad", + "reference": "e37d2debe5d316408b00d0ab2688d9c2cf59b5ad", + "shasum": "" + }, + "require": { + "php": "^8.2", + "php-debugbar/php-debugbar": "^3.1", + "symfony/http-foundation": "^5.4|^6.4|^7.3|^8.0" + }, + "require-dev": { + "dbrekelmans/bdi": "^1.4", + "phpunit/phpunit": "^10", + "symfony/browser-kit": "^6|^7", + "symfony/dom-crawler": "^6|^7", + "symfony/mailer": "^5.4|^6.4|^7.3|^8.0", + "symfony/panther": "^1|^2.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "psr-4": { + "DebugBar\\Bridge\\Symfony\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Maxime Bouroumeau-Fuseau", + "email": "maxime.bouroumeau@gmail.com", + "homepage": "http://maximebf.com" + }, + { + "name": "Barry vd. Heuvel", + "email": "barryvdh@gmail.com" + } + ], + "description": "Symfony bridge for PHP Debugbar", + "homepage": "https://github.com/php-debugbar/php-debugbar", + "keywords": [ + "debugbar", + "dev", + "symfony" + ], + "support": { + "issues": "https://github.com/php-debugbar/symfony-bridge/issues", + "source": "https://github.com/php-debugbar/symfony-bridge/tree/v1.1.0" }, - "time": "2025-12-22T13:21:32+00:00" + "time": "2026-01-15T14:47:34+00:00" }, { "name": "phpdocumentor/reflection-common", @@ -13598,16 +13391,16 @@ }, { "name": "phpdocumentor/reflection-docblock", - "version": "6.0.2", + "version": "6.0.3", "source": { "type": "git", "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "897b5986ece6b4f9d8413fea345c7d49c757d6bf" + "reference": "7bae67520aa9f5ecc506d646810bd40d9da54582" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/897b5986ece6b4f9d8413fea345c7d49c757d6bf", - "reference": "897b5986ece6b4f9d8413fea345c7d49c757d6bf", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/7bae67520aa9f5ecc506d646810bd40d9da54582", + "reference": "7bae67520aa9f5ecc506d646810bd40d9da54582", "shasum": "" }, "require": { @@ -13657,9 +13450,9 @@ "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", "support": { "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", - "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/6.0.2" + "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/6.0.3" }, - "time": "2026-03-01T18:43:49+00:00" + "time": "2026-03-18T20:49:53+00:00" }, { "name": "phpdocumentor/type-resolver", @@ -13768,16 +13561,16 @@ }, { "name": "phpunit/php-code-coverage", - "version": "12.5.3", + "version": "12.5.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "b015312f28dd75b75d3422ca37dff2cd1a565e8d" + "reference": "876099a072646c7745f673d7aeab5382c4439691" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/b015312f28dd75b75d3422ca37dff2cd1a565e8d", - "reference": "b015312f28dd75b75d3422ca37dff2cd1a565e8d", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/876099a072646c7745f673d7aeab5382c4439691", + "reference": "876099a072646c7745f673d7aeab5382c4439691", "shasum": "" }, "require": { @@ -13786,7 +13579,6 @@ "ext-xmlwriter": "*", "nikic/php-parser": "^5.7.0", "php": ">=8.3", - "phpunit/php-file-iterator": "^6.0", "phpunit/php-text-template": "^5.0", "sebastian/complexity": "^5.0", "sebastian/environment": "^8.0.3", @@ -13833,7 +13625,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/12.5.3" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/12.5.6" }, "funding": [ { @@ -13853,7 +13645,7 @@ "type": "tidelift" } ], - "time": "2026-02-06T06:01:44+00:00" + "time": "2026-04-15T08:23:17+00:00" }, { "name": "phpunit/php-file-iterator", @@ -14114,16 +13906,16 @@ }, { "name": "phpunit/phpunit", - "version": "12.5.12", + "version": "12.5.24", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "418e06b3b46b0d54bad749ff4907fc7dfb530199" + "reference": "d75dd30597caa80e72fad2ef7904601a30ef1046" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/418e06b3b46b0d54bad749ff4907fc7dfb530199", - "reference": "418e06b3b46b0d54bad749ff4907fc7dfb530199", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/d75dd30597caa80e72fad2ef7904601a30ef1046", + "reference": "d75dd30597caa80e72fad2ef7904601a30ef1046", "shasum": "" }, "require": { @@ -14137,15 +13929,15 @@ "phar-io/manifest": "^2.0.4", "phar-io/version": "^3.2.1", "php": ">=8.3", - "phpunit/php-code-coverage": "^12.5.3", + "phpunit/php-code-coverage": "^12.5.6", "phpunit/php-file-iterator": "^6.0.1", "phpunit/php-invoker": "^6.0.0", "phpunit/php-text-template": "^5.0.0", "phpunit/php-timer": "^8.0.0", "sebastian/cli-parser": "^4.2.0", - "sebastian/comparator": "^7.1.4", + "sebastian/comparator": "^7.1.6", "sebastian/diff": "^7.0.0", - "sebastian/environment": "^8.0.3", + "sebastian/environment": "^8.1.0", "sebastian/exporter": "^7.0.2", "sebastian/global-state": "^8.0.2", "sebastian/object-enumerator": "^7.0.0", @@ -14192,31 +13984,15 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/12.5.12" + "source": "https://github.com/sebastianbergmann/phpunit/tree/12.5.24" }, "funding": [ { - "url": "https://phpunit.de/sponsors.html", - "type": "custom" - }, - { - "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/phpunit/phpunit", - "type": "tidelift" + "url": "https://phpunit.de/sponsoring.html", + "type": "other" } ], - "time": "2026-02-16T08:34:36+00:00" + "time": "2026-05-01T04:21:04+00:00" }, { "name": "sebastian/cli-parser", @@ -14289,16 +14065,16 @@ }, { "name": "sebastian/comparator", - "version": "7.1.4", + "version": "7.1.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "6a7de5df2e094f9a80b40a522391a7e6022df5f6" + "reference": "c769009dee98f494e0edc3fd4f4087501688f11e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/6a7de5df2e094f9a80b40a522391a7e6022df5f6", - "reference": "6a7de5df2e094f9a80b40a522391a7e6022df5f6", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/c769009dee98f494e0edc3fd4f4087501688f11e", + "reference": "c769009dee98f494e0edc3fd4f4087501688f11e", "shasum": "" }, "require": { @@ -14357,7 +14133,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/comparator/issues", "security": "https://github.com/sebastianbergmann/comparator/security/policy", - "source": "https://github.com/sebastianbergmann/comparator/tree/7.1.4" + "source": "https://github.com/sebastianbergmann/comparator/tree/7.1.6" }, "funding": [ { @@ -14377,7 +14153,7 @@ "type": "tidelift" } ], - "time": "2026-01-24T09:28:48+00:00" + "time": "2026-04-14T08:23:15+00:00" }, { "name": "sebastian/complexity", @@ -14506,16 +14282,16 @@ }, { "name": "sebastian/environment", - "version": "8.0.3", + "version": "8.1.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "24a711b5c916efc6d6e62aa65aa2ec98fef77f68" + "reference": "b121608b28a13f721e76ffbbd386d08eff58f3f6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/24a711b5c916efc6d6e62aa65aa2ec98fef77f68", - "reference": "24a711b5c916efc6d6e62aa65aa2ec98fef77f68", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/b121608b28a13f721e76ffbbd386d08eff58f3f6", + "reference": "b121608b28a13f721e76ffbbd386d08eff58f3f6", "shasum": "" }, "require": { @@ -14530,7 +14306,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "8.0-dev" + "dev-main": "8.1-dev" } }, "autoload": { @@ -14558,7 +14334,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/environment/issues", "security": "https://github.com/sebastianbergmann/environment/security/policy", - "source": "https://github.com/sebastianbergmann/environment/tree/8.0.3" + "source": "https://github.com/sebastianbergmann/environment/tree/8.1.0" }, "funding": [ { @@ -14578,7 +14354,7 @@ "type": "tidelift" } ], - "time": "2025-08-12T14:11:56+00:00" + "time": "2026-04-15T12:13:01+00:00" }, { "name": "sebastian/exporter", @@ -15255,26 +15031,26 @@ }, { "name": "spatie/flare-client-php", - "version": "1.10.1", + "version": "1.11.1", "source": { "type": "git", "url": "https://github.com/spatie/flare-client-php.git", - "reference": "bf1716eb98bd689451b071548ae9e70738dce62f" + "reference": "53f41b08a27cc039e1a8ed2be9a202e924f31bad" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/flare-client-php/zipball/bf1716eb98bd689451b071548ae9e70738dce62f", - "reference": "bf1716eb98bd689451b071548ae9e70738dce62f", + "url": "https://api.github.com/repos/spatie/flare-client-php/zipball/53f41b08a27cc039e1a8ed2be9a202e924f31bad", + "reference": "53f41b08a27cc039e1a8ed2be9a202e924f31bad", "shasum": "" }, "require": { - "illuminate/pipeline": "^8.0|^9.0|^10.0|^11.0|^12.0", + "illuminate/pipeline": "^8.0|^9.0|^10.0|^11.0|^12.0|^13.0", "php": "^8.0", "spatie/backtrace": "^1.6.1", - "symfony/http-foundation": "^5.2|^6.0|^7.0", - "symfony/mime": "^5.2|^6.0|^7.0", - "symfony/process": "^5.2|^6.0|^7.0", - "symfony/var-dumper": "^5.2|^6.0|^7.0" + "symfony/http-foundation": "^5.2|^6.0|^7.0|^8.0", + "symfony/mime": "^5.2|^6.0|^7.0|^8.0", + "symfony/process": "^5.2|^6.0|^7.0|^8.0", + "symfony/var-dumper": "^5.2|^6.0|^7.0|^8.0" }, "require-dev": { "dms/phpunit-arraysubset-asserts": "^0.5.0", @@ -15312,7 +15088,7 @@ ], "support": { "issues": "https://github.com/spatie/flare-client-php/issues", - "source": "https://github.com/spatie/flare-client-php/tree/1.10.1" + "source": "https://github.com/spatie/flare-client-php/tree/1.11.1" }, "funding": [ { @@ -15320,41 +15096,44 @@ "type": "github" } ], - "time": "2025-02-14T13:42:06+00:00" + "time": "2026-05-15T09:31:32+00:00" }, { "name": "spatie/ignition", - "version": "1.15.1", + "version": "1.16.0", "source": { "type": "git", "url": "https://github.com/spatie/ignition.git", - "reference": "31f314153020aee5af3537e507fef892ffbf8c85" + "reference": "b59385bb7aa24dae81bcc15850ebecfda7b40838" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/ignition/zipball/31f314153020aee5af3537e507fef892ffbf8c85", - "reference": "31f314153020aee5af3537e507fef892ffbf8c85", + "url": "https://api.github.com/repos/spatie/ignition/zipball/b59385bb7aa24dae81bcc15850ebecfda7b40838", + "reference": "b59385bb7aa24dae81bcc15850ebecfda7b40838", "shasum": "" }, "require": { "ext-json": "*", "ext-mbstring": "*", "php": "^8.0", - "spatie/error-solutions": "^1.0", - "spatie/flare-client-php": "^1.7", - "symfony/console": "^5.4|^6.0|^7.0", - "symfony/var-dumper": "^5.4|^6.0|^7.0" + "spatie/backtrace": "^1.7.1", + "spatie/error-solutions": "^1.1.2", + "spatie/flare-client-php": "^1.9", + "symfony/console": "^5.4.42|^6.0|^7.0|^8.0", + "symfony/http-foundation": "^5.4.42|^6.0|^7.0|^8.0", + "symfony/mime": "^5.4.42|^6.0|^7.0|^8.0", + "symfony/var-dumper": "^5.4.42|^6.0|^7.0|^8.0" }, "require-dev": { - "illuminate/cache": "^9.52|^10.0|^11.0|^12.0", + "illuminate/cache": "^9.52|^10.0|^11.0|^12.0|^13.0", "mockery/mockery": "^1.4", - "pestphp/pest": "^1.20|^2.0", + "pestphp/pest": "^1.20|^2.0|^3.0", "phpstan/extension-installer": "^1.1", "phpstan/phpstan-deprecation-rules": "^1.0", "phpstan/phpstan-phpunit": "^1.0", "psr/simple-cache-implementation": "*", - "symfony/cache": "^5.4|^6.0|^7.0", - "symfony/process": "^5.4|^6.0|^7.0", + "symfony/cache": "^5.4.38|^6.0|^7.0|^8.0", + "symfony/process": "^5.4.35|^6.0|^7.0|^8.0", "vlucas/phpdotenv": "^5.5" }, "suggest": { @@ -15403,20 +15182,20 @@ "type": "github" } ], - "time": "2025-02-21T14:31:39+00:00" + "time": "2026-03-17T10:51:08+00:00" }, { "name": "spatie/laravel-ignition", - "version": "2.11.0", + "version": "2.12.0", "source": { "type": "git", "url": "https://github.com/spatie/laravel-ignition.git", - "reference": "11f38d1ff7abc583a61c96bf3c1b03610a69cccd" + "reference": "45b3b6e1e73fc161cba2149972698644b99594ee" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-ignition/zipball/11f38d1ff7abc583a61c96bf3c1b03610a69cccd", - "reference": "11f38d1ff7abc583a61c96bf3c1b03610a69cccd", + "url": "https://api.github.com/repos/spatie/laravel-ignition/zipball/45b3b6e1e73fc161cba2149972698644b99594ee", + "reference": "45b3b6e1e73fc161cba2149972698644b99594ee", "shasum": "" }, "require": { @@ -15426,7 +15205,7 @@ "illuminate/support": "^11.0|^12.0|^13.0", "nesbot/carbon": "^2.72|^3.0", "php": "^8.2", - "spatie/ignition": "^1.15.1", + "spatie/ignition": "^1.16", "symfony/console": "^7.4|^8.0", "symfony/var-dumper": "^7.4|^8.0" }, @@ -15495,7 +15274,7 @@ "type": "github" } ], - "time": "2026-02-22T19:14:05+00:00" + "time": "2026-03-17T12:20:04+00:00" }, { "name": "staabm/side-effects-detector", @@ -15551,28 +15330,27 @@ }, { "name": "symfony/yaml", - "version": "v7.4.6", + "version": "v8.0.11", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "58751048de17bae71c5aa0d13cb19d79bca26391" + "reference": "48046fbd5567bd1717f278eaa2cfc3131f489984" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/58751048de17bae71c5aa0d13cb19d79bca26391", - "reference": "58751048de17bae71c5aa0d13cb19d79bca26391", + "url": "https://api.github.com/repos/symfony/yaml/zipball/48046fbd5567bd1717f278eaa2cfc3131f489984", + "reference": "48046fbd5567bd1717f278eaa2cfc3131f489984", "shasum": "" }, "require": { - "php": ">=8.2", - "symfony/deprecation-contracts": "^2.5|^3", + "php": ">=8.4", "symfony/polyfill-ctype": "^1.8" }, "conflict": { - "symfony/console": "<6.4" + "symfony/console": "<7.4" }, "require-dev": { - "symfony/console": "^6.4|^7.0|^8.0" + "symfony/console": "^7.4|^8.0" }, "bin": [ "Resources/bin/yaml-lint" @@ -15603,7 +15381,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v7.4.6" + "source": "https://github.com/symfony/yaml/tree/v8.0.11" }, "funding": [ { @@ -15623,7 +15401,7 @@ "type": "tidelift" } ], - "time": "2026-02-09T09:33:46+00:00" + "time": "2026-05-13T12:07:53+00:00" }, { "name": "ta-tikoma/phpunit-architecture-test", @@ -15736,16 +15514,16 @@ }, { "name": "webmozart/assert", - "version": "2.1.6", + "version": "2.3.0", "source": { "type": "git", "url": "https://github.com/webmozarts/assert.git", - "reference": "ff31ad6efc62e66e518fbab1cde3453d389bcdc8" + "reference": "eb0d790f735ba6cff25c683a85a1da0eadeff9e4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/webmozarts/assert/zipball/ff31ad6efc62e66e518fbab1cde3453d389bcdc8", - "reference": "ff31ad6efc62e66e518fbab1cde3453d389bcdc8", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/eb0d790f735ba6cff25c683a85a1da0eadeff9e4", + "reference": "eb0d790f735ba6cff25c683a85a1da0eadeff9e4", "shasum": "" }, "require": { @@ -15792,20 +15570,18 @@ ], "support": { "issues": "https://github.com/webmozarts/assert/issues", - "source": "https://github.com/webmozarts/assert/tree/2.1.6" + "source": "https://github.com/webmozarts/assert/tree/2.3.0" }, - "time": "2026-02-27T10:28:38+00:00" + "time": "2026-04-11T10:33:05+00:00" } ], "aliases": [], "minimum-stability": "stable", - "stability-flags": { - "valentin-morice/filament-json-column": 20 - }, + "stability-flags": {}, "prefer-stable": true, "prefer-lowest": false, "platform": { - "php": "^8.2", + "php": "^8.5", "ext-curl": "*", "ext-dom": "*", "ext-fileinfo": "*", @@ -15813,6 +15589,6 @@ "ext-mongodb": "*", "ext-redis": "*" }, - "platform-dev": [], - "plugin-api-version": "2.6.0" + "platform-dev": {}, + "plugin-api-version": "2.9.0" } diff --git a/config/app.php b/config/app.php index 1a0d6f850..8e6c14198 100644 --- a/config/app.php +++ b/config/app.php @@ -3,6 +3,68 @@ use App\Facades\CountHelper; use App\Facades\DateHelper; use App\Facades\TranscriptionMapHelper; +use App\Providers\AppServiceProvider; +use App\Providers\Filament\AdminPanelProvider; +use App\Providers\GroupEventServiceProvider; +use App\Providers\HelpersServiceProvider; +use App\Providers\InfrastructureServiceProvider; +use App\Providers\SupportServiceProvider; +use Illuminate\Auth\AuthServiceProvider; +use Illuminate\Auth\Passwords\PasswordResetServiceProvider; +use Illuminate\Broadcasting\BroadcastServiceProvider; +use Illuminate\Bus\BusServiceProvider; +use Illuminate\Cache\CacheServiceProvider; +use Illuminate\Cookie\CookieServiceProvider; +use Illuminate\Database\DatabaseServiceProvider; +use Illuminate\Database\Eloquent\Model; +use Illuminate\Encryption\EncryptionServiceProvider; +use Illuminate\Filesystem\FilesystemServiceProvider; +use Illuminate\Foundation\Providers\ConsoleSupportServiceProvider; +use Illuminate\Foundation\Providers\FoundationServiceProvider; +use Illuminate\Hashing\HashServiceProvider; +use Illuminate\Mail\MailServiceProvider; +use Illuminate\Notifications\NotificationServiceProvider; +use Illuminate\Pagination\PaginationServiceProvider; +use Illuminate\Pipeline\PipelineServiceProvider; +use Illuminate\Queue\QueueServiceProvider; +use Illuminate\Redis\RedisServiceProvider; +use Illuminate\Session\SessionServiceProvider; +use Illuminate\Support\Arr; +use Illuminate\Support\Facades\Artisan; +use Illuminate\Support\Facades\Auth; +use Illuminate\Support\Facades\Blade; +use Illuminate\Support\Facades\Broadcast; +use Illuminate\Support\Facades\Bus; +use Illuminate\Support\Facades\Cache; +use Illuminate\Support\Facades\Config; +use Illuminate\Support\Facades\Cookie; +use Illuminate\Support\Facades\Crypt; +use Illuminate\Support\Facades\DB; +use Illuminate\Support\Facades\Event; +use Illuminate\Support\Facades\File; +use Illuminate\Support\Facades\Gate; +use Illuminate\Support\Facades\Hash; +use Illuminate\Support\Facades\Lang; +use Illuminate\Support\Facades\Log; +use Illuminate\Support\Facades\Mail; +use Illuminate\Support\Facades\Notification; +use Illuminate\Support\Facades\Password; +use Illuminate\Support\Facades\Queue; +use Illuminate\Support\Facades\Redirect; +use Illuminate\Support\Facades\Redis; +use Illuminate\Support\Facades\Request; +use Illuminate\Support\Facades\Response; +use Illuminate\Support\Facades\Route; +use Illuminate\Support\Facades\Schema; +use Illuminate\Support\Facades\Session; +use Illuminate\Support\Facades\Storage; +use Illuminate\Support\Facades\URL; +use Illuminate\Support\Facades\Validator; +use Illuminate\Support\Facades\View; +use Illuminate\Support\Str; +use Illuminate\Translation\TranslationServiceProvider; +use Illuminate\Validation\ValidationServiceProvider; +use Illuminate\View\ViewServiceProvider; return [ @@ -17,7 +79,6 @@ 'current_path' => env('APP_CURRENT_PATH', '/data/web/biospex/current'), 'server_user' => env('APP_SERVER_USER', 'ubuntu'), 'registration' => env('APP_REGISTRATION', true), - 'opcache_webhook_token' => env('OPCACHE_WEBHOOK_TOKEN', null), /* |-------------------------------------------------------------------------- @@ -156,41 +217,41 @@ /* * Laravel Framework Service Providers... */ - Illuminate\Auth\AuthServiceProvider::class, - Illuminate\Broadcasting\BroadcastServiceProvider::class, - Illuminate\Bus\BusServiceProvider::class, - Illuminate\Cache\CacheServiceProvider::class, - Illuminate\Foundation\Providers\ConsoleSupportServiceProvider::class, - Illuminate\Cookie\CookieServiceProvider::class, - Illuminate\Database\DatabaseServiceProvider::class, - Illuminate\Encryption\EncryptionServiceProvider::class, - Illuminate\Filesystem\FilesystemServiceProvider::class, - Illuminate\Foundation\Providers\FoundationServiceProvider::class, - Illuminate\Hashing\HashServiceProvider::class, - Illuminate\Mail\MailServiceProvider::class, - Illuminate\Notifications\NotificationServiceProvider::class, - Illuminate\Pagination\PaginationServiceProvider::class, - Illuminate\Pipeline\PipelineServiceProvider::class, - Illuminate\Queue\QueueServiceProvider::class, - Illuminate\Redis\RedisServiceProvider::class, - Illuminate\Auth\Passwords\PasswordResetServiceProvider::class, - Illuminate\Session\SessionServiceProvider::class, - Illuminate\Translation\TranslationServiceProvider::class, - Illuminate\Validation\ValidationServiceProvider::class, - Illuminate\View\ViewServiceProvider::class, + AuthServiceProvider::class, + BroadcastServiceProvider::class, + BusServiceProvider::class, + CacheServiceProvider::class, + ConsoleSupportServiceProvider::class, + CookieServiceProvider::class, + DatabaseServiceProvider::class, + EncryptionServiceProvider::class, + FilesystemServiceProvider::class, + FoundationServiceProvider::class, + HashServiceProvider::class, + MailServiceProvider::class, + NotificationServiceProvider::class, + PaginationServiceProvider::class, + PipelineServiceProvider::class, + QueueServiceProvider::class, + RedisServiceProvider::class, + PasswordResetServiceProvider::class, + SessionServiceProvider::class, + TranslationServiceProvider::class, + ValidationServiceProvider::class, + ViewServiceProvider::class, /* * Application Service Providers... */ - App\Providers\AppServiceProvider::class, + AppServiceProvider::class, App\Providers\AuthServiceProvider::class, App\Providers\BroadcastServiceProvider::class, - App\Providers\Filament\AdminPanelProvider::class, - App\Providers\InfrastructureServiceProvider::class, - App\Providers\SupportServiceProvider::class, - App\Providers\HelpersServiceProvider::class, + AdminPanelProvider::class, + InfrastructureServiceProvider::class, + SupportServiceProvider::class, + HelpersServiceProvider::class, App\Providers\ViewServiceProvider::class, - App\Providers\GroupEventServiceProvider::class, + GroupEventServiceProvider::class, ], @@ -208,40 +269,40 @@ 'aliases' => [ 'App' => Illuminate\Support\Facades\App::class, - 'Arr' => Illuminate\Support\Arr::class, - 'Artisan' => Illuminate\Support\Facades\Artisan::class, - 'Auth' => Illuminate\Support\Facades\Auth::class, - 'Blade' => Illuminate\Support\Facades\Blade::class, - 'Broadcast' => Illuminate\Support\Facades\Broadcast::class, - 'Bus' => Illuminate\Support\Facades\Bus::class, - 'Cache' => Illuminate\Support\Facades\Cache::class, - 'Config' => Illuminate\Support\Facades\Config::class, - 'Cookie' => Illuminate\Support\Facades\Cookie::class, - 'Crypt' => Illuminate\Support\Facades\Crypt::class, - 'DB' => Illuminate\Support\Facades\DB::class, - 'Eloquent' => Illuminate\Database\Eloquent\Model::class, - 'Event' => Illuminate\Support\Facades\Event::class, - 'File' => Illuminate\Support\Facades\File::class, - 'Gate' => Illuminate\Support\Facades\Gate::class, - 'Hash' => Illuminate\Support\Facades\Hash::class, - 'Lang' => Illuminate\Support\Facades\Lang::class, - 'Log' => Illuminate\Support\Facades\Log::class, - 'Mail' => Illuminate\Support\Facades\Mail::class, - 'Notification' => Illuminate\Support\Facades\Notification::class, - 'Password' => Illuminate\Support\Facades\Password::class, - 'Queue' => Illuminate\Support\Facades\Queue::class, - 'Redirect' => Illuminate\Support\Facades\Redirect::class, - 'Redis' => Illuminate\Support\Facades\Redis::class, - 'Request' => Illuminate\Support\Facades\Request::class, - 'Response' => Illuminate\Support\Facades\Response::class, - 'Route' => Illuminate\Support\Facades\Route::class, - 'Schema' => Illuminate\Support\Facades\Schema::class, - 'Session' => Illuminate\Support\Facades\Session::class, - 'Storage' => Illuminate\Support\Facades\Storage::class, - 'Str' => Illuminate\Support\Str::class, - 'URL' => Illuminate\Support\Facades\URL::class, - 'Validator' => Illuminate\Support\Facades\Validator::class, - 'View' => Illuminate\Support\Facades\View::class, + 'Arr' => Arr::class, + 'Artisan' => Artisan::class, + 'Auth' => Auth::class, + 'Blade' => Blade::class, + 'Broadcast' => Broadcast::class, + 'Bus' => Bus::class, + 'Cache' => Cache::class, + 'Config' => Config::class, + 'Cookie' => Cookie::class, + 'Crypt' => Crypt::class, + 'DB' => DB::class, + 'Eloquent' => Model::class, + 'Event' => Event::class, + 'File' => File::class, + 'Gate' => Gate::class, + 'Hash' => Hash::class, + 'Lang' => Lang::class, + 'Log' => Log::class, + 'Mail' => Mail::class, + 'Notification' => Notification::class, + 'Password' => Password::class, + 'Queue' => Queue::class, + 'Redirect' => Redirect::class, + 'Redis' => Redis::class, + 'Request' => Request::class, + 'Response' => Response::class, + 'Route' => Route::class, + 'Schema' => Schema::class, + 'Session' => Session::class, + 'Storage' => Storage::class, + 'Str' => Str::class, + 'URL' => URL::class, + 'Validator' => Validator::class, + 'View' => View::class, // ### Packages 'CountHelper' => CountHelper::class, diff --git a/config/database.php b/config/database.php index 44bc4cf2a..d67aea405 100644 --- a/config/database.php +++ b/config/database.php @@ -1,5 +1,7 @@ false, 'engine' => null, 'options' => extension_loaded('pdo_mysql') ? array_filter([ - PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'), + Mysql::ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'), ]) : [], ], diff --git a/config/debugbar.php b/config/debugbar.php index f6163f243..c64b5f7e0 100644 --- a/config/debugbar.php +++ b/config/debugbar.php @@ -1,5 +1,7 @@ env('DEBUGBAR_ENABLED', null), + 'enabled' => env('DEBUGBAR_ENABLED'), + 'collect_jobs' => env('DEBUGBAR_COLLECT_JOBS', false), 'except' => [ 'telescope*', - 'api.biospex.test', + 'horizon*', + '_boost/browser-logs', + 'livewire-*/livewire.js', + ], + + /* + |-------------------------------------------------------------------------- + | DataCollectors + |-------------------------------------------------------------------------- + | + | Enable/disable DataCollectors + | + */ + + 'collectors' => [ + 'phpinfo' => env('DEBUGBAR_COLLECTORS_PHPINFO', false), // Php version + 'messages' => env('DEBUGBAR_COLLECTORS_MESSAGES', true), // Messages + 'time' => env('DEBUGBAR_COLLECTORS_TIME', true), // Time Datalogger + 'memory' => env('DEBUGBAR_COLLECTORS_MEMORY', true), // Memory usage + 'exceptions' => env('DEBUGBAR_COLLECTORS_EXCEPTIONS', true), // Exception displayer + 'log' => env('DEBUGBAR_COLLECTORS_LOG', true), // Logs from Monolog (merged in messages if enabled) + 'db' => env('DEBUGBAR_COLLECTORS_DB', true), // Show database (PDO) queries and bindings + 'views' => env('DEBUGBAR_COLLECTORS_VIEWS', true), // Views with their data + 'route' => env('DEBUGBAR_COLLECTORS_ROUTE', false), // Current route information + 'auth' => env('DEBUGBAR_COLLECTORS_AUTH', false), // Display Laravel authentication status + 'gate' => env('DEBUGBAR_COLLECTORS_GATE', true), // Display Laravel Gate checks + 'session' => env('DEBUGBAR_COLLECTORS_SESSION', false), // Display session data + 'symfony_request' => env('DEBUGBAR_COLLECTORS_SYMFONY_REQUEST', true), // Default Request Data + 'mail' => env('DEBUGBAR_COLLECTORS_MAIL', true), // Catch mail messages + 'laravel' => env('DEBUGBAR_COLLECTORS_LARAVEL', true), // Laravel version and environment + 'events' => env('DEBUGBAR_COLLECTORS_EVENTS', false), // All events fired + 'logs' => env('DEBUGBAR_COLLECTORS_LOGS', false), // Add the latest log messages + 'config' => env('DEBUGBAR_COLLECTORS_CONFIG', false), // Display config settings + 'cache' => env('DEBUGBAR_COLLECTORS_CACHE', true), // Display cache events + 'models' => env('DEBUGBAR_COLLECTORS_MODELS', true), // Display models + 'livewire' => env('DEBUGBAR_COLLECTORS_LIVEWIRE', true), // Display Livewire (when available) + 'inertia' => env('DEBUGBAR_COLLECTORS_INERTIA', true), // Display Inertia (when available) + 'jobs' => env('DEBUGBAR_COLLECTORS_JOBS', true), // Display dispatched jobs + 'pennant' => env('DEBUGBAR_COLLECTORS_PENNANT', true), // Display Pennant feature flags + 'http_client' => env('DEBUGBAR_COLLECTORS_HTTP_CLIENT', true), // Display HTTP Client requests ], /* |-------------------------------------------------------------------------- - | Storage settings + | Extra options |-------------------------------------------------------------------------- | - | DebugBar stores data for session/ajax requests. - | You can disable this, so the debugbar stores data in headers/session, - | but this can cause problems with large data collectors. - | By default, file storage (in the storage folder) is used. Redis and PDO - | can also be used. For PDO, run the package migrations first. + | Configure some DataCollectors | */ + + 'options' => [ + 'time' => [ + 'memory_usage' => env('DEBUGBAR_OPTIONS_TIME_MEMORY_USAGE', false), // Calculated by subtracting memory start and end, it may be inaccurate + ], + 'messages' => [ + 'trace' => env('DEBUGBAR_OPTIONS_MESSAGES_TRACE', true), // Trace the origin of the debug message + 'backtrace_exclude_paths' => [], // Paths to exclude from backtrace. (in addition to defaults) + 'capture_dumps' => env('DEBUGBAR_OPTIONS_MESSAGES_CAPTURE_DUMPS', false), // Capture laravel `dump();` as message + 'timeline' => env('DEBUGBAR_OPTIONS_MESSAGES_TIMELINE', true), // Add messages to the timeline + ], + 'memory' => [ + 'reset_peak' => env('DEBUGBAR_OPTIONS_MEMORY_RESET_PEAK', false), // run memory_reset_peak_usage before collecting + 'with_baseline' => env('DEBUGBAR_OPTIONS_MEMORY_WITH_BASELINE', false), // Set boot memory usage as memory peak baseline + 'precision' => (int) env('DEBUGBAR_OPTIONS_MEMORY_PRECISION', 0), // Memory rounding precision + ], + 'auth' => [ + 'show_name' => env('DEBUGBAR_OPTIONS_AUTH_SHOW_NAME', true), // Also show the users name/email in the debugbar + 'show_guards' => env('DEBUGBAR_OPTIONS_AUTH_SHOW_GUARDS', true), // Show the guards that are used + ], + 'gate' => [ + 'trace' => false, // Trace the origin of the Gate checks + 'timeline' => env('DEBUGBAR_OPTIONS_GATE_TIMELINE', false), // Add mails to the timeline + ], + 'db' => [ + 'with_params' => env('DEBUGBAR_OPTIONS_WITH_PARAMS', true), // Render SQL with the parameters substituted + 'exclude_paths' => [ // Paths to exclude entirely from the collector + // 'vendor/laravel/framework/src/Illuminate/Session', // Exclude sessions queries + ], + 'backtrace' => env('DEBUGBAR_OPTIONS_DB_BACKTRACE', true), // Use a backtrace to find the origin of the query in your files. + 'backtrace_exclude_paths' => [], // Paths to exclude from backtrace. (in addition to defaults) + 'backtrace_editor_links' => env('DEBUGBAR_OPTIONS_DB_BACKTRACE_EDITOR_LINKS', false), // Add editor links to backtrace entries (non-vendor files only) + 'timeline' => env('DEBUGBAR_OPTIONS_DB_TIMELINE', false), // Add the queries to the timeline + 'duration_background' => env('DEBUGBAR_OPTIONS_DB_DURATION_BACKGROUND', true), // Show shaded background on each query relative to how long it took to execute. + 'explain' => [ // Show EXPLAIN output on queries + 'enabled' => env('DEBUGBAR_OPTIONS_DB_EXPLAIN_ENABLED', true), + ], + 'show_query_result' => env('DEBUGBAR_OPTIONS_DB_SHOW_QUERY_RESULT', false), // Show option to re-run SELECT queries and show the result + 'only_slow_queries' => env('DEBUGBAR_OPTIONS_DB_ONLY_SLOW_QUERIES', true), // Only track queries that last longer than `slow_threshold` + 'slow_threshold' => env('DEBUGBAR_OPTIONS_DB_SLOW_THRESHOLD', false), // Max query execution time (ms). Exceeding queries will be highlighted + 'memory_usage' => env('DEBUGBAR_OPTIONS_DB_MEMORY_USAGE', false), // Show queries memory usage + 'soft_limit' => (int) env('DEBUGBAR_OPTIONS_DB_SOFT_LIMIT', 100), // After the soft limit, no parameters/backtrace are captured + 'hard_limit' => (int) env('DEBUGBAR_OPTIONS_DB_HARD_LIMIT', 500), // After the hard limit, queries are ignored + ], + 'mail' => [ + 'timeline' => env('DEBUGBAR_OPTIONS_MAIL_TIMELINE', true), // Add mails to the timeline + 'show_body' => env('DEBUGBAR_OPTIONS_MAIL_SHOW_BODY', true), + ], + 'views' => [ + 'timeline' => env('DEBUGBAR_OPTIONS_VIEWS_TIMELINE', true), // Add the views to the timeline + 'data' => env('DEBUGBAR_OPTIONS_VIEWS_DATA', false), // True for all data, 'keys' for only names, false for no parameters. + 'group' => (int) env('DEBUGBAR_OPTIONS_VIEWS_GROUP', 50), // Group duplicate views. Pass value to auto-group, or true/false to force + 'exclude_paths' => [ // Add the paths which you don't want to appear in the views + 'vendor/filament', // Exclude Filament components by default + ], + ], + 'inertia' => [ + 'pages' => env('DEBUGBAR_OPTIONS_VIEWS_INERTIA_PAGES', 'js/Pages'), // Path for Inertia views + ], + 'route' => [ + 'label' => env('DEBUGBAR_OPTIONS_ROUTE_LABEL', true), // Show complete route on bar + ], + 'session' => [ + 'masked' => [], // List of keys that are masked + ], + 'symfony_request' => [ + 'label' => env('DEBUGBAR_OPTIONS_SYMFONY_REQUEST_LABEL', true), // Show route on bar + 'masked' => [], // List of keys that are masked + ], + 'events' => [ + 'data' => env('DEBUGBAR_OPTIONS_EVENTS_DATA', false), // Collect events data + 'listeners' => env('DEBUGBAR_OPTIONS_EVENTS_LISTENERS', false), // Add listeners to the events data + 'excluded' => [], // Example: ['eloquent.*', 'composing', Illuminate\Cache\Events\CacheHit::class] + ], + 'logs' => [ + 'file' => env('DEBUGBAR_OPTIONS_LOGS_FILE'), + ], + 'config' => [ + 'masked' => [], + ], + 'cache' => [ + 'values' => env('DEBUGBAR_OPTIONS_CACHE_VALUES', true), // Collect cache values + 'timeline' => env('DEBUGBAR_OPTIONS_CACHE_TIMELINE', false), // Add cache events to the timeline + ], + 'http_client' => [ + 'masked' => [], + 'timeline' => env('DEBUGBAR_OPTIONS_HTTP_CLIENT_TIMELINE', true), // Add requests to the timeline + ], + ], + + /** + * Add any additional DataCollectors by adding the class name of a DataCollector or invokable class. + */ + 'custom_collectors' => [ + // MyCollector::class => env('DEBUGBAR_COLLECTORS_MYCOLLECTOR', true), + ], + + /* + |-------------------------------------------------------------------------- + | Editor + |-------------------------------------------------------------------------- + | + | Choose your preferred editor to use when clicking file name. + | + | Supported: "sublime", "textmate", "emacs", "macvim", "codelite", + | "phpstorm", "phpstorm-remote", "idea", "idea-remote", + | "vscode", "vscode-insiders", "vscode-remote", "vscode-insiders-remote", + | "vscodium", "nova", "xdebug", "atom", "espresso", + | "netbeans", "cursor", "windsurf", "zed", "antigravity" + | + */ + + 'editor' => env('DEBUGBAR_EDITOR') ?: env('IGNITION_EDITOR', 'phpstorm'), + + /* + |-------------------------------------------------------------------------- + | Capture Ajax Requests + |-------------------------------------------------------------------------- + | + | The Debugbar can capture Ajax requests and display them. If you don't want this (ie. because of errors), + | you can use this option to disable sending the data through the headers. + | + | Optionally, you can also send ServerTiming headers on ajax requests for the Chrome DevTools. + | + | Note for your request to be identified as ajax requests they must either send the header + | X-Requested-With with the value XMLHttpRequest (most JS libraries send this), or have application/json as a Accept header. + | + | By default `ajax_handler_auto_show` is set to true allowing ajax requests to be shown automatically in the Debugbar. + | Changing `ajax_handler_auto_show` to false will prevent the Debugbar from reloading. + | + | You can defer loading the dataset, so it will be loaded with ajax after the request is done. (Experimental) + */ + + 'capture_ajax' => env('DEBUGBAR_CAPTURE_AJAX', true), + 'add_ajax_timing' => env('DEBUGBAR_ADD_AJAX_TIMING', false), + 'ajax_handler_auto_show' => env('DEBUGBAR_AJAX_HANDLER_AUTO_SHOW', true), + 'ajax_handler_enable_tab' => env('DEBUGBAR_AJAX_HANDLER_ENABLE_TAB', true), + 'defer_datasets' => env('DEBUGBAR_DEFER_DATASETS', false), + + /* + |-------------------------------------------------------------------------- + | Remote Path Mapping + |-------------------------------------------------------------------------- + | + | If you are using a remote dev server, like Laravel Homestead, Docker, or + | even a remote VPS, it will be necessary to specify your path mapping. + | + | Leaving one, or both of these, empty or null will not trigger the remote + | URL changes and Debugbar will treat your editor links as local files. + | + | "remote_sites_path" is an absolute base path for your sites or projects + | in Homestead, Vagrant, Docker, or another remote development server. + | + | Example value: "/home/vagrant/Code" + | + | "local_sites_path" is an absolute base path for your sites or projects + | on your local computer where your IDE or code editor is running on. + | + | Example values: "/Users//Code", "C:\Users\\Documents\Code" + | + */ + + 'remote_sites_path' => env('DEBUGBAR_REMOTE_SITES_PATH'), + 'local_sites_path' => env('DEBUGBAR_LOCAL_SITES_PATH', env('IGNITION_LOCAL_SITES_PATH')), + + /* + |-------------------------------------------------------------------------- + | Storage settings + |-------------------------------------------------------------------------- + | + | Debugbar stores data for session/ajax requests. + | You can disable this, so the debugbar stores data in headers/session, + | but this can cause problems with large data collectors. + | By default, file storage (in the storage folder) is used. Sqlite will + | create a database file in the storage folder. + | Redis and PDO can also be used. For PDO, run the package migrations first. + | + | Warning: Enabling storage.open will allow everyone to access previous + | request, do not enable open storage in publicly available environments! + | Specify a callback if you want to limit based on IP or authentication. + | Leaving it to null will allow localhost only. + */ 'storage' => [ - 'enabled' => true, - 'driver' => 'redis', // redis, file, pdo, custom - 'path' => storage_path('debugbar'), // For file driver - 'connection' => null, // Leave null for default connection (Redis/PDO) - 'provider' => '', // Instance of StorageInterface for custom driver + 'enabled' => env('DEBUGBAR_STORAGE_ENABLED', true), + 'open' => env('DEBUGBAR_OPEN_STORAGE'), // bool/callback. + 'driver' => env('DEBUGBAR_STORAGE_DRIVER', 'file'), // redis, file, sqlite, pdo, custom + 'path' => env('DEBUGBAR_STORAGE_PATH', storage_path('debugbar')), // For file driver + 'connection' => env('DEBUGBAR_STORAGE_CONNECTION'), // Leave null for default connection (Redis/PDO) + 'provider' => env('DEBUGBAR_STORAGE_PROVIDER', ''), // Instance of StorageInterface for custom driver ], /* |-------------------------------------------------------------------------- - | Vendors + | Force Allow Debugbar to be Enabled during boot |-------------------------------------------------------------------------- | - | Vendor files are included by default, but can be set to false. - | This can also be set to 'js' or 'css', to only include javascript or css vendor files. - | Vendor files are for css: font-awesome (including fonts) and highlight.js (css files) - | and for js: jquery and and highlight.js - | So if you want syntax highlighting, set it to true. - | jQuery is set to not conflict with existing jQuery scripts. + | By default, debugbar can only be enabled when the app is in debug mode and not in production. + | For special cases, eg admin panels behind proper authentication, you can force debugbar to be enabled. + | Just this setting alone will not enable the Debugbar, but it will boot the Debugbar including routes and listeners, + | so you can enable it further in the requests using $debugbar->enable(). | - */ - - 'include_vendors' => true, + | Warning: Use with caution. Debugbar is a development tool and should never be exposed in non-trusted endpoints. + | + */ + 'force_allow_enable' => env('DEBUGBAR_FORCE_ALLOW_ENABLE', false), /* |-------------------------------------------------------------------------- - | Capture Ajax Requests + | Assets |-------------------------------------------------------------------------- | - | The Debugbar can capture Ajax requests and display them. If you don't want this (ie. because of errors), - | you can use this option to disable sending the data through the headers. + | Vendor files are included by default, but can be set to false. + | This can also be set to 'js' or 'css', to only include javascript or css vendor files. + | Vendor files are for css: (none) + | and for js: highlight.js + | So if you want syntax highlighting, set it to true. | - | Optionally, you can also send ServerTiming headers on ajax requests for the Chrome DevTools. */ - - 'capture_ajax' => true, - 'add_ajax_timing' => false, + 'use_dist_files' => env('DEBUGBAR_USE_DIST_FILES', true), + 'include_vendors' => env('DEBUGBAR_INCLUDE_VENDORS', true), /* |-------------------------------------------------------------------------- @@ -78,8 +299,18 @@ | When enabled, the Debugbar shows deprecated warnings for Symfony components | in the Messages tab. | + | You can set a custom error reporting level to filter which errors are + | handled. For example, to exclude deprecation warnings: + | E_ALL & ~E_DEPRECATED & ~E_USER_DEPRECATED + | + | To exclude notices, strict warnings, and deprecations: + | E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED & ~E_USER_DEPRECATED + | + | Defaults to E_ALL (all errors). + | */ - 'error_handler' => false, + 'error_handler' => env('DEBUGBAR_ERROR_HANDLER', false), + 'error_level' => env('DEBUGBAR_ERROR_LEVEL', E_ALL), /* |-------------------------------------------------------------------------- @@ -90,113 +321,69 @@ | Extension, without the server-side code. It uses Debugbar collectors instead. | */ - 'clockwork' => false, + 'clockwork' => env('DEBUGBAR_CLOCKWORK', false), /* |-------------------------------------------------------------------------- - | DataCollectors + | Inject Debugbar in Response |-------------------------------------------------------------------------- | - | Enable/disable DataCollectors + | Usually, the debugbar is added just before , by listening to the + | Response after the App is done. If you disable this, you have to add them + | in your template yourself. See http://phpdebugbar.com/docs/rendering.html | */ - 'collectors' => [ - 'phpinfo' => true, // Php version - 'messages' => true, // Messages - 'time' => true, // Time Datalogger - 'memory' => true, // Memory usage - 'exceptions' => true, // Exception displayer - 'log' => true, // Logs from Monolog (merged in messages if enabled) - 'db' => true, // Show database (PDO) queries and bindings - 'views' => true, // Views with their data - 'route' => true, // Current route information - 'auth' => true, // Display Laravel authentication status - 'gate' => true, // Display Laravel Gate checks - 'session' => true, // Display session data - 'symfony_request' => true, // Only one can be enabled.. - 'mail' => true, // Catch mail messages - 'laravel' => false, // Laravel version and environment - 'events' => false, // All events fired - 'default_request' => false, // Regular or special Symfony request logger - 'logs' => false, // Add the latest log messages - 'files' => false, // Show the included files - 'config' => false, // Display config settings - 'cache' => false, // Display cache events - ], + 'inject' => env('DEBUGBAR_INJECT', true), /* |-------------------------------------------------------------------------- - | Extra options + | Debugbar route prefix |-------------------------------------------------------------------------- | - | Configure some DataCollectors + | Sometimes you want to set route prefix to be used by Debugbar to load + | its resources from. Usually the need comes from misconfigured web server or + | from trying to overcome bugs like this: http://trac.nginx.org/nginx/ticket/97 | */ - - 'options' => [ - 'auth' => [ - 'show_name' => true, // Also show the users name/email in the debugbar - ], - 'db' => [ - 'with_params' => true, // Render SQL with the parameters substituted - 'backtrace' => true, // Use a backtrace to find the origin of the query in your files. - 'timeline' => false, // Add the queries to the timeline - 'explain' => [ // Show EXPLAIN output on queries - 'enabled' => false, - 'types' => ['SELECT'], // // workaround ['SELECT'] only. https://github.com/barryvdh/laravel-debugbar/issues/888 ['SELECT', 'INSERT', 'UPDATE', 'DELETE']; for MySQL 5.6.3+ - ], - 'hints' => true, // Show hints for common mistakes - ], - 'mail' => [ - 'full_log' => false, - ], - 'views' => [ - 'data' => false, // Note: Can slow down the application, because the data can be quite large.. - ], - 'route' => [ - 'label' => true, // show complete route on bar - ], - 'logs' => [ - 'file' => null, - ], - 'cache' => [ - 'values' => true, // collect cache values - ], - ], + 'route_prefix' => env('DEBUGBAR_ROUTE_PREFIX', '_debugbar'), /* |-------------------------------------------------------------------------- - | Inject Debugbar in Response + | Debugbar route middleware |-------------------------------------------------------------------------- | - | Usually, the debugbar is added just before , by listening to the - | Response after the App is done. If you disable this, you have to add them - | in your template yourself. See http://phpdebugbar.com/docs/rendering.html - | + | Additional middleware to run on the Debugbar routes */ - - 'inject' => true, + 'route_middleware' => [], /* |-------------------------------------------------------------------------- - | DebugBar route prefix + | Debugbar route domain |-------------------------------------------------------------------------- | - | Sometimes you want to set route prefix to be used by DebugBar to load - | its resources from. Usually the need comes from misconfigured web server or - | from trying to overcome bugs like this: http://trac.nginx.org/nginx/ticket/97 + | By default Debugbar route served from the same domain that request served. + | To override default domain, specify it as a non-empty value. + */ + 'route_domain' => env('DEBUGBAR_ROUTE_DOMAIN'), + + /* + |-------------------------------------------------------------------------- + | Debugbar theme + |-------------------------------------------------------------------------- | + | Switches between light and dark theme. If set to auto it will respect system preferences + | Possible values: auto, light, dark */ - 'route_prefix' => '_debugbar', + 'theme' => env('DEBUGBAR_THEME', 'auto'), /* |-------------------------------------------------------------------------- - | DebugBar route domain + | Backtrace stack limit |-------------------------------------------------------------------------- | - | By default DebugBar route served from the same domain that request served. - | To override default domain, specify it as a non-empty value. + | By default, the Debugbar limits the number of frames returned by the 'debug_backtrace()' function. + | If you need larger stacktraces, you can increase this number. Setting it to 0 will result in no limit. */ - 'route_domain' => null, + 'debug_backtrace_limit' => (int) env('DEBUGBAR_DEBUG_BACKTRACE_LIMIT', 50), ]; diff --git a/config/responsecache.php b/config/responsecache.php index 9b0a36435..5f7fbcd32 100644 --- a/config/responsecache.php +++ b/config/responsecache.php @@ -1,22 +1,10 @@ . - */ +use App\Services\Cache\FlashReplacer; +use Spatie\ResponseCache\CacheProfiles\CacheAllSuccessfulGetRequests; +use Spatie\ResponseCache\Hasher\DefaultHasher; +use Spatie\ResponseCache\Replacers\CsrfTokenReplacer; +use Spatie\ResponseCache\Serializers\JsonSerializer; $tag = config('app.tag', 'biospex'); @@ -26,90 +14,116 @@ */ 'enabled' => env('RESPONSE_CACHE_ENABLED', true), - /* - * The given class will determinate if a request should be cached. The - * default class will cache all successful GET-requests. - * - * You can provide your own class given that it implements the - * CacheProfile interface. - */ - 'cache_profile' => Spatie\ResponseCache\CacheProfiles\CacheAllSuccessfulGetRequests::class, + 'cache' => [ + /* + * Here you may define the cache store that should be used + * to store requests. This can be the name of any store + * that is configured in your app's cache.php config + */ + 'store' => env('RESPONSE_CACHE_DRIVER', 'file'), - /* - * Optionally, you can specify a header that will force a cache bypass. - * This can be useful to monitor the performance of your application. - */ - 'cache_bypass_header' => [ - 'name' => env('CACHE_BYPASS_HEADER_NAME', null), - 'value' => env('CACHE_BYPASS_HEADER_VALUE', null), + /* + * The default number of seconds responses will be cached + * when using the default CacheProfile settings. + */ + 'lifetime_in_seconds' => (int) env('RESPONSE_CACHE_LIFETIME', 60 * 60 * 24 * 7), + + /* + * If your cache driver supports tags, you may specify a tag + * name here. All responses will be tagged. When clearing + * the responsecache only items with that tag flushed. + * + * You may use a string or an array here. + */ + 'tag' => env('RESPONSE_CACHE_TAGS_ENABLED', false) ? "{$tag}-tag" : '', ], - /* - * When using the default CacheRequestFilter this setting controls the - * default number of seconds responses must be cached. - */ - 'cache_lifetime_in_seconds' => (int) env('RESPONSE_CACHE_LIFETIME', 60 * 60 * 24 * 7), + 'bypass' => [ + /* + * The header name that will force a bypass of the cache. + * This is useful when you want to see the performance + * of your application without the caching enabled. + */ + 'header_name' => env('CACHE_BYPASS_HEADER_NAME'), - /* - * This setting determines if a http header named with the cache time - * should be added to a cached response. This can be handy when - * debugging. - */ - 'add_cache_time_header' => env('APP_DEBUG', false), + /* + * The header value that will force a cache bypass. + */ + 'header_value' => env('CACHE_BYPASS_HEADER_VALUE'), + ], - /* - * This setting determines the name of the http header that contains - * the time at which the response was cached - */ - 'cache_time_header_name' => "{$tag}-responsecache", + 'debug' => [ + /* + * Determines if debug headers are added to cached + * responses. This can be handy for debugging how + * response caching is performing in your app. + */ + 'enabled' => env('APP_DEBUG', false), - /* - * This setting determines if a http header named with the cache age - * should be added to a cached response. This can be handy when - * debugging. - * ONLY works when "add_cache_time_header" is also active! - */ - 'add_cache_age_header' => env('RESPONSE_CACHE_AGE_HEADER', false), + /* + * The name of the http header containing the + * point at which the response was cached. + */ + 'cache_time_header_name' => 'X-Cache-Time', - /* - * This setting determines the name of the http header that contains - * the age of cache - */ - 'cache_age_header_name' => "{$tag}-responsecache-age", + /* + * The name of the header for the cache status that + * indicates whether a response was HIT or MISS. + */ + 'cache_status_header_name' => 'X-Cache-Status', - /* - * Here you may define the cache store that should be used to store - * requests. This can be the name of any store that is - * configured in app/config/cache.php - */ - 'cache_store' => env('RESPONSE_CACHE_DRIVER', 'file'), + /* + * The header name for the cache age in seconds. + */ + 'cache_age_header_name' => "{$tag}-responsecache-age", + + /* + * The header name used for the response cache key. + * This is only added when app.debug is enabled. + */ + 'cache_key_header_name' => 'X-Cache-Key', + ], /* - * Here you may define replacers that dynamically replace content from the response. - * Each replacer must implement the Replacer interface. + * These query parameters will be ignored when generating + * the cache key. This is useful for ignoring tracking + * parameters like UTM tags, gclid and also fbclid. */ - 'replacers' => [ - \Spatie\ResponseCache\Replacers\CsrfTokenReplacer::class, - \App\Services\Cache\FlashReplacer::class, + 'ignored_query_parameters' => [ + 'utm_source', + 'utm_medium', + 'utm_campaign', + 'utm_term', + 'utm_content', + 'gclid', + 'fbclid', ], /* - * If the cache driver you configured supports tags, you may specify a tag name - * here. All responses will be tagged. When clearing the responsecache only - * items with that tag will be flushed. - * - * You may use a string or an array here. + * The given class determines if a request should be cached. + * By default all successful GET-requests will be cached. + * You can provide your own by using the CacheProfile. */ - 'cache_tag' => env('RESPONSE_CACHE_TAGS_ENABLED', false) ? "{$tag}-tag" : '', + 'cache_profile' => CacheAllSuccessfulGetRequests::class, /* - * This class is responsible for generating a hash for a request. This hash - * is used to look up a cached response. + * This class is responsible for generating a hash for + * a request. Used for looking up cached responses. */ - 'hasher' => \Spatie\ResponseCache\Hasher\DefaultHasher::class, + 'hasher' => DefaultHasher::class, /* * This class is responsible for serializing responses. */ - 'serializer' => \Spatie\ResponseCache\Serializers\DefaultSerializer::class, + 'serializer' => JsonSerializer::class, + + /* + * Here you may define the replacers that will replace + * dynamic content from the response. Each replacer + * must always implement the Replacer interface. + */ + 'replacers' => [ + CsrfTokenReplacer::class, + FlashReplacer::class, + ], ]; diff --git a/config/sanctum.php b/config/sanctum.php index 8c94e2a98..732d3cbcc 100644 --- a/config/sanctum.php +++ b/config/sanctum.php @@ -1,5 +1,9 @@ [ - 'authenticate_session' => Laravel\Sanctum\Http\Middleware\AuthenticateSession::class, - 'encrypt_cookies' => Illuminate\Cookie\Middleware\EncryptCookies::class, - 'validate_csrf_token' => Illuminate\Foundation\Http\Middleware\ValidateCsrfToken::class, + 'authenticate_session' => AuthenticateSession::class, + 'encrypt_cookies' => EncryptCookies::class, + 'validate_csrf_token' => PreventRequestForgery::class, ], ]; diff --git a/deploy/custom.php b/deploy/custom.php index 2171aa994..90b0dfbd9 100644 --- a/deploy/custom.php +++ b/deploy/custom.php @@ -232,32 +232,37 @@ desc('Reset OpCache after deployment'); task('opcache:reset', function () { - $token = $_ENV['OPCACHE_WEBHOOK_TOKEN'] ?? getenv('OPCACHE_WEBHOOK_TOKEN') ?? ''; + $token = $_ENV['API_TOKEN'] ?? getenv('API_TOKEN') ?? ''; if (empty($token)) { - writeln('⚠️ Skipping OpCache reset: OPCACHE_WEBHOOK_TOKEN not set'); + writeln('⚠️ Skipping OpCache reset: API_TOKEN not set'); return; } - // Determine the base URL. If deployer is local, use your local test domain. - // In production, currentHost()->get('hostname') or a configured app_url is best. $environment = get('environment', 'production'); - $domain = ($environment === 'production') ? 'biospex.org' : 'dev.biospex.org'; - - // For local testing, you can change this to 'localhost' or 'opcache.test' - $url = "https://api.{$domain}/opcache/reset"; + $domain = ($environment === 'production') ? 'api.biospex.org' : 'devapi.biospex.org'; + $url = "https://{$domain}/v1/opcache/reset"; try { writeln("Triggering OpCache reset via API: {$url}"); - // Use -X POST and -d to send the token in the body - $response = run("curl -sL -k -X POST -d 'token={$token}' '{$url}'"); + + $response = run( + 'curl -sS -k -X POST '. + '--connect-timeout 10 --max-time 30 '. + "-H 'Authorization: Bearer {$token}' ". + "-H 'Accept: application/json' ". + "-w '\nHTTP_STATUS=%{http_code}\n' ". + "'{$url}'" + ); if (str_contains($response, 'successful')) { writeln('✅ OpCache reset successful'); - } else { - throw new \Exception("Response: {$response}"); + + return; } + + throw new \Exception("Response: {$response}"); } catch (\Exception $e) { writeln('❌ OpCache reset failed: '.$e->getMessage()); } diff --git a/routes/admin/opcache.php b/routes/admin/opcache.php deleted file mode 100644 index 5c08df049..000000000 --- a/routes/admin/opcache.php +++ /dev/null @@ -1,68 +0,0 @@ -. - */ - -/* - * OpCache Management Routes - * - * Secure webhook endpoint for resetting OpCache after deployments - * This provides a reliable alternative to CLI-based OpCache reset - */ - -use Illuminate\Http\Request; -use Illuminate\Support\Facades\Route; - -/* - * OpCache Reset Webhook - * - * POST /admin/opcache/reset/{token} - * - * Security Features: - * - Token-based authentication - * - IP whitelist (optional) - * - JSON response for monitoring - */ -Route::post('/opcache/reset/{token}', function (Request $request, $token) { - // Security: Verify the webhook token - if ($token !== config('app.opcache_webhook_token')) { - abort(403, 'Invalid webhook token'); - } - - // Additional security: IP whitelist for deployment server - $allowedIps = ['3.142.169.134']; // Biospex deployment server IP - if (! in_array($request->ip(), $allowedIps)) { - abort(403, 'IP not allowed'); - } - - // Reset OpCache - if (function_exists('opcache_reset')) { - opcache_reset(); - - return response()->json([ - 'success' => true, - 'message' => 'OpCache reset successfully', - 'timestamp' => now()->toISOString(), - ]); - } else { - return response()->json([ - 'success' => false, - 'message' => 'OpCache is not available', - ], 500); - } -})->name('admin.opcache.webhook.reset'); diff --git a/routes/api/index.php b/routes/api/index.php index 9f7a22a3d..08f7636df 100644 --- a/routes/api/index.php +++ b/routes/api/index.php @@ -21,4 +21,3 @@ use App\Http\Controllers\Api\IndexController; Route::get('/', [IndexController::class, 'index'])->name('api.index.get'); -Route::post('/opcache/reset', [IndexController::class, 'resetOpcache'])->name('api.opcache.reset'); diff --git a/routes/api/v0/wedigbiodashboard.php b/routes/api/v0/wedigbiodashboard.php deleted file mode 100644 index e69de29bb..000000000 diff --git a/app/Events/SnsTopicSubscriptionEvent.php b/routes/api/v1/opcache.php similarity index 66% rename from app/Events/SnsTopicSubscriptionEvent.php rename to routes/api/v1/opcache.php index cba6d8c2f..c08a46ea1 100644 --- a/app/Events/SnsTopicSubscriptionEvent.php +++ b/routes/api/v1/opcache.php @@ -1,7 +1,7 @@ . */ -namespace App\Events; +use App\Http\Controllers\Api\IndexController; -use Illuminate\Queue\SerializesModels; - -/** - * Class SnsTopicSubscriptionEvent - */ -class SnsTopicSubscriptionEvent -{ - use SerializesModels; - - /** - * Create a new event instance. - * - * @return void - */ - public function __construct() - { - // - } -} +Route::post('/opcache/reset', [IndexController::class, 'resetOpcache'])->name('api.v1.opcache.reset'); diff --git a/tests/Unit/Presenters/CoveredPresenterAnchorMethods.php b/tests/Unit/Presenters/CoveredPresenterAnchorMethods.php index 93996bb85..b8f4139a2 100644 --- a/tests/Unit/Presenters/CoveredPresenterAnchorMethods.php +++ b/tests/Unit/Presenters/CoveredPresenterAnchorMethods.php @@ -35,6 +35,7 @@ public static function all(): array 'BingoPresenter::twitterIcon', 'BingoPresenter::facebookIcon', 'BingoPresenter::contactIcon', + 'BingoPresenter::generateCardButton', // EventPresenter 'EventPresenter::twitterIcon', @@ -76,6 +77,7 @@ public static function all(): array 'GroupPresenter::groupDeleteIconLrg', 'GroupPresenter::groupInviteIcon', 'GroupPresenter::groupInviteIconLrg', + 'GroupPresenter::groupRemoveMemberIcon', // PanoptesProjectPresenter 'PanoptesProjectPresenter::url', diff --git a/tests/Unit/Presenters/EventTeamPresenterTest.php b/tests/Unit/Presenters/EventTeamPresenterTest.php index b0b942a14..7ddd7a0b7 100644 --- a/tests/Unit/Presenters/EventTeamPresenterTest.php +++ b/tests/Unit/Presenters/EventTeamPresenterTest.php @@ -20,26 +20,28 @@ namespace Tests\Unit\Presenters; +use Database\Factories\EventTeamFactory; use Illuminate\Foundation\Testing\RefreshDatabase; use Tests\TestCase; uses(TestCase::class, RefreshDatabase::class, PresenterTestHelpers::class); it('renders teamJoinUrlIcon with required attributes and unique data-clipboard-text token', function () { - $team1 = \Database\Factories\EventTeamFactory::new()->create(['title' => 'Team One']); - $team2 = \Database\Factories\EventTeamFactory::new()->create(['title' => 'Team Two']); + $team1 = EventTeamFactory::new()->create(['title' => 'Team One']); + $team2 = EventTeamFactory::new()->create(['title' => 'Team Two']); $out1 = $team1->present()->teamJoinUrlIcon(); $out2 = $team2->present()->teamJoinUrlIcon(); - // The teamJoinUrlIcon doesn't have an aria-label, but it has a title. - // Our helper now checks visible text for tokens when requireAriaLabel=false. - $this->assertLinkRenderedAndSafe($out1, [$team1->title], false); - $this->assertLinkRenderedAndSafe($out2, [$team2->title], false); + // Basic button and span structure + expect($out1)->toContain('toContain('')->toContain(''); + expect($out2)->toContain('toContain('')->toContain(''); - // Basic anchor and span structure - expect($out1)->toContain('toContain('')->toContain(''); - expect($out2)->toContain('toContain('')->toContain(''); + // Clipboard button should expose an accessible name containing the team title. + expect($out1)->toContain('aria-label="Copy invite link for team: Team One"'); + expect($out2)->toContain('aria-label="Copy invite link for team: Team Two"'); + expect($out1)->toContain('Team One'); + expect($out2)->toContain('Team Two'); // Must include non-empty title and data-clipboard-text attributes expect($out1)->toMatch('/\btitle="[^"]+"/'); @@ -57,32 +59,35 @@ expect($m2[1])->toContain($team2->uuid); expect($m1[1])->not->toBe($m2[1]); - // Attribute explosion quick check (<=3 empty attributes on ) - preg_match('/]*>/i', $out1, $a1); - preg_match_all('/\s[a-zA-Z0-9_-]+=""/m', $a1[0] ?? '', $ea1); + // Attribute explosion quick check (<=3 empty attributes on ')->toContain(''); // Attributes present and non-empty; ensure no raw quotes in attribute values + preg_match('/\baria-label="([^"]+)"/', $out, $aria); preg_match('/\btitle="([^"]+)"/', $out, $t); preg_match('/\bdata-clipboard-text="([^"]+)"/', $out, $dct); + expect($aria[1] ?? '')->not->toBeEmpty(); expect($t[1] ?? '')->not->toBeEmpty(); expect($dct[1] ?? '')->not->toBeEmpty(); + expect($aria[1])->not->toContain('"'); expect($t[1])->not->toContain('"'); expect($dct[1])->not->toContain('"'); // Attribute explosion quick check - preg_match('/]*>/i', $out, $a); - preg_match_all('/\s[a-zA-Z0-9_-]+=""/m', $a[0] ?? '', $ea); + preg_match('/]*>/i', $out, $button); + preg_match_all('/\s[a-zA-Z0-9_-]+=""/m', $button[0] ?? '', $ea); expect(count($ea[0] ?? []))->toBeLessThanOrEqual(3); })->with([ 'Normal Title', diff --git a/tests/Unit/Presenters/PresenterLinkSafetyTest.php b/tests/Unit/Presenters/PresenterLinkSafetyTest.php index 306443145..cfaa76377 100644 --- a/tests/Unit/Presenters/PresenterLinkSafetyTest.php +++ b/tests/Unit/Presenters/PresenterLinkSafetyTest.php @@ -201,7 +201,44 @@ // Group uses uuid OR id $expected = $group1->uuid ?: (string) $group1->id; expect($label1)->toContain($expected); -})->with(CoveredPresenterAnchorMethods::forPresenter('GroupPresenter')); +})->with( + collect(CoveredPresenterAnchorMethods::forPresenter('GroupPresenter')) + ->reject(fn (string $method) => $method === 'groupRemoveMemberIcon') + ->values() + ->all() +); + +it('renders groupRemoveMemberIcon with required attributes and unique aria label', function () { + $group1 = Group::factory()->create(['title' => 'Group One']); + $group2 = Group::factory()->create(['title' => 'Group Two']); + + $user1 = User::factory()->create(['email' => 'member1@example.com']); + $user2 = User::factory()->create(['email' => 'member2@example.com']); + + $output1 = $group1->present()->groupRemoveMemberIcon($user1); + $output2 = $group2->present()->groupRemoveMemberIcon($user2); + + $groupKey1 = $group1->uuid ?: (string) $group1->id; + $groupKey2 = $group2->uuid ?: (string) $group2->id; + + $this->assertLinkRenderedAndSafe($output1, [$groupKey1]); + $this->assertLinkRenderedAndSafe($output2, [$groupKey2]); + + $anchor1 = $this->extractFirstAnchor($output1); + $anchor2 = $this->extractFirstAnchor($output2); + + $label1 = $this->getAttr($anchor1, 'aria-label'); + $label2 = $this->getAttr($anchor2, 'aria-label'); + + expect($label1)->not->toBeEmpty(); + expect($label2)->not->toBeEmpty(); + expect($label1)->not->toBe($label2); + expect($label1)->toContain($groupKey1); + expect($label2)->toContain($groupKey2); + + expect($this->getAttr($anchor1, 'data-method'))->toBe('delete'); + expect($this->getAttr($anchor1, 'data-confirm'))->toBe('confirmation'); +}); /* |--------------------------------------------------------------------------