diff --git a/.env.dusk.testing b/.env.dusk.testing deleted file mode 100644 index 756f4074..00000000 --- a/.env.dusk.testing +++ /dev/null @@ -1,14 +0,0 @@ -APP_ENV=testing -APP_DEBUG=true -APP_KEY=base64:6DJhvZLVjE6dD4Cqrteh+6Z5vZlG+v/soCKcDHLOAH0= -APP_URL=http://localhost:8000 -APP_LONGURL=localhost -APP_SHORTURL=local - -DB_CONNECTION=travis - -CACHE_DRIVER=array -SESSION_DRIVER=file -QUEUE_DRIVER=sync - -SCOUT_DRIVER=pgsql diff --git a/.env.example b/.env.example index 43a5f376..4eb61db5 100644 --- a/.env.example +++ b/.env.example @@ -4,8 +4,6 @@ APP_KEY= APP_DEBUG=true APP_TIMEZONE=UTC APP_URL=https://example.com -APP_LONGURL=example.com -APP_SHORTURL=examp.le APP_LOCALE=en APP_FALLBACK_LOCALE=en diff --git a/.env.github b/.env.github deleted file mode 100644 index 0ef2b89b..00000000 --- a/.env.github +++ /dev/null @@ -1,70 +0,0 @@ -APP_NAME=Laravel -APP_ENV=testing -APP_KEY=SomeRandomString # Leave this -APP_DEBUG=false -APP_LOG_LEVEL=warning - -DB_CONNECTION=pgsql -DB_HOST=127.0.0.1 -DB_PORT=5432 -DB_DATABASE=jbukdev_testing -DB_USERNAME=postgres -DB_PASSWORD=postgres - -BROADCAST_DRIVER=log -CACHE_DRIVER=file -SESSION_DRIVER=file -QUEUE_DRIVER=sync - -REDIS_HOST=127.0.0.1 -REDIS_PASSWORD=null -REDIS_PORT=6379 - -MAIL_DRIVER=smtp -MAIL_HOST=smtp.mailtrap.io -MAIL_PORT=2525 -MAIL_USERNAME=null -MAIL_PASSWORD=null -MAIL_ENCRYPTION=null - -PUSHER_APP_ID= -PUSHER_APP_KEY= -PUSHER_APP_SECRET= - -AWS_S3_KEY=your-key -AWS_S3_SECRET=your-secret -AWS_S3_REGION=region -AWS_S3_BUCKET=your-bucket -AWS_S3_URL=https://xxxxxxx.s3-region.amazonaws.com - -APP_URL=https://example.com # This one is necessary -APP_LONGURL=example.com -APP_SHORTURL=examp.le - -ADMIN_USER=admin # pick something better, this is used for `/admin` -ADMIN_PASS=password -DISPLAY_NAME="Joe Bloggs" # This is used for example in the header and titles - -TWITTER_CONSUMER_KEY= -TWITTER_CONSUMER_SECRET= -TWITTER_ACCESS_TOKEN= -TWITTER_ACCESS_TOKEN_SECRET= - -SCOUT_DRIVER=database -SCOUT_QUEUE=false - -PIWIK=false - -FATHOM_ID= - -APP_TIMEZONE=UTC -APP_LANG=en -APP_LOG=daily -SECURE_SESSION_COOKIE=true - -LOG_SLACK_WEBHOOK_URL= -FLARE_KEY= - -FONT_LINK= - -BRIDGY_MASTODON_TOKEN= diff --git a/.gitattributes b/.gitattributes index fcb21d39..78f41d7a 100644 --- a/.gitattributes +++ b/.gitattributes @@ -5,7 +5,3 @@ *.html diff=html *.md diff=markdown *.php diff=php - -/.github export-ignore -CHANGELOG.md export-ignore -.styleci.yml export-ignore diff --git a/.github/dependabot.yml b/.github/dependabot.yml deleted file mode 100644 index 3ebccbd3..00000000 --- a/.github/dependabot.yml +++ /dev/null @@ -1,17 +0,0 @@ -version: 2 - -updates: - - package-ecosystem: "composer" - directory: "/" - schedule: - interval: "daily" - - - package-ecosystem: "npm" - directory: "/" - schedule: - interval: "daily" - - - package-ecosystem: "github-actions" - directory: "/" - schedule: - interval: "weekly" diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml deleted file mode 100644 index f66a77b4..00000000 --- a/.github/workflows/deploy.yml +++ /dev/null @@ -1,144 +0,0 @@ -name: Deploy - -on: - workflow_dispatch: - release: - types: [published] - -jobs: - deploy: - name: Deploy - runs-on: ubuntu-latest - environment: Hetzner - env: - repository: 'jonnybarnes/jonnybarnes.uk' - newReleaseName: '${{ github.run_id }}' - - steps: - - name: šŸŒ Set Environment Variables - run: | - echo "releasesDir=${{ secrets.DEPLOYMENT_BASE_DIR }}/releases" >> $GITHUB_ENV - echo "persistentDir=${{ secrets.DEPLOYMENT_BASE_DIR }}/persistent" >> $GITHUB_ENV - echo "currentDir=${{ secrets.DEPLOYMENT_BASE_DIR }}/current" >> $GITHUB_ENV - - name: šŸŒŽ Set Environment Variables Part 2 - run: | - echo "newReleaseDir=${{ env.releasesDir }}/${{ env.newReleaseName }}" >> $GITHUB_ENV - - name: šŸ”„ Clone Repository - uses: appleboy/ssh-action@master - with: - host: ${{ secrets.DEPLOYMENT_HOST }} - port: ${{ secrets.DEPLOYMENT_PORT }} - username: ${{ secrets.DEPLOYMENT_USER }} - key: ${{ secrets.DEPLOYMENT_KEY }} - script: | - [ -d ${{ env.releasesDir }} ] || mkdir ${{ env.releasesDir }} - [ -d ${{ env.persistentDir }} ] || mkdir ${{ env.persistentDir }} - [ -d ${{ env.persistentDir }}/storage ] || mkdir ${{ env.persistentDir }}/storage - - cd ${{ env.releasesDir }} - - # Create new release directory - mkdir ${{ env.newReleaseDir }} - - # Clone app - git clone --depth 1 --branch ${{ github.ref_name }} https://github.com/${{ env.repository }} ${{ env.newReleaseName }} - - # Mark release - cd ${{ env.newReleaseDir }} - echo "${{ env.newReleaseName }}" > public/release-name.txt - - # Fix cache directory permissions - sudo chown -R ${{ secrets.HTTP_USER }}:${{ secrets.HTTP_USER }} bootstrap/cache - - - name: šŸŽµ Run Composer - uses: appleboy/ssh-action@master - with: - host: ${{ secrets.DEPLOYMENT_HOST }} - port: ${{ secrets.DEPLOYMENT_PORT }} - username: ${{ secrets.DEPLOYMENT_USER }} - key: ${{ secrets.DEPLOYMENT_KEY }} - script: | - cd ${{ env.newReleaseDir }} - composer install --prefer-dist --no-scripts --no-dev --no-progress --optimize-autoloader --quiet --no-interaction - - - name: šŸ”— Update Symlinks - uses: appleboy/ssh-action@master - with: - host: ${{ secrets.DEPLOYMENT_HOST }} - port: ${{ secrets.DEPLOYMENT_PORT }} - username: ${{ secrets.DEPLOYMENT_USER }} - key: ${{ secrets.DEPLOYMENT_KEY }} - script: | - # Import the environment config - cd ${{ env.newReleaseDir }}; - ln -nfs ${{ secrets.DEPLOYMENT_BASE_DIR }}/.env .env; - - # Remove the storage directory and replace with persistent data - rm -rf ${{ env.newReleaseDir }}/storage; - cd ${{ env.newReleaseDir }}; - ln -nfs ${{ secrets.DEPLOYMENT_BASE_DIR }}/persistent/storage storage; - - # Remove the public/profile-images directory and replace with persistent data - rm -rf ${{ env.newReleaseDir }}/public/assets/profile-images; - cd ${{ env.newReleaseDir }}; - ln -nfs ${{ secrets.DEPLOYMENT_BASE_DIR }}/persistent/profile-images public/assets/profile-images; - - # Add the persistent files data - cd ${{ env.newReleaseDir }}; - ln -nfs ${{ secrets.DEPLOYMENT_BASE_DIR }}/persistent/files public/files; - - # Add the persistent fonts data - cd ${{ env.newReleaseDir }}; - ln -nfs ${{ secrets.DEPLOYMENT_BASE_DIR }}/persistent/fonts public/fonts; - - - name: ✨ Optimize Installation - uses: appleboy/ssh-action@master - with: - host: ${{ secrets.DEPLOYMENT_HOST }} - port: ${{ secrets.DEPLOYMENT_PORT }} - username: ${{ secrets.DEPLOYMENT_USER }} - key: ${{ secrets.DEPLOYMENT_KEY }} - script: | - cd ${{ env.newReleaseDir }}; - sudo runuser -u ${{ secrets.HTTP_USER }} -- php artisan clear-compiled; - - - name: šŸ™ˆ Migrate database - uses: appleboy/ssh-action@master - with: - host: ${{ secrets.DEPLOYMENT_HOST }} - port: ${{ secrets.DEPLOYMENT_PORT }} - username: ${{ secrets.DEPLOYMENT_USER }} - key: ${{ secrets.DEPLOYMENT_KEY }} - script: | - cd ${{ env.newReleaseDir }} - sudo runuser -u ${{ secrets.HTTP_USER }} -- php artisan migrate --force - - - name: šŸ™ Bless release - uses: appleboy/ssh-action@master - with: - host: ${{ secrets.DEPLOYMENT_HOST }} - port: ${{ secrets.DEPLOYMENT_PORT }} - username: ${{ secrets.DEPLOYMENT_USER }} - key: ${{ secrets.DEPLOYMENT_KEY }} - script: | - ln -nfs ${{ env.newReleaseDir }} ${{ env.currentDir }}; - cd ${{ env.newReleaseDir }} - sudo runuser -u ${{ secrets.HTTP_USER }} -- php artisan horizon:terminate - sudo runuser -u ${{ secrets.HTTP_USER }} -- php artisan config:cache - sudo runuser -u ${{ secrets.HTTP_USER }} -- php artisan event:cache - sudo runuser -u ${{ secrets.HTTP_USER }} -- php artisan route:cache - sudo runuser -u ${{ secrets.HTTP_USER }} -- php artisan view:cache - - sudo systemctl restart php-fpm.service - sudo systemctl restart jbuk-horizon.service - - - name: 🚾 Clean up old releases - uses: appleboy/ssh-action@master - with: - host: ${{ secrets.DEPLOYMENT_HOST }} - port: ${{ secrets.DEPLOYMENT_PORT }} - username: ${{ secrets.DEPLOYMENT_USER }} - key: ${{ secrets.DEPLOYMENT_KEY }} - script: | - fd '.+' ${{ env.releasesDir }} -d 1 | head -n -3 | xargs -d "\n" -I'{}' sudo chown -R ${{ secrets.DEPLOYMENT_USER }}:${{ secrets.DEPLOYMENT_USER }} {} - fd '.+' ${{ env.releasesDir }} -d 1 | head -n -3 | xargs -d "\n" -I'{}' rm -rf {} diff --git a/.github/workflows/phpunit.yml b/.github/workflows/phpunit.yml deleted file mode 100644 index 29afebb9..00000000 --- a/.github/workflows/phpunit.yml +++ /dev/null @@ -1,65 +0,0 @@ -name: PHP Unit - -on: - pull_request: - -jobs: - phpunit: - runs-on: ubuntu-latest - - name: PHPUnit test suite - - services: - postgres: - image: postgres:latest - env: - POSTGRES_USER: postgres - POSTGRES_PASSWORD: postgres - POSTGRES_DB: jbukdev_testing - ports: - - 5432:5432 - - steps: - - name: Checkout code - uses: actions/checkout@v4 - - - name: Setup PHP - uses: shivammathur/setup-php@v2 - with: - php-version: '8.3' - extensions: mbstring, intl, phpredis, imagick - coverage: xdebug - tools: phpunit - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - - name: Copy .env - run: php -r "file_exists('.env') || copy('.env.github', '.env');" - - - name: Get Composer Cache Directory - id: composer-cache - run: | - echo "::set-output name=dir::$(composer config cache-files-dir)" - - - name: Cache composer dependencies - uses: actions/cache@v4 - with: - path: ${{ steps.composer-cache.outputs.dir }} - key: ${{ runner.os }}-php-8.3-composer-${{ hashFiles('**/composer.lock') }} - restore-keys: | - ${{ runner.os }}-php-8.3-composer- - - - name: Install Composer Dependencies - run: composer install --quiet --no-ansi --no-interaction --no-progress - - - name: Generate Key - run: php artisan key:generate - - - name: Setup Directory Permissions - run: chmod -R 777 storage bootstrap/cache - - - name: Setup Database - run: php artisan migrate - - - name: Execute PHPUnit Tests - run: vendor/bin/phpunit diff --git a/.github/workflows/pint.yml b/.github/workflows/pint.yml deleted file mode 100644 index 9b0956ad..00000000 --- a/.github/workflows/pint.yml +++ /dev/null @@ -1,38 +0,0 @@ -name: Laravel Pint - -on: - pull_request: - -jobs: - pint: - runs-on: ubuntu-latest - - name: Laravel Pint - - steps: - - name: Checkout code - uses: actions/checkout@v4 - - - name: Setup PHP with pecl extensions - uses: shivammathur/setup-php@v2 - with: - php-version: '8.2' - - - name: Get Composer Cache Directory - id: composer-cache - run: | - echo "::set-output name=dir::$(composer config cache-files-dir)" - - - name: Cache composer dependencies - uses: actions/cache@v4 - with: - path: ${{ steps.composer-cache.outputs.dir }} - key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} - restore-keys: | - ${{ runner.os }}-composer- - - - name: Install Composer Dependencies - run: composer install --quiet --no-ansi --no-interaction --no-progress - - - name: Check Files with Laravel Pint - run: vendor/bin/pint --test diff --git a/.gitignore b/.gitignore index 5f786e27..a0c2459a 100644 --- a/.gitignore +++ b/.gitignore @@ -4,7 +4,6 @@ /public/coverage /public/hot /public/files -/public/fonts /public/storage /storage/*.key /vendor diff --git a/.phpactor.json b/.phpactor.json deleted file mode 100644 index 028bb10a..00000000 --- a/.phpactor.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "$schema": "/Users/jonny/git/phpactor/phpactor.schema.json", - "language_server_phpstan.enabled": false, - "language_server_psalm.enabled": true -} diff --git a/.styleci.yml b/.styleci.yml deleted file mode 100644 index 9daadf16..00000000 --- a/.styleci.yml +++ /dev/null @@ -1,9 +0,0 @@ -php: - preset: laravel - disabled: - - no_unused_imports - finder: - not-name: - - index.php -js: true -css: true diff --git a/app/Console/Commands/MigratePlaceDataFromPostgis.php b/app/Console/Commands/MigratePlaceDataFromPostgis.php index e0026150..8d5d2c92 100644 --- a/app/Console/Commands/MigratePlaceDataFromPostgis.php +++ b/app/Console/Commands/MigratePlaceDataFromPostgis.php @@ -8,8 +8,6 @@ use Illuminate\Support\Facades\DB; /** * @codeCoverageIgnore - * - * @psalm-suppress UnusedClass */ class MigratePlaceDataFromPostgis extends Command { diff --git a/app/Console/Commands/ParseCachedWebMentions.php b/app/Console/Commands/ParseCachedWebMentions.php index 010a086a..a6b29176 100644 --- a/app/Console/Commands/ParseCachedWebMentions.php +++ b/app/Console/Commands/ParseCachedWebMentions.php @@ -9,9 +9,6 @@ use Illuminate\Console\Command; use Illuminate\Contracts\Filesystem\FileNotFoundException; use Illuminate\FileSystem\FileSystem; -/** - * @psalm-suppress UnusedClass - */ class ParseCachedWebMentions extends Command { /** diff --git a/app/Console/Commands/ReDownloadWebMentions.php b/app/Console/Commands/ReDownloadWebMentions.php index b29e7da8..c6452ba9 100644 --- a/app/Console/Commands/ReDownloadWebMentions.php +++ b/app/Console/Commands/ReDownloadWebMentions.php @@ -8,9 +8,6 @@ use App\Jobs\DownloadWebMention; use App\Models\WebMention; use Illuminate\Console\Command; -/** - * @psalm-suppress UnusedClass - */ class ReDownloadWebMentions extends Command { /** diff --git a/app/Exceptions/InvalidTokenScopeException.php b/app/Exceptions/InvalidTokenScopeException.php new file mode 100644 index 00000000..5966bccd --- /dev/null +++ b/app/Exceptions/InvalidTokenScopeException.php @@ -0,0 +1,7 @@ +user(); // RP Entity i.e. the application $rpEntity = PublicKeyCredentialRpEntity::create( - config('app.name'), - config('url.longurl'), + name: config('app.name'), + id: config('app.url'), ); // User Entity $userEntity = PublicKeyCredentialUserEntity::create( - $user->name, - (string) $user->id, - $user->name, + name: $user->name, + id: (string) $user->id, + displayName: $user->name, ); // Challenge @@ -85,25 +87,38 @@ class PasskeysController extends Controller $authenticatorSelectionCriteria = AuthenticatorSelectionCriteria::create( userVerification: AuthenticatorSelectionCriteria::USER_VERIFICATION_REQUIREMENT_REQUIRED, residentKey: AuthenticatorSelectionCriteria::RESIDENT_KEY_REQUIREMENT_REQUIRED, - requireResidentKey: true, ); - $options = PublicKeyCredentialCreationOptions::create( - $rpEntity, - $userEntity, - $challenge, - $pubKeyCredParams, + $publicKeyCredentialCreationOptions = PublicKeyCredentialCreationOptions::create( + rp: $rpEntity, + user: $userEntity, + challenge: $challenge, + pubKeyCredParams: $pubKeyCredParams, authenticatorSelection: $authenticatorSelectionCriteria, attestation: PublicKeyCredentialCreationOptions::ATTESTATION_CONVEYANCE_PREFERENCE_NONE ); - $options = json_encode($options, JSON_THROW_ON_ERROR); + $attestationStatementSupportManager = new AttestationStatementSupportManager; + $attestationStatementSupportManager->add(new NoneAttestationStatementSupport); + $webauthnSerializerFactory = new WebauthnSerializerFactory( + attestationStatementSupportManager: $attestationStatementSupportManager + ); + $webauthnSerializer = $webauthnSerializerFactory->create(); + $publicKeyCredentialCreationOptions = $webauthnSerializer->serialize( + data: $publicKeyCredentialCreationOptions, + format: 'json' + ); - session(['create_options' => $options]); + $request->session()->put('create_options', $publicKeyCredentialCreationOptions); - return JsonResponse::fromJsonString($options); + return JsonResponse::fromJsonString($publicKeyCredentialCreationOptions); } + /** + * @throws Throwable + * @throws WebauthnException + * @throws \JsonException + */ public function create(Request $request): JsonResponse { /** @var User $user */ @@ -111,17 +126,17 @@ class PasskeysController extends Controller $publicKeyCredentialCreationOptionsData = session('create_options'); // Unset session data to mitigate replay attacks - session()->forget('create_options'); + $request->session()->forget('create_options'); if (empty($publicKeyCredentialCreationOptionsData)) { throw new WebAuthnException('No public key credential request options found'); } $attestationStatementSupportManager = new AttestationStatementSupportManager; $attestationStatementSupportManager->add(new NoneAttestationStatementSupport); - - $webauthnSerializer = (new WebauthnSerializerFactory( - $attestationStatementSupportManager - ))->create(); + $webauthnSerializerFactory = new WebauthnSerializerFactory( + attestationStatementSupportManager: $attestationStatementSupportManager + ); + $webauthnSerializer = $webauthnSerializerFactory->create(); $publicKeyCredential = $webauthnSerializer->deserialize( json_encode($request->all(), JSON_THROW_ON_ERROR), @@ -146,11 +161,11 @@ class PasskeysController extends Controller $ceremonyStepManagerFactory->setExtensionOutputCheckerHandler( ExtensionOutputCheckerHandler::create() ); - $securedRelyingPartyId = []; + $allowedOrigins = []; if (App::environment('local', 'development')) { - $securedRelyingPartyId = [config('url.longurl')]; + $allowedOrigins = [config('app.url')]; } - $ceremonyStepManagerFactory->setSecuredRelyingPartyId($securedRelyingPartyId); + $ceremonyStepManagerFactory->setAllowedOrigins($allowedOrigins); $authenticatorAttestationResponseValidator = AuthenticatorAttestationResponseValidator::create( ceremonyStepManager: $ceremonyStepManagerFactory->creationCeremony() @@ -165,8 +180,7 @@ class PasskeysController extends Controller $publicKeyCredentialSource = $authenticatorAttestationResponseValidator->check( authenticatorAttestationResponse: $publicKeyCredential->response, publicKeyCredentialCreationOptions: $publicKeyCredentialCreationOptions, - request: config('url.longurl'), - securedRelyingPartyId: $securedRelyingPartyId, + host: config('app.url') ); $user->passkey()->create([ @@ -180,24 +194,37 @@ class PasskeysController extends Controller ]); } - public function getRequestOptions(): JsonResponse + /** + * @throws RandomException + * @throws \JsonException + */ + public function getRequestOptions(Request $request): JsonResponse { $publicKeyCredentialRequestOptions = PublicKeyCredentialRequestOptions::create( challenge: random_bytes(16), userVerification: PublicKeyCredentialRequestOptions::USER_VERIFICATION_REQUIREMENT_REQUIRED ); - $publicKeyCredentialRequestOptions = json_encode($publicKeyCredentialRequestOptions, JSON_THROW_ON_ERROR); + $attestationStatementSupportManager = AttestationStatementSupportManager::create(); + $attestationStatementSupportManager->add(NoneAttestationStatementSupport::create()); + $factory = new WebauthnSerializerFactory( + attestationStatementSupportManager: $attestationStatementSupportManager + ); + $serializer = $factory->create(); + $publicKeyCredentialRequestOptions = $serializer->serialize(data: $publicKeyCredentialRequestOptions, format: 'json'); - session(['request_options' => $publicKeyCredentialRequestOptions]); + $request->session()->put('request_options', $publicKeyCredentialRequestOptions); return JsonResponse::fromJsonString($publicKeyCredentialRequestOptions); } + /** + * @throws \JsonException + */ public function login(Request $request): JsonResponse { $requestOptions = session('request_options'); - session()->forget('request_options'); + $request->session()->forget('request_options'); if (empty($requestOptions)) { return response()->json([ @@ -209,9 +236,10 @@ class PasskeysController extends Controller $attestationStatementSupportManager = new AttestationStatementSupportManager; $attestationStatementSupportManager->add(new NoneAttestationStatementSupport); - $webauthnSerializer = (new WebauthnSerializerFactory( - $attestationStatementSupportManager - ))->create(); + $webauthnSerializerFactory = new WebauthnSerializerFactory( + attestationStatementSupportManager: $attestationStatementSupportManager + ); + $webauthnSerializer = $webauthnSerializerFactory->create(); $publicKeyCredential = $webauthnSerializer->deserialize( json_encode($request->all(), JSON_THROW_ON_ERROR), @@ -256,11 +284,11 @@ class PasskeysController extends Controller $ceremonyStepManagerFactory->setExtensionOutputCheckerHandler( ExtensionOutputCheckerHandler::create() ); - $securedRelyingPartyId = []; + $allowedOrigins = []; if (App::environment('local', 'development')) { - $securedRelyingPartyId = [config('url.longurl')]; + $allowedOrigins = [config('app.url')]; } - $ceremonyStepManagerFactory->setSecuredRelyingPartyId($securedRelyingPartyId); + $ceremonyStepManagerFactory->setAllowedOrigins($allowedOrigins); $authenticatorAssertionResponseValidator = AuthenticatorAssertionResponseValidator::create( ceremonyStepManager: $ceremonyStepManagerFactory->requestCeremony() @@ -274,12 +302,11 @@ class PasskeysController extends Controller try { $authenticatorAssertionResponseValidator->check( - credentialId: $publicKeyCredentialSource, + publicKeyCredentialSource: $publicKeyCredentialSource, authenticatorAssertionResponse: $publicKeyCredential->response, publicKeyCredentialRequestOptions: $publicKeyCredentialRequestOptions, - request: config('url.longurl'), + host: config('app.url'), userHandle: null, - securedRelyingPartyId: $securedRelyingPartyId, ); } catch (Throwable) { return response()->json([ diff --git a/app/Http/Controllers/Admin/PlacesController.php b/app/Http/Controllers/Admin/PlacesController.php index 2b0d2e99..e5e82bcd 100644 --- a/app/Http/Controllers/Admin/PlacesController.php +++ b/app/Http/Controllers/Admin/PlacesController.php @@ -10,9 +10,6 @@ use App\Services\PlaceService; use Illuminate\Http\RedirectResponse; use Illuminate\View\View; -/** - * @psalm-suppress UnusedClass - */ class PlacesController extends Controller { protected PlaceService $placeService; diff --git a/app/Http/Controllers/Admin/SyndicationTargetsController.php b/app/Http/Controllers/Admin/SyndicationTargetsController.php index 6eb60f69..dc14a2d2 100644 --- a/app/Http/Controllers/Admin/SyndicationTargetsController.php +++ b/app/Http/Controllers/Admin/SyndicationTargetsController.php @@ -10,9 +10,6 @@ use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; use Illuminate\View\View; -/** - * @psalm-suppress UnusedClass - */ class SyndicationTargetsController extends Controller { /** diff --git a/app/Http/Controllers/ArticlesController.php b/app/Http/Controllers/ArticlesController.php index 725c5b91..9ab860d7 100644 --- a/app/Http/Controllers/ArticlesController.php +++ b/app/Http/Controllers/ArticlesController.php @@ -10,9 +10,6 @@ use Illuminate\Http\RedirectResponse; use Illuminate\View\View; use Jonnybarnes\IndieWeb\Numbers; -/** - * @psalm-suppress UnusedClass - */ class ArticlesController extends Controller { /** diff --git a/app/Http/Controllers/AuthController.php b/app/Http/Controllers/AuthController.php index 27f34eab..bd0022d6 100644 --- a/app/Http/Controllers/AuthController.php +++ b/app/Http/Controllers/AuthController.php @@ -9,9 +9,6 @@ use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; use Illuminate\View\View; -/** - * @psalm-suppress UnusedClass - */ class AuthController extends Controller { /** diff --git a/app/Http/Controllers/BookmarksController.php b/app/Http/Controllers/BookmarksController.php index ae9a0280..b4bb3c13 100644 --- a/app/Http/Controllers/BookmarksController.php +++ b/app/Http/Controllers/BookmarksController.php @@ -7,9 +7,6 @@ namespace App\Http\Controllers; use App\Models\Bookmark; use Illuminate\View\View; -/** - * @psalm-suppress UnusedClass - */ class BookmarksController extends Controller { /** diff --git a/app/Http/Controllers/ContactsController.php b/app/Http/Controllers/ContactsController.php index 75b103a8..280cc3ed 100644 --- a/app/Http/Controllers/ContactsController.php +++ b/app/Http/Controllers/ContactsController.php @@ -8,9 +8,6 @@ use App\Models\Contact; use Illuminate\Filesystem\Filesystem; use Illuminate\View\View; -/** - * @psalm-suppress UnusedClass - */ class ContactsController extends Controller { /** diff --git a/app/Http/Controllers/FeedsController.php b/app/Http/Controllers/FeedsController.php index 4e887105..eb0847a3 100644 --- a/app/Http/Controllers/FeedsController.php +++ b/app/Http/Controllers/FeedsController.php @@ -9,9 +9,6 @@ use App\Models\Note; use Illuminate\Http\JsonResponse; use Illuminate\Http\Response; -/** - * @psalm-suppress UnusedClass - */ class FeedsController extends Controller { /** @@ -122,8 +119,8 @@ class FeedsController extends Controller foreach ($notes as $key => $note) { $data['items'][$key] = [ - 'id' => $note->longurl, - 'url' => $note->longurl, + 'id' => $note->uri, + 'url' => $note->uri, 'content_text' => $note->content, 'date_published' => $note->created_at->tz('UTC')->toRfc3339String(), 'date_modified' => $note->updated_at->tz('UTC')->toRfc3339String(), @@ -164,7 +161,7 @@ class FeedsController extends Controller 'author' => [ 'type' => 'card', 'name' => config('user.display_name'), - 'url' => config('url.longurl'), + 'url' => config('app.url'), ], 'children' => $items, ], 200, [ @@ -183,8 +180,8 @@ class FeedsController extends Controller $items[] = [ 'type' => 'entry', 'published' => $note->created_at, - 'uid' => $note->longurl, - 'url' => $note->longurl, + 'uid' => $note->uri, + 'url' => $note->uri, 'content' => [ 'text' => $note->getRawOriginal('note'), 'html' => $note->note, @@ -200,7 +197,7 @@ class FeedsController extends Controller 'author' => [ 'type' => 'card', 'name' => config('user.display_name'), - 'url' => config('url.longurl'), + 'url' => config('app.url'), ], 'children' => $items, ], 200, [ diff --git a/app/Http/Controllers/FrontPageController.php b/app/Http/Controllers/FrontPageController.php index 8ae9c3c6..19537663 100644 --- a/app/Http/Controllers/FrontPageController.php +++ b/app/Http/Controllers/FrontPageController.php @@ -10,9 +10,6 @@ use App\Models\Note; use Illuminate\Http\Response; use Illuminate\View\View; -/** - * @psalm-suppress UnusedClass - */ class FrontPageController extends Controller { /** diff --git a/app/Http/Controllers/LikesController.php b/app/Http/Controllers/LikesController.php index 77d5f963..af1c483c 100644 --- a/app/Http/Controllers/LikesController.php +++ b/app/Http/Controllers/LikesController.php @@ -7,9 +7,6 @@ namespace App\Http\Controllers; use App\Models\Like; use Illuminate\View\View; -/** - * @psalm-suppress UnusedClass - */ class LikesController extends Controller { /** diff --git a/app/Http/Controllers/MicropubController.php b/app/Http/Controllers/MicropubController.php index ac25a815..758b3255 100644 --- a/app/Http/Controllers/MicropubController.php +++ b/app/Http/Controllers/MicropubController.php @@ -4,123 +4,73 @@ declare(strict_types=1); namespace App\Http\Controllers; -use App\Http\Responses\MicropubResponses; +use App\Exceptions\InvalidTokenScopeException; +use App\Exceptions\MicropubHandlerException; +use App\Http\Requests\MicropubRequest; use App\Models\Place; use App\Models\SyndicationTarget; -use App\Services\Micropub\HCardService; -use App\Services\Micropub\HEntryService; -use App\Services\Micropub\UpdateService; -use App\Services\TokenService; +use App\Services\Micropub\MicropubHandlerRegistry; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; -use Lcobucci\JWT\Encoding\CannotDecodeContent; -use Lcobucci\JWT\Token\InvalidTokenStructure; -use Lcobucci\JWT\Validation\RequiredConstraintsViolated; -use Monolog\Handler\StreamHandler; -use Monolog\Logger; +use Lcobucci\JWT\Token; -/** - * @psalm-suppress UnusedClass - */ class MicropubController extends Controller { - protected TokenService $tokenService; + protected MicropubHandlerRegistry $handlerRegistry; - protected HEntryService $hentryService; - - protected HCardService $hcardService; - - protected UpdateService $updateService; - - public function __construct( - TokenService $tokenService, - HEntryService $hentryService, - HCardService $hcardService, - UpdateService $updateService - ) { - $this->tokenService = $tokenService; - $this->hentryService = $hentryService; - $this->hcardService = $hcardService; - $this->updateService = $updateService; + public function __construct(MicropubHandlerRegistry $handlerRegistry) + { + $this->handlerRegistry = $handlerRegistry; } /** - * This function receives an API request, verifies the authenticity - * then passes over the info to the relevant Service class. + * Respond to a POST request to the micropub endpoint. + * + * The request is initially processed by the MicropubRequest form request + * class. The normalizes the data, so we can pass it into the handlers for + * the different micropub requests, h-entry or h-card, for example. */ - public function post(Request $request): JsonResponse + public function post(MicropubRequest $request): JsonResponse { + $type = $request->getType(); + + if (! $type) { + return response()->json([ + 'error' => 'invalid_request', + 'error_description' => 'Microformat object type is missing, for example: h-entry or h-card', + ], 400); + } + try { - $tokenData = $this->tokenService->validateToken($request->input('access_token')); - } catch (RequiredConstraintsViolated|InvalidTokenStructure|CannotDecodeContent) { - $micropubResponses = new MicropubResponses; - - return $micropubResponses->invalidTokenResponse(); - } - - if ($tokenData->claims()->has('scope') === false) { - $micropubResponses = new MicropubResponses; - - return $micropubResponses->tokenHasNoScopeResponse(); - } - - $this->logMicropubRequest($request->all()); - - if (($request->input('h') === 'entry') || ($request->input('type.0') === 'h-entry')) { - $scopes = $tokenData->claims()->get('scope'); - if (is_string($scopes)) { - $scopes = explode(' ', $scopes); - } - - if (! in_array('create', $scopes)) { - $micropubResponses = new MicropubResponses; - - return $micropubResponses->insufficientScopeResponse(); - } - $location = $this->hentryService->process($request->all(), $this->getCLientId()); + $handler = $this->handlerRegistry->getHandler($type); + $result = $handler->handle($request->getMicropubData()); + // Return appropriate response based on the handler result return response()->json([ - 'response' => 'created', - 'location' => $location, - ], 201)->header('Location', $location); - } - - if ($request->input('h') === 'card' || $request->input('type.0') === 'h-card') { - $scopes = $tokenData->claims()->get('scope'); - if (is_string($scopes)) { - $scopes = explode(' ', $scopes); - } - if (! in_array('create', $scopes)) { - $micropubResponses = new MicropubResponses; - - return $micropubResponses->insufficientScopeResponse(); - } - $location = $this->hcardService->process($request->all()); - + 'response' => $result['response'], + 'location' => $result['url'] ?? null, + ], 201)->header('Location', $result['url']); + } catch (\InvalidArgumentException $e) { return response()->json([ - 'response' => 'created', - 'location' => $location, - ], 201)->header('Location', $location); + 'error' => 'invalid_request', + 'error_description' => $e->getMessage(), + ], 400); + } catch (MicropubHandlerException) { + return response()->json([ + 'error' => 'Unknown Micropub type', + 'error_description' => 'The request could not be processed by this server', + ], 500); + } catch (InvalidTokenScopeException) { + return response()->json([ + 'error' => 'invalid_scope', + 'error_description' => 'The token does not have the required scope for this request', + ], 403); + } catch (\Exception) { + return response()->json([ + 'error' => 'server_error', + 'error_description' => 'An error occurred processing the request', + ], 500); } - - if ($request->input('action') === 'update') { - $scopes = $tokenData->claims()->get('scope'); - if (is_string($scopes)) { - $scopes = explode(' ', $scopes); - } - if (! in_array('update', $scopes)) { - $micropubResponses = new MicropubResponses; - - return $micropubResponses->insufficientScopeResponse(); - } - - return $this->updateService->process($request->all()); - } - - return response()->json([ - 'response' => 'error', - 'error_description' => 'unsupported_request_type', - ], 500); } /** @@ -133,12 +83,6 @@ class MicropubController extends Controller */ public function get(Request $request): JsonResponse { - try { - $tokenData = $this->tokenService->validateToken($request->input('access_token')); - } catch (RequiredConstraintsViolated|InvalidTokenStructure) { - return (new MicropubResponses)->invalidTokenResponse(); - } - if ($request->input('q') === 'syndicate-to') { return response()->json([ 'syndicate-to' => SyndicationTarget::all(), @@ -170,36 +114,17 @@ class MicropubController extends Controller ]); } - // default response is just to return the token data + // the default response is just to return the token data + /** @var Token $tokenData */ + $tokenData = $request->input('token_data'); + return response()->json([ 'response' => 'token', 'token' => [ - 'me' => $tokenData->claims()->get('me'), - 'scope' => $tokenData->claims()->get('scope'), - 'client_id' => $tokenData->claims()->get('client_id'), + 'me' => $tokenData['me'], + 'scope' => $tokenData['scope'], + 'client_id' => $tokenData['client_id'], ], ]); } - - /** - * Determine the client id from the access token sent with the request. - * - * @throws RequiredConstraintsViolated - */ - private function getClientId(): string - { - return resolve(TokenService::class) - ->validateToken(app('request')->input('access_token')) - ->claims()->get('client_id'); - } - - /** - * Save the details of the micropub request to a log file. - */ - private function logMicropubRequest(array $request): void - { - $logger = new Logger('micropub'); - $logger->pushHandler(new StreamHandler(storage_path('logs/micropub.log'))); - $logger->debug('MicropubLog', $request); - } } diff --git a/app/Http/Controllers/MicropubMediaController.php b/app/Http/Controllers/MicropubMediaController.php index a660f11a..fc804ea2 100644 --- a/app/Http/Controllers/MicropubMediaController.php +++ b/app/Http/Controllers/MicropubMediaController.php @@ -7,10 +7,8 @@ namespace App\Http\Controllers; use App\Http\Responses\MicropubResponses; use App\Jobs\ProcessMedia; use App\Models\Media; -use App\Services\TokenService; use Exception; use Illuminate\Contracts\Container\BindingResolutionException; -use Illuminate\Http\File; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; use Illuminate\Http\Response; @@ -18,46 +16,20 @@ use Illuminate\Http\UploadedFile; use Illuminate\Support\Carbon; use Illuminate\Support\Facades\Storage; use Intervention\Image\ImageManager; -use Lcobucci\JWT\Token\InvalidTokenStructure; -use Lcobucci\JWT\Validation\RequiredConstraintsViolated; use Ramsey\Uuid\Uuid; -/** - * @psalm-suppress UnusedClass - */ class MicropubMediaController extends Controller { - protected TokenService $tokenService; - - public function __construct(TokenService $tokenService) - { - $this->tokenService = $tokenService; - } - public function getHandler(Request $request): JsonResponse { - try { - $tokenData = $this->tokenService->validateToken($request->input('access_token')); - } catch (RequiredConstraintsViolated|InvalidTokenStructure) { - $micropubResponses = new MicropubResponses; + $tokenData = $request->input('token_data'); - return $micropubResponses->invalidTokenResponse(); - } - - if ($tokenData->claims()->has('scope') === false) { - $micropubResponses = new MicropubResponses; - - return $micropubResponses->tokenHasNoScopeResponse(); - } - - $scopes = $tokenData->claims()->get('scope'); + $scopes = $tokenData['scope']; if (is_string($scopes)) { $scopes = explode(' ', $scopes); } - if (! in_array('create', $scopes)) { - $micropubResponses = new MicropubResponses; - - return $micropubResponses->insufficientScopeResponse(); + if (! in_array('create', $scopes, true)) { + return (new MicropubResponses)->insufficientScopeResponse(); } if ($request->input('q') === 'last') { @@ -108,28 +80,14 @@ class MicropubMediaController extends Controller */ public function media(Request $request): JsonResponse { - try { - $tokenData = $this->tokenService->validateToken($request->input('access_token')); - } catch (RequiredConstraintsViolated|InvalidTokenStructure) { - $micropubResponses = new MicropubResponses; + $tokenData = $request->input('token_data'); - return $micropubResponses->invalidTokenResponse(); - } - - if ($tokenData->claims()->has('scope') === false) { - $micropubResponses = new MicropubResponses; - - return $micropubResponses->tokenHasNoScopeResponse(); - } - - $scopes = $tokenData->claims()->get('scope'); + $scopes = $tokenData['scope']; if (is_string($scopes)) { $scopes = explode(' ', $scopes); } - if (! in_array('create', $scopes)) { - $micropubResponses = new MicropubResponses; - - return $micropubResponses->insufficientScopeResponse(); + if (! in_array('create', $scopes, true)) { + return (new MicropubResponses)->insufficientScopeResponse(); } if ($request->hasFile('file') === false) { @@ -164,7 +122,7 @@ class MicropubMediaController extends Controller } $media = Media::create([ - 'token' => $request->bearerToken(), + 'token' => $request->input('access_token'), 'path' => $filename, 'type' => $this->getFileTypeFromMimeType($request->file('file')->getMimeType()), 'image_widths' => $width, diff --git a/app/Http/Controllers/NotesController.php b/app/Http/Controllers/NotesController.php index 5c25771f..d5c9bc90 100644 --- a/app/Http/Controllers/NotesController.php +++ b/app/Http/Controllers/NotesController.php @@ -14,8 +14,6 @@ use Jonnybarnes\IndieWeb\Numbers; /** * @todo Need to sort out Twitter and webmentions! - * - * @psalm-suppress UnusedClass */ class NotesController extends Controller { diff --git a/app/Http/Controllers/PlacesController.php b/app/Http/Controllers/PlacesController.php index b9bae93b..b949ecde 100644 --- a/app/Http/Controllers/PlacesController.php +++ b/app/Http/Controllers/PlacesController.php @@ -7,9 +7,6 @@ namespace App\Http\Controllers; use App\Models\Place; use Illuminate\View\View; -/** - * @psalm-suppress UnusedClass - */ class PlacesController extends Controller { /** diff --git a/app/Http/Controllers/SearchController.php b/app/Http/Controllers/SearchController.php index a8116c88..3f366538 100644 --- a/app/Http/Controllers/SearchController.php +++ b/app/Http/Controllers/SearchController.php @@ -6,9 +6,6 @@ use App\Models\Note; use Illuminate\Http\Request; use Illuminate\View\View; -/** - * @psalm-suppress UnusedClass - */ class SearchController extends Controller { public function search(Request $request): View diff --git a/app/Http/Controllers/ShortURLsController.php b/app/Http/Controllers/ShortURLsController.php deleted file mode 100644 index a232fcdb..00000000 --- a/app/Http/Controllers/ShortURLsController.php +++ /dev/null @@ -1,55 +0,0 @@ - config('app.url')]` as I can’t manually log in as * a .localhost domain. - * - * @psalm-suppress PossiblyUnusedMethod */ public function handle(Request $request, Closure $next): Response { diff --git a/app/Http/Middleware/LogMicropubRequest.php b/app/Http/Middleware/LogMicropubRequest.php new file mode 100644 index 00000000..a04e80de --- /dev/null +++ b/app/Http/Middleware/LogMicropubRequest.php @@ -0,0 +1,24 @@ +pushHandler(new StreamHandler(storage_path('logs/micropub.log'))); + $logger->debug('MicropubLog', $request->all()); + + return $next($request); + } +} diff --git a/app/Http/Middleware/MyAuthMiddleware.php b/app/Http/Middleware/MyAuthMiddleware.php index e455d181..b22e2b33 100644 --- a/app/Http/Middleware/MyAuthMiddleware.php +++ b/app/Http/Middleware/MyAuthMiddleware.php @@ -13,8 +13,6 @@ class MyAuthMiddleware { /** * Check the user is logged in. - * - * @psalm-suppress PossiblyUnusedMethod */ public function handle(Request $request, Closure $next): Response { diff --git a/app/Http/Middleware/ValidateSignature.php b/app/Http/Middleware/ValidateSignature.php index 2beb3c93..093bf64a 100644 --- a/app/Http/Middleware/ValidateSignature.php +++ b/app/Http/Middleware/ValidateSignature.php @@ -10,8 +10,6 @@ class ValidateSignature extends Middleware * The names of the query string parameters that should be ignored. * * @var array - * - * @psalm-suppress PossiblyUnusedProperty */ protected $except = [ // 'fbclid', diff --git a/app/Http/Middleware/VerifyMicropubToken.php b/app/Http/Middleware/VerifyMicropubToken.php index b68e999b..33d2cb12 100644 --- a/app/Http/Middleware/VerifyMicropubToken.php +++ b/app/Http/Middleware/VerifyMicropubToken.php @@ -4,8 +4,14 @@ declare(strict_types=1); namespace App\Http\Middleware; +use App\Http\Responses\MicropubResponses; use Closure; use Illuminate\Http\Request; +use Lcobucci\JWT\Configuration; +use Lcobucci\JWT\Encoding\CannotDecodeContent; +use Lcobucci\JWT\Token; +use Lcobucci\JWT\Token\InvalidTokenStructure; +use Lcobucci\JWT\Validation\RequiredConstraintsViolated; use Symfony\Component\HttpFoundation\Response; class VerifyMicropubToken @@ -13,24 +19,63 @@ class VerifyMicropubToken /** * Handle an incoming request. * - * @psalm-suppress PossiblyUnusedMethod + * @param Closure(Request): (Response) $next */ public function handle(Request $request, Closure $next): Response { + $rawToken = null; + if ($request->input('access_token')) { - return $next($request); + $rawToken = $request->input('access_token'); + } elseif ($request->bearerToken()) { + $rawToken = $request->bearerToken(); } - if ($request->bearerToken()) { - return $next($request->merge([ - 'access_token' => $request->bearerToken(), - ])); + if (! $rawToken) { + return response()->json([ + 'response' => 'error', + 'error' => 'unauthorized', + 'error_description' => 'No access token was provided in the request', + ], 401); } - return response()->json([ - 'response' => 'error', - 'error' => 'unauthorized', - 'error_description' => 'No access token was provided in the request', - ], 401); + try { + $tokenData = $this->validateToken($rawToken); + } catch (RequiredConstraintsViolated|InvalidTokenStructure|CannotDecodeContent) { + $micropubResponses = new MicropubResponses; + + return $micropubResponses->invalidTokenResponse(); + } + + if ($tokenData->claims()->has('scope') === false) { + $micropubResponses = new MicropubResponses; + + return $micropubResponses->tokenHasNoScopeResponse(); + } + + return $next($request->merge([ + 'access_token' => $rawToken, + 'token_data' => [ + 'me' => $tokenData->claims()->get('me'), + 'scope' => $tokenData->claims()->get('scope'), + 'client_id' => $tokenData->claims()->get('client_id'), + ], + ])); + } + + /** + * Check the token signature is valid. + */ + private function validateToken(string $bearerToken): Token + { + $config = resolve(Configuration::class); + + $token = $config->parser()->parse($bearerToken); + + $constraints = $config->validationConstraints(); + + $config->validator()->assert($token, ...$constraints); + + return $token; } } diff --git a/app/Http/Requests/MicropubRequest.php b/app/Http/Requests/MicropubRequest.php new file mode 100644 index 00000000..d931f139 --- /dev/null +++ b/app/Http/Requests/MicropubRequest.php @@ -0,0 +1,106 @@ +micropubData; + } + + public function getType(): ?string + { + // Return consistent type regardless of input format + return $this->micropubData['type'] ?? null; + } + + protected function prepareForValidation(): void + { + // Normalize the request data based on content type + if ($this->isJson()) { + $this->normalizeMicropubJson(); + } else { + $this->normalizeMicropubForm(); + } + } + + private function normalizeMicropubJson(): void + { + $json = $this->json(); + if ($json === null) { + throw new \InvalidArgumentException('`isJson()` passed but there is no json data'); + } + + $data = $json->all(); + + // Convert JSON type (h-entry) to simple type (entry) + if (isset($data['type']) && is_array($data['type'])) { + $type = current($data['type']); + if (strpos($type, 'h-') === 0) { + $this->micropubData['type'] = substr($type, 2); + } + } + // Or set the type to update + elseif (isset($data['action']) && $data['action'] === 'update') { + $this->micropubData['type'] = 'update'; + } + + // Add in the token data + $this->micropubData['token_data'] = $data['token_data']; + + // Add h-entry values + $this->micropubData['content'] = Arr::get($data, 'properties.content.0'); + $this->micropubData['in-reply-to'] = Arr::get($data, 'properties.in-reply-to.0'); + $this->micropubData['published'] = Arr::get($data, 'properties.published.0'); + $this->micropubData['location'] = Arr::get($data, 'location'); + $this->micropubData['bookmark-of'] = Arr::get($data, 'properties.bookmark-of.0'); + $this->micropubData['like-of'] = Arr::get($data, 'properties.like-of.0'); + $this->micropubData['mp-syndicate-to'] = Arr::get($data, 'properties.mp-syndicate-to'); + + // Add h-card values + $this->micropubData['name'] = Arr::get($data, 'properties.name.0'); + $this->micropubData['description'] = Arr::get($data, 'properties.description.0'); + $this->micropubData['geo'] = Arr::get($data, 'properties.geo.0'); + + // Add checkin value + $this->micropubData['checkin'] = Arr::get($data, 'checkin'); + $this->micropubData['syndication'] = Arr::get($data, 'properties.syndication.0'); + } + + private function normalizeMicropubForm(): void + { + // Convert form h=entry to type=entry + if ($h = $this->input('h')) { + $this->micropubData['type'] = $h; + } + + // Add some fields to the micropub data with default null values + $this->micropubData['in-reply-to'] = null; + $this->micropubData['published'] = null; + $this->micropubData['location'] = null; + $this->micropubData['description'] = null; + $this->micropubData['geo'] = null; + $this->micropubData['latitude'] = null; + $this->micropubData['longitude'] = null; + + // Map form fields to micropub data + foreach ($this->except(['h', 'access_token']) as $key => $value) { + $this->micropubData[$key] = $value; + } + } +} diff --git a/app/Jobs/ProcessWebMention.php b/app/Jobs/ProcessWebMention.php index 24c7f477..d92dfa18 100644 --- a/app/Jobs/ProcessWebMention.php +++ b/app/Jobs/ProcessWebMention.php @@ -53,7 +53,7 @@ class ProcessWebMention implements ShouldQueue // check webmention still references target // we try each type of mention (reply/like/repost) if ($webmention->type === 'in-reply-to') { - if ($parser->checkInReplyTo($microformats, $this->note->longurl) === false) { + if ($parser->checkInReplyTo($microformats, $this->note->uri) === false) { // it doesn’t so delete $webmention->delete(); @@ -67,7 +67,7 @@ class ProcessWebMention implements ShouldQueue return; } if ($webmention->type === 'like-of') { - if ($parser->checkLikeOf($microformats, $this->note->longurl) === false) { + if ($parser->checkLikeOf($microformats, $this->note->uri) === false) { // it doesn’t so delete $webmention->delete(); @@ -75,7 +75,7 @@ class ProcessWebMention implements ShouldQueue } // note we don’t need to do anything if it still is a like } if ($webmention->type === 'repost-of') { - if ($parser->checkRepostOf($microformats, $this->note->longurl) === false) { + if ($parser->checkRepostOf($microformats, $this->note->uri) === false) { // it doesn’t so delete $webmention->delete(); @@ -89,7 +89,7 @@ class ProcessWebMention implements ShouldQueue $type = $parser->getMentionType($microformats); // throw error here? dispatch(new SaveProfileImage($microformats)); $webmention->source = $this->source; - $webmention->target = $this->note->longurl; + $webmention->target = $this->note->uri; $webmention->commentable_id = $this->note->id; $webmention->commentable_type = Note::class; $webmention->type = $type; diff --git a/app/Jobs/SendWebMentions.php b/app/Jobs/SendWebMentions.php index 51e5f162..2ff5f2c6 100644 --- a/app/Jobs/SendWebMentions.php +++ b/app/Jobs/SendWebMentions.php @@ -45,7 +45,7 @@ class SendWebMentions implements ShouldQueue $guzzle = resolve(Client::class); $guzzle->post($endpoint, [ 'form_params' => [ - 'source' => $this->note->longurl, + 'source' => $this->note->uri, 'target' => $url, ], ]); @@ -61,7 +61,7 @@ class SendWebMentions implements ShouldQueue public function discoverWebmentionEndpoint(string $url): ?string { // let’s not send webmentions to myself - if (parse_url($url, PHP_URL_HOST) === config('url.longurl')) { + if (parse_url($url, PHP_URL_HOST) === parse_url(config('app.url'), PHP_URL_HOST)) { return null; } if (Str::startsWith($url, '/notes/tagged/')) { diff --git a/app/Models/Bookmark.php b/app/Models/Bookmark.php index 29bd25ad..37027e40 100644 --- a/app/Models/Bookmark.php +++ b/app/Models/Bookmark.php @@ -26,7 +26,7 @@ class Bookmark extends Model return $this->belongsToMany('App\Models\Tag'); } - protected function longurl(): Attribute + protected function local_uri(): Attribute { return Attribute::get( get: fn () => config('app.url') . '/bookmarks/' . $this->id, diff --git a/app/Models/Note.php b/app/Models/Note.php index 62b9fcea..74533443 100644 --- a/app/Models/Note.php +++ b/app/Models/Note.php @@ -124,7 +124,7 @@ class Note extends Model public function getNoteAttribute(?string $value): ?string { if ($value === null && $this->place !== null) { - $value = 'šŸ“: ' . $this->place->name . ''; + $value = 'šŸ“: ' . $this->place->name . ''; } // if $value is still null, just return null @@ -172,16 +172,11 @@ class Note extends Model return (string) resolve(Numbers::class)->numto60($this->id); } - public function getLongurlAttribute(): string + public function getUriAttribute(): string { return config('app.url') . '/notes/' . $this->nb60id; } - public function getShorturlAttribute(): string - { - return config('url.shorturl') . '/notes/' . $this->nb60id; - } - public function getIso8601Attribute(): string { return $this->updated_at->toISO8601String(); diff --git a/app/Models/Place.php b/app/Models/Place.php index 62c826ad..550f234d 100644 --- a/app/Models/Place.php +++ b/app/Models/Place.php @@ -74,24 +74,10 @@ class Place extends Model ])); } - protected function longurl(): Attribute - { - return Attribute::get( - get: fn ($value, $attributes) => config('app.url') . '/places/' . $attributes['slug'], - ); - } - - protected function shorturl(): Attribute - { - return Attribute::get( - get: fn ($value, $attributes) => config('url.shorturl') . '/places/' . $attributes['slug'], - ); - } - protected function uri(): Attribute { return Attribute::get( - get: fn () => $this->longurl, + get: static fn ($value, $attributes) => config('app.url') . '/places/' . $attributes['slug'], ); } diff --git a/app/Observers/NoteObserver.php b/app/Observers/NoteObserver.php index 935fb27f..95288b01 100644 --- a/app/Observers/NoteObserver.php +++ b/app/Observers/NoteObserver.php @@ -9,15 +9,10 @@ use App\Models\Tag; use Illuminate\Support\Arr; use Illuminate\Support\Collection; -/** - * @todo Do we need psalm-suppress for these observer methods? - */ class NoteObserver { /** - * Listen to the Note created event. - * - * @psalm-suppress PossiblyUnusedMethod + * Listen to the Note created event.= */ public function created(Note $note): void { @@ -39,9 +34,7 @@ class NoteObserver } /** - * Listen to the Note updated event. - * - * @psalm-suppress PossiblyUnusedMethod + * Listen to the Note updated event.= */ public function updated(Note $note): void { @@ -65,9 +58,7 @@ class NoteObserver } /** - * Listen to the Note deleting event. - * - * @psalm-suppress PossiblyUnusedMethod + * Listen to the Note deleting event.= */ public function deleting(Note $note): void { diff --git a/app/Providers/HorizonServiceProvider.php b/app/Providers/HorizonServiceProvider.php index 94c76a5a..bf4280ef 100644 --- a/app/Providers/HorizonServiceProvider.php +++ b/app/Providers/HorizonServiceProvider.php @@ -5,9 +5,6 @@ namespace App\Providers; use Illuminate\Support\Facades\Gate; use Laravel\Horizon\HorizonApplicationServiceProvider; -/** - * @psalm-suppress UnusedClass - */ class HorizonServiceProvider extends HorizonApplicationServiceProvider { /** diff --git a/app/Providers/MicropubServiceProvider.php b/app/Providers/MicropubServiceProvider.php new file mode 100644 index 00000000..1002a26d --- /dev/null +++ b/app/Providers/MicropubServiceProvider.php @@ -0,0 +1,26 @@ +app->singleton(MicropubHandlerRegistry::class, function () { + $registry = new MicropubHandlerRegistry; + + // Register handlers + $registry->register('card', new CardHandler); + $registry->register('entry', new EntryHandler); + + return $registry; + }); + } +} diff --git a/app/Services/ArticleService.php b/app/Services/ArticleService.php index 195f7051..3d5dcc56 100644 --- a/app/Services/ArticleService.php +++ b/app/Services/ArticleService.php @@ -6,13 +6,13 @@ namespace App\Services; use App\Models\Article; -class ArticleService extends Service +class ArticleService { - public function create(array $request, ?string $client = null): Article + public function create(array $data): Article { return Article::create([ - 'title' => $this->getDataByKey($request, 'name'), - 'main' => $this->getDataByKey($request, 'content'), + 'title' => $data['name'], + 'main' => $data['content'], 'published' => true, ]); } diff --git a/app/Services/BookmarkService.php b/app/Services/BookmarkService.php index 32ec7260..9cbc0714 100644 --- a/app/Services/BookmarkService.php +++ b/app/Services/BookmarkService.php @@ -10,28 +10,29 @@ use App\Models\Bookmark; use App\Models\Tag; use GuzzleHttp\Client; use GuzzleHttp\Exception\ClientException; +use GuzzleHttp\Exception\GuzzleException; use Illuminate\Support\Arr; use Illuminate\Support\Str; -class BookmarkService extends Service +class BookmarkService { /** * Create a new Bookmark. */ - public function create(array $request, ?string $client = null): Bookmark + public function create(array $data): Bookmark { - if (Arr::get($request, 'properties.bookmark-of.0')) { + if (Arr::get($data, 'properties.bookmark-of.0')) { // micropub request - $url = normalize_url(Arr::get($request, 'properties.bookmark-of.0')); - $name = Arr::get($request, 'properties.name.0'); - $content = Arr::get($request, 'properties.content.0'); - $categories = Arr::get($request, 'properties.category'); + $url = normalize_url(Arr::get($data, 'properties.bookmark-of.0')); + $name = Arr::get($data, 'properties.name.0'); + $content = Arr::get($data, 'properties.content.0'); + $categories = Arr::get($data, 'properties.category'); } - if (Arr::get($request, 'bookmark-of')) { - $url = normalize_url(Arr::get($request, 'bookmark-of')); - $name = Arr::get($request, 'name'); - $content = Arr::get($request, 'content'); - $categories = Arr::get($request, 'category'); + if (Arr::get($data, 'bookmark-of')) { + $url = normalize_url(Arr::get($data, 'bookmark-of')); + $name = Arr::get($data, 'name'); + $content = Arr::get($data, 'content'); + $categories = Arr::get($data, 'category'); } $bookmark = Bookmark::create([ @@ -54,6 +55,7 @@ class BookmarkService extends Service * Given a URL, attempt to save it to the Internet Archive. * * @throws InternetArchiveException + * @throws GuzzleException */ public function getArchiveLink(string $url): string { diff --git a/app/Services/LikeService.php b/app/Services/LikeService.php index dd08e25b..e688561d 100644 --- a/app/Services/LikeService.php +++ b/app/Services/LikeService.php @@ -8,19 +8,19 @@ use App\Jobs\ProcessLike; use App\Models\Like; use Illuminate\Support\Arr; -class LikeService extends Service +class LikeService { /** * Create a new Like. */ - public function create(array $request, ?string $client = null): Like + public function create(array $data): Like { - if (Arr::get($request, 'properties.like-of.0')) { + if (Arr::get($data, 'properties.like-of.0')) { // micropub request - $url = normalize_url(Arr::get($request, 'properties.like-of.0')); + $url = normalize_url(Arr::get($data, 'properties.like-of.0')); } - if (Arr::get($request, 'like-of')) { - $url = normalize_url(Arr::get($request, 'like-of')); + if (Arr::get($data, 'like-of')) { + $url = normalize_url(Arr::get($data, 'like-of')); } $like = Like::create(['url' => $url]); diff --git a/app/Services/Micropub/CardHandler.php b/app/Services/Micropub/CardHandler.php new file mode 100644 index 00000000..12e283be --- /dev/null +++ b/app/Services/Micropub/CardHandler.php @@ -0,0 +1,34 @@ +createPlace($data)->uri; + + return [ + 'response' => 'created', + 'url' => $location, + ]; + } +} diff --git a/app/Services/Micropub/EntryHandler.php b/app/Services/Micropub/EntryHandler.php new file mode 100644 index 00000000..9cdbe789 --- /dev/null +++ b/app/Services/Micropub/EntryHandler.php @@ -0,0 +1,41 @@ + resolve(LikeService::class)->create($data)->url, + isset($data['bookmark-of']) => resolve(BookmarkService::class)->create($data)->uri, + isset($data['name']) => resolve(ArticleService::class)->create($data)->link, + default => resolve(NoteService::class)->create($data)->uri, + }; + + return [ + 'response' => 'created', + 'url' => $location, + ]; + } +} diff --git a/app/Services/Micropub/HCardService.php b/app/Services/Micropub/HCardService.php deleted file mode 100644 index 7ab57a4e..00000000 --- a/app/Services/Micropub/HCardService.php +++ /dev/null @@ -1,32 +0,0 @@ -createPlace($data)->longurl; - } -} diff --git a/app/Services/Micropub/HEntryService.php b/app/Services/Micropub/HEntryService.php deleted file mode 100644 index 807e6327..00000000 --- a/app/Services/Micropub/HEntryService.php +++ /dev/null @@ -1,34 +0,0 @@ -create($request)->longurl; - } - - if (Arr::get($request, 'properties.bookmark-of') || Arr::get($request, 'bookmark-of')) { - return resolve(BookmarkService::class)->create($request)->longurl; - } - - if (Arr::get($request, 'properties.name') || Arr::get($request, 'name')) { - return resolve(ArticleService::class)->create($request)->longurl; - } - - return resolve(NoteService::class)->create($request, $client)->longurl; - } -} diff --git a/app/Services/Micropub/MicropubHandlerInterface.php b/app/Services/Micropub/MicropubHandlerInterface.php new file mode 100644 index 00000000..82040be9 --- /dev/null +++ b/app/Services/Micropub/MicropubHandlerInterface.php @@ -0,0 +1,10 @@ +handlers[$type] = $handler; + + return $this; + } + + /** + * @throws MicropubHandlerException + */ + public function getHandler(string $type): MicropubHandlerInterface + { + if (! isset($this->handlers[$type])) { + throw new MicropubHandlerException("No handler registered for '{$type}'"); + } + + return $this->handlers[$type]; + } +} diff --git a/app/Services/Micropub/UpdateService.php b/app/Services/Micropub/UpdateHandler.php similarity index 79% rename from app/Services/Micropub/UpdateService.php rename to app/Services/Micropub/UpdateHandler.php index f806361c..ee018f19 100644 --- a/app/Services/Micropub/UpdateService.php +++ b/app/Services/Micropub/UpdateHandler.php @@ -4,21 +4,33 @@ declare(strict_types=1); namespace App\Services\Micropub; +use App\Exceptions\InvalidTokenScopeException; use App\Models\Media; use App\Models\Note; use Illuminate\Database\Eloquent\ModelNotFoundException; -use Illuminate\Http\JsonResponse; use Illuminate\Support\Arr; use Illuminate\Support\Str; -class UpdateService +/* + * @todo Implement this properly + */ +class UpdateHandler implements MicropubHandlerInterface { /** - * Process a micropub request to update an entry. + * @throws InvalidTokenScopeException */ - public function process(array $request): JsonResponse + public function handle(array $data) { - $urlPath = parse_url(Arr::get($request, 'url'), PHP_URL_PATH); + $scopes = $data['token_data']['scope']; + if (is_string($scopes)) { + $scopes = explode(' ', $scopes); + } + + if (! in_array('update', $scopes, true)) { + throw new InvalidTokenScopeException; + } + + $urlPath = parse_url(Arr::get($data, 'url'), PHP_URL_PATH); // is it a note we are updating? if (mb_substr($urlPath, 1, 5) !== 'notes') { @@ -30,7 +42,7 @@ class UpdateService try { $note = Note::nb60(basename($urlPath))->firstOrFail(); - } catch (ModelNotFoundException $exception) { + } catch (ModelNotFoundException) { return response()->json([ 'error' => 'invalid_request', 'error_description' => 'No known note with given ID', @@ -38,8 +50,8 @@ class UpdateService } // got the note, are we dealing with a ā€œreplaceā€ request? - if (Arr::get($request, 'replace')) { - foreach (Arr::get($request, 'replace') as $property => $value) { + if (Arr::get($data, 'replace')) { + foreach (Arr::get($data, 'replace') as $property => $value) { if ($property === 'content') { $note->note = $value[0]; } @@ -59,14 +71,14 @@ class UpdateService } $note->save(); - return response()->json([ + return [ 'response' => 'updated', - ]); + ]; } // how about ā€œaddā€ - if (Arr::get($request, 'add')) { - foreach (Arr::get($request, 'add') as $property => $value) { + if (Arr::get($data, 'add')) { + foreach (Arr::get($data, 'add') as $property => $value) { if ($property === 'syndication') { foreach ($value as $syndicationURL) { if (Str::startsWith($syndicationURL, 'https://www.facebook.com')) { diff --git a/app/Services/NoteService.php b/app/Services/NoteService.php index b101498c..d8c55507 100644 --- a/app/Services/NoteService.php +++ b/app/Services/NoteService.php @@ -14,49 +14,52 @@ use App\Models\SyndicationTarget; use Illuminate\Support\Arr; use Illuminate\Support\Str; -class NoteService extends Service +class NoteService { /** * Create a new note. */ - public function create(array $request, ?string $client = null): Note + public function create(array $data): Note { + // Get the content we want to save + if (is_string($data['content'])) { + $content = $data['content']; + } elseif (isset($data['content']['html'])) { + $content = $data['content']['html']; + } else { + $content = null; + } + $note = Note::create( [ - 'note' => $this->getDataByKey($request, 'content'), - 'in_reply_to' => $this->getDataByKey($request, 'in-reply-to'), - 'client_id' => $client, + 'note' => $content, + 'in_reply_to' => $data['in-reply-to'], + 'client_id' => $data['token_data']['client_id'], ] ); - if ($this->getPublished($request)) { - $note->created_at = $note->updated_at = $this->getPublished($request); + if ($published = $this->getPublished($data)) { + $note->created_at = $note->updated_at = $published; } - $note->location = $this->getLocation($request); + $note->location = $this->getLocation($data); - if ($this->getCheckin($request)) { - $note->place()->associate($this->getCheckin($request)); - $note->swarm_url = $this->getSwarmUrl($request); - } - - $note->instagram_url = $this->getInstagramUrl($request); - - foreach ($this->getMedia($request) as $media) { - $note->media()->save($media); + if ($this->getCheckin($data)) { + $note->place()->associate($this->getCheckin($data)); + $note->swarm_url = $this->getSwarmUrl($data); } + // + // $note->instagram_url = $this->getInstagramUrl($request); + // + // foreach ($this->getMedia($request) as $media) { + // $note->media()->save($media); + // } $note->save(); dispatch(new SendWebMentions($note)); - if (in_array('mastodon', $this->getSyndicationTargets($request), true)) { - dispatch(new SyndicateNoteToMastodon($note)); - } - - if (in_array('bluesky', $this->getSyndicationTargets($request), true)) { - dispatch(new SyndicateNoteToBluesky($note)); - } + $this->dispatchSyndicationJobs($note, $data); return $note; } @@ -64,14 +67,10 @@ class NoteService extends Service /** * Get the published time from the request to create a new note. */ - private function getPublished(array $request): ?string + private function getPublished(array $data): ?string { - if (Arr::get($request, 'properties.published.0')) { - return carbon(Arr::get($request, 'properties.published.0')) - ->toDateTimeString(); - } - if (Arr::get($request, 'published')) { - return carbon(Arr::get($request, 'published'))->toDateTimeString(); + if ($data['published']) { + return carbon($data['published'])->toDateTimeString(); } return null; @@ -80,12 +79,13 @@ class NoteService extends Service /** * Get the location data from the request to create a new note. */ - private function getLocation(array $request): ?string + private function getLocation(array $data): ?string { - $location = Arr::get($request, 'properties.location.0') ?? Arr::get($request, 'location'); + $location = Arr::get($data, 'location'); + if (is_string($location) && str_starts_with($location, 'geo:')) { preg_match_all( - '/([0-9\.\-]+)/', + '/([0-9.\-]+)/', $location, $matches ); @@ -99,9 +99,9 @@ class NoteService extends Service /** * Get the checkin data from the request to create a new note. This will be a Place. */ - private function getCheckin(array $request): ?Place + private function getCheckin(array $data): ?Place { - $location = Arr::get($request, 'location'); + $location = Arr::get($data, 'location'); if (is_string($location) && Str::startsWith($location, config('app.url'))) { return Place::where( 'slug', @@ -113,12 +113,12 @@ class NoteService extends Service ) )->first(); } - if (Arr::get($request, 'checkin')) { + if (Arr::get($data, 'checkin')) { try { $place = resolve(PlaceService::class)->createPlaceFromCheckin( - Arr::get($request, 'checkin') + Arr::get($data, 'checkin') ); - } catch (\InvalidArgumentException $e) { + } catch (\InvalidArgumentException) { return null; } @@ -142,34 +142,47 @@ class NoteService extends Service /** * Get the Swarm URL from the syndication data in the request to create a new note. */ - private function getSwarmUrl(array $request): ?string + private function getSwarmUrl(array $data): ?string { - if (str_contains(Arr::get($request, 'properties.syndication.0', ''), 'swarmapp')) { - return Arr::get($request, 'properties.syndication.0'); + $syndication = Arr::get($data, 'syndication'); + if ($syndication === null) { + return null; + } + + if (str_contains($syndication, 'swarmapp')) { + return $syndication; } return null; } /** - * Get the syndication targets from the request to create a new note. + * Dispatch syndication jobs based on the request data. */ - private function getSyndicationTargets(array $request): array + private function dispatchSyndicationJobs(Note $note, array $request): void { - $syndication = []; - $mpSyndicateTo = Arr::get($request, 'mp-syndicate-to') ?? Arr::get($request, 'properties.mp-syndicate-to'); - $mpSyndicateTo = Arr::wrap($mpSyndicateTo); - foreach ($mpSyndicateTo as $uid) { - $target = SyndicationTarget::where('uid', $uid)->first(); - if ($target && $target->service_name === 'Mastodon') { - $syndication[] = 'mastodon'; - } - if ($target && $target->service_name === 'Bluesky') { - $syndication[] = 'bluesky'; - } + // If no syndication targets are specified, return early + if (empty($request['mp-syndicate-to'])) { + return; } - return $syndication; + // Get the configured syndication targets + $syndicationTargets = SyndicationTarget::all(); + + foreach ($syndicationTargets as $target) { + // Check if the target is in the request data + if (in_array($target->uid, $request['mp-syndicate-to'], true)) { + // Dispatch the appropriate job based on the target service name + switch ($target->service_name) { + case 'Mastodon': + dispatch(new SyndicateNoteToMastodon($note)); + break; + case 'Bluesky': + dispatch(new SyndicateNoteToBluesky($note)); + break; + } + } + } } /** diff --git a/app/Services/Service.php b/app/Services/Service.php deleted file mode 100644 index cb480d7c..00000000 --- a/app/Services/Service.php +++ /dev/null @@ -1,30 +0,0 @@ -toString(); } - - /** - * Check the token signature is valid. - */ - public function validateToken(string $bearerToken): Token - { - $config = resolve('Lcobucci\JWT\Configuration'); - - $token = $config->parser()->parse($bearerToken); - - $constraints = $config->validationConstraints(); - - $config->validator()->assert($token, ...$constraints); - - return $token; - } } diff --git a/bootstrap/providers.php b/bootstrap/providers.php index 4e3b4407..24821d29 100644 --- a/bootstrap/providers.php +++ b/bootstrap/providers.php @@ -3,4 +3,5 @@ return [ App\Providers\AppServiceProvider::class, App\Providers\HorizonServiceProvider::class, + App\Providers\MicropubServiceProvider::class, ]; diff --git a/composer.json b/composer.json index e4ea6123..063e895a 100644 --- a/composer.json +++ b/composer.json @@ -49,7 +49,8 @@ "openai-php/client": "^0.10.1", "phpunit/php-code-coverage": "^11.0", "phpunit/phpunit": "^11.0", - "spatie/laravel-ray": "^1.12" + "spatie/laravel-ray": "^1.12", + "spatie/x-ray": "^1.2" }, "autoload": { "psr-4": { diff --git a/composer.lock b/composer.lock index a7521ac8..e2913194 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "cd963bfd9cfb41beb4151e73ae98dc98", + "content-hash": "1076b46fccbfe2c22f51fa6e904cfedf", "packages": [ { "name": "aws/aws-crt-php", @@ -62,16 +62,16 @@ }, { "name": "aws/aws-sdk-php", - "version": "3.342.18", + "version": "3.348.2", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "e6c81bf323b082f8fe2b76d8d41e2614806d5892" + "reference": "6acc8e4f8b7468e604d6f0442284937398c2959a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/e6c81bf323b082f8fe2b76d8d41e2614806d5892", - "reference": "e6c81bf323b082f8fe2b76d8d41e2614806d5892", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/6acc8e4f8b7468e604d6f0442284937398c2959a", + "reference": "6acc8e4f8b7468e604d6f0442284937398c2959a", "shasum": "" }, "require": { @@ -153,22 +153,22 @@ "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.342.18" + "source": "https://github.com/aws/aws-sdk-php/tree/3.348.2" }, - "time": "2025-04-01T18:15:02+00:00" + "time": "2025-06-30T18:12:03+00:00" }, { "name": "brick/math", - "version": "0.12.3", + "version": "0.13.1", "source": { "type": "git", "url": "https://github.com/brick/math.git", - "reference": "866551da34e9a618e64a819ee1e01c20d8a588ba" + "reference": "fc7ed316430118cc7836bf45faff18d5dfc8de04" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/brick/math/zipball/866551da34e9a618e64a819ee1e01c20d8a588ba", - "reference": "866551da34e9a618e64a819ee1e01c20d8a588ba", + "url": "https://api.github.com/repos/brick/math/zipball/fc7ed316430118cc7836bf45faff18d5dfc8de04", + "reference": "fc7ed316430118cc7836bf45faff18d5dfc8de04", "shasum": "" }, "require": { @@ -207,7 +207,7 @@ ], "support": { "issues": "https://github.com/brick/math/issues", - "source": "https://github.com/brick/math/tree/0.12.3" + "source": "https://github.com/brick/math/tree/0.13.1" }, "funding": [ { @@ -215,7 +215,7 @@ "type": "github" } ], - "time": "2025-02-28T13:11:00+00:00" + "time": "2025-03-29T13:50:30+00:00" }, { "name": "carbonphp/carbon-doctrine-types", @@ -661,26 +661,29 @@ }, { "name": "doctrine/deprecations", - "version": "1.1.4", + "version": "1.1.5", "source": { "type": "git", "url": "https://github.com/doctrine/deprecations.git", - "reference": "31610dbb31faa98e6b5447b62340826f54fbc4e9" + "reference": "459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/deprecations/zipball/31610dbb31faa98e6b5447b62340826f54fbc4e9", - "reference": "31610dbb31faa98e6b5447b62340826f54fbc4e9", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38", + "reference": "459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38", "shasum": "" }, "require": { "php": "^7.1 || ^8.0" }, + "conflict": { + "phpunit/phpunit": "<=7.5 || >=13" + }, "require-dev": { - "doctrine/coding-standard": "^9 || ^12", - "phpstan/phpstan": "1.4.10 || 2.0.3", + "doctrine/coding-standard": "^9 || ^12 || ^13", + "phpstan/phpstan": "1.4.10 || 2.1.11", "phpstan/phpstan-phpunit": "^1.0 || ^2", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6 || ^10.5 || ^11.5 || ^12", "psr/log": "^1 || ^2 || ^3" }, "suggest": { @@ -700,9 +703,9 @@ "homepage": "https://www.doctrine-project.org/", "support": { "issues": "https://github.com/doctrine/deprecations/issues", - "source": "https://github.com/doctrine/deprecations/tree/1.1.4" + "source": "https://github.com/doctrine/deprecations/tree/1.1.5" }, - "time": "2024-12-07T21:18:45+00:00" + "time": "2025-04-07T20:06:18+00:00" }, { "name": "doctrine/inflector", @@ -1769,16 +1772,16 @@ }, { "name": "intervention/image", - "version": "3.11.2", + "version": "3.11.3", "source": { "type": "git", "url": "https://github.com/Intervention/image.git", - "reference": "ebbb711871fb261c064cf4c422f5f3c124fe1842" + "reference": "d0f097b8a3fa8fb758efc9440b513aa3833cda17" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Intervention/image/zipball/ebbb711871fb261c064cf4c422f5f3c124fe1842", - "reference": "ebbb711871fb261c064cf4c422f5f3c124fe1842", + "url": "https://api.github.com/repos/Intervention/image/zipball/d0f097b8a3fa8fb758efc9440b513aa3833cda17", + "reference": "d0f097b8a3fa8fb758efc9440b513aa3833cda17", "shasum": "" }, "require": { @@ -1825,7 +1828,7 @@ ], "support": { "issues": "https://github.com/Intervention/image/issues", - "source": "https://github.com/Intervention/image/tree/3.11.2" + "source": "https://github.com/Intervention/image/tree/3.11.3" }, "funding": [ { @@ -1841,7 +1844,7 @@ "type": "ko_fi" } ], - "time": "2025-02-27T13:08:55+00:00" + "time": "2025-05-22T17:26:23+00:00" }, { "name": "jonnybarnes/indieweb", @@ -2010,20 +2013,20 @@ }, { "name": "laravel/framework", - "version": "v12.5.0", + "version": "v12.19.3", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "0ab4791b2c5f405f8728e4481265599803564c02" + "reference": "4e6ec689ef704bb4bd282f29d9dd658dfb4fb262" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/0ab4791b2c5f405f8728e4481265599803564c02", - "reference": "0ab4791b2c5f405f8728e4481265599803564c02", + "url": "https://api.github.com/repos/laravel/framework/zipball/4e6ec689ef704bb4bd282f29d9dd658dfb4fb262", + "reference": "4e6ec689ef704bb4bd282f29d9dd658dfb4fb262", "shasum": "" }, "require": { - "brick/math": "^0.11|^0.12", + "brick/math": "^0.11|^0.12|^0.13", "composer-runtime-api": "^2.2", "doctrine/inflector": "^2.0.5", "dragonmantank/cron-expression": "^3.4", @@ -2040,7 +2043,7 @@ "guzzlehttp/uri-template": "^1.0", "laravel/prompts": "^0.3.0", "laravel/serializable-closure": "^1.3|^2.0", - "league/commonmark": "^2.6", + "league/commonmark": "^2.7", "league/flysystem": "^3.25.1", "league/flysystem-local": "^3.25.1", "league/uri": "^7.5.1", @@ -2128,11 +2131,11 @@ "league/flysystem-sftp-v3": "^3.25.1", "mockery/mockery": "^1.6.10", "orchestra/testbench-core": "^10.0.0", - "pda/pheanstalk": "^5.0.6", + "pda/pheanstalk": "^5.0.6|^7.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", + "predis/predis": "^2.3|^3.0", "resend/resend-php": "^0.10.0", "symfony/cache": "^7.2.0", "symfony/http-client": "^7.2.0", @@ -2164,7 +2167,7 @@ "pda/pheanstalk": "Required to use the beanstalk queue driver (^5.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).", + "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).", @@ -2221,20 +2224,20 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2025-04-01T14:40:42+00:00" + "time": "2025-06-18T12:56:23+00:00" }, { "name": "laravel/horizon", - "version": "v5.31.1", + "version": "v5.33.1", "source": { "type": "git", "url": "https://github.com/laravel/horizon.git", - "reference": "bc98b63313b2e0a3d0c8e84e1b691388ef1bf653" + "reference": "50057bca1f1dcc9fbd5ff6d65143833babd784b3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/horizon/zipball/bc98b63313b2e0a3d0c8e84e1b691388ef1bf653", - "reference": "bc98b63313b2e0a3d0c8e84e1b691388ef1bf653", + "url": "https://api.github.com/repos/laravel/horizon/zipball/50057bca1f1dcc9fbd5ff6d65143833babd784b3", + "reference": "50057bca1f1dcc9fbd5ff6d65143833babd784b3", "shasum": "" }, "require": { @@ -2274,7 +2277,7 @@ ] }, "branch-alias": { - "dev-master": "5.x-dev" + "dev-master": "6.x-dev" } }, "autoload": { @@ -2299,9 +2302,9 @@ ], "support": { "issues": "https://github.com/laravel/horizon/issues", - "source": "https://github.com/laravel/horizon/tree/v5.31.1" + "source": "https://github.com/laravel/horizon/tree/v5.33.1" }, - "time": "2025-03-16T23:48:25+00:00" + "time": "2025-06-16T13:48:30+00:00" }, { "name": "laravel/prompts", @@ -2364,16 +2367,16 @@ }, { "name": "laravel/sanctum", - "version": "v4.0.8", + "version": "v4.1.1", "source": { "type": "git", "url": "https://github.com/laravel/sanctum.git", - "reference": "ec1dd9ddb2ab370f79dfe724a101856e0963f43c" + "reference": "a360a6a1fd2400ead4eb9b6a9c1bb272939194f5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/sanctum/zipball/ec1dd9ddb2ab370f79dfe724a101856e0963f43c", - "reference": "ec1dd9ddb2ab370f79dfe724a101856e0963f43c", + "url": "https://api.github.com/repos/laravel/sanctum/zipball/a360a6a1fd2400ead4eb9b6a9c1bb272939194f5", + "reference": "a360a6a1fd2400ead4eb9b6a9c1bb272939194f5", "shasum": "" }, "require": { @@ -2424,20 +2427,20 @@ "issues": "https://github.com/laravel/sanctum/issues", "source": "https://github.com/laravel/sanctum" }, - "time": "2025-01-26T19:34:36+00:00" + "time": "2025-04-23T13:03:38+00:00" }, { "name": "laravel/scout", - "version": "v10.14.1", + "version": "v10.15.0", "source": { "type": "git", "url": "https://github.com/laravel/scout.git", - "reference": "6ae3ec83ceacb554f395df9fe15318a14b79bb39" + "reference": "102fe09ae1c045c6f9cf1b3a2234e1fadb2198f2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/scout/zipball/6ae3ec83ceacb554f395df9fe15318a14b79bb39", - "reference": "6ae3ec83ceacb554f395df9fe15318a14b79bb39", + "url": "https://api.github.com/repos/laravel/scout/zipball/102fe09ae1c045c6f9cf1b3a2234e1fadb2198f2", + "reference": "102fe09ae1c045c6f9cf1b3a2234e1fadb2198f2", "shasum": "" }, "require": { @@ -2505,7 +2508,7 @@ "issues": "https://github.com/laravel/scout/issues", "source": "https://github.com/laravel/scout" }, - "time": "2025-04-01T14:58:03+00:00" + "time": "2025-05-13T13:34:05+00:00" }, { "name": "laravel/serializable-closure", @@ -2709,16 +2712,16 @@ }, { "name": "league/commonmark", - "version": "2.6.1", + "version": "2.7.0", "source": { "type": "git", "url": "https://github.com/thephpleague/commonmark.git", - "reference": "d990688c91cedfb69753ffc2512727ec646df2ad" + "reference": "6fbb36d44824ed4091adbcf4c7d4a3923cdb3405" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/d990688c91cedfb69753ffc2512727ec646df2ad", - "reference": "d990688c91cedfb69753ffc2512727ec646df2ad", + "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/6fbb36d44824ed4091adbcf4c7d4a3923cdb3405", + "reference": "6fbb36d44824ed4091adbcf4c7d4a3923cdb3405", "shasum": "" }, "require": { @@ -2755,7 +2758,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "2.7-dev" + "dev-main": "2.8-dev" } }, "autoload": { @@ -2812,7 +2815,7 @@ "type": "tidelift" } ], - "time": "2024-12-29T14:10:59+00:00" + "time": "2025-05-05T12:20:28+00:00" }, { "name": "league/config", @@ -2898,16 +2901,16 @@ }, { "name": "league/flysystem", - "version": "3.29.1", + "version": "3.30.0", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem.git", - "reference": "edc1bb7c86fab0776c3287dbd19b5fa278347319" + "reference": "2203e3151755d874bb2943649dae1eb8533ac93e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/edc1bb7c86fab0776c3287dbd19b5fa278347319", - "reference": "edc1bb7c86fab0776c3287dbd19b5fa278347319", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/2203e3151755d874bb2943649dae1eb8533ac93e", + "reference": "2203e3151755d874bb2943649dae1eb8533ac93e", "shasum": "" }, "require": { @@ -2931,13 +2934,13 @@ "composer/semver": "^3.0", "ext-fileinfo": "*", "ext-ftp": "*", - "ext-mongodb": "^1.3", + "ext-mongodb": "^1.3|^2", "ext-zip": "*", "friendsofphp/php-cs-fixer": "^3.5", "google/cloud-storage": "^1.23", "guzzlehttp/psr7": "^2.6", "microsoft/azure-storage-blob": "^1.1", - "mongodb/mongodb": "^1.2", + "mongodb/mongodb": "^1.2|^2", "phpseclib/phpseclib": "^3.0.36", "phpstan/phpstan": "^1.10", "phpunit/phpunit": "^9.5.11|^10.0", @@ -2975,9 +2978,9 @@ ], "support": { "issues": "https://github.com/thephpleague/flysystem/issues", - "source": "https://github.com/thephpleague/flysystem/tree/3.29.1" + "source": "https://github.com/thephpleague/flysystem/tree/3.30.0" }, - "time": "2024-10-08T08:58:34+00:00" + "time": "2025-06-25T13:29:59+00:00" }, { "name": "league/flysystem-aws-s3-v3", @@ -3036,16 +3039,16 @@ }, { "name": "league/flysystem-local", - "version": "3.29.0", + "version": "3.30.0", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem-local.git", - "reference": "e0e8d52ce4b2ed154148453d321e97c8e931bd27" + "reference": "6691915f77c7fb69adfb87dcd550052dc184ee10" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/e0e8d52ce4b2ed154148453d321e97c8e931bd27", - "reference": "e0e8d52ce4b2ed154148453d321e97c8e931bd27", + "url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/6691915f77c7fb69adfb87dcd550052dc184ee10", + "reference": "6691915f77c7fb69adfb87dcd550052dc184ee10", "shasum": "" }, "require": { @@ -3079,9 +3082,9 @@ "local" ], "support": { - "source": "https://github.com/thephpleague/flysystem-local/tree/3.29.0" + "source": "https://github.com/thephpleague/flysystem-local/tree/3.30.0" }, - "time": "2024-08-09T21:24:39+00:00" + "time": "2025-05-21T10:34:19+00:00" }, { "name": "league/mime-type-detection", @@ -3613,16 +3616,16 @@ }, { "name": "nesbot/carbon", - "version": "3.8.6", + "version": "3.10.1", "source": { "type": "git", "url": "https://github.com/CarbonPHP/carbon.git", - "reference": "ff2f20cf83bd4d503720632ce8a426dc747bf7fd" + "reference": "1fd1935b2d90aef2f093c5e35f7ae1257c448d00" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/ff2f20cf83bd4d503720632ce8a426dc747bf7fd", - "reference": "ff2f20cf83bd4d503720632ce8a426dc747bf7fd", + "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/1fd1935b2d90aef2f093c5e35f7ae1257c448d00", + "reference": "1fd1935b2d90aef2f093c5e35f7ae1257c448d00", "shasum": "" }, "require": { @@ -3630,9 +3633,9 @@ "ext-json": "*", "php": "^8.1", "psr/clock": "^1.0", - "symfony/clock": "^6.3 || ^7.0", + "symfony/clock": "^6.3.12 || ^7.0", "symfony/polyfill-mbstring": "^1.0", - "symfony/translation": "^4.4.18 || ^5.2.1|| ^6.0 || ^7.0" + "symfony/translation": "^4.4.18 || ^5.2.1 || ^6.0 || ^7.0" }, "provide": { "psr/clock-implementation": "1.0" @@ -3640,14 +3643,13 @@ "require-dev": { "doctrine/dbal": "^3.6.3 || ^4.0", "doctrine/orm": "^2.15.2 || ^3.0", - "friendsofphp/php-cs-fixer": "^3.57.2", + "friendsofphp/php-cs-fixer": "^3.75.0", "kylekatarnls/multi-tester": "^2.5.3", - "ondrejmirtes/better-reflection": "^6.25.0.4", "phpmd/phpmd": "^2.15.0", - "phpstan/extension-installer": "^1.3.1", - "phpstan/phpstan": "^1.11.2", - "phpunit/phpunit": "^10.5.20", - "squizlabs/php_codesniffer": "^3.9.0" + "phpstan/extension-installer": "^1.4.3", + "phpstan/phpstan": "^2.1.17", + "phpunit/phpunit": "^10.5.46", + "squizlabs/php_codesniffer": "^3.13.0" }, "bin": [ "bin/carbon" @@ -3715,7 +3717,7 @@ "type": "tidelift" } ], - "time": "2025-02-20T17:33:38+00:00" + "time": "2025-06-21T15:19:35+00:00" }, { "name": "nette/schema", @@ -3781,16 +3783,16 @@ }, { "name": "nette/utils", - "version": "v4.0.6", + "version": "v4.0.7", "source": { "type": "git", "url": "https://github.com/nette/utils.git", - "reference": "ce708655043c7050eb050df361c5e313cf708309" + "reference": "e67c4061eb40b9c113b218214e42cb5a0dda28f2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nette/utils/zipball/ce708655043c7050eb050df361c5e313cf708309", - "reference": "ce708655043c7050eb050df361c5e313cf708309", + "url": "https://api.github.com/repos/nette/utils/zipball/e67c4061eb40b9c113b218214e42cb5a0dda28f2", + "reference": "e67c4061eb40b9c113b218214e42cb5a0dda28f2", "shasum": "" }, "require": { @@ -3861,22 +3863,22 @@ ], "support": { "issues": "https://github.com/nette/utils/issues", - "source": "https://github.com/nette/utils/tree/v4.0.6" + "source": "https://github.com/nette/utils/tree/v4.0.7" }, - "time": "2025-03-30T21:06:30+00:00" + "time": "2025-06-03T04:55:08+00:00" }, { "name": "nikic/php-parser", - "version": "v5.4.0", + "version": "v5.5.0", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "447a020a1f875a434d62f2a401f53b82a396e494" + "reference": "ae59794362fe85e051a58ad36b289443f57be7a9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/447a020a1f875a434d62f2a401f53b82a396e494", - "reference": "447a020a1f875a434d62f2a401f53b82a396e494", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/ae59794362fe85e051a58ad36b289443f57be7a9", + "reference": "ae59794362fe85e051a58ad36b289443f57be7a9", "shasum": "" }, "require": { @@ -3919,37 +3921,37 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v5.4.0" + "source": "https://github.com/nikic/PHP-Parser/tree/v5.5.0" }, - "time": "2024-12-30T11:07:19+00:00" + "time": "2025-05-31T08:24:38+00:00" }, { "name": "nunomaduro/termwind", - "version": "v2.3.0", + "version": "v2.3.1", "source": { "type": "git", "url": "https://github.com/nunomaduro/termwind.git", - "reference": "52915afe6a1044e8b9cee1bcff836fb63acf9cda" + "reference": "dfa08f390e509967a15c22493dc0bac5733d9123" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nunomaduro/termwind/zipball/52915afe6a1044e8b9cee1bcff836fb63acf9cda", - "reference": "52915afe6a1044e8b9cee1bcff836fb63acf9cda", + "url": "https://api.github.com/repos/nunomaduro/termwind/zipball/dfa08f390e509967a15c22493dc0bac5733d9123", + "reference": "dfa08f390e509967a15c22493dc0bac5733d9123", "shasum": "" }, "require": { "ext-mbstring": "*", "php": "^8.2", - "symfony/console": "^7.1.8" + "symfony/console": "^7.2.6" }, "require-dev": { - "illuminate/console": "^11.33.2", - "laravel/pint": "^1.18.2", + "illuminate/console": "^11.44.7", + "laravel/pint": "^1.22.0", "mockery/mockery": "^1.6.12", - "pestphp/pest": "^2.36.0", - "phpstan/phpstan": "^1.12.11", - "phpstan/phpstan-strict-rules": "^1.6.1", - "symfony/var-dumper": "^7.1.8", + "pestphp/pest": "^2.36.0 || ^3.8.2", + "phpstan/phpstan": "^1.12.25", + "phpstan/phpstan-strict-rules": "^1.6.2", + "symfony/var-dumper": "^7.2.6", "thecodingmachine/phpstan-strict-rules": "^1.0.0" }, "type": "library", @@ -3992,7 +3994,7 @@ ], "support": { "issues": "https://github.com/nunomaduro/termwind/issues", - "source": "https://github.com/nunomaduro/termwind/tree/v2.3.0" + "source": "https://github.com/nunomaduro/termwind/tree/v2.3.1" }, "funding": [ { @@ -4008,7 +4010,7 @@ "type": "github" } ], - "time": "2024-11-21T10:39:51+00:00" + "time": "2025-05-08T08:14:37+00:00" }, { "name": "p3k/http", @@ -4174,16 +4176,16 @@ }, { "name": "phpdocumentor/reflection-docblock", - "version": "5.6.1", + "version": "5.6.2", "source": { "type": "git", "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "e5e784149a09bd69d9a5e3b01c5cbd2e2bd653d8" + "reference": "92dde6a5919e34835c506ac8c523ef095a95ed62" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/e5e784149a09bd69d9a5e3b01c5cbd2e2bd653d8", - "reference": "e5e784149a09bd69d9a5e3b01c5cbd2e2bd653d8", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/92dde6a5919e34835c506ac8c523ef095a95ed62", + "reference": "92dde6a5919e34835c506ac8c523ef095a95ed62", "shasum": "" }, "require": { @@ -4232,9 +4234,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/5.6.1" + "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.6.2" }, - "time": "2024-12-07T09:39:29+00:00" + "time": "2025-04-13T19:20:35+00:00" }, { "name": "phpdocumentor/type-resolver", @@ -4830,16 +4832,16 @@ }, { "name": "psy/psysh", - "version": "v0.12.8", + "version": "v0.12.9", "source": { "type": "git", "url": "https://github.com/bobthecow/psysh.git", - "reference": "85057ceedee50c49d4f6ecaff73ee96adb3b3625" + "reference": "1b801844becfe648985372cb4b12ad6840245ace" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/bobthecow/psysh/zipball/85057ceedee50c49d4f6ecaff73ee96adb3b3625", - "reference": "85057ceedee50c49d4f6ecaff73ee96adb3b3625", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/1b801844becfe648985372cb4b12ad6840245ace", + "reference": "1b801844becfe648985372cb4b12ad6840245ace", "shasum": "" }, "require": { @@ -4903,9 +4905,9 @@ ], "support": { "issues": "https://github.com/bobthecow/psysh/issues", - "source": "https://github.com/bobthecow/psysh/tree/v0.12.8" + "source": "https://github.com/bobthecow/psysh/tree/v0.12.9" }, - "time": "2025-03-16T03:05:19+00:00" + "time": "2025-06-23T02:35:06+00:00" }, { "name": "ralouphie/getallheaders", @@ -5029,21 +5031,20 @@ }, { "name": "ramsey/uuid", - "version": "4.7.6", + "version": "4.9.0", "source": { "type": "git", "url": "https://github.com/ramsey/uuid.git", - "reference": "91039bc1faa45ba123c4328958e620d382ec7088" + "reference": "4e0e23cc785f0724a0e838279a9eb03f28b092a0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ramsey/uuid/zipball/91039bc1faa45ba123c4328958e620d382ec7088", - "reference": "91039bc1faa45ba123c4328958e620d382ec7088", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/4e0e23cc785f0724a0e838279a9eb03f28b092a0", + "reference": "4e0e23cc785f0724a0e838279a9eb03f28b092a0", "shasum": "" }, "require": { - "brick/math": "^0.8.8 || ^0.9 || ^0.10 || ^0.11 || ^0.12", - "ext-json": "*", + "brick/math": "^0.8.8 || ^0.9 || ^0.10 || ^0.11 || ^0.12 || ^0.13", "php": "^8.0", "ramsey/collection": "^1.2 || ^2.0" }, @@ -5051,26 +5052,23 @@ "rhumsaa/uuid": "self.version" }, "require-dev": { - "captainhook/captainhook": "^5.10", + "captainhook/captainhook": "^5.25", "captainhook/plugin-composer": "^5.3", - "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", - "doctrine/annotations": "^1.8", - "ergebnis/composer-normalize": "^2.15", - "mockery/mockery": "^1.3", + "dealerdirect/phpcodesniffer-composer-installer": "^1.0", + "ergebnis/composer-normalize": "^2.47", + "mockery/mockery": "^1.6", "paragonie/random-lib": "^2", - "php-mock/php-mock": "^2.2", - "php-mock/php-mock-mockery": "^1.3", - "php-parallel-lint/php-parallel-lint": "^1.1", - "phpbench/phpbench": "^1.0", - "phpstan/extension-installer": "^1.1", - "phpstan/phpstan": "^1.8", - "phpstan/phpstan-mockery": "^1.1", - "phpstan/phpstan-phpunit": "^1.1", - "phpunit/phpunit": "^8.5 || ^9", - "ramsey/composer-repl": "^1.4", - "slevomat/coding-standard": "^8.4", - "squizlabs/php_codesniffer": "^3.5", - "vimeo/psalm": "^4.9" + "php-mock/php-mock": "^2.6", + "php-mock/php-mock-mockery": "^1.5", + "php-parallel-lint/php-parallel-lint": "^1.4.0", + "phpbench/phpbench": "^1.2.14", + "phpstan/extension-installer": "^1.4", + "phpstan/phpstan": "^2.1", + "phpstan/phpstan-mockery": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpunit/phpunit": "^9.6", + "slevomat/coding-standard": "^8.18", + "squizlabs/php_codesniffer": "^3.13" }, "suggest": { "ext-bcmath": "Enables faster math with arbitrary-precision integers using BCMath.", @@ -5105,19 +5103,9 @@ ], "support": { "issues": "https://github.com/ramsey/uuid/issues", - "source": "https://github.com/ramsey/uuid/tree/4.7.6" + "source": "https://github.com/ramsey/uuid/tree/4.9.0" }, - "funding": [ - { - "url": "https://github.com/ramsey", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/ramsey/uuid", - "type": "tidelift" - } - ], - "time": "2024-04-27T21:32:50+00:00" + "time": "2025-06-25T14:20:11+00:00" }, { "name": "scrivo/highlight.php", @@ -5199,16 +5187,16 @@ }, { "name": "spatie/backtrace", - "version": "1.7.1", + "version": "1.7.4", "source": { "type": "git", "url": "https://github.com/spatie/backtrace.git", - "reference": "0f2477c520e3729de58e061b8192f161c99f770b" + "reference": "cd37a49fce7137359ac30ecc44ef3e16404cccbe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/backtrace/zipball/0f2477c520e3729de58e061b8192f161c99f770b", - "reference": "0f2477c520e3729de58e061b8192f161c99f770b", + "url": "https://api.github.com/repos/spatie/backtrace/zipball/cd37a49fce7137359ac30ecc44ef3e16404cccbe", + "reference": "cd37a49fce7137359ac30ecc44ef3e16404cccbe", "shasum": "" }, "require": { @@ -5246,7 +5234,7 @@ "spatie" ], "support": { - "source": "https://github.com/spatie/backtrace/tree/1.7.1" + "source": "https://github.com/spatie/backtrace/tree/1.7.4" }, "funding": [ { @@ -5258,7 +5246,7 @@ "type": "other" } ], - "time": "2024-12-02T13:28:15+00:00" + "time": "2025-05-08T15:41:09+00:00" }, { "name": "spatie/commonmark-highlighter", @@ -5633,37 +5621,37 @@ }, { "name": "spomky-labs/cbor-php", - "version": "3.1.0", + "version": "3.1.1", "source": { "type": "git", "url": "https://github.com/Spomky-Labs/cbor-php.git", - "reference": "499d9bff0a6d59c4f1b813cc617fc3fd56d6dca4" + "reference": "5404f3e21cbe72f5cf612aa23db2b922fd2f43bf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Spomky-Labs/cbor-php/zipball/499d9bff0a6d59c4f1b813cc617fc3fd56d6dca4", - "reference": "499d9bff0a6d59c4f1b813cc617fc3fd56d6dca4", + "url": "https://api.github.com/repos/Spomky-Labs/cbor-php/zipball/5404f3e21cbe72f5cf612aa23db2b922fd2f43bf", + "reference": "5404f3e21cbe72f5cf612aa23db2b922fd2f43bf", "shasum": "" }, "require": { - "brick/math": "^0.9|^0.10|^0.11|^0.12", + "brick/math": "^0.9|^0.10|^0.11|^0.12|^0.13", "ext-mbstring": "*", "php": ">=8.0" }, "require-dev": { - "ekino/phpstan-banned-code": "^1.0", + "deptrac/deptrac": "^3.0", + "ekino/phpstan-banned-code": "^1.0|^2.0|^3.0", "ext-json": "*", "infection/infection": "^0.29", "php-parallel-lint/php-parallel-lint": "^1.3", "phpstan/extension-installer": "^1.1", - "phpstan/phpstan": "^1.0", - "phpstan/phpstan-beberlei-assert": "^1.0", - "phpstan/phpstan-deprecation-rules": "^1.0", - "phpstan/phpstan-phpunit": "^1.0", - "phpstan/phpstan-strict-rules": "^1.0", - "phpunit/phpunit": "^10.1|^11.0", - "qossmic/deptrac": "^2.0", - "rector/rector": "^1.0", + "phpstan/phpstan": "^1.0|^2.0", + "phpstan/phpstan-beberlei-assert": "^1.0|^2.0", + "phpstan/phpstan-deprecation-rules": "^1.0|^2.0", + "phpstan/phpstan-phpunit": "^1.0|^2.0", + "phpstan/phpstan-strict-rules": "^1.0|^2.0", + "phpunit/phpunit": "^10.1|^11.0|^12.0", + "rector/rector": "^1.0|^2.0", "roave/security-advisories": "dev-latest", "symfony/var-dumper": "^6.0|^7.0", "symplify/easy-coding-standard": "^12.0" @@ -5700,7 +5688,7 @@ ], "support": { "issues": "https://github.com/Spomky-Labs/cbor-php/issues", - "source": "https://github.com/Spomky-Labs/cbor-php/tree/3.1.0" + "source": "https://github.com/Spomky-Labs/cbor-php/tree/3.1.1" }, "funding": [ { @@ -5712,24 +5700,24 @@ "type": "patreon" } ], - "time": "2024-07-18T08:37:03+00:00" + "time": "2025-06-13T11:57:55+00:00" }, { "name": "spomky-labs/pki-framework", - "version": "1.2.2", + "version": "1.3.0", "source": { "type": "git", "url": "https://github.com/Spomky-Labs/pki-framework.git", - "reference": "5ac374c3e295c8b917208ff41b4d30f76668478c" + "reference": "eced5b5ce70518b983ff2be486e902bbd15135ae" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Spomky-Labs/pki-framework/zipball/5ac374c3e295c8b917208ff41b4d30f76668478c", - "reference": "5ac374c3e295c8b917208ff41b4d30f76668478c", + "url": "https://api.github.com/repos/Spomky-Labs/pki-framework/zipball/eced5b5ce70518b983ff2be486e902bbd15135ae", + "reference": "eced5b5ce70518b983ff2be486e902bbd15135ae", "shasum": "" }, "require": { - "brick/math": "^0.10|^0.11|^0.12", + "brick/math": "^0.10|^0.11|^0.12|^0.13", "ext-mbstring": "*", "php": ">=8.1" }, @@ -5744,7 +5732,7 @@ "phpstan/phpstan-deprecation-rules": "^1.0|^2.0", "phpstan/phpstan-phpunit": "^1.1|^2.0", "phpstan/phpstan-strict-rules": "^1.3|^2.0", - "phpunit/phpunit": "^10.1|^11.0", + "phpunit/phpunit": "^10.1|^11.0|^12.0", "rector/rector": "^1.0|^2.0", "roave/security-advisories": "dev-latest", "symfony/string": "^6.4|^7.0", @@ -5809,7 +5797,7 @@ ], "support": { "issues": "https://github.com/Spomky-Labs/pki-framework/issues", - "source": "https://github.com/Spomky-Labs/pki-framework/tree/1.2.2" + "source": "https://github.com/Spomky-Labs/pki-framework/tree/1.3.0" }, "funding": [ { @@ -5821,11 +5809,11 @@ "type": "patreon" } ], - "time": "2025-01-03T09:35:48+00:00" + "time": "2025-06-13T08:35:04+00:00" }, { "name": "symfony/clock", - "version": "v7.2.0", + "version": "v7.3.0", "source": { "type": "git", "url": "https://github.com/symfony/clock.git", @@ -5879,7 +5867,7 @@ "time" ], "support": { - "source": "https://github.com/symfony/clock/tree/v7.2.0" + "source": "https://github.com/symfony/clock/tree/v7.3.0" }, "funding": [ { @@ -5899,23 +5887,24 @@ }, { "name": "symfony/console", - "version": "v7.2.5", + "version": "v7.3.1", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "e51498ea18570c062e7df29d05a7003585b19b88" + "reference": "9e27aecde8f506ba0fd1d9989620c04a87697101" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/e51498ea18570c062e7df29d05a7003585b19b88", - "reference": "e51498ea18570c062e7df29d05a7003585b19b88", + "url": "https://api.github.com/repos/symfony/console/zipball/9e27aecde8f506ba0fd1d9989620c04a87697101", + "reference": "9e27aecde8f506ba0fd1d9989620c04a87697101", "shasum": "" }, "require": { "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-mbstring": "~1.0", "symfony/service-contracts": "^2.5|^3", - "symfony/string": "^6.4|^7.0" + "symfony/string": "^7.2" }, "conflict": { "symfony/dependency-injection": "<6.4", @@ -5972,7 +5961,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v7.2.5" + "source": "https://github.com/symfony/console/tree/v7.3.1" }, "funding": [ { @@ -5988,11 +5977,11 @@ "type": "tidelift" } ], - "time": "2025-03-12T08:11:12+00:00" + "time": "2025-06-27T19:55:54+00:00" }, { "name": "symfony/css-selector", - "version": "v7.2.0", + "version": "v7.3.0", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", @@ -6037,7 +6026,7 @@ "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/css-selector/tree/v7.2.0" + "source": "https://github.com/symfony/css-selector/tree/v7.3.0" }, "funding": [ { @@ -6057,16 +6046,16 @@ }, { "name": "symfony/deprecation-contracts", - "version": "v3.5.1", + "version": "v3.6.0", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6" + "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6", - "reference": "74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/63afe740e99a13ba87ec199bb07bbdee937a5b62", + "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62", "shasum": "" }, "require": { @@ -6079,7 +6068,7 @@ "name": "symfony/contracts" }, "branch-alias": { - "dev-main": "3.5-dev" + "dev-main": "3.6-dev" } }, "autoload": { @@ -6104,7 +6093,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.5.1" + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.6.0" }, "funding": [ { @@ -6120,20 +6109,20 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:20:29+00:00" + "time": "2024-09-25T14:21:43+00:00" }, { "name": "symfony/error-handler", - "version": "v7.2.5", + "version": "v7.3.1", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "102be5e6a8e4f4f3eb3149bcbfa33a80d1ee374b" + "reference": "35b55b166f6752d6aaf21aa042fc5ed280fce235" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/102be5e6a8e4f4f3eb3149bcbfa33a80d1ee374b", - "reference": "102be5e6a8e4f4f3eb3149bcbfa33a80d1ee374b", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/35b55b166f6752d6aaf21aa042fc5ed280fce235", + "reference": "35b55b166f6752d6aaf21aa042fc5ed280fce235", "shasum": "" }, "require": { @@ -6146,9 +6135,11 @@ "symfony/http-kernel": "<6.4" }, "require-dev": { + "symfony/console": "^6.4|^7.0", "symfony/deprecation-contracts": "^2.5|^3", "symfony/http-kernel": "^6.4|^7.0", - "symfony/serializer": "^6.4|^7.0" + "symfony/serializer": "^6.4|^7.0", + "symfony/webpack-encore-bundle": "^1.0|^2.0" }, "bin": [ "Resources/bin/patch-type-declarations" @@ -6179,7 +6170,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.2.5" + "source": "https://github.com/symfony/error-handler/tree/v7.3.1" }, "funding": [ { @@ -6195,20 +6186,20 @@ "type": "tidelift" } ], - "time": "2025-03-03T07:12:39+00:00" + "time": "2025-06-13T07:48:40+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v7.2.0", + "version": "v7.3.0", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "910c5db85a5356d0fea57680defec4e99eb9c8c1" + "reference": "497f73ac996a598c92409b44ac43b6690c4f666d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/910c5db85a5356d0fea57680defec4e99eb9c8c1", - "reference": "910c5db85a5356d0fea57680defec4e99eb9c8c1", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/497f73ac996a598c92409b44ac43b6690c4f666d", + "reference": "497f73ac996a598c92409b44ac43b6690c4f666d", "shasum": "" }, "require": { @@ -6259,7 +6250,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.2.0" + "source": "https://github.com/symfony/event-dispatcher/tree/v7.3.0" }, "funding": [ { @@ -6275,20 +6266,20 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:21:43+00:00" + "time": "2025-04-22T09:11:45+00:00" }, { "name": "symfony/event-dispatcher-contracts", - "version": "v3.5.1", + "version": "v3.6.0", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "7642f5e970b672283b7823222ae8ef8bbc160b9f" + "reference": "59eb412e93815df44f05f342958efa9f46b1e586" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/7642f5e970b672283b7823222ae8ef8bbc160b9f", - "reference": "7642f5e970b672283b7823222ae8ef8bbc160b9f", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/59eb412e93815df44f05f342958efa9f46b1e586", + "reference": "59eb412e93815df44f05f342958efa9f46b1e586", "shasum": "" }, "require": { @@ -6302,7 +6293,7 @@ "name": "symfony/contracts" }, "branch-alias": { - "dev-main": "3.5-dev" + "dev-main": "3.6-dev" } }, "autoload": { @@ -6335,7 +6326,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.5.1" + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.6.0" }, "funding": [ { @@ -6351,20 +6342,20 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:20:29+00:00" + "time": "2024-09-25T14:21:43+00:00" }, { "name": "symfony/finder", - "version": "v7.2.2", + "version": "v7.3.0", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "87a71856f2f56e4100373e92529eed3171695cfb" + "reference": "ec2344cf77a48253bbca6939aa3d2477773ea63d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/87a71856f2f56e4100373e92529eed3171695cfb", - "reference": "87a71856f2f56e4100373e92529eed3171695cfb", + "url": "https://api.github.com/repos/symfony/finder/zipball/ec2344cf77a48253bbca6939aa3d2477773ea63d", + "reference": "ec2344cf77a48253bbca6939aa3d2477773ea63d", "shasum": "" }, "require": { @@ -6399,7 +6390,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v7.2.2" + "source": "https://github.com/symfony/finder/tree/v7.3.0" }, "funding": [ { @@ -6415,20 +6406,20 @@ "type": "tidelift" } ], - "time": "2024-12-30T19:00:17+00:00" + "time": "2024-12-30T19:00:26+00:00" }, { "name": "symfony/html-sanitizer", - "version": "v7.2.3", + "version": "v7.3.0", "source": { "type": "git", "url": "https://github.com/symfony/html-sanitizer.git", - "reference": "91443febe34cfa5e8e00425f892e6316db95bc23" + "reference": "cf21254e982b12276329940ca4af5e623ee06c58" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/html-sanitizer/zipball/91443febe34cfa5e8e00425f892e6316db95bc23", - "reference": "91443febe34cfa5e8e00425f892e6316db95bc23", + "url": "https://api.github.com/repos/symfony/html-sanitizer/zipball/cf21254e982b12276329940ca4af5e623ee06c58", + "reference": "cf21254e982b12276329940ca4af5e623ee06c58", "shasum": "" }, "require": { @@ -6468,7 +6459,7 @@ "sanitizer" ], "support": { - "source": "https://github.com/symfony/html-sanitizer/tree/v7.2.3" + "source": "https://github.com/symfony/html-sanitizer/tree/v7.3.0" }, "funding": [ { @@ -6484,20 +6475,20 @@ "type": "tidelift" } ], - "time": "2025-01-27T11:08:17+00:00" + "time": "2025-03-31T08:49:55+00:00" }, { "name": "symfony/http-foundation", - "version": "v7.2.5", + "version": "v7.3.1", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "371272aeb6286f8135e028ca535f8e4d6f114126" + "reference": "23dd60256610c86a3414575b70c596e5deff6ed9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/371272aeb6286f8135e028ca535f8e4d6f114126", - "reference": "371272aeb6286f8135e028ca535f8e4d6f114126", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/23dd60256610c86a3414575b70c596e5deff6ed9", + "reference": "23dd60256610c86a3414575b70c596e5deff6ed9", "shasum": "" }, "require": { @@ -6514,6 +6505,7 @@ "doctrine/dbal": "^3.6|^4", "predis/predis": "^1.1|^2.0", "symfony/cache": "^6.4.12|^7.1.5", + "symfony/clock": "^6.4|^7.0", "symfony/dependency-injection": "^6.4|^7.0", "symfony/expression-language": "^6.4|^7.0", "symfony/http-kernel": "^6.4|^7.0", @@ -6546,7 +6538,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.2.5" + "source": "https://github.com/symfony/http-foundation/tree/v7.3.1" }, "funding": [ { @@ -6562,20 +6554,20 @@ "type": "tidelift" } ], - "time": "2025-03-25T15:54:33+00:00" + "time": "2025-06-23T15:07:14+00:00" }, { "name": "symfony/http-kernel", - "version": "v7.2.5", + "version": "v7.3.1", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "b1fe91bc1fa454a806d3f98db4ba826eb9941a54" + "reference": "1644879a66e4aa29c36fe33dfa6c54b450ce1831" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/b1fe91bc1fa454a806d3f98db4ba826eb9941a54", - "reference": "b1fe91bc1fa454a806d3f98db4ba826eb9941a54", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/1644879a66e4aa29c36fe33dfa6c54b450ce1831", + "reference": "1644879a66e4aa29c36fe33dfa6c54b450ce1831", "shasum": "" }, "require": { @@ -6583,8 +6575,8 @@ "psr/log": "^1|^2|^3", "symfony/deprecation-contracts": "^2.5|^3", "symfony/error-handler": "^6.4|^7.0", - "symfony/event-dispatcher": "^6.4|^7.0", - "symfony/http-foundation": "^6.4|^7.0", + "symfony/event-dispatcher": "^7.3", + "symfony/http-foundation": "^7.3", "symfony/polyfill-ctype": "^1.8" }, "conflict": { @@ -6660,7 +6652,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.2.5" + "source": "https://github.com/symfony/http-kernel/tree/v7.3.1" }, "funding": [ { @@ -6676,20 +6668,20 @@ "type": "tidelift" } ], - "time": "2025-03-28T13:32:50+00:00" + "time": "2025-06-28T08:24:55+00:00" }, { "name": "symfony/mailer", - "version": "v7.2.3", + "version": "v7.3.1", "source": { "type": "git", "url": "https://github.com/symfony/mailer.git", - "reference": "f3871b182c44997cf039f3b462af4a48fb85f9d3" + "reference": "b5db5105b290bdbea5ab27b89c69effcf1cb3368" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mailer/zipball/f3871b182c44997cf039f3b462af4a48fb85f9d3", - "reference": "f3871b182c44997cf039f3b462af4a48fb85f9d3", + "url": "https://api.github.com/repos/symfony/mailer/zipball/b5db5105b290bdbea5ab27b89c69effcf1cb3368", + "reference": "b5db5105b290bdbea5ab27b89c69effcf1cb3368", "shasum": "" }, "require": { @@ -6740,7 +6732,7 @@ "description": "Helps sending emails", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/mailer/tree/v7.2.3" + "source": "https://github.com/symfony/mailer/tree/v7.3.1" }, "funding": [ { @@ -6756,20 +6748,20 @@ "type": "tidelift" } ], - "time": "2025-01-27T11:08:17+00:00" + "time": "2025-06-27T19:55:54+00:00" }, { "name": "symfony/mime", - "version": "v7.2.4", + "version": "v7.3.0", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "87ca22046b78c3feaff04b337f33b38510fd686b" + "reference": "0e7b19b2f399c31df0cdbe5d8cbf53f02f6cfcd9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/87ca22046b78c3feaff04b337f33b38510fd686b", - "reference": "87ca22046b78c3feaff04b337f33b38510fd686b", + "url": "https://api.github.com/repos/symfony/mime/zipball/0e7b19b2f399c31df0cdbe5d8cbf53f02f6cfcd9", + "reference": "0e7b19b2f399c31df0cdbe5d8cbf53f02f6cfcd9", "shasum": "" }, "require": { @@ -6824,7 +6816,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v7.2.4" + "source": "https://github.com/symfony/mime/tree/v7.3.0" }, "funding": [ { @@ -6840,11 +6832,11 @@ "type": "tidelift" } ], - "time": "2025-02-19T08:51:20+00:00" + "time": "2025-02-19T08:51:26+00:00" }, { "name": "symfony/polyfill-ctype", - "version": "v1.31.0", + "version": "v1.32.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", @@ -6903,7 +6895,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.32.0" }, "funding": [ { @@ -6923,7 +6915,7 @@ }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.31.0", + "version": "v1.32.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", @@ -6981,7 +6973,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.32.0" }, "funding": [ { @@ -7001,16 +6993,16 @@ }, { "name": "symfony/polyfill-intl-idn", - "version": "v1.31.0", + "version": "v1.32.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "c36586dcf89a12315939e00ec9b4474adcb1d773" + "reference": "9614ac4d8061dc257ecc64cba1b140873dce8ad3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/c36586dcf89a12315939e00ec9b4474adcb1d773", - "reference": "c36586dcf89a12315939e00ec9b4474adcb1d773", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/9614ac4d8061dc257ecc64cba1b140873dce8ad3", + "reference": "9614ac4d8061dc257ecc64cba1b140873dce8ad3", "shasum": "" }, "require": { @@ -7064,7 +7056,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.32.0" }, "funding": [ { @@ -7080,11 +7072,11 @@ "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2024-09-10T14:38:51+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.31.0", + "version": "v1.32.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", @@ -7145,7 +7137,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.32.0" }, "funding": [ { @@ -7165,19 +7157,20 @@ }, { "name": "symfony/polyfill-mbstring", - "version": "v1.31.0", + "version": "v1.32.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341" + "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/85181ba99b2345b0ef10ce42ecac37612d9fd341", - "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/6d857f4d76bd4b343eac26d6b539585d2bc56493", + "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493", "shasum": "" }, "require": { + "ext-iconv": "*", "php": ">=7.2" }, "provide": { @@ -7225,7 +7218,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.32.0" }, "funding": [ { @@ -7241,20 +7234,20 @@ "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2024-12-23T08:48:59+00:00" }, { "name": "symfony/polyfill-php80", - "version": "v1.31.0", + "version": "v1.32.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8" + "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", - "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/0cc9dd0f17f61d8131e7df6b84bd344899fe2608", + "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608", "shasum": "" }, "require": { @@ -7305,7 +7298,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.32.0" }, "funding": [ { @@ -7321,11 +7314,11 @@ "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2025-01-02T08:10:11+00:00" }, { "name": "symfony/polyfill-php83", - "version": "v1.31.0", + "version": "v1.32.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php83.git", @@ -7381,7 +7374,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php83/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-php83/tree/v1.32.0" }, "funding": [ { @@ -7401,7 +7394,7 @@ }, { "name": "symfony/polyfill-uuid", - "version": "v1.31.0", + "version": "v1.32.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-uuid.git", @@ -7460,7 +7453,7 @@ "uuid" ], "support": { - "source": "https://github.com/symfony/polyfill-uuid/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-uuid/tree/v1.32.0" }, "funding": [ { @@ -7480,16 +7473,16 @@ }, { "name": "symfony/process", - "version": "v7.2.5", + "version": "v7.3.0", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "87b7c93e57df9d8e39a093d32587702380ff045d" + "reference": "40c295f2deb408d5e9d2d32b8ba1dd61e36f05af" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/87b7c93e57df9d8e39a093d32587702380ff045d", - "reference": "87b7c93e57df9d8e39a093d32587702380ff045d", + "url": "https://api.github.com/repos/symfony/process/zipball/40c295f2deb408d5e9d2d32b8ba1dd61e36f05af", + "reference": "40c295f2deb408d5e9d2d32b8ba1dd61e36f05af", "shasum": "" }, "require": { @@ -7521,7 +7514,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v7.2.5" + "source": "https://github.com/symfony/process/tree/v7.3.0" }, "funding": [ { @@ -7537,20 +7530,20 @@ "type": "tidelift" } ], - "time": "2025-03-13T12:21:46+00:00" + "time": "2025-04-17T09:11:12+00:00" }, { "name": "symfony/property-access", - "version": "v7.2.3", + "version": "v7.3.1", "source": { "type": "git", "url": "https://github.com/symfony/property-access.git", - "reference": "b28732e315d81fbec787f838034de7d6c9b2b902" + "reference": "518d15c8cca726ebe665dcd7154074584cf862e8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-access/zipball/b28732e315d81fbec787f838034de7d6c9b2b902", - "reference": "b28732e315d81fbec787f838034de7d6c9b2b902", + "url": "https://api.github.com/repos/symfony/property-access/zipball/518d15c8cca726ebe665dcd7154074584cf862e8", + "reference": "518d15c8cca726ebe665dcd7154074584cf862e8", "shasum": "" }, "require": { @@ -7597,7 +7590,7 @@ "reflection" ], "support": { - "source": "https://github.com/symfony/property-access/tree/v7.2.3" + "source": "https://github.com/symfony/property-access/tree/v7.3.1" }, "funding": [ { @@ -7613,26 +7606,27 @@ "type": "tidelift" } ], - "time": "2025-01-17T10:56:55+00:00" + "time": "2025-06-24T04:04:43+00:00" }, { "name": "symfony/property-info", - "version": "v7.2.5", + "version": "v7.3.1", "source": { "type": "git", "url": "https://github.com/symfony/property-info.git", - "reference": "f00fd9685ecdbabe82ca25c7b739ce7bba99302c" + "reference": "90586acbf2a6dd13bee4f09f09111c8bd4773970" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-info/zipball/f00fd9685ecdbabe82ca25c7b739ce7bba99302c", - "reference": "f00fd9685ecdbabe82ca25c7b739ce7bba99302c", + "url": "https://api.github.com/repos/symfony/property-info/zipball/90586acbf2a6dd13bee4f09f09111c8bd4773970", + "reference": "90586acbf2a6dd13bee4f09f09111c8bd4773970", "shasum": "" }, "require": { "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/string": "^6.4|^7.0", - "symfony/type-info": "~7.1.9|^7.2.2" + "symfony/type-info": "~7.2.8|^7.3.1" }, "conflict": { "phpdocumentor/reflection-docblock": "<5.2", @@ -7682,7 +7676,7 @@ "validator" ], "support": { - "source": "https://github.com/symfony/property-info/tree/v7.2.5" + "source": "https://github.com/symfony/property-info/tree/v7.3.1" }, "funding": [ { @@ -7698,20 +7692,20 @@ "type": "tidelift" } ], - "time": "2025-03-06T16:27:19+00:00" + "time": "2025-06-27T19:55:54+00:00" }, { "name": "symfony/routing", - "version": "v7.2.3", + "version": "v7.3.0", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "ee9a67edc6baa33e5fae662f94f91fd262930996" + "reference": "8e213820c5fea844ecea29203d2a308019007c15" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/ee9a67edc6baa33e5fae662f94f91fd262930996", - "reference": "ee9a67edc6baa33e5fae662f94f91fd262930996", + "url": "https://api.github.com/repos/symfony/routing/zipball/8e213820c5fea844ecea29203d2a308019007c15", + "reference": "8e213820c5fea844ecea29203d2a308019007c15", "shasum": "" }, "require": { @@ -7763,7 +7757,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v7.2.3" + "source": "https://github.com/symfony/routing/tree/v7.3.0" }, "funding": [ { @@ -7779,20 +7773,20 @@ "type": "tidelift" } ], - "time": "2025-01-17T10:56:55+00:00" + "time": "2025-05-24T20:43:28+00:00" }, { "name": "symfony/serializer", - "version": "v7.2.5", + "version": "v7.3.1", "source": { "type": "git", "url": "https://github.com/symfony/serializer.git", - "reference": "d8b75b2c8144c29ac43b235738411f7cca6d584d" + "reference": "feaf837cedbbc8287986602223175d3fd639922d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/serializer/zipball/d8b75b2c8144c29ac43b235738411f7cca6d584d", - "reference": "d8b75b2c8144c29ac43b235738411f7cca6d584d", + "url": "https://api.github.com/repos/symfony/serializer/zipball/feaf837cedbbc8287986602223175d3fd639922d", + "reference": "feaf837cedbbc8287986602223175d3fd639922d", "shasum": "" }, "require": { @@ -7861,7 +7855,7 @@ "description": "Handles serializing and deserializing data structures, including object graphs, into array structures or other formats like XML and JSON.", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/serializer/tree/v7.2.5" + "source": "https://github.com/symfony/serializer/tree/v7.3.1" }, "funding": [ { @@ -7877,20 +7871,20 @@ "type": "tidelift" } ], - "time": "2025-03-24T12:37:32+00:00" + "time": "2025-06-27T19:55:54+00:00" }, { "name": "symfony/service-contracts", - "version": "v3.5.1", + "version": "v3.6.0", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "e53260aabf78fb3d63f8d79d69ece59f80d5eda0" + "reference": "f021b05a130d35510bd6b25fe9053c2a8a15d5d4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/e53260aabf78fb3d63f8d79d69ece59f80d5eda0", - "reference": "e53260aabf78fb3d63f8d79d69ece59f80d5eda0", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/f021b05a130d35510bd6b25fe9053c2a8a15d5d4", + "reference": "f021b05a130d35510bd6b25fe9053c2a8a15d5d4", "shasum": "" }, "require": { @@ -7908,7 +7902,7 @@ "name": "symfony/contracts" }, "branch-alias": { - "dev-main": "3.5-dev" + "dev-main": "3.6-dev" } }, "autoload": { @@ -7944,7 +7938,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v3.5.1" + "source": "https://github.com/symfony/service-contracts/tree/v3.6.0" }, "funding": [ { @@ -7960,20 +7954,20 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:20:29+00:00" + "time": "2025-04-25T09:37:31+00:00" }, { "name": "symfony/string", - "version": "v7.2.0", + "version": "v7.3.0", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "446e0d146f991dde3e73f45f2c97a9faad773c82" + "reference": "f3570b8c61ca887a9e2938e85cb6458515d2b125" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/446e0d146f991dde3e73f45f2c97a9faad773c82", - "reference": "446e0d146f991dde3e73f45f2c97a9faad773c82", + "url": "https://api.github.com/repos/symfony/string/zipball/f3570b8c61ca887a9e2938e85cb6458515d2b125", + "reference": "f3570b8c61ca887a9e2938e85cb6458515d2b125", "shasum": "" }, "require": { @@ -8031,7 +8025,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v7.2.0" + "source": "https://github.com/symfony/string/tree/v7.3.0" }, "funding": [ { @@ -8047,20 +8041,20 @@ "type": "tidelift" } ], - "time": "2024-11-13T13:31:26+00:00" + "time": "2025-04-20T20:19:01+00:00" }, { "name": "symfony/translation", - "version": "v7.2.4", + "version": "v7.3.1", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "283856e6981286cc0d800b53bd5703e8e363f05a" + "reference": "241d5ac4910d256660238a7ecf250deba4c73063" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/283856e6981286cc0d800b53bd5703e8e363f05a", - "reference": "283856e6981286cc0d800b53bd5703e8e363f05a", + "url": "https://api.github.com/repos/symfony/translation/zipball/241d5ac4910d256660238a7ecf250deba4c73063", + "reference": "241d5ac4910d256660238a7ecf250deba4c73063", "shasum": "" }, "require": { @@ -8070,6 +8064,7 @@ "symfony/translation-contracts": "^2.5|^3.0" }, "conflict": { + "nikic/php-parser": "<5.0", "symfony/config": "<6.4", "symfony/console": "<6.4", "symfony/dependency-injection": "<6.4", @@ -8083,7 +8078,7 @@ "symfony/translation-implementation": "2.3|3.0" }, "require-dev": { - "nikic/php-parser": "^4.18|^5.0", + "nikic/php-parser": "^5.0", "psr/log": "^1|^2|^3", "symfony/config": "^6.4|^7.0", "symfony/console": "^6.4|^7.0", @@ -8126,7 +8121,7 @@ "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/translation/tree/v7.2.4" + "source": "https://github.com/symfony/translation/tree/v7.3.1" }, "funding": [ { @@ -8142,20 +8137,20 @@ "type": "tidelift" } ], - "time": "2025-02-13T10:27:23+00:00" + "time": "2025-06-27T19:55:54+00:00" }, { "name": "symfony/translation-contracts", - "version": "v3.5.1", + "version": "v3.6.0", "source": { "type": "git", "url": "https://github.com/symfony/translation-contracts.git", - "reference": "4667ff3bd513750603a09c8dedbea942487fb07c" + "reference": "df210c7a2573f1913b2d17cc95f90f53a73d8f7d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/4667ff3bd513750603a09c8dedbea942487fb07c", - "reference": "4667ff3bd513750603a09c8dedbea942487fb07c", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/df210c7a2573f1913b2d17cc95f90f53a73d8f7d", + "reference": "df210c7a2573f1913b2d17cc95f90f53a73d8f7d", "shasum": "" }, "require": { @@ -8168,7 +8163,7 @@ "name": "symfony/contracts" }, "branch-alias": { - "dev-main": "3.5-dev" + "dev-main": "3.6-dev" } }, "autoload": { @@ -8204,7 +8199,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/translation-contracts/tree/v3.5.1" + "source": "https://github.com/symfony/translation-contracts/tree/v3.6.0" }, "funding": [ { @@ -8220,28 +8215,32 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:20:29+00:00" + "time": "2024-09-27T08:32:26+00:00" }, { "name": "symfony/type-info", - "version": "v7.2.5", + "version": "v7.3.1", "source": { "type": "git", "url": "https://github.com/symfony/type-info.git", - "reference": "c4824a6b658294c828e609d3d8dbb4e87f6a375d" + "reference": "5fa6e25e4195e73ce9e457b521ac5e61ec271150" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/type-info/zipball/c4824a6b658294c828e609d3d8dbb4e87f6a375d", - "reference": "c4824a6b658294c828e609d3d8dbb4e87f6a375d", + "url": "https://api.github.com/repos/symfony/type-info/zipball/5fa6e25e4195e73ce9e457b521ac5e61ec271150", + "reference": "5fa6e25e4195e73ce9e457b521ac5e61ec271150", "shasum": "" }, "require": { "php": ">=8.2", - "psr/container": "^1.1|^2.0" + "psr/container": "^1.1|^2.0", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "conflict": { + "phpstan/phpdoc-parser": "<1.30" }, "require-dev": { - "phpstan/phpdoc-parser": "^1.0|^2.0" + "phpstan/phpdoc-parser": "^1.30|^2.0" }, "type": "library", "autoload": { @@ -8279,7 +8278,7 @@ "type" ], "support": { - "source": "https://github.com/symfony/type-info/tree/v7.2.5" + "source": "https://github.com/symfony/type-info/tree/v7.3.1" }, "funding": [ { @@ -8295,20 +8294,20 @@ "type": "tidelift" } ], - "time": "2025-03-24T09:03:36+00:00" + "time": "2025-06-27T19:55:54+00:00" }, { "name": "symfony/uid", - "version": "v7.2.0", + "version": "v7.3.1", "source": { "type": "git", "url": "https://github.com/symfony/uid.git", - "reference": "2d294d0c48df244c71c105a169d0190bfb080426" + "reference": "a69f69f3159b852651a6bf45a9fdd149520525bb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/uid/zipball/2d294d0c48df244c71c105a169d0190bfb080426", - "reference": "2d294d0c48df244c71c105a169d0190bfb080426", + "url": "https://api.github.com/repos/symfony/uid/zipball/a69f69f3159b852651a6bf45a9fdd149520525bb", + "reference": "a69f69f3159b852651a6bf45a9fdd149520525bb", "shasum": "" }, "require": { @@ -8353,7 +8352,7 @@ "uuid" ], "support": { - "source": "https://github.com/symfony/uid/tree/v7.2.0" + "source": "https://github.com/symfony/uid/tree/v7.3.1" }, "funding": [ { @@ -8369,24 +8368,25 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:21:43+00:00" + "time": "2025-06-27T19:55:54+00:00" }, { "name": "symfony/var-dumper", - "version": "v7.2.3", + "version": "v7.3.1", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "82b478c69745d8878eb60f9a049a4d584996f73a" + "reference": "6e209fbe5f5a7b6043baba46fe5735a4b85d0d42" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/82b478c69745d8878eb60f9a049a4d584996f73a", - "reference": "82b478c69745d8878eb60f9a049a4d584996f73a", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/6e209fbe5f5a7b6043baba46fe5735a4b85d0d42", + "reference": "6e209fbe5f5a7b6043baba46fe5735a4b85d0d42", "shasum": "" }, "require": { "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-mbstring": "~1.0" }, "conflict": { @@ -8436,7 +8436,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v7.2.3" + "source": "https://github.com/symfony/var-dumper/tree/v7.3.1" }, "funding": [ { @@ -8452,7 +8452,7 @@ "type": "tidelift" } ], - "time": "2025-01-17T11:39:41+00:00" + "time": "2025-06-27T19:55:54+00:00" }, { "name": "tijsverkoyen/css-to-inline-styles", @@ -8511,16 +8511,16 @@ }, { "name": "vlucas/phpdotenv", - "version": "v5.6.1", + "version": "v5.6.2", "source": { "type": "git", "url": "https://github.com/vlucas/phpdotenv.git", - "reference": "a59a13791077fe3d44f90e7133eb68e7d22eaff2" + "reference": "24ac4c74f91ee2c193fa1aaa5c249cb0822809af" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/a59a13791077fe3d44f90e7133eb68e7d22eaff2", - "reference": "a59a13791077fe3d44f90e7133eb68e7d22eaff2", + "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/24ac4c74f91ee2c193fa1aaa5c249cb0822809af", + "reference": "24ac4c74f91ee2c193fa1aaa5c249cb0822809af", "shasum": "" }, "require": { @@ -8579,7 +8579,7 @@ ], "support": { "issues": "https://github.com/vlucas/phpdotenv/issues", - "source": "https://github.com/vlucas/phpdotenv/tree/v5.6.1" + "source": "https://github.com/vlucas/phpdotenv/tree/v5.6.2" }, "funding": [ { @@ -8591,7 +8591,7 @@ "type": "tidelift" } ], - "time": "2024-07-20T21:52:34+00:00" + "time": "2025-04-30T23:37:27+00:00" }, { "name": "voku/portable-ascii", @@ -8669,37 +8669,37 @@ }, { "name": "web-auth/cose-lib", - "version": "4.4.0", + "version": "4.4.1", "source": { "type": "git", "url": "https://github.com/web-auth/cose-lib.git", - "reference": "2166016e48e0214f4f63320a7758a9386d14c92a" + "reference": "b095f160a8c8fa7e53d0e36307093e34c26e7787" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/web-auth/cose-lib/zipball/2166016e48e0214f4f63320a7758a9386d14c92a", - "reference": "2166016e48e0214f4f63320a7758a9386d14c92a", + "url": "https://api.github.com/repos/web-auth/cose-lib/zipball/b095f160a8c8fa7e53d0e36307093e34c26e7787", + "reference": "b095f160a8c8fa7e53d0e36307093e34c26e7787", "shasum": "" }, "require": { - "brick/math": "^0.9|^0.10|^0.11|^0.12", + "brick/math": "^0.9|^0.10|^0.11|^0.12|^0.13", "ext-json": "*", "ext-openssl": "*", "php": ">=8.1", "spomky-labs/pki-framework": "^1.0" }, "require-dev": { - "ekino/phpstan-banned-code": "^1.0", + "deptrac/deptrac": "^3.0", + "ekino/phpstan-banned-code": "^1.0|^2.0|^3.0", "infection/infection": "^0.29", "php-parallel-lint/php-parallel-lint": "^1.3", "phpstan/extension-installer": "^1.3", - "phpstan/phpstan": "^1.7", - "phpstan/phpstan-deprecation-rules": "^1.0", - "phpstan/phpstan-phpunit": "^1.1", - "phpstan/phpstan-strict-rules": "^1.2", - "phpunit/phpunit": "^10.1|^11.0", - "qossmic/deptrac": "^2.0", - "rector/rector": "^1.0", + "phpstan/phpstan": "^1.7|^2.0", + "phpstan/phpstan-deprecation-rules": "^1.0|^2.0", + "phpstan/phpstan-phpunit": "^1.1|^2.0", + "phpstan/phpstan-strict-rules": "^1.0|^2.0", + "phpunit/phpunit": "^10.1|^11.0|^12.0", + "rector/rector": "^2.0", "symfony/phpunit-bridge": "^6.4|^7.0", "symplify/easy-coding-standard": "^12.0" }, @@ -8735,7 +8735,7 @@ ], "support": { "issues": "https://github.com/web-auth/cose-lib/issues", - "source": "https://github.com/web-auth/cose-lib/tree/4.4.0" + "source": "https://github.com/web-auth/cose-lib/tree/4.4.1" }, "funding": [ { @@ -8747,7 +8747,7 @@ "type": "patreon" } ], - "time": "2024-07-18T08:47:32+00:00" + "time": "2025-06-13T11:35:45+00:00" }, { "name": "web-auth/webauthn-lib", @@ -8897,16 +8897,16 @@ "packages-dev": [ { "name": "barryvdh/laravel-debugbar", - "version": "v3.15.2", + "version": "v3.15.4", "source": { "type": "git", "url": "https://github.com/barryvdh/laravel-debugbar.git", - "reference": "0bc1e1361e7fffc2be156f46ad1fba6927c01729" + "reference": "c0667ea91f7185f1e074402c5788195e96bf8106" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/0bc1e1361e7fffc2be156f46ad1fba6927c01729", - "reference": "0bc1e1361e7fffc2be156f46ad1fba6927c01729", + "url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/c0667ea91f7185f1e074402c5788195e96bf8106", + "reference": "c0667ea91f7185f1e074402c5788195e96bf8106", "shasum": "" }, "require": { @@ -8917,9 +8917,6 @@ "php-debugbar/php-debugbar": "~2.1.1", "symfony/finder": "^6|^7" }, - "conflict": { - "maximebf/debugbar": "*" - }, "require-dev": { "mockery/mockery": "^1.3.3", "orchestra/testbench-dusk": "^7|^8|^9|^10", @@ -8969,7 +8966,7 @@ ], "support": { "issues": "https://github.com/barryvdh/laravel-debugbar/issues", - "source": "https://github.com/barryvdh/laravel-debugbar/tree/v3.15.2" + "source": "https://github.com/barryvdh/laravel-debugbar/tree/v3.15.4" }, "funding": [ { @@ -8981,7 +8978,7 @@ "type": "github" } ], - "time": "2025-02-25T15:25:22+00:00" + "time": "2025-04-16T06:32:06+00:00" }, { "name": "barryvdh/laravel-ide-helper", @@ -9346,16 +9343,16 @@ }, { "name": "filp/whoops", - "version": "2.18.0", + "version": "2.18.3", "source": { "type": "git", "url": "https://github.com/filp/whoops.git", - "reference": "a7de6c3c6c3c022f5cfc337f8ede6a14460cf77e" + "reference": "59a123a3d459c5a23055802237cb317f609867e5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filp/whoops/zipball/a7de6c3c6c3c022f5cfc337f8ede6a14460cf77e", - "reference": "a7de6c3c6c3c022f5cfc337f8ede6a14460cf77e", + "url": "https://api.github.com/repos/filp/whoops/zipball/59a123a3d459c5a23055802237cb317f609867e5", + "reference": "59a123a3d459c5a23055802237cb317f609867e5", "shasum": "" }, "require": { @@ -9405,7 +9402,7 @@ ], "support": { "issues": "https://github.com/filp/whoops/issues", - "source": "https://github.com/filp/whoops/tree/2.18.0" + "source": "https://github.com/filp/whoops/tree/2.18.3" }, "funding": [ { @@ -9413,24 +9410,24 @@ "type": "github" } ], - "time": "2025-03-15T12:00:00+00:00" + "time": "2025-06-16T00:02:10+00:00" }, { "name": "hamcrest/hamcrest-php", - "version": "v2.0.1", + "version": "v2.1.1", "source": { "type": "git", "url": "https://github.com/hamcrest/hamcrest-php.git", - "reference": "8c3d0a3f6af734494ad8f6fbbee0ba92422859f3" + "reference": "f8b1c0173b22fa6ec77a81fe63e5b01eba7e6487" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/hamcrest/hamcrest-php/zipball/8c3d0a3f6af734494ad8f6fbbee0ba92422859f3", - "reference": "8c3d0a3f6af734494ad8f6fbbee0ba92422859f3", + "url": "https://api.github.com/repos/hamcrest/hamcrest-php/zipball/f8b1c0173b22fa6ec77a81fe63e5b01eba7e6487", + "reference": "f8b1c0173b22fa6ec77a81fe63e5b01eba7e6487", "shasum": "" }, "require": { - "php": "^5.3|^7.0|^8.0" + "php": "^7.4|^8.0" }, "replace": { "cordoval/hamcrest-php": "*", @@ -9438,8 +9435,8 @@ "kodova/hamcrest-php": "*" }, "require-dev": { - "phpunit/php-file-iterator": "^1.4 || ^2.0", - "phpunit/phpunit": "^4.8.36 || ^5.7 || ^6.5 || ^7.0" + "phpunit/php-file-iterator": "^1.4 || ^2.0 || ^3.0", + "phpunit/phpunit": "^4.8.36 || ^5.7 || ^6.5 || ^7.0 || ^8.0 || ^9.0" }, "type": "library", "extra": { @@ -9462,22 +9459,22 @@ ], "support": { "issues": "https://github.com/hamcrest/hamcrest-php/issues", - "source": "https://github.com/hamcrest/hamcrest-php/tree/v2.0.1" + "source": "https://github.com/hamcrest/hamcrest-php/tree/v2.1.1" }, - "time": "2020-07-09T08:09:16+00:00" + "time": "2025-04-30T06:54:44+00:00" }, { "name": "laravel/dusk", - "version": "v8.3.2", + "version": "v8.3.3", "source": { "type": "git", "url": "https://github.com/laravel/dusk.git", - "reference": "bb701836357bf6f6c6658ef90b5a0f8232affb0f" + "reference": "077d448cd993a08f97bfccf0ea3d6478b3908f7e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/dusk/zipball/bb701836357bf6f6c6658ef90b5a0f8232affb0f", - "reference": "bb701836357bf6f6c6658ef90b5a0f8232affb0f", + "url": "https://api.github.com/repos/laravel/dusk/zipball/077d448cd993a08f97bfccf0ea3d6478b3908f7e", + "reference": "077d448cd993a08f97bfccf0ea3d6478b3908f7e", "shasum": "" }, "require": { @@ -9536,22 +9533,22 @@ ], "support": { "issues": "https://github.com/laravel/dusk/issues", - "source": "https://github.com/laravel/dusk/tree/v8.3.2" + "source": "https://github.com/laravel/dusk/tree/v8.3.3" }, - "time": "2025-02-20T14:42:00+00:00" + "time": "2025-06-10T13:59:27+00:00" }, { "name": "laravel/pail", - "version": "v1.2.2", + "version": "v1.2.3", "source": { "type": "git", "url": "https://github.com/laravel/pail.git", - "reference": "f31f4980f52be17c4667f3eafe034e6826787db2" + "reference": "8cc3d575c1f0e57eeb923f366a37528c50d2385a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/pail/zipball/f31f4980f52be17c4667f3eafe034e6826787db2", - "reference": "f31f4980f52be17c4667f3eafe034e6826787db2", + "url": "https://api.github.com/repos/laravel/pail/zipball/8cc3d575c1f0e57eeb923f366a37528c50d2385a", + "reference": "8cc3d575c1f0e57eeb923f366a37528c50d2385a", "shasum": "" }, "require": { @@ -9571,7 +9568,7 @@ "orchestra/testbench-core": "^8.13|^9.0|^10.0", "pestphp/pest": "^2.20|^3.0", "pestphp/pest-plugin-type-coverage": "^2.3|^3.0", - "phpstan/phpstan": "^1.10", + "phpstan/phpstan": "^1.12.27", "symfony/var-dumper": "^6.3|^7.0" }, "type": "library", @@ -9607,6 +9604,7 @@ "description": "Easily delve into your Laravel application's log files directly from the command line.", "homepage": "https://github.com/laravel/pail", "keywords": [ + "dev", "laravel", "logs", "php", @@ -9616,20 +9614,20 @@ "issues": "https://github.com/laravel/pail/issues", "source": "https://github.com/laravel/pail" }, - "time": "2025-01-28T15:15:15+00:00" + "time": "2025-06-05T13:55:57+00:00" }, { "name": "laravel/pint", - "version": "v1.21.2", + "version": "v1.22.1", "source": { "type": "git", "url": "https://github.com/laravel/pint.git", - "reference": "370772e7d9e9da087678a0edf2b11b6960e40558" + "reference": "941d1927c5ca420c22710e98420287169c7bcaf7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/pint/zipball/370772e7d9e9da087678a0edf2b11b6960e40558", - "reference": "370772e7d9e9da087678a0edf2b11b6960e40558", + "url": "https://api.github.com/repos/laravel/pint/zipball/941d1927c5ca420c22710e98420287169c7bcaf7", + "reference": "941d1927c5ca420c22710e98420287169c7bcaf7", "shasum": "" }, "require": { @@ -9640,12 +9638,12 @@ "php": "^8.2.0" }, "require-dev": { - "friendsofphp/php-cs-fixer": "^3.72.0", - "illuminate/view": "^11.44.2", - "larastan/larastan": "^3.2.0", + "friendsofphp/php-cs-fixer": "^3.75.0", + "illuminate/view": "^11.44.7", + "larastan/larastan": "^3.4.0", "laravel-zero/framework": "^11.36.1", "mockery/mockery": "^1.6.12", - "nunomaduro/termwind": "^2.3", + "nunomaduro/termwind": "^2.3.1", "pestphp/pest": "^2.36.0" }, "bin": [ @@ -9682,20 +9680,20 @@ "issues": "https://github.com/laravel/pint/issues", "source": "https://github.com/laravel/pint" }, - "time": "2025-03-14T22:31:42+00:00" + "time": "2025-05-08T08:38:12+00:00" }, { "name": "laravel/sail", - "version": "v1.41.0", + "version": "v1.43.1", "source": { "type": "git", "url": "https://github.com/laravel/sail.git", - "reference": "fe1a4ada0abb5e4bd99eb4e4b0d87906c00cdeec" + "reference": "3e7d899232a8c5e3ea4fc6dee7525ad583887e72" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/sail/zipball/fe1a4ada0abb5e4bd99eb4e4b0d87906c00cdeec", - "reference": "fe1a4ada0abb5e4bd99eb4e4b0d87906c00cdeec", + "url": "https://api.github.com/repos/laravel/sail/zipball/3e7d899232a8c5e3ea4fc6dee7525ad583887e72", + "reference": "3e7d899232a8c5e3ea4fc6dee7525ad583887e72", "shasum": "" }, "require": { @@ -9745,7 +9743,7 @@ "issues": "https://github.com/laravel/sail/issues", "source": "https://github.com/laravel/sail" }, - "time": "2025-01-24T15:45:36+00:00" + "time": "2025-05-19T13:19:21+00:00" }, { "name": "mockery/mockery", @@ -9832,16 +9830,16 @@ }, { "name": "myclabs/deep-copy", - "version": "1.13.0", + "version": "1.13.1", "source": { "type": "git", "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "024473a478be9df5fdaca2c793f2232fe788e414" + "reference": "1720ddd719e16cf0db4eb1c6eca108031636d46c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/024473a478be9df5fdaca2c793f2232fe788e414", - "reference": "024473a478be9df5fdaca2c793f2232fe788e414", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/1720ddd719e16cf0db4eb1c6eca108031636d46c", + "reference": "1720ddd719e16cf0db4eb1c6eca108031636d46c", "shasum": "" }, "require": { @@ -9880,7 +9878,7 @@ ], "support": { "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.13.0" + "source": "https://github.com/myclabs/DeepCopy/tree/1.13.1" }, "funding": [ { @@ -9888,42 +9886,43 @@ "type": "tidelift" } ], - "time": "2025-02-12T12:17:51+00:00" + "time": "2025-04-29T12:36:36+00:00" }, { "name": "nunomaduro/collision", - "version": "v8.7.0", + "version": "v8.8.2", "source": { "type": "git", "url": "https://github.com/nunomaduro/collision.git", - "reference": "586cb8181a257a2152b6a855ca8d9598878a1a26" + "reference": "60207965f9b7b7a4ce15a0f75d57f9dadb105bdb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nunomaduro/collision/zipball/586cb8181a257a2152b6a855ca8d9598878a1a26", - "reference": "586cb8181a257a2152b6a855ca8d9598878a1a26", + "url": "https://api.github.com/repos/nunomaduro/collision/zipball/60207965f9b7b7a4ce15a0f75d57f9dadb105bdb", + "reference": "60207965f9b7b7a4ce15a0f75d57f9dadb105bdb", "shasum": "" }, "require": { - "filp/whoops": "^2.17.0", - "nunomaduro/termwind": "^2.3.0", + "filp/whoops": "^2.18.1", + "nunomaduro/termwind": "^2.3.1", "php": "^8.2.0", - "symfony/console": "^7.2.1" + "symfony/console": "^7.3.0" }, "conflict": { - "laravel/framework": "<11.39.1 || >=13.0.0", - "phpunit/phpunit": "<11.5.3 || >=12.0.0" + "laravel/framework": "<11.44.2 || >=13.0.0", + "phpunit/phpunit": "<11.5.15 || >=13.0.0" }, "require-dev": { - "larastan/larastan": "^2.10.0", - "laravel/framework": "^11.44.2", - "laravel/pint": "^1.21.2", - "laravel/sail": "^1.41.0", - "laravel/sanctum": "^4.0.8", + "brianium/paratest": "^7.8.3", + "larastan/larastan": "^3.4.2", + "laravel/framework": "^11.44.2 || ^12.18", + "laravel/pint": "^1.22.1", + "laravel/sail": "^1.43.1", + "laravel/sanctum": "^4.1.1", "laravel/tinker": "^2.10.1", - "orchestra/testbench-core": "^9.12.0", - "pestphp/pest": "^3.7.4", - "sebastian/environment": "^6.1.0 || ^7.2.0" + "orchestra/testbench-core": "^9.12.0 || ^10.4", + "pestphp/pest": "^3.8.2", + "sebastian/environment": "^7.2.1 || ^8.0" }, "type": "library", "extra": { @@ -9986,7 +9985,7 @@ "type": "patreon" } ], - "time": "2025-03-14T22:37:40+00:00" + "time": "2025-06-25T02:12:12+00:00" }, { "name": "openai-php/client", @@ -10079,6 +10078,133 @@ ], "time": "2024-11-12T20:51:16+00:00" }, + { + "name": "permafrost-dev/code-snippets", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/permafrost-dev/code-snippets.git", + "reference": "639827ba7118a6b5521c861a265358ce5bd2b0c5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/permafrost-dev/code-snippets/zipball/639827ba7118a6b5521c861a265358ce5bd2b0c5", + "reference": "639827ba7118a6b5521c861a265358ce5bd2b0c5", + "shasum": "" + }, + "require": { + "php": "^7.3|^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.5", + "spatie/phpunit-snapshot-assertions": "^4.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Permafrost\\CodeSnippets\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Patrick Organ", + "email": "patrick@permafrost.dev", + "role": "Developer" + } + ], + "description": "Easily work with code snippets in PHP", + "homepage": "https://github.com/permafrost-dev/code-snippets", + "keywords": [ + "code", + "code-snippets", + "permafrost", + "snippets" + ], + "support": { + "issues": "https://github.com/permafrost-dev/code-snippets/issues", + "source": "https://github.com/permafrost-dev/code-snippets/tree/1.2.0" + }, + "funding": [ + { + "url": "https://permafrost.dev/open-source", + "type": "custom" + }, + { + "url": "https://github.com/permafrost-dev", + "type": "github" + } + ], + "time": "2021-07-27T05:15:06+00:00" + }, + { + "name": "permafrost-dev/php-code-search", + "version": "1.12.0", + "source": { + "type": "git", + "url": "https://github.com/permafrost-dev/php-code-search.git", + "reference": "dbbca18f7dc2950e88121bb62f8ed2c697df799a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/permafrost-dev/php-code-search/zipball/dbbca18f7dc2950e88121bb62f8ed2c697df799a", + "reference": "dbbca18f7dc2950e88121bb62f8ed2c697df799a", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^5.0", + "permafrost-dev/code-snippets": "^1.2.0", + "php": "^7.4|^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.5", + "spatie/phpunit-snapshot-assertions": "^4.2" + }, + "type": "library", + "autoload": { + "files": [ + "src/Support/helpers.php" + ], + "psr-4": { + "Permafrost\\PhpCodeSearch\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Patrick Organ", + "email": "patrick@permafrost.dev", + "homepage": "https://permafrost.dev", + "role": "Developer" + } + ], + "description": "Search PHP code for function & method calls, variable assignments, and more", + "homepage": "https://github.com/permafrost-dev/php-code-search", + "keywords": [ + "code", + "permafrost", + "php", + "search", + "sourcecode" + ], + "support": { + "issues": "https://github.com/permafrost-dev/php-code-search/issues", + "source": "https://github.com/permafrost-dev/php-code-search/tree/1.12.0" + }, + "funding": [ + { + "url": "https://github.com/sponsors/permafrost-dev", + "type": "github" + } + ], + "time": "2024-09-03T04:33:45+00:00" + }, { "name": "phar-io/manifest", "version": "2.0.4", @@ -10324,16 +10450,16 @@ }, { "name": "php-di/php-di", - "version": "7.0.9", + "version": "7.0.11", "source": { "type": "git", "url": "https://github.com/PHP-DI/PHP-DI.git", - "reference": "d8480267f5cf239650debba704f3ecd15b638cde" + "reference": "32f111a6d214564520a57831d397263e8946c1d2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHP-DI/PHP-DI/zipball/d8480267f5cf239650debba704f3ecd15b638cde", - "reference": "d8480267f5cf239650debba704f3ecd15b638cde", + "url": "https://api.github.com/repos/PHP-DI/PHP-DI/zipball/32f111a6d214564520a57831d397263e8946c1d2", + "reference": "32f111a6d214564520a57831d397263e8946c1d2", "shasum": "" }, "require": { @@ -10349,7 +10475,7 @@ "friendsofphp/php-cs-fixer": "^3", "friendsofphp/proxy-manager-lts": "^1", "mnapoli/phpunit-easymock": "^1.3", - "phpunit/phpunit": "^9.6", + "phpunit/phpunit": "^9.6 || ^10 || ^11", "vimeo/psalm": "^5|^6" }, "suggest": { @@ -10381,7 +10507,7 @@ ], "support": { "issues": "https://github.com/PHP-DI/PHP-DI/issues", - "source": "https://github.com/PHP-DI/PHP-DI/tree/7.0.9" + "source": "https://github.com/PHP-DI/PHP-DI/tree/7.0.11" }, "funding": [ { @@ -10393,7 +10519,7 @@ "type": "tidelift" } ], - "time": "2025-02-28T12:46:35+00:00" + "time": "2025-06-03T07:45:57+00:00" }, { "name": "php-http/discovery", @@ -10598,16 +10724,16 @@ }, { "name": "phpunit/php-code-coverage", - "version": "11.0.9", + "version": "11.0.10", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "14d63fbcca18457e49c6f8bebaa91a87e8e188d7" + "reference": "1a800a7446add2d79cc6b3c01c45381810367d76" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/14d63fbcca18457e49c6f8bebaa91a87e8e188d7", - "reference": "14d63fbcca18457e49c6f8bebaa91a87e8e188d7", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/1a800a7446add2d79cc6b3c01c45381810367d76", + "reference": "1a800a7446add2d79cc6b3c01c45381810367d76", "shasum": "" }, "require": { @@ -10664,15 +10790,27 @@ "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/11.0.9" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/show" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/php-code-coverage", + "type": "tidelift" } ], - "time": "2025-02-25T13:26:39+00:00" + "time": "2025-06-18T08:56:18+00:00" }, { "name": "phpunit/php-file-iterator", @@ -10921,16 +11059,16 @@ }, { "name": "phpunit/phpunit", - "version": "11.5.15", + "version": "11.5.25", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "4b6a4ee654e5e0c5e1f17e2f83c0f4c91dee1f9c" + "reference": "864ab32b3ff52058f917c5b19b3cef821e4a4f1b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/4b6a4ee654e5e0c5e1f17e2f83c0f4c91dee1f9c", - "reference": "4b6a4ee654e5e0c5e1f17e2f83c0f4c91dee1f9c", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/864ab32b3ff52058f917c5b19b3cef821e4a4f1b", + "reference": "864ab32b3ff52058f917c5b19b3cef821e4a4f1b", "shasum": "" }, "require": { @@ -10940,11 +11078,11 @@ "ext-mbstring": "*", "ext-xml": "*", "ext-xmlwriter": "*", - "myclabs/deep-copy": "^1.13.0", + "myclabs/deep-copy": "^1.13.1", "phar-io/manifest": "^2.0.4", "phar-io/version": "^3.2.1", "php": ">=8.2", - "phpunit/php-code-coverage": "^11.0.9", + "phpunit/php-code-coverage": "^11.0.10", "phpunit/php-file-iterator": "^5.1.0", "phpunit/php-invoker": "^5.0.1", "phpunit/php-text-template": "^4.0.1", @@ -10953,7 +11091,7 @@ "sebastian/code-unit": "^3.0.3", "sebastian/comparator": "^6.3.1", "sebastian/diff": "^6.0.2", - "sebastian/environment": "^7.2.0", + "sebastian/environment": "^7.2.1", "sebastian/exporter": "^6.3.0", "sebastian/global-state": "^7.0.2", "sebastian/object-enumerator": "^6.0.1", @@ -11002,7 +11140,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/11.5.15" + "source": "https://github.com/sebastianbergmann/phpunit/tree/11.5.25" }, "funding": [ { @@ -11013,12 +11151,20 @@ "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" } ], - "time": "2025-03-23T16:02:11+00:00" + "time": "2025-06-27T04:36:07+00:00" }, { "name": "sebastian/cli-parser", @@ -11397,23 +11543,23 @@ }, { "name": "sebastian/environment", - "version": "7.2.0", + "version": "7.2.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "855f3ae0ab316bbafe1ba4e16e9f3c078d24a0c5" + "reference": "a5c75038693ad2e8d4b6c15ba2403532647830c4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/855f3ae0ab316bbafe1ba4e16e9f3c078d24a0c5", - "reference": "855f3ae0ab316bbafe1ba4e16e9f3c078d24a0c5", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/a5c75038693ad2e8d4b6c15ba2403532647830c4", + "reference": "a5c75038693ad2e8d4b6c15ba2403532647830c4", "shasum": "" }, "require": { "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^11.0" + "phpunit/phpunit": "^11.3" }, "suggest": { "ext-posix": "*" @@ -11449,15 +11595,27 @@ "support": { "issues": "https://github.com/sebastianbergmann/environment/issues", "security": "https://github.com/sebastianbergmann/environment/security/policy", - "source": "https://github.com/sebastianbergmann/environment/tree/7.2.0" + "source": "https://github.com/sebastianbergmann/environment/tree/7.2.1" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/environment", + "type": "tidelift" } ], - "time": "2024-07-03T04:54:44+00:00" + "time": "2025-05-21T11:55:47+00:00" }, { "name": "sebastian/exporter", @@ -12086,16 +12244,16 @@ }, { "name": "spatie/ray", - "version": "1.41.6", + "version": "1.42.0", "source": { "type": "git", "url": "https://github.com/spatie/ray.git", - "reference": "ae6e32a54a901544a3d70b12b865900bc240f71c" + "reference": "152250ce7c490bf830349fa30ba5200084e95860" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/ray/zipball/ae6e32a54a901544a3d70b12b865900bc240f71c", - "reference": "ae6e32a54a901544a3d70b12b865900bc240f71c", + "url": "https://api.github.com/repos/spatie/ray/zipball/152250ce7c490bf830349fa30ba5200084e95860", + "reference": "152250ce7c490bf830349fa30ba5200084e95860", "shasum": "" }, "require": { @@ -12155,7 +12313,7 @@ ], "support": { "issues": "https://github.com/spatie/ray/issues", - "source": "https://github.com/spatie/ray/tree/1.41.6" + "source": "https://github.com/spatie/ray/tree/1.42.0" }, "funding": [ { @@ -12167,7 +12325,79 @@ "type": "other" } ], - "time": "2025-03-21T08:56:30+00:00" + "time": "2025-04-18T08:17:40+00:00" + }, + { + "name": "spatie/x-ray", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/spatie/x-ray.git", + "reference": "c1d8fe19951b752422d058fc911f14066e4ac346" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/x-ray/zipball/c1d8fe19951b752422d058fc911f14066e4ac346", + "reference": "c1d8fe19951b752422d058fc911f14066e4ac346", + "shasum": "" + }, + "require": { + "permafrost-dev/code-snippets": "^1.2.0", + "permafrost-dev/php-code-search": "^1.10.5", + "php": "^8.0", + "symfony/console": "^5.3|^6.0|^7.0", + "symfony/finder": "^5.3|^6.0|^7.0", + "symfony/yaml": "^5.3|^6.0|^7.0" + }, + "require-dev": { + "phpstan/phpstan": "^2.0.0", + "phpunit/phpunit": "^9.5", + "spatie/phpunit-snapshot-assertions": "^4.2" + }, + "bin": [ + "bin/x-ray" + ], + "type": "library", + "autoload": { + "psr-4": { + "Spatie\\XRay\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Patrick Organ", + "email": "patrick@permafrost.dev", + "homepage": "https://permafrost.dev", + "role": "Developer" + } + ], + "description": "Quickly scan source code for calls to Ray", + "homepage": "https://github.com/spatie/x-ray", + "keywords": [ + "permafrost", + "ray", + "search", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/x-ray/issues", + "source": "https://github.com/spatie/x-ray/tree/1.2.0" + }, + "funding": [ + { + "url": "https://github.com/sponsors/permafrost-dev", + "type": "github" + }, + { + "url": "https://github.com/sponsors/spatie", + "type": "github" + } + ], + "time": "2024-11-12T13:23:31+00:00" }, { "name": "staabm/side-effects-detector", @@ -12223,16 +12453,16 @@ }, { "name": "symfony/polyfill-iconv", - "version": "v1.31.0", + "version": "v1.32.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-iconv.git", - "reference": "48becf00c920479ca2e910c22a5a39e5d47ca956" + "reference": "5f3b930437ae03ae5dff61269024d8ea1b3774aa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-iconv/zipball/48becf00c920479ca2e910c22a5a39e5d47ca956", - "reference": "48becf00c920479ca2e910c22a5a39e5d47ca956", + "url": "https://api.github.com/repos/symfony/polyfill-iconv/zipball/5f3b930437ae03ae5dff61269024d8ea1b3774aa", + "reference": "5f3b930437ae03ae5dff61269024d8ea1b3774aa", "shasum": "" }, "require": { @@ -12283,7 +12513,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-iconv/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-iconv/tree/v1.32.0" }, "funding": [ { @@ -12299,11 +12529,11 @@ "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2024-09-17T14:58:18+00:00" }, { "name": "symfony/stopwatch", - "version": "v7.2.4", + "version": "v7.3.0", "source": { "type": "git", "url": "https://github.com/symfony/stopwatch.git", @@ -12345,7 +12575,7 @@ "description": "Provides a way to profile code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/stopwatch/tree/v7.2.4" + "source": "https://github.com/symfony/stopwatch/tree/v7.3.0" }, "funding": [ { @@ -12365,16 +12595,16 @@ }, { "name": "symfony/yaml", - "version": "v7.2.5", + "version": "v7.3.1", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "4c4b6f4cfcd7e52053f0c8bfad0f7f30fb924912" + "reference": "0c3555045a46ab3cd4cc5a69d161225195230edb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/4c4b6f4cfcd7e52053f0c8bfad0f7f30fb924912", - "reference": "4c4b6f4cfcd7e52053f0c8bfad0f7f30fb924912", + "url": "https://api.github.com/repos/symfony/yaml/zipball/0c3555045a46ab3cd4cc5a69d161225195230edb", + "reference": "0c3555045a46ab3cd4cc5a69d161225195230edb", "shasum": "" }, "require": { @@ -12417,7 +12647,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v7.2.5" + "source": "https://github.com/symfony/yaml/tree/v7.3.1" }, "funding": [ { @@ -12433,7 +12663,7 @@ "type": "tidelift" } ], - "time": "2025-03-03T07:12:39+00:00" + "time": "2025-06-03T06:57:57+00:00" }, { "name": "theseer/tokenizer", @@ -12709,6 +12939,6 @@ "ext-pgsql": "*", "ext-sodium": "*" }, - "platform-dev": [], + "platform-dev": {}, "plugin-api-version": "2.6.0" } diff --git a/config/url.php b/config/url.php deleted file mode 100644 index dfdffe6b..00000000 --- a/config/url.php +++ /dev/null @@ -1,32 +0,0 @@ - env('APP_LONGURL', 'longurl.local'), - - /* - |-------------------------------------------------------------------------- - | Application Short URL - |-------------------------------------------------------------------------- - | - | The short URL for the application - | - */ - - 'shorturl' => env('APP_SHORTURL', 'shorturl.local'), - -]; diff --git a/database/factories/ArticleFactory.php b/database/factories/ArticleFactory.php index 54c91aa0..7695e27e 100644 --- a/database/factories/ArticleFactory.php +++ b/database/factories/ArticleFactory.php @@ -7,8 +7,6 @@ use Illuminate\Database\Eloquent\Factories\Factory; use Illuminate\Support\Carbon; /** - * @psalm-suppress UnusedClass - * * @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\Article> */ class ArticleFactory extends Factory diff --git a/database/factories/BioFactory.php b/database/factories/BioFactory.php index 7ed8cb6f..b2493014 100644 --- a/database/factories/BioFactory.php +++ b/database/factories/BioFactory.php @@ -5,8 +5,6 @@ namespace Database\Factories; use Illuminate\Database\Eloquent\Factories\Factory; /** - * @psalm-suppress UnusedClass - * * @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\Bio> */ class BioFactory extends Factory diff --git a/database/factories/BookmarkFactory.php b/database/factories/BookmarkFactory.php index 0d10db4a..ddfe0f97 100644 --- a/database/factories/BookmarkFactory.php +++ b/database/factories/BookmarkFactory.php @@ -7,8 +7,6 @@ use Illuminate\Database\Eloquent\Factories\Factory; use Illuminate\Support\Carbon; /** - * @psalm-suppress UnusedClass - * * @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\Bookmark> */ class BookmarkFactory extends Factory diff --git a/database/factories/ContactFactory.php b/database/factories/ContactFactory.php index 57efafd9..1b0be43b 100644 --- a/database/factories/ContactFactory.php +++ b/database/factories/ContactFactory.php @@ -7,8 +7,6 @@ use Illuminate\Database\Eloquent\Factories\Factory; use Illuminate\Support\Carbon; /** - * @psalm-suppress UnusedClass - * * @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\Contact> */ class ContactFactory extends Factory diff --git a/database/factories/LikeFactory.php b/database/factories/LikeFactory.php index 92ad76ce..8bf4f62f 100644 --- a/database/factories/LikeFactory.php +++ b/database/factories/LikeFactory.php @@ -7,8 +7,6 @@ use Illuminate\Database\Eloquent\Factories\Factory; use Illuminate\Support\Carbon; /** - * @psalm-suppress UnusedClass - * * @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\Like> */ class LikeFactory extends Factory diff --git a/database/factories/MediaFactory.php b/database/factories/MediaFactory.php index 6f1e4838..ca253109 100644 --- a/database/factories/MediaFactory.php +++ b/database/factories/MediaFactory.php @@ -7,8 +7,6 @@ use Illuminate\Database\Eloquent\Factories\Factory; use Illuminate\Support\Carbon; /** - * @psalm-suppress UnusedClass - * * @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\Media> */ class MediaFactory extends Factory diff --git a/database/factories/MicropubClientFactory.php b/database/factories/MicropubClientFactory.php index 923a9df9..4916f404 100644 --- a/database/factories/MicropubClientFactory.php +++ b/database/factories/MicropubClientFactory.php @@ -6,8 +6,6 @@ use App\Models\MicropubClient; use Illuminate\Database\Eloquent\Factories\Factory; /** - * @psalm-suppress UnusedClass - * * @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\MicropubClient> */ class MicropubClientFactory extends Factory diff --git a/database/factories/NoteFactory.php b/database/factories/NoteFactory.php index 0ea928a6..e2238a23 100644 --- a/database/factories/NoteFactory.php +++ b/database/factories/NoteFactory.php @@ -8,8 +8,6 @@ use Illuminate\Database\Eloquent\Factories\Factory; use Illuminate\Support\Carbon; /** - * @psalm-suppress UnusedClass - * * @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\Note> */ class NoteFactory extends Factory diff --git a/database/factories/PlaceFactory.php b/database/factories/PlaceFactory.php index a9f23f0b..61bdd70f 100644 --- a/database/factories/PlaceFactory.php +++ b/database/factories/PlaceFactory.php @@ -6,8 +6,6 @@ use App\Models\Place; use Illuminate\Database\Eloquent\Factories\Factory; /** - * @psalm-suppress UnusedClass - * * @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\Place> */ class PlaceFactory extends Factory diff --git a/database/factories/SyndicationTargetFactory.php b/database/factories/SyndicationTargetFactory.php index f409a3f6..05243632 100644 --- a/database/factories/SyndicationTargetFactory.php +++ b/database/factories/SyndicationTargetFactory.php @@ -5,8 +5,6 @@ namespace Database\Factories; use Illuminate\Database\Eloquent\Factories\Factory; /** - * @psalm-suppress UnusedClass - * * @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\SyndicationTarget> */ class SyndicationTargetFactory extends Factory diff --git a/database/factories/TagFactory.php b/database/factories/TagFactory.php index b5478679..24cae028 100644 --- a/database/factories/TagFactory.php +++ b/database/factories/TagFactory.php @@ -6,8 +6,6 @@ use App\Models\Tag; use Illuminate\Database\Eloquent\Factories\Factory; /** - * @psalm-suppress UnusedClass - * * @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\Tag> */ class TagFactory extends Factory diff --git a/database/factories/UserFactory.php b/database/factories/UserFactory.php index e456f5d8..ba1ff997 100644 --- a/database/factories/UserFactory.php +++ b/database/factories/UserFactory.php @@ -7,8 +7,6 @@ use Illuminate\Database\Eloquent\Factories\Factory; use Illuminate\Support\Str; /** - * @psalm-suppress UnusedClass - * * @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\User> */ class UserFactory extends Factory diff --git a/database/factories/WebMentionFactory.php b/database/factories/WebMentionFactory.php index 08829bad..65dbb92f 100644 --- a/database/factories/WebMentionFactory.php +++ b/database/factories/WebMentionFactory.php @@ -6,8 +6,6 @@ use App\Models\WebMention; use Illuminate\Database\Eloquent\Factories\Factory; /** - * @psalm-suppress UnusedClass - * * @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\WebMention> */ class WebMentionFactory extends Factory diff --git a/database/seeders/ArticlesTableSeeder.php b/database/seeders/ArticlesTableSeeder.php index 898471fc..cbfd7a36 100644 --- a/database/seeders/ArticlesTableSeeder.php +++ b/database/seeders/ArticlesTableSeeder.php @@ -11,8 +11,6 @@ class ArticlesTableSeeder extends Seeder { /** * Seed the articles table. - * - * @psalm-suppress PossiblyUnusedMethod */ public function run(): void { diff --git a/database/seeders/BioSeeder.php b/database/seeders/BioSeeder.php index 05a60c33..093d0609 100644 --- a/database/seeders/BioSeeder.php +++ b/database/seeders/BioSeeder.php @@ -5,9 +5,6 @@ namespace Database\Seeders; use App\Models\Bio; use Illuminate\Database\Seeder; -/** - * @psalm-suppress UnusedClass - */ class BioSeeder extends Seeder { /** diff --git a/database/seeders/BookmarksTableSeeder.php b/database/seeders/BookmarksTableSeeder.php index a8c48f69..baa3580f 100644 --- a/database/seeders/BookmarksTableSeeder.php +++ b/database/seeders/BookmarksTableSeeder.php @@ -10,8 +10,6 @@ class BookmarksTableSeeder extends Seeder { /** * Seed the bookmarks table. - * - * @psalm-suppress PossiblyUnusedMethod */ public function run(): void { diff --git a/database/seeders/ClientsTableSeeder.php b/database/seeders/ClientsTableSeeder.php index 98d403b0..35dcb296 100644 --- a/database/seeders/ClientsTableSeeder.php +++ b/database/seeders/ClientsTableSeeder.php @@ -11,8 +11,6 @@ class ClientsTableSeeder extends Seeder { /** * Seed the clients table. - * - * @psalm-suppress PossiblyUnusedMethod */ public function run(): void { diff --git a/database/seeders/ContactsTableSeeder.php b/database/seeders/ContactsTableSeeder.php index 577fe153..3d191ec1 100644 --- a/database/seeders/ContactsTableSeeder.php +++ b/database/seeders/ContactsTableSeeder.php @@ -10,8 +10,6 @@ class ContactsTableSeeder extends Seeder { /** * Seed the contacts table. - * - * @psalm-suppress PossiblyUnusedMethod */ public function run(): void { diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php index c91e2edb..5117a89d 100644 --- a/database/seeders/DatabaseSeeder.php +++ b/database/seeders/DatabaseSeeder.php @@ -4,9 +4,6 @@ namespace Database\Seeders; use Illuminate\Database\Seeder; -/** - * @psalm-suppress UnusedClass - */ class DatabaseSeeder extends Seeder { /** diff --git a/database/seeders/LikesTableSeeder.php b/database/seeders/LikesTableSeeder.php index 0436ad64..4600fb69 100644 --- a/database/seeders/LikesTableSeeder.php +++ b/database/seeders/LikesTableSeeder.php @@ -12,8 +12,6 @@ class LikesTableSeeder extends Seeder { /** * Seed the likes table. - * - * @psalm-suppress PossiblyUnusedMethod */ public function run(): void { diff --git a/database/seeders/NotesTableSeeder.php b/database/seeders/NotesTableSeeder.php index a9fbab12..630cfda6 100644 --- a/database/seeders/NotesTableSeeder.php +++ b/database/seeders/NotesTableSeeder.php @@ -14,8 +14,6 @@ class NotesTableSeeder extends Seeder { /** * Seed the notes table. - * - * @psalm-suppress PossiblyUnusedMethod */ public function run(): void { diff --git a/database/seeders/PlacesTableSeeder.php b/database/seeders/PlacesTableSeeder.php index 90a63ff8..70324ff8 100644 --- a/database/seeders/PlacesTableSeeder.php +++ b/database/seeders/PlacesTableSeeder.php @@ -9,8 +9,6 @@ class PlacesTableSeeder extends Seeder { /** * Seed the places table. - * - * @psalm-suppress PossiblyUnusedMethod */ public function run(): void { diff --git a/database/seeders/UsersTableSeeder.php b/database/seeders/UsersTableSeeder.php index dfc155cd..d9e608e2 100644 --- a/database/seeders/UsersTableSeeder.php +++ b/database/seeders/UsersTableSeeder.php @@ -9,8 +9,6 @@ class UsersTableSeeder extends Seeder { /** * Seed the users table. - * - * @psalm-suppress PossiblyUnusedMethod */ public function run(): void { diff --git a/database/seeders/WebMentionsTableSeeder.php b/database/seeders/WebMentionsTableSeeder.php index b7118343..46da28d5 100644 --- a/database/seeders/WebMentionsTableSeeder.php +++ b/database/seeders/WebMentionsTableSeeder.php @@ -9,8 +9,6 @@ class WebMentionsTableSeeder extends Seeder { /** * Seed the webmentions table. - * - * @psalm-suppress PossiblyUnusedMethod */ public function run(): void { diff --git a/docker-compose.yml b/docker-compose.yml index 486609ec..cd9242e8 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -2,7 +2,7 @@ services: laravel.test: build: - context: ./vendor/laravel/sail/runtimes/8.3 + context: ./vendor/laravel/sail/runtimes/8.4 dockerfile: Dockerfile args: WWWGROUP: '${WWWGROUP}' @@ -26,7 +26,7 @@ services: - pgsql - redis pgsql: - image: 'postgres:16' + image: 'postgres:17' ports: - '${FORWARD_DB_PORT:-5432}:5432' environment: diff --git a/package-lock.json b/package-lock.json index aa3f3839..3fc2acf4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,48 +8,37 @@ "name": "jbuk-frontend", "version": "0.0.1", "license": "CC0-1.0", - "dependencies": { - "@11ty/is-land": "^4.0.0", - "@zachleat/snow-fall": "^1.0.2" - }, "devDependencies": { "@eslint/js": "^9.6.0", - "@stylistic/eslint-plugin": "^3.0.0", + "@stylistic/eslint-plugin": "^5.1.0", + "esbuild": "^0.25.2", "eslint": "^9.7.0", - "globals": "^15.8.0", + "globals": "^16.0.0", + "lightningcss": "^1.29.3", + "lightningcss-cli": "^1.29.3", "stylelint": "^16.7.0", - "stylelint-config-standard": "^37.0.0" - } - }, - "node_modules/@11ty/is-land": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@11ty/is-land/-/is-land-4.0.0.tgz", - "integrity": "sha512-RxbjF2+FzSu3rerHrWLRsvsPX2YM47RwXpdWCCzLhwRSsz5sJe9TnK7mphEld1gZnp2GeD5ByvhqjIc4CqidsQ==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/11ty" + "stylelint-config-standard": "^38.0.0" } }, "node_modules/@babel/code-frame": { - "version": "7.26.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", - "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.25.9", + "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" + "picocolors": "^1.1.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", - "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", "dev": true, "license": "MIT", "engines": { @@ -57,9 +46,9 @@ } }, "node_modules/@csstools/css-parser-algorithms": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.4.tgz", - "integrity": "sha512-Up7rBoV77rv29d3uKHUIVubz1BTcgyUK72IvCQAbfbMv584xHcGKCKbWh7i8hPrRJ7qU4Y8IO3IY9m+iTB7P3A==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", + "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", "dev": true, "funding": [ { @@ -76,13 +65,13 @@ "node": ">=18" }, "peerDependencies": { - "@csstools/css-tokenizer": "^3.0.3" + "@csstools/css-tokenizer": "^3.0.4" } }, "node_modules/@csstools/css-tokenizer": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.3.tgz", - "integrity": "sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", + "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", "dev": true, "funding": [ { @@ -100,9 +89,9 @@ } }, "node_modules/@csstools/media-query-list-parser": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.2.tgz", - "integrity": "sha512-EUos465uvVvMJehckATTlNqGj4UJWkTmdWuDMjqvSUkjGpmOyFZBVwb4knxCm/k2GMTXY+c/5RkdndzFYWeX5A==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.3.tgz", + "integrity": "sha512-HAYH7d3TLRHDOUQK4mZKf9k9Ph/m8Akstg66ywKR4SFAigjs3yBiUeZtFxywiTm5moZMAp/5W/ZuFnNXXYLuuQ==", "dev": true, "funding": [ { @@ -119,8 +108,8 @@ "node": ">=18" }, "peerDependencies": { - "@csstools/css-parser-algorithms": "^3.0.4", - "@csstools/css-tokenizer": "^3.0.3" + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" } }, "node_modules/@csstools/selector-specificity": { @@ -157,10 +146,435 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.5.tgz", + "integrity": "sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.5.tgz", + "integrity": "sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.5.tgz", + "integrity": "sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.5.tgz", + "integrity": "sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.5.tgz", + "integrity": "sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.5.tgz", + "integrity": "sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.5.tgz", + "integrity": "sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.5.tgz", + "integrity": "sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.5.tgz", + "integrity": "sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.5.tgz", + "integrity": "sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.5.tgz", + "integrity": "sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.5.tgz", + "integrity": "sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.5.tgz", + "integrity": "sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.5.tgz", + "integrity": "sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.5.tgz", + "integrity": "sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.5.tgz", + "integrity": "sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.5.tgz", + "integrity": "sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.5.tgz", + "integrity": "sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.5.tgz", + "integrity": "sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.5.tgz", + "integrity": "sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.5.tgz", + "integrity": "sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.5.tgz", + "integrity": "sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.5.tgz", + "integrity": "sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.5.tgz", + "integrity": "sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.5.tgz", + "integrity": "sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", - "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==", + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", + "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", "dev": true, "license": "MIT", "dependencies": { @@ -200,13 +614,13 @@ } }, "node_modules/@eslint/config-array": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.1.tgz", - "integrity": "sha512-fo6Mtm5mWyKjA/Chy1BYTdn5mGJoDNjC7C64ug20ADsRDGrA85bN3uK3MaKbeRkRuuIEAR5N33Jr1pbm411/PA==", + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz", + "integrity": "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/object-schema": "^2.1.5", + "@eslint/object-schema": "^2.1.6", "debug": "^4.3.1", "minimatch": "^3.1.2" }, @@ -215,9 +629,9 @@ } }, "node_modules/@eslint/config-array/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", "dependencies": { @@ -238,10 +652,20 @@ "node": "*" } }, + "node_modules/@eslint/config-helpers": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.0.tgz", + "integrity": "sha512-ViuymvFmcJi04qdZeDc2whTHryouGcDlaxPqarTD0ZE10ISpxGUVZGZDx4w01upyIynL3iu6IXH2bS1NhclQMw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, "node_modules/@eslint/core": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.10.0.tgz", - "integrity": "sha512-gFHJ+xBOo4G3WRlR1e/3G8A6/KZAH6zcE/hkLRCZTi/B9avAG365QhFA8uOGzTMqgTghpn7/fSnscW++dpMSAw==", + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.14.0.tgz", + "integrity": "sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -252,9 +676,9 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.2.0.tgz", - "integrity": "sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", + "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", "dev": true, "license": "MIT", "dependencies": { @@ -276,9 +700,9 @@ } }, "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", "dependencies": { @@ -313,19 +737,22 @@ } }, "node_modules/@eslint/js": { - "version": "9.19.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.19.0.tgz", - "integrity": "sha512-rbq9/g38qjfqFLOVPvwjIvFFdNziEC5S65jmjPw5r6A//QH+W91akh9irMwjDN8zKUTak6W9EsAv4m/7Wnw0UQ==", + "version": "9.30.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.30.0.tgz", + "integrity": "sha512-Wzw3wQwPvc9sHM+NjakWTcPx11mbZyiYHuwWa/QfZ7cIRX7WK54PSk7bdyXDaoaopUcMatv1zaQvOAAO8hCdww==", "dev": true, "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" } }, "node_modules/@eslint/object-schema": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.5.tgz", - "integrity": "sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ==", + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", + "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -333,19 +760,32 @@ } }, "node_modules/@eslint/plugin-kit": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.5.tgz", - "integrity": "sha512-lB05FkqEdUg2AA0xEbUz0SnkXT1LcCTa438W4IWTUh4hdOnVbQyOJ81OrDXsJk/LSiJHubgGEFoR5EHq1NsH1A==", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.3.tgz", + "integrity": "sha512-1+WqvgNMhmlAambTvT3KPtCl/Ibr68VldY2XY40SL1CE0ZXiakFR/cbTspaF5HsnpDMvcYYoJHfl4980NBjGag==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/core": "^0.10.0", + "@eslint/core": "^0.15.1", "levn": "^0.4.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, + "node_modules/@eslint/plugin-kit/node_modules/@eslint/core": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.1.tgz", + "integrity": "sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, "node_modules/@humanfs/core": { "version": "0.19.1", "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", @@ -399,9 +839,9 @@ } }, "node_modules/@humanwhocodes/retry": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.1.tgz", - "integrity": "sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==", + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", "dev": true, "license": "Apache-2.0", "engines": { @@ -413,9 +853,9 @@ } }, "node_modules/@keyv/serialize": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@keyv/serialize/-/serialize-1.0.2.tgz", - "integrity": "sha512-+E/LyaAeuABniD/RvUezWVXKpeuvwLEA9//nE9952zBaOdBd2mQ3pPoM8cUe2X6IcMByfuSLzmYqnYshG60+HQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@keyv/serialize/-/serialize-1.0.3.tgz", + "integrity": "sha512-qnEovoOp5Np2JDGonIDL6Ayihw0RhnRh6vxPuHo4RDn1UOzwEo4AeIfpL6UGIrsceWrCMiVPgwRjbHu4vYFc3g==", "dev": true, "license": "MIT", "dependencies": { @@ -461,15 +901,16 @@ } }, "node_modules/@stylistic/eslint-plugin": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-3.0.0.tgz", - "integrity": "sha512-9GJI6iBtGjOqSsyCKUvE6Vn7qDT52hbQaoq/SwxH6A1bciymZfvBfHIIrD3E7Koi2sjzOa/MNQ2XOguHtVJOyw==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-5.1.0.tgz", + "integrity": "sha512-TJRJul4u/lmry5N/kyCU+7RWWOk0wyXN+BncRlDYBqpLFnzXkd7QGVfN7KewarFIXv0IX0jSF/Ksu7aHWEDeuw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/utils": "8.13.0", - "eslint-visitor-keys": "^4.2.0", - "espree": "^10.3.0", + "@eslint-community/eslint-utils": "^4.7.0", + "@typescript-eslint/types": "^8.34.1", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", "estraverse": "^5.3.0", "picomatch": "^4.0.2" }, @@ -477,13 +918,13 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "peerDependencies": { - "eslint": ">=8.40.0" + "eslint": ">=9.0.0" } }, "node_modules/@types/estree": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", - "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", "dev": true, "license": "MIT" }, @@ -494,28 +935,10 @@ "dev": true, "license": "MIT" }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.13.0.tgz", - "integrity": "sha512-XsGWww0odcUT0gJoBZ1DeulY1+jkaHUciUq4jKNv4cpInbvvrtDoyBH9rE/n2V29wQJPk8iCH1wipra9BhmiMA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.13.0", - "@typescript-eslint/visitor-keys": "8.13.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, "node_modules/@typescript-eslint/types": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.13.0.tgz", - "integrity": "sha512-4cyFErJetFLckcThRUFdReWJjVsPCqyBlJTi6IDEpc1GWCIIZRFxVppjWLIMcQhNGhdWJJRYFHpHoDWvMlDzng==", + "version": "8.35.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.35.1.tgz", + "integrity": "sha512-q/O04vVnKHfrrhNAscndAn1tuQhIkwqnaW+eu5waD5IPts2eX1dgJxgqcPx5BX109/qAz7IG6VrEPTOYKCNfRQ==", "dev": true, "license": "MIT", "engines": { @@ -526,99 +949,10 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.13.0.tgz", - "integrity": "sha512-v7SCIGmVsRK2Cy/LTLGN22uea6SaUIlpBcO/gnMGT/7zPtxp90bphcGf4fyrCQl3ZtiBKqVTG32hb668oIYy1g==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/types": "8.13.0", - "@typescript-eslint/visitor-keys": "8.13.0", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.13.0.tgz", - "integrity": "sha512-A1EeYOND6Uv250nybnLZapeXpYMl8tkzYUxqmoKAWnI4sei3ihf2XdZVd+vVOmHGcp3t+P7yRrNsyyiXTvShFQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.13.0", - "@typescript-eslint/types": "8.13.0", - "@typescript-eslint/typescript-estree": "8.13.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.13.0.tgz", - "integrity": "sha512-7N/+lztJqH4Mrf0lb10R/CbI1EaAMMGyF5y0oJvFoAhafwgiRA7TXyd8TFn8FC8k5y2dTsYogg238qavRGNnlw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.13.0", - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@zachleat/snow-fall": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@zachleat/snow-fall/-/snow-fall-1.0.3.tgz", - "integrity": "sha512-Y9srRbmO+k31vSm+eINYRV9DRoeWGV5/hlAn9o34bLpoWo+T5945v6XGBrFzQYjhyEGB4j/4zXuTW1zTxp2Reg==", - "license": "MIT" - }, "node_modules/acorn": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", - "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, "license": "MIT", "bin": { @@ -736,16 +1070,6 @@ ], "license": "MIT" }, - "node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, "node_modules/braces": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", @@ -785,24 +1109,24 @@ } }, "node_modules/cacheable": { - "version": "1.8.8", - "resolved": "https://registry.npmjs.org/cacheable/-/cacheable-1.8.8.tgz", - "integrity": "sha512-OE1/jlarWxROUIpd0qGBSKFLkNsotY8pt4GeiVErUYh/NUeTNrT+SBksUgllQv4m6a0W/VZsLuiHb88maavqEw==", + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/cacheable/-/cacheable-1.10.1.tgz", + "integrity": "sha512-Fa2BZY0CS9F0PFc/6aVA6tgpOdw+hmv9dkZOlHXII5v5Hw+meJBIWDcPrG9q/dXxGcNbym5t77fzmawrBQfTmQ==", "dev": true, "license": "MIT", "dependencies": { - "hookified": "^1.7.0", - "keyv": "^5.2.3" + "hookified": "^1.10.0", + "keyv": "^5.3.4" } }, "node_modules/cacheable/node_modules/keyv": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.2.3.tgz", - "integrity": "sha512-AGKecUfzrowabUv0bH1RIR5Vf7w+l4S3xtQAypKaUpTdIR1EbrAcTxHCrpo9Q+IWeUlFE2palRtgIQcgm+PQJw==", + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.3.4.tgz", + "integrity": "sha512-ypEvQvInNpUe+u+w8BIcPkQvEqXquyyibWE/1NB5T2BTzIpS5cGEV1LZskDzPSTvNAaT4+5FutvzlvnkxOSKlw==", "dev": true, "license": "MIT", "dependencies": { - "@keyv/serialize": "^1.0.2" + "@keyv/serialize": "^1.0.3" } }, "node_modules/callsites": { @@ -946,9 +1270,9 @@ } }, "node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "dev": true, "license": "MIT", "dependencies": { @@ -970,6 +1294,16 @@ "dev": true, "license": "MIT" }, + "node_modules/detect-libc": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", + "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -1010,6 +1344,47 @@ "is-arrayish": "^0.2.1" } }, + "node_modules/esbuild": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.5.tgz", + "integrity": "sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.5", + "@esbuild/android-arm": "0.25.5", + "@esbuild/android-arm64": "0.25.5", + "@esbuild/android-x64": "0.25.5", + "@esbuild/darwin-arm64": "0.25.5", + "@esbuild/darwin-x64": "0.25.5", + "@esbuild/freebsd-arm64": "0.25.5", + "@esbuild/freebsd-x64": "0.25.5", + "@esbuild/linux-arm": "0.25.5", + "@esbuild/linux-arm64": "0.25.5", + "@esbuild/linux-ia32": "0.25.5", + "@esbuild/linux-loong64": "0.25.5", + "@esbuild/linux-mips64el": "0.25.5", + "@esbuild/linux-ppc64": "0.25.5", + "@esbuild/linux-riscv64": "0.25.5", + "@esbuild/linux-s390x": "0.25.5", + "@esbuild/linux-x64": "0.25.5", + "@esbuild/netbsd-arm64": "0.25.5", + "@esbuild/netbsd-x64": "0.25.5", + "@esbuild/openbsd-arm64": "0.25.5", + "@esbuild/openbsd-x64": "0.25.5", + "@esbuild/sunos-x64": "0.25.5", + "@esbuild/win32-arm64": "0.25.5", + "@esbuild/win32-ia32": "0.25.5", + "@esbuild/win32-x64": "0.25.5" + } + }, "node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -1024,22 +1399,23 @@ } }, "node_modules/eslint": { - "version": "9.19.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.19.0.tgz", - "integrity": "sha512-ug92j0LepKlbbEv6hD911THhoRHmbdXt2gX+VDABAW/Ir7D3nqKdv5Pf5vtlyY6HQMTEP2skXY43ueqTCWssEA==", + "version": "9.30.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.30.0.tgz", + "integrity": "sha512-iN/SiPxmQu6EVkf+m1qpBxzUhE12YqFLOSySuOyVLJLEF9nzTf+h/1AJYc1JWzCnktggeNrjvQGLngDzXirU6g==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.19.0", - "@eslint/core": "^0.10.0", - "@eslint/eslintrc": "^3.2.0", - "@eslint/js": "9.19.0", - "@eslint/plugin-kit": "^0.2.5", + "@eslint/config-array": "^0.21.0", + "@eslint/config-helpers": "^0.3.0", + "@eslint/core": "^0.14.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.30.0", + "@eslint/plugin-kit": "^0.3.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.4.1", + "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", @@ -1047,9 +1423,9 @@ "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.2.0", - "eslint-visitor-keys": "^4.2.0", - "espree": "^10.3.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -1084,9 +1460,9 @@ } }, "node_modules/eslint-scope": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz", - "integrity": "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -1101,9 +1477,9 @@ } }, "node_modules/eslint-visitor-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", - "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", "dev": true, "license": "Apache-2.0", "engines": { @@ -1114,9 +1490,9 @@ } }, "node_modules/eslint/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", "dependencies": { @@ -1138,15 +1514,15 @@ } }, "node_modules/espree": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", - "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "acorn": "^8.14.0", + "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.2.0" + "eslint-visitor-keys": "^4.2.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1280,9 +1656,9 @@ } }, "node_modules/fastq": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.18.0.tgz", - "integrity": "sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==", + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", "dev": true, "license": "ISC", "dependencies": { @@ -1347,9 +1723,9 @@ } }, "node_modules/flatted": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz", - "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", "dev": true, "license": "ISC" }, @@ -1408,9 +1784,9 @@ } }, "node_modules/globals": { - "version": "15.14.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-15.14.0.tgz", - "integrity": "sha512-OkToC372DtlQeje9/zHIo5CT8lRP/FUgEOKBEhU4e0abL7J7CD24fD9ohiLN5hagG/kWCYj4K5oaxxtj2Z0Dig==", + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.2.0.tgz", + "integrity": "sha512-O+7l9tPdHCU320IigZZPj5zmRCFG9xHmx9cU8FqU2Rp+JN714seHV+2S9+JslCpY4gJwU2vOGox0wzgae/MCEg==", "dev": true, "license": "MIT", "engines": { @@ -1459,9 +1835,9 @@ } }, "node_modules/hookified": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/hookified/-/hookified-1.7.0.tgz", - "integrity": "sha512-XQdMjqC1AyeOzfs+17cnIk7Wdfu1hh2JtcyNfBf5u9jHrT3iZUlGHxLTntFBuk5lwkqJ6l3+daeQdHK5yByHVA==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/hookified/-/hookified-1.10.0.tgz", + "integrity": "sha512-dJw0492Iddsj56U1JsSTm9E/0B/29a1AuoSLRAte8vQg/kaTGF3IgjEWT8c8yG4cC10+HisE1x5QAwR0Xwc+DA==", "dev": true, "license": "MIT" }, @@ -1510,9 +1886,9 @@ } }, "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1679,9 +2055,9 @@ } }, "node_modules/known-css-properties": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.35.0.tgz", - "integrity": "sha512-a/RAk2BfKk+WFGhhOCAYqSiFLc34k8Mt/6NWRI4joER0EYUzXIcFivjjnoD3+XU1DggLn/tZc3DOAgke7l8a4A==", + "version": "0.37.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.37.0.tgz", + "integrity": "sha512-JCDrsP4Z1Sb9JwG0aJ8Eo2r7k4Ou5MwmThS/6lcIe1ICyb7UBJKGRIUUdqc2ASdE/42lgz6zFUnzAIhtXnBVrQ==", "dev": true, "license": "MIT" }, @@ -1699,6 +2075,488 @@ "node": ">= 0.8.0" } }, + "node_modules/lightningcss": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.1.tgz", + "integrity": "sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-darwin-arm64": "1.30.1", + "lightningcss-darwin-x64": "1.30.1", + "lightningcss-freebsd-x64": "1.30.1", + "lightningcss-linux-arm-gnueabihf": "1.30.1", + "lightningcss-linux-arm64-gnu": "1.30.1", + "lightningcss-linux-arm64-musl": "1.30.1", + "lightningcss-linux-x64-gnu": "1.30.1", + "lightningcss-linux-x64-musl": "1.30.1", + "lightningcss-win32-arm64-msvc": "1.30.1", + "lightningcss-win32-x64-msvc": "1.30.1" + } + }, + "node_modules/lightningcss-cli": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-cli/-/lightningcss-cli-1.30.1.tgz", + "integrity": "sha512-m3VtCMfPrEucBbdbJ4om7biAknXJUnMukGzE64Anww6iYgsEaBJJhXQZMLwwEEWtpZrQf78f1xejCDIBhumjUw==", + "dev": true, + "hasInstallScript": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "bin": { + "lightningcss": "lightningcss" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-cli-darwin-arm64": "1.30.1", + "lightningcss-cli-darwin-x64": "1.30.1", + "lightningcss-cli-freebsd-x64": "1.30.1", + "lightningcss-cli-linux-arm-gnueabihf": "1.30.1", + "lightningcss-cli-linux-arm64-gnu": "1.30.1", + "lightningcss-cli-linux-arm64-musl": "1.30.1", + "lightningcss-cli-linux-x64-gnu": "1.30.1", + "lightningcss-cli-linux-x64-musl": "1.30.1", + "lightningcss-cli-win32-arm64-msvc": "1.30.1", + "lightningcss-cli-win32-x64-msvc": "1.30.1" + } + }, + "node_modules/lightningcss-cli-darwin-arm64": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-cli-darwin-arm64/-/lightningcss-cli-darwin-arm64-1.30.1.tgz", + "integrity": "sha512-h00/Iq4Hjw+1Bm3Uoc2i1cryDdH1YhTK8e7d/Y/Wn2sUrdK9nVRxzuTk7qUur6KqVgXFthItAUhuGjFyDBJpmg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-cli-darwin-x64": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-cli-darwin-x64/-/lightningcss-cli-darwin-x64-1.30.1.tgz", + "integrity": "sha512-Q7hzbzkGe5EUMgojjYgnhT9wkSLZp0I9Q25IP7IDnMv2KMTdqUSLAn7YMu9Xqt22MspAuIWV7DkyTiN4xM7fIA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-cli-freebsd-x64": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-cli-freebsd-x64/-/lightningcss-cli-freebsd-x64-1.30.1.tgz", + "integrity": "sha512-0VbQDecfjJn7GtvtVbsdEnvR8OY8PyWiVnchbozjODqE4ASpDBjQDtSMbIDRvBtkk5Me6PFhVmCKfuyctCuDqQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-cli-linux-arm-gnueabihf": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-cli-linux-arm-gnueabihf/-/lightningcss-cli-linux-arm-gnueabihf-1.30.1.tgz", + "integrity": "sha512-ngJVmTygPRafw2sF7NFWwez54NKDO2AEY5IEm241qytAw+YsY/oAx/0gG2Fyq4HTGcKud9dc7kHQpWfDTXuGHg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-cli-linux-arm64-gnu": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-cli-linux-arm64-gnu/-/lightningcss-cli-linux-arm64-gnu-1.30.1.tgz", + "integrity": "sha512-2uh0vwHn0UyrZnVX2XCw8qbwLKuAwM1nLo43ddcviQum9rF08nHdPEqLXZfDzR/VA0pbyFjSw7EbbEBjXGsFxw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-cli-linux-arm64-musl": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-cli-linux-arm64-musl/-/lightningcss-cli-linux-arm64-musl-1.30.1.tgz", + "integrity": "sha512-IUrg/O4r7OPuGo+G9BGaDDodvAoLSq3f0pMmdiODCl8so/LkYvue7ySL8JQO8TebTKoUXE7VcZgdfoSVxkCbuQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-cli-linux-x64-gnu": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-cli-linux-x64-gnu/-/lightningcss-cli-linux-x64-gnu-1.30.1.tgz", + "integrity": "sha512-AoxyUYuwl/IGTFl178Kxm/MMIgao3s9bmp/RrTbh51+8LsUh9YWolvyhmVxfiCauJ70dfoknQ/tsa+NKs2XDfQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-cli-linux-x64-musl": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-cli-linux-x64-musl/-/lightningcss-cli-linux-x64-musl-1.30.1.tgz", + "integrity": "sha512-NSkm/6sKsMTvO/pf8hU1Nwalrz9VsmSC9AKTYmxNsLDrLtzc8PYobcauyv0b1MnXxO1KuqLmFiCnVzGU7WbRPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-cli-win32-arm64-msvc": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-cli-win32-arm64-msvc/-/lightningcss-cli-win32-arm64-msvc-1.30.1.tgz", + "integrity": "sha512-qDlhf9FAy+26MDMP14VWy+W5ho7KruR1ne2fYWKxgCGw7WZ5gnaaZpRBewp4KRd7lqo/opaIsK8kQy/WJTJD9A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-cli-win32-x64-msvc": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-cli-win32-x64-msvc/-/lightningcss-cli-win32-x64-msvc-1.30.1.tgz", + "integrity": "sha512-AwkpPbM9NABz1bRLr6GPrUa1wyOOUAZpOoR/HmDMOYPUAiQOlzxsNUR0/YreWbwD3X+dqkwXywSbwHddvTNZ1A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.1.tgz", + "integrity": "sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.1.tgz", + "integrity": "sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.1.tgz", + "integrity": "sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.1.tgz", + "integrity": "sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.1.tgz", + "integrity": "sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.1.tgz", + "integrity": "sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.1.tgz", + "integrity": "sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.1.tgz", + "integrity": "sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.1.tgz", + "integrity": "sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.1.tgz", + "integrity": "sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", @@ -1804,22 +2662,6 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -1828,9 +2670,9 @@ "license": "MIT" }, "node_modules/nanoid": { - "version": "3.3.8", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", - "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", "dev": true, "funding": [ { @@ -1996,9 +2838,9 @@ } }, "node_modules/postcss": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.1.tgz", - "integrity": "sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==", + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", "dev": true, "funding": [ { @@ -2016,7 +2858,7 @@ ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.8", + "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, @@ -2059,9 +2901,9 @@ } }, "node_modules/postcss-selector-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", - "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "dev": true, "license": "MIT", "dependencies": { @@ -2141,9 +2983,9 @@ } }, "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", "dev": true, "license": "MIT", "engines": { @@ -2175,19 +3017,6 @@ "queue-microtask": "^1.2.2" } }, - "node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -2304,9 +3133,9 @@ } }, "node_modules/stylelint": { - "version": "16.13.2", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.13.2.tgz", - "integrity": "sha512-wDlgh0mRO9RtSa3TdidqHd0nOG8MmUyVKl+dxA6C1j8aZRzpNeEgdhFmU5y4sZx4Fc6r46p0fI7p1vR5O2DZqA==", + "version": "16.21.0", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.21.0.tgz", + "integrity": "sha512-ki3PpJGG7xhm3WtINoWGnlvqAmbqSexoRMbEMJzlwewSIOqPRKPlq452c22xAdEJISVi80r+I7KL9GPUiwFgbg==", "dev": true, "funding": [ { @@ -2320,9 +3149,9 @@ ], "license": "MIT", "dependencies": { - "@csstools/css-parser-algorithms": "^3.0.4", - "@csstools/css-tokenizer": "^3.0.3", - "@csstools/media-query-list-parser": "^4.0.2", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/media-query-list-parser": "^4.0.3", "@csstools/selector-specificity": "^5.0.0", "@dual-bundle/import-meta-resolve": "^4.1.0", "balanced-match": "^2.0.0", @@ -2330,31 +3159,31 @@ "cosmiconfig": "^9.0.0", "css-functions-list": "^3.2.3", "css-tree": "^3.1.0", - "debug": "^4.3.7", + "debug": "^4.4.1", "fast-glob": "^3.3.3", "fastest-levenshtein": "^1.0.16", - "file-entry-cache": "^10.0.5", + "file-entry-cache": "^10.1.1", "global-modules": "^2.0.0", "globby": "^11.1.0", "globjoin": "^0.1.4", "html-tags": "^3.3.1", - "ignore": "^7.0.1", + "ignore": "^7.0.5", "imurmurhash": "^0.1.4", "is-plain-object": "^5.0.0", - "known-css-properties": "^0.35.0", + "known-css-properties": "^0.37.0", "mathml-tag-names": "^2.1.3", "meow": "^13.2.0", "micromatch": "^4.0.8", "normalize-path": "^3.0.0", "picocolors": "^1.1.1", - "postcss": "^8.4.49", + "postcss": "^8.5.5", "postcss-resolve-nested-selector": "^0.1.6", "postcss-safe-parser": "^7.0.1", - "postcss-selector-parser": "^7.0.0", + "postcss-selector-parser": "^7.1.0", "postcss-value-parser": "^4.2.0", "resolve-from": "^5.0.0", "string-width": "^4.2.3", - "supports-hyperlinks": "^3.1.0", + "supports-hyperlinks": "^3.2.0", "svg-tags": "^1.0.0", "table": "^6.9.0", "write-file-atomic": "^5.0.1" @@ -2367,9 +3196,9 @@ } }, "node_modules/stylelint-config-recommended": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-15.0.0.tgz", - "integrity": "sha512-9LejMFsat7L+NXttdHdTq94byn25TD+82bzGRiV1Pgasl99pWnwipXS5DguTpp3nP1XjvLXVnEJIuYBfsRjRkA==", + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-16.0.0.tgz", + "integrity": "sha512-4RSmPjQegF34wNcK1e1O3Uz91HN8P1aFdFzio90wNK9mjgAI19u5vsU868cVZboKzCaa5XbpvtTzAAGQAxpcXA==", "dev": true, "funding": [ { @@ -2386,13 +3215,13 @@ "node": ">=18.12.0" }, "peerDependencies": { - "stylelint": "^16.13.0" + "stylelint": "^16.16.0" } }, "node_modules/stylelint-config-standard": { - "version": "37.0.0", - "resolved": "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-37.0.0.tgz", - "integrity": "sha512-+6eBlbSTrOn/il2RlV0zYGQwRTkr+WtzuVSs1reaWGObxnxLpbcspCUYajVQHonVfxVw2U+h42azGhrBvcg8OA==", + "version": "38.0.0", + "resolved": "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-38.0.0.tgz", + "integrity": "sha512-uj3JIX+dpFseqd/DJx8Gy3PcRAJhlEZ2IrlFOc4LUxBX/PNMEQ198x7LCOE2Q5oT9Vw8nyc4CIL78xSqPr6iag==", "dev": true, "funding": [ { @@ -2406,13 +3235,13 @@ ], "license": "MIT", "dependencies": { - "stylelint-config-recommended": "^15.0.0" + "stylelint-config-recommended": "^16.0.0" }, "engines": { "node": ">=18.12.0" }, "peerDependencies": { - "stylelint": "^16.13.0" + "stylelint": "^16.18.0" } }, "node_modules/stylelint/node_modules/balanced-match": { @@ -2423,31 +3252,31 @@ "license": "MIT" }, "node_modules/stylelint/node_modules/file-entry-cache": { - "version": "10.0.5", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-10.0.5.tgz", - "integrity": "sha512-umpQsJrBNsdMDgreSryMEXvJh66XeLtZUwA8Gj7rHGearGufUFv6rB/bcXRFsiGWw/VeSUgUofF4Rf2UKEOrTA==", + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-10.1.1.tgz", + "integrity": "sha512-zcmsHjg2B2zjuBgjdnB+9q0+cWcgWfykIcsDkWDB4GTPtl1eXUA+gTI6sO0u01AqK3cliHryTU55/b2Ow1hfZg==", "dev": true, "license": "MIT", "dependencies": { - "flat-cache": "^6.1.5" + "flat-cache": "^6.1.10" } }, "node_modules/stylelint/node_modules/flat-cache": { - "version": "6.1.5", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-6.1.5.tgz", - "integrity": "sha512-QR+2kN38f8nMfiIQ1LHYjuDEmZNZVjxuxY+HufbS3BW0EX01Q5OnH7iduOYRutmgiXb797HAKcXUeXrvRjjgSQ==", + "version": "6.1.11", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-6.1.11.tgz", + "integrity": "sha512-zfOAns94mp7bHG/vCn9Ru2eDCmIxVQ5dELUHKjHfDEOJmHNzE+uGa6208kfkgmtym4a0FFjEuFksCXFacbVhSg==", "dev": true, "license": "MIT", "dependencies": { - "cacheable": "^1.8.7", - "flatted": "^3.3.2", - "hookified": "^1.6.0" + "cacheable": "^1.10.1", + "flatted": "^3.3.3", + "hookified": "^1.10.0" } }, "node_modules/stylelint/node_modules/ignore": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.3.tgz", - "integrity": "sha512-bAH5jbK/F3T3Jls4I0SO1hmPR0dKU0a7+SY6n1yzRtG54FLO8d6w/nxLFX2Nb7dBu6cCWXPaAME6cYqFUMmuCA==", + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", "dev": true, "license": "MIT", "engines": { @@ -2478,9 +3307,9 @@ } }, "node_modules/supports-hyperlinks": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.1.0.tgz", - "integrity": "sha512-2rn0BZ+/f7puLOHZm1HOJfwBggfaHXUpPUSSG/SWM4TWp5KCfmNYwnC3hruy2rZlMnmWZ+QAGpZfchu3f3695A==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.2.0.tgz", + "integrity": "sha512-zFObLMyZeEwzAoKCyu1B91U79K2t7ApXuQfo8OuxwXLDgcKxuwM+YvcbIhm6QWqz7mHUH1TVytR1PwVVjEuMig==", "dev": true, "license": "MIT", "dependencies": { @@ -2491,7 +3320,7 @@ "node": ">=14.18" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/supports-hyperlinks?sponsor=1" } }, "node_modules/svg-tags": { @@ -2554,19 +3383,6 @@ "node": ">=8.0" } }, - "node_modules/ts-api-utils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.3.tgz", - "integrity": "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "typescript": ">=4.2.0" - } - }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -2581,11 +3397,12 @@ } }, "node_modules/typescript": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", - "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", + "version": "5.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", + "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", "dev": true, "license": "Apache-2.0", + "optional": true, "peer": true, "bin": { "tsc": "bin/tsc", diff --git a/package.json b/package.json index c70f52f0..d0179b11 100644 --- a/package.json +++ b/package.json @@ -7,21 +7,23 @@ "license": "CC0-1.0", "devDependencies": { "@eslint/js": "^9.6.0", - "@stylistic/eslint-plugin": "^3.0.0", + "@stylistic/eslint-plugin": "^5.1.0", + "esbuild": "^0.25.2", "eslint": "^9.7.0", - "globals": "^15.8.0", + "globals": "^16.0.0", + "lightningcss": "^1.29.3", + "lightningcss-cli": "^1.29.3", "stylelint": "^16.7.0", - "stylelint-config-standard": "^37.0.0" + "stylelint-config-standard": "^38.0.0" }, "scripts": { "eslint": "eslint public/assets/js/*.js", - "stylelint": "stylelint public/assets/css/*.css", + "stylelint": "stylelint resources/css/*.css", "lint": "npm run eslint && npm run stylelint", + "lightningcss": "lightningcss --output-dir public/assets/css --sourcemap --bundle --minify resources/css/app.css", + "fix-sourcemap": "./scripts/fix-sourcemap.sh", + "build-css": "npm run lightningcss && npm run fix-sourcemap", "compress": "./scripts/compress.sh", "build": "npm run lint && npm run compress" - }, - "dependencies": { - "@11ty/is-land": "^4.0.0", - "@zachleat/snow-fall": "^1.0.2" } } diff --git a/postcss.config.js b/postcss.config.js deleted file mode 100644 index f0ba5a6f..00000000 --- a/postcss.config.js +++ /dev/null @@ -1,16 +0,0 @@ -module.exports = { - plugins: { - 'postcss-import': {}, - 'autoprefixer': {}, - '@csstools/postcss-oklab-function': { - preserve: true - }, - 'postcss-nesting': {}, - 'postcss-combine-media-query': {}, - 'postcss-combine-duplicated-selectors': { - removeDuplicatedProperties: true, - removeDuplicatedValues: true - }, - 'cssnano': { preset: 'default' }, - } -}; diff --git a/psalm.xml b/psalm.xml deleted file mode 100644 index da693b64..00000000 --- a/psalm.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - diff --git a/public/assets/css/app.css b/public/assets/css/app.css index 12bddcc2..07bfbf3d 100644 --- a/public/assets/css/app.css +++ b/public/assets/css/app.css @@ -1,8 +1,2 @@ -@import url('variables.css'); -@import url('fonts.css'); -@import url('layout.css'); -@import url('colours.css'); -@import url('code.css'); -@import url('content.css'); -@import url('notes.css'); -@import url('indieauth.css'); +:root{--font-family-headings:"Rockwell","Rockwell Nova","Roboto Slab","DejaVu Serif","Sitka Small",serif;--font-family-body:"Charter","Bitstream Charter","Sitka Text","Cambria",serif;--font-family-monospace:ui-monospace,"Cascadia Code","Source Code Pro","Menlo","Consolas","DejaVu Sans Mono",monospace;--font-size-sm:.75rem;--font-size-base:1rem;--font-size-md:1.25rem;--font-size-lg:1.5rem;--font-size-xl:1.75rem;--font-size-xxl:2rem;--font-size-xxxl:2.25rem;--color-primary:oklch(36.8% .1 125.505);--color-secondary:oklch(96.3% .1 125.505);--color-link:oklch(48.09% .146 241.41);--color-link-visited:oklch(70.44% .21 304.41);--color-primary-shadow:oklch(19.56% .054 125.505/.4);--rss-color-link:oklch(67.59% .189 42.04);--color-danger:oklch(64.41% .281 23.29);--color-danger-shadow:oklch(64.41% .281 23.29/.1)}body{font-family:var(--font-family-body);font-size:var(--font-size-md)}code{font-family:var(--font-family-monospace)}h1,h2,h3,h4,h5,h6{font-family:var(--font-family-headings)}.grid{grid-template-rows:min-content 1fr min-content;grid-template-columns:5vw 1fr 5vw;row-gap:1rem;display:grid}#site-header{grid-area:1/2/2/3;& .rss-icon{& svg{width:auto;height:1rem}}}main{grid-area:2/2/3/3}.h-feed{flex-direction:column;gap:2rem;display:flex}.h-entry{& p:first-of-type,& h1:first-of-type{margin-block-start:0}}.pagination{margin-block-start:1rem}footer{grid-area:3/2/4/3;& .iwc-logo{max-width:85vw}& .footer-actions{flex-direction:row;gap:1rem;display:flex}}body{background-color:var(--color-secondary);color:var(--color-primary)}a{color:var(--color-link);&:visited{color:var(--color-link-visited)}&.auth:visited{color:var(--color-link)}}#site-header{& a:visited{color:var(--color-link)}& .rss-icon{& svg{color:var(--rss-color-link)}}}.hljs{border-radius:.5rem}.h-card{& .hovercard{z-index:100;box-shadow:0 .5rem .5rem .5rem var(--color-primary-shadow);background-color:var(--color-secondary);opacity:0;border-radius:1rem;flex-direction:column;gap:.5rem;width:fit-content;padding:1rem;transition:opacity .5s ease-in-out;display:none;position:absolute;& .u-photo{max-width:6rem}& .social-icon{width:1rem;height:1rem}}&:hover{& .hovercard{opacity:1;display:flex}}}.h-entry{border-inline-start:1px solid var(--color-primary);padding-inline-start:.5rem;& .reply-to{font-style:italic}& .post-info{& a{text-decoration:none}}& .note-metadata{flex-direction:row;gap:1rem;display:flex;& .replies,& .likes,& .reposts{flex-direction:row;align-items:center;gap:.5rem;display:inline-flex}& .syndication-links{flex-flow:wrap;& a{text-decoration:none;& svg{width:1rem;height:1rem}}}}}.feather{stroke:currentColor;stroke-width:2px;stroke-linecap:round;stroke-linejoin:round;fill:none;width:24px;height:24px}.sr-only{clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap;width:1px;height:1px;position:absolute;overflow:hidden}main{&>.u-comment{border-inline-start:1px solid var(--color-primary);margin-block-start:2rem;margin-inline-start:2rem;padding-inline-start:.5rem;& .mini-h-card{flex-direction:row;align-items:baseline;display:inline-flex;& .u-photo{border-radius:50%;width:2rem;height:2rem;margin-block-end:.5rem}}}& .notes-subtitle{font-size:1.2rem;font-weight:600}& .webmentions-author-list{flex-flow:wrap;gap:1rem;display:flex;& img{border-radius:50%;width:4rem;height:4rem}}}.indieauth{& .error{color:var(--color-danger);background-color:var(--color-danger-shadow);border:1px solid var(--color-danger);border-radius:.5rem;width:fit-content;margin-block-end:1rem;padding-block:.5rem;padding-inline:1rem;display:flex}} +/*# sourceMappingURL=/assets/css/app.css.map */ diff --git a/public/assets/css/app.css.br b/public/assets/css/app.css.br index 8a4bcff6..405c55ea 100644 Binary files a/public/assets/css/app.css.br and b/public/assets/css/app.css.br differ diff --git a/public/assets/css/app.css.map b/public/assets/css/app.css.map new file mode 100644 index 00000000..877478ee --- /dev/null +++ b/public/assets/css/app.css.map @@ -0,0 +1 @@ +{"version":3,"mappings":"AGAA,4yBEAA,uEAKA,8CAIA,0DJTA,iHAOA,+BAIE,YACE,+BAOJ,uBAKA,oDAMA,SACE,2DAMF,oCAIA,yBAIE,2BAIA,4DKjDF,wEAKA,0BAGE,0CAIA,wCAKF,aACE,oCAIA,YACE,oCEvBJ,0BCAA,QACE,0RAcE,0BAIA,uCAMF,QACE,sCFxBJ,uFAIE,8BAIA,aACE,0BAKF,0DAKE,mGASA,oCAGE,yBAGE,iCASR,0HAUA,2HHvDA,KACE,4IAME,2EAKE,6EASJ,mDAKA,gEAKE,iDF/BJ,WACE","sources":["resources/css/app.css","resources/css/layout.css","resources/css/indieauth.css","resources/css/variables.css","resources/css/notes.css","resources/css/colours.css","resources/css/content.css","resources/css/code.css","resources/css/fonts.css","resources/css/h-card.css"],"sourcesContent":["@import url('variables.css');\n@import url('fonts.css');\n@import url('layout.css');\n@import url('colours.css');\n@import url('code.css');\n@import url('content.css');\n@import url('notes.css');\n@import url('indieauth.css');\n",".grid {\n display: grid;\n grid-template-columns: 5vw 1fr 5vw;\n grid-template-rows: min-content 1fr min-content;\n row-gap: 1rem;\n}\n\n#site-header {\n grid-column: 2 / 3;\n grid-row: 1 / 2;\n\n & .rss-icon {\n & svg {\n width: auto;\n height: 1rem;\n }\n }\n}\n\nmain {\n grid-column: 2 / 3;\n grid-row: 2 / 3;\n}\n\n.h-feed {\n display: flex;\n flex-direction: column;\n gap: 2rem;\n}\n\n.h-entry {\n & p:first-of-type,\n & h1:first-of-type {\n margin-block-start: 0;\n }\n}\n\n.pagination {\n margin-block-start: 1rem;\n}\n\nfooter {\n grid-column: 2 / 3;\n grid-row: 3 / 4;\n\n & .iwc-logo {\n max-width: 85vw;\n }\n\n & .footer-actions {\n display: flex;\n flex-direction: row;\n gap: 1rem;\n }\n}\n",".indieauth {\n .error {\n color: var(--color-danger);\n background-color: var(--color-danger-shadow);\n border: 1px solid var(--color-danger);\n border-radius: .5rem;\n display: flex;\n padding-inline: 1rem;\n padding-block: .5rem;\n width: fit-content;\n margin-block-end: 1rem;\n }\n}\n",":root {\n /* Font Family */\n --font-family-headings: 'Rockwell', 'Rockwell Nova', 'Roboto Slab', 'DejaVu Serif', 'Sitka Small', serif;\n --font-family-body: 'Charter', 'Bitstream Charter', 'Sitka Text', 'Cambria', serif;\n --font-family-monospace: ui-monospace, 'Cascadia Code', 'Source Code Pro', 'Menlo', 'Consolas', 'DejaVu Sans Mono', monospace;\n\n /* Font Size */\n --font-size-sm: 0.75rem; /* 12px */\n --font-size-base: 1rem; /* 16px, base */\n --font-size-md: 1.25rem; /* 20px */\n --font-size-lg: 1.5rem; /* 24px */\n --font-size-xl: 1.75rem; /* 28px */\n --font-size-xxl: 2rem; /* 32px */\n --font-size-xxxl: 2.25rem; /* 36px */\n\n /* Colours */\n --color-primary: oklch(36.8% 0.1 125.505deg);\n --color-secondary: oklch(96.3% 0.1 125.505deg);\n --color-link: oklch(48.09% 0.146 241.41deg);\n --color-link-visited: oklch(70.44% 0.21 304.41deg);\n --color-primary-shadow: oklch(19.56% 0.054 125.505deg / 40%);\n --rss-color-link: oklch(67.59% 0.189 42.04deg);\n --color-danger: oklch(64.41% 0.281 23.29deg);\n --color-danger-shadow: oklch(64.41% 0.281 23.29deg / 10%);\n}\n","main {\n & > .u-comment {\n margin-block-start: 2rem;\n margin-inline-start: 2rem;\n border-inline-start: 1px solid var(--color-primary);\n padding-inline-start: .5rem;\n\n & .mini-h-card {\n display: inline-flex;\n flex-direction: row;\n align-items: baseline;\n\n & .u-photo {\n width: 2rem;\n height: 2rem;\n border-radius: 50%;\n margin-block-end: 0.5rem;\n }\n }\n }\n\n & .notes-subtitle {\n font-size: 1.2rem;\n font-weight: 600;\n }\n\n & .webmentions-author-list {\n display: flex;\n flex-flow: row wrap;\n gap: 1rem;\n\n & img {\n width: 4rem;\n height: 4rem;\n border-radius: 50%;\n }\n }\n}\n","body {\n background-color: var(--color-secondary);\n color: var(--color-primary);\n}\n\na {\n color: var(--color-link);\n\n &:visited {\n color: var(--color-link-visited);\n }\n\n &.auth:visited {\n color: var(--color-link);\n }\n}\n\n#site-header {\n & a:visited {\n color: var(--color-link);\n }\n\n & .rss-icon {\n & svg {\n color: var(--rss-color-link);\n }\n }\n}\n","@import url('h-card.css');\n\n.h-entry {\n border-inline-start: 1px solid var(--color-primary);\n padding-inline-start: .5rem;\n\n & .reply-to {\n font-style: italic;\n }\n\n & .post-info {\n & a {\n text-decoration: none;\n }\n }\n\n & .note-metadata {\n display: flex;\n flex-direction: row;\n gap: 1rem;\n\n & .replies,\n & .likes,\n & .reposts {\n display: inline-flex;\n flex-direction: row;\n gap: .5rem;\n align-items: center;\n }\n\n & .syndication-links {\n flex-flow: row wrap;\n\n & a {\n text-decoration: none;\n\n & svg {\n width: 1rem;\n height: 1rem;\n }\n }\n }\n }\n}\n\n.feather {\n width: 24px;\n height: 24px;\n stroke: currentcolor;\n stroke-width: 2;\n stroke-linecap: round;\n stroke-linejoin: round;\n fill: none;\n}\n\n.sr-only {\n clip: rect(0 0 0 0);\n clip-path: inset(50%);\n height: 1px;\n overflow: hidden;\n position: absolute;\n white-space: nowrap;\n width: 1px;\n}\n",".hljs {\n border-radius: .5rem;\n}\n","body {\n font-family: var(--font-family-body);\n font-size: var(--font-size-md);\n}\n\ncode {\n font-family: var(--font-family-monospace);\n}\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n font-family: var(--font-family-headings);\n}\n",".h-card {\n & .hovercard {\n display: none;\n position: absolute;\n z-index: 100;\n padding: 1rem;\n border-radius: 1rem;\n box-shadow: 0 .5rem .5rem .5rem var(--color-primary-shadow);\n background-color: var(--color-secondary);\n width: fit-content;\n transition: opacity 0.5s ease-in-out;\n opacity: 0;\n flex-direction: column;\n gap: .5rem;\n\n & .u-photo {\n max-width: 6rem;\n }\n\n & .social-icon {\n width: 1rem;\n height: 1rem;\n }\n }\n\n &:hover {\n & .hovercard {\n display: flex;\n opacity: 1;\n }\n }\n}\n"],"names":[]} \ No newline at end of file diff --git a/public/assets/css/app.css.zst b/public/assets/css/app.css.zst index f27d4f69..460b37b6 100644 Binary files a/public/assets/css/app.css.zst and b/public/assets/css/app.css.zst differ diff --git a/public/assets/css/colours.css.br b/public/assets/css/colours.css.br deleted file mode 100644 index ddedc7a3..00000000 Binary files a/public/assets/css/colours.css.br and /dev/null differ diff --git a/public/assets/css/colours.css.zst b/public/assets/css/colours.css.zst deleted file mode 100644 index fd30b78c..00000000 Binary files a/public/assets/css/colours.css.zst and /dev/null differ diff --git a/public/assets/css/content.css.br b/public/assets/css/content.css.br deleted file mode 100644 index ae9d299d..00000000 Binary files a/public/assets/css/content.css.br and /dev/null differ diff --git a/public/assets/css/content.css.zst b/public/assets/css/content.css.zst deleted file mode 100644 index 01cfa187..00000000 Binary files a/public/assets/css/content.css.zst and /dev/null differ diff --git a/public/assets/css/fonts.css.br b/public/assets/css/fonts.css.br deleted file mode 100644 index a99e5684..00000000 Binary files a/public/assets/css/fonts.css.br and /dev/null differ diff --git a/public/assets/css/fonts.css.zst b/public/assets/css/fonts.css.zst deleted file mode 100644 index c8ec55f1..00000000 Binary files a/public/assets/css/fonts.css.zst and /dev/null differ diff --git a/public/assets/css/h-card.css.br b/public/assets/css/h-card.css.br deleted file mode 100644 index 8dd3d22d..00000000 Binary files a/public/assets/css/h-card.css.br and /dev/null differ diff --git a/public/assets/css/h-card.css.zst b/public/assets/css/h-card.css.zst deleted file mode 100644 index b54e6a24..00000000 Binary files a/public/assets/css/h-card.css.zst and /dev/null differ diff --git a/public/assets/css/indieauth.css.br b/public/assets/css/indieauth.css.br deleted file mode 100644 index abb4c9c7..00000000 Binary files a/public/assets/css/indieauth.css.br and /dev/null differ diff --git a/public/assets/css/indieauth.css.zst b/public/assets/css/indieauth.css.zst deleted file mode 100644 index 5e9e979f..00000000 Binary files a/public/assets/css/indieauth.css.zst and /dev/null differ diff --git a/public/assets/css/layout.css.br b/public/assets/css/layout.css.br deleted file mode 100644 index 2fe4608b..00000000 Binary files a/public/assets/css/layout.css.br and /dev/null differ diff --git a/public/assets/css/layout.css.zst b/public/assets/css/layout.css.zst deleted file mode 100644 index aa9bded4..00000000 Binary files a/public/assets/css/layout.css.zst and /dev/null differ diff --git a/public/assets/css/notes.css.br b/public/assets/css/notes.css.br deleted file mode 100644 index 686ddf2f..00000000 Binary files a/public/assets/css/notes.css.br and /dev/null differ diff --git a/public/assets/css/notes.css.zst b/public/assets/css/notes.css.zst deleted file mode 100644 index f9cdbf82..00000000 Binary files a/public/assets/css/notes.css.zst and /dev/null differ diff --git a/public/assets/css/variables.css.br b/public/assets/css/variables.css.br deleted file mode 100644 index 4ff480f4..00000000 Binary files a/public/assets/css/variables.css.br and /dev/null differ diff --git a/public/assets/css/variables.css.zst b/public/assets/css/variables.css.zst deleted file mode 100644 index e1ccda8b..00000000 Binary files a/public/assets/css/variables.css.zst and /dev/null differ diff --git a/public/assets/frontend/is-land.js b/public/assets/frontend/is-land.js deleted file mode 100644 index 435a13b9..00000000 --- a/public/assets/frontend/is-land.js +++ /dev/null @@ -1,338 +0,0 @@ -class Island extends HTMLElement { - static tagName = "is-land"; - static prefix = "is-land--"; - static attr = { - template: "data-island", - ready: "ready", - defer: "defer-hydration", - }; - - static onceCache = new Map(); - static onReady = new Map(); - - static fallback = { - ":not(is-land,:defined,[defer-hydration])": (readyPromise, node, prefix) => { - // remove from document to prevent web component init - let cloned = document.createElement(prefix + node.localName); - for(let attr of node.getAttributeNames()) { - cloned.setAttribute(attr, node.getAttribute(attr)); - } - - // Declarative Shadow DOM (with polyfill) - let shadowroot = node.shadowRoot; - if(!shadowroot) { - let tmpl = node.querySelector(":scope > template:is([shadowrootmode], [shadowroot])"); - if(tmpl) { - let mode = tmpl.getAttribute("shadowrootmode") || tmpl.getAttribute("shadowroot") || "closed"; - shadowroot = node.attachShadow({ mode }); // default is closed - shadowroot.appendChild(tmpl.content.cloneNode(true)); - } - } - - // Cheers to https://gist.github.com/developit/45c85e9be01e8c3f1a0ec073d600d01e - if(shadowroot) { - cloned.attachShadow({ mode: shadowroot.mode }).append(...shadowroot.childNodes); - } - - // Keep *same* child nodes to preserve state of children (e.g. details->summary) - cloned.append(...node.childNodes); - node.replaceWith(cloned); - - return readyPromise.then(() => { - // Restore original children and shadow DOM - if(cloned.shadowRoot) { - node.shadowRoot.append(...cloned.shadowRoot.childNodes); - } - node.append(...cloned.childNodes); - cloned.replaceWith(node); - }); - } - } - - constructor() { - super(); - - // Internal promises - this.ready = new Promise(resolve => { - this.readyResolve = resolve; - }); - } - - // any parents of `el` that are (with conditions) - static getParents(el, stopAt = false) { - let nodes = []; - while(el) { - if(el.matches && el.matches(Island.tagName)) { - if(stopAt && el === stopAt) { - break; - } - - if(Conditions.hasConditions(el)) { - nodes.push(el); - } - } - el = el.parentNode; - } - return nodes; - } - - static async ready(el, parents) { - if(!parents) { - parents = Island.getParents(el); - } - if(parents.length === 0) { - return; - } - let imports = await Promise.all(parents.map(p => p.wait())); - // return innermost module import - if(imports.length) { - return imports[0]; - } - } - - forceFallback() { - if(window.Island) { - Object.assign(Island.fallback, window.Island.fallback); - } - - for(let selector in Island.fallback) { - // Reverse here as a cheap way to get the deepest nodes first - let components = Array.from(this.querySelectorAll(selector)).reverse(); - - // with thanks to https://gist.github.com/cowboy/938767 - for(let node of components) { - if(!node.isConnected) { - continue; - } - - let parents = Island.getParents(node); - // must be in a leaf island (not nested deep) - if(parents.length === 1) { - let p = Island.ready(node, parents); - Island.fallback[selector](p, node, Island.prefix); - } - } - } - } - - wait() { - return this.ready; - } - - async connectedCallback() { - // Only use fallback content with loading conditions - if(Conditions.hasConditions(this)) { - // Keep fallback content without initializing the components - this.forceFallback(); - } - - await this.hydrate(); - } - - getTemplates() { - return this.querySelectorAll(`template[${Island.attr.template}]`); - } - - replaceTemplates(templates) { - // replace