From d8225932f3e02353c9d0c57a4841dade2c5d998d Mon Sep 17 00:00:00 2001 From: Kovah Date: Fri, 31 Jan 2025 15:25:26 +0100 Subject: [PATCH 01/61] Fix tests, add :latest for Docker images --- .github/workflows/build-docker.yml | 2 +- .github/workflows/test.yml | 12 ------------ 2 files changed, 1 insertion(+), 13 deletions(-) diff --git a/.github/workflows/build-docker.yml b/.github/workflows/build-docker.yml index 9474c3bb..7a13cad8 100644 --- a/.github/workflows/build-docker.yml +++ b/.github/workflows/build-docker.yml @@ -40,7 +40,7 @@ jobs: DOCKER_IMAGE_GITHUB=ghcr.io/kovah/linkace MAJOR_VERSION=2.x VERSION=${GITHUB_REF#refs/tags/} - TAGS="${DOCKER_IMAGE}:${VERSION},${DOCKER_IMAGE}:${MAJOR_VERSION},${DOCKER_IMAGE_GITHUB}:${VERSION},${DOCKER_IMAGE_GITHUB}:${MAJOR_VERSION}" + TAGS="${DOCKER_IMAGE}:${VERSION},${DOCKER_IMAGE}:${MAJOR_VERSION},${DOCKER_IMAGE}:latest,${DOCKER_IMAGE_GITHUB}:${VERSION},${DOCKER_IMAGE_GITHUB}:${MAJOR_VERSION},${DOCKER_IMAGE_GITHUB}:latest" echo "tags=${TAGS}" >> $GITHUB_OUTPUT - name: Build and push advanced image diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 0f3ce600..7d2d7d72 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -97,15 +97,3 @@ jobs: with: project-token: ${{ secrets.CODACY_PROJECT_TOKEN }} coverage-reports: ./test-coverage.xml - - - uses: actions/upload-artifact@v4 - if: failure() - with: - name: application-logs - path: storage/logs - - - uses: actions/upload-artifact@v4 - if: failure() - with: - name: application-public - path: public From ea08d7824c50be6b37cc89485412774afc0f4bb9 Mon Sep 17 00:00:00 2001 From: Matty Jorgensen Date: Fri, 31 Jan 2025 11:24:37 -0600 Subject: [PATCH 02/61] Add Content-Type header validation middleware If Content-Type is not set to 'application/json' for API requests, return a 415 Unsupported Media Type. --- app/Http/Kernel.php | 1 + .../ContentTypeHeaderValidationMiddleware.php | 30 +++++++++++++++++++ phpunit.xml | 3 ++ ...tentTypeHeaderValidationMiddlewareTest.php | 22 ++++++++++++++ 4 files changed, 56 insertions(+) create mode 100644 app/Http/Middleware/ContentTypeHeaderValidationMiddleware.php create mode 100644 tests/Middleware/ContentTypeHeaderValidationMiddlewareTest.php diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php index b0d6f183..97e63b3f 100644 --- a/app/Http/Kernel.php +++ b/app/Http/Kernel.php @@ -43,6 +43,7 @@ class Kernel extends HttpKernel 'api' => [ // Throttling is configured in routes/api.php \Illuminate\Routing\Middleware\SubstituteBindings::class, + \App\Http\Middleware\ContentTypeHeaderValidationMiddleware::class, ], ]; diff --git a/app/Http/Middleware/ContentTypeHeaderValidationMiddleware.php b/app/Http/Middleware/ContentTypeHeaderValidationMiddleware.php new file mode 100644 index 00000000..1833e96e --- /dev/null +++ b/app/Http/Middleware/ContentTypeHeaderValidationMiddleware.php @@ -0,0 +1,30 @@ +method() === "POST" && $request->header('Content-Type') !== 'application/json') { + return response()->json([ + 'error' => 'Invalid Content-Type' + ], 415); + } + + return $next($request); + } +} diff --git a/phpunit.xml b/phpunit.xml index 760f6480..cf482359 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -20,6 +20,9 @@ ./tests/Helper + + ./tests/Middleware + ./tests/Migrations diff --git a/tests/Middleware/ContentTypeHeaderValidationMiddlewareTest.php b/tests/Middleware/ContentTypeHeaderValidationMiddlewareTest.php new file mode 100644 index 00000000..dd385b88 --- /dev/null +++ b/tests/Middleware/ContentTypeHeaderValidationMiddlewareTest.php @@ -0,0 +1,22 @@ +handle($request, function () { + }); + + $this->assertEquals(415, $response->getStatusCode()); + } +} From 6ebc7502522572929c669709245630bad0694530 Mon Sep 17 00:00:00 2001 From: Matty Jorgensen Date: Fri, 31 Jan 2025 11:43:51 -0600 Subject: [PATCH 03/61] Validate Content-Type for POST and PATCH requests --- app/Http/Middleware/ContentTypeHeaderValidationMiddleware.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/Http/Middleware/ContentTypeHeaderValidationMiddleware.php b/app/Http/Middleware/ContentTypeHeaderValidationMiddleware.php index 1833e96e..852cd0a3 100644 --- a/app/Http/Middleware/ContentTypeHeaderValidationMiddleware.php +++ b/app/Http/Middleware/ContentTypeHeaderValidationMiddleware.php @@ -19,7 +19,8 @@ class ContentTypeHeaderValidationMiddleware */ public function handle(Request $request, Closure $next): mixed { - if ($request->method() === "POST" && $request->header('Content-Type') !== 'application/json') { + $checkMethods = ['POST', 'PATCH']; + if (in_array($request->method(), $checkMethods) && $request->header('Content-Type') !== 'application/json') { return response()->json([ 'error' => 'Invalid Content-Type' ], 415); From dc85a2d911e3882b97641cab824e642f8009c643 Mon Sep 17 00:00:00 2001 From: Matty Jorgensen Date: Fri, 31 Jan 2025 11:34:41 -0600 Subject: [PATCH 04/61] Add test cases to LinkApiTest using incorrect Content-Type, asserting 415 --- tests/Controller/API/LinkApiTest.php | 40 ++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/tests/Controller/API/LinkApiTest.php b/tests/Controller/API/LinkApiTest.php index 7d986fca..7a2de573 100644 --- a/tests/Controller/API/LinkApiTest.php +++ b/tests/Controller/API/LinkApiTest.php @@ -152,6 +152,27 @@ public function test_full_create_request(): void ]); } + public function test_create_invalid_content_type_request(): void + { + $list = LinkList::factory()->create(['name' => 'Test List 1']); + $tag = Tag::factory()->create(['name' => 'a test 1']); + $tag2 = Tag::factory()->create(['name' => 'tag #2']); + + $this->postJsonAuthorized('api/v2/links', [ + 'url' => 'https://example.com', + 'title' => 'Search the Web', + 'description' => 'There could be a description here', + 'lists' => [$list->id], + 'tags' => [$tag->id, $tag2->id], + 'visibility' => 1, + 'check_disabled' => false, + ], ['Content-Type' => 'application/xml']) + ->assertUnsupportedMediaType() + ->assertJson([ + 'error' => "Invalid Content-Type" + ]); + } + public function test_create_request_with_list(): void { $list = LinkList::factory()->create(['name' => 'Test List 1']); @@ -448,6 +469,25 @@ public function test_update_request(): void ])->assertForbidden(); } + public function test_update_invalid_content_type_request(): void + { + $list = LinkList::factory()->create(); + $this->createTestLinks(); + + $this->patchJsonAuthorized('api/v2/links/1', [ + 'url' => 'https://new-public-link.com', + 'title' => 'Custom Title', + 'description' => 'Custom Description', + 'lists' => [$list->id], + 'is_private' => false, + 'check_disabled' => false, + ], ['Content-Type' => 'application/xml']) + ->assertUnsupportedMediaType() + ->assertJson([ + 'error' => 'Invalid Content-Type' + ]); + } + public function test_invalid_update_request(): void { Link::factory()->create(); From 325e74e586327c899776791996d4b3625858518e Mon Sep 17 00:00:00 2001 From: Kovah Date: Sat, 1 Feb 2025 23:45:04 +0100 Subject: [PATCH 05/61] Make MAIL_DRIVER and MAIL_MAILER possible for mail configuration --- config/mail.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/mail.php b/config/mail.php index 4ee969d7..e33c4bd0 100644 --- a/config/mail.php +++ b/config/mail.php @@ -13,7 +13,7 @@ | */ - 'default' => env('MAIL_MAILER', 'log'), + 'default' => env('MAIL_MAILER', env('MAIL_DRIVER', 'log')), /* |-------------------------------------------------------------------------- From bac23250be5786d3ec15f2721390f4de2050b033 Mon Sep 17 00:00:00 2001 From: Kovah Date: Thu, 6 Feb 2025 10:53:12 +0100 Subject: [PATCH 06/61] Correct handling of disabled backup notifications --- app/Console/Kernel.php | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php index 6ad1f7ce..28eae5cb 100644 --- a/app/Console/Kernel.php +++ b/app/Console/Kernel.php @@ -18,13 +18,17 @@ protected function schedule(Schedule $schedule): void $schedule->command('links:check')->everyTwoHours()->withoutOverlapping(); if (config('backup.backup.enabled')) { - $notificationsDisabled = config('backup.notifications.enabled') === false; + $backupArgs = []; - $schedule->command('backup:clean', ['--disable-notifications' => $notificationsDisabled]) + if (config('backup.notifications.enabled') === false) { + $backupArgs[] = '--disable-notifications'; + } + + $schedule->command('backup:clean', $backupArgs) ->daily() ->at(config('backup.backup.clean_hour')); - $schedule->command('backup:run', ['--disable-notifications' => $notificationsDisabled]) + $schedule->command('backup:run', $backupArgs) ->daily() ->at(config('backup.backup.backup_hour')); } From 7f77b10fc19e48586dd87e5308eecefcd9d245c5 Mon Sep 17 00:00:00 2001 From: Kovah Date: Thu, 6 Feb 2025 11:02:19 +0100 Subject: [PATCH 07/61] Optimize handling of lists and tags in guest mode --- app/Http/Controllers/Guest/ListController.php | 7 +++++-- app/Http/Controllers/Guest/TagController.php | 12 +++++++----- tests/Controller/Guest/ListControllerTest.php | 6 ++---- tests/Controller/Guest/TagControllerTest.php | 5 ++--- 4 files changed, 16 insertions(+), 14 deletions(-) diff --git a/app/Http/Controllers/Guest/ListController.php b/app/Http/Controllers/Guest/ListController.php index 167d27cf..8b92d312 100644 --- a/app/Http/Controllers/Guest/ListController.php +++ b/app/Http/Controllers/Guest/ListController.php @@ -2,6 +2,7 @@ namespace App\Http\Controllers\Guest; +use App\Enums\ModelAttribute; use App\Http\Controllers\Controller; use App\Http\Controllers\Traits\ChecksOrdering; use App\Http\Controllers\Traits\ConfiguresLinkDisplay; @@ -38,11 +39,13 @@ public function index(Request $request): View ]); } - public function show(Request $request, int $listID): View + public function show(Request $request, LinkList $list): View { $this->updateLinkDisplayForGuest(); - $list = LinkList::publicOnly()->findOrFail($listID); + if ($list->visibility !== ModelAttribute::VISIBILITY_PUBLIC) { + abort(404); + } $this->orderBy = $request->input('orderBy', 'created_at'); $this->orderDir = $request->input('orderBy', 'desc'); diff --git a/app/Http/Controllers/Guest/TagController.php b/app/Http/Controllers/Guest/TagController.php index e2871e69..27cf7eae 100644 --- a/app/Http/Controllers/Guest/TagController.php +++ b/app/Http/Controllers/Guest/TagController.php @@ -2,10 +2,10 @@ namespace App\Http\Controllers\Guest; +use App\Enums\ModelAttribute; use App\Http\Controllers\Controller; use App\Http\Controllers\Traits\ChecksOrdering; use App\Http\Controllers\Traits\ConfiguresLinkDisplay; -use App\Http\Controllers\Traits\HandlesQueryOrder; use App\Models\Tag; use Illuminate\Contracts\View\View; use Illuminate\Http\Request; @@ -27,7 +27,7 @@ public function index(Request $request): View $this->checkOrdering(); $tags = Tag::publicOnly() - ->withCount(['links' => fn ($query) => $query->publicOnly()]) + ->withCount(['links' => fn($query) => $query->publicOnly()]) ->orderBy($this->orderBy, $this->orderDir) ->paginate(getPaginationLimit()); @@ -40,16 +40,18 @@ public function index(Request $request): View ]); } - public function show(Request $request, int $tagID): View + public function show(Request $request, Tag $tag): View { + if ($tag->visibility !== ModelAttribute::VISIBILITY_PUBLIC) { + abort(404); + } + $this->updateLinkDisplayForGuest(); $this->orderBy = $request->input('orderBy', 'created_at'); $this->orderDir = $request->input('orderBy', 'desc'); $this->checkOrdering(); - $tag = Tag::publicOnly()->findOrFail($tagID); - $links = $tag->links() ->publicOnly() ->orderBy($this->orderBy, $this->orderDir) diff --git a/tests/Controller/Guest/ListControllerTest.php b/tests/Controller/Guest/ListControllerTest.php index b463ea40..e30c5026 100644 --- a/tests/Controller/Guest/ListControllerTest.php +++ b/tests/Controller/Guest/ListControllerTest.php @@ -4,7 +4,6 @@ use App\Models\LinkList; use App\Models\User; -use App\Settings\SettingsAudit; use App\Settings\SystemSettings; use Illuminate\Foundation\Testing\RefreshDatabase; use Tests\TestCase; @@ -66,8 +65,7 @@ public function test_invalid_list_detail_response(): void 'visibility' => 3, ]); - $response = $this->get('guest/lists/1'); - - $response->assertNotFound(); + $this->get('guest/lists/1')->assertNotFound(); + $this->get('guest/lists/mylist')->assertNotFound(); } } diff --git a/tests/Controller/Guest/TagControllerTest.php b/tests/Controller/Guest/TagControllerTest.php index eca385fd..7b1a3b09 100644 --- a/tests/Controller/Guest/TagControllerTest.php +++ b/tests/Controller/Guest/TagControllerTest.php @@ -64,8 +64,7 @@ public function test_invalid_tag_detail_response(): void Tag::factory()->create(['visibility' => 3]); - $response = $this->get('guest/tags/1'); - - $response->assertNotFound(); + $this->get('guest/tags/1')->assertNotFound(); + $this->get('guest/tags/myTag')->assertNotFound(); } } From 7f666508d0242b8545009c75dc778d8a6bfb4175 Mon Sep 17 00:00:00 2001 From: Kovah Date: Thu, 6 Feb 2025 11:14:18 +0100 Subject: [PATCH 08/61] Add /api/version endpoint --- config/app.php | 13 +++++++++++++ routes/api.php | 2 ++ tests/Controller/API/GeneralApiTest.php | 5 +++++ 3 files changed, 20 insertions(+) diff --git a/config/app.php b/config/app.php index 82dc0b78..a397c0eb 100644 --- a/config/app.php +++ b/config/app.php @@ -60,6 +60,19 @@ 'asset_url' => env('ASSET_URL'), + /* + |-------------------------------------------------------------------------- + | API Version + |-------------------------------------------------------------------------- + | + | Returns the current version of the API via /api/version to that clients + | or other third party applications can properly determine which version + | is currently supported. + | + */ + + 'api_version' => 'v2', + /* |-------------------------------------------------------------------------- | Application Timezone diff --git a/routes/api.php b/routes/api.php index 7d6d38ea..c8a7b447 100644 --- a/routes/api.php +++ b/routes/api.php @@ -24,6 +24,8 @@ | */ +Route::get('version', fn() => json_encode(['version' => config('app.api_version')])); + Route::prefix('v2') ->middleware(['auth:sanctum', 'throttle:' . config('app.api_rate_limit')]) ->group(function () { diff --git a/tests/Controller/API/GeneralApiTest.php b/tests/Controller/API/GeneralApiTest.php index 42f10478..37555a18 100644 --- a/tests/Controller/API/GeneralApiTest.php +++ b/tests/Controller/API/GeneralApiTest.php @@ -14,6 +14,11 @@ protected function setUp(): void parent::setUp(); } + public function test_version(): void + { + $this->getJsonAuthorized('api/version')->assertJson(['version' => 'v2']); + } + public function test_custom_rate_limit(): void { $response = $this->getJsonAuthorized('api/v2/links'); From ad5507805004370828b468ef5e42e80ff1741655 Mon Sep 17 00:00:00 2001 From: Kovah Date: Thu, 6 Feb 2025 11:15:46 +0100 Subject: [PATCH 09/61] 2.1.0 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index a911adcc..f780417a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "linkace", - "version": "2.0.0", + "version": "2.1.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "linkace", - "version": "2.0.0", + "version": "2.1.0", "license": "GPL-3.0-or-later", "dependencies": { "bootstrap": "^5.3.3", diff --git a/package.json b/package.json index d29ef452..19e0498d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "linkace", - "version": "2.0.0", + "version": "2.1.0", "description": "A small, selfhosted bookmark manager with advanced features, built with Laravel and Docker", "homepage": "https://github.com/Kovah/LinkAce", "repository": { From b3e0f65e9b9a523be495b1e006f676cd401a1b84 Mon Sep 17 00:00:00 2001 From: Kovah Date: Thu, 6 Feb 2025 11:26:14 +0100 Subject: [PATCH 10/61] Update dependencies --- composer.lock | 385 +++++++++++++++++++++++----------------------- package-lock.json | 288 +++++++++++++++++----------------- 2 files changed, 340 insertions(+), 333 deletions(-) diff --git a/composer.lock b/composer.lock index 2207753c..e58246cf 100644 --- a/composer.lock +++ b/composer.lock @@ -62,16 +62,16 @@ }, { "name": "aws/aws-sdk-php", - "version": "3.337.1", + "version": "3.339.7", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "fa70febad922e9868c83bfe03c6d078fc2633e17" + "reference": "7b7e48ce7970c0416c5fda045df7b93948fbf643" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/fa70febad922e9868c83bfe03c6d078fc2633e17", - "reference": "fa70febad922e9868c83bfe03c6d078fc2633e17", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/7b7e48ce7970c0416c5fda045df7b93948fbf643", + "reference": "7b7e48ce7970c0416c5fda045df7b93948fbf643", "shasum": "" }, "require": { @@ -79,31 +79,31 @@ "ext-json": "*", "ext-pcre": "*", "ext-simplexml": "*", - "guzzlehttp/guzzle": "^6.5.8 || ^7.4.5", - "guzzlehttp/promises": "^1.4.0 || ^2.0", - "guzzlehttp/psr7": "^1.9.1 || ^2.4.5", - "mtdowling/jmespath.php": "^2.6", - "php": ">=7.2.5", - "psr/http-message": "^1.0 || ^2.0" + "guzzlehttp/guzzle": "^7.4.5", + "guzzlehttp/promises": "^2.0", + "guzzlehttp/psr7": "^2.4.5", + "mtdowling/jmespath.php": "^2.8.0", + "php": ">=8.1", + "psr/http-message": "^2.0" }, "require-dev": { "andrewsville/php-token-reflection": "^1.4", "aws/aws-php-sns-message-validator": "~1.0", "behat/behat": "~3.0", - "composer/composer": "^1.10.22", + "composer/composer": "^2.7.8", "dms/phpunit-arraysubset-asserts": "^0.4.0", "doctrine/cache": "~1.4", "ext-dom": "*", "ext-openssl": "*", "ext-pcntl": "*", "ext-sockets": "*", - "nette/neon": "^2.3", "paragonie/random_compat": ">= 2", "phpunit/phpunit": "^5.6.3 || ^8.5 || ^9.5", - "psr/cache": "^1.0 || ^2.0 || ^3.0", - "psr/simple-cache": "^1.0 || ^2.0 || ^3.0", - "sebastian/comparator": "^1.2.3 || ^4.0", - "yoast/phpunit-polyfills": "^1.0" + "psr/cache": "^2.0 || ^3.0", + "psr/simple-cache": "^2.0 || ^3.0", + "sebastian/comparator": "^1.2.3 || ^4.0 || ^5.0", + "symfony/filesystem": "^v6.4.0 || ^v7.1.0", + "yoast/phpunit-polyfills": "^2.0" }, "suggest": { "aws/aws-php-sns-message-validator": "To validate incoming SNS notifications", @@ -152,11 +152,11 @@ "sdk" ], "support": { - "forum": "https://forums.aws.amazon.com/forum.jspa?forumID=80", + "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.337.1" + "source": "https://github.com/aws/aws-sdk-php/tree/3.339.7" }, - "time": "2025-01-16T19:12:46+00:00" + "time": "2025-02-05T19:06:15+00:00" }, { "name": "bacon/bacon-qr-code", @@ -1189,16 +1189,16 @@ }, { "name": "firebase/php-jwt", - "version": "v6.10.2", + "version": "v6.11.0", "source": { "type": "git", "url": "https://github.com/firebase/php-jwt.git", - "reference": "30c19ed0f3264cb660ea496895cfb6ef7ee3653b" + "reference": "8f718f4dfc9c5d5f0c994cdfd103921b43592712" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/firebase/php-jwt/zipball/30c19ed0f3264cb660ea496895cfb6ef7ee3653b", - "reference": "30c19ed0f3264cb660ea496895cfb6ef7ee3653b", + "url": "https://api.github.com/repos/firebase/php-jwt/zipball/8f718f4dfc9c5d5f0c994cdfd103921b43592712", + "reference": "8f718f4dfc9c5d5f0c994cdfd103921b43592712", "shasum": "" }, "require": { @@ -1246,9 +1246,9 @@ ], "support": { "issues": "https://github.com/firebase/php-jwt/issues", - "source": "https://github.com/firebase/php-jwt/tree/v6.10.2" + "source": "https://github.com/firebase/php-jwt/tree/v6.11.0" }, - "time": "2024-11-24T11:22:49+00:00" + "time": "2025-01-23T05:11:06+00:00" }, { "name": "fruitcake/php-cors", @@ -1710,16 +1710,16 @@ }, { "name": "guzzlehttp/uri-template", - "version": "v1.0.3", + "version": "v1.0.4", "source": { "type": "git", "url": "https://github.com/guzzle/uri-template.git", - "reference": "ecea8feef63bd4fef1f037ecb288386999ecc11c" + "reference": "30e286560c137526eccd4ce21b2de477ab0676d2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/uri-template/zipball/ecea8feef63bd4fef1f037ecb288386999ecc11c", - "reference": "ecea8feef63bd4fef1f037ecb288386999ecc11c", + "url": "https://api.github.com/repos/guzzle/uri-template/zipball/30e286560c137526eccd4ce21b2de477ab0676d2", + "reference": "30e286560c137526eccd4ce21b2de477ab0676d2", "shasum": "" }, "require": { @@ -1776,7 +1776,7 @@ ], "support": { "issues": "https://github.com/guzzle/uri-template/issues", - "source": "https://github.com/guzzle/uri-template/tree/v1.0.3" + "source": "https://github.com/guzzle/uri-template/tree/v1.0.4" }, "funding": [ { @@ -1792,7 +1792,7 @@ "type": "tidelift" } ], - "time": "2023-12-03T19:50:20+00:00" + "time": "2025-02-03T10:55:03+00:00" }, { "name": "jean85/pretty-package-versions", @@ -2052,31 +2052,31 @@ }, { "name": "laravel/fortify", - "version": "v1.25.2", + "version": "v1.25.4", "source": { "type": "git", "url": "https://github.com/laravel/fortify.git", - "reference": "a20e8033e7329b05820007c398f06065a38ae188" + "reference": "f185600e2d3a861834ad00ee3b7863f26ac25d3f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/fortify/zipball/a20e8033e7329b05820007c398f06065a38ae188", - "reference": "a20e8033e7329b05820007c398f06065a38ae188", + "url": "https://api.github.com/repos/laravel/fortify/zipball/f185600e2d3a861834ad00ee3b7863f26ac25d3f", + "reference": "f185600e2d3a861834ad00ee3b7863f26ac25d3f", "shasum": "" }, "require": { "bacon/bacon-qr-code": "^3.0", "ext-json": "*", - "illuminate/support": "^10.0|^11.0", + "illuminate/support": "^10.0|^11.0|^12.0", "php": "^8.1", "pragmarx/google2fa": "^8.0", "symfony/console": "^6.0|^7.0" }, "require-dev": { "mockery/mockery": "^1.0", - "orchestra/testbench": "^8.16|^9.0", + "orchestra/testbench": "^8.16|^9.0|^10.0", "phpstan/phpstan": "^1.10", - "phpunit/phpunit": "^10.4" + "phpunit/phpunit": "^10.4|^11.3" }, "type": "library", "extra": { @@ -2113,20 +2113,20 @@ "issues": "https://github.com/laravel/fortify/issues", "source": "https://github.com/laravel/fortify" }, - "time": "2025-01-10T20:33:47+00:00" + "time": "2025-01-26T19:34:46+00:00" }, { "name": "laravel/framework", - "version": "v10.48.25", + "version": "v10.48.28", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "f132b23b13909cc22c615c01b0c5640541c3da0c" + "reference": "e714e7e0c1ae51bf747e3df5b10fa60c54e3e0e1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/f132b23b13909cc22c615c01b0c5640541c3da0c", - "reference": "f132b23b13909cc22c615c01b0c5640541c3da0c", + "url": "https://api.github.com/repos/laravel/framework/zipball/e714e7e0c1ae51bf747e3df5b10fa60c54e3e0e1", + "reference": "e714e7e0c1ae51bf747e3df5b10fa60c54e3e0e1", "shasum": "" }, "require": { @@ -2320,7 +2320,7 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2024-11-26T15:32:57+00:00" + "time": "2025-01-31T10:04:17+00:00" }, { "name": "laravel/prompts", @@ -2509,34 +2509,34 @@ }, { "name": "laravel/socialite", - "version": "v5.16.1", + "version": "v5.17.1", "source": { "type": "git", "url": "https://github.com/laravel/socialite.git", - "reference": "4e5be83c0b3ecf81b2ffa47092e917d1f79dce71" + "reference": "4b44c97c04da28e5aabb73df70b0999e9976382f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/socialite/zipball/4e5be83c0b3ecf81b2ffa47092e917d1f79dce71", - "reference": "4e5be83c0b3ecf81b2ffa47092e917d1f79dce71", + "url": "https://api.github.com/repos/laravel/socialite/zipball/4b44c97c04da28e5aabb73df70b0999e9976382f", + "reference": "4b44c97c04da28e5aabb73df70b0999e9976382f", "shasum": "" }, "require": { "ext-json": "*", "firebase/php-jwt": "^6.4", "guzzlehttp/guzzle": "^6.0|^7.0", - "illuminate/contracts": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0", - "illuminate/http": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0", - "illuminate/support": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0", + "illuminate/contracts": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0", + "illuminate/http": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0", + "illuminate/support": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0", "league/oauth1-client": "^1.11", "php": "^7.2|^8.0", "phpseclib/phpseclib": "^3.0" }, "require-dev": { "mockery/mockery": "^1.0", - "orchestra/testbench": "^4.0|^5.0|^6.0|^7.0|^8.0|^9.0", + "orchestra/testbench": "^4.0|^5.0|^6.0|^7.0|^8.0|^9.0|^10.0", "phpstan/phpstan": "^1.10", - "phpunit/phpunit": "^8.0|^9.3|^10.4" + "phpunit/phpunit": "^8.0|^9.3|^10.4|^11.5" }, "type": "library", "extra": { @@ -2577,7 +2577,7 @@ "issues": "https://github.com/laravel/socialite/issues", "source": "https://github.com/laravel/socialite" }, - "time": "2024-12-11T16:43:51+00:00" + "time": "2025-01-28T15:16:52+00:00" }, { "name": "league/commonmark", @@ -5428,16 +5428,16 @@ }, { "name": "sentry/sentry-laravel", - "version": "4.10.2", + "version": "4.12.0", "source": { "type": "git", "url": "https://github.com/getsentry/sentry-laravel.git", - "reference": "0e2e5bc4311da51349487afcf67b8fca937f6d94" + "reference": "da1ee3417dfb3576a6aaa0f8b25892ebdb98fdb0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/getsentry/sentry-laravel/zipball/0e2e5bc4311da51349487afcf67b8fca937f6d94", - "reference": "0e2e5bc4311da51349487afcf67b8fca937f6d94", + "url": "https://api.github.com/repos/getsentry/sentry-laravel/zipball/da1ee3417dfb3576a6aaa0f8b25892ebdb98fdb0", + "reference": "da1ee3417dfb3576a6aaa0f8b25892ebdb98fdb0", "shasum": "" }, "require": { @@ -5501,7 +5501,7 @@ ], "support": { "issues": "https://github.com/getsentry/sentry-laravel/issues", - "source": "https://github.com/getsentry/sentry-laravel/tree/4.10.2" + "source": "https://github.com/getsentry/sentry-laravel/tree/4.12.0" }, "funding": [ { @@ -5513,7 +5513,7 @@ "type": "custom" } ], - "time": "2024-12-17T11:38:58+00:00" + "time": "2025-02-05T13:13:03+00:00" }, { "name": "shaarli/netscape-bookmark-parser", @@ -6302,16 +6302,16 @@ }, { "name": "spatie/laravel-package-tools", - "version": "1.18.0", + "version": "1.18.3", "source": { "type": "git", "url": "https://github.com/spatie/laravel-package-tools.git", - "reference": "8332205b90d17164913244f4a8e13ab7e6761d29" + "reference": "ba67eee37d86ed775dab7dad58a7cbaf9a6cfe78" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-package-tools/zipball/8332205b90d17164913244f4a8e13ab7e6761d29", - "reference": "8332205b90d17164913244f4a8e13ab7e6761d29", + "url": "https://api.github.com/repos/spatie/laravel-package-tools/zipball/ba67eee37d86ed775dab7dad58a7cbaf9a6cfe78", + "reference": "ba67eee37d86ed775dab7dad58a7cbaf9a6cfe78", "shasum": "" }, "require": { @@ -6350,7 +6350,7 @@ ], "support": { "issues": "https://github.com/spatie/laravel-package-tools/issues", - "source": "https://github.com/spatie/laravel-package-tools/tree/1.18.0" + "source": "https://github.com/spatie/laravel-package-tools/tree/1.18.3" }, "funding": [ { @@ -6358,34 +6358,34 @@ "type": "github" } ], - "time": "2024-12-30T13:13:39+00:00" + "time": "2025-01-22T08:51:18+00:00" }, { "name": "spatie/laravel-permission", - "version": "6.10.1", + "version": "6.13.0", "source": { "type": "git", "url": "https://github.com/spatie/laravel-permission.git", - "reference": "8bb69d6d67387f7a00d93a2f5fab98860f06e704" + "reference": "bb3ad222d65ec804c219cc52a8b54f5af2e1636a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-permission/zipball/8bb69d6d67387f7a00d93a2f5fab98860f06e704", - "reference": "8bb69d6d67387f7a00d93a2f5fab98860f06e704", + "url": "https://api.github.com/repos/spatie/laravel-permission/zipball/bb3ad222d65ec804c219cc52a8b54f5af2e1636a", + "reference": "bb3ad222d65ec804c219cc52a8b54f5af2e1636a", "shasum": "" }, "require": { - "illuminate/auth": "^8.12|^9.0|^10.0|^11.0", - "illuminate/container": "^8.12|^9.0|^10.0|^11.0", - "illuminate/contracts": "^8.12|^9.0|^10.0|^11.0", - "illuminate/database": "^8.12|^9.0|^10.0|^11.0", + "illuminate/auth": "^8.12|^9.0|^10.0|^11.0|^12.0", + "illuminate/container": "^8.12|^9.0|^10.0|^11.0|^12.0", + "illuminate/contracts": "^8.12|^9.0|^10.0|^11.0|^12.0", + "illuminate/database": "^8.12|^9.0|^10.0|^11.0|^12.0", "php": "^8.0" }, "require-dev": { - "larastan/larastan": "^1.0|^2.0", "laravel/passport": "^11.0|^12.0", - "orchestra/testbench": "^6.23|^7.0|^8.0|^9.0", - "phpunit/phpunit": "^9.4|^10.1" + "laravel/pint": "^1.0", + "orchestra/testbench": "^6.23|^7.0|^8.0|^9.0|^10.0", + "phpunit/phpunit": "^9.4|^10.1|^11.5" }, "type": "library", "extra": { @@ -6433,7 +6433,7 @@ ], "support": { "issues": "https://github.com/spatie/laravel-permission/issues", - "source": "https://github.com/spatie/laravel-permission/tree/6.10.1" + "source": "https://github.com/spatie/laravel-permission/tree/6.13.0" }, "funding": [ { @@ -6441,20 +6441,20 @@ "type": "github" } ], - "time": "2024-11-08T18:45:41+00:00" + "time": "2025-02-05T15:42:48+00:00" }, { "name": "spatie/laravel-settings", - "version": "3.4.0", + "version": "3.4.1", "source": { "type": "git", "url": "https://github.com/spatie/laravel-settings.git", - "reference": "2da8cb5b051678725476b299ef8e13b2e5015260" + "reference": "a596c671b5e059b0e3cd7e52c9f576b1d3e06154" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-settings/zipball/2da8cb5b051678725476b299ef8e13b2e5015260", - "reference": "2da8cb5b051678725476b299ef8e13b2e5015260", + "url": "https://api.github.com/repos/spatie/laravel-settings/zipball/a596c671b5e059b0e3cd7e52c9f576b1d3e06154", + "reference": "a596c671b5e059b0e3cd7e52c9f576b1d3e06154", "shasum": "" }, "require": { @@ -6516,7 +6516,7 @@ ], "support": { "issues": "https://github.com/spatie/laravel-settings/issues", - "source": "https://github.com/spatie/laravel-settings/tree/3.4.0" + "source": "https://github.com/spatie/laravel-settings/tree/3.4.1" }, "funding": [ { @@ -6528,7 +6528,7 @@ "type": "github" } ], - "time": "2024-09-20T13:48:17+00:00" + "time": "2025-01-31T14:51:02+00:00" }, { "name": "spatie/laravel-signal-aware-command", @@ -6893,16 +6893,16 @@ }, { "name": "symfony/error-handler", - "version": "v6.4.17", + "version": "v6.4.18", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "37ad2380e8c1a8cf62a1200a5c10080b679b446c" + "reference": "e8d3b5b1975e67812a54388b1ba8e9ec28eb770e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/37ad2380e8c1a8cf62a1200a5c10080b679b446c", - "reference": "37ad2380e8c1a8cf62a1200a5c10080b679b446c", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/e8d3b5b1975e67812a54388b1ba8e9ec28eb770e", + "reference": "e8d3b5b1975e67812a54388b1ba8e9ec28eb770e", "shasum": "" }, "require": { @@ -6948,7 +6948,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/v6.4.17" + "source": "https://github.com/symfony/error-handler/tree/v6.4.18" }, "funding": [ { @@ -6964,7 +6964,7 @@ "type": "tidelift" } ], - "time": "2024-12-06T13:30:51+00:00" + "time": "2025-01-06T09:38:16+00:00" }, { "name": "symfony/event-dispatcher", @@ -7188,16 +7188,16 @@ }, { "name": "symfony/http-client", - "version": "v6.4.17", + "version": "v6.4.18", "source": { "type": "git", "url": "https://github.com/symfony/http-client.git", - "reference": "88898d842eb29d7e1a903724c94e90a6ca9c0509" + "reference": "394b440934056b8d9d6ba250001458e9d7998b7f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client/zipball/88898d842eb29d7e1a903724c94e90a6ca9c0509", - "reference": "88898d842eb29d7e1a903724c94e90a6ca9c0509", + "url": "https://api.github.com/repos/symfony/http-client/zipball/394b440934056b8d9d6ba250001458e9d7998b7f", + "reference": "394b440934056b8d9d6ba250001458e9d7998b7f", "shasum": "" }, "require": { @@ -7261,7 +7261,7 @@ "http" ], "support": { - "source": "https://github.com/symfony/http-client/tree/v6.4.17" + "source": "https://github.com/symfony/http-client/tree/v6.4.18" }, "funding": [ { @@ -7277,7 +7277,7 @@ "type": "tidelift" } ], - "time": "2024-12-18T12:18:31+00:00" + "time": "2025-01-28T15:49:13+00:00" }, { "name": "symfony/http-client-contracts", @@ -7359,16 +7359,16 @@ }, { "name": "symfony/http-foundation", - "version": "v6.4.16", + "version": "v6.4.18", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "431771b7a6f662f1575b3cfc8fd7617aa9864d57" + "reference": "d0492d6217e5ab48f51fca76f64cf8e78919d0db" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/431771b7a6f662f1575b3cfc8fd7617aa9864d57", - "reference": "431771b7a6f662f1575b3cfc8fd7617aa9864d57", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/d0492d6217e5ab48f51fca76f64cf8e78919d0db", + "reference": "d0492d6217e5ab48f51fca76f64cf8e78919d0db", "shasum": "" }, "require": { @@ -7416,7 +7416,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v6.4.16" + "source": "https://github.com/symfony/http-foundation/tree/v6.4.18" }, "funding": [ { @@ -7432,20 +7432,20 @@ "type": "tidelift" } ], - "time": "2024-11-13T18:58:10+00:00" + "time": "2025-01-09T15:48:56+00:00" }, { "name": "symfony/http-kernel", - "version": "v6.4.17", + "version": "v6.4.18", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "c5647393c5ce11833d13e4b70fff4b571d4ac710" + "reference": "fca7197bfe9e99dfae7fb1ad3f7f5bd9ef80e1b7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/c5647393c5ce11833d13e4b70fff4b571d4ac710", - "reference": "c5647393c5ce11833d13e4b70fff4b571d4ac710", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/fca7197bfe9e99dfae7fb1ad3f7f5bd9ef80e1b7", + "reference": "fca7197bfe9e99dfae7fb1ad3f7f5bd9ef80e1b7", "shasum": "" }, "require": { @@ -7530,7 +7530,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/v6.4.17" + "source": "https://github.com/symfony/http-kernel/tree/v6.4.18" }, "funding": [ { @@ -7546,20 +7546,20 @@ "type": "tidelift" } ], - "time": "2024-12-31T14:49:31+00:00" + "time": "2025-01-29T07:25:58+00:00" }, { "name": "symfony/mailer", - "version": "v6.4.13", + "version": "v6.4.18", "source": { "type": "git", "url": "https://github.com/symfony/mailer.git", - "reference": "c2f7e0d8d7ac8fe25faccf5d8cac462805db2663" + "reference": "e93a6ae2767d7f7578c2b7961d9d8e27580b2b11" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mailer/zipball/c2f7e0d8d7ac8fe25faccf5d8cac462805db2663", - "reference": "c2f7e0d8d7ac8fe25faccf5d8cac462805db2663", + "url": "https://api.github.com/repos/symfony/mailer/zipball/e93a6ae2767d7f7578c2b7961d9d8e27580b2b11", + "reference": "e93a6ae2767d7f7578c2b7961d9d8e27580b2b11", "shasum": "" }, "require": { @@ -7610,7 +7610,7 @@ "description": "Helps sending emails", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/mailer/tree/v6.4.13" + "source": "https://github.com/symfony/mailer/tree/v6.4.18" }, "funding": [ { @@ -7626,7 +7626,7 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:18:03+00:00" + "time": "2025-01-24T15:27:15+00:00" }, { "name": "symfony/mailgun-mailer", @@ -7699,16 +7699,16 @@ }, { "name": "symfony/mime", - "version": "v6.4.17", + "version": "v6.4.18", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "ea87c8850a54ff039d3e0ab4ae5586dd4e6c0232" + "reference": "917d77981eb1ea963608d5cda4d9c0cf72eaa68e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/ea87c8850a54ff039d3e0ab4ae5586dd4e6c0232", - "reference": "ea87c8850a54ff039d3e0ab4ae5586dd4e6c0232", + "url": "https://api.github.com/repos/symfony/mime/zipball/917d77981eb1ea963608d5cda4d9c0cf72eaa68e", + "reference": "917d77981eb1ea963608d5cda4d9c0cf72eaa68e", "shasum": "" }, "require": { @@ -7764,7 +7764,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v6.4.17" + "source": "https://github.com/symfony/mime/tree/v6.4.18" }, "funding": [ { @@ -7780,7 +7780,7 @@ "type": "tidelift" } ], - "time": "2024-12-02T11:09:41+00:00" + "time": "2025-01-23T13:10:52+00:00" }, { "name": "symfony/options-resolver", @@ -8631,16 +8631,16 @@ }, { "name": "symfony/routing", - "version": "v6.4.16", + "version": "v6.4.18", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "91e02e606b4b705c2f4fb42f7e7708b7923a3220" + "reference": "e9bfc94953019089acdfb9be51c1b9142c4afa68" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/91e02e606b4b705c2f4fb42f7e7708b7923a3220", - "reference": "91e02e606b4b705c2f4fb42f7e7708b7923a3220", + "url": "https://api.github.com/repos/symfony/routing/zipball/e9bfc94953019089acdfb9be51c1b9142c4afa68", + "reference": "e9bfc94953019089acdfb9be51c1b9142c4afa68", "shasum": "" }, "require": { @@ -8694,7 +8694,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v6.4.16" + "source": "https://github.com/symfony/routing/tree/v6.4.18" }, "funding": [ { @@ -8710,7 +8710,7 @@ "type": "tidelift" } ], - "time": "2024-11-13T15:31:34+00:00" + "time": "2025-01-09T08:51:02+00:00" }, { "name": "symfony/service-contracts", @@ -9130,16 +9130,16 @@ }, { "name": "symfony/var-dumper", - "version": "v6.4.15", + "version": "v6.4.18", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "38254d5a5ac2e61f2b52f9caf54e7aa3c9d36b80" + "reference": "4ad10cf8b020e77ba665305bb7804389884b4837" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/38254d5a5ac2e61f2b52f9caf54e7aa3c9d36b80", - "reference": "38254d5a5ac2e61f2b52f9caf54e7aa3c9d36b80", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/4ad10cf8b020e77ba665305bb7804389884b4837", + "reference": "4ad10cf8b020e77ba665305bb7804389884b4837", "shasum": "" }, "require": { @@ -9195,7 +9195,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v6.4.15" + "source": "https://github.com/symfony/var-dumper/tree/v6.4.18" }, "funding": [ { @@ -9211,7 +9211,7 @@ "type": "tidelift" } ], - "time": "2024-11-08T15:28:48+00:00" + "time": "2025-01-17T11:26:11+00:00" }, { "name": "tijsverkoyen/css-to-inline-styles", @@ -9666,16 +9666,16 @@ }, { "name": "barryvdh/reflection-docblock", - "version": "v2.3.0", + "version": "v2.3.1", "source": { "type": "git", "url": "https://github.com/barryvdh/ReflectionDocBlock.git", - "reference": "818be8de6af4d16ef3ad51ea9234b3d37026ee5f" + "reference": "b6ff9f93603561f50e53b64310495d20b8dff5d8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/barryvdh/ReflectionDocBlock/zipball/818be8de6af4d16ef3ad51ea9234b3d37026ee5f", - "reference": "818be8de6af4d16ef3ad51ea9234b3d37026ee5f", + "url": "https://api.github.com/repos/barryvdh/ReflectionDocBlock/zipball/b6ff9f93603561f50e53b64310495d20b8dff5d8", + "reference": "b6ff9f93603561f50e53b64310495d20b8dff5d8", "shasum": "" }, "require": { @@ -9712,22 +9712,22 @@ } ], "support": { - "source": "https://github.com/barryvdh/ReflectionDocBlock/tree/v2.3.0" + "source": "https://github.com/barryvdh/ReflectionDocBlock/tree/v2.3.1" }, - "time": "2024-12-30T10:35:04+00:00" + "time": "2025-01-18T19:26:32+00:00" }, { "name": "composer/class-map-generator", - "version": "1.5.0", + "version": "1.6.0", "source": { "type": "git", "url": "https://github.com/composer/class-map-generator.git", - "reference": "4b0a223cf5be7c9ee7e0ef1bc7db42b4a97c9915" + "reference": "ffe442c5974c44a9343e37a0abcb1cc37319f5b9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/class-map-generator/zipball/4b0a223cf5be7c9ee7e0ef1bc7db42b4a97c9915", - "reference": "4b0a223cf5be7c9ee7e0ef1bc7db42b4a97c9915", + "url": "https://api.github.com/repos/composer/class-map-generator/zipball/ffe442c5974c44a9343e37a0abcb1cc37319f5b9", + "reference": "ffe442c5974c44a9343e37a0abcb1cc37319f5b9", "shasum": "" }, "require": { @@ -9771,7 +9771,7 @@ ], "support": { "issues": "https://github.com/composer/class-map-generator/issues", - "source": "https://github.com/composer/class-map-generator/tree/1.5.0" + "source": "https://github.com/composer/class-map-generator/tree/1.6.0" }, "funding": [ { @@ -9787,7 +9787,7 @@ "type": "tidelift" } ], - "time": "2024-11-25T16:11:06+00:00" + "time": "2025-02-05T10:05:34+00:00" }, { "name": "composer/pcre", @@ -9933,16 +9933,16 @@ }, { "name": "filp/whoops", - "version": "2.16.0", + "version": "2.17.0", "source": { "type": "git", "url": "https://github.com/filp/whoops.git", - "reference": "befcdc0e5dce67252aa6322d82424be928214fa2" + "reference": "075bc0c26631110584175de6523ab3f1652eb28e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filp/whoops/zipball/befcdc0e5dce67252aa6322d82424be928214fa2", - "reference": "befcdc0e5dce67252aa6322d82424be928214fa2", + "url": "https://api.github.com/repos/filp/whoops/zipball/075bc0c26631110584175de6523ab3f1652eb28e", + "reference": "075bc0c26631110584175de6523ab3f1652eb28e", "shasum": "" }, "require": { @@ -9992,7 +9992,7 @@ ], "support": { "issues": "https://github.com/filp/whoops/issues", - "source": "https://github.com/filp/whoops/tree/2.16.0" + "source": "https://github.com/filp/whoops/tree/2.17.0" }, "funding": [ { @@ -10000,7 +10000,7 @@ "type": "github" } ], - "time": "2024-09-25T12:00:00+00:00" + "time": "2025-01-25T12:00:00+00:00" }, { "name": "hamcrest/hamcrest-php", @@ -10055,22 +10055,22 @@ }, { "name": "laravel/tinker", - "version": "v2.10.0", + "version": "v2.10.1", "source": { "type": "git", "url": "https://github.com/laravel/tinker.git", - "reference": "ba4d51eb56de7711b3a37d63aa0643e99a339ae5" + "reference": "22177cc71807d38f2810c6204d8f7183d88a57d3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/tinker/zipball/ba4d51eb56de7711b3a37d63aa0643e99a339ae5", - "reference": "ba4d51eb56de7711b3a37d63aa0643e99a339ae5", + "url": "https://api.github.com/repos/laravel/tinker/zipball/22177cc71807d38f2810c6204d8f7183d88a57d3", + "reference": "22177cc71807d38f2810c6204d8f7183d88a57d3", "shasum": "" }, "require": { - "illuminate/console": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0", - "illuminate/contracts": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0", - "illuminate/support": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0", + "illuminate/console": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0", + "illuminate/contracts": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0", + "illuminate/support": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0", "php": "^7.2.5|^8.0", "psy/psysh": "^0.11.1|^0.12.0", "symfony/var-dumper": "^4.3.4|^5.0|^6.0|^7.0" @@ -10078,10 +10078,10 @@ "require-dev": { "mockery/mockery": "~1.3.3|^1.4.2", "phpstan/phpstan": "^1.10", - "phpunit/phpunit": "^8.5.8|^9.3.3" + "phpunit/phpunit": "^8.5.8|^9.3.3|^10.0" }, "suggest": { - "illuminate/database": "The Illuminate Database package (^6.0|^7.0|^8.0|^9.0|^10.0|^11.0)." + "illuminate/database": "The Illuminate Database package (^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0)." }, "type": "library", "extra": { @@ -10115,9 +10115,9 @@ ], "support": { "issues": "https://github.com/laravel/tinker/issues", - "source": "https://github.com/laravel/tinker/tree/v2.10.0" + "source": "https://github.com/laravel/tinker/tree/v2.10.1" }, - "time": "2024-09-23T13:32:56+00:00" + "time": "2025-01-27T14:24:01+00:00" }, { "name": "maximebf/debugbar", @@ -10925,16 +10925,16 @@ }, { "name": "phpunit/phpunit", - "version": "10.5.41", + "version": "10.5.44", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "e76586fa3d49714f230221734b44892e384109d7" + "reference": "1381c62769be4bb88fa4c5aec1366c7c66ca4f36" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/e76586fa3d49714f230221734b44892e384109d7", - "reference": "e76586fa3d49714f230221734b44892e384109d7", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/1381c62769be4bb88fa4c5aec1366c7c66ca4f36", + "reference": "1381c62769be4bb88fa4c5aec1366c7c66ca4f36", "shasum": "" }, "require": { @@ -11006,7 +11006,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.41" + "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.44" }, "funding": [ { @@ -11022,7 +11022,7 @@ "type": "tidelift" } ], - "time": "2025-01-13T09:33:05+00:00" + "time": "2025-01-31T07:00:38+00:00" }, { "name": "psy/psysh", @@ -11109,12 +11109,12 @@ "source": { "type": "git", "url": "https://github.com/Roave/SecurityAdvisories.git", - "reference": "e7a38fcc13e4ddfe9a28d5c7bf50aa9a9da758ec" + "reference": "ec1d1ce93931a0560cbb5b9ba2d6a3a2719c0c79" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/e7a38fcc13e4ddfe9a28d5c7bf50aa9a9da758ec", - "reference": "e7a38fcc13e4ddfe9a28d5c7bf50aa9a9da758ec", + "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/ec1d1ce93931a0560cbb5b9ba2d6a3a2719c0c79", + "reference": "ec1d1ce93931a0560cbb5b9ba2d6a3a2719c0c79", "shasum": "" }, "conflict": { @@ -11151,6 +11151,7 @@ "asymmetricrypt/asymmetricrypt": "<9.9.99", "athlon1600/php-proxy": "<=5.1", "athlon1600/php-proxy-app": "<=3", + "athlon1600/youtube-downloader": "<=4", "austintoddj/canvas": "<=3.4.2", "auth0/wordpress": "<=4.6", "automad/automad": "<2.0.0.0-alpha5", @@ -11199,7 +11200,7 @@ "cart2quote/module-quotation-encoded": ">=4.1.6,<=4.4.5|>=5,<5.4.4", "cartalyst/sentry": "<=2.1.6", "catfan/medoo": "<1.7.5", - "causal/oidc": "<2.1", + "causal/oidc": "<4", "cecil/cecil": "<7.47.1", "centreon/centreon": "<22.10.15", "cesnet/simplesamlphp-module-proxystatistics": "<3.1", @@ -11209,9 +11210,10 @@ "cockpit-hq/cockpit": "<2.7|==2.7", "codeception/codeception": "<3.1.3|>=4,<4.1.22", "codeigniter/framework": "<3.1.9", - "codeigniter4/framework": "<4.4.7", + "codeigniter4/framework": "<4.5.8", "codeigniter4/shield": "<1.0.0.0-beta8", "codiad/codiad": "<=2.8.4", + "components/jquery": ">=1.0.3,<3.5", "composer/composer": "<1.10.27|>=2,<2.2.24|>=2.3,<2.7.7", "concrete5/concrete5": "<9.3.4", "concrete5/core": "<8.5.8|>=9,<9.1", @@ -11224,7 +11226,7 @@ "contao/managed-edition": "<=1.5", "corveda/phpsandbox": "<1.3.5", "cosenary/instagram": "<=2.3", - "craftcms/cms": "<4.13.2|>=5,<5.5.2", + "craftcms/cms": "<4.13.8|>=5,<5.5.5", "croogo/croogo": "<4", "cuyz/valinor": "<0.12", "czim/file-handling": "<1.5|>=2,<2.3", @@ -11252,7 +11254,7 @@ "doctrine/mongodb-odm": "<1.0.2", "doctrine/mongodb-odm-bundle": "<3.0.1", "doctrine/orm": ">=1,<1.2.4|>=2,<2.4.8|>=2.5,<2.5.1|>=2.8.3,<2.8.4", - "dolibarr/dolibarr": "<19.0.2", + "dolibarr/dolibarr": "<19.0.2|==21.0.0.0-beta", "dompdf/dompdf": "<2.0.4", "doublethreedigital/guest-entries": "<3.1.2", "drupal/core": ">=6,<6.38|>=7,<7.102|>=8,<10.2.11|>=10.3,<10.3.9|>=11,<11.0.8", @@ -11587,11 +11589,11 @@ "phpfastcache/phpfastcache": "<6.1.5|>=7,<7.1.2|>=8,<8.0.7", "phpmailer/phpmailer": "<6.5", "phpmussel/phpmussel": ">=1,<1.6", - "phpmyadmin/phpmyadmin": "<5.2.1", + "phpmyadmin/phpmyadmin": "<5.2.2", "phpmyfaq/phpmyfaq": "<3.2.5|==3.2.5|>=3.2.10,<=4.0.1", "phpoffice/common": "<0.2.9", "phpoffice/phpexcel": "<1.8.1", - "phpoffice/phpspreadsheet": "<=1.29.6|>=2,<=2.1.5|>=2.2,<=2.3.4|>=3,<3.7", + "phpoffice/phpspreadsheet": "<1.29.9|>=2,<2.1.8|>=2.2,<2.3.7|>=3,<3.9", "phpseclib/phpseclib": "<2.0.47|>=3,<3.0.36", "phpservermon/phpservermon": "<3.6", "phpsysinfo/phpsysinfo": "<3.4.3", @@ -11601,13 +11603,13 @@ "phpxmlrpc/phpxmlrpc": "<4.9.2", "pi/pi": "<=2.5", "pimcore/admin-ui-classic-bundle": "<1.5.4", - "pimcore/customer-management-framework-bundle": "<4.0.6", + "pimcore/customer-management-framework-bundle": "<4.2.1", "pimcore/data-hub": "<1.2.4", "pimcore/data-importer": "<1.8.9|>=1.9,<1.9.3", "pimcore/demo": "<10.3", "pimcore/ecommerce-framework-bundle": "<1.0.10", "pimcore/perspective-editor": "<1.5.1", - "pimcore/pimcore": "<11.2.4", + "pimcore/pimcore": "<11.2.4|>=11.4.2,<11.5.3", "pixelfed/pixelfed": "<0.11.11", "plotly/plotly.js": "<2.25.2", "pocketmine/bedrock-protocol": "<8.0.2", @@ -11621,6 +11623,7 @@ "prestashop/gamification": "<2.3.2", "prestashop/prestashop": "<8.1.6", "prestashop/productcomments": "<5.0.2", + "prestashop/ps_contactinfo": "<=3.3.2", "prestashop/ps_emailsubscription": "<2.6.1", "prestashop/ps_facetedsearch": "<3.4.1", "prestashop/ps_linklist": "<3.1", @@ -11708,7 +11711,7 @@ "snipe/snipe-it": "<=7.0.13", "socalnick/scn-social-auth": "<1.15.2", "socialiteproviders/steam": "<1.1", - "spatie/browsershot": "<5.0.3", + "spatie/browsershot": "<5.0.5", "spatie/image-optimizer": "<1.7.3", "spencer14420/sp-php-email-handler": "<1", "spipu/html2pdf": "<5.2.8", @@ -11781,7 +11784,7 @@ "t3g/svg-sanitizer": "<1.0.3", "t3s/content-consent": "<1.0.3|>=2,<2.0.2", "tastyigniter/tastyigniter": "<3.3", - "tcg/voyager": "<=1.4", + "tcg/voyager": "<=1.8", "tecnickcom/tc-lib-pdf-font": "<2.6.4", "tecnickcom/tcpdf": "<6.8", "terminal42/contao-tablelookupwizard": "<3.3.5", @@ -11806,7 +11809,7 @@ "truckersmp/phpwhois": "<=4.3.1", "ttskch/pagination-service-provider": "<1", "twbs/bootstrap": "<=3.4.1|>=4,<=4.6.2", - "twig/twig": "<3.11.2|>=3.12,<3.14.1", + "twig/twig": "<3.11.2|>=3.12,<3.14.1|>=3.16,<3.19", "typo3/cms": "<9.5.29|>=10,<10.4.35|>=11,<11.5.23|>=12,<12.2", "typo3/cms-backend": "<4.1.14|>=4.2,<4.2.15|>=4.3,<4.3.7|>=4.4,<4.4.4|>=7,<=7.6.50|>=8,<=8.7.39|>=9,<=9.5.24|>=10,<10.4.46|>=11,<11.5.40|>=12,<12.4.21|>=13,<13.3.1", "typo3/cms-belog": ">=10,<=10.4.47|>=11,<=11.5.41|>=12,<=12.4.24|>=13,<=13.4.2", @@ -11879,7 +11882,7 @@ "xataface/xataface": "<3", "xpressengine/xpressengine": "<3.0.15", "yab/quarx": "<2.4.5", - "yeswiki/yeswiki": "<=4.4.4", + "yeswiki/yeswiki": "<=4.4.5", "yetiforce/yetiforce-crm": "<6.5", "yidashi/yii2cmf": "<=2", "yii2mod/yii2-cms": "<1.9.2", @@ -11970,7 +11973,7 @@ "type": "tidelift" } ], - "time": "2025-01-15T23:05:13+00:00" + "time": "2025-02-05T22:04:25+00:00" }, { "name": "sebastian/cli-parser", @@ -13270,16 +13273,16 @@ }, { "name": "squizlabs/php_codesniffer", - "version": "3.11.2", + "version": "3.11.3", "source": { "type": "git", "url": "https://github.com/PHPCSStandards/PHP_CodeSniffer.git", - "reference": "1368f4a58c3c52114b86b1abe8f4098869cb0079" + "reference": "ba05f990e79cbe69b9f35c8c1ac8dca7eecc3a10" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/1368f4a58c3c52114b86b1abe8f4098869cb0079", - "reference": "1368f4a58c3c52114b86b1abe8f4098869cb0079", + "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/ba05f990e79cbe69b9f35c8c1ac8dca7eecc3a10", + "reference": "ba05f990e79cbe69b9f35c8c1ac8dca7eecc3a10", "shasum": "" }, "require": { @@ -13344,9 +13347,13 @@ { "url": "https://opencollective.com/php_codesniffer", "type": "open_collective" + }, + { + "url": "https://thanks.dev/phpcsstandards", + "type": "thanks_dev" } ], - "time": "2024-12-11T16:04:26+00:00" + "time": "2025-01-23T17:04:15+00:00" }, { "name": "theseer/tokenizer", diff --git a/package-lock.json b/package-lock.json index f780417a..2bf75b37 100644 --- a/package-lock.json +++ b/package-lock.json @@ -59,22 +59,22 @@ } }, "node_modules/@babel/core": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.0.tgz", - "integrity": "sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==", + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.7.tgz", + "integrity": "sha512-SRijHmF0PSPgLIBYlWnG0hyeJLwXE2CgpsXaMOrtt2yp9/86ALw6oUlj9KYuZ0JN07T4eBMVIW4li/9S1j2BGA==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.26.0", - "@babel/generator": "^7.26.0", - "@babel/helper-compilation-targets": "^7.25.9", + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.5", + "@babel/helper-compilation-targets": "^7.26.5", "@babel/helper-module-transforms": "^7.26.0", - "@babel/helpers": "^7.26.0", - "@babel/parser": "^7.26.0", + "@babel/helpers": "^7.26.7", + "@babel/parser": "^7.26.7", "@babel/template": "^7.25.9", - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.26.0", + "@babel/traverse": "^7.26.7", + "@babel/types": "^7.26.7", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -398,27 +398,27 @@ } }, "node_modules/@babel/helpers": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz", - "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==", + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.7.tgz", + "integrity": "sha512-8NHiL98vsi0mbPQmYAGWwfcFaOy4j2HY49fXJCfuDcdE7fMIsH9a7GdaeXpIBsbT7307WU8KCMp5pUVDNL4f9A==", "dev": true, "license": "MIT", "dependencies": { "@babel/template": "^7.25.9", - "@babel/types": "^7.26.0" + "@babel/types": "^7.26.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.5.tgz", - "integrity": "sha512-SRJ4jYmXRqV1/Xc+TIVG84WjHBXKlxO9sHQnA2Pf12QQEAp1LOh6kDzNHXcUnbH1QI0FDoPPVOt+vyUDucxpaw==", + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.7.tgz", + "integrity": "sha512-kEvgGGgEjRUutvdVvZhbn/BxVt+5VSpwXz1j3WYXQbXDo8KzFOPNG2GQbdAiNq8g6wn1yKk7C/qrke03a84V+w==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.26.5" + "@babel/types": "^7.26.7" }, "bin": { "parser": "bin/babel-parser.js" @@ -1406,13 +1406,13 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.25.9.tgz", - "integrity": "sha512-v61XqUMiueJROUv66BVIOi0Fv/CUuZuZMl5NkRoCVxLAnMexZ0A3kMe7vvZ0nulxMuMp0Mk6S5hNh48yki08ZA==", + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.26.7.tgz", + "integrity": "sha512-jfoTXXZTgGg36BmhqT3cAYK5qkmqvJpvNrPhaK/52Vgjhw4Rq29s9UqpWWV0D6yuRmgiFH/BUVlkl96zJWqnaw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.26.5" }, "engines": { "node": ">=6.9.0" @@ -1489,15 +1489,15 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.26.0.tgz", - "integrity": "sha512-H84Fxq0CQJNdPFT2DrfnylZ3cf5K43rGfWK4LJGPpjKHiZlk0/RzwEus3PDDZZg+/Er7lCA03MVacueUuXdzfw==", + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.26.7.tgz", + "integrity": "sha512-Ycg2tnXwixaXOVb29rana8HNPgLVBof8qqtNQ9LE22IoyZboQbGSxI6ZySMdW3K5nAe6gu35IaJefUJflhUFTQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.26.0", - "@babel/helper-compilation-targets": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", + "@babel/compat-data": "^7.26.5", + "@babel/helper-compilation-targets": "^7.26.5", + "@babel/helper-plugin-utils": "^7.26.5", "@babel/helper-validator-option": "^7.25.9", "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.9", "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.9", @@ -1511,7 +1511,7 @@ "@babel/plugin-transform-arrow-functions": "^7.25.9", "@babel/plugin-transform-async-generator-functions": "^7.25.9", "@babel/plugin-transform-async-to-generator": "^7.25.9", - "@babel/plugin-transform-block-scoped-functions": "^7.25.9", + "@babel/plugin-transform-block-scoped-functions": "^7.26.5", "@babel/plugin-transform-block-scoping": "^7.25.9", "@babel/plugin-transform-class-properties": "^7.25.9", "@babel/plugin-transform-class-static-block": "^7.26.0", @@ -1522,7 +1522,7 @@ "@babel/plugin-transform-duplicate-keys": "^7.25.9", "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.9", "@babel/plugin-transform-dynamic-import": "^7.25.9", - "@babel/plugin-transform-exponentiation-operator": "^7.25.9", + "@babel/plugin-transform-exponentiation-operator": "^7.26.3", "@babel/plugin-transform-export-namespace-from": "^7.25.9", "@babel/plugin-transform-for-of": "^7.25.9", "@babel/plugin-transform-function-name": "^7.25.9", @@ -1531,12 +1531,12 @@ "@babel/plugin-transform-logical-assignment-operators": "^7.25.9", "@babel/plugin-transform-member-expression-literals": "^7.25.9", "@babel/plugin-transform-modules-amd": "^7.25.9", - "@babel/plugin-transform-modules-commonjs": "^7.25.9", + "@babel/plugin-transform-modules-commonjs": "^7.26.3", "@babel/plugin-transform-modules-systemjs": "^7.25.9", "@babel/plugin-transform-modules-umd": "^7.25.9", "@babel/plugin-transform-named-capturing-groups-regex": "^7.25.9", "@babel/plugin-transform-new-target": "^7.25.9", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.25.9", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.26.6", "@babel/plugin-transform-numeric-separator": "^7.25.9", "@babel/plugin-transform-object-rest-spread": "^7.25.9", "@babel/plugin-transform-object-super": "^7.25.9", @@ -1553,7 +1553,7 @@ "@babel/plugin-transform-spread": "^7.25.9", "@babel/plugin-transform-sticky-regex": "^7.25.9", "@babel/plugin-transform-template-literals": "^7.25.9", - "@babel/plugin-transform-typeof-symbol": "^7.25.9", + "@babel/plugin-transform-typeof-symbol": "^7.26.7", "@babel/plugin-transform-unicode-escapes": "^7.25.9", "@babel/plugin-transform-unicode-property-regex": "^7.25.9", "@babel/plugin-transform-unicode-regex": "^7.25.9", @@ -1598,9 +1598,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.0.tgz", - "integrity": "sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==", + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.7.tgz", + "integrity": "sha512-AOPI3D+a8dXnja+iwsUqGRjr1BbZIe771sXdapOtYI531gSqpi92vXivKcq2asu/DFpdl1ceFAKZyRzK2PCVcQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1626,17 +1626,17 @@ } }, "node_modules/@babel/traverse": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.5.tgz", - "integrity": "sha512-rkOSPOw+AXbgtwUga3U4u8RpoK9FEFWBNAlTpcnkLFjL5CT+oyHNuUUC/xx6XefEJ16r38r8Bc/lfp6rYuHeJQ==", + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.7.tgz", + "integrity": "sha512-1x1sgeyRLC3r5fQOM0/xtQKsYjyxmFjaOrLJNtZ81inNjyJHGIolTULPiSc/2qe1/qfpFLisLQYFnnZl7QoedA==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.26.2", "@babel/generator": "^7.26.5", - "@babel/parser": "^7.26.5", + "@babel/parser": "^7.26.7", "@babel/template": "^7.25.9", - "@babel/types": "^7.26.5", + "@babel/types": "^7.26.7", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -1645,9 +1645,9 @@ } }, "node_modules/@babel/types": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.5.tgz", - "integrity": "sha512-L6mZmwFDK6Cjh1nRCLXpa6no13ZIioJDz7mdkzHv399pThrTa/k0nUlNaenOeh2kWu/iaOQYElEpKPUswUa9Vg==", + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.7.tgz", + "integrity": "sha512-t8kDRGrKXyp6+tjUh7hw2RLyclsW4TRoRvRHtSyAX9Bb5ldlFh+90YAYY6awRXrlB4G5G2izNeGySpATlFzmOg==", "dev": true, "license": "MIT", "dependencies": { @@ -1804,9 +1804,9 @@ "license": "Apache-2.0" }, "node_modules/@parcel/watcher": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.0.tgz", - "integrity": "sha512-i0GV1yJnm2n3Yq1qw6QrUrd/LI9bE8WEBOTtOkpCXHHdyN3TAGgqAK/DAT05z4fq2x04cARXt2pDmjWjL92iTQ==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz", + "integrity": "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -1825,25 +1825,25 @@ "url": "https://opencollective.com/parcel" }, "optionalDependencies": { - "@parcel/watcher-android-arm64": "2.5.0", - "@parcel/watcher-darwin-arm64": "2.5.0", - "@parcel/watcher-darwin-x64": "2.5.0", - "@parcel/watcher-freebsd-x64": "2.5.0", - "@parcel/watcher-linux-arm-glibc": "2.5.0", - "@parcel/watcher-linux-arm-musl": "2.5.0", - "@parcel/watcher-linux-arm64-glibc": "2.5.0", - "@parcel/watcher-linux-arm64-musl": "2.5.0", - "@parcel/watcher-linux-x64-glibc": "2.5.0", - "@parcel/watcher-linux-x64-musl": "2.5.0", - "@parcel/watcher-win32-arm64": "2.5.0", - "@parcel/watcher-win32-ia32": "2.5.0", - "@parcel/watcher-win32-x64": "2.5.0" + "@parcel/watcher-android-arm64": "2.5.1", + "@parcel/watcher-darwin-arm64": "2.5.1", + "@parcel/watcher-darwin-x64": "2.5.1", + "@parcel/watcher-freebsd-x64": "2.5.1", + "@parcel/watcher-linux-arm-glibc": "2.5.1", + "@parcel/watcher-linux-arm-musl": "2.5.1", + "@parcel/watcher-linux-arm64-glibc": "2.5.1", + "@parcel/watcher-linux-arm64-musl": "2.5.1", + "@parcel/watcher-linux-x64-glibc": "2.5.1", + "@parcel/watcher-linux-x64-musl": "2.5.1", + "@parcel/watcher-win32-arm64": "2.5.1", + "@parcel/watcher-win32-ia32": "2.5.1", + "@parcel/watcher-win32-x64": "2.5.1" } }, "node_modules/@parcel/watcher-android-arm64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.0.tgz", - "integrity": "sha512-qlX4eS28bUcQCdribHkg/herLe+0A9RyYC+mm2PXpncit8z5b3nSqGVzMNR3CmtAOgRutiZ02eIJJgP/b1iEFQ==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz", + "integrity": "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==", "cpu": [ "arm64" ], @@ -1862,9 +1862,9 @@ } }, "node_modules/@parcel/watcher-darwin-arm64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.0.tgz", - "integrity": "sha512-hyZ3TANnzGfLpRA2s/4U1kbw2ZI4qGxaRJbBH2DCSREFfubMswheh8TeiC1sGZ3z2jUf3s37P0BBlrD3sjVTUw==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz", + "integrity": "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==", "cpu": [ "arm64" ], @@ -1883,9 +1883,9 @@ } }, "node_modules/@parcel/watcher-darwin-x64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.0.tgz", - "integrity": "sha512-9rhlwd78saKf18fT869/poydQK8YqlU26TMiNg7AIu7eBp9adqbJZqmdFOsbZ5cnLp5XvRo9wcFmNHgHdWaGYA==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz", + "integrity": "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==", "cpu": [ "x64" ], @@ -1904,9 +1904,9 @@ } }, "node_modules/@parcel/watcher-freebsd-x64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.0.tgz", - "integrity": "sha512-syvfhZzyM8kErg3VF0xpV8dixJ+RzbUaaGaeb7uDuz0D3FK97/mZ5AJQ3XNnDsXX7KkFNtyQyFrXZzQIcN49Tw==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz", + "integrity": "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==", "cpu": [ "x64" ], @@ -1925,9 +1925,9 @@ } }, "node_modules/@parcel/watcher-linux-arm-glibc": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.0.tgz", - "integrity": "sha512-0VQY1K35DQET3dVYWpOaPFecqOT9dbuCfzjxoQyif1Wc574t3kOSkKevULddcR9znz1TcklCE7Ht6NIxjvTqLA==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz", + "integrity": "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==", "cpu": [ "arm" ], @@ -1946,9 +1946,9 @@ } }, "node_modules/@parcel/watcher-linux-arm-musl": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.0.tgz", - "integrity": "sha512-6uHywSIzz8+vi2lAzFeltnYbdHsDm3iIB57d4g5oaB9vKwjb6N6dRIgZMujw4nm5r6v9/BQH0noq6DzHrqr2pA==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz", + "integrity": "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==", "cpu": [ "arm" ], @@ -1967,9 +1967,9 @@ } }, "node_modules/@parcel/watcher-linux-arm64-glibc": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.0.tgz", - "integrity": "sha512-BfNjXwZKxBy4WibDb/LDCriWSKLz+jJRL3cM/DllnHH5QUyoiUNEp3GmL80ZqxeumoADfCCP19+qiYiC8gUBjA==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz", + "integrity": "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==", "cpu": [ "arm64" ], @@ -1988,9 +1988,9 @@ } }, "node_modules/@parcel/watcher-linux-arm64-musl": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.0.tgz", - "integrity": "sha512-S1qARKOphxfiBEkwLUbHjCY9BWPdWnW9j7f7Hb2jPplu8UZ3nes7zpPOW9bkLbHRvWM0WDTsjdOTUgW0xLBN1Q==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz", + "integrity": "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==", "cpu": [ "arm64" ], @@ -2009,9 +2009,9 @@ } }, "node_modules/@parcel/watcher-linux-x64-glibc": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.0.tgz", - "integrity": "sha512-d9AOkusyXARkFD66S6zlGXyzx5RvY+chTP9Jp0ypSTC9d4lzyRs9ovGf/80VCxjKddcUvnsGwCHWuF2EoPgWjw==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz", + "integrity": "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==", "cpu": [ "x64" ], @@ -2030,9 +2030,9 @@ } }, "node_modules/@parcel/watcher-linux-x64-musl": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.0.tgz", - "integrity": "sha512-iqOC+GoTDoFyk/VYSFHwjHhYrk8bljW6zOhPuhi5t9ulqiYq1togGJB5e3PwYVFFfeVgc6pbz3JdQyDoBszVaA==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz", + "integrity": "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==", "cpu": [ "x64" ], @@ -2051,9 +2051,9 @@ } }, "node_modules/@parcel/watcher-win32-arm64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.0.tgz", - "integrity": "sha512-twtft1d+JRNkM5YbmexfcH/N4znDtjgysFaV9zvZmmJezQsKpkfLYJ+JFV3uygugK6AtIM2oADPkB2AdhBrNig==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz", + "integrity": "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==", "cpu": [ "arm64" ], @@ -2072,9 +2072,9 @@ } }, "node_modules/@parcel/watcher-win32-ia32": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.0.tgz", - "integrity": "sha512-+rgpsNRKwo8A53elqbbHXdOMtY/tAtTzManTWShB5Kk54N8Q9mzNWV7tV+IbGueCbcj826MfWGU3mprWtuf1TA==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz", + "integrity": "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==", "cpu": [ "ia32" ], @@ -2093,9 +2093,9 @@ } }, "node_modules/@parcel/watcher-win32-x64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.0.tgz", - "integrity": "sha512-lPrxve92zEHdgeff3aiu4gDOIt4u7sJYha6wbdEZDCDUhtjTsOMiaJzG5lMY4GkWH8p0fMmO2Ppq5G5XXG+DQw==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz", + "integrity": "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==", "cpu": [ "x64" ], @@ -2275,9 +2275,9 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.5.tgz", - "integrity": "sha512-GLZPrd9ckqEBFMcVM/qRFAP0Hg3qiVEojgEFsx/N/zKXsBzbGF6z5FBDpZ0+Xhp1xr+qRZYjfGr1cWHB9oFHSA==", + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.6.tgz", + "integrity": "sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA==", "dev": true, "license": "MIT", "dependencies": { @@ -2329,9 +2329,9 @@ } }, "node_modules/@types/imagemin": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/@types/imagemin/-/imagemin-9.0.0.tgz", - "integrity": "sha512-4IaT+BdPUAFf/AAy3XlFAbqGk4RawhdidxWO5XTe+PJAYAr4d7m2FHiqyEPXbDpwS+IaLIJq5AIjLE9HcwMGBg==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/@types/imagemin/-/imagemin-9.0.1.tgz", + "integrity": "sha512-xMWpvrUhtYxl6EeW+UhVH3rwUKhCRx21XddcoWByjDAasXZT5pQaCn0YVnXoTijX5hlTrGqV4TGQL/Htpp00+w==", "dev": true, "license": "MIT", "dependencies": { @@ -2401,9 +2401,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "22.10.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.7.tgz", - "integrity": "sha512-V09KvXxFiutGp6B7XkpaDXlNadZxrzajcY50EuoLIpQ6WWYCSvf19lVIazzfIzQvhUN2HjX12spLojTnhuKlGg==", + "version": "22.13.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.1.tgz", + "integrity": "sha512-jK8uzQlrvXqEU91UxiK5J7pKHyzgnI1Qnl0QDHIgVGuolJhRb9EEl28Cj9b3rGR8B2lhFCtvIm5os8lFnO/1Ew==", "dev": true, "license": "MIT", "dependencies": { @@ -2499,9 +2499,9 @@ "license": "MIT" }, "node_modules/@types/ws": { - "version": "8.5.13", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.13.tgz", - "integrity": "sha512-osM/gWBTPKgHV8XkTunnegTRIsvF6owmf5w+JtAfOw472dptdm0dlGv4xCt6GwQRcC2XVOvvRE/0bAoQcL2QkA==", + "version": "8.5.14", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.14.tgz", + "integrity": "sha512-bd/YFLW+URhBzMXurx7lWByOu+xzU9+kb3RboOteXYDfW+tr+JZa99OyNmPINEGB/ahzKrEuc8rcv4gnpJmxTw==", "dev": true, "license": "MIT", "dependencies": { @@ -3494,9 +3494,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001692", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001692.tgz", - "integrity": "sha512-A95VKan0kdtrsnMubMKxEKUKImOPSuCpYgxSQBo036P5YYgVIcOYJEgt/txJWqObiRQeISNCfef9nvlQ0vbV7A==", + "version": "1.0.30001697", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001697.tgz", + "integrity": "sha512-GwNPlWJin8E+d7Gxq96jxM6w0w+VFeyyXRsjU58emtkYqnbwHqXm5uT2uCmO0RQE9htWknOP4xtBlLmM/gWxvQ==", "dev": true, "funding": [ { @@ -4554,9 +4554,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.83", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.83.tgz", - "integrity": "sha512-LcUDPqSt+V0QmI47XLzZrz5OqILSMGsPFkDYus22rIbgorSvBYEFqq854ltTmUdHkY92FSdAAvsh4jWEULMdfQ==", + "version": "1.5.93", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.93.tgz", + "integrity": "sha512-M+29jTcfNNoR9NV7la4SwUqzWAxEwnc7ThA5e1m6LRSotmpfpCpLcIfgtSCVL+MllNLgAyM/5ru86iMRemPzDQ==", "dev": true, "license": "ISC" }, @@ -4611,9 +4611,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.18.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.0.tgz", - "integrity": "sha512-0/r0MySGYG8YqlayBZ6MuCfECmHFdJ5qyPh8s8wa5Hnm6SaFLSK1VYCbj+NKp090Nm1caZhD+QTnmxO7esYGyQ==", + "version": "5.18.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz", + "integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==", "dev": true, "license": "MIT", "dependencies": { @@ -4945,9 +4945,9 @@ "license": "MIT" }, "node_modules/fast-uri": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.5.tgz", - "integrity": "sha512-5JnBCWpFlMo0a3ciDy/JckMzzv1U9coZrIhedq+HXxxUfDTAiS0LA8OKVao4G9BxmCVck/jtA5r3KAtRWEyD8Q==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", + "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", "dev": true, "funding": [ { @@ -4972,9 +4972,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.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.0.tgz", + "integrity": "sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA==", "dev": true, "license": "ISC", "dependencies": { @@ -5896,9 +5896,9 @@ "license": "MIT" }, "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": { @@ -6946,9 +6946,9 @@ } }, "node_modules/object-inspect": { - "version": "1.13.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", - "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==", + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", "dev": true, "license": "MIT", "engines": { @@ -8485,9 +8485,9 @@ "license": "MIT" }, "node_modules/sass": { - "version": "1.83.4", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.83.4.tgz", - "integrity": "sha512-B1bozCeNQiOgDcLd33e2Cs2U60wZwjUUXzh900ZyQF5qUasvMdDZYbQ566LJu7cqR+sAHlAfO6RMkaID5s6qpA==", + "version": "1.84.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.84.0.tgz", + "integrity": "sha512-XDAbhEPJRxi7H0SxrnOpiXFQoUJHwkR2u3Zc4el+fK/Tt5Hpzw5kkQ59qVDfvdaUq6gCrEZIbySFBM2T9DNKHg==", "dev": true, "license": "MIT", "dependencies": { @@ -8617,9 +8617,9 @@ } }, "node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", "dev": true, "license": "ISC", "bin": { @@ -9299,9 +9299,9 @@ } }, "node_modules/terser": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.37.0.tgz", - "integrity": "sha512-B8wRRkmre4ERucLM/uXx4MOV5cbnOlVAqUst+1+iLKPI0dOgFO28f84ptoQt9HEI537PMzfYa/d+GEPKTRXmYA==", + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.38.0.tgz", + "integrity": "sha512-a4GD5R1TjEeuCT6ZRiYMHmIf7okbCPEuhQET8bczV6FrQMMlFXA1n+G0KKjdlFCm3TEHV77GxfZB3vZSUQGFpg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -9467,9 +9467,9 @@ } }, "node_modules/tom-select": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tom-select/-/tom-select-2.4.1.tgz", - "integrity": "sha512-adI8H8+wk8RRzHYLQ3bXSk2Q+FAq/kzAATrcWlJ2fbIrEzb0VkwaXzKHTAlBwSJrhqbPJvhV/0eypFkED/nAug==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/tom-select/-/tom-select-2.4.2.tgz", + "integrity": "sha512-2RWjkL3gMDz9E+u8w+tQy9JWsYq8gaSytEVeugKYDeMus6ZtxT1HttLPnXsfHCnBPlsNubVyj5gtUeN+S+bcpA==", "license": "Apache-2.0", "dependencies": { "@orchidjs/sifter": "^1.1.0", From b1d949c739b39fb5b1a66f2c9e5ac2e29cb497fc Mon Sep 17 00:00:00 2001 From: Kovah Date: Thu, 6 Feb 2025 21:26:12 +0100 Subject: [PATCH 11/61] Fix bulk deletion of tags and lists (#897) --- resources/views/models/lists/bulk-edit.blade.php | 2 +- resources/views/models/tags/bulk-edit.blade.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/views/models/lists/bulk-edit.blade.php b/resources/views/models/lists/bulk-edit.blade.php index 9f8a3634..87182e9d 100644 --- a/resources/views/models/lists/bulk-edit.blade.php +++ b/resources/views/models/lists/bulk-edit.blade.php @@ -21,7 +21,7 @@
@csrf - +
@choice('list.delete', $modelCount)
diff --git a/resources/views/models/tags/bulk-edit.blade.php b/resources/views/models/tags/bulk-edit.blade.php index 7fab6de9..b86c7873 100644 --- a/resources/views/models/tags/bulk-edit.blade.php +++ b/resources/views/models/tags/bulk-edit.blade.php @@ -21,7 +21,7 @@ @csrf - +
@choice('tag.delete', $modelCount)
From 57b1b906b936c2b63f6afce4e937bdffe4f7f72c Mon Sep 17 00:00:00 2001 From: Kovah Date: Tue, 11 Feb 2025 21:31:35 +0100 Subject: [PATCH 12/61] Add missing SSO_KEYCLOAK_BASE_URL to config (#904) --- config/services.php | 1 + 1 file changed, 1 insertion(+) diff --git a/config/services.php b/config/services.php index e6dd508b..8e20f1a9 100644 --- a/config/services.php +++ b/config/services.php @@ -102,6 +102,7 @@ 'enabled' => env('SSO_KEYCLOAK_ENABLED', false), 'client_id' => env('SSO_KEYCLOAK_CLIENT_ID'), 'client_secret' => env('SSO_KEYCLOAK_CLIENT_SECRET'), + 'base_url' => env('SSO_KEYCLOAK_BASE_URL'), 'realms' => env('SSO_KEYCLOAK_REALM'), 'redirect' => '/auth/sso/keycloak/callback', ], From b9f93d2e8faee2fc1267a8bdbf305072b875106e Mon Sep 17 00:00:00 2001 From: Kovah Date: Tue, 11 Feb 2025 21:48:34 +0100 Subject: [PATCH 13/61] Correctly handle empty tags/lists when bulk-editing links (#905) --- app/Repositories/LinkRepository.php | 2 ++ .../Models/BulkEditControllerTest.php | 26 +++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/app/Repositories/LinkRepository.php b/app/Repositories/LinkRepository.php index 04cfa25f..2a179af4 100644 --- a/app/Repositories/LinkRepository.php +++ b/app/Repositories/LinkRepository.php @@ -77,7 +77,9 @@ public static function bulkUpdate(array $models, array $data): Collection ])->get(); $newTags = is_array($data['tags']) ? $data['tags'] : explode(',', $data['tags']); + $newTags = array_map('intval', array_filter($newTags)); $newLists = is_array($data['lists']) ? $data['lists'] : explode(',', $data['lists']); + $newLists = array_map('intval', array_filter($newLists)); return $links->map(function (Link $link) use ($data, $newTags, $newLists) { if (!auth()->user()->can('update', $link)) { diff --git a/tests/Controller/Models/BulkEditControllerTest.php b/tests/Controller/Models/BulkEditControllerTest.php index e327534e..26f829bf 100644 --- a/tests/Controller/Models/BulkEditControllerTest.php +++ b/tests/Controller/Models/BulkEditControllerTest.php @@ -73,6 +73,32 @@ public function test_links_edit(): void $this->assertEquals(ModelAttribute::VISIBILITY_PRIVATE, $otherLink->visibility); } + public function test_links_edit_without_taxonomy(): void + { + $links = $this->prepareLinkTestData(); + + $this->post('bulk-edit/update-links', [ + 'models' => '1,2,3,4', + 'tags' => null, + 'tags_mode' => 'append', + 'lists' => null, + 'lists_mode' => 'append', + 'visibility' => null, + ]) + ->assertRedirect('links') + ->assertSessionHas('flash_notification.0.message', 'Successfully updated 3 Links out of 4 selected ones.'); + + array_walk($links, fn ($link) => $link->refresh()); + + $this->assertEqualsCanonicalizing([1], $links[0]->lists()->pluck('id')->toArray()); + $this->assertEqualsCanonicalizing([1, 2], $links[1]->lists()->pluck('id')->toArray()); + $this->assertEmpty($links[2]->lists()->pluck('id')->toArray()); + + $this->assertEqualsCanonicalizing([1], $links[0]->tags()->pluck('id')->toArray()); + $this->assertEqualsCanonicalizing([1, 2], $links[1]->tags()->pluck('id')->toArray()); + $this->assertEmpty($links[2]->tags()->pluck('id')->toArray()); + } + public function test_alternative_links_edit(): void { Log::shouldReceive('warning')->once(); From eb74ca7891163a90d39c92993c4079a902db6beb Mon Sep 17 00:00:00 2001 From: Kovah Date: Tue, 11 Feb 2025 22:01:27 +0100 Subject: [PATCH 14/61] Output all links visible for a user when browsing lists (#902) --- app/Http/Controllers/Models/ListController.php | 2 +- tests/Controller/Models/ListControllerTest.php | 10 ++++++++-- tests/Controller/Traits/PreparesTestData.php | 8 ++++---- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/app/Http/Controllers/Models/ListController.php b/app/Http/Controllers/Models/ListController.php index c4f938ad..b006f9b6 100644 --- a/app/Http/Controllers/Models/ListController.php +++ b/app/Http/Controllers/Models/ListController.php @@ -84,7 +84,7 @@ public function show(Request $request, LinkList $list): View $this->checkOrdering(); $links = $list->links() - ->byUser() + ->visibleForUser() ->orderBy($this->orderBy, $this->orderDir) ->paginate(getPaginationLimit()); diff --git a/tests/Controller/Models/ListControllerTest.php b/tests/Controller/Models/ListControllerTest.php index 6cb31d97..321b8366 100644 --- a/tests/Controller/Models/ListControllerTest.php +++ b/tests/Controller/Models/ListControllerTest.php @@ -2,6 +2,7 @@ namespace Tests\Controller\Models; +use App\Models\Link; use App\Models\LinkList; use App\Models\User; use Illuminate\Foundation\Testing\RefreshDatabase; @@ -140,9 +141,14 @@ public function test_validation_error_for_create(): void public function test_detail_view(): void { - $this->createTestLists(); + $otherUser = User::factory()->create(); + + [$list, $list2, $list3, $firstUser] = $this->createTestLists(); + + Link::factory()->for($firstUser)->create(['title' => 'FirstTestLink'])->lists()->sync([$list->id]); - $this->get('lists/1')->assertOk()->assertSee('Public List')->assertSee('Public List'); + $this->actingAs($otherUser); + $this->get('lists/1')->assertOk()->assertSee('Public List')->assertSee('Public List')->assertSee('FirstTestLink'); $this->get('lists/2')->assertOk()->assertSee('Internal List')->assertSee('Internal List'); $this->get('lists/3')->assertForbidden(); } diff --git a/tests/Controller/Traits/PreparesTestData.php b/tests/Controller/Traits/PreparesTestData.php index 252b677e..59c717d5 100644 --- a/tests/Controller/Traits/PreparesTestData.php +++ b/tests/Controller/Traits/PreparesTestData.php @@ -32,7 +32,7 @@ public function createTestLinks(?User $otherUser = null): array 'created_at' => now()->subMinute(), ]); - return [$link, $link2, $link3]; + return [$link, $link2, $link3, $otherUser]; } public function createTestLists(?User $otherUser = null): array @@ -56,7 +56,7 @@ public function createTestLists(?User $otherUser = null): array 'created_at' => now()->subMinute(), ]); - return [$list, $list2, $list3]; + return [$list, $list2, $list3, $otherUser]; } public function createTestTags(?User $otherUser = null): array @@ -80,7 +80,7 @@ public function createTestTags(?User $otherUser = null): array 'created_at' => now()->subMinute(), ]); - return [$tag1, $tag2, $tag3]; + return [$tag1, $tag2, $tag3, $otherUser]; } public function createTestNotes(?Link $linkForNotes = null, ?User $otherUser = null): array @@ -102,6 +102,6 @@ public function createTestNotes(?Link $linkForNotes = null, ?User $otherUser = n 'visibility' => ModelAttribute::VISIBILITY_PRIVATE, ]); - return [$note, $note2, $note3]; + return [$note, $note2, $note3, $otherUser]; } } From f106a1814ebf458f3fc1c0c9de3b2ad7f65a1b98 Mon Sep 17 00:00:00 2001 From: Kovah Date: Tue, 11 Feb 2025 22:02:37 +0100 Subject: [PATCH 15/61] Update dependencies --- composer.lock | 118 ++++++++++++++--------------- package-lock.json | 184 ++++++++++++++++++++++++++-------------------- 2 files changed, 163 insertions(+), 139 deletions(-) diff --git a/composer.lock b/composer.lock index e58246cf..97dacf27 100644 --- a/composer.lock +++ b/composer.lock @@ -62,16 +62,16 @@ }, { "name": "aws/aws-sdk-php", - "version": "3.339.7", + "version": "3.339.11", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "7b7e48ce7970c0416c5fda045df7b93948fbf643" + "reference": "692055cc451a442690ecb839ae1d0cca5c018c77" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/7b7e48ce7970c0416c5fda045df7b93948fbf643", - "reference": "7b7e48ce7970c0416c5fda045df7b93948fbf643", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/692055cc451a442690ecb839ae1d0cca5c018c77", + "reference": "692055cc451a442690ecb839ae1d0cca5c018c77", "shasum": "" }, "require": { @@ -97,7 +97,6 @@ "ext-openssl": "*", "ext-pcntl": "*", "ext-sockets": "*", - "paragonie/random_compat": ">= 2", "phpunit/phpunit": "^5.6.3 || ^8.5 || ^9.5", "psr/cache": "^2.0 || ^3.0", "psr/simple-cache": "^2.0 || ^3.0", @@ -154,9 +153,9 @@ "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.339.7" + "source": "https://github.com/aws/aws-sdk-php/tree/3.339.11" }, - "time": "2025-02-05T19:06:15+00:00" + "time": "2025-02-11T19:45:23+00:00" }, { "name": "bacon/bacon-qr-code", @@ -1995,20 +1994,20 @@ }, { "name": "laracasts/flash", - "version": "3.2.3", + "version": "3.2.4", "source": { "type": "git", "url": "https://github.com/laracasts/flash.git", - "reference": "c2c4be1132f1bec3a689e84417a1c5787e6c71fd" + "reference": "0ea47bfbf12a33113247c367798a34e519020f8d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laracasts/flash/zipball/c2c4be1132f1bec3a689e84417a1c5787e6c71fd", - "reference": "c2c4be1132f1bec3a689e84417a1c5787e6c71fd", + "url": "https://api.github.com/repos/laracasts/flash/zipball/0ea47bfbf12a33113247c367798a34e519020f8d", + "reference": "0ea47bfbf12a33113247c367798a34e519020f8d", "shasum": "" }, "require": { - "illuminate/support": "~5.0|^6.0|^7.0|^8.0|^9.0|^10.0|^11.0", + "illuminate/support": "~5.0|^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0", "php": ">=5.4.0" }, "require-dev": { @@ -2046,9 +2045,9 @@ ], "description": "Easy flash notifications", "support": { - "source": "https://github.com/laracasts/flash/tree/3.2.3" + "source": "https://github.com/laracasts/flash/tree/3.2.4" }, - "time": "2024-03-03T16:51:25+00:00" + "time": "2025-02-06T14:43:27+00:00" }, { "name": "laravel/fortify", @@ -2509,16 +2508,16 @@ }, { "name": "laravel/socialite", - "version": "v5.17.1", + "version": "v5.18.0", "source": { "type": "git", "url": "https://github.com/laravel/socialite.git", - "reference": "4b44c97c04da28e5aabb73df70b0999e9976382f" + "reference": "7809dc71250e074cd42970f0f803f2cddc04c5de" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/socialite/zipball/4b44c97c04da28e5aabb73df70b0999e9976382f", - "reference": "4b44c97c04da28e5aabb73df70b0999e9976382f", + "url": "https://api.github.com/repos/laravel/socialite/zipball/7809dc71250e074cd42970f0f803f2cddc04c5de", + "reference": "7809dc71250e074cd42970f0f803f2cddc04c5de", "shasum": "" }, "require": { @@ -2577,7 +2576,7 @@ "issues": "https://github.com/laravel/socialite/issues", "source": "https://github.com/laravel/socialite" }, - "time": "2025-01-28T15:16:52+00:00" + "time": "2025-02-11T13:38:19+00:00" }, { "name": "league/commonmark", @@ -3511,16 +3510,16 @@ }, { "name": "nesbot/carbon", - "version": "2.72.6", + "version": "2.73.0", "source": { "type": "git", "url": "https://github.com/CarbonPHP/carbon.git", - "reference": "1e9d50601e7035a4c61441a208cb5bed73e108c5" + "reference": "9228ce90e1035ff2f0db84b40ec2e023ed802075" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/1e9d50601e7035a4c61441a208cb5bed73e108c5", - "reference": "1e9d50601e7035a4c61441a208cb5bed73e108c5", + "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/9228ce90e1035ff2f0db84b40ec2e023ed802075", + "reference": "9228ce90e1035ff2f0db84b40ec2e023ed802075", "shasum": "" }, "require": { @@ -3614,7 +3613,7 @@ "type": "tidelift" } ], - "time": "2024-12-27T09:28:11+00:00" + "time": "2025-01-08T20:10:23+00:00" }, { "name": "nette/schema", @@ -6112,29 +6111,29 @@ }, { "name": "spatie/laravel-activitylog", - "version": "4.9.1", + "version": "4.10.1", "source": { "type": "git", "url": "https://github.com/spatie/laravel-activitylog.git", - "reference": "9abddaa9f2681d97943748c7fa04161cf4642e8c" + "reference": "466f30f7245fe3a6e328ad5e6812bd43b4bddea5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-activitylog/zipball/9abddaa9f2681d97943748c7fa04161cf4642e8c", - "reference": "9abddaa9f2681d97943748c7fa04161cf4642e8c", + "url": "https://api.github.com/repos/spatie/laravel-activitylog/zipball/466f30f7245fe3a6e328ad5e6812bd43b4bddea5", + "reference": "466f30f7245fe3a6e328ad5e6812bd43b4bddea5", "shasum": "" }, "require": { - "illuminate/config": "^8.0 || ^9.0 || ^10.0 || ^11.0", - "illuminate/database": "^8.69 || ^9.27 || ^10.0 || ^11.0", - "illuminate/support": "^8.0 || ^9.0 || ^10.0 || ^11.0", + "illuminate/config": "^8.0 || ^9.0 || ^10.0 || ^11.0 || ^12.0", + "illuminate/database": "^8.69 || ^9.27 || ^10.0 || ^11.0 || ^12.0", + "illuminate/support": "^8.0 || ^9.0 || ^10.0 || ^11.0 || ^12.0", "php": "^8.1", "spatie/laravel-package-tools": "^1.6.3" }, "require-dev": { "ext-json": "*", - "orchestra/testbench": "^6.23 || ^7.0 || ^8.0 || ^9.0", - "pestphp/pest": "^1.20 || ^2.0" + "orchestra/testbench": "^6.23 || ^7.0 || ^8.0 || ^9.0 || ^10.0", + "pestphp/pest": "^1.20 || ^2.0 || ^3.0" }, "type": "library", "extra": { @@ -6187,7 +6186,7 @@ ], "support": { "issues": "https://github.com/spatie/laravel-activitylog/issues", - "source": "https://github.com/spatie/laravel-activitylog/tree/4.9.1" + "source": "https://github.com/spatie/laravel-activitylog/tree/4.10.1" }, "funding": [ { @@ -6199,7 +6198,7 @@ "type": "github" } ], - "time": "2024-11-18T11:31:57+00:00" + "time": "2025-02-10T15:38:25+00:00" }, { "name": "spatie/laravel-backup", @@ -6302,27 +6301,27 @@ }, { "name": "spatie/laravel-package-tools", - "version": "1.18.3", + "version": "1.19.0", "source": { "type": "git", "url": "https://github.com/spatie/laravel-package-tools.git", - "reference": "ba67eee37d86ed775dab7dad58a7cbaf9a6cfe78" + "reference": "1c9c30ac6a6576b8d15c6c37b6cf23d748df2faa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-package-tools/zipball/ba67eee37d86ed775dab7dad58a7cbaf9a6cfe78", - "reference": "ba67eee37d86ed775dab7dad58a7cbaf9a6cfe78", + "url": "https://api.github.com/repos/spatie/laravel-package-tools/zipball/1c9c30ac6a6576b8d15c6c37b6cf23d748df2faa", + "reference": "1c9c30ac6a6576b8d15c6c37b6cf23d748df2faa", "shasum": "" }, "require": { - "illuminate/contracts": "^9.28|^10.0|^11.0", + "illuminate/contracts": "^9.28|^10.0|^11.0|^12.0", "php": "^8.0" }, "require-dev": { "mockery/mockery": "^1.5", - "orchestra/testbench": "^7.7|^8.0|^9.0", - "pestphp/pest": "^1.22|^2", - "phpunit/phpunit": "^9.5.24|^10.5", + "orchestra/testbench": "^7.7|^8.0|^9.0|^10.0", + "pestphp/pest": "^1.23|^2.1|^3.1", + "phpunit/phpunit": "^9.5.24|^10.5|^11.5", "spatie/pest-plugin-test-time": "^1.1|^2.2" }, "type": "library", @@ -6350,7 +6349,7 @@ ], "support": { "issues": "https://github.com/spatie/laravel-package-tools/issues", - "source": "https://github.com/spatie/laravel-package-tools/tree/1.18.3" + "source": "https://github.com/spatie/laravel-package-tools/tree/1.19.0" }, "funding": [ { @@ -6358,7 +6357,7 @@ "type": "github" } ], - "time": "2025-01-22T08:51:18+00:00" + "time": "2025-02-06T14:58:20+00:00" }, { "name": "spatie/laravel-permission", @@ -10925,16 +10924,16 @@ }, { "name": "phpunit/phpunit", - "version": "10.5.44", + "version": "10.5.45", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "1381c62769be4bb88fa4c5aec1366c7c66ca4f36" + "reference": "bd68a781d8e30348bc297449f5234b3458267ae8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/1381c62769be4bb88fa4c5aec1366c7c66ca4f36", - "reference": "1381c62769be4bb88fa4c5aec1366c7c66ca4f36", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/bd68a781d8e30348bc297449f5234b3458267ae8", + "reference": "bd68a781d8e30348bc297449f5234b3458267ae8", "shasum": "" }, "require": { @@ -11006,7 +11005,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.44" + "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.45" }, "funding": [ { @@ -11022,7 +11021,7 @@ "type": "tidelift" } ], - "time": "2025-01-31T07:00:38+00:00" + "time": "2025-02-06T16:08:12+00:00" }, { "name": "psy/psysh", @@ -11109,12 +11108,12 @@ "source": { "type": "git", "url": "https://github.com/Roave/SecurityAdvisories.git", - "reference": "ec1d1ce93931a0560cbb5b9ba2d6a3a2719c0c79" + "reference": "b3b8e9af2f66bf476ec0c4bbaf5ca069488c643e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/ec1d1ce93931a0560cbb5b9ba2d6a3a2719c0c79", - "reference": "ec1d1ce93931a0560cbb5b9ba2d6a3a2719c0c79", + "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/b3b8e9af2f66bf476ec0c4bbaf5ca069488c643e", + "reference": "b3b8e9af2f66bf476ec0c4bbaf5ca069488c643e", "shasum": "" }, "conflict": { @@ -11470,6 +11469,7 @@ "magento/magento1ce": "<1.9.4.3-dev", "magento/magento1ee": ">=1,<1.14.4.3-dev", "magento/product-community-edition": "<2.4.4.0-patch9|>=2.4.5,<2.4.5.0-patch8|>=2.4.6,<2.4.6.0-patch6|>=2.4.7,<2.4.7.0-patch1", + "magento/project-community-edition": "<=2.0.2", "magneto/core": "<1.9.4.4-dev", "maikuolan/phpmussel": ">=1,<1.6", "mainwp/mainwp": "<=4.4.3.3", @@ -11515,6 +11515,7 @@ "munkireport/reportdata": "<3.5", "munkireport/softwareupdate": "<1.6", "mustache/mustache": ">=2,<2.14.1", + "mwdelaney/wp-enable-svg": "<=0.2", "namshi/jose": "<2.2", "nategood/httpful": "<1", "neoan3-apps/template": "<1.1.1", @@ -11552,7 +11553,7 @@ "openid/php-openid": "<2.3", "openmage/magento-lts": "<20.10.1", "opensolutions/vimbadmin": "<=3.0.15", - "opensource-workshop/connect-cms": "<1.7.2|>=2,<2.3.2", + "opensource-workshop/connect-cms": "<1.8.7|>=2,<2.4.7", "orchid/platform": ">=8,<14.43", "oro/calendar-bundle": ">=4.2,<=4.2.6|>=5,<=5.0.6|>=5.1,<5.1.1", "oro/commerce": ">=4.1,<5.0.11|>=5.1,<5.1.1", @@ -11602,7 +11603,7 @@ "phpxmlrpc/extras": "<0.6.1", "phpxmlrpc/phpxmlrpc": "<4.9.2", "pi/pi": "<=2.5", - "pimcore/admin-ui-classic-bundle": "<1.5.4", + "pimcore/admin-ui-classic-bundle": "<1.7.4", "pimcore/customer-management-framework-bundle": "<4.2.1", "pimcore/data-hub": "<1.2.4", "pimcore/data-importer": "<1.8.9|>=1.9,<1.9.3", @@ -11648,7 +11649,7 @@ "rap2hpoutre/laravel-log-viewer": "<0.13", "react/http": ">=0.7,<1.9", "really-simple-plugins/complianz-gdpr": "<6.4.2", - "redaxo/source": "<5.18", + "redaxo/source": "<=5.18.1", "remdex/livehelperchat": "<4.29", "reportico-web/reportico": "<=8.1", "rhukster/dom-sanitizer": "<1.0.7", @@ -11656,6 +11657,7 @@ "robrichards/xmlseclibs": ">=1,<3.0.4", "roots/soil": "<4.1", "rudloff/alltube": "<3.0.3", + "rudloff/rtmpdump-bin": "<=2.3.1", "s-cart/core": "<6.9", "s-cart/s-cart": "<6.9", "sabberworm/php-css-parser": ">=1,<1.0.1|>=2,<2.0.1|>=3,<3.0.1|>=4,<4.0.1|>=5,<5.0.9|>=5.1,<5.1.3|>=5.2,<5.2.1|>=6,<6.0.2|>=7,<7.0.4|>=8,<8.0.1|>=8.1,<8.1.1|>=8.2,<8.2.1|>=8.3,<8.3.1", @@ -11973,7 +11975,7 @@ "type": "tidelift" } ], - "time": "2025-02-05T22:04:25+00:00" + "time": "2025-02-10T21:04:44+00:00" }, { "name": "sebastian/cli-parser", diff --git a/package-lock.json b/package-lock.json index 2bf75b37..a5faf0ac 100644 --- a/package-lock.json +++ b/package-lock.json @@ -49,9 +49,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.5.tgz", - "integrity": "sha512-XvcZi1KWf88RVbF9wn8MN6tYFloU5qX8KjuF3E1PVBmJ9eypXfs4GRiJwLuTZL0iSnJUKn1BFPa5BPZZJyFzPg==", + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.8.tgz", + "integrity": "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==", "dev": true, "license": "MIT", "engines": { @@ -59,22 +59,23 @@ } }, "node_modules/@babel/core": { - "version": "7.26.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.7.tgz", - "integrity": "sha512-SRijHmF0PSPgLIBYlWnG0hyeJLwXE2CgpsXaMOrtt2yp9/86ALw6oUlj9KYuZ0JN07T4eBMVIW4li/9S1j2BGA==", + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.8.tgz", + "integrity": "sha512-l+lkXCHS6tQEc5oUpK28xBOZ6+HwaH7YwoYQbLFiYb4nS2/l1tKnZEtEWkD0GuiYdvArf9qBS0XlQGXzPMsNqQ==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.5", + "@babel/generator": "^7.26.8", "@babel/helper-compilation-targets": "^7.26.5", "@babel/helper-module-transforms": "^7.26.0", "@babel/helpers": "^7.26.7", - "@babel/parser": "^7.26.7", - "@babel/template": "^7.25.9", - "@babel/traverse": "^7.26.7", - "@babel/types": "^7.26.7", + "@babel/parser": "^7.26.8", + "@babel/template": "^7.26.8", + "@babel/traverse": "^7.26.8", + "@babel/types": "^7.26.8", + "@types/gensync": "^1.0.0", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -100,14 +101,14 @@ } }, "node_modules/@babel/generator": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.5.tgz", - "integrity": "sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw==", + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.8.tgz", + "integrity": "sha512-ef383X5++iZHWAXX0SXQR6ZyQhw/0KtTkrTz61WXRhFM6dhpHulO/RJz79L8S6ugZHJkOOkUrUdxgdF2YiPFnA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.26.5", - "@babel/types": "^7.26.5", + "@babel/parser": "^7.26.8", + "@babel/types": "^7.26.8", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" @@ -412,13 +413,13 @@ } }, "node_modules/@babel/parser": { - "version": "7.26.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.7.tgz", - "integrity": "sha512-kEvgGGgEjRUutvdVvZhbn/BxVt+5VSpwXz1j3WYXQbXDo8KzFOPNG2GQbdAiNq8g6wn1yKk7C/qrke03a84V+w==", + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.8.tgz", + "integrity": "sha512-TZIQ25pkSoaKEYYaHbbxkfL36GNsQ6iFiBbeuzAkLnXayKR1yP1zFe+NxuZWWsUyvt8icPU9CCq0sgWGXR1GEw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.26.7" + "@babel/types": "^7.26.8" }, "bin": { "parser": "bin/babel-parser.js" @@ -637,15 +638,15 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.9.tgz", - "integrity": "sha512-RXV6QAzTBbhDMO9fWwOmwwTuYaiPbggWQ9INdZqAYeSHyG7FzQ+nOZaUUjNwKv9pV3aE4WFqFm1Hnbci5tBCAw==", + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.26.8.tgz", + "integrity": "sha512-He9Ej2X7tNf2zdKMAGOsmg2MrFc+hfoAhd3po4cWfo/NWjzEAKa0oQruj1ROVUdl0e6fb6/kE/G3SSxE0lRJOg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-plugin-utils": "^7.26.5", "@babel/helper-remap-async-to-generator": "^7.25.9", - "@babel/traverse": "^7.25.9" + "@babel/traverse": "^7.26.8" }, "engines": { "node": ">=6.9.0" @@ -1310,14 +1311,14 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.25.9.tgz", - "integrity": "sha512-nZp7GlEl+yULJrClz0SwHPqir3lc0zsPrDHQUcxGspSL7AKrexNSEfTbfqnDNJUO13bgKyfuOLMF8Xqtu8j3YQ==", + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.26.8.tgz", + "integrity": "sha512-H0jlQxFMI0Q8SyGPsj9pO3ygVQRxPkIGytsL3m1Zqca8KrCPpMlvh+e2dxknqdfS8LFwBw+PpiYPD9qy/FPQpA==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-plugin-utils": "^7.26.5", "babel-plugin-polyfill-corejs2": "^0.4.10", "babel-plugin-polyfill-corejs3": "^0.10.6", "babel-plugin-polyfill-regenerator": "^0.6.1", @@ -1390,13 +1391,13 @@ } }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.25.9.tgz", - "integrity": "sha512-o97AE4syN71M/lxrCtQByzphAdlYluKPDBzDVzMmfCobUjjhAryZV0AIpRPrxN0eAkxXO6ZLEScmt+PNhj2OTw==", + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.26.8.tgz", + "integrity": "sha512-OmGDL5/J0CJPJZTHZbi2XpO0tyT2Ia7fzpW5GURwdtp2X3fMmN8au/ej6peC/T33/+CRiIpA8Krse8hFGVmT5Q==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.26.5" }, "engines": { "node": ">=6.9.0" @@ -1489,13 +1490,13 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.26.7", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.26.7.tgz", - "integrity": "sha512-Ycg2tnXwixaXOVb29rana8HNPgLVBof8qqtNQ9LE22IoyZboQbGSxI6ZySMdW3K5nAe6gu35IaJefUJflhUFTQ==", + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.26.8.tgz", + "integrity": "sha512-um7Sy+2THd697S4zJEfv/U5MHGJzkN2xhtsR3T/SWRbVSic62nbISh51VVfU9JiO/L/Z97QczHTaFVkOU8IzNg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.26.5", + "@babel/compat-data": "^7.26.8", "@babel/helper-compilation-targets": "^7.26.5", "@babel/helper-plugin-utils": "^7.26.5", "@babel/helper-validator-option": "^7.25.9", @@ -1509,7 +1510,7 @@ "@babel/plugin-syntax-import-attributes": "^7.26.0", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", "@babel/plugin-transform-arrow-functions": "^7.25.9", - "@babel/plugin-transform-async-generator-functions": "^7.25.9", + "@babel/plugin-transform-async-generator-functions": "^7.26.8", "@babel/plugin-transform-async-to-generator": "^7.25.9", "@babel/plugin-transform-block-scoped-functions": "^7.26.5", "@babel/plugin-transform-block-scoping": "^7.25.9", @@ -1552,7 +1553,7 @@ "@babel/plugin-transform-shorthand-properties": "^7.25.9", "@babel/plugin-transform-spread": "^7.25.9", "@babel/plugin-transform-sticky-regex": "^7.25.9", - "@babel/plugin-transform-template-literals": "^7.25.9", + "@babel/plugin-transform-template-literals": "^7.26.8", "@babel/plugin-transform-typeof-symbol": "^7.26.7", "@babel/plugin-transform-unicode-escapes": "^7.25.9", "@babel/plugin-transform-unicode-property-regex": "^7.25.9", @@ -1560,9 +1561,9 @@ "@babel/plugin-transform-unicode-sets-regex": "^7.25.9", "@babel/preset-modules": "0.1.6-no-external-plugins", "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.10.6", + "babel-plugin-polyfill-corejs3": "^0.11.0", "babel-plugin-polyfill-regenerator": "^0.6.1", - "core-js-compat": "^3.38.1", + "core-js-compat": "^3.40.0", "semver": "^6.3.1" }, "engines": { @@ -1572,6 +1573,20 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/preset-env/node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.11.1.tgz", + "integrity": "sha512-yGCqvBT4rwMczo28xkH/noxJ6MZ4nJfkVYdoDaC/utLtWrXxv27HVrzAeSbqR8SxDsp46n0YF47EbHoixy6rXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.3", + "core-js-compat": "^3.40.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, "node_modules/@babel/preset-env/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -1611,32 +1626,32 @@ } }, "node_modules/@babel/template": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz", - "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.26.8.tgz", + "integrity": "sha512-iNKaX3ZebKIsCvJ+0jd6embf+Aulaa3vNBqZ41kM7iTWjx5qzWKXGHiJUW3+nTpQ18SG11hdF8OAzKrpXkb96Q==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.25.9", - "@babel/parser": "^7.25.9", - "@babel/types": "^7.25.9" + "@babel/code-frame": "^7.26.2", + "@babel/parser": "^7.26.8", + "@babel/types": "^7.26.8" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.26.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.7.tgz", - "integrity": "sha512-1x1sgeyRLC3r5fQOM0/xtQKsYjyxmFjaOrLJNtZ81inNjyJHGIolTULPiSc/2qe1/qfpFLisLQYFnnZl7QoedA==", + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.8.tgz", + "integrity": "sha512-nic9tRkjYH0oB2dzr/JoGIm+4Q6SuYeLEiIiZDwBscRMYFJ+tMAz98fuel9ZnbXViA2I0HVSSRRK8DW5fjXStA==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.5", - "@babel/parser": "^7.26.7", - "@babel/template": "^7.25.9", - "@babel/types": "^7.26.7", + "@babel/generator": "^7.26.8", + "@babel/parser": "^7.26.8", + "@babel/template": "^7.26.8", + "@babel/types": "^7.26.8", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -1645,9 +1660,9 @@ } }, "node_modules/@babel/types": { - "version": "7.26.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.7.tgz", - "integrity": "sha512-t8kDRGrKXyp6+tjUh7hw2RLyclsW4TRoRvRHtSyAX9Bb5ldlFh+90YAYY6awRXrlB4G5G2izNeGySpATlFzmOg==", + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.8.tgz", + "integrity": "sha512-eUuWapzEGWFEpHFxgEaBG8e3n6S8L3MSu0oda755rOfabWPnh0Our1AozNFVUxGFIhbKgd1ksprsoDGMinTOTA==", "dev": true, "license": "MIT", "dependencies": { @@ -2300,6 +2315,13 @@ "@types/send": "*" } }, + "node_modules/@types/gensync": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@types/gensync/-/gensync-1.0.4.tgz", + "integrity": "sha512-C3YYeRQWp2fmq9OryX+FoDy8nXS6scQ7dPptD8LnFDAUNcKWJjXQKDNJD3HVm+kOUsXhTOkpi69vI4EuAr95bA==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/glob": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", @@ -2319,9 +2341,9 @@ "license": "MIT" }, "node_modules/@types/http-proxy": { - "version": "1.17.15", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.15.tgz", - "integrity": "sha512-25g5atgiVNTIv0LBDTg1H74Hvayx0ajtJPLLcYE3whFv75J0pWNtOBzaXJQgDTmrX1bx5U9YC2w/n65BN1HwRQ==", + "version": "1.17.16", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.16.tgz", + "integrity": "sha512-sdWoUajOB1cd0A8cRRQ1cfyWNbmFKLAqBB89Y8x5iYyG/mkJHc0YUH8pdWBy2omi9qtCpiIgGjuwO0dQST2l5w==", "dev": true, "license": "MIT", "dependencies": { @@ -3494,9 +3516,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001697", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001697.tgz", - "integrity": "sha512-GwNPlWJin8E+d7Gxq96jxM6w0w+VFeyyXRsjU58emtkYqnbwHqXm5uT2uCmO0RQE9htWknOP4xtBlLmM/gWxvQ==", + "version": "1.0.30001699", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001699.tgz", + "integrity": "sha512-b+uH5BakXZ9Do9iK+CkDmctUSEqZl+SP056vc5usa0PL+ev5OHw003rZXcnjNDv3L8P5j6rwT6C0BPKSikW08w==", "dev": true, "funding": [ { @@ -3721,9 +3743,9 @@ } }, "node_modules/compression": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.5.tgz", - "integrity": "sha512-bQJ0YRck5ak3LgtnpKkiabX5pNF7tMUh1BSy2ZBOTh0Dim0BUu6aPPwByIns6/A5Prh8PufSPerMDUklpzes2Q==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.0.tgz", + "integrity": "sha512-k6WLKfunuqCYD3t6AsuPGvQWaKwuLLh2/xHNcX4qE+vIfDNXpSqnrhwA7O53R7WVQUnt8dVAIW+YHr7xTgOgGA==", "dev": true, "license": "MIT", "dependencies": { @@ -4554,9 +4576,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.93", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.93.tgz", - "integrity": "sha512-M+29jTcfNNoR9NV7la4SwUqzWAxEwnc7ThA5e1m6LRSotmpfpCpLcIfgtSCVL+MllNLgAyM/5ru86iMRemPzDQ==", + "version": "1.5.97", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.97.tgz", + "integrity": "sha512-HKLtaH02augM7ZOdYRuO19rWDeY+QSJ1VxnXFa/XDFLf07HvM90pALIJFgrO+UVaajI3+aJMMpojoUTLZyQ7JQ==", "dev": true, "license": "ISC" }, @@ -7337,9 +7359,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.2", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.2.tgz", + "integrity": "sha512-MjOadfU3Ys9KYoX0AdkBlFEF1Vx37uCCeN4ZHnmwm9FfpbsGWMZeBLMmmpY+6Ocqod7mkdZ0DT31OlbsFrLlkA==", "dev": true, "funding": [ { @@ -7656,9 +7678,9 @@ } }, "node_modules/postcss-modules-local-by-default/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": { @@ -7686,9 +7708,9 @@ } }, "node_modules/postcss-modules-scope/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": { @@ -9299,9 +9321,9 @@ } }, "node_modules/terser": { - "version": "5.38.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.38.0.tgz", - "integrity": "sha512-a4GD5R1TjEeuCT6ZRiYMHmIf7okbCPEuhQET8bczV6FrQMMlFXA1n+G0KKjdlFCm3TEHV77GxfZB3vZSUQGFpg==", + "version": "5.38.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.38.2.tgz", + "integrity": "sha512-w8CXxxbFA5zfNsR/i8HZq5bvn18AK0O9jj7hyo1YqkovLxEFa0uP0LCVGZRqiRaKRFxXhELBp8SteeAjEnfeJg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { From 6f5279c6fc4bd3a5037135e2fba2432980964958 Mon Sep 17 00:00:00 2001 From: Kovah Date: Tue, 11 Feb 2025 22:03:08 +0100 Subject: [PATCH 16/61] v2.1.1 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index a5faf0ac..cac2eb0c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "linkace", - "version": "2.1.0", + "version": "2.1.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "linkace", - "version": "2.1.0", + "version": "2.1.1", "license": "GPL-3.0-or-later", "dependencies": { "bootstrap": "^5.3.3", diff --git a/package.json b/package.json index 19e0498d..41618be8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "linkace", - "version": "2.1.0", + "version": "2.1.1", "description": "A small, selfhosted bookmark manager with advanced features, built with Laravel and Docker", "homepage": "https://github.com/Kovah/LinkAce", "repository": { From e64bca235fe5abc11ee46e7d9c01e92d4d933303 Mon Sep 17 00:00:00 2001 From: Kovah Date: Sat, 15 Feb 2025 10:08:12 +0100 Subject: [PATCH 17/61] Make more config variables editable via env --- config/database.php | 8 ++++---- config/html-meta.php | 5 +++-- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/config/database.php b/config/database.php index fffdb02f..cbd0c730 100644 --- a/config/database.php +++ b/config/database.php @@ -52,8 +52,8 @@ 'username' => env('DB_USERNAME', 'forge'), 'password' => env('DB_PASSWORD', ''), 'unix_socket' => env('DB_SOCKET', ''), - 'charset' => 'utf8mb4', - 'collation' => 'utf8mb4_unicode_ci', + 'charset' => env('DB_CHARSET', 'utf8mb4'), + 'collation' => env('DB_COLLATION', 'utf8mb4_unicode_ci'), 'prefix' => '', 'prefix_indexes' => true, 'strict' => true, @@ -71,7 +71,7 @@ 'database' => env('DB_DATABASE', 'forge'), 'username' => env('DB_USERNAME', 'forge'), 'password' => env('DB_PASSWORD', ''), - 'charset' => 'utf8', + 'charset' => env('DB_CHARSET', 'utf8'), 'prefix' => '', 'prefix_indexes' => true, 'search_path' => 'public', @@ -86,7 +86,7 @@ 'database' => env('DB_DATABASE', 'forge'), 'username' => env('DB_USERNAME', 'forge'), 'password' => env('DB_PASSWORD', ''), - 'charset' => 'utf8', + 'charset' => env('DB_CHARSET', 'utf8'), 'prefix' => '', 'prefix_indexes' => true, // 'encrypt' => env('DB_ENCRYPT', 'yes'), diff --git a/config/html-meta.php b/config/html-meta.php index fea9762f..b3c09a94 100644 --- a/config/html-meta.php +++ b/config/html-meta.php @@ -1,8 +1,9 @@ 10, + 'timeout' => env('META_GENERATION_TIMEOUT'), 'parser' => \Kovah\HtmlMeta\HtmlMetaParser::class, 'user_agents' => [ - env('APP_USER_AGENT', 'LinkAce/1 (https://github.com/Kovah/LinkAce)'), + env('APP_USER_AGENT', 'LinkAce/2 (https://github.com/Kovah/LinkAce)'), ], + 'custom_headers' => env('META_GENERATION_CUSTOM_HEADERS'), ]; From 4706b1cb9a6d56eb25865ce2342892b7104fa87d Mon Sep 17 00:00:00 2001 From: Kovah Date: Sat, 15 Feb 2025 10:11:04 +0100 Subject: [PATCH 18/61] Correct random ordering for tags and lists --- app/Http/Controllers/Guest/ListController.php | 13 +++++++++---- app/Http/Controllers/Guest/TagController.php | 13 +++++++++---- app/Http/Controllers/Models/ListController.php | 13 +++++++++---- app/Http/Controllers/Models/TagController.php | 13 +++++++++---- 4 files changed, 36 insertions(+), 16 deletions(-) diff --git a/app/Http/Controllers/Guest/ListController.php b/app/Http/Controllers/Guest/ListController.php index 8b92d312..8eb2aecf 100644 --- a/app/Http/Controllers/Guest/ListController.php +++ b/app/Http/Controllers/Guest/ListController.php @@ -51,10 +51,15 @@ public function show(Request $request, LinkList $list): View $this->orderDir = $request->input('orderBy', 'desc'); $this->checkOrdering(); - $links = $list->links() - ->publicOnly() - ->orderBy($this->orderBy, $this->orderDir) - ->paginate(getPaginationLimit()); + $links = $list->links()->publicOnly(); + + if ($this->orderBy === 'random') { + $links->inRandomOrder(); + } else { + $links->orderBy($this->orderBy, $this->orderDir); + } + + $links = $links->paginate(getPaginationLimit()); return view('guest.lists.show', [ 'pageTitle' => trans('list.list') . ': ' . $list->name, diff --git a/app/Http/Controllers/Guest/TagController.php b/app/Http/Controllers/Guest/TagController.php index 27cf7eae..89fb929f 100644 --- a/app/Http/Controllers/Guest/TagController.php +++ b/app/Http/Controllers/Guest/TagController.php @@ -52,10 +52,15 @@ public function show(Request $request, Tag $tag): View $this->orderDir = $request->input('orderBy', 'desc'); $this->checkOrdering(); - $links = $tag->links() - ->publicOnly() - ->orderBy($this->orderBy, $this->orderDir) - ->paginate(getPaginationLimit()); + $links = $tag->links()->publicOnly(); + + if ($this->orderBy === 'random') { + $links->inRandomOrder(); + } else { + $links->orderBy($this->orderBy, $this->orderDir); + } + + $links = $links->paginate(getPaginationLimit()); return view('guest.tags.show', [ 'pageTitle' => trans('tag.tag') . ': ' . $tag->name, diff --git a/app/Http/Controllers/Models/ListController.php b/app/Http/Controllers/Models/ListController.php index b006f9b6..e5b8d2ab 100644 --- a/app/Http/Controllers/Models/ListController.php +++ b/app/Http/Controllers/Models/ListController.php @@ -83,10 +83,15 @@ public function show(Request $request, LinkList $list): View $this->orderDir = $request->input('orderBy', 'desc'); $this->checkOrdering(); - $links = $list->links() - ->visibleForUser() - ->orderBy($this->orderBy, $this->orderDir) - ->paginate(getPaginationLimit()); + $links = $list->links()->publicOnly(); + + if ($this->orderBy === 'random') { + $links->inRandomOrder(); + } else { + $links->orderBy($this->orderBy, $this->orderDir); + } + + $links = $links->paginate(getPaginationLimit()); return view('models.lists.show', [ 'pageTitle' => trans('list.list') . ': ' . $list->name, diff --git a/app/Http/Controllers/Models/TagController.php b/app/Http/Controllers/Models/TagController.php index 9af0de44..7cc2aeaf 100644 --- a/app/Http/Controllers/Models/TagController.php +++ b/app/Http/Controllers/Models/TagController.php @@ -86,10 +86,15 @@ public function show(Request $request, Tag $tag): View $this->orderDir = $request->input('orderBy', 'desc'); $this->checkOrdering(); - $links = $tag->links() - ->visibleForUser() - ->orderBy($this->orderBy, $this->orderDir) - ->paginate(getPaginationLimit()); + $links = $tag->links()->publicOnly(); + + if ($this->orderBy === 'random') { + $links->inRandomOrder(); + } else { + $links->orderBy($this->orderBy, $this->orderDir); + } + + $links = $links->paginate(getPaginationLimit()); return view('models.tags.show', [ 'pageTitle' => trans('tag.tag') . ': ' . $tag->name, From f933f7cb63d3138844705862207627c7e5c9daa8 Mon Sep 17 00:00:00 2001 From: Kovah Date: Sat, 15 Feb 2025 10:23:09 +0100 Subject: [PATCH 19/61] Add Bluesky to sharing options (#909) --- app/Settings/GuestSettings.php | 3 ++- app/Settings/UserSettings.php | 3 ++- config/sharing.php | 6 +++++- ...2025_02_15_092008_add_bluesky_share_method.php | 15 +++++++++++++++ .../views/components/icon/brand/bluesky.blade.php | 1 + 5 files changed, 25 insertions(+), 3 deletions(-) create mode 100644 database/settings/2025_02_15_092008_add_bluesky_share_method.php create mode 100644 resources/views/components/icon/brand/bluesky.blade.php diff --git a/app/Settings/GuestSettings.php b/app/Settings/GuestSettings.php index 25080146..fd29a262 100644 --- a/app/Settings/GuestSettings.php +++ b/app/Settings/GuestSettings.php @@ -12,8 +12,9 @@ class GuestSettings extends Settings public string $locale; - public bool $share_email; + public bool $share_bluesky; public bool $share_buffer; + public bool $share_email; public bool $share_evernote; public bool $share_facebook; public bool $share_flipboard; diff --git a/app/Settings/UserSettings.php b/app/Settings/UserSettings.php index 78a72c76..f7d6cc19 100644 --- a/app/Settings/UserSettings.php +++ b/app/Settings/UserSettings.php @@ -29,8 +29,9 @@ class UserSettings extends Settings public bool $links_new_tab; public bool $markdown_for_text; - public bool $share_email; + public bool $share_bluesky; public bool $share_buffer; + public bool $share_email; public bool $share_evernote; public bool $share_facebook; public bool $share_flipboard; diff --git a/config/sharing.php b/config/sharing.php index b7b58551..7bd3c1bb 100644 --- a/config/sharing.php +++ b/config/sharing.php @@ -34,7 +34,7 @@ 'icon' => 'icon.brand.facebook', ], 'twitter' => [ - 'action' => 'https://twitter.com/intent/tweet?text=#SHARETEXT#', + 'action' => 'https://twitter.com/intent/tweet?text=#E-SHARETEXT#', 'icon' => 'icon.brand.twitter', ], 'reddit' => [ @@ -65,6 +65,10 @@ 'action' => 'https://web.skype.com/share?url=#E-URL#', 'icon' => 'icon.brand.skype', ], + 'bluesky' => [ + 'action' => 'https://bsky.app/intent/compose?text=#E-SHARETEXT#', + 'icon' => 'icon.brand.bluesky', + ], 'hackernews' => [ 'action' => 'https://news.ycombinator.com/submitlink?u=#URL#&t=#SUBJECT#', 'icon' => 'icon.brand.hacker-news', diff --git a/database/settings/2025_02_15_092008_add_bluesky_share_method.php b/database/settings/2025_02_15_092008_add_bluesky_share_method.php new file mode 100644 index 00000000..5889431b --- /dev/null +++ b/database/settings/2025_02_15_092008_add_bluesky_share_method.php @@ -0,0 +1,15 @@ +migrator->add('guest.share_bluesky', false); + + foreach (DB::table('users')->pluck('id') as $userId) { + $id = 'user-' . $userId; + $this->migrator->add($id . '.shareAdd_bluesky', false); + } + } +}; diff --git a/resources/views/components/icon/brand/bluesky.blade.php b/resources/views/components/icon/brand/bluesky.blade.php new file mode 100644 index 00000000..a9bb4270 --- /dev/null +++ b/resources/views/components/icon/brand/bluesky.blade.php @@ -0,0 +1 @@ +merge(['class' => 'icon']) }} xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512" aria-hidden="true" focusable="false"> From 87b763977302abba004d0c9c3898d060c47d8ae7 Mon Sep 17 00:00:00 2001 From: Kovah Date: Sat, 15 Feb 2025 10:26:05 +0100 Subject: [PATCH 20/61] 2.1.2 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index cac2eb0c..1ff1114c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "linkace", - "version": "2.1.1", + "version": "2.1.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "linkace", - "version": "2.1.1", + "version": "2.1.2", "license": "GPL-3.0-or-later", "dependencies": { "bootstrap": "^5.3.3", diff --git a/package.json b/package.json index 41618be8..cc78ff11 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "linkace", - "version": "2.1.1", + "version": "2.1.2", "description": "A small, selfhosted bookmark manager with advanced features, built with Laravel and Docker", "homepage": "https://github.com/Kovah/LinkAce", "repository": { From 42c7b918affb347089b7a18932ef0e3220d6e906 Mon Sep 17 00:00:00 2001 From: Kovah Date: Sat, 15 Feb 2025 10:28:14 +0100 Subject: [PATCH 21/61] Add missing default for meta generation timeout --- config/html-meta.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/html-meta.php b/config/html-meta.php index b3c09a94..a79a5047 100644 --- a/config/html-meta.php +++ b/config/html-meta.php @@ -1,6 +1,6 @@ env('META_GENERATION_TIMEOUT'), + 'timeout' => env('META_GENERATION_TIMEOUT', 10), 'parser' => \Kovah\HtmlMeta\HtmlMetaParser::class, 'user_agents' => [ env('APP_USER_AGENT', 'LinkAce/2 (https://github.com/Kovah/LinkAce)'), From ae2fb804bca00db9f2567d9fb3248fa0def33b2f Mon Sep 17 00:00:00 2001 From: Kovah Date: Sat, 15 Feb 2025 10:33:40 +0100 Subject: [PATCH 22/61] Add missing default setting for user creation script --- app/Actions/Settings/SetDefaultSettingsForUser.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/Actions/Settings/SetDefaultSettingsForUser.php b/app/Actions/Settings/SetDefaultSettingsForUser.php index 557bddcf..1eba8f51 100644 --- a/app/Actions/Settings/SetDefaultSettingsForUser.php +++ b/app/Actions/Settings/SetDefaultSettingsForUser.php @@ -39,8 +39,9 @@ public function up(): void $this->migrator->add($group . '.links_new_tab', $defaults['links_new_tab']); $this->migrator->add($group . '.markdown_for_text', $defaults['markdown_for_text']); - $this->migrator->add($group . '.share_email', $defaults['share_services']); + $this->migrator->add($group . '.share_bluesky', $defaults['share_services']); $this->migrator->add($group . '.share_buffer', $defaults['share_services']); + $this->migrator->add($group . '.share_email', $defaults['share_services']); $this->migrator->add($group . '.share_evernote', $defaults['share_services']); $this->migrator->add($group . '.share_facebook', $defaults['share_services']); $this->migrator->add($group . '.share_flipboard', $defaults['share_services']); From 516e6f1919053e509394455e88344591a344de98 Mon Sep 17 00:00:00 2001 From: Kovah Date: Sat, 15 Feb 2025 11:00:32 +0100 Subject: [PATCH 23/61] Adjust tests and remove broken user migration --- tests/Helper/SharingTest.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/Helper/SharingTest.php b/tests/Helper/SharingTest.php index 8bc68168..93fc9863 100644 --- a/tests/Helper/SharingTest.php +++ b/tests/Helper/SharingTest.php @@ -14,7 +14,8 @@ class SharingTest extends TestCase public static $shareData = [ 'email' => 'mailto:?subject=Example%20Website&body=I%20found%20this%20awesome%20link%2C%20go%20check%20it%20out%3A%20https%3A%2F%2Fexample.com%2F"', 'facebook' => 'https://www.facebook.com/sharer/sharer.php?u=https://example.com/', - 'twitter' => 'https://twitter.com/intent/tweet?text=I found this awesome link, go check it out: https://example.com/', + 'twitter' => 'https://twitter.com/intent/tweet?text=I%20found%20this%20awesome%20link%2C%20go%20check%20it%20out%3A%20https%3A%2F%2Fexample.com%2F', + 'bluesky' => 'https://bsky.app/intent/compose?text=I%20found%20this%20awesome%20link%2C%20go%20check%20it%20out%3A%20https%3A%2F%2Fexample.com%2F', 'reddit' => 'http://www.reddit.com/submit?url=https://example.com/&title=Example Website', 'pinterest' => 'http://pinterest.com/pin/create/button/?url=https://example.com/&description=Example Website', 'whatsapp' => 'whatsapp://send?text=I found this awesome link, go check it out: https://example.com/', From df0373de8b749eebaeca5e8d00773a3b702cbc86 Mon Sep 17 00:00:00 2001 From: Kovah Date: Sat, 15 Feb 2025 11:01:08 +0100 Subject: [PATCH 24/61] Adjust tests and remove broken user migration --- tests/Migrations/UserDataMigrationTest.php | 31 +--------------------- 1 file changed, 1 insertion(+), 30 deletions(-) diff --git a/tests/Migrations/UserDataMigrationTest.php b/tests/Migrations/UserDataMigrationTest.php index 28375ec5..76d20b9e 100644 --- a/tests/Migrations/UserDataMigrationTest.php +++ b/tests/Migrations/UserDataMigrationTest.php @@ -10,6 +10,7 @@ use App\Settings\SystemSettings; use App\Settings\UserSettings; use Database\Seeders\RolesAndPermissionsSeeder; +use Illuminate\Support\Facades\Artisan; use Illuminate\Support\Facades\DB; use Laravel\Sanctum\Sanctum; use Laravel\Sanctum\SanctumServiceProvider; @@ -266,34 +267,4 @@ public function test_note_visibility_migration_with_enabled_guest_mode(): void 'visibility' => 1, // is public ]); } - - public function test_user_api_token_migration(): void - { - $this->migrateUpTo('2022_06_23_112431_migrate_user_data.php'); - - DB::table('users')->insert([ - 'name' => 'test', - 'email' => 'test@linkace.org', - 'password' => 'test', - 'api_token' => 'testApiToken', - 'created_at' => now(), - 'updated_at' => now(), - ]); - - $this->artisan('migrate'); - - $this->assertDatabaseHas('personal_access_tokens', [ - 'tokenable_type' => 'App\Models\User', - 'tokenable_id' => '1', - 'name' => 'MigratedApiToken', - 'abilities' => '["user_access"]', - ]); - - // Test if the token is valid - Link::factory()->create(['url' => 'https://token-test.com']); - - $this->get('links/feed', [ - 'Authorization' => 'Bearer testApiToken' - ])->assertOk()->assertSee('https://token-test.com'); - } } From cd39b7d2231abd0e9492c17d992cc6a51d0b6880 Mon Sep 17 00:00:00 2001 From: "Brooke." Date: Sat, 15 Feb 2025 15:24:34 -0800 Subject: [PATCH 25/61] Update 2025_02_15_092008_add_bluesky_share_method.php Fixes #913 --- .../settings/2025_02_15_092008_add_bluesky_share_method.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/database/settings/2025_02_15_092008_add_bluesky_share_method.php b/database/settings/2025_02_15_092008_add_bluesky_share_method.php index 5889431b..399f4d61 100644 --- a/database/settings/2025_02_15_092008_add_bluesky_share_method.php +++ b/database/settings/2025_02_15_092008_add_bluesky_share_method.php @@ -9,7 +9,7 @@ public function up(): void foreach (DB::table('users')->pluck('id') as $userId) { $id = 'user-' . $userId; - $this->migrator->add($id . '.shareAdd_bluesky', false); + $this->migrator->add($id . '.share_bluesky', false); } } }; From e5a0965c9c25a05c22b1f78bfaccf4f98492fe2f Mon Sep 17 00:00:00 2001 From: Kovah Date: Sun, 16 Feb 2025 10:07:46 +0100 Subject: [PATCH 26/61] 2.1.3 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1ff1114c..03d8ea2a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "linkace", - "version": "2.1.2", + "version": "2.1.3", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "linkace", - "version": "2.1.2", + "version": "2.1.3", "license": "GPL-3.0-or-later", "dependencies": { "bootstrap": "^5.3.3", diff --git a/package.json b/package.json index cc78ff11..8a018bbb 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "linkace", - "version": "2.1.2", + "version": "2.1.3", "description": "A small, selfhosted bookmark manager with advanced features, built with Laravel and Docker", "homepage": "https://github.com/Kovah/LinkAce", "repository": { From d8900d0f806700b86a86f318b220506188321a3d Mon Sep 17 00:00:00 2001 From: Kovah Date: Sun, 16 Feb 2025 10:20:17 +0100 Subject: [PATCH 27/61] Revert "Update 2025_02_15_092008_add_bluesky_share_method.php" This reverts commit cd39b7d2231abd0e9492c17d992cc6a51d0b6880. --- .../settings/2025_02_15_092008_add_bluesky_share_method.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/database/settings/2025_02_15_092008_add_bluesky_share_method.php b/database/settings/2025_02_15_092008_add_bluesky_share_method.php index 399f4d61..5889431b 100644 --- a/database/settings/2025_02_15_092008_add_bluesky_share_method.php +++ b/database/settings/2025_02_15_092008_add_bluesky_share_method.php @@ -9,7 +9,7 @@ public function up(): void foreach (DB::table('users')->pluck('id') as $userId) { $id = 'user-' . $userId; - $this->migrator->add($id . '.share_bluesky', false); + $this->migrator->add($id . '.shareAdd_bluesky', false); } } }; From b42290f49ac6282f8daad79206e160a6c5cebb75 Mon Sep 17 00:00:00 2001 From: Kovah Date: Sun, 16 Feb 2025 10:38:30 +0100 Subject: [PATCH 28/61] Add new migration for fixing user settings after v2.1.2 --- ...2025_02_16_092049_fix_bluesky_share_method.php | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 database/settings/2025_02_16_092049_fix_bluesky_share_method.php diff --git a/database/settings/2025_02_16_092049_fix_bluesky_share_method.php b/database/settings/2025_02_16_092049_fix_bluesky_share_method.php new file mode 100644 index 00000000..c39d15cc --- /dev/null +++ b/database/settings/2025_02_16_092049_fix_bluesky_share_method.php @@ -0,0 +1,15 @@ +pluck('id') as $userId) { + $id = 'user-' . $userId; + $this->migrator->delete($id . '.shareAdd_bluesky'); + $this->migrator->add($id . '.share_bluesky', false); + } + } +}; From 3230d771633e64e0d45b5b346e083297884eea74 Mon Sep 17 00:00:00 2001 From: Kovah Date: Sun, 16 Feb 2025 21:00:12 +0100 Subject: [PATCH 29/61] Fix link display for tags and lists (#912 #914) --- app/Http/Controllers/Models/LinkController.php | 4 +--- app/Http/Controllers/Models/ListController.php | 2 +- app/Http/Controllers/Models/TagController.php | 2 +- tests/Controller/Models/ListControllerTest.php | 9 ++++++++- tests/Controller/Models/TagControllerTest.php | 17 +++++++++++++---- 5 files changed, 24 insertions(+), 10 deletions(-) diff --git a/app/Http/Controllers/Models/LinkController.php b/app/Http/Controllers/Models/LinkController.php index 86d4c41a..9e6a6898 100644 --- a/app/Http/Controllers/Models/LinkController.php +++ b/app/Http/Controllers/Models/LinkController.php @@ -39,9 +39,7 @@ public function index(Request $request): View session()->put('links.index.orderBy', $this->orderBy); session()->put('links.index.orderDir', $this->orderDir); - $links = Link::query() - ->visibleForUser() - ->with('tags'); + $links = Link::query()->visibleForUser()->with('tags'); if ($this->orderBy === 'random') { $links->inRandomOrder(); diff --git a/app/Http/Controllers/Models/ListController.php b/app/Http/Controllers/Models/ListController.php index e5b8d2ab..2bebcad8 100644 --- a/app/Http/Controllers/Models/ListController.php +++ b/app/Http/Controllers/Models/ListController.php @@ -83,7 +83,7 @@ public function show(Request $request, LinkList $list): View $this->orderDir = $request->input('orderBy', 'desc'); $this->checkOrdering(); - $links = $list->links()->publicOnly(); + $links = $list->links()->visibleForUser(); if ($this->orderBy === 'random') { $links->inRandomOrder(); diff --git a/app/Http/Controllers/Models/TagController.php b/app/Http/Controllers/Models/TagController.php index 7cc2aeaf..cde1f786 100644 --- a/app/Http/Controllers/Models/TagController.php +++ b/app/Http/Controllers/Models/TagController.php @@ -86,7 +86,7 @@ public function show(Request $request, Tag $tag): View $this->orderDir = $request->input('orderBy', 'desc'); $this->checkOrdering(); - $links = $tag->links()->publicOnly(); + $links = $tag->links()->visibleForUser(); if ($this->orderBy === 'random') { $links->inRandomOrder(); diff --git a/tests/Controller/Models/ListControllerTest.php b/tests/Controller/Models/ListControllerTest.php index 321b8366..3797dc40 100644 --- a/tests/Controller/Models/ListControllerTest.php +++ b/tests/Controller/Models/ListControllerTest.php @@ -2,6 +2,7 @@ namespace Tests\Controller\Models; +use App\Enums\ModelAttribute; use App\Models\Link; use App\Models\LinkList; use App\Models\User; @@ -146,9 +147,15 @@ public function test_detail_view(): void [$list, $list2, $list3, $firstUser] = $this->createTestLists(); Link::factory()->for($firstUser)->create(['title' => 'FirstTestLink'])->lists()->sync([$list->id]); + Link::factory()->for($firstUser)->create([ + 'title' => 'InternalTestLink', + 'visibility' => ModelAttribute::VISIBILITY_INTERNAL, + ])->lists()->sync([$list->id]); $this->actingAs($otherUser); - $this->get('lists/1')->assertOk()->assertSee('Public List')->assertSee('Public List')->assertSee('FirstTestLink'); + $this->get('lists/1')->assertOk()->assertSee('Public List')->assertSee('Public List') + ->assertSee('FirstTestLink') + ->assertSee('InternalTestLink'); $this->get('lists/2')->assertOk()->assertSee('Internal List')->assertSee('Internal List'); $this->get('lists/3')->assertForbidden(); } diff --git a/tests/Controller/Models/TagControllerTest.php b/tests/Controller/Models/TagControllerTest.php index e2355d3f..96339de7 100644 --- a/tests/Controller/Models/TagControllerTest.php +++ b/tests/Controller/Models/TagControllerTest.php @@ -2,6 +2,8 @@ namespace Tests\Controller\Models; +use App\Enums\ModelAttribute; +use App\Models\Link; use App\Models\Tag; use App\Models\User; use Illuminate\Foundation\Testing\RefreshDatabase; @@ -20,7 +22,6 @@ protected function setUp(): void parent::setUp(); $this->user = User::factory()->create(); - $this->actingAs($this->user); } @@ -108,7 +109,7 @@ public function test_store_request_with_continue(): void public function test_validation_error_for_create(): void { - $response = $this->post('tags', [ + $this->post('tags', [ 'name' => null, 'visibility' => 1, ])->assertSessionHasErrors([ @@ -118,9 +119,17 @@ public function test_validation_error_for_create(): void public function test_detail_view(): void { - $this->createTestTags(); + [$tag1, $tag2, $tag3, $otherUser] = $this->createTestTags(); + + Link::factory()->for($this->user)->create(['title' => 'FirstTestLink'])->tags()->sync([$tag1->id]); + Link::factory()->for($this->user)->create([ + 'title' => 'SecondTestLink', + 'visibility' => ModelAttribute::VISIBILITY_INTERNAL, + ])->tags()->sync([$tag1->id]); - $this->get('tags/1')->assertOk()->assertSee('Public Tag'); + $this->get('tags/1')->assertOk()->assertSee('Public Tag') + ->assertSee('FirstTestLink') + ->assertSee('SecondTestLink'); $this->get('tags/2')->assertOk()->assertSee('Internal Tag'); $this->get('tags/3')->assertForbidden(); } From 6e14dd5a976d69439bac0de48e3ed85cbf0e3d18 Mon Sep 17 00:00:00 2001 From: Kovah Date: Sun, 16 Feb 2025 22:38:56 +0100 Subject: [PATCH 30/61] Level up debugging and dev with Buggregator --- .env.dev | 37 + .env.docker | 40 - .gitignore | 2 +- CONTRIBUTING.md | 2 +- composer.json | 1 + composer.lock | 703 +++++++++++++++++- config/logging.php | 12 +- docker-compose.yml | 8 + ray.php | 128 ++++ .../docker/dockerfiles/development.Dockerfile | 4 +- 10 files changed, 891 insertions(+), 46 deletions(-) create mode 100644 .env.dev delete mode 100644 .env.docker create mode 100644 ray.php diff --git a/.env.dev b/.env.dev new file mode 100644 index 00000000..e430174d --- /dev/null +++ b/.env.dev @@ -0,0 +1,37 @@ +## LINKACE CONFIGURATION + +APP_ENV=local +APP_KEY=someRandomStringWith32Characters +APP_DEBUG=true +APP_DEMO=false + +## Database configuration +DB_CONNECTION=mysql +DB_HOST=db +DB_PORT=3306 +DB_DATABASE=linkace +DB_USERNAME=linkace +DB_PASSWORD=ChangeThisToASecurePassword! + +## Redis cache configuration +REDIS_HOST=redis +REDIS_PASSWORD=ChangeThisToASecurePassword! +REDIS_PORT=6379 + +MAIL_MAILER=smtp +MAIL_HOST=buggregator +MAIL_PORT=1025 + +## Core driver configuration and logging +SESSION_DRIVER=redis +BROADCAST_DRIVER=log +CACHE_DRIVER=redis +QUEUE_DRIVER=database + +LOG_CHANNEL=socket +LOG_SOCKET_URL=buggregator:9913 + +SENTRY_LARAVEL_DSN=http://sentry@buggregator:23517/1 + +VAR_DUMPER_FORMAT=server +VAR_DUMPER_SERVER=buggregator:9912 diff --git a/.env.docker b/.env.docker deleted file mode 100644 index 530514bf..00000000 --- a/.env.docker +++ /dev/null @@ -1,40 +0,0 @@ -## LINKACE CONFIGURATION - -## Please note that the LinkAce Docker image will be renamed with the release of LinkAce 2! -## Read more: https://github.com/Kovah/LinkAce/issues/502 - -# The environment is usually 'production' but may be changed to 'local' for development -APP_ENV=local -# The app key is generated later, please leave it like that -APP_KEY=someRandomStringWith32Characters -# Enable the debug more if you are running into issues or while developing -APP_DEBUG=true - -## Configuration of the database connection -## Attention: Those settings are configured during the web setup, please do not modify them now. -# Set the database driver (mysql, pgsql, sqlsrv, sqlite) -DB_CONNECTION=mysql -# Set the host of your database here -DB_HOST=db -# Set the port of your database here -DB_PORT=3306 -# Set the database name here -DB_DATABASE=linkace -# Set both username and password of the user accessing the database -DB_USERNAME=linkace -# Wrap your password into quotes (") if it contains special characters -DB_PASSWORD=ChangeThisToASecurePassword! - -## Redis cache configuration -# Set the Redis connection here if you want to use it -REDIS_HOST=redis -REDIS_PASSWORD=ChangeThisToASecurePassword! -REDIS_PORT=6379 - -## You probably do not want to change any values blow. Only continue if you know what you are doing. -# Configure various driver -SESSION_DRIVER=redis -LOG_CHANNEL=stack -BROADCAST_DRIVER=log -CACHE_DRIVER=redis -QUEUE_DRIVER=database diff --git a/.gitignore b/.gitignore index af8bad72..367ff8f7 100644 --- a/.gitignore +++ b/.gitignore @@ -17,7 +17,7 @@ npm-debug.log yarn-error.log .env .env.* -!.env.docker +!.env.dev !.env.docker.production !.env.sqlite.production !.env.example diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index c567432a..38bf54bf 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -36,7 +36,7 @@ replace the word `docker` with `podman` in each command. Clone the repository to commands to start the Docker container system: ```bash -cp .env.docker .env +cp .env.dev .env docker compose up -d --build ``` diff --git a/composer.json b/composer.json index 4bd05f87..9b58d300 100644 --- a/composer.json +++ b/composer.json @@ -53,6 +53,7 @@ "phpunit/phpunit": "^10.0", "roave/security-advisories": "dev-latest", "spatie/laravel-ignition": "^2.4", + "spatie/laravel-ray": "^1.39", "squizlabs/php_codesniffer": "^3.5" }, "repositories": [ diff --git a/composer.lock b/composer.lock index 97dacf27..88564ff1 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": "16b211738dedf44009d4675d5c84efd5", + "content-hash": "b99110961df74f6b16b2b5a8b25a582f", "packages": [ { "name": "aws/aws-crt-php", @@ -10601,6 +10601,134 @@ }, "time": "2022-02-21T01:04:05+00:00" }, + { + "name": "php-di/invoker", + "version": "2.3.6", + "source": { + "type": "git", + "url": "https://github.com/PHP-DI/Invoker.git", + "reference": "59f15608528d8a8838d69b422a919fd6b16aa576" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHP-DI/Invoker/zipball/59f15608528d8a8838d69b422a919fd6b16aa576", + "reference": "59f15608528d8a8838d69b422a919fd6b16aa576", + "shasum": "" + }, + "require": { + "php": ">=7.3", + "psr/container": "^1.0|^2.0" + }, + "require-dev": { + "athletic/athletic": "~0.1.8", + "mnapoli/hard-mode": "~0.3.0", + "phpunit/phpunit": "^9.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Invoker\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Generic and extensible callable invoker", + "homepage": "https://github.com/PHP-DI/Invoker", + "keywords": [ + "callable", + "dependency", + "dependency-injection", + "injection", + "invoke", + "invoker" + ], + "support": { + "issues": "https://github.com/PHP-DI/Invoker/issues", + "source": "https://github.com/PHP-DI/Invoker/tree/2.3.6" + }, + "funding": [ + { + "url": "https://github.com/mnapoli", + "type": "github" + } + ], + "time": "2025-01-17T12:49:27+00:00" + }, + { + "name": "php-di/php-di", + "version": "7.0.8", + "source": { + "type": "git", + "url": "https://github.com/PHP-DI/PHP-DI.git", + "reference": "98ddc81f8f768a2ad39e4cbe737285eaeabe577a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHP-DI/PHP-DI/zipball/98ddc81f8f768a2ad39e4cbe737285eaeabe577a", + "reference": "98ddc81f8f768a2ad39e4cbe737285eaeabe577a", + "shasum": "" + }, + "require": { + "laravel/serializable-closure": "^1.0 || ^2.0", + "php": ">=8.0", + "php-di/invoker": "^2.0", + "psr/container": "^1.1 || ^2.0" + }, + "provide": { + "psr/container-implementation": "^1.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3", + "friendsofphp/proxy-manager-lts": "^1", + "mnapoli/phpunit-easymock": "^1.3", + "phpunit/phpunit": "^9.6", + "vimeo/psalm": "^4.6" + }, + "suggest": { + "friendsofphp/proxy-manager-lts": "Install it if you want to use lazy injection (version ^1)" + }, + "type": "library", + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "DI\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "The dependency injection container for humans", + "homepage": "https://php-di.org/", + "keywords": [ + "PSR-11", + "container", + "container-interop", + "dependency injection", + "di", + "ioc", + "psr11" + ], + "support": { + "issues": "https://github.com/PHP-DI/PHP-DI/issues", + "source": "https://github.com/PHP-DI/PHP-DI/tree/7.0.8" + }, + "funding": [ + { + "url": "https://github.com/mnapoli", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/php-di/php-di", + "type": "tidelift" + } + ], + "time": "2025-01-28T21:02:46+00:00" + }, { "name": "phpunit/php-code-coverage", "version": "10.1.16", @@ -13273,6 +13401,229 @@ ], "time": "2024-12-02T08:43:31+00:00" }, + { + "name": "spatie/laravel-ray", + "version": "1.39.1", + "source": { + "type": "git", + "url": "https://github.com/spatie/laravel-ray.git", + "reference": "0d890fa2cd2c0b6175cf54c56b9321d81047571d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/laravel-ray/zipball/0d890fa2cd2c0b6175cf54c56b9321d81047571d", + "reference": "0d890fa2cd2c0b6175cf54c56b9321d81047571d", + "shasum": "" + }, + "require": { + "composer-runtime-api": "^2.2", + "ext-json": "*", + "illuminate/contracts": "^7.20 || ^8.19 || ^9.0 || ^10.0 || ^11.0 || ^12.0", + "illuminate/database": "^7.20 || ^8.19 || ^9.0 || ^10.0 || ^11.0 || ^12.0", + "illuminate/queue": "^7.20 || ^8.19 || ^9.0 || ^10.0 || ^11.0 || ^12.0", + "illuminate/support": "^7.20 || ^8.19 || ^9.0 || ^10.0 || ^11.0 || ^12.0", + "php": "^7.4 || ^8.0", + "spatie/backtrace": "^1.7.1", + "spatie/ray": "^1.41.3", + "symfony/stopwatch": "4.2 || ^5.1 || ^6.0 || ^7.0", + "zbateson/mail-mime-parser": "^1.3.1 || ^2.0 || ^3.0" + }, + "require-dev": { + "guzzlehttp/guzzle": "^7.3", + "laravel/framework": "^7.20 || ^8.19 || ^9.0 || ^10.0 || ^11.0 || ^12.0", + "orchestra/testbench-core": "^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.0 || ^10.0", + "pestphp/pest": "^1.22 || ^2.0 || ^3.0", + "phpstan/phpstan": "^1.10.57 || ^2.0.2", + "phpunit/phpunit": "^9.3 || ^10.1 || ^11.0.10", + "rector/rector": "^0.19.2 || ^1.0.1 || ^2.0.0", + "spatie/pest-plugin-snapshots": "^1.1 || ^2.0", + "symfony/var-dumper": "^4.2 || ^5.1 || ^6.0 || ^7.0.3" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Spatie\\LaravelRay\\RayServiceProvider" + ] + }, + "branch-alias": { + "dev-main": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Spatie\\LaravelRay\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "Easily debug Laravel apps", + "homepage": "https://github.com/spatie/laravel-ray", + "keywords": [ + "laravel-ray", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/laravel-ray/issues", + "source": "https://github.com/spatie/laravel-ray/tree/1.39.1" + }, + "funding": [ + { + "url": "https://github.com/sponsors/spatie", + "type": "github" + }, + { + "url": "https://spatie.be/open-source/support-us", + "type": "other" + } + ], + "time": "2025-02-05T08:16:15+00:00" + }, + { + "name": "spatie/macroable", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/spatie/macroable.git", + "reference": "ec2c320f932e730607aff8052c44183cf3ecb072" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/macroable/zipball/ec2c320f932e730607aff8052c44183cf3ecb072", + "reference": "ec2c320f932e730607aff8052c44183cf3ecb072", + "shasum": "" + }, + "require": { + "php": "^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^8.0|^9.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spatie\\Macroable\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "A trait to dynamically add methods to a class", + "homepage": "https://github.com/spatie/macroable", + "keywords": [ + "macroable", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/macroable/issues", + "source": "https://github.com/spatie/macroable/tree/2.0.0" + }, + "time": "2021-03-26T22:39:02+00:00" + }, + { + "name": "spatie/ray", + "version": "1.41.5", + "source": { + "type": "git", + "url": "https://github.com/spatie/ray.git", + "reference": "9d078f04ffa32ad543a20716844ec343fdd7d856" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/ray/zipball/9d078f04ffa32ad543a20716844ec343fdd7d856", + "reference": "9d078f04ffa32ad543a20716844ec343fdd7d856", + "shasum": "" + }, + "require": { + "ext-curl": "*", + "ext-json": "*", + "php": "^7.4 || ^8.0", + "ramsey/uuid": "^3.0 || ^4.1", + "spatie/backtrace": "^1.7.1", + "spatie/macroable": "^1.0 || ^2.0", + "symfony/stopwatch": "^4.2 || ^5.1 || ^6.0 || ^7.0", + "symfony/var-dumper": "^4.2 || ^5.1 || ^6.0 || ^7.0.3" + }, + "require-dev": { + "illuminate/support": "^7.20 || ^8.18 || ^9.0 || ^10.0 || ^11.0 || ^12.0", + "nesbot/carbon": "^2.63 || ^3.8.4", + "pestphp/pest": "^1.22", + "phpstan/phpstan": "^1.10.57 || ^2.0.3", + "phpunit/phpunit": "^9.5", + "rector/rector": "^0.19.2 || ^1.0.1 || ^2.0.0", + "spatie/phpunit-snapshot-assertions": "^4.2", + "spatie/test-time": "^1.2" + }, + "bin": [ + "bin/remove-ray.sh" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.x-dev" + } + }, + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "Spatie\\Ray\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "Debug with Ray to fix problems faster", + "homepage": "https://github.com/spatie/ray", + "keywords": [ + "ray", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/ray/issues", + "source": "https://github.com/spatie/ray/tree/1.41.5" + }, + "funding": [ + { + "url": "https://github.com/sponsors/spatie", + "type": "github" + }, + { + "url": "https://spatie.be/open-source/support-us", + "type": "other" + } + ], + "time": "2025-02-14T12:51:43+00:00" + }, { "name": "squizlabs/php_codesniffer", "version": "3.11.3", @@ -13357,6 +13708,148 @@ ], "time": "2025-01-23T17:04:15+00:00" }, + { + "name": "symfony/polyfill-iconv", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-iconv.git", + "reference": "48becf00c920479ca2e910c22a5a39e5d47ca956" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-iconv/zipball/48becf00c920479ca2e910c22a5a39e5d47ca956", + "reference": "48becf00c920479ca2e910c22a5a39e5d47ca956", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "provide": { + "ext-iconv": "*" + }, + "suggest": { + "ext-iconv": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Iconv\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Iconv extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "iconv", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-iconv/tree/v1.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/stopwatch", + "version": "v6.4.13", + "source": { + "type": "git", + "url": "https://github.com/symfony/stopwatch.git", + "reference": "2cae0a6f8d04937d02f6d19806251e2104d54f92" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/2cae0a6f8d04937d02f6d19806251e2104d54f92", + "reference": "2cae0a6f8d04937d02f6d19806251e2104d54f92", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/service-contracts": "^2.5|^3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Stopwatch\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides a way to profile code", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/stopwatch/tree/v6.4.13" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:18:03+00:00" + }, { "name": "theseer/tokenizer", "version": "1.2.3", @@ -13406,6 +13899,214 @@ } ], "time": "2024-03-03T12:36:25+00:00" + }, + { + "name": "zbateson/mail-mime-parser", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/zbateson/mail-mime-parser.git", + "reference": "e0d4423fe27850c9dd301190767dbc421acc2f19" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zbateson/mail-mime-parser/zipball/e0d4423fe27850c9dd301190767dbc421acc2f19", + "reference": "e0d4423fe27850c9dd301190767dbc421acc2f19", + "shasum": "" + }, + "require": { + "guzzlehttp/psr7": "^2.5", + "php": ">=8.0", + "php-di/php-di": "^6.0|^7.0", + "psr/log": "^1|^2|^3", + "zbateson/mb-wrapper": "^2.0", + "zbateson/stream-decorators": "^2.1" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "*", + "monolog/monolog": "^2|^3", + "phpstan/phpstan": "*", + "phpunit/phpunit": "^9.6" + }, + "suggest": { + "ext-iconv": "For best support/performance", + "ext-mbstring": "For best support/performance" + }, + "type": "library", + "autoload": { + "psr-4": { + "ZBateson\\MailMimeParser\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-2-Clause" + ], + "authors": [ + { + "name": "Zaahid Bateson" + }, + { + "name": "Contributors", + "homepage": "https://github.com/zbateson/mail-mime-parser/graphs/contributors" + } + ], + "description": "MIME email message parser", + "homepage": "https://mail-mime-parser.org", + "keywords": [ + "MimeMailParser", + "email", + "mail", + "mailparse", + "mime", + "mimeparse", + "parser", + "php-imap" + ], + "support": { + "docs": "https://mail-mime-parser.org/#usage-guide", + "issues": "https://github.com/zbateson/mail-mime-parser/issues", + "source": "https://github.com/zbateson/mail-mime-parser" + }, + "funding": [ + { + "url": "https://github.com/zbateson", + "type": "github" + } + ], + "time": "2024-08-10T18:44:09+00:00" + }, + { + "name": "zbateson/mb-wrapper", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/zbateson/mb-wrapper.git", + "reference": "50a14c0c9537f978a61cde9fdc192a0267cc9cff" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zbateson/mb-wrapper/zipball/50a14c0c9537f978a61cde9fdc192a0267cc9cff", + "reference": "50a14c0c9537f978a61cde9fdc192a0267cc9cff", + "shasum": "" + }, + "require": { + "php": ">=8.0", + "symfony/polyfill-iconv": "^1.9", + "symfony/polyfill-mbstring": "^1.9" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "*", + "phpstan/phpstan": "*", + "phpunit/phpunit": "^9.6|^10.0" + }, + "suggest": { + "ext-iconv": "For best support/performance", + "ext-mbstring": "For best support/performance" + }, + "type": "library", + "autoload": { + "psr-4": { + "ZBateson\\MbWrapper\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-2-Clause" + ], + "authors": [ + { + "name": "Zaahid Bateson" + } + ], + "description": "Wrapper for mbstring with fallback to iconv for encoding conversion and string manipulation", + "keywords": [ + "charset", + "encoding", + "http", + "iconv", + "mail", + "mb", + "mb_convert_encoding", + "mbstring", + "mime", + "multibyte", + "string" + ], + "support": { + "issues": "https://github.com/zbateson/mb-wrapper/issues", + "source": "https://github.com/zbateson/mb-wrapper/tree/2.0.1" + }, + "funding": [ + { + "url": "https://github.com/zbateson", + "type": "github" + } + ], + "time": "2024-12-20T22:05:33+00:00" + }, + { + "name": "zbateson/stream-decorators", + "version": "2.1.1", + "source": { + "type": "git", + "url": "https://github.com/zbateson/stream-decorators.git", + "reference": "32a2a62fb0f26313395c996ebd658d33c3f9c4e5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zbateson/stream-decorators/zipball/32a2a62fb0f26313395c996ebd658d33c3f9c4e5", + "reference": "32a2a62fb0f26313395c996ebd658d33c3f9c4e5", + "shasum": "" + }, + "require": { + "guzzlehttp/psr7": "^2.5", + "php": ">=8.0", + "zbateson/mb-wrapper": "^2.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "*", + "phpstan/phpstan": "*", + "phpunit/phpunit": "^9.6|^10.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "ZBateson\\StreamDecorators\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-2-Clause" + ], + "authors": [ + { + "name": "Zaahid Bateson" + } + ], + "description": "PHP psr7 stream decorators for mime message part streams", + "keywords": [ + "base64", + "charset", + "decorators", + "mail", + "mime", + "psr7", + "quoted-printable", + "stream", + "uuencode" + ], + "support": { + "issues": "https://github.com/zbateson/stream-decorators/issues", + "source": "https://github.com/zbateson/stream-decorators/tree/2.1.1" + }, + "funding": [ + { + "url": "https://github.com/zbateson", + "type": "github" + } + ], + "time": "2024-04-29T21:42:39+00:00" } ], "aliases": [], diff --git a/config/logging.php b/config/logging.php index 692c651e..c33f4d78 100644 --- a/config/logging.php +++ b/config/logging.php @@ -88,7 +88,7 @@ 'handler_with' => [ 'host' => env('PAPERTRAIL_URL'), 'port' => env('PAPERTRAIL_PORT'), - 'connectionString' => 'tls://'.env('PAPERTRAIL_URL').':'.env('PAPERTRAIL_PORT'), + 'connectionString' => 'tls://' . env('PAPERTRAIL_URL') . ':' . env('PAPERTRAIL_PORT'), ], ], @@ -102,6 +102,16 @@ ], ], + 'socket' => [ + 'driver' => 'monolog', + 'level' => env('LOG_LEVEL', 'debug'), + 'handler' => \Monolog\Handler\SocketHandler::class, + 'formatter' => \Monolog\Formatter\JsonFormatter::class, + 'handler_with' => [ + 'connectionString' => env('LOG_SOCKET_URL', '127.0.0.1:9913'), + ], + ], + 'syslog' => [ 'driver' => 'syslog', 'level' => env('LOG_LEVEL', 'debug'), diff --git a/docker-compose.yml b/docker-compose.yml index e267aa3a..0e9888a4 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -57,6 +57,14 @@ services: ports: - "127.0.0.1:6379:6379" + # --- Buggregator + buggregator: + image: ghcr.io/buggregator/server:latest + ports: + - "8000:8000" + depends_on: + - php + volumes: linkace-db: driver: local diff --git a/ray.php b/ray.php new file mode 100644 index 00000000..df92d6de --- /dev/null +++ b/ray.php @@ -0,0 +1,128 @@ + env('RAY_ENABLED', true), + + /* + * When enabled, all cache events will automatically be sent to Ray. + */ + 'send_cache_to_ray' => env('SEND_CACHE_TO_RAY', false), + + /* + * When enabled, all things passed to `dump` or `dd` + * will be sent to Ray as well. + */ + 'send_dumps_to_ray' => env('SEND_DUMPS_TO_RAY', true), + + /* + * When enabled all job events will automatically be sent to Ray. + */ + 'send_jobs_to_ray' => env('SEND_JOBS_TO_RAY', false), + + /* + * When enabled, all things logged to the application log + * will be sent to Ray as well. + */ + 'send_log_calls_to_ray' => env('SEND_LOG_CALLS_TO_RAY', true), + + /* + * When enabled, all queries will automatically be sent to Ray. + */ + 'send_queries_to_ray' => env('SEND_QUERIES_TO_RAY', false), + + /** + * When enabled, all duplicate queries will automatically be sent to Ray. + */ + 'send_duplicate_queries_to_ray' => env('SEND_DUPLICATE_QUERIES_TO_RAY', false), + + /* + * When enabled, slow queries will automatically be sent to Ray. + */ + 'send_slow_queries_to_ray' => env('SEND_SLOW_QUERIES_TO_RAY', false), + + /** + * Queries that are longer than this number of milliseconds will be regarded as slow. + */ + 'slow_query_threshold_in_ms' => env('RAY_SLOW_QUERY_THRESHOLD_IN_MS', 500), + + /* + * When enabled, all update queries will automatically be sent to Ray. + */ + 'send_update_queries_to_ray' => env('SEND_UPDATE_QUERIES_TO_RAY', false), + + /* + * When enabled, all insert queries will automatically be sent to Ray. + */ + 'send_insert_queries_to_ray' => env('SEND_INSERT_QUERIES_TO_RAY', false), + + /* + * When enabled, all delete queries will automatically be sent to Ray. + */ + 'send_delete_queries_to_ray' => env('SEND_DELETE_QUERIES_TO_RAY', false), + + /* + * When enabled, all select queries will automatically be sent to Ray. + */ + 'send_select_queries_to_ray' => env('SEND_SELECT_QUERIES_TO_RAY', false), + + /* + * When enabled, all requests made to this app will automatically be sent to Ray. + */ + 'send_requests_to_ray' => env('SEND_REQUESTS_TO_RAY', false), + + /** + * When enabled, all Http Client requests made by this app will be automatically sent to Ray. + */ + 'send_http_client_requests_to_ray' => env('SEND_HTTP_CLIENT_REQUESTS_TO_RAY', false), + + /* + * When enabled, all views that are rendered automatically be sent to Ray. + */ + 'send_views_to_ray' => env('SEND_VIEWS_TO_RAY', false), + + /* + * When enabled, all exceptions will be automatically sent to Ray. + */ + 'send_exceptions_to_ray' => env('SEND_EXCEPTIONS_TO_RAY', true), + + /* + * When enabled, all deprecation notices will be automatically sent to Ray. + */ + 'send_deprecated_notices_to_ray' => env('SEND_DEPRECATED_NOTICES_TO_RAY', false), + + /* + * The host used to communicate with the Ray app. + * When using Docker on Mac or Windows, you can replace localhost with 'host.docker.internal' + * When using Docker on Linux, you can replace localhost with '172.17.0.1' + * When using Homestead with the VirtualBox provider, you can replace localhost with '10.0.2.2' + * When using Homestead with the Parallels provider, you can replace localhost with '10.211.55.2' + */ + 'host' => env('RAY_HOST', 'ray@buggregator'), + + /* + * The port number used to communicate with the Ray app. + */ + 'port' => env('RAY_PORT', 8000), + + /* + * Absolute base path for your sites or projects in Homestead, + * Vagrant, Docker, or another remote development server. + */ + 'remote_path' => env('RAY_REMOTE_PATH', null), + + /* + * Absolute base path for your sites or projects on your local + * computer where your IDE or code editor is running on. + */ + 'local_path' => env('RAY_LOCAL_PATH', null), + + /* + * When this setting is enabled, the package will not try to format values sent to Ray. + */ + 'always_send_raw_values' => false, +]; diff --git a/resources/docker/dockerfiles/development.Dockerfile b/resources/docker/dockerfiles/development.Dockerfile index 84fc37a5..715b0e5d 100644 --- a/resources/docker/dockerfiles/development.Dockerfile +++ b/resources/docker/dockerfiles/development.Dockerfile @@ -5,8 +5,8 @@ FROM docker.io/library/php:8.1-fpm-alpine WORKDIR /app # Install package and PHP dependencies -RUN apk add --no-cache zip git mariadb-client postgresql-client postgresql-dev sqlite zip libzip-dev; \ - docker-php-ext-install bcmath pdo_mysql pdo_pgsql zip ftp; \ +RUN apk add --no-cache zip git mariadb-client postgresql-client postgresql-dev sqlite zip libzip-dev linux-headers; \ + docker-php-ext-install bcmath pdo_mysql pdo_pgsql zip ftp sockets; \ docker-php-ext-enable xdebug pcov; \ mkdir /ssl-certs; \ docker-php-source delete; \ From a76edc36dcce98e5a63553978efb3eb4c88bed51 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Feb 2025 01:45:31 +0000 Subject: [PATCH 31/61] Bump the npm-minor group with 2 updates Bumps the npm-minor group with 2 updates: [tom-select](https://github.com/orchidjs/tom-select) and [sass](https://github.com/sass/dart-sass). Updates `tom-select` from 2.4.2 to 2.4.3 - [Release notes](https://github.com/orchidjs/tom-select/releases) - [Commits](https://github.com/orchidjs/tom-select/compare/v2.4.2...v2.4.3) Updates `sass` from 1.84.0 to 1.85.0 - [Release notes](https://github.com/sass/dart-sass/releases) - [Changelog](https://github.com/sass/dart-sass/blob/main/CHANGELOG.md) - [Commits](https://github.com/sass/dart-sass/compare/1.84.0...1.85.0) --- updated-dependencies: - dependency-name: tom-select dependency-type: direct:production update-type: version-update:semver-patch dependency-group: npm-minor - dependency-name: sass dependency-type: direct:development update-type: version-update:semver-minor dependency-group: npm-minor ... Signed-off-by: dependabot[bot] --- package-lock.json | 16 ++++++++-------- package.json | 4 ++-- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/package-lock.json b/package-lock.json index 03d8ea2a..a9f33ac2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,12 +10,12 @@ "license": "GPL-3.0-or-later", "dependencies": { "bootstrap": "^5.3.3", - "tom-select": "^2.3.1" + "tom-select": "^2.4.3" }, "devDependencies": { "laravel-mix": "^6.0.31", "postcss": "^8.4.35", - "sass": "^1.77.8", + "sass": "^1.85.0", "sass-loader": "^14.1.0" } }, @@ -8507,9 +8507,9 @@ "license": "MIT" }, "node_modules/sass": { - "version": "1.84.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.84.0.tgz", - "integrity": "sha512-XDAbhEPJRxi7H0SxrnOpiXFQoUJHwkR2u3Zc4el+fK/Tt5Hpzw5kkQ59qVDfvdaUq6gCrEZIbySFBM2T9DNKHg==", + "version": "1.85.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.85.0.tgz", + "integrity": "sha512-3ToiC1xZ1Y8aU7+CkgCI/tqyuPXEmYGJXO7H4uqp0xkLXUqp88rQQ4j1HmP37xSJLbCJPaIiv+cT1y+grssrww==", "dev": true, "license": "MIT", "dependencies": { @@ -9489,9 +9489,9 @@ } }, "node_modules/tom-select": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/tom-select/-/tom-select-2.4.2.tgz", - "integrity": "sha512-2RWjkL3gMDz9E+u8w+tQy9JWsYq8gaSytEVeugKYDeMus6ZtxT1HttLPnXsfHCnBPlsNubVyj5gtUeN+S+bcpA==", + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tom-select/-/tom-select-2.4.3.tgz", + "integrity": "sha512-MFFrMxP1bpnAMPbdvPCZk0KwYxLqhYZso39torcdoefeV/NThNyDu8dV96/INJ5XQVTL3O55+GqQ78Pkj5oCfw==", "license": "Apache-2.0", "dependencies": { "@orchidjs/sifter": "^1.1.0", diff --git a/package.json b/package.json index 8a018bbb..4e5c6f38 100644 --- a/package.json +++ b/package.json @@ -15,12 +15,12 @@ "devDependencies": { "laravel-mix": "^6.0.31", "postcss": "^8.4.35", - "sass": "^1.77.8", + "sass": "^1.85.0", "sass-loader": "^14.1.0" }, "dependencies": { "bootstrap": "^5.3.3", - "tom-select": "^2.3.1" + "tom-select": "^2.4.3" }, "scripts": { "dev": "npm run development", From a018face013e0c5f2c6407c55e491f0d2514aad9 Mon Sep 17 00:00:00 2001 From: Kovah Date: Mon, 17 Feb 2025 21:28:43 +0100 Subject: [PATCH 32/61] Execute code coverage only on push to 2.x --- .github/workflows/test.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 7d2d7d72..3f83d0a2 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -94,6 +94,7 @@ jobs: - name: Report coverage to Codacy uses: codacy/codacy-coverage-reporter-action@v1.3.0 + if: ${{ github.ref == 'refs/heads/2.x' }} with: project-token: ${{ secrets.CODACY_PROJECT_TOKEN }} coverage-reports: ./test-coverage.xml From be8eaddb417d9025310de20daee682b03677e253 Mon Sep 17 00:00:00 2001 From: Kevin Woblick Date: Wed, 26 Feb 2025 09:03:14 +0100 Subject: [PATCH 33/61] Adjust handling of invalid API requests (#885) --- app/Http/Kernel.php | 2 +- .../ApiHeaderValidationMiddleware.php | 39 ++++++++++++ .../ContentTypeHeaderValidationMiddleware.php | 31 --------- tests/Controller/API/ApiTestCase.php | 10 ++- tests/Controller/API/BulkEditApiTest.php | 18 +++--- tests/Controller/API/LinkApiTest.php | 40 ------------ ...tentTypeHeaderValidationMiddlewareTest.php | 63 ++++++++++++++++--- 7 files changed, 114 insertions(+), 89 deletions(-) create mode 100644 app/Http/Middleware/ApiHeaderValidationMiddleware.php delete mode 100644 app/Http/Middleware/ContentTypeHeaderValidationMiddleware.php diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php index 97e63b3f..7c842d4b 100644 --- a/app/Http/Kernel.php +++ b/app/Http/Kernel.php @@ -43,7 +43,7 @@ class Kernel extends HttpKernel 'api' => [ // Throttling is configured in routes/api.php \Illuminate\Routing\Middleware\SubstituteBindings::class, - \App\Http\Middleware\ContentTypeHeaderValidationMiddleware::class, + \App\Http\Middleware\ApiHeaderValidationMiddleware::class, ], ]; diff --git a/app/Http/Middleware/ApiHeaderValidationMiddleware.php b/app/Http/Middleware/ApiHeaderValidationMiddleware.php new file mode 100644 index 00000000..644d91db --- /dev/null +++ b/app/Http/Middleware/ApiHeaderValidationMiddleware.php @@ -0,0 +1,39 @@ +method(), ['GET', 'HEAD', 'OPTIONS'])) { + return $next($request); + } + + if ($request->header('Content-Type') !== 'application/json') { + return response()->json([ + 'error' => 'Invalid Content-Type header, LinkAce only supports JSON input' + ], 415); + } + + if ($request->header('Accept') !== 'application/json') { + return response()->json([ + 'error' => 'Invalid Accept header, LinkAce only supports JSON output' + ], 415); + } + + return $next($request); + } +} diff --git a/app/Http/Middleware/ContentTypeHeaderValidationMiddleware.php b/app/Http/Middleware/ContentTypeHeaderValidationMiddleware.php deleted file mode 100644 index 852cd0a3..00000000 --- a/app/Http/Middleware/ContentTypeHeaderValidationMiddleware.php +++ /dev/null @@ -1,31 +0,0 @@ -method(), $checkMethods) && $request->header('Content-Type') !== 'application/json') { - return response()->json([ - 'error' => 'Invalid Content-Type' - ], 415); - } - - return $next($request); - } -} diff --git a/tests/Controller/API/ApiTestCase.php b/tests/Controller/API/ApiTestCase.php index ac9a9c3a..da788ffd 100644 --- a/tests/Controller/API/ApiTestCase.php +++ b/tests/Controller/API/ApiTestCase.php @@ -74,6 +74,8 @@ public function postJsonAuthorized( bool $useSystemToken = false ): TestResponse { $headers['Authorization'] = 'Bearer ' . ($useSystemToken ? $this->systemAccessToken : $this->accessToken); + $headers['Content-Type'] = 'application/json'; + $headers['Accept'] = 'application/json'; return $this->postJson($uri, $data, $headers); } @@ -92,7 +94,11 @@ public function patchJsonAuthorized( array $headers = [], bool $useSystemToken = false ): TestResponse { - $headers['Authorization'] = 'Bearer ' . ($useSystemToken ? $this->systemAccessToken : $this->accessToken); + $headers = array_merge([ + 'Authorization' => 'Bearer ' . ($useSystemToken ? $this->systemAccessToken : $this->accessToken), + 'Content-Type' => 'application/json', + 'Accept' => 'application/json', + ], $headers); return $this->patchJson($uri, $data, $headers); } @@ -112,6 +118,8 @@ public function deleteJsonAuthorized( bool $useSystemToken = false ): TestResponse { $headers['Authorization'] = 'Bearer ' . ($useSystemToken ? $this->systemAccessToken : $this->accessToken); + $headers['Content-Type'] = 'application/json'; + $headers['Accept'] = 'application/json'; return $this->deleteJson($uri, $data, $headers); } } diff --git a/tests/Controller/API/BulkEditApiTest.php b/tests/Controller/API/BulkEditApiTest.php index a7577a15..7c7410b0 100644 --- a/tests/Controller/API/BulkEditApiTest.php +++ b/tests/Controller/API/BulkEditApiTest.php @@ -38,7 +38,7 @@ public function test_links_edit(): void $otherUser = User::factory()->create(); $otherLink = Link::factory()->for($otherUser)->create(['visibility' => ModelAttribute::VISIBILITY_PRIVATE]); - $this->patch('api/v2/bulk/links', [ + $this->patchJson('api/v2/bulk/links', [ 'models' => [1, 2, 3, 4], 'tags' => [3], 'tags_mode' => 'append', @@ -71,7 +71,7 @@ public function test_alternative_links_edit(): void $otherUser = User::factory()->create(); $otherLink = Link::factory()->for($otherUser)->create(['visibility' => ModelAttribute::VISIBILITY_PRIVATE]); - $this->patch('api/v2/bulk/links', [ + $this->patchJson('api/v2/bulk/links', [ 'models' => [1, 2, 3, 4], 'tags' => [2, 3], 'tags_mode' => 'replace', @@ -104,7 +104,7 @@ public function test_lists_edit(): void $otherUser = User::factory()->create(); $otherList = LinkList::factory()->for($otherUser)->create(['visibility' => ModelAttribute::VISIBILITY_PRIVATE]); - $this->patch('api/v2/bulk/lists', [ + $this->patchJson('api/v2/bulk/lists', [ 'models' => [1, 2, 3, 4], 'visibility' => null, ])->assertJsonCount(4); @@ -125,7 +125,7 @@ public function test_alternative_lists_edit(): void $otherUser = User::factory()->create(); $otherList = LinkList::factory()->for($otherUser)->create(['visibility' => ModelAttribute::VISIBILITY_PRIVATE]); - $this->patch('api/v2/bulk/lists', [ + $this->patchJson('api/v2/bulk/lists', [ 'models' => [1, 2, 3, 4], 'visibility' => 2, ])->assertJsonCount(4); @@ -146,7 +146,7 @@ public function test_tags_edit(): void $otherUser = User::factory()->create(); $otherTag = Tag::factory()->for($otherUser)->create(['visibility' => ModelAttribute::VISIBILITY_PRIVATE]); - $this->patch('api/v2/bulk/tags', [ + $this->patchJson('api/v2/bulk/tags', [ 'models' => [1, 2, 3, 4], 'visibility' => null, ])->assertJsonCount(4); @@ -167,7 +167,7 @@ public function test_alternative_tags_edit(): void $otherUser = User::factory()->create(); $otherTag = Tag::factory()->for($otherUser)->create(['visibility' => ModelAttribute::VISIBILITY_PRIVATE]); - $this->patch('api/v2/bulk/tags', [ + $this->patchJson('api/v2/bulk/tags', [ 'models' => [1, 2, 3, 4], 'visibility' => 2, ])->assertJsonCount(4); @@ -192,7 +192,7 @@ public function test_deletion() $tags = $this->createTestTags($this->user); $otherTag = Tag::factory()->for($otherUser)->create(); - $this->delete('api/v2/bulk/delete', [ + $this->deleteJson('api/v2/bulk/delete', [ 'models' => [1, 2, 4], 'type' => 'links', ])->assertJsonCount(3)->assertJson([ @@ -206,7 +206,7 @@ public function test_deletion() $this->assertNotNull($links[1]->deleted_at); $this->assertNull($otherLink->deleted_at); - $this->delete('api/v2/bulk/delete', [ + $this->deleteJson('api/v2/bulk/delete', [ 'models' => [1, 2, 4], 'type' => 'lists', ])->assertJsonCount(3)->assertJson([ @@ -220,7 +220,7 @@ public function test_deletion() $this->assertNotNull($lists[1]->deleted_at); $this->assertNull($otherList->deleted_at); - $this->delete('api/v2/bulk/delete', [ + $this->deleteJson('api/v2/bulk/delete', [ 'models' => [1, 2, 4], 'type' => 'tags', ])->assertJsonCount(3)->assertJson([ diff --git a/tests/Controller/API/LinkApiTest.php b/tests/Controller/API/LinkApiTest.php index 7a2de573..7d986fca 100644 --- a/tests/Controller/API/LinkApiTest.php +++ b/tests/Controller/API/LinkApiTest.php @@ -152,27 +152,6 @@ public function test_full_create_request(): void ]); } - public function test_create_invalid_content_type_request(): void - { - $list = LinkList::factory()->create(['name' => 'Test List 1']); - $tag = Tag::factory()->create(['name' => 'a test 1']); - $tag2 = Tag::factory()->create(['name' => 'tag #2']); - - $this->postJsonAuthorized('api/v2/links', [ - 'url' => 'https://example.com', - 'title' => 'Search the Web', - 'description' => 'There could be a description here', - 'lists' => [$list->id], - 'tags' => [$tag->id, $tag2->id], - 'visibility' => 1, - 'check_disabled' => false, - ], ['Content-Type' => 'application/xml']) - ->assertUnsupportedMediaType() - ->assertJson([ - 'error' => "Invalid Content-Type" - ]); - } - public function test_create_request_with_list(): void { $list = LinkList::factory()->create(['name' => 'Test List 1']); @@ -469,25 +448,6 @@ public function test_update_request(): void ])->assertForbidden(); } - public function test_update_invalid_content_type_request(): void - { - $list = LinkList::factory()->create(); - $this->createTestLinks(); - - $this->patchJsonAuthorized('api/v2/links/1', [ - 'url' => 'https://new-public-link.com', - 'title' => 'Custom Title', - 'description' => 'Custom Description', - 'lists' => [$list->id], - 'is_private' => false, - 'check_disabled' => false, - ], ['Content-Type' => 'application/xml']) - ->assertUnsupportedMediaType() - ->assertJson([ - 'error' => 'Invalid Content-Type' - ]); - } - public function test_invalid_update_request(): void { Link::factory()->create(); diff --git a/tests/Middleware/ContentTypeHeaderValidationMiddlewareTest.php b/tests/Middleware/ContentTypeHeaderValidationMiddlewareTest.php index dd385b88..b857c2c3 100644 --- a/tests/Middleware/ContentTypeHeaderValidationMiddlewareTest.php +++ b/tests/Middleware/ContentTypeHeaderValidationMiddlewareTest.php @@ -2,21 +2,70 @@ namespace Tests\Middleware; -use App\Http\Middleware\ContentTypeHeaderValidationMiddleware; -use Illuminate\Http\Request; +use App\Enums\ApiToken; +use App\Models\User; +use Illuminate\Support\Facades\Http; use Tests\TestCase; class ContentTypeHeaderValidationMiddlewareTest extends TestCase { public function testMissingContentTypeHeader(): void { - $request = Request::create('/api/v1/links', 'POST'); + $user = User::factory()->create(); + $accessToken = $user->createToken('api-test', [ApiToken::ABILITY_USER_ACCESS])->plainTextToken; - $middleware = new ContentTypeHeaderValidationMiddleware(); + $testHtml = '' . + 'Example Title' . + '' . + ' '; - $response = $middleware->handle($request, function () { - }); + Http::fake([ + 'example.com' => Http::response($testHtml), + ]); - $this->assertEquals(415, $response->getStatusCode()); + // content-type and accept are missing + $this->post('api/v2/links', ['url' => 'https://example.com'], ['Authorization' => 'Bearer ' . $accessToken]) + ->assertUnsupportedMediaType() + ->assertJson([ + 'error' => 'Invalid Content-Type header, LinkAce only supports JSON input', + ]); + + // content-type is present, but not supported + $this->post('api/v2/links', ['url' => 'https://example.com'], [ + 'Authorization' => 'Bearer ' . $accessToken, + 'Content-Type' => 'application/xml', + ]) + ->assertUnsupportedMediaType() + ->assertJson([ + 'error' => 'Invalid Content-Type header, LinkAce only supports JSON input', + ]); + + // accept header is missing + $this->post('api/v2/links', ['url' => 'https://example.com'], [ + 'Authorization' => 'Bearer ' . $accessToken, + 'Content-Type' => 'application/json', + ]) + ->assertUnsupportedMediaType() + ->assertJson([ + 'error' => 'Invalid Accept header, LinkAce only supports JSON output', + ]); + + // accept header is present, but not supported + $this->post('api/v2/links', ['url' => 'https://example.com'], [ + 'Authorization' => 'Bearer ' . $accessToken, + 'Content-Type' => 'application/json', + 'Accept' => 'application/xml', + ]) + ->assertUnsupportedMediaType() + ->assertJson([ + 'error' => 'Invalid Accept header, LinkAce only supports JSON output', + ]); + + // request headers are correct + $this->postJson('api/v2/links', ['url' => 'https://example.com'], [ + 'Authorization' => 'Bearer ' . $accessToken, + 'Content-Type' => 'application/json', + 'Accept' => 'application/json', + ])->assertOk(); } } From cb8585bf33aed172766081234573627f7da31d76 Mon Sep 17 00:00:00 2001 From: Kevin Woblick Date: Wed, 26 Feb 2025 09:04:58 +0100 Subject: [PATCH 34/61] Optimize storage permissions for release packages --- .github/workflows/build-package.yml | 6 ++++-- .../docker/dockerfiles/release-multiplatform.Dockerfile | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build-package.yml b/.github/workflows/build-package.yml index 5409de1c..c426faaf 100644 --- a/.github/workflows/build-package.yml +++ b/.github/workflows/build-package.yml @@ -46,8 +46,10 @@ jobs: - name: Install dependencies run: composer install --prefer-dist --no-progress --no-suggest --no-dev - - name: Publish package configuration - run: 'php artisan vendor:publish --provider="Spatie\Backup\BackupServiceProvider"' + - name: Prepare dependencies and general application requirements + run: | + php artisan vendor:publish --provider="Spatie\Backup\BackupServiceProvider" + chmod -R 0766 storage - name: Remove .env file run: rm .env diff --git a/resources/docker/dockerfiles/release-multiplatform.Dockerfile b/resources/docker/dockerfiles/release-multiplatform.Dockerfile index 4e92842f..4a64bd1c 100644 --- a/resources/docker/dockerfiles/release-multiplatform.Dockerfile +++ b/resources/docker/dockerfiles/release-multiplatform.Dockerfile @@ -68,7 +68,7 @@ COPY --chown=www-data:www-data ./public /app/public COPY --chown=www-data:www-data ./lang /app/lang COPY --chown=www-data:www-data ./resources /app/resources COPY --chown=www-data:www-data ./routes /app/routes -COPY --chown=www-data:www-data ./storage /app/storage +COPY --chown=www-data:www-data --chmod=0777 ./storage /app/storage COPY --chown=www-data:www-data ["./artisan", "./composer.json", "./composer.lock", "./README.md", "./LICENSE.md", "./package.json", "/app/"] From 94856397b263e4c0f7fb996d792df5da5b952bd5 Mon Sep 17 00:00:00 2001 From: Kevin Woblick Date: Wed, 26 Feb 2025 09:06:00 +0100 Subject: [PATCH 35/61] Always surround db password with quotes during setup (#927) --- app/Http/Controllers/Setup/DatabaseController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Http/Controllers/Setup/DatabaseController.php b/app/Http/Controllers/Setup/DatabaseController.php index dc141fc8..14b03d69 100644 --- a/app/Http/Controllers/Setup/DatabaseController.php +++ b/app/Http/Controllers/Setup/DatabaseController.php @@ -111,7 +111,7 @@ protected function storeConfigurationInEnv(): void 'DB_PORT=' . ($this->dbConfig['port'] ?? ''), 'DB_DATABASE=' . ($this->dbConfig['database'] ?? ''), 'DB_USERNAME=' . ($this->dbConfig['username'] ?? ''), - 'DB_PASSWORD=' . ($this->dbConfig['password'] ?? ''), + 'DB_PASSWORD="' . ($this->dbConfig['password'] ?? '') . '"', ], $envContent); if ($envContent !== null) { From d0ed583b039643f38687cd4e4f9dd2ec916c0914 Mon Sep 17 00:00:00 2001 From: Kevin Woblick Date: Wed, 26 Feb 2025 09:19:10 +0100 Subject: [PATCH 36/61] Adjust tests --- .github/workflows/test.yml | 4 +-- tests/Helper/HtmlMetaHelperTest.php | 3 ++ tests/Helper/UpdateCheckTest.php | 3 ++ tests/Helper/WaybackMachineTest.php | 3 ++ ...tentTypeHeaderValidationMiddlewareTest.php | 3 ++ tests/Migrations/UserDataMigrationTest.php | 30 +++++++++++++++++++ 6 files changed, 44 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 3f83d0a2..cd1fb0f6 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -18,7 +18,7 @@ jobs: - name: Use Node.js uses: actions/setup-node@v4 with: - node-version: 20 + node-version: 22 - name: Try to build the assets run: | @@ -45,7 +45,7 @@ jobs: strategy: matrix: operating-system: [ ubuntu-latest ] - php-versions: [ '8.1', '8.2', '8.3' ] + php-versions: [ '8.1', '8.2', '8.3', '8.4' ] steps: - uses: actions/checkout@v4 diff --git a/tests/Helper/HtmlMetaHelperTest.php b/tests/Helper/HtmlMetaHelperTest.php index bda7ced3..e095eb34 100644 --- a/tests/Helper/HtmlMetaHelperTest.php +++ b/tests/Helper/HtmlMetaHelperTest.php @@ -4,6 +4,7 @@ use App\Helper\HtmlMeta; use GuzzleHttp\Exception\RequestException; +use Illuminate\Foundation\Testing\RefreshDatabase; use Illuminate\Http\Client\ConnectionException; use Illuminate\Http\Client\Request; use Illuminate\Support\Facades\Http; @@ -11,6 +12,8 @@ class HtmlMetaHelperTest extends TestCase { + use RefreshDatabase; + /* * Test the HtmlMeta helper with a regular website containing some meta information. Must properly return the * information extracted from the meta. diff --git a/tests/Helper/UpdateCheckTest.php b/tests/Helper/UpdateCheckTest.php index 75e57065..644e8130 100644 --- a/tests/Helper/UpdateCheckTest.php +++ b/tests/Helper/UpdateCheckTest.php @@ -3,12 +3,15 @@ namespace Tests\Helper; use App\Helper\UpdateHelper; +use Illuminate\Foundation\Testing\RefreshDatabase; use Illuminate\Support\Facades\Http; use Illuminate\Support\Facades\Storage; use Tests\TestCase; class UpdateCheckTest extends TestCase { + use RefreshDatabase; + /* * Test the checkForUpdates() helper function with a new update available. * Must return the given version string. diff --git a/tests/Helper/WaybackMachineTest.php b/tests/Helper/WaybackMachineTest.php index efe825e5..4b407c55 100644 --- a/tests/Helper/WaybackMachineTest.php +++ b/tests/Helper/WaybackMachineTest.php @@ -3,11 +3,14 @@ namespace Tests\Helper; use App\Helper\WaybackMachine; +use Illuminate\Foundation\Testing\RefreshDatabase; use Illuminate\Support\Facades\Http; use Tests\TestCase; class WaybackMachineTest extends TestCase { + use RefreshDatabase; + /** * Test the saveToArchive() helper funtion with a valid URL. * Must return true. diff --git a/tests/Middleware/ContentTypeHeaderValidationMiddlewareTest.php b/tests/Middleware/ContentTypeHeaderValidationMiddlewareTest.php index b857c2c3..a32d47c8 100644 --- a/tests/Middleware/ContentTypeHeaderValidationMiddlewareTest.php +++ b/tests/Middleware/ContentTypeHeaderValidationMiddlewareTest.php @@ -4,11 +4,14 @@ use App\Enums\ApiToken; use App\Models\User; +use Illuminate\Foundation\Testing\RefreshDatabase; use Illuminate\Support\Facades\Http; use Tests\TestCase; class ContentTypeHeaderValidationMiddlewareTest extends TestCase { + use RefreshDatabase; + public function testMissingContentTypeHeader(): void { $user = User::factory()->create(); diff --git a/tests/Migrations/UserDataMigrationTest.php b/tests/Migrations/UserDataMigrationTest.php index 76d20b9e..2c62dfc8 100644 --- a/tests/Migrations/UserDataMigrationTest.php +++ b/tests/Migrations/UserDataMigrationTest.php @@ -267,4 +267,34 @@ public function test_note_visibility_migration_with_enabled_guest_mode(): void 'visibility' => 1, // is public ]); } + + public function test_user_api_token_migration(): void + { + $this->migrateUpTo('2022_06_23_112431_migrate_user_data.php'); + + DB::table('users')->insert([ + 'name' => 'test', + 'email' => 'test@linkace.org', + 'password' => 'test', + 'api_token' => 'testApiToken', + 'created_at' => now(), + 'updated_at' => now(), + ]); + + $this->artisan('migrate'); + + $this->assertDatabaseHas('personal_access_tokens', [ + 'tokenable_type' => 'App\Models\User', + 'tokenable_id' => '1', + 'name' => 'MigratedApiToken', + 'abilities' => '["user_access"]', + ]); + + // Test if the token is valid + Link::factory()->for(User::find(1))->create(['url' => 'https://token-test.com']); + + $this->get('links/feed', [ + 'Authorization' => 'Bearer testApiToken' + ])->assertOk()->assertSee('https://token-test.com'); + } } From ec8e9a2965ae55f2b4df98627c5bb8d4a90d0755 Mon Sep 17 00:00:00 2001 From: Kevin Woblick Date: Wed, 26 Feb 2025 09:22:44 +0100 Subject: [PATCH 37/61] Update dependencies --- composer.lock | 367 +++++++++++++++++++++++----------------------- package-lock.json | 268 ++++++++++++++++++--------------- package.json | 2 +- 3 files changed, 337 insertions(+), 300 deletions(-) diff --git a/composer.lock b/composer.lock index 88564ff1..3a5571c1 100644 --- a/composer.lock +++ b/composer.lock @@ -62,16 +62,16 @@ }, { "name": "aws/aws-sdk-php", - "version": "3.339.11", + "version": "3.340.1", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "692055cc451a442690ecb839ae1d0cca5c018c77" + "reference": "414b84a625c239b3cbfa132b8d522c579a7eb75c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/692055cc451a442690ecb839ae1d0cca5c018c77", - "reference": "692055cc451a442690ecb839ae1d0cca5c018c77", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/414b84a625c239b3cbfa132b8d522c579a7eb75c", + "reference": "414b84a625c239b3cbfa132b8d522c579a7eb75c", "shasum": "" }, "require": { @@ -153,9 +153,9 @@ "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.339.11" + "source": "https://github.com/aws/aws-sdk-php/tree/3.340.1" }, - "time": "2025-02-11T19:45:23+00:00" + "time": "2025-02-25T19:14:47+00:00" }, { "name": "bacon/bacon-qr-code", @@ -3928,16 +3928,16 @@ }, { "name": "owen-it/laravel-auditing", - "version": "v13.6.9", + "version": "v13.7.2", "source": { "type": "git", "url": "https://github.com/owen-it/laravel-auditing.git", - "reference": "559b391e2ebf46a734b3f82d4f18faf425107054" + "reference": "4f72181622683bc667bbdd2e5fa09cd376329af4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/owen-it/laravel-auditing/zipball/559b391e2ebf46a734b3f82d4f18faf425107054", - "reference": "559b391e2ebf46a734b3f82d4f18faf425107054", + "url": "https://api.github.com/repos/owen-it/laravel-auditing/zipball/4f72181622683bc667bbdd2e5fa09cd376329af4", + "reference": "4f72181622683bc667bbdd2e5fa09cd376329af4", "shasum": "" }, "require": { @@ -4012,7 +4012,7 @@ "issues": "https://github.com/owen-it/laravel-auditing/issues", "source": "https://github.com/owen-it/laravel-auditing" }, - "time": "2024-12-27T15:04:04+00:00" + "time": "2025-02-21T14:58:02+00:00" }, { "name": "paragonie/constant_time_encoding", @@ -4429,16 +4429,16 @@ }, { "name": "phpstan/phpdoc-parser", - "version": "2.0.0", + "version": "2.1.0", "source": { "type": "git", "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "c00d78fb6b29658347f9d37ebe104bffadf36299" + "reference": "9b30d6fd026b2c132b3985ce6b23bec09ab3aa68" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/c00d78fb6b29658347f9d37ebe104bffadf36299", - "reference": "c00d78fb6b29658347f9d37ebe104bffadf36299", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/9b30d6fd026b2c132b3985ce6b23bec09ab3aa68", + "reference": "9b30d6fd026b2c132b3985ce6b23bec09ab3aa68", "shasum": "" }, "require": { @@ -4470,9 +4470,9 @@ "description": "PHPDoc parser with support for nullable, intersection and generic types", "support": { "issues": "https://github.com/phpstan/phpdoc-parser/issues", - "source": "https://github.com/phpstan/phpdoc-parser/tree/2.0.0" + "source": "https://github.com/phpstan/phpdoc-parser/tree/2.1.0" }, - "time": "2024-10-13T11:29:49+00:00" + "time": "2025-02-19T13:28:12+00:00" }, { "name": "pragmarx/google2fa", @@ -5427,20 +5427,20 @@ }, { "name": "sentry/sentry-laravel", - "version": "4.12.0", + "version": "4.13.0", "source": { "type": "git", "url": "https://github.com/getsentry/sentry-laravel.git", - "reference": "da1ee3417dfb3576a6aaa0f8b25892ebdb98fdb0" + "reference": "d232ac494258e0d50a77c575a5af5f1a426d3f87" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/getsentry/sentry-laravel/zipball/da1ee3417dfb3576a6aaa0f8b25892ebdb98fdb0", - "reference": "da1ee3417dfb3576a6aaa0f8b25892ebdb98fdb0", + "url": "https://api.github.com/repos/getsentry/sentry-laravel/zipball/d232ac494258e0d50a77c575a5af5f1a426d3f87", + "reference": "d232ac494258e0d50a77c575a5af5f1a426d3f87", "shasum": "" }, "require": { - "illuminate/support": "^6.0 | ^7.0 | ^8.0 | ^9.0 | ^10.0 | ^11.0", + "illuminate/support": "^6.0 | ^7.0 | ^8.0 | ^9.0 | ^10.0 | ^11.0 | ^12.0", "nyholm/psr7": "^1.0", "php": "^7.2 | ^8.0", "sentry/sentry": "^4.10", @@ -5450,12 +5450,12 @@ "friendsofphp/php-cs-fixer": "^3.11", "guzzlehttp/guzzle": "^7.2", "laravel/folio": "^1.1", - "laravel/framework": "^6.0 | ^7.0 | ^8.0 | ^9.0 | ^10.0 | ^11.0", + "laravel/framework": "^6.0 | ^7.0 | ^8.0 | ^9.0 | ^10.0 | ^11.0 | ^12.0", "livewire/livewire": "^2.0 | ^3.0", "mockery/mockery": "^1.3", - "orchestra/testbench": "^4.7 | ^5.1 | ^6.0 | ^7.0 | ^8.0 | ^9.0", + "orchestra/testbench": "^4.7 | ^5.1 | ^6.0 | ^7.0 | ^8.0 | ^9.0 | ^10.0", "phpstan/phpstan": "^1.10", - "phpunit/phpunit": "^8.4 | ^9.3 | ^10.4" + "phpunit/phpunit": "^8.4 | ^9.3 | ^10.4 | ^11.5" }, "type": "library", "extra": { @@ -5500,7 +5500,7 @@ ], "support": { "issues": "https://github.com/getsentry/sentry-laravel/issues", - "source": "https://github.com/getsentry/sentry-laravel/tree/4.12.0" + "source": "https://github.com/getsentry/sentry-laravel/tree/4.13.0" }, "funding": [ { @@ -5512,7 +5512,7 @@ "type": "custom" } ], - "time": "2025-02-05T13:13:03+00:00" + "time": "2025-02-18T10:09:29+00:00" }, { "name": "shaarli/netscape-bookmark-parser", @@ -5830,20 +5830,20 @@ }, { "name": "socialiteproviders/manager", - "version": "v4.8.0", + "version": "v4.8.1", "source": { "type": "git", "url": "https://github.com/SocialiteProviders/Manager.git", - "reference": "e93acc38f8464cc775a2b8bf09df311d1fdfefcb" + "reference": "8180ec14bef230ec2351cff993d5d2d7ca470ef4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/SocialiteProviders/Manager/zipball/e93acc38f8464cc775a2b8bf09df311d1fdfefcb", - "reference": "e93acc38f8464cc775a2b8bf09df311d1fdfefcb", + "url": "https://api.github.com/repos/SocialiteProviders/Manager/zipball/8180ec14bef230ec2351cff993d5d2d7ca470ef4", + "reference": "8180ec14bef230ec2351cff993d5d2d7ca470ef4", "shasum": "" }, "require": { - "illuminate/support": "^8.0 || ^9.0 || ^10.0 || ^11.0", + "illuminate/support": "^8.0 || ^9.0 || ^10.0 || ^11.0 || ^12.0", "laravel/socialite": "^5.5", "php": "^8.1" }, @@ -5900,7 +5900,7 @@ "issues": "https://github.com/socialiteproviders/manager/issues", "source": "https://github.com/socialiteproviders/manager" }, - "time": "2025-01-03T09:40:37+00:00" + "time": "2025-02-24T19:33:30+00:00" }, { "name": "socialiteproviders/microsoft-azure", @@ -6048,16 +6048,16 @@ }, { "name": "spatie/db-dumper", - "version": "3.7.1", + "version": "3.8.0", "source": { "type": "git", "url": "https://github.com/spatie/db-dumper.git", - "reference": "55d4d6710e1ab18c1e7ce2b22b8ad4bea2a30016" + "reference": "91e1fd4dc000aefc9753cda2da37069fc996baee" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/db-dumper/zipball/55d4d6710e1ab18c1e7ce2b22b8ad4bea2a30016", - "reference": "55d4d6710e1ab18c1e7ce2b22b8ad4bea2a30016", + "url": "https://api.github.com/repos/spatie/db-dumper/zipball/91e1fd4dc000aefc9753cda2da37069fc996baee", + "reference": "91e1fd4dc000aefc9753cda2da37069fc996baee", "shasum": "" }, "require": { @@ -6095,7 +6095,7 @@ "spatie" ], "support": { - "source": "https://github.com/spatie/db-dumper/tree/3.7.1" + "source": "https://github.com/spatie/db-dumper/tree/3.8.0" }, "funding": [ { @@ -6107,7 +6107,7 @@ "type": "github" } ], - "time": "2024-11-18T14:54:31+00:00" + "time": "2025-02-14T15:04:22+00:00" }, { "name": "spatie/laravel-activitylog", @@ -6361,16 +6361,16 @@ }, { "name": "spatie/laravel-permission", - "version": "6.13.0", + "version": "6.15.0", "source": { "type": "git", "url": "https://github.com/spatie/laravel-permission.git", - "reference": "bb3ad222d65ec804c219cc52a8b54f5af2e1636a" + "reference": "86074fcfd127f9fa7bcdf550b7c938e3beb0d65f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-permission/zipball/bb3ad222d65ec804c219cc52a8b54f5af2e1636a", - "reference": "bb3ad222d65ec804c219cc52a8b54f5af2e1636a", + "url": "https://api.github.com/repos/spatie/laravel-permission/zipball/86074fcfd127f9fa7bcdf550b7c938e3beb0d65f", + "reference": "86074fcfd127f9fa7bcdf550b7c938e3beb0d65f", "shasum": "" }, "require": { @@ -6432,7 +6432,7 @@ ], "support": { "issues": "https://github.com/spatie/laravel-permission/issues", - "source": "https://github.com/spatie/laravel-permission/tree/6.13.0" + "source": "https://github.com/spatie/laravel-permission/tree/6.15.0" }, "funding": [ { @@ -6440,7 +6440,7 @@ "type": "github" } ], - "time": "2025-02-05T15:42:48+00:00" + "time": "2025-02-17T19:18:01+00:00" }, { "name": "spatie/laravel-settings", @@ -9487,30 +9487,33 @@ "packages-dev": [ { "name": "barryvdh/laravel-debugbar", - "version": "v3.14.10", + "version": "v3.15.2", "source": { "type": "git", "url": "https://github.com/barryvdh/laravel-debugbar.git", - "reference": "56b9bd235e3fe62e250124804009ce5bab97cc63" + "reference": "0bc1e1361e7fffc2be156f46ad1fba6927c01729" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/56b9bd235e3fe62e250124804009ce5bab97cc63", - "reference": "56b9bd235e3fe62e250124804009ce5bab97cc63", + "url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/0bc1e1361e7fffc2be156f46ad1fba6927c01729", + "reference": "0bc1e1361e7fffc2be156f46ad1fba6927c01729", "shasum": "" }, "require": { - "illuminate/routing": "^9|^10|^11", - "illuminate/session": "^9|^10|^11", - "illuminate/support": "^9|^10|^11", - "maximebf/debugbar": "~1.23.0", - "php": "^8.0", + "illuminate/routing": "^9|^10|^11|^12", + "illuminate/session": "^9|^10|^11|^12", + "illuminate/support": "^9|^10|^11|^12", + "php": "^8.1", + "php-debugbar/php-debugbar": "~2.1.1", "symfony/finder": "^6|^7" }, + "conflict": { + "maximebf/debugbar": "*" + }, "require-dev": { "mockery/mockery": "^1.3.3", - "orchestra/testbench-dusk": "^5|^6|^7|^8|^9", - "phpunit/phpunit": "^9.6|^10.5", + "orchestra/testbench-dusk": "^7|^8|^9|^10", + "phpunit/phpunit": "^9.5.10|^10|^11", "squizlabs/php_codesniffer": "^3.5" }, "type": "library", @@ -9524,7 +9527,7 @@ ] }, "branch-alias": { - "dev-master": "3.14-dev" + "dev-master": "3.15-dev" } }, "autoload": { @@ -9549,13 +9552,14 @@ "keywords": [ "debug", "debugbar", + "dev", "laravel", "profiler", "webprofiler" ], "support": { "issues": "https://github.com/barryvdh/laravel-debugbar/issues", - "source": "https://github.com/barryvdh/laravel-debugbar/tree/v3.14.10" + "source": "https://github.com/barryvdh/laravel-debugbar/tree/v3.15.2" }, "funding": [ { @@ -9567,7 +9571,7 @@ "type": "github" } ], - "time": "2024-12-23T10:10:42+00:00" + "time": "2025-02-25T15:25:22+00:00" }, { "name": "barryvdh/laravel-ide-helper", @@ -10118,74 +10122,6 @@ }, "time": "2025-01-27T14:24:01+00:00" }, - { - "name": "maximebf/debugbar", - "version": "v1.23.5", - "source": { - "type": "git", - "url": "https://github.com/php-debugbar/php-debugbar.git", - "reference": "eeabd61a1f19ba5dcd5ac4585a477130ee03ce25" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-debugbar/php-debugbar/zipball/eeabd61a1f19ba5dcd5ac4585a477130ee03ce25", - "reference": "eeabd61a1f19ba5dcd5ac4585a477130ee03ce25", - "shasum": "" - }, - "require": { - "php": "^7.2|^8", - "psr/log": "^1|^2|^3", - "symfony/var-dumper": "^4|^5|^6|^7" - }, - "require-dev": { - "dbrekelmans/bdi": "^1", - "phpunit/phpunit": "^8|^9", - "symfony/panther": "^1|^2.1", - "twig/twig": "^1.38|^2.7|^3.0" - }, - "suggest": { - "kriswallsmith/assetic": "The best way to manage assets", - "monolog/monolog": "Log using Monolog", - "predis/predis": "Redis storage" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.23-dev" - } - }, - "autoload": { - "psr-4": { - "DebugBar\\": "src/DebugBar/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Maxime Bouroumeau-Fuseau", - "email": "maxime.bouroumeau@gmail.com", - "homepage": "http://maximebf.com" - }, - { - "name": "Barry vd. Heuvel", - "email": "barryvdh@gmail.com" - } - ], - "description": "Debug bar in the browser for php application", - "homepage": "https://github.com/maximebf/php-debugbar", - "keywords": [ - "debug", - "debugbar" - ], - "support": { - "issues": "https://github.com/php-debugbar/php-debugbar/issues", - "source": "https://github.com/php-debugbar/php-debugbar/tree/v1.23.5" - }, - "time": "2024-12-15T19:20:42+00:00" - }, { "name": "mockery/mockery", "version": "1.6.12", @@ -10271,16 +10207,16 @@ }, { "name": "myclabs/deep-copy", - "version": "1.12.1", + "version": "1.13.0", "source": { "type": "git", "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "123267b2c49fbf30d78a7b2d333f6be754b94845" + "reference": "024473a478be9df5fdaca2c793f2232fe788e414" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/123267b2c49fbf30d78a7b2d333f6be754b94845", - "reference": "123267b2c49fbf30d78a7b2d333f6be754b94845", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/024473a478be9df5fdaca2c793f2232fe788e414", + "reference": "024473a478be9df5fdaca2c793f2232fe788e414", "shasum": "" }, "require": { @@ -10319,7 +10255,7 @@ ], "support": { "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.12.1" + "source": "https://github.com/myclabs/DeepCopy/tree/1.13.0" }, "funding": [ { @@ -10327,7 +10263,7 @@ "type": "tidelift" } ], - "time": "2024-11-08T17:47:46+00:00" + "time": "2025-02-12T12:17:51+00:00" }, { "name": "nikic/php-parser", @@ -10601,6 +10537,76 @@ }, "time": "2022-02-21T01:04:05+00:00" }, + { + "name": "php-debugbar/php-debugbar", + "version": "v2.1.6", + "source": { + "type": "git", + "url": "https://github.com/php-debugbar/php-debugbar.git", + "reference": "16fa68da5617220594aa5e33fa9de415f94784a0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-debugbar/php-debugbar/zipball/16fa68da5617220594aa5e33fa9de415f94784a0", + "reference": "16fa68da5617220594aa5e33fa9de415f94784a0", + "shasum": "" + }, + "require": { + "php": "^8", + "psr/log": "^1|^2|^3", + "symfony/var-dumper": "^4|^5|^6|^7" + }, + "require-dev": { + "dbrekelmans/bdi": "^1", + "phpunit/phpunit": "^8|^9", + "symfony/panther": "^1|^2.1", + "twig/twig": "^1.38|^2.7|^3.0" + }, + "suggest": { + "kriswallsmith/assetic": "The best way to manage assets", + "monolog/monolog": "Log using Monolog", + "predis/predis": "Redis storage" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "psr-4": { + "DebugBar\\": "src/DebugBar/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Maxime Bouroumeau-Fuseau", + "email": "maxime.bouroumeau@gmail.com", + "homepage": "http://maximebf.com" + }, + { + "name": "Barry vd. Heuvel", + "email": "barryvdh@gmail.com" + } + ], + "description": "Debug bar in the browser for php application", + "homepage": "https://github.com/php-debugbar/php-debugbar", + "keywords": [ + "debug", + "debug bar", + "debugbar", + "dev" + ], + "support": { + "issues": "https://github.com/php-debugbar/php-debugbar/issues", + "source": "https://github.com/php-debugbar/php-debugbar/tree/v2.1.6" + }, + "time": "2025-02-21T17:47:03+00:00" + }, { "name": "php-di/invoker", "version": "2.3.6", @@ -11236,12 +11242,12 @@ "source": { "type": "git", "url": "https://github.com/Roave/SecurityAdvisories.git", - "reference": "b3b8e9af2f66bf476ec0c4bbaf5ca069488c643e" + "reference": "eec07a3f265e855f870e52b7c18c44822208e303" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/b3b8e9af2f66bf476ec0c4bbaf5ca069488c643e", - "reference": "b3b8e9af2f66bf476ec0c4bbaf5ca069488c643e", + "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/eec07a3f265e855f870e52b7c18c44822208e303", + "reference": "eec07a3f265e855f870e52b7c18c44822208e303", "shasum": "" }, "conflict": { @@ -11258,7 +11264,7 @@ "airesvsg/acf-to-rest-api": "<=3.1", "akaunting/akaunting": "<2.1.13", "akeneo/pim-community-dev": "<5.0.119|>=6,<6.0.53", - "alextselegidis/easyappointments": "<1.5", + "alextselegidis/easyappointments": "<=1.5", "alterphp/easyadmin-extension-bundle": ">=1.2,<1.2.11|>=1.3,<1.3.1", "amazing/media2click": ">=1,<1.3.3", "ameos/ameos_tarteaucitron": "<1.2.23", @@ -11333,7 +11339,7 @@ "cesnet/simplesamlphp-module-proxystatistics": "<3.1", "chriskacerguis/codeigniter-restserver": "<=2.7.1", "civicrm/civicrm-core": ">=4.2,<4.2.9|>=4.3,<4.3.3", - "ckeditor/ckeditor": "<4.24", + "ckeditor/ckeditor": "<4.25", "cockpit-hq/cockpit": "<2.7|==2.7", "codeception/codeception": "<3.1.3|>=4,<4.1.22", "codeigniter/framework": "<3.1.9", @@ -11580,6 +11586,7 @@ "league/commonmark": "<2.6", "league/flysystem": "<1.1.4|>=2,<2.1.1", "league/oauth2-server": ">=8.3.2,<8.4.2|>=8.5,<8.5.3", + "leantime/leantime": "<3.3", "lexik/jwt-authentication-bundle": "<2.10.7|>=2.11,<2.11.3", "libreform/libreform": ">=2,<=2.0.8", "librenms/librenms": "<2017.08.18", @@ -11592,7 +11599,7 @@ "localizationteam/l10nmgr": "<7.4|>=8,<8.7|>=9,<9.2", "luyadev/yii-helpers": "<1.2.1", "maestroerror/php-heic-to-jpg": "<1.0.5", - "magento/community-edition": "<2.4.5|==2.4.5|>=2.4.5.0-patch1,<2.4.5.0-patch10|==2.4.6|>=2.4.6.0-patch1,<2.4.6.0-patch8|>=2.4.7.0-beta1,<2.4.7.0-patch3", + "magento/community-edition": "<2.4.5|==2.4.5|>=2.4.5.0-patch1,<2.4.5.0-patch11|==2.4.6|>=2.4.6.0-patch1,<2.4.6.0-patch9|>=2.4.7.0-beta1,<2.4.7.0-patch4|>=2.4.8.0-beta1,<2.4.8.0-beta2", "magento/core": "<=1.9.4.5", "magento/magento1ce": "<1.9.4.3-dev", "magento/magento1ee": ">=1,<1.14.4.3-dev", @@ -11604,7 +11611,7 @@ "mantisbt/mantisbt": "<=2.26.3", "marcwillmann/turn": "<0.3.3", "matyhtf/framework": "<3.0.6", - "mautic/core": "<4.4.13|>=5,<5.1.1", + "mautic/core": "<4.4.13|>=5.0.0.0-alpha,<5.1.1", "mautic/core-lib": ">=1.0.0.0-beta,<4.4.13|>=5.0.0.0-alpha,<5.1.1", "maximebf/debugbar": "<1.19", "mdanter/ecc": "<2", @@ -11631,7 +11638,7 @@ "mojo42/jirafeau": "<4.4", "mongodb/mongodb": ">=1,<1.9.2", "monolog/monolog": ">=1.8,<1.12", - "moodle/moodle": "<4.3.8|>=4.4,<4.4.4", + "moodle/moodle": "<4.3.10|>=4.4,<4.4.6|>=4.5.0.0-beta,<4.5.2", "mos/cimage": "<0.7.19", "movim/moxl": ">=0.8,<=0.10", "movingbytes/social-network": "<=1.2.1", @@ -11790,7 +11797,7 @@ "s-cart/s-cart": "<6.9", "sabberworm/php-css-parser": ">=1,<1.0.1|>=2,<2.0.1|>=3,<3.0.1|>=4,<4.0.1|>=5,<5.0.9|>=5.1,<5.1.3|>=5.2,<5.2.1|>=6,<6.0.2|>=7,<7.0.4|>=8,<8.0.1|>=8.1,<8.1.1|>=8.2,<8.2.1|>=8.3,<8.3.1", "sabre/dav": ">=1.6,<1.7.11|>=1.8,<1.8.9", - "samwilson/unlinked-wikibase": "<1.39.6|>=1.40,<1.40.2|>=1.41,<1.41.1", + "samwilson/unlinked-wikibase": "<1.42", "scheb/two-factor-bundle": "<3.26|>=4,<4.11", "sensiolabs/connect": "<4.2.3", "serluck/phpwhois": "<=4.2.6", @@ -12103,7 +12110,7 @@ "type": "tidelift" } ], - "time": "2025-02-10T21:04:44+00:00" + "time": "2025-02-25T16:05:58+00:00" }, { "name": "sebastian/cli-parser", @@ -13086,30 +13093,30 @@ }, { "name": "spatie/error-solutions", - "version": "1.1.2", + "version": "1.1.3", "source": { "type": "git", "url": "https://github.com/spatie/error-solutions.git", - "reference": "d239a65235a1eb128dfa0a4e4c4ef032ea11b541" + "reference": "e495d7178ca524f2dd0fe6a1d99a1e608e1c9936" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/error-solutions/zipball/d239a65235a1eb128dfa0a4e4c4ef032ea11b541", - "reference": "d239a65235a1eb128dfa0a4e4c4ef032ea11b541", + "url": "https://api.github.com/repos/spatie/error-solutions/zipball/e495d7178ca524f2dd0fe6a1d99a1e608e1c9936", + "reference": "e495d7178ca524f2dd0fe6a1d99a1e608e1c9936", "shasum": "" }, "require": { "php": "^8.0" }, "require-dev": { - "illuminate/broadcasting": "^10.0|^11.0", - "illuminate/cache": "^10.0|^11.0", - "illuminate/support": "^10.0|^11.0", - "livewire/livewire": "^2.11|^3.3.5", + "illuminate/broadcasting": "^10.0|^11.0|^12.0", + "illuminate/cache": "^10.0|^11.0|^12.0", + "illuminate/support": "^10.0|^11.0|^12.0", + "livewire/livewire": "^2.11|^3.5.20", "openai-php/client": "^0.10.1", - "orchestra/testbench": "^7.0|8.22.3|^9.0", - "pestphp/pest": "^2.20", - "phpstan/phpstan": "^1.11", + "orchestra/testbench": "8.22.3|^9.0|^10.0", + "pestphp/pest": "^2.20|^3.0", + "phpstan/phpstan": "^2.1", "psr/simple-cache": "^3.0", "psr/simple-cache-implementation": "^3.0", "spatie/ray": "^1.28", @@ -13148,7 +13155,7 @@ ], "support": { "issues": "https://github.com/spatie/error-solutions/issues", - "source": "https://github.com/spatie/error-solutions/tree/1.1.2" + "source": "https://github.com/spatie/error-solutions/tree/1.1.3" }, "funding": [ { @@ -13156,24 +13163,24 @@ "type": "github" } ], - "time": "2024-12-11T09:51:56+00:00" + "time": "2025-02-14T12:29:50+00:00" }, { "name": "spatie/flare-client-php", - "version": "1.10.0", + "version": "1.10.1", "source": { "type": "git", "url": "https://github.com/spatie/flare-client-php.git", - "reference": "140a42b2c5d59ac4ecf8f5b493386a4f2eb28272" + "reference": "bf1716eb98bd689451b071548ae9e70738dce62f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/flare-client-php/zipball/140a42b2c5d59ac4ecf8f5b493386a4f2eb28272", - "reference": "140a42b2c5d59ac4ecf8f5b493386a4f2eb28272", + "url": "https://api.github.com/repos/spatie/flare-client-php/zipball/bf1716eb98bd689451b071548ae9e70738dce62f", + "reference": "bf1716eb98bd689451b071548ae9e70738dce62f", "shasum": "" }, "require": { - "illuminate/pipeline": "^8.0|^9.0|^10.0|^11.0", + "illuminate/pipeline": "^8.0|^9.0|^10.0|^11.0|^12.0", "php": "^8.0", "spatie/backtrace": "^1.6.1", "symfony/http-foundation": "^5.2|^6.0|^7.0", @@ -13217,7 +13224,7 @@ ], "support": { "issues": "https://github.com/spatie/flare-client-php/issues", - "source": "https://github.com/spatie/flare-client-php/tree/1.10.0" + "source": "https://github.com/spatie/flare-client-php/tree/1.10.1" }, "funding": [ { @@ -13225,20 +13232,20 @@ "type": "github" } ], - "time": "2024-12-02T14:30:06+00:00" + "time": "2025-02-14T13:42:06+00:00" }, { "name": "spatie/ignition", - "version": "1.15.0", + "version": "1.15.1", "source": { "type": "git", "url": "https://github.com/spatie/ignition.git", - "reference": "e3a68e137371e1eb9edc7f78ffa733f3b98991d2" + "reference": "31f314153020aee5af3537e507fef892ffbf8c85" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/ignition/zipball/e3a68e137371e1eb9edc7f78ffa733f3b98991d2", - "reference": "e3a68e137371e1eb9edc7f78ffa733f3b98991d2", + "url": "https://api.github.com/repos/spatie/ignition/zipball/31f314153020aee5af3537e507fef892ffbf8c85", + "reference": "31f314153020aee5af3537e507fef892ffbf8c85", "shasum": "" }, "require": { @@ -13251,7 +13258,7 @@ "symfony/var-dumper": "^5.4|^6.0|^7.0" }, "require-dev": { - "illuminate/cache": "^9.52|^10.0|^11.0", + "illuminate/cache": "^9.52|^10.0|^11.0|^12.0", "mockery/mockery": "^1.4", "pestphp/pest": "^1.20|^2.0", "phpstan/extension-installer": "^1.1", @@ -13308,27 +13315,27 @@ "type": "github" } ], - "time": "2024-06-12T14:55:22+00:00" + "time": "2025-02-21T14:31:39+00:00" }, { "name": "spatie/laravel-ignition", - "version": "2.9.0", + "version": "2.9.1", "source": { "type": "git", "url": "https://github.com/spatie/laravel-ignition.git", - "reference": "62042df15314b829d0f26e02108f559018e2aad0" + "reference": "1baee07216d6748ebd3a65ba97381b051838707a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-ignition/zipball/62042df15314b829d0f26e02108f559018e2aad0", - "reference": "62042df15314b829d0f26e02108f559018e2aad0", + "url": "https://api.github.com/repos/spatie/laravel-ignition/zipball/1baee07216d6748ebd3a65ba97381b051838707a", + "reference": "1baee07216d6748ebd3a65ba97381b051838707a", "shasum": "" }, "require": { "ext-curl": "*", "ext-json": "*", "ext-mbstring": "*", - "illuminate/support": "^10.0|^11.0", + "illuminate/support": "^10.0|^11.0|^12.0", "php": "^8.1", "spatie/ignition": "^1.15", "symfony/console": "^6.2.3|^7.0", @@ -13337,12 +13344,12 @@ "require-dev": { "livewire/livewire": "^2.11|^3.3.5", "mockery/mockery": "^1.5.1", - "openai-php/client": "^0.8.1", - "orchestra/testbench": "8.22.3|^9.0", - "pestphp/pest": "^2.34", + "openai-php/client": "^0.8.1|^0.10", + "orchestra/testbench": "8.22.3|^9.0|^10.0", + "pestphp/pest": "^2.34|^3.7", "phpstan/extension-installer": "^1.3.1", - "phpstan/phpstan-deprecation-rules": "^1.1.1", - "phpstan/phpstan-phpunit": "^1.3.16", + "phpstan/phpstan-deprecation-rules": "^1.1.1|^2.0", + "phpstan/phpstan-phpunit": "^1.3.16|^2.0", "vlucas/phpdotenv": "^5.5" }, "suggest": { @@ -13399,7 +13406,7 @@ "type": "github" } ], - "time": "2024-12-02T08:43:31+00:00" + "time": "2025-02-20T13:13:55+00:00" }, { "name": "spatie/laravel-ray", diff --git a/package-lock.json b/package-lock.json index a9f33ac2..90e4d282 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,7 +16,7 @@ "laravel-mix": "^6.0.31", "postcss": "^8.4.35", "sass": "^1.85.0", - "sass-loader": "^14.1.0" + "sass-loader": "^16.0.5" } }, "node_modules/@ampproject/remapping": { @@ -59,23 +59,22 @@ } }, "node_modules/@babel/core": { - "version": "7.26.8", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.8.tgz", - "integrity": "sha512-l+lkXCHS6tQEc5oUpK28xBOZ6+HwaH7YwoYQbLFiYb4nS2/l1tKnZEtEWkD0GuiYdvArf9qBS0XlQGXzPMsNqQ==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.9.tgz", + "integrity": "sha512-lWBYIrF7qK5+GjY5Uy+/hEgp8OJWOD/rpy74GplYRhEauvbHDeFB8t5hPOZxCZ0Oxf4Cc36tK51/l3ymJysrKw==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.8", + "@babel/generator": "^7.26.9", "@babel/helper-compilation-targets": "^7.26.5", "@babel/helper-module-transforms": "^7.26.0", - "@babel/helpers": "^7.26.7", - "@babel/parser": "^7.26.8", - "@babel/template": "^7.26.8", - "@babel/traverse": "^7.26.8", - "@babel/types": "^7.26.8", - "@types/gensync": "^1.0.0", + "@babel/helpers": "^7.26.9", + "@babel/parser": "^7.26.9", + "@babel/template": "^7.26.9", + "@babel/traverse": "^7.26.9", + "@babel/types": "^7.26.9", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -101,14 +100,14 @@ } }, "node_modules/@babel/generator": { - "version": "7.26.8", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.8.tgz", - "integrity": "sha512-ef383X5++iZHWAXX0SXQR6ZyQhw/0KtTkrTz61WXRhFM6dhpHulO/RJz79L8S6ugZHJkOOkUrUdxgdF2YiPFnA==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.9.tgz", + "integrity": "sha512-kEWdzjOAUMW4hAyrzJ0ZaTOu9OmpyDIQicIh0zg0EEcEkYXZb2TjtBhnHi2ViX7PKwZqF4xwqfAm299/QMP3lg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.26.8", - "@babel/types": "^7.26.8", + "@babel/parser": "^7.26.9", + "@babel/types": "^7.26.9", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" @@ -158,18 +157,18 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.9.tgz", - "integrity": "sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.26.9.tgz", + "integrity": "sha512-ubbUqCofvxPRurw5L8WTsCLSkQiVpov4Qx0WMA+jUN+nXBK8ADPlJO1grkFw5CWKC5+sZSOfuGMdX1aI1iT9Sg==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.25.9", "@babel/helper-member-expression-to-functions": "^7.25.9", "@babel/helper-optimise-call-expression": "^7.25.9", - "@babel/helper-replace-supers": "^7.25.9", + "@babel/helper-replace-supers": "^7.26.5", "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", - "@babel/traverse": "^7.25.9", + "@babel/traverse": "^7.26.9", "semver": "^6.3.1" }, "engines": { @@ -399,27 +398,27 @@ } }, "node_modules/@babel/helpers": { - "version": "7.26.7", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.7.tgz", - "integrity": "sha512-8NHiL98vsi0mbPQmYAGWwfcFaOy4j2HY49fXJCfuDcdE7fMIsH9a7GdaeXpIBsbT7307WU8KCMp5pUVDNL4f9A==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.9.tgz", + "integrity": "sha512-Mz/4+y8udxBKdmzt/UjPACs4G3j5SshJJEFFKxlCGPydG4JAHXxjWjAwjd09tf6oINvl1VfMJo+nB7H2YKQ0dA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.25.9", - "@babel/types": "^7.26.7" + "@babel/template": "^7.26.9", + "@babel/types": "^7.26.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.26.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.8.tgz", - "integrity": "sha512-TZIQ25pkSoaKEYYaHbbxkfL36GNsQ6iFiBbeuzAkLnXayKR1yP1zFe+NxuZWWsUyvt8icPU9CCq0sgWGXR1GEw==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.9.tgz", + "integrity": "sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.26.8" + "@babel/types": "^7.26.9" }, "bin": { "parser": "bin/babel-parser.js" @@ -892,13 +891,13 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.25.9.tgz", - "integrity": "sha512-LqHxduHoaGELJl2uhImHwRQudhCM50pT46rIBNvtT/Oql3nqiS3wOwP+5ten7NpYSXrrVLgtZU3DZmPtWZo16A==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.26.9.tgz", + "integrity": "sha512-Hry8AusVm8LW5BVFgiyUReuoGzPUpdHQQqJY5bZnbbf+ngOHWuCuYFKw/BqaaWlvEUrF91HMhDtEaI1hZzNbLg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-plugin-utils": "^7.26.5", "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" }, "engines": { @@ -1311,9 +1310,9 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.26.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.26.8.tgz", - "integrity": "sha512-H0jlQxFMI0Q8SyGPsj9pO3ygVQRxPkIGytsL3m1Zqca8KrCPpMlvh+e2dxknqdfS8LFwBw+PpiYPD9qy/FPQpA==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.26.9.tgz", + "integrity": "sha512-Jf+8y9wXQbbxvVYTM8gO5oEF2POdNji0NMltEkG7FtmzD9PVz7/lxpqSdTvwsjTMU5HIHuDVNf2SOxLkWi+wPQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1490,9 +1489,9 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.26.8", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.26.8.tgz", - "integrity": "sha512-um7Sy+2THd697S4zJEfv/U5MHGJzkN2xhtsR3T/SWRbVSic62nbISh51VVfU9JiO/L/Z97QczHTaFVkOU8IzNg==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.26.9.tgz", + "integrity": "sha512-vX3qPGE8sEKEAZCWk05k3cpTAE3/nOYca++JA+Rd0z2NCNzabmYvEiSShKzm10zdquOIAVXsy2Ei/DTW34KlKQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1525,7 +1524,7 @@ "@babel/plugin-transform-dynamic-import": "^7.25.9", "@babel/plugin-transform-exponentiation-operator": "^7.26.3", "@babel/plugin-transform-export-namespace-from": "^7.25.9", - "@babel/plugin-transform-for-of": "^7.25.9", + "@babel/plugin-transform-for-of": "^7.26.9", "@babel/plugin-transform-function-name": "^7.25.9", "@babel/plugin-transform-json-strings": "^7.25.9", "@babel/plugin-transform-literals": "^7.25.9", @@ -1613,9 +1612,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.26.7", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.7.tgz", - "integrity": "sha512-AOPI3D+a8dXnja+iwsUqGRjr1BbZIe771sXdapOtYI531gSqpi92vXivKcq2asu/DFpdl1ceFAKZyRzK2PCVcQ==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.9.tgz", + "integrity": "sha512-aA63XwOkcl4xxQa3HjPMqOP6LiK0ZDv3mUPYEFXkpHbaFjtGggE1A61FjFzJnB+p7/oy2gA8E+rcBNl/zC1tMg==", "dev": true, "license": "MIT", "dependencies": { @@ -1626,32 +1625,32 @@ } }, "node_modules/@babel/template": { - "version": "7.26.8", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.26.8.tgz", - "integrity": "sha512-iNKaX3ZebKIsCvJ+0jd6embf+Aulaa3vNBqZ41kM7iTWjx5qzWKXGHiJUW3+nTpQ18SG11hdF8OAzKrpXkb96Q==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.26.9.tgz", + "integrity": "sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.26.2", - "@babel/parser": "^7.26.8", - "@babel/types": "^7.26.8" + "@babel/parser": "^7.26.9", + "@babel/types": "^7.26.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.26.8", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.8.tgz", - "integrity": "sha512-nic9tRkjYH0oB2dzr/JoGIm+4Q6SuYeLEiIiZDwBscRMYFJ+tMAz98fuel9ZnbXViA2I0HVSSRRK8DW5fjXStA==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.9.tgz", + "integrity": "sha512-ZYW7L+pL8ahU5fXmNbPF+iZFHCv5scFak7MZ9bwaRPLUhHh7QQEMjZUg0HevihoqCM5iSYHN61EyCoZvqC+bxg==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.8", - "@babel/parser": "^7.26.8", - "@babel/template": "^7.26.8", - "@babel/types": "^7.26.8", + "@babel/generator": "^7.26.9", + "@babel/parser": "^7.26.9", + "@babel/template": "^7.26.9", + "@babel/types": "^7.26.9", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -1660,9 +1659,9 @@ } }, "node_modules/@babel/types": { - "version": "7.26.8", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.8.tgz", - "integrity": "sha512-eUuWapzEGWFEpHFxgEaBG8e3n6S8L3MSu0oda755rOfabWPnh0Our1AozNFVUxGFIhbKgd1ksprsoDGMinTOTA==", + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.9.tgz", + "integrity": "sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw==", "dev": true, "license": "MIT", "dependencies": { @@ -2315,13 +2314,6 @@ "@types/send": "*" } }, - "node_modules/@types/gensync": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@types/gensync/-/gensync-1.0.4.tgz", - "integrity": "sha512-C3YYeRQWp2fmq9OryX+FoDy8nXS6scQ7dPptD8LnFDAUNcKWJjXQKDNJD3HVm+kOUsXhTOkpi69vI4EuAr95bA==", - "dev": true, - "license": "MIT" - }, "node_modules/@types/glob": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", @@ -2423,9 +2415,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "22.13.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.1.tgz", - "integrity": "sha512-jK8uzQlrvXqEU91UxiK5J7pKHyzgnI1Qnl0QDHIgVGuolJhRb9EEl28Cj9b3rGR8B2lhFCtvIm5os8lFnO/1Ew==", + "version": "22.13.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.5.tgz", + "integrity": "sha512-+lTU0PxZXn0Dr1NBtC7Y8cR21AJr87dLLU953CWA6pMxxv/UDc7jYAY90upcrie1nRcD6XNG5HOYEDtgW5TxAg==", "dev": true, "license": "MIT", "dependencies": { @@ -3451,9 +3443,9 @@ } }, "node_modules/call-bind-apply-helpers": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz", - "integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3516,9 +3508,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001699", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001699.tgz", - "integrity": "sha512-b+uH5BakXZ9Do9iK+CkDmctUSEqZl+SP056vc5usa0PL+ev5OHw003rZXcnjNDv3L8P5j6rwT6C0BPKSikW08w==", + "version": "1.0.30001701", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001701.tgz", + "integrity": "sha512-faRs/AW3jA9nTwmJBSO1PQ6L/EOgsB5HMQQq4iCu5zhPgVVgO/pZRHlmatwijZKetFw8/Pr4q6dEN8sJuq8qTw==", "dev": true, "funding": [ { @@ -4576,9 +4568,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.97", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.97.tgz", - "integrity": "sha512-HKLtaH02augM7ZOdYRuO19rWDeY+QSJ1VxnXFa/XDFLf07HvM90pALIJFgrO+UVaajI3+aJMMpojoUTLZyQ7JQ==", + "version": "1.5.105", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.105.tgz", + "integrity": "sha512-ccp7LocdXx3yBhwiG0qTQ7XFrK48Ua2pxIxBdJO8cbddp/MvbBtPFzvnTchtyHQTsgqqczO8cdmAIbpMa0u2+g==", "dev": true, "license": "ISC" }, @@ -5287,18 +5279,18 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.7.tgz", - "integrity": "sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "dev": true, "license": "MIT", "dependencies": { - "call-bind-apply-helpers": "^1.0.1", + "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", + "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", - "get-proto": "^1.0.0", + "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", @@ -6369,9 +6361,9 @@ } }, "node_modules/launch-editor": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.9.1.tgz", - "integrity": "sha512-Gcnl4Bd+hRO9P9icCP/RVVT2o8SFlPXofuCxvA2SaZuH45whSvf5p8x5oih5ftLiVhEI4sp5xDY+R+b3zJBh5w==", + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.10.0.tgz", + "integrity": "sha512-D7dBRJo/qcGX9xlvt/6wUYzQxjh5G1RvZPgPv8vi4KRU99DVQL/oW7tnVOCCTm2HGeo3C5HvGE5Yrh6UBoZ0vA==", "dev": true, "license": "MIT", "dependencies": { @@ -7359,9 +7351,9 @@ } }, "node_modules/postcss": { - "version": "8.5.2", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.2.tgz", - "integrity": "sha512-MjOadfU3Ys9KYoX0AdkBlFEF1Vx37uCCeN4ZHnmwm9FfpbsGWMZeBLMmmpY+6Ocqod7mkdZ0DT31OlbsFrLlkA==", + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", + "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", "dev": true, "funding": [ { @@ -8416,9 +8408,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": { @@ -8507,9 +8499,9 @@ "license": "MIT" }, "node_modules/sass": { - "version": "1.85.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.85.0.tgz", - "integrity": "sha512-3ToiC1xZ1Y8aU7+CkgCI/tqyuPXEmYGJXO7H4uqp0xkLXUqp88rQQ4j1HmP37xSJLbCJPaIiv+cT1y+grssrww==", + "version": "1.85.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.85.1.tgz", + "integrity": "sha512-Uk8WpxM5v+0cMR0XjX9KfRIacmSG86RH4DCCZjLU2rFh5tyutt9siAXJ7G+YfxQ99Q6wrRMbMlVl6KqUms71ag==", "dev": true, "license": "MIT", "dependencies": { @@ -8528,9 +8520,9 @@ } }, "node_modules/sass-loader": { - "version": "14.2.1", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-14.2.1.tgz", - "integrity": "sha512-G0VcnMYU18a4N7VoNDegg2OuMjYtxnqzQWARVWCIVSZwJeiL9kg8QMsuIZOplsJgTzZLF6jGxI3AClj8I9nRdQ==", + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-16.0.5.tgz", + "integrity": "sha512-oL+CMBXrj6BZ/zOq4os+UECPL+bWqt6OAC6DWS8Ln8GZRcMDjlJ4JC3FBDuHJdYaFWIdKNIBYmtZtK2MaMkNIw==", "dev": true, "license": "MIT", "dependencies": { @@ -8585,9 +8577,9 @@ } }, "node_modules/sass/node_modules/readdirp": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.1.tgz", - "integrity": "sha512-h80JrZu/MHUZCyHu5ciuoI0+WxsCxzxJTILn6Fs8rxSnFPh+UVHYfeIxK1nVGugMqkfC4vJcBOYbkfkwYK0+gw==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", "dev": true, "license": "MIT", "engines": { @@ -9321,9 +9313,9 @@ } }, "node_modules/terser": { - "version": "5.38.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.38.2.tgz", - "integrity": "sha512-w8CXxxbFA5zfNsR/i8HZq5bvn18AK0O9jj7hyo1YqkovLxEFa0uP0LCVGZRqiRaKRFxXhELBp8SteeAjEnfeJg==", + "version": "5.39.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.39.0.tgz", + "integrity": "sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -9794,9 +9786,9 @@ } }, "node_modules/webpack": { - "version": "5.97.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.97.1.tgz", - "integrity": "sha512-EksG6gFY3L1eFMROS/7Wzgrii5mBAFe4rIr3r2BTfo7bcc+DWwFZ4OJ/miOuHJO/A85HwyI4eQ0F6IKXesO7Fg==", + "version": "5.98.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.98.0.tgz", + "integrity": "sha512-UFynvx+gM44Gv9qFgj0acCQK2VE1CtdfwFdimkapco3hlPCJ/zeq73n2yVKimVbtm+TnApIugGhLJnkU6gjYXA==", "dev": true, "license": "MIT", "dependencies": { @@ -9818,9 +9810,9 @@ "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^3.2.0", + "schema-utils": "^4.3.0", "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.10", + "terser-webpack-plugin": "^5.3.11", "watchpack": "^2.4.1", "webpack-sources": "^3.2.3" }, @@ -10131,16 +10123,54 @@ "source-map": "~0.6.1" } }, + "node_modules/webpack/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/webpack/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, "node_modules/webpack/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz", + "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==", "dev": true, "license": "MIT", "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" }, "engines": { "node": ">= 10.13.0" @@ -10253,9 +10283,9 @@ "license": "ISC" }, "node_modules/ws": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", - "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==", "dev": true, "license": "MIT", "engines": { diff --git a/package.json b/package.json index 4e5c6f38..8e81b152 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,7 @@ "laravel-mix": "^6.0.31", "postcss": "^8.4.35", "sass": "^1.85.0", - "sass-loader": "^14.1.0" + "sass-loader": "^16.0.5" }, "dependencies": { "bootstrap": "^5.3.3", From 8661fa72246797d8a8b4300c7efb765275ad3130 Mon Sep 17 00:00:00 2001 From: Kevin Woblick Date: Wed, 26 Feb 2025 09:22:51 +0100 Subject: [PATCH 38/61] 2.1.4 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 90e4d282..889e89b6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "linkace", - "version": "2.1.3", + "version": "2.1.4", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "linkace", - "version": "2.1.3", + "version": "2.1.4", "license": "GPL-3.0-or-later", "dependencies": { "bootstrap": "^5.3.3", diff --git a/package.json b/package.json index 8e81b152..424cd433 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "linkace", - "version": "2.1.3", + "version": "2.1.4", "description": "A small, selfhosted bookmark manager with advanced features, built with Laravel and Docker", "homepage": "https://github.com/Kovah/LinkAce", "repository": { From 662e26db71791e29f5bff3e769b776abe3653a1b Mon Sep 17 00:00:00 2001 From: Geoff Holden Date: Wed, 26 Feb 2025 15:34:36 -0330 Subject: [PATCH 39/61] Enable SSO logins through the bookmarklet. --- resources/views/app/bookmarklet/login.blade.php | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/resources/views/app/bookmarklet/login.blade.php b/resources/views/app/bookmarklet/login.blade.php index 38407888..c803432d 100644 --- a/resources/views/app/bookmarklet/login.blade.php +++ b/resources/views/app/bookmarklet/login.blade.php @@ -1,5 +1,10 @@ @extends('layouts.bookmarklet') @section('content') - @include('auth.login-form') + @if(config('auth.sso.regular_login_disabled') !== true) + @include('auth.login-form') + @endif + @if(config('auth.sso.enabled') === true) + @include('auth.oauth') + @endif @endsection From 2c1d58dd0a72015b662a71c521f44109499bcf7f Mon Sep 17 00:00:00 2001 From: Kevin Woblick Date: Thu, 27 Feb 2025 09:22:07 +0100 Subject: [PATCH 40/61] Add a support discussion template --- .github/DISCUSSION_TEMPLATE/support.yml | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 .github/DISCUSSION_TEMPLATE/support.yml diff --git a/.github/DISCUSSION_TEMPLATE/support.yml b/.github/DISCUSSION_TEMPLATE/support.yml new file mode 100644 index 00000000..4773fbc7 --- /dev/null +++ b/.github/DISCUSSION_TEMPLATE/support.yml @@ -0,0 +1,8 @@ +body: + - type: markdown + attributes: + value: | + ### Hi, thanks for using LinkAce! + Before starting to write this discussion, please follow the [**Troubleshooting Guide**](https://www.linkace.org/docs/v2/general/troubleshooting/) to find out more about your problem, as well as common issues encountered while running LinkAce. + ### Disclaimer + As written in the Readme of the project and on the website: I built LinkAce to solve my problem, and I now share my solution and code to your without charging anything. I spent a lot of my free time building this application already, so I won't offer any *free* personal support, customization or installation help. From a2690f7cd3d7f0fcb07ed8e7058dd778675919fd Mon Sep 17 00:00:00 2001 From: Kevin Woblick Date: Thu, 27 Feb 2025 09:26:36 +0100 Subject: [PATCH 41/61] Add a support discussion template --- .github/DISCUSSION_TEMPLATE/support.yml | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/.github/DISCUSSION_TEMPLATE/support.yml b/.github/DISCUSSION_TEMPLATE/support.yml index 4773fbc7..1b93d124 100644 --- a/.github/DISCUSSION_TEMPLATE/support.yml +++ b/.github/DISCUSSION_TEMPLATE/support.yml @@ -6,3 +6,16 @@ body: Before starting to write this discussion, please follow the [**Troubleshooting Guide**](https://www.linkace.org/docs/v2/general/troubleshooting/) to find out more about your problem, as well as common issues encountered while running LinkAce. ### Disclaimer As written in the Readme of the project and on the website: I built LinkAce to solve my problem, and I now share my solution and code to your without charging anything. I spent a lot of my free time building this application already, so I won't offer any *free* personal support, customization or installation help. + - type: textarea + id: issue + attributes: + label: Describe your issue + validations: + required: true + - type: checkboxes + attributes: + options: + - label: I have read the troubleshooting guide + required: true + - label: I have searched the community discussions for similar issues + required: true From c2dbb428af98eeca8c0859fe22c82305289e5d65 Mon Sep 17 00:00:00 2001 From: Kevin Woblick Date: Thu, 27 Feb 2025 09:35:10 +0100 Subject: [PATCH 42/61] Add a support discussion template --- .github/DISCUSSION_TEMPLATE/support.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/DISCUSSION_TEMPLATE/support.yml b/.github/DISCUSSION_TEMPLATE/support.yml index 1b93d124..47223e3b 100644 --- a/.github/DISCUSSION_TEMPLATE/support.yml +++ b/.github/DISCUSSION_TEMPLATE/support.yml @@ -13,6 +13,7 @@ body: validations: required: true - type: checkboxes + label: Troubleshooting attributes: options: - label: I have read the troubleshooting guide From 3bd115b4255d38134e9b37d4db5630301a42fd20 Mon Sep 17 00:00:00 2001 From: Kevin Woblick Date: Thu, 27 Feb 2025 09:36:22 +0100 Subject: [PATCH 43/61] Add a support discussion template --- .github/DISCUSSION_TEMPLATE/support.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/DISCUSSION_TEMPLATE/support.yml b/.github/DISCUSSION_TEMPLATE/support.yml index 47223e3b..eecfe4c1 100644 --- a/.github/DISCUSSION_TEMPLATE/support.yml +++ b/.github/DISCUSSION_TEMPLATE/support.yml @@ -13,8 +13,8 @@ body: validations: required: true - type: checkboxes - label: Troubleshooting attributes: + label: Troubleshooting options: - label: I have read the troubleshooting guide required: true From 92ae5221fbc98428c3ff5d8a7eb92ca26a599dea Mon Sep 17 00:00:00 2001 From: Kevin Woblick Date: Thu, 27 Feb 2025 09:38:55 +0100 Subject: [PATCH 44/61] Add a support discussion template --- .github/DISCUSSION_TEMPLATE/support.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/DISCUSSION_TEMPLATE/support.yml b/.github/DISCUSSION_TEMPLATE/support.yml index eecfe4c1..a06bdff4 100644 --- a/.github/DISCUSSION_TEMPLATE/support.yml +++ b/.github/DISCUSSION_TEMPLATE/support.yml @@ -6,6 +6,7 @@ body: Before starting to write this discussion, please follow the [**Troubleshooting Guide**](https://www.linkace.org/docs/v2/general/troubleshooting/) to find out more about your problem, as well as common issues encountered while running LinkAce. ### Disclaimer As written in the Readme of the project and on the website: I built LinkAce to solve my problem, and I now share my solution and code to your without charging anything. I spent a lot of my free time building this application already, so I won't offer any *free* personal support, customization or installation help. + ### Issue details - type: textarea id: issue attributes: @@ -14,7 +15,7 @@ body: required: true - type: checkboxes attributes: - label: Troubleshooting + label: Troubleshooting Steps options: - label: I have read the troubleshooting guide required: true From 0766fff8eec0d14e4191a25f357a55c46144091e Mon Sep 17 00:00:00 2001 From: Kevin Woblick Date: Mon, 17 Mar 2025 21:37:05 +0100 Subject: [PATCH 45/61] Migrate Postgres db dump to sql for easier setup --- database/schema/pgsql-schema.dump | Bin 35236 -> 0 bytes database/schema/pgsql-schema.sql | 1057 +++++++++++++++++++++++++++++ 2 files changed, 1057 insertions(+) delete mode 100644 database/schema/pgsql-schema.dump create mode 100644 database/schema/pgsql-schema.sql diff --git a/database/schema/pgsql-schema.dump b/database/schema/pgsql-schema.dump deleted file mode 100644 index b83b347f4bdf6f0071bc8a504227eb3f9c15cfaf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35236 zcmdsA33yz^ksb+xgF_$zLI@l1BVZ(bmc^VpAOvJ-YzymfbPzj)9Y)f#Ja{xC&y0Mq zECF*ZB*2$II6l|_;R*zH0kaE>ITnZ^TuBHJU=3M=4J@$0LLlJ^Y<2ZJdb+FMyg9_T zoB2MEXQr>JzmBf%u6|m&sJm}z-L8QhKVMf@7l7AJ>}?nJ_C@x#D|?&8-cDd|_+nqv zsm!Y6m>Jj)K8K<$?M7p_Ihsml4EAMysAXzmd?FMM&I>gKKF6zs!ht+%eiQb~KC$tF z*8At-bG*N6pu4AkQK0BcJ*&!w8Hx`ZW9gKcDJ0CySav*>nJ^AB8b*c}wl^F)8>!d6 zArUK*>AZt>Rg*-$n#+&wfr2;>X}q_0R(BdY=wWOI{1 zRU%)=!GC#1T{crWZMW!Yi+2uoEneC=yqMGGenr~ak+$A=*RU})kr+!BlIiS3OWrIX zk*SHshP;`~jjc>fB?~JXnvDkdhu}0-jN?X!)*WH+P`EYB<=z@;kD~tA3d3aE-8tO3 zpmQi5Kx&VMU%Ce4ox^d%E-##7aPOzzNNja_%NejPEMth1v6;a%HpVi(L2!9 z*~=<5n3=@LP|I{-1yhW`SJ{Yz151_OX=aP4Wx7kL&2#WOe{ptW9TvOMXb?Z8Q~5$3 zKLM+~7N>`U##@}?ug28$XgW34f|ZTN*#^8)<3=h|Fel8M(LXS3^pEuRHe9HIW=xCHsqu2EkDF=JSMReyJp*3@*io7) zf|fkdg>htE5v??nQ@$j-#gc0vAWJsV5%@9`f;pKJ*<8xZgESI(b2YlFq4>8)KqW0f zp9%FWLE8nktd-^{+|D6e>iBhNxN~rrD}M-o=;?><`r`e=#)9Pr|EYh#=YfEj&FGPfQg z!^TiYsL3%6K52T`XtKbt^sG198H^S=BA?x zVQQBvpvmqH%&R8LSXZ^qMb@{izQ)_YyCRSvx>Gii-bf43P-CP*!x^y7Z@|E$bqd3( z0Qoe_n54D;N}45`Y=qG;HgRT2dotwH=%G-Rwnw1@#SmFp)fO0)czF{@;V)U>u^_Hx zSmd7|qvr&)qwLUaVOb;oppBGS-&7op>dw}gs=B))s4{h#@vZd#!P~&Qgh4bC4eSg* z<9LPSgc3m<1BF@$SOZ@OKt(M8`@#qs09gMu;r|aX27k%?gATA27vo>y{blXq2`amO zSoUJplEicIG@VORu~8vaNR#o@U(=$BZhGkp}l6>5nJNC zGovfJ1Aq{68WPD+A@es6g~O8XzKxuR*j}MHoYzEj7}TXFBC!W$Cc?sMr=oC3V&`{2 z41Y;(DAEzZsc14akxR10mg0-ffOeE0c3YHkNKQ?S)k$_Wnkifi}; z#s@E~pECVf9Ip>iq_h!(Hs>tPi#8!i{#51RFfpIwJ7WAV-Ui+!R}~9J0=vP_?$9~d z&Q<)?`B23hRBUF!$v%HZKspnc21q2UCJ=4~2>45aFxtw4&P=wT0=GyLbYkUFKHhuB zo=s|cl-U4OO!`;1bB{>YM8f}R3s^RiD4fo)Cp6-`tpww(Ey$uSCNId5%x zi)5&f`Hbr175TrBlahj$$9A7SsuKxTrXnn?b`}apq^Ry`trmoX=qjg@`TW`}9N4mL zGxdz_Mpp}pe3I16vVC)sEnMh@lN7=gva3wp8cV7wY|43`x8Y>usEZf9s=9ET%9@6@ zYq4$Xz}-4`B37oL_jI_rp+G5rif5d@u%4J^C-VO5`v%B+B!hxjWgz2<+mAi74+__&3VWT5eKpEtlasJpGzTw=Tt5*4fS}ih`&SRW)!K_Prv1nYV#=38!d# zE1qGnk(D6mEe~Kyo?-Y8XZ}xxKXk$t!c!ATyrh>z43~X4l-`$}>dHipGQ^fM@5h`t z-ir(sGJj!CMBa{0Cs_Z$_%mev$TrX&WYVE-Fu|1mJVuaHV zSyiRRGjB8p*@%^(M8(dZ-Gt>7qPs}DVSBI=?_Q?U1=Z=PU+P4$9=p711Cou=8(J;zMC{=mRTi?=4HtG%qpP+#fVv1wFVrL9nXO3mpn7Q?E69=-0ggVKol%5Aj7sdF1j-^pns!ecxC@VO4N~=RbeuRQU z>79s2EG@R2c`u@krA0DS$o$0wA^8a99@34lSXvy;%a7<|X|V^zkzirfoR7jg%oYLuY?yvtb{P0Z#o6dczDA@>Vf{=<@U7wkHUc}j~WWP8p6q*$IU3FD{-jMzx##|u9p(^mqnRT{JY#r6)IgmIIXM9|BUd8@L}WBbK4a+;Zh9-|hP9Ic7*X z))v7{7<>PY1nxKw)pHt_gPq-ohVKw*IBO2E8_kH`!Db@rTi6PhmHpLUX%Pg2XW=s2 zJR#BZ3YW1_ImijyH`4T>375$cYN2x>3#pLh_moYn2epWW_?(NYL=rMDOXaP~!AxAL zN}y>hl^&xes9AF@oLY1LCeOJyur)hue%X(qVfW713Rk_w&z}CmJu`be33ey!6C4et zT?0$W^=)HnyxD-8Ro0#TW&`g7HyhSn-)6(Peb1i1g3k>|7MhHOg9Cl=Tp4)44J>Qf z^LV&n3WG8`U`q}51Rh2>KB9y(YF+BC-*6iI&R*BkjEWbYy*V6%PDBoIVTi2B?ARBT zn+@Sga(4g;Du=kCAK?X6+YFn%~KBQ_c$Fy%3ePr*(Pq= zdGpS~7STS1H7}}(^S#-?YjahyVcp`Y587;8L$cw0$;q3eVVNWPu9Lg6LMw1@G&LLc zZKW!Cjqr4^`U6;21bbae@~XRaPng^;zEKqLqjq{;=Kem>2P=Irq+o}i8D-<42G>K^+KD$^JoT@ zTy1amFlR@YFx=e*R9O3~lbFpyIGzQLKNU^CkW<}kIQi0mjGZPuLy%bcxAnK$ko=s4 z#4|(H8=Zxc@X-@VNv=kt09JPXZH) zoM%z=Q*n9)EIsY4ifSRU=F&54i2j{HgfF&-U_Zr{W&10~U%2P&q$k1|EiTjpM?l@7 zIPs8H@zh)C44%{)q8`>-_CA5~WW#$&jx-N{V_QxtOPzjL5)R}c*kcdStQk+r^WN?w zd6J);MKi;e871W-o~qYMG7)*J>VA?7Ml}mB?Y(i0nlYzYk`1w+nn^=>;L0yaKIq3^ z&@wr~4>QjC&qf9~3Wvc>_EG*~UJV^3HUecmDI^2)4*->)M`B83W{fgv=k&eq}%a>N8YhpjO z(>3{~#zQ0@R02IM7Iy4h(xKU*p*zDwYT*FFa@PFABr|dXG0ljt35G?8E)%se6(x1} z5t0i=wRogcjcSSg)J(NPvKxDak&Le$;T;ke`Bl77Yc$%9Paxvkq(V?N1&alI)>qd+ zKRoTfv!{O;FFOR-b^t&7Qd1bQ7oNk~-EFun4XI;e>0nP^=iqWfu;pgJt|+%f_an-Nw8a%3EV=C|q})*b`is*YukB z-6s>eo#j=TXbGxRJdoeQj6UrCFQqE~St~9`n>w&aT(~e21jQFhTIcZhzC?tbcnilJ zr`Tbz-#rE5<(^!DVD}!PaEGs02v&A!#Q9$m!s|LAL|eHx=7*|$7eouV7rWS$g4yk} z7+mgKyu2}|NsiOq{whVwI4?J4Dbyn86)QQd72KSXs!&s& zZ}foJ^?)?5G0J zQBbJ{N36V6>sZ+J1#jzQ672}_$94fJc@%<&277r*#xNPTVgZ3`X-|nQNzkf`Ta~=~ zH?-)qwFUM9RkJq)4f}&$Gg&s4E)cg{Q`%^kX^}d@N5=|SMZH$4RZ5oqHZ5MDfV%>n zxR!KQVWb83da%P(3vGUo&9^i03_CHM zNkJYoiIA5jVHXrcYTw34e-He1K`W<<1>9b<1*cGkO6|2`%;e+At$NJb&@*w0I0Y5O zaM)Cj73-7IC$AWe(?p}h`l}f_9~Yq$3Oj!(GzNc9lAT83{u^e}CsLVla~&r1_w;wi zm+_rwCTr`#EcmM-H!ueJ?aTG7$QT)dKU!;y7ILO(G-Ah0W!Q=a+2x&BcYWl(DrGw& z?*YD}V>{Xr3mgozxXTcCdd?^8JXY%iTVT?toGhbKW`6=`WXoa{ZL;KrZx;zF*`c1b ziZORqxYDBPJstKjI1p(n!k$m9v&3wt4)fGG&}WE)z?M3#PAhk ztXsIgpu;!{w|xHwh_y4Dtc2JEpDaiVXHjU8g?qFWaFl8lYb*}O?4H@03Y^qdq^?q^ ztjt_DVtq~vQLsG_0i+g}HBfG>&aOG}AfYYua zIZ*p&Ck?jf2YUxBPNHmA^-WI2*z0cb);TA;@`)%s*?^^NxE3V1VPUIF_*M9;EwGMC zz#ls|Qxh3H>{+-(I0og@*4@y#E{Y}xrRI0CB29;}a9}Xrv#6gRwz^~ksZGXUd|@2^ zFl|?S$etf!E{)He_1Rj!Fw6>tD;A*j&EM)y4F3u zNW{L;Z6%Pqc37{|ff($86i>z6A-hy_ugcziNc?hNaAB9;vL;6@majz;C0T5(mFaT- zM0!Y*q_6@BGNS~^*=v4#vXP(Fx`S4Na4DE&6d)YZhKXiB#<|wuL!x(jfJF^SiIuAN znOShEOa>H@`=`DF=`#}z!;YGz1$HVBR6 z#|_6W zyK>LQy3Oxwd7)!d;iT90J%7&D@%$&}TzBm&8|R(Teb16(fAY-T55BYS+oPLy-($_{ zix&ND!zX)BEZcJV$}cURS6A40?z}%`cUgVHKcx@4{lmI>f7~!@&YQEAeSgD|dv82t z|CWL5u^UgGzo75(otD30EN}kS_s$(TdPP&}%(E`tXKvG5>t8$k+HI#j_hHLUyDz@E zsd4r3`<{Q*9qoIc6L@2L(>a@tUi`r~n&QT)?l-U76#ekg$^BL>X{pXMY%b?27BwEt~(vJ8s%@d)Mlw+c&gMw++m@Y;x^o z*RGx3bp5mYUOn&DE3W+dUt)J%|MG^8W4E4u<`tV)o^-bJmfWO&@ Date: Mon, 17 Mar 2025 21:37:26 +0100 Subject: [PATCH 46/61] Optimize the setup:complete and registeruser commands --- app/Console/Commands/CompleteSetupCommand.php | 4 ++-- app/Console/Commands/RegisterUserCommand.php | 9 ++++++++- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/app/Console/Commands/CompleteSetupCommand.php b/app/Console/Commands/CompleteSetupCommand.php index cdca3f4f..fd945e26 100644 --- a/app/Console/Commands/CompleteSetupCommand.php +++ b/app/Console/Commands/CompleteSetupCommand.php @@ -24,7 +24,7 @@ public function handle(SystemSettings $settings): void return; } - $this->info('Successfully marked the setup as completed. You can now visit the web interface.'); - $this->line('Hint: If you install LinkAce with PostgreSQL or SQLite, use the registeruser command now.'); + $this->info('Successfully marked the setup as completed.'); + $this->info('Use the php artisan registeruser --admin command now to create your first admin user.'); } } diff --git a/app/Console/Commands/RegisterUserCommand.php b/app/Console/Commands/RegisterUserCommand.php index f40f4eae..792eee2c 100644 --- a/app/Console/Commands/RegisterUserCommand.php +++ b/app/Console/Commands/RegisterUserCommand.php @@ -4,6 +4,7 @@ use App\Actions\Fortify\CreateNewUser; use App\Enums\Role; +use App\Models\User; use Illuminate\Console\Command; use Illuminate\Validation\ValidationException; @@ -19,6 +20,11 @@ class RegisterUserCommand extends Command public function handle(): void { + if ($this->option('admin') === false && User::query()->count() <= 1) { + $this->warn('It seems you are creating the first user. This user should be an admin!'); + $this->warn('Please consider running the command with --admin again.'); + } + $this->userName = $this->argument('name'); $this->userEmail = $this->argument('email'); @@ -52,7 +58,8 @@ public function handle(): void protected function askForUserDetails(): void { if (empty($this->userName) || $this->validationFailed) { - $this->userName = $this->ask('Please enter the user name containing only alpha-numeric characters, dashes or underscores', $this->userName); + $this->userName = $this->ask('Please enter the user name containing only alpha-numeric characters, dashes or underscores', + $this->userName); } if (empty($this->userEmail) || $this->validationFailed) { From 5f9640bc6765d130f8a65d14b0c27054a774374d Mon Sep 17 00:00:00 2001 From: Kevin Woblick Date: Mon, 17 Mar 2025 22:25:48 +0100 Subject: [PATCH 47/61] php style fix --- app/Console/Commands/RegisterUserCommand.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/app/Console/Commands/RegisterUserCommand.php b/app/Console/Commands/RegisterUserCommand.php index 792eee2c..d06583c9 100644 --- a/app/Console/Commands/RegisterUserCommand.php +++ b/app/Console/Commands/RegisterUserCommand.php @@ -58,8 +58,10 @@ public function handle(): void protected function askForUserDetails(): void { if (empty($this->userName) || $this->validationFailed) { - $this->userName = $this->ask('Please enter the user name containing only alpha-numeric characters, dashes or underscores', - $this->userName); + $this->userName = $this->ask( + 'Please enter the user name containing only alpha-numeric characters, dashes or underscores', + $this->userName + ); } if (empty($this->userEmail) || $this->validationFailed) { From 61b870ab573a83838955f727b5e5d851855dffd7 Mon Sep 17 00:00:00 2001 From: Kevin Woblick Date: Mon, 17 Mar 2025 23:14:37 +0100 Subject: [PATCH 48/61] Update dependencies --- composer.lock | 363 +++++++++++++++++++++++----------------------- package-lock.json | 194 ++++++++++++------------- 2 files changed, 268 insertions(+), 289 deletions(-) diff --git a/composer.lock b/composer.lock index 3a5571c1..4ac23d8f 100644 --- a/composer.lock +++ b/composer.lock @@ -62,16 +62,16 @@ }, { "name": "aws/aws-sdk-php", - "version": "3.340.1", + "version": "3.342.7", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "414b84a625c239b3cbfa132b8d522c579a7eb75c" + "reference": "4d42e384dac1e71107226ed72ed5e8e4d4ee3358" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/414b84a625c239b3cbfa132b8d522c579a7eb75c", - "reference": "414b84a625c239b3cbfa132b8d522c579a7eb75c", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/4d42e384dac1e71107226ed72ed5e8e4d4ee3358", + "reference": "4d42e384dac1e71107226ed72ed5e8e4d4ee3358", "shasum": "" }, "require": { @@ -153,9 +153,9 @@ "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.340.1" + "source": "https://github.com/aws/aws-sdk-php/tree/3.342.7" }, - "time": "2025-02-25T19:14:47+00:00" + "time": "2025-03-17T18:18:04+00:00" }, { "name": "bacon/bacon-qr-code", @@ -213,16 +213,16 @@ }, { "name": "brick/math", - "version": "0.12.1", + "version": "0.12.3", "source": { "type": "git", "url": "https://github.com/brick/math.git", - "reference": "f510c0a40911935b77b86859eb5223d58d660df1" + "reference": "866551da34e9a618e64a819ee1e01c20d8a588ba" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/brick/math/zipball/f510c0a40911935b77b86859eb5223d58d660df1", - "reference": "f510c0a40911935b77b86859eb5223d58d660df1", + "url": "https://api.github.com/repos/brick/math/zipball/866551da34e9a618e64a819ee1e01c20d8a588ba", + "reference": "866551da34e9a618e64a819ee1e01c20d8a588ba", "shasum": "" }, "require": { @@ -231,7 +231,7 @@ "require-dev": { "php-coveralls/php-coveralls": "^2.2", "phpunit/phpunit": "^10.1", - "vimeo/psalm": "5.16.0" + "vimeo/psalm": "6.8.8" }, "type": "library", "autoload": { @@ -261,7 +261,7 @@ ], "support": { "issues": "https://github.com/brick/math/issues", - "source": "https://github.com/brick/math/tree/0.12.1" + "source": "https://github.com/brick/math/tree/0.12.3" }, "funding": [ { @@ -269,7 +269,7 @@ "type": "github" } ], - "time": "2023-11-29T23:19:16+00:00" + "time": "2025-02-28T13:11:00+00:00" }, { "name": "carbonphp/carbon-doctrine-types", @@ -2116,16 +2116,16 @@ }, { "name": "laravel/framework", - "version": "v10.48.28", + "version": "v10.48.29", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "e714e7e0c1ae51bf747e3df5b10fa60c54e3e0e1" + "reference": "8f7f9247cb8aad1a769d6b9815a6623d89b46b47" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/e714e7e0c1ae51bf747e3df5b10fa60c54e3e0e1", - "reference": "e714e7e0c1ae51bf747e3df5b10fa60c54e3e0e1", + "url": "https://api.github.com/repos/laravel/framework/zipball/8f7f9247cb8aad1a769d6b9815a6623d89b46b47", + "reference": "8f7f9247cb8aad1a769d6b9815a6623d89b46b47", "shasum": "" }, "require": { @@ -2319,7 +2319,7 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2025-01-31T10:04:17+00:00" + "time": "2025-03-12T14:42:01+00:00" }, { "name": "laravel/prompts", @@ -2769,16 +2769,16 @@ }, { "name": "league/csv", - "version": "9.21.0", + "version": "9.22.0", "source": { "type": "git", "url": "https://github.com/thephpleague/csv.git", - "reference": "72196d11ebba22d868954cb39c0c7346207430cc" + "reference": "afc109aa11f3086b8be8dfffa04ac31480b36b76" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/csv/zipball/72196d11ebba22d868954cb39c0c7346207430cc", - "reference": "72196d11ebba22d868954cb39c0c7346207430cc", + "url": "https://api.github.com/repos/thephpleague/csv/zipball/afc109aa11f3086b8be8dfffa04ac31480b36b76", + "reference": "afc109aa11f3086b8be8dfffa04ac31480b36b76", "shasum": "" }, "require": { @@ -2788,19 +2788,23 @@ "require-dev": { "ext-dom": "*", "ext-xdebug": "*", - "friendsofphp/php-cs-fixer": "^3.64.0", - "phpbench/phpbench": "^1.3.1", - "phpstan/phpstan": "^1.12.11", + "friendsofphp/php-cs-fixer": "^3.69.0", + "phpbench/phpbench": "^1.4.0", + "phpstan/phpstan": "^1.12.18", "phpstan/phpstan-deprecation-rules": "^1.2.1", - "phpstan/phpstan-phpunit": "^1.4.1", - "phpstan/phpstan-strict-rules": "^1.6.1", - "phpunit/phpunit": "^10.5.16 || ^11.4.3", - "symfony/var-dumper": "^6.4.8 || ^7.1.8" + "phpstan/phpstan-phpunit": "^1.4.2", + "phpstan/phpstan-strict-rules": "^1.6.2", + "phpunit/phpunit": "^10.5.16 || ^11.5.7", + "symfony/var-dumper": "^6.4.8 || ^7.2.3" }, "suggest": { "ext-dom": "Required to use the XMLConverter and the HTMLConverter classes", "ext-iconv": "Needed to ease transcoding CSV using iconv stream filters", - "ext-mbstring": "Needed to ease transcoding CSV using mb stream filters" + "ext-mbstring": "Needed to ease transcoding CSV using mb stream filters", + "ext-mysqli": "Requiered to use the package with the MySQLi extension", + "ext-pdo": "Required to use the package with the PDO extension", + "ext-pgsql": "Requiered to use the package with the PgSQL extension", + "ext-sqlite3": "Required to use the package with the SQLite3 extension" }, "type": "library", "extra": { @@ -2813,7 +2817,7 @@ "src/functions_include.php" ], "psr-4": { - "League\\Csv\\": "src/" + "League\\Csv\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -2852,7 +2856,7 @@ "type": "github" } ], - "time": "2025-01-08T19:27:58+00:00" + "time": "2025-02-28T10:00:39+00:00" }, { "name": "league/flysystem", @@ -5094,16 +5098,16 @@ }, { "name": "ramsey/collection", - "version": "2.0.0", + "version": "2.1.0", "source": { "type": "git", "url": "https://github.com/ramsey/collection.git", - "reference": "a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5" + "reference": "3c5990b8a5e0b79cd1cf11c2dc1229e58e93f109" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ramsey/collection/zipball/a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5", - "reference": "a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5", + "url": "https://api.github.com/repos/ramsey/collection/zipball/3c5990b8a5e0b79cd1cf11c2dc1229e58e93f109", + "reference": "3c5990b8a5e0b79cd1cf11c2dc1229e58e93f109", "shasum": "" }, "require": { @@ -5111,25 +5115,22 @@ }, "require-dev": { "captainhook/plugin-composer": "^5.3", - "ergebnis/composer-normalize": "^2.28.3", - "fakerphp/faker": "^1.21", + "ergebnis/composer-normalize": "^2.45", + "fakerphp/faker": "^1.24", "hamcrest/hamcrest-php": "^2.0", - "jangregor/phpstan-prophecy": "^1.0", - "mockery/mockery": "^1.5", + "jangregor/phpstan-prophecy": "^2.1", + "mockery/mockery": "^1.6", "php-parallel-lint/php-console-highlighter": "^1.0", - "php-parallel-lint/php-parallel-lint": "^1.3", - "phpcsstandards/phpcsutils": "^1.0.0-rc1", - "phpspec/prophecy-phpunit": "^2.0", - "phpstan/extension-installer": "^1.2", - "phpstan/phpstan": "^1.9", - "phpstan/phpstan-mockery": "^1.1", - "phpstan/phpstan-phpunit": "^1.3", - "phpunit/phpunit": "^9.5", - "psalm/plugin-mockery": "^1.1", - "psalm/plugin-phpunit": "^0.18.4", - "ramsey/coding-standard": "^2.0.3", - "ramsey/conventional-commits": "^1.3", - "vimeo/psalm": "^5.4" + "php-parallel-lint/php-parallel-lint": "^1.4", + "phpspec/prophecy-phpunit": "^2.3", + "phpstan/extension-installer": "^1.4", + "phpstan/phpstan": "^2.1", + "phpstan/phpstan-mockery": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpunit/phpunit": "^10.5", + "ramsey/coding-standard": "^2.3", + "ramsey/conventional-commits": "^1.6", + "roave/security-advisories": "dev-latest" }, "type": "library", "extra": { @@ -5167,19 +5168,9 @@ ], "support": { "issues": "https://github.com/ramsey/collection/issues", - "source": "https://github.com/ramsey/collection/tree/2.0.0" + "source": "https://github.com/ramsey/collection/tree/2.1.0" }, - "funding": [ - { - "url": "https://github.com/ramsey", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/ramsey/collection", - "type": "tidelift" - } - ], - "time": "2022-12-31T21:50:55+00:00" + "time": "2025-03-02T04:48:29+00:00" }, { "name": "ramsey/uuid", @@ -5275,25 +5266,25 @@ }, { "name": "rap2hpoutre/laravel-log-viewer", - "version": "v2.4.0", + "version": "v2.5.0", "source": { "type": "git", "url": "https://github.com/rap2hpoutre/laravel-log-viewer.git", - "reference": "49c52ae197b3d4f7f9e43d328628edc4bc529afa" + "reference": "ab85d5d88de728b99a9391a0c70e9b2f5743a589" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/rap2hpoutre/laravel-log-viewer/zipball/49c52ae197b3d4f7f9e43d328628edc4bc529afa", - "reference": "49c52ae197b3d4f7f9e43d328628edc4bc529afa", + "url": "https://api.github.com/repos/rap2hpoutre/laravel-log-viewer/zipball/ab85d5d88de728b99a9391a0c70e9b2f5743a589", + "reference": "ab85d5d88de728b99a9391a0c70e9b2f5743a589", "shasum": "" }, "require": { - "illuminate/support": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0", + "illuminate/support": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0", "php": "^7.2|^8.0" }, "require-dev": { - "orchestra/testbench": "^4.0|^5.0|^6.0|^7.0|^8.0|^9.0", - "phpunit/phpunit": "^7||^8.4|^9.3.3|^10.1" + "orchestra/testbench": "^4.0|^5.0|^6.0|^7.0|^8.0|^9.0|^10.0", + "phpunit/phpunit": "^7||^8.4|^9.3.3|^10.1|^11.0" }, "type": "laravel-package", "extra": { @@ -5332,9 +5323,9 @@ ], "support": { "issues": "https://github.com/rap2hpoutre/laravel-log-viewer/issues", - "source": "https://github.com/rap2hpoutre/laravel-log-viewer/tree/v2.4.0" + "source": "https://github.com/rap2hpoutre/laravel-log-viewer/tree/v2.5.0" }, - "time": "2024-03-20T08:49:53+00:00" + "time": "2025-03-10T15:35:06+00:00" }, { "name": "sentry/sentry", @@ -6361,16 +6352,16 @@ }, { "name": "spatie/laravel-permission", - "version": "6.15.0", + "version": "6.16.0", "source": { "type": "git", "url": "https://github.com/spatie/laravel-permission.git", - "reference": "86074fcfd127f9fa7bcdf550b7c938e3beb0d65f" + "reference": "4fa03c06509e037a4d42c131d0f181e3e4bbd483" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-permission/zipball/86074fcfd127f9fa7bcdf550b7c938e3beb0d65f", - "reference": "86074fcfd127f9fa7bcdf550b7c938e3beb0d65f", + "url": "https://api.github.com/repos/spatie/laravel-permission/zipball/4fa03c06509e037a4d42c131d0f181e3e4bbd483", + "reference": "4fa03c06509e037a4d42c131d0f181e3e4bbd483", "shasum": "" }, "require": { @@ -6432,7 +6423,7 @@ ], "support": { "issues": "https://github.com/spatie/laravel-permission/issues", - "source": "https://github.com/spatie/laravel-permission/tree/6.15.0" + "source": "https://github.com/spatie/laravel-permission/tree/6.16.0" }, "funding": [ { @@ -6440,7 +6431,7 @@ "type": "github" } ], - "time": "2025-02-17T19:18:01+00:00" + "time": "2025-02-28T20:29:57+00:00" }, { "name": "spatie/laravel-settings", @@ -6892,16 +6883,16 @@ }, { "name": "symfony/error-handler", - "version": "v6.4.18", + "version": "v6.4.19", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "e8d3b5b1975e67812a54388b1ba8e9ec28eb770e" + "reference": "3d4e55cd2b8f1979a65eba9ab749d6466c316f71" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/e8d3b5b1975e67812a54388b1ba8e9ec28eb770e", - "reference": "e8d3b5b1975e67812a54388b1ba8e9ec28eb770e", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/3d4e55cd2b8f1979a65eba9ab749d6466c316f71", + "reference": "3d4e55cd2b8f1979a65eba9ab749d6466c316f71", "shasum": "" }, "require": { @@ -6947,7 +6938,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/v6.4.18" + "source": "https://github.com/symfony/error-handler/tree/v6.4.19" }, "funding": [ { @@ -6963,7 +6954,7 @@ "type": "tidelift" } ], - "time": "2025-01-06T09:38:16+00:00" + "time": "2025-02-02T20:16:33+00:00" }, { "name": "symfony/event-dispatcher", @@ -7187,16 +7178,16 @@ }, { "name": "symfony/http-client", - "version": "v6.4.18", + "version": "v6.4.19", "source": { "type": "git", "url": "https://github.com/symfony/http-client.git", - "reference": "394b440934056b8d9d6ba250001458e9d7998b7f" + "reference": "3294a433fc9d12ae58128174896b5b1822c28dad" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client/zipball/394b440934056b8d9d6ba250001458e9d7998b7f", - "reference": "394b440934056b8d9d6ba250001458e9d7998b7f", + "url": "https://api.github.com/repos/symfony/http-client/zipball/3294a433fc9d12ae58128174896b5b1822c28dad", + "reference": "3294a433fc9d12ae58128174896b5b1822c28dad", "shasum": "" }, "require": { @@ -7260,7 +7251,7 @@ "http" ], "support": { - "source": "https://github.com/symfony/http-client/tree/v6.4.18" + "source": "https://github.com/symfony/http-client/tree/v6.4.19" }, "funding": [ { @@ -7276,7 +7267,7 @@ "type": "tidelift" } ], - "time": "2025-01-28T15:49:13+00:00" + "time": "2025-02-13T09:55:13+00:00" }, { "name": "symfony/http-client-contracts", @@ -7435,16 +7426,16 @@ }, { "name": "symfony/http-kernel", - "version": "v6.4.18", + "version": "v6.4.19", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "fca7197bfe9e99dfae7fb1ad3f7f5bd9ef80e1b7" + "reference": "88f2c9f7feff86bb7b9105c5151bc2c1404cd64c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/fca7197bfe9e99dfae7fb1ad3f7f5bd9ef80e1b7", - "reference": "fca7197bfe9e99dfae7fb1ad3f7f5bd9ef80e1b7", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/88f2c9f7feff86bb7b9105c5151bc2c1404cd64c", + "reference": "88f2c9f7feff86bb7b9105c5151bc2c1404cd64c", "shasum": "" }, "require": { @@ -7529,7 +7520,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/v6.4.18" + "source": "https://github.com/symfony/http-kernel/tree/v6.4.19" }, "funding": [ { @@ -7545,7 +7536,7 @@ "type": "tidelift" } ], - "time": "2025-01-29T07:25:58+00:00" + "time": "2025-02-26T10:51:37+00:00" }, { "name": "symfony/mailer", @@ -7698,16 +7689,16 @@ }, { "name": "symfony/mime", - "version": "v6.4.18", + "version": "v6.4.19", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "917d77981eb1ea963608d5cda4d9c0cf72eaa68e" + "reference": "ac537b6c55ccc2c749f3c979edfa9ec14aaed4f3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/917d77981eb1ea963608d5cda4d9c0cf72eaa68e", - "reference": "917d77981eb1ea963608d5cda4d9c0cf72eaa68e", + "url": "https://api.github.com/repos/symfony/mime/zipball/ac537b6c55ccc2c749f3c979edfa9ec14aaed4f3", + "reference": "ac537b6c55ccc2c749f3c979edfa9ec14aaed4f3", "shasum": "" }, "require": { @@ -7763,7 +7754,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v6.4.18" + "source": "https://github.com/symfony/mime/tree/v6.4.19" }, "funding": [ { @@ -7779,7 +7770,7 @@ "type": "tidelift" } ], - "time": "2025-01-23T13:10:52+00:00" + "time": "2025-02-17T21:23:52+00:00" }, { "name": "symfony/options-resolver", @@ -8486,16 +8477,16 @@ }, { "name": "symfony/process", - "version": "v6.4.15", + "version": "v6.4.19", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "3cb242f059c14ae08591c5c4087d1fe443564392" + "reference": "7a1c12e87b08ec9c97abdd188c9b3f5a40e37fc3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/3cb242f059c14ae08591c5c4087d1fe443564392", - "reference": "3cb242f059c14ae08591c5c4087d1fe443564392", + "url": "https://api.github.com/repos/symfony/process/zipball/7a1c12e87b08ec9c97abdd188c9b3f5a40e37fc3", + "reference": "7a1c12e87b08ec9c97abdd188c9b3f5a40e37fc3", "shasum": "" }, "require": { @@ -8527,7 +8518,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v6.4.15" + "source": "https://github.com/symfony/process/tree/v6.4.19" }, "funding": [ { @@ -8543,7 +8534,7 @@ "type": "tidelift" } ], - "time": "2024-11-06T14:19:14+00:00" + "time": "2025-02-04T13:35:48+00:00" }, { "name": "symfony/psr-http-message-bridge", @@ -8882,16 +8873,16 @@ }, { "name": "symfony/translation", - "version": "v6.4.13", + "version": "v6.4.19", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "bee9bfabfa8b4045a66bf82520e492cddbaffa66" + "reference": "3b9bf9f33997c064885a7bfc126c14b9daa0e00e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/bee9bfabfa8b4045a66bf82520e492cddbaffa66", - "reference": "bee9bfabfa8b4045a66bf82520e492cddbaffa66", + "url": "https://api.github.com/repos/symfony/translation/zipball/3b9bf9f33997c064885a7bfc126c14b9daa0e00e", + "reference": "3b9bf9f33997c064885a7bfc126c14b9daa0e00e", "shasum": "" }, "require": { @@ -8957,7 +8948,7 @@ "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/translation/tree/v6.4.13" + "source": "https://github.com/symfony/translation/tree/v6.4.19" }, "funding": [ { @@ -8973,7 +8964,7 @@ "type": "tidelift" } ], - "time": "2024-09-27T18:14:25+00:00" + "time": "2025-02-13T10:18:43+00:00" }, { "name": "symfony/translation-contracts", @@ -9936,16 +9927,16 @@ }, { "name": "filp/whoops", - "version": "2.17.0", + "version": "2.18.0", "source": { "type": "git", "url": "https://github.com/filp/whoops.git", - "reference": "075bc0c26631110584175de6523ab3f1652eb28e" + "reference": "a7de6c3c6c3c022f5cfc337f8ede6a14460cf77e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filp/whoops/zipball/075bc0c26631110584175de6523ab3f1652eb28e", - "reference": "075bc0c26631110584175de6523ab3f1652eb28e", + "url": "https://api.github.com/repos/filp/whoops/zipball/a7de6c3c6c3c022f5cfc337f8ede6a14460cf77e", + "reference": "a7de6c3c6c3c022f5cfc337f8ede6a14460cf77e", "shasum": "" }, "require": { @@ -9995,7 +9986,7 @@ ], "support": { "issues": "https://github.com/filp/whoops/issues", - "source": "https://github.com/filp/whoops/tree/2.17.0" + "source": "https://github.com/filp/whoops/tree/2.18.0" }, "funding": [ { @@ -10003,7 +9994,7 @@ "type": "github" } ], - "time": "2025-01-25T12:00:00+00:00" + "time": "2025-03-15T12:00:00+00:00" }, { "name": "hamcrest/hamcrest-php", @@ -10325,40 +10316,40 @@ }, { "name": "nunomaduro/collision", - "version": "v7.11.0", + "version": "v7.12.0", "source": { "type": "git", "url": "https://github.com/nunomaduro/collision.git", - "reference": "994ea93df5d4132f69d3f1bd74730509df6e8a05" + "reference": "995245421d3d7593a6960822063bdba4f5d7cf1a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nunomaduro/collision/zipball/994ea93df5d4132f69d3f1bd74730509df6e8a05", - "reference": "994ea93df5d4132f69d3f1bd74730509df6e8a05", + "url": "https://api.github.com/repos/nunomaduro/collision/zipball/995245421d3d7593a6960822063bdba4f5d7cf1a", + "reference": "995245421d3d7593a6960822063bdba4f5d7cf1a", "shasum": "" }, "require": { - "filp/whoops": "^2.16.0", - "nunomaduro/termwind": "^1.15.1", + "filp/whoops": "^2.17.0", + "nunomaduro/termwind": "^1.17.0", "php": "^8.1.0", - "symfony/console": "^6.4.12" + "symfony/console": "^6.4.17" }, "conflict": { "laravel/framework": ">=11.0.0" }, "require-dev": { - "brianium/paratest": "^7.3.1", - "laravel/framework": "^10.48.22", - "laravel/pint": "^1.18.1", - "laravel/sail": "^1.36.0", + "brianium/paratest": "^7.4.8", + "laravel/framework": "^10.48.29", + "laravel/pint": "^1.21.2", + "laravel/sail": "^1.41.0", "laravel/sanctum": "^3.3.3", - "laravel/tinker": "^2.10.0", - "nunomaduro/larastan": "^2.9.8", - "orchestra/testbench-core": "^8.28.3", - "pestphp/pest": "^2.35.1", + "laravel/tinker": "^2.10.1", + "nunomaduro/larastan": "^2.10.0", + "orchestra/testbench-core": "^8.35.0", + "pestphp/pest": "^2.36.0", "phpunit/phpunit": "^10.5.36", "sebastian/environment": "^6.1.0", - "spatie/laravel-ignition": "^2.8.0" + "spatie/laravel-ignition": "^2.9.1" }, "type": "library", "extra": { @@ -10417,7 +10408,7 @@ "type": "patreon" } ], - "time": "2024-10-15T15:12:40+00:00" + "time": "2025-03-14T22:35:49+00:00" }, { "name": "phar-io/manifest", @@ -10664,16 +10655,16 @@ }, { "name": "php-di/php-di", - "version": "7.0.8", + "version": "7.0.9", "source": { "type": "git", "url": "https://github.com/PHP-DI/PHP-DI.git", - "reference": "98ddc81f8f768a2ad39e4cbe737285eaeabe577a" + "reference": "d8480267f5cf239650debba704f3ecd15b638cde" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHP-DI/PHP-DI/zipball/98ddc81f8f768a2ad39e4cbe737285eaeabe577a", - "reference": "98ddc81f8f768a2ad39e4cbe737285eaeabe577a", + "url": "https://api.github.com/repos/PHP-DI/PHP-DI/zipball/d8480267f5cf239650debba704f3ecd15b638cde", + "reference": "d8480267f5cf239650debba704f3ecd15b638cde", "shasum": "" }, "require": { @@ -10690,7 +10681,7 @@ "friendsofphp/proxy-manager-lts": "^1", "mnapoli/phpunit-easymock": "^1.3", "phpunit/phpunit": "^9.6", - "vimeo/psalm": "^4.6" + "vimeo/psalm": "^5|^6" }, "suggest": { "friendsofphp/proxy-manager-lts": "Install it if you want to use lazy injection (version ^1)" @@ -10721,7 +10712,7 @@ ], "support": { "issues": "https://github.com/PHP-DI/PHP-DI/issues", - "source": "https://github.com/PHP-DI/PHP-DI/tree/7.0.8" + "source": "https://github.com/PHP-DI/PHP-DI/tree/7.0.9" }, "funding": [ { @@ -10733,7 +10724,7 @@ "type": "tidelift" } ], - "time": "2025-01-28T21:02:46+00:00" + "time": "2025-02-28T12:46:35+00:00" }, { "name": "phpunit/php-code-coverage", @@ -11159,16 +11150,16 @@ }, { "name": "psy/psysh", - "version": "v0.12.7", + "version": "v0.12.8", "source": { "type": "git", "url": "https://github.com/bobthecow/psysh.git", - "reference": "d73fa3c74918ef4522bb8a3bf9cab39161c4b57c" + "reference": "85057ceedee50c49d4f6ecaff73ee96adb3b3625" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/bobthecow/psysh/zipball/d73fa3c74918ef4522bb8a3bf9cab39161c4b57c", - "reference": "d73fa3c74918ef4522bb8a3bf9cab39161c4b57c", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/85057ceedee50c49d4f6ecaff73ee96adb3b3625", + "reference": "85057ceedee50c49d4f6ecaff73ee96adb3b3625", "shasum": "" }, "require": { @@ -11232,9 +11223,9 @@ ], "support": { "issues": "https://github.com/bobthecow/psysh/issues", - "source": "https://github.com/bobthecow/psysh/tree/v0.12.7" + "source": "https://github.com/bobthecow/psysh/tree/v0.12.8" }, - "time": "2024-12-10T01:58:33+00:00" + "time": "2025-03-16T03:05:19+00:00" }, { "name": "roave/security-advisories", @@ -11242,12 +11233,12 @@ "source": { "type": "git", "url": "https://github.com/Roave/SecurityAdvisories.git", - "reference": "eec07a3f265e855f870e52b7c18c44822208e303" + "reference": "9ec3309dcdef9afaf7649b5ddff330d58abe4d34" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/eec07a3f265e855f870e52b7c18c44822208e303", - "reference": "eec07a3f265e855f870e52b7c18c44822208e303", + "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/9ec3309dcdef9afaf7649b5ddff330d58abe4d34", + "reference": "9ec3309dcdef9afaf7649b5ddff330d58abe4d34", "shasum": "" }, "conflict": { @@ -11348,7 +11339,7 @@ "codiad/codiad": "<=2.8.4", "components/jquery": ">=1.0.3,<3.5", "composer/composer": "<1.10.27|>=2,<2.2.24|>=2.3,<2.7.7", - "concrete5/concrete5": "<9.3.4", + "concrete5/concrete5": "<9.4.0.0-RC1-dev", "concrete5/core": "<8.5.8|>=9,<9.1", "contao-components/mediaelement": ">=2.14.2,<2.21.1", "contao/comments-bundle": ">=2,<4.13.40|>=5.0.0.0-RC1-dev,<5.3.4", @@ -11446,9 +11437,9 @@ "fisharebest/webtrees": "<=2.1.18", "fixpunkt/fp-masterquiz": "<2.2.1|>=3,<3.5.2", "fixpunkt/fp-newsletter": "<1.1.1|>=2,<2.1.2|>=2.2,<3.2.6", - "flarum/core": "<1.8.5", + "flarum/core": "<1.8.10", "flarum/flarum": "<0.1.0.0-beta8", - "flarum/framework": "<1.8.5", + "flarum/framework": "<1.8.10", "flarum/mentions": "<1.6.3", "flarum/sticky": ">=0.1.0.0-beta14,<=0.1.0.0-beta15", "flarum/tags": "<=0.1.0.0-beta13", @@ -11469,14 +11460,14 @@ "friendsofsymfony1/symfony1": ">=1.1,<1.5.19", "friendsoftypo3/mediace": ">=7.6.2,<7.6.5", "friendsoftypo3/openid": ">=4.5,<4.5.31|>=4.7,<4.7.16|>=6,<6.0.11|>=6.1,<6.1.6", - "froala/wysiwyg-editor": "<3.2.7|>=4.0.1,<=4.1.3", - "froxlor/froxlor": "<=2.2.0.0-RC3", + "froala/wysiwyg-editor": "<=4.3", + "froxlor/froxlor": "<=2.2.5", "frozennode/administrator": "<=5.0.12", "fuel/core": "<1.8.1", "funadmin/funadmin": "<=5.0.2", "gaoming13/wechat-php-sdk": "<=1.10.2", "genix/cms": "<=1.1.11", - "getformwork/formwork": "<1.13.1|==2.0.0.0-beta1", + "getformwork/formwork": "<1.13.1|>=2.0.0.0-beta1,<2.0.0.0-beta4", "getgrav/grav": "<1.7.46", "getkirby/cms": "<=3.6.6.5|>=3.7,<=3.7.5.4|>=3.8,<=3.8.4.3|>=3.9,<=3.9.8.1|>=3.10,<=3.10.1|>=4,<=4.3", "getkirby/kirby": "<=2.5.12", @@ -11575,7 +11566,7 @@ "lara-zeus/artemis": ">=1,<=1.0.6", "lara-zeus/dynamic-dashboard": ">=3,<=3.0.1", "laravel/fortify": "<1.11.1", - "laravel/framework": "<6.20.45|>=7,<7.30.7|>=8,<8.83.28|>=9,<9.52.17|>=10,<10.48.23|>=11,<11.31", + "laravel/framework": "<10.48.29|>=11,<11.44.1|>=12,<12.1.1", "laravel/laravel": ">=5.4,<5.4.22", "laravel/pulse": "<1.3.1", "laravel/reverb": "<1.4", @@ -11595,9 +11586,11 @@ "limesurvey/limesurvey": "<6.5.12", "livehelperchat/livehelperchat": "<=3.91", "livewire/livewire": "<2.12.7|>=3.0.0.0-beta1,<3.5.2", + "livewire/volt": "<1.7", "lms/routes": "<2.1.1", "localizationteam/l10nmgr": "<7.4|>=8,<8.7|>=9,<9.2", "luyadev/yii-helpers": "<1.2.1", + "macropay-solutions/laravel-crud-wizard-free": "<3.4.17", "maestroerror/php-heic-to-jpg": "<1.0.5", "magento/community-edition": "<2.4.5|==2.4.5|>=2.4.5.0-patch1,<2.4.5.0-patch11|==2.4.6|>=2.4.6.0-patch1,<2.4.6.0-patch9|>=2.4.7.0-beta1,<2.4.7.0-patch4|>=2.4.8.0-beta1,<2.4.8.0-beta2", "magento/core": "<=1.9.4.5", @@ -11611,7 +11604,7 @@ "mantisbt/mantisbt": "<=2.26.3", "marcwillmann/turn": "<0.3.3", "matyhtf/framework": "<3.0.6", - "mautic/core": "<4.4.13|>=5.0.0.0-alpha,<5.1.1", + "mautic/core": "<5.2.3", "mautic/core-lib": ">=1.0.0.0-beta,<4.4.13|>=5.0.0.0-alpha,<5.1.1", "maximebf/debugbar": "<1.19", "mdanter/ecc": "<2", @@ -11634,7 +11627,7 @@ "miniorange/miniorange-saml": "<1.4.3", "mittwald/typo3_forum": "<1.2.1", "mobiledetect/mobiledetectlib": "<2.8.32", - "modx/revolution": "<=2.8.3.0-patch", + "modx/revolution": "<=3.1", "mojo42/jirafeau": "<4.4", "mongodb/mongodb": ">=1,<1.9.2", "monolog/monolog": ">=1.8,<1.12", @@ -11686,7 +11679,7 @@ "open-web-analytics/open-web-analytics": "<1.7.4", "opencart/opencart": ">=0", "openid/php-openid": "<2.3", - "openmage/magento-lts": "<20.10.1", + "openmage/magento-lts": "<20.12.3", "opensolutions/vimbadmin": "<=3.0.15", "opensource-workshop/connect-cms": "<1.8.7|>=2,<2.4.7", "orchid/platform": ">=8,<14.43", @@ -11728,7 +11721,7 @@ "phpmyadmin/phpmyadmin": "<5.2.2", "phpmyfaq/phpmyfaq": "<3.2.5|==3.2.5|>=3.2.10,<=4.0.1", "phpoffice/common": "<0.2.9", - "phpoffice/phpexcel": "<1.8.1", + "phpoffice/phpexcel": "<=1.8.2", "phpoffice/phpspreadsheet": "<1.29.9|>=2,<2.1.8|>=2.2,<2.3.7|>=3,<3.9", "phpseclib/phpseclib": "<2.0.47|>=3,<3.0.36", "phpservermon/phpservermon": "<3.6", @@ -11745,11 +11738,11 @@ "pimcore/demo": "<10.3", "pimcore/ecommerce-framework-bundle": "<1.0.10", "pimcore/perspective-editor": "<1.5.1", - "pimcore/pimcore": "<11.2.4|>=11.4.2,<11.5.3", + "pimcore/pimcore": "<11.5.4", "pixelfed/pixelfed": "<0.11.11", "plotly/plotly.js": "<2.25.2", "pocketmine/bedrock-protocol": "<8.0.2", - "pocketmine/pocketmine-mp": "<5.11.2", + "pocketmine/pocketmine-mp": "<5.25.2", "pocketmine/raklib": ">=0.14,<0.14.6|>=0.15,<0.15.1", "pressbooks/pressbooks": "<5.18", "prestashop/autoupgrade": ">=4,<4.10.1", @@ -11784,7 +11777,7 @@ "rap2hpoutre/laravel-log-viewer": "<0.13", "react/http": ">=0.7,<1.9", "really-simple-plugins/complianz-gdpr": "<6.4.2", - "redaxo/source": "<=5.18.1", + "redaxo/source": "<5.18.3", "remdex/livehelperchat": "<4.29", "reportico-web/reportico": "<=8.1", "rhukster/dom-sanitizer": "<1.0.7", @@ -11830,8 +11823,8 @@ "silverstripe/userforms": "<3|>=5,<5.4.2", "silverstripe/versioned-admin": ">=1,<1.11.1", "simple-updates/phpwhois": "<=1", - "simplesamlphp/saml2": "<4.6.14|==5.0.0.0-alpha12", - "simplesamlphp/saml2-legacy": "<4.6.14", + "simplesamlphp/saml2": "<=4.16.15|>=5.0.0.0-alpha1,<=5.0.0.0-alpha19", + "simplesamlphp/saml2-legacy": "<=4.16.15", "simplesamlphp/simplesamlphp": "<1.18.6", "simplesamlphp/simplesamlphp-module-infocard": "<1.0.1", "simplesamlphp/simplesamlphp-module-openid": "<1", @@ -11874,7 +11867,7 @@ "sylius/admin-bundle": ">=1,<1.0.17|>=1.1,<1.1.9|>=1.2,<1.2.2", "sylius/grid": ">=1,<1.1.19|>=1.2,<1.2.18|>=1.3,<1.3.13|>=1.4,<1.4.5|>=1.5,<1.5.1", "sylius/grid-bundle": "<1.10.1", - "sylius/paypal-plugin": ">=1,<1.2.4|>=1.3,<1.3.1", + "sylius/paypal-plugin": "<1.6.1|>=1.7,<1.7.1|>=2,<2.0.1", "sylius/resource-bundle": ">=1,<1.3.14|>=1.4,<1.4.7|>=1.5,<1.5.2|>=1.6,<1.6.4", "sylius/sylius": "<1.12.19|>=1.13.0.0-alpha1,<1.13.4", "symbiote/silverstripe-multivaluefield": ">=3,<3.1", @@ -12110,7 +12103,7 @@ "type": "tidelift" } ], - "time": "2025-02-25T16:05:58+00:00" + "time": "2025-03-17T22:04:58+00:00" }, { "name": "sebastian/cli-parser", @@ -13410,16 +13403,16 @@ }, { "name": "spatie/laravel-ray", - "version": "1.39.1", + "version": "1.40.1", "source": { "type": "git", "url": "https://github.com/spatie/laravel-ray.git", - "reference": "0d890fa2cd2c0b6175cf54c56b9321d81047571d" + "reference": "2d01295c5a1306935450b01ff950955479096f5f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-ray/zipball/0d890fa2cd2c0b6175cf54c56b9321d81047571d", - "reference": "0d890fa2cd2c0b6175cf54c56b9321d81047571d", + "url": "https://api.github.com/repos/spatie/laravel-ray/zipball/2d01295c5a1306935450b01ff950955479096f5f", + "reference": "2d01295c5a1306935450b01ff950955479096f5f", "shasum": "" }, "require": { @@ -13482,7 +13475,7 @@ ], "support": { "issues": "https://github.com/spatie/laravel-ray/issues", - "source": "https://github.com/spatie/laravel-ray/tree/1.39.1" + "source": "https://github.com/spatie/laravel-ray/tree/1.40.1" }, "funding": [ { @@ -13494,7 +13487,7 @@ "type": "other" } ], - "time": "2025-02-05T08:16:15+00:00" + "time": "2025-03-14T13:11:12+00:00" }, { "name": "spatie/macroable", @@ -13797,16 +13790,16 @@ }, { "name": "symfony/stopwatch", - "version": "v6.4.13", + "version": "v6.4.19", "source": { "type": "git", "url": "https://github.com/symfony/stopwatch.git", - "reference": "2cae0a6f8d04937d02f6d19806251e2104d54f92" + "reference": "dfe1481c12c06266d0c3d58c0cb4b09bd497ab9c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/2cae0a6f8d04937d02f6d19806251e2104d54f92", - "reference": "2cae0a6f8d04937d02f6d19806251e2104d54f92", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/dfe1481c12c06266d0c3d58c0cb4b09bd497ab9c", + "reference": "dfe1481c12c06266d0c3d58c0cb4b09bd497ab9c", "shasum": "" }, "require": { @@ -13839,7 +13832,7 @@ "description": "Provides a way to profile code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/stopwatch/tree/v6.4.13" + "source": "https://github.com/symfony/stopwatch/tree/v6.4.19" }, "funding": [ { @@ -13855,7 +13848,7 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:18:03+00:00" + "time": "2025-02-21T10:06:30+00:00" }, { "name": "theseer/tokenizer", diff --git a/package-lock.json b/package-lock.json index 889e89b6..2dbd6e54 100644 --- a/package-lock.json +++ b/package-lock.json @@ -59,22 +59,22 @@ } }, "node_modules/@babel/core": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.9.tgz", - "integrity": "sha512-lWBYIrF7qK5+GjY5Uy+/hEgp8OJWOD/rpy74GplYRhEauvbHDeFB8t5hPOZxCZ0Oxf4Cc36tK51/l3ymJysrKw==", + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.10.tgz", + "integrity": "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.9", + "@babel/generator": "^7.26.10", "@babel/helper-compilation-targets": "^7.26.5", "@babel/helper-module-transforms": "^7.26.0", - "@babel/helpers": "^7.26.9", - "@babel/parser": "^7.26.9", + "@babel/helpers": "^7.26.10", + "@babel/parser": "^7.26.10", "@babel/template": "^7.26.9", - "@babel/traverse": "^7.26.9", - "@babel/types": "^7.26.9", + "@babel/traverse": "^7.26.10", + "@babel/types": "^7.26.10", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -100,14 +100,14 @@ } }, "node_modules/@babel/generator": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.9.tgz", - "integrity": "sha512-kEWdzjOAUMW4hAyrzJ0ZaTOu9OmpyDIQicIh0zg0EEcEkYXZb2TjtBhnHi2ViX7PKwZqF4xwqfAm299/QMP3lg==", + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.10.tgz", + "integrity": "sha512-rRHT8siFIXQrAYOYqZQVsAr8vJ+cBNqcVAY6m5V8/4QqzaPl+zDBe6cLEPRDuNOUf3ww8RfJVlOyQMoSI+5Ang==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.26.9", - "@babel/types": "^7.26.9", + "@babel/parser": "^7.26.10", + "@babel/types": "^7.26.10", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" @@ -398,27 +398,27 @@ } }, "node_modules/@babel/helpers": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.9.tgz", - "integrity": "sha512-Mz/4+y8udxBKdmzt/UjPACs4G3j5SshJJEFFKxlCGPydG4JAHXxjWjAwjd09tf6oINvl1VfMJo+nB7H2YKQ0dA==", + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.10.tgz", + "integrity": "sha512-UPYc3SauzZ3JGgj87GgZ89JVdC5dj0AoetR5Bw6wj4niittNyFh6+eOGonYvJ1ao6B8lEa3Q3klS7ADZ53bc5g==", "dev": true, "license": "MIT", "dependencies": { "@babel/template": "^7.26.9", - "@babel/types": "^7.26.9" + "@babel/types": "^7.26.10" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.9.tgz", - "integrity": "sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A==", + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.10.tgz", + "integrity": "sha512-6aQR2zGE/QFi8JpDLjUZEPYOs7+mhKXm86VaKFiLP35JQwQb6bwUE+XbvkH0EptsYhbNBSUGaUBLKqxH1xSgsA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.26.9" + "@babel/types": "^7.26.10" }, "bin": { "parser": "bin/babel-parser.js" @@ -1310,16 +1310,16 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.26.9.tgz", - "integrity": "sha512-Jf+8y9wXQbbxvVYTM8gO5oEF2POdNji0NMltEkG7FtmzD9PVz7/lxpqSdTvwsjTMU5HIHuDVNf2SOxLkWi+wPQ==", + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.26.10.tgz", + "integrity": "sha512-NWaL2qG6HRpONTnj4JvDU6th4jYeZOJgu3QhmFTCihib0ermtOJqktA5BduGm3suhhVe9EMP9c9+mfJ/I9slqw==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.25.9", "@babel/helper-plugin-utils": "^7.26.5", "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.10.6", + "babel-plugin-polyfill-corejs3": "^0.11.0", "babel-plugin-polyfill-regenerator": "^0.6.1", "semver": "^6.3.1" }, @@ -1572,20 +1572,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/preset-env/node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.11.1.tgz", - "integrity": "sha512-yGCqvBT4rwMczo28xkH/noxJ6MZ4nJfkVYdoDaC/utLtWrXxv27HVrzAeSbqR8SxDsp46n0YF47EbHoixy6rXQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.3", - "core-js-compat": "^3.40.0" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, "node_modules/@babel/preset-env/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -1612,9 +1598,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.9.tgz", - "integrity": "sha512-aA63XwOkcl4xxQa3HjPMqOP6LiK0ZDv3mUPYEFXkpHbaFjtGggE1A61FjFzJnB+p7/oy2gA8E+rcBNl/zC1tMg==", + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.10.tgz", + "integrity": "sha512-2WJMeRQPHKSPemqk/awGrAiuFfzBmOIPXKizAsVhWH9YJqLZ0H+HS4c8loHGgW6utJ3E/ejXQUsiGaQy2NZ9Fw==", "dev": true, "license": "MIT", "dependencies": { @@ -1640,17 +1626,17 @@ } }, "node_modules/@babel/traverse": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.9.tgz", - "integrity": "sha512-ZYW7L+pL8ahU5fXmNbPF+iZFHCv5scFak7MZ9bwaRPLUhHh7QQEMjZUg0HevihoqCM5iSYHN61EyCoZvqC+bxg==", + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.10.tgz", + "integrity": "sha512-k8NuDrxr0WrPH5Aupqb2LCVURP/S0vBEn5mK6iH+GIYob66U5EtoZvcdudR2jQ4cmTwhEwW1DLB+Yyas9zjF6A==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.9", - "@babel/parser": "^7.26.9", + "@babel/generator": "^7.26.10", + "@babel/parser": "^7.26.10", "@babel/template": "^7.26.9", - "@babel/types": "^7.26.9", + "@babel/types": "^7.26.10", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -1659,9 +1645,9 @@ } }, "node_modules/@babel/types": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.9.tgz", - "integrity": "sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw==", + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.10.tgz", + "integrity": "sha512-emqcG3vHrpxUKTrxcblR36dcrcoRDvKmnL/dCL6ZsHaShW80qxCAcNhzQZrpeM765VzEos+xOi4s+r4IXzTwdQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2415,9 +2401,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "22.13.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.5.tgz", - "integrity": "sha512-+lTU0PxZXn0Dr1NBtC7Y8cR21AJr87dLLU953CWA6pMxxv/UDc7jYAY90upcrie1nRcD6XNG5HOYEDtgW5TxAg==", + "version": "22.13.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.10.tgz", + "integrity": "sha512-I6LPUvlRH+O6VRUqYOcMudhaIdUVWfsjnZavnsraHvpBwaEyMN29ry+0UVJhImYL16xsscu0aske3yA+uPOWfw==", "dev": true, "license": "MIT", "dependencies": { @@ -2513,9 +2499,9 @@ "license": "MIT" }, "node_modules/@types/ws": { - "version": "8.5.14", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.14.tgz", - "integrity": "sha512-bd/YFLW+URhBzMXurx7lWByOu+xzU9+kb3RboOteXYDfW+tr+JZa99OyNmPINEGB/ahzKrEuc8rcv4gnpJmxTw==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8svvI3hMyvN0kKCJMvTJP/x6Y/EoQbepff882wL+Sn5QsXb3etnamgrJq4isrBxSJj5L2AuXcI0+bgkoAXGUJw==", "dev": true, "license": "MIT", "dependencies": { @@ -2761,9 +2747,9 @@ } }, "node_modules/acorn": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", - "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "version": "8.14.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", + "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", "dev": true, "license": "MIT", "bin": { @@ -2960,9 +2946,9 @@ } }, "node_modules/autoprefixer": { - "version": "10.4.20", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz", - "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==", + "version": "10.4.21", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz", + "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==", "dev": true, "funding": [ { @@ -2980,11 +2966,11 @@ ], "license": "MIT", "dependencies": { - "browserslist": "^4.23.3", - "caniuse-lite": "^1.0.30001646", + "browserslist": "^4.24.4", + "caniuse-lite": "^1.0.30001702", "fraction.js": "^4.3.7", "normalize-range": "^0.1.2", - "picocolors": "^1.0.1", + "picocolors": "^1.1.1", "postcss-value-parser": "^4.2.0" }, "bin": { @@ -3043,14 +3029,14 @@ } }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.10.6", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz", - "integrity": "sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==", + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.11.1.tgz", + "integrity": "sha512-yGCqvBT4rwMczo28xkH/noxJ6MZ4nJfkVYdoDaC/utLtWrXxv27HVrzAeSbqR8SxDsp46n0YF47EbHoixy6rXQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.2", - "core-js-compat": "^3.38.0" + "@babel/helper-define-polyfill-provider": "^0.6.3", + "core-js-compat": "^3.40.0" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" @@ -3457,14 +3443,14 @@ } }, "node_modules/call-bound": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz", - "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", "dev": true, "license": "MIT", "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "get-intrinsic": "^1.2.6" + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" }, "engines": { "node": ">= 0.4" @@ -3508,9 +3494,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001701", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001701.tgz", - "integrity": "sha512-faRs/AW3jA9nTwmJBSO1PQ6L/EOgsB5HMQQq4iCu5zhPgVVgO/pZRHlmatwijZKetFw8/Pr4q6dEN8sJuq8qTw==", + "version": "1.0.30001705", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001705.tgz", + "integrity": "sha512-S0uyMMiYvA7CxNgomYBwwwPUnWzFD83f3B1ce5jHUfHTH//QL6hHsreI8RVC5606R4ssqravelYO5TU6t8sEyg==", "dev": true, "funding": [ { @@ -3878,13 +3864,13 @@ "license": "MIT" }, "node_modules/core-js-compat": { - "version": "3.40.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.40.0.tgz", - "integrity": "sha512-0XEDpr5y5mijvw8Lbc6E5AkjrHfp7eEoPlu36SWeAbcL8fn1G1ANe8DBlo2XoNN89oVpxWwOjYIPVzR4ZvsKCQ==", + "version": "3.41.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.41.0.tgz", + "integrity": "sha512-RFsU9LySVue9RTwdDVX/T0e2Y6jRYWXERKElIjpuEOEnxaXffI0X7RUwVzfYLfzuLXSNJDYoRYUAmRUcyln20A==", "dev": true, "license": "MIT", "dependencies": { - "browserslist": "^4.24.3" + "browserslist": "^4.24.4" }, "funding": { "type": "opencollective", @@ -4568,9 +4554,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.105", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.105.tgz", - "integrity": "sha512-ccp7LocdXx3yBhwiG0qTQ7XFrK48Ua2pxIxBdJO8cbddp/MvbBtPFzvnTchtyHQTsgqqczO8cdmAIbpMa0u2+g==", + "version": "1.5.120", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.120.tgz", + "integrity": "sha512-oTUp3gfX1gZI+xfD2djr2rzQdHCwHzPQrrK0CD7WpTdF0nPdQ/INcRVjWgLdCT4a9W3jFObR9DAfsuyFQnI8CQ==", "dev": true, "license": "ISC" }, @@ -4986,9 +4972,9 @@ } }, "node_modules/fastq": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.0.tgz", - "integrity": "sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA==", + "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": { @@ -6782,9 +6768,9 @@ } }, "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.10", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.10.tgz", + "integrity": "sha512-vSJJTG+t/dIKAUhUDw/dLdZ9s//5OxcHqLaDWWrW4Cdq7o6tdLIczUkMXt2MBNmk6sJRZBZRXVixs7URY1CmIg==", "dev": true, "funding": [ { @@ -8499,9 +8485,9 @@ "license": "MIT" }, "node_modules/sass": { - "version": "1.85.1", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.85.1.tgz", - "integrity": "sha512-Uk8WpxM5v+0cMR0XjX9KfRIacmSG86RH4DCCZjLU2rFh5tyutt9siAXJ7G+YfxQ99Q6wrRMbMlVl6KqUms71ag==", + "version": "1.86.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.86.0.tgz", + "integrity": "sha512-zV8vGUld/+mP4KbMLJMX7TyGCuUp7hnkOScgCMsWuHtns8CWBoz+vmEhoGMXsaJrbUP8gj+F1dLvVe79sK8UdA==", "dev": true, "license": "MIT", "dependencies": { @@ -9118,9 +9104,9 @@ } }, "node_modules/std-env": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.8.0.tgz", - "integrity": "sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==", + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.8.1.tgz", + "integrity": "sha512-vj5lIj3Mwf9D79hBkltk5qmkFI+biIKWS2IBxEyEU3AX1tUf7AoL8nSazCOiiqQsGKIq01SClsKEzweu34uwvA==", "dev": true, "license": "MIT" }, @@ -9332,9 +9318,9 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.11.tgz", - "integrity": "sha512-RVCsMfuD0+cTt3EwX8hSl2Ks56EbFHWmhluwcqoPKtBnfjiT6olaq7PRIRfhyU8nnC2MrnDrBLfrD/RGE+cVXQ==", + "version": "5.3.14", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz", + "integrity": "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==", "dev": true, "license": "MIT", "dependencies": { @@ -9597,9 +9583,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz", - "integrity": "sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", "dev": true, "funding": [ { From 43828ec27ac0c3c3bfbdf66f7d8e2a300f7b7db1 Mon Sep 17 00:00:00 2001 From: Kevin Woblick Date: Mon, 17 Mar 2025 23:15:05 +0100 Subject: [PATCH 49/61] v2.1.5 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2dbd6e54..71d94de0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "linkace", - "version": "2.1.4", + "version": "2.1.5", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "linkace", - "version": "2.1.4", + "version": "2.1.5", "license": "GPL-3.0-or-later", "dependencies": { "bootstrap": "^5.3.3", diff --git a/package.json b/package.json index 424cd433..bb413dfc 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "linkace", - "version": "2.1.4", + "version": "2.1.5", "description": "A small, selfhosted bookmark manager with advanced features, built with Laravel and Docker", "homepage": "https://github.com/Kovah/LinkAce", "repository": { From fa7e8118a79252eed2b602bd564bdcfdcd93c4bd Mon Sep 17 00:00:00 2001 From: Kevin Woblick Date: Wed, 19 Mar 2025 11:03:26 +0100 Subject: [PATCH 50/61] Refactor tag and list selection to correctly handle ids and names during bulk editing (#936) --- .../Controllers/Models/BulkEditController.php | 5 +- .../Controllers/Models/LinkController.php | 11 ++- app/Http/Controllers/Traits/SearchesLinks.php | 6 +- app/Models/ProvidesTaxonomyOutput.php | 4 +- app/Repositories/LinkRepository.php | 19 ++--- resources/assets/js/components/TagsSelect.js | 13 +++ resources/views/app/search/search.blade.php | 21 +++-- tests/Controller/API/BulkEditApiTest.php | 27 +++++-- tests/Controller/API/BulkStoreApiTest.php | 31 ++++++-- .../Models/BulkEditControllerTest.php | 79 +++++++++++++------ .../Controller/Models/LinkControllerTest.php | 31 ++++++-- 11 files changed, 171 insertions(+), 76 deletions(-) diff --git a/app/Http/Controllers/Models/BulkEditController.php b/app/Http/Controllers/Models/BulkEditController.php index 9f130269..66f77bf4 100644 --- a/app/Http/Controllers/Models/BulkEditController.php +++ b/app/Http/Controllers/Models/BulkEditController.php @@ -37,7 +37,10 @@ public function updateLinks(BulkEditLinksRequest $request) { $models = explode(',', $request->input('models')); - $results = LinkRepository::bulkUpdate($models, $request->input()); + $data = $request->input(); + $data['tags'] = json_decode($data['tags']) ?? []; + $data['lists'] = json_decode($data['lists']) ?? []; + $results = LinkRepository::bulkUpdate($models, $data); $successCount = $results->filter(fn($e) => $e !== null)->count(); diff --git a/app/Http/Controllers/Models/LinkController.php b/app/Http/Controllers/Models/LinkController.php index 9e6a6898..0bfc5b0d 100644 --- a/app/Http/Controllers/Models/LinkController.php +++ b/app/Http/Controllers/Models/LinkController.php @@ -5,7 +5,6 @@ use App\Http\Controllers\Controller; use App\Http\Controllers\Traits\ChecksOrdering; use App\Http\Controllers\Traits\ConfiguresLinkDisplay; -use App\Http\Controllers\Traits\HandlesQueryOrder; use App\Http\Requests\Models\LinkStoreRequest; use App\Http\Requests\Models\LinkUpdateRequest; use App\Http\Requests\Models\ToggleLinkCheckRequest; @@ -71,7 +70,10 @@ public function create(): View public function store(LinkStoreRequest $request): RedirectResponse { - $link = LinkRepository::create($request->all(), true); + $data = $request->validated(); + $data['tags'] = json_decode($data['tags']) ?? []; + $data['lists'] = json_decode($data['lists']) ?? []; + $link = LinkRepository::create($data, true); flash(trans('link.added_successfully'), 'success'); @@ -131,7 +133,10 @@ public function edit(Link $link): View public function update(LinkUpdateRequest $request, Link $link): RedirectResponse { - $link = LinkRepository::update($link, $request->input()); + $data = $request->validated(); + $data['tags'] = json_decode($data['tags']) ?? []; + $data['lists'] = json_decode($data['lists']) ?? []; + $link = LinkRepository::update($link, $data); flash(trans('link.updated_successfully'), 'success'); return redirect()->route('links.show', [$link->id]); diff --git a/app/Http/Controllers/Traits/SearchesLinks.php b/app/Http/Controllers/Traits/SearchesLinks.php index ffd15d31..05ebf567 100644 --- a/app/Http/Controllers/Traits/SearchesLinks.php +++ b/app/Http/Controllers/Traits/SearchesLinks.php @@ -68,13 +68,11 @@ protected function buildDatabaseQuery(SearchRequest $request): Builder $search->where('status', '>', 1); } - //dd($request->input('only_lists'), $request->input('only_tags')); - // Show by specific list only if applicable if ($this->emptyLists = (bool)$request->input('empty_lists', false)) { $search->doesntHave('lists'); } elseif ($request->input('only_lists')) { - $this->searchLists = array_map('intval', explode(',', $request->input('only_lists', ''))); + $this->searchLists = json_decode($request->input('only_lists', '[]')); $search->whereHas('lists', function ($query) { $query->whereIn('id', $this->searchLists); }); @@ -84,7 +82,7 @@ protected function buildDatabaseQuery(SearchRequest $request): Builder if ($this->emptyTags = (bool)$request->input('empty_tags', false)) { $search->doesntHave('tags'); } elseif ($request->input('only_tags')) { - $this->searchTags = array_map('intval', explode(',', $request->input('only_tags'))); + $this->searchTags = json_decode($request->input('only_tags', '[]')); $search->whereHas('tags', function ($query) { $query->whereIn('id', $this->searchTags); }); diff --git a/app/Models/ProvidesTaxonomyOutput.php b/app/Models/ProvidesTaxonomyOutput.php index ae14b702..8443204e 100644 --- a/app/Models/ProvidesTaxonomyOutput.php +++ b/app/Models/ProvidesTaxonomyOutput.php @@ -50,10 +50,10 @@ public static function getOldTaxonomyItems(string $taxonomy): Collection $data = collect(); if ($old = old($taxonomy, false)) { - $items = explode(',', $old); + $items = json_decode($old); foreach ($items as $item) { - if ((int)$item > 0) { + if (is_int($item) && $item > 0) { $item = $model::find($item)?->load('user:id,name'); } else { $item = [ diff --git a/app/Repositories/LinkRepository.php b/app/Repositories/LinkRepository.php index 2a179af4..cb8077af 100644 --- a/app/Repositories/LinkRepository.php +++ b/app/Repositories/LinkRepository.php @@ -76,12 +76,7 @@ public static function bulkUpdate(array $models, array $data): Collection 'lists:id', ])->get(); - $newTags = is_array($data['tags']) ? $data['tags'] : explode(',', $data['tags']); - $newTags = array_map('intval', array_filter($newTags)); - $newLists = is_array($data['lists']) ? $data['lists'] : explode(',', $data['lists']); - $newLists = array_map('intval', array_filter($newLists)); - - return $links->map(function (Link $link) use ($data, $newTags, $newLists) { + return $links->map(function (Link $link) use ($data) { if (!auth()->user()->can('update', $link)) { Log::warning('Could not update ' . $link->id . ' during bulk update: Permission denied!'); return null; @@ -89,14 +84,14 @@ public static function bulkUpdate(array $models, array $data): Collection $linkData = $link->toArray(); $linkData['tags'] = $data['tags_mode'] === 'replace' - ? $newTags - : array_merge($link->tags->pluck('id')->toArray(), $newTags); + ? $data['tags'] + : array_merge($link->tags->pluck('id')->toArray(), $data['tags']); $linkData['lists'] = $data['lists_mode'] === 'replace' - ? $newLists - : array_merge($link->lists->pluck('id')->toArray(), $newLists); + ? $data['lists'] + : array_merge($link->lists->pluck('id')->toArray(), $data['lists']); $linkData['visibility'] = $data['visibility'] ?: $linkData['visibility']; - return LinkRepository::update($link, $linkData); + return self::update($link, $linkData); }); } @@ -232,7 +227,7 @@ protected static function processTaxonomy(string $model, array $entries): Collec }; foreach ($entries as $entry) { - if ((int)$entry > 0) { + if (is_int($entry) && $entry > 0) { $newEntry = $model::find($entry); } else { $newEntry = $model::firstOrCreate([ diff --git a/resources/assets/js/components/TagsSelect.js b/resources/assets/js/components/TagsSelect.js index 73e5f387..fe1c3591 100644 --- a/resources/assets/js/components/TagsSelect.js +++ b/resources/assets/js/components/TagsSelect.js @@ -27,6 +27,7 @@ export default class TagsSelect { delimiter: ',', persist: false, create: this.selectAllowsCreation(), + addPrecedence: true, valueField: 'id', labelField: 'name', searchField: 'name', @@ -35,6 +36,18 @@ export default class TagsSelect { this.setTextboxValue(''); this.refreshOptions(); }, + onInitialize: function () { + if (!selectObject.$el.value.startsWith('[')) { + selectObject.$el.value = `[${selectObject.$el.value}]`; + } + }, + onChange: function () { + const items = this.items.map((item) => { + const option = Object.values(this.options).find((option) => option.id === parseInt(item)); + return option !== undefined ? option.id : item; + }); + selectObject.$el.value = JSON.stringify(items.length > 0 ? items : []); + }, render: { option: function (item, escape) { return selectObject.renderItem(item, escape); diff --git a/resources/views/app/search/search.blade.php b/resources/views/app/search/search.blade.php index 77d2cd15..8db139ca 100644 --- a/resources/views/app/search/search.blade.php +++ b/resources/views/app/search/search.blade.php @@ -1,5 +1,7 @@ @extends('layouts.app') @@ -92,17 +94,20 @@ class="form-select form-select-sm {{ $errors->has('visibility') ? ' is-invalid'
@@ -111,13 +116,15 @@ class="form-select form-select-sm {{ $errors->has('visibility') ? ' is-invalid'
+ @php ray($query_settings['only_lists'], json_encode($query_settings['only_lists'])) @endphp - + data-tag-type="lists">
@@ -127,7 +134,7 @@ class="tag-select" data-tag-data="{{ $all_lists->toJson() }}" + data-tag-type="tags">
@@ -143,7 +150,7 @@ class="tag-select" data-tag-data="{{ $all_tags->toJson() }}" @endforeach diff --git a/tests/Controller/API/BulkEditApiTest.php b/tests/Controller/API/BulkEditApiTest.php index 7c7410b0..a68ef952 100644 --- a/tests/Controller/API/BulkEditApiTest.php +++ b/tests/Controller/API/BulkEditApiTest.php @@ -40,22 +40,33 @@ public function test_links_edit(): void $this->patchJson('api/v2/bulk/links', [ 'models' => [1, 2, 3, 4], - 'tags' => [3], + 'tags' => [3, 'new-tag'], 'tags_mode' => 'append', - 'lists' => [3], + 'lists' => [3, 'new list'], 'lists_mode' => 'append', 'visibility' => null, ])->assertJsonCount(4); array_walk($links, fn ($link) => $link->refresh()); - $this->assertEqualsCanonicalizing([1, 3], $links[0]->lists()->pluck('id')->toArray()); - $this->assertEqualsCanonicalizing([1, 2, 3], $links[1]->lists()->pluck('id')->toArray()); - $this->assertEqualsCanonicalizing([3], $links[2]->lists()->pluck('id')->toArray()); + $this->assertDatabaseCount('tags', 4); + $this->assertDatabaseHas('tags', [ + 'id' => 4, + 'name' => 'new-tag', + ]); + $this->assertDatabaseCount('lists', 4); + $this->assertDatabaseHas('lists', [ + 'id' => 4, + 'name' => 'new list', + ]); + + $this->assertEqualsCanonicalizing([1, 3, 4], $links[0]->lists()->pluck('id')->toArray()); + $this->assertEqualsCanonicalizing([1, 2, 3, 4], $links[1]->lists()->pluck('id')->toArray()); + $this->assertEqualsCanonicalizing([3, 4], $links[2]->lists()->pluck('id')->toArray()); - $this->assertEqualsCanonicalizing([1, 3], $links[0]->tags()->pluck('id')->toArray()); - $this->assertEqualsCanonicalizing([1, 2, 3], $links[1]->tags()->pluck('id')->toArray()); - $this->assertEqualsCanonicalizing([3], $links[2]->tags()->pluck('id')->toArray()); + $this->assertEqualsCanonicalizing([1, 3, 4], $links[0]->tags()->pluck('id')->toArray()); + $this->assertEqualsCanonicalizing([1, 2, 3, 4], $links[1]->tags()->pluck('id')->toArray()); + $this->assertEqualsCanonicalizing([3, 4], $links[2]->tags()->pluck('id')->toArray()); $this->assertEquals(ModelAttribute::VISIBILITY_PUBLIC, $links[0]->visibility); $this->assertEquals(ModelAttribute::VISIBILITY_INTERNAL, $links[1]->visibility); diff --git a/tests/Controller/API/BulkStoreApiTest.php b/tests/Controller/API/BulkStoreApiTest.php index b4859c10..72f80400 100644 --- a/tests/Controller/API/BulkStoreApiTest.php +++ b/tests/Controller/API/BulkStoreApiTest.php @@ -2,6 +2,8 @@ namespace Tests\Controller\API; +use App\Models\LinkList; +use App\Models\Tag; use App\Models\User; use Illuminate\Foundation\Testing\RefreshDatabase; use Illuminate\Support\Facades\Http; @@ -12,14 +14,12 @@ class BulkStoreApiTest extends TestCase { use RefreshDatabase; - private User $user; - protected function setUp(): void { parent::setUp(); - $this->user = User::factory()->create(); - $this->actingAs($this->user); + $user = User::factory()->create(); + $this->actingAs($user); Queue::fake(); } @@ -36,14 +36,17 @@ public function test_store_links(): void 'duckduckgo.com' => Http::response($testHtml), ]); + $testList = LinkList::factory()->create(); + $testTag = Tag::factory()->create(); + $response = $this->postJson('api/v2/bulk/links', [ 'models' => [ [ 'url' => 'https://example.com', 'title' => 'The famous Example', 'description' => 'There could be a description here', - 'lists' => [], - 'tags' => [], + 'lists' => [$testList->id, 'new List'], + 'tags' => [$testTag->id, 'newTag'], 'visibility' => 1, 'check_disabled' => false, ], @@ -61,7 +64,11 @@ public function test_store_links(): void $response->assertSuccessful()->assertJsonIsArray(); $this->assertEquals('https://example.com', $response->json()[0]['url']); + $this->assertEquals($testList->name, $response->json()[0]['lists'][0]['name']); + $this->assertEquals('new List', $response->json()[0]['lists'][1]['name']); $this->assertEquals('https://duckduckgo.com', $response->json()[1]['url']); + $this->assertEquals($testTag->name, $response->json()[0]['tags'][0]['name']); + $this->assertEquals('newTag', $response->json()[0]['tags'][1]['name']); $this->assertDatabaseHas('links', [ 'id' => 1, @@ -74,6 +81,18 @@ public function test_store_links(): void 'url' => 'https://duckduckgo.com', 'title' => 'Search the Web', ]); + + $this->assertDatabaseCount('lists', 2); + $this->assertDatabaseHas('lists', [ + 'id' => 2, + 'name' => 'new List', + ]); + + $this->assertDatabaseCount('tags', 2); + $this->assertDatabaseHas('tags', [ + 'id' => 2, + 'name' => 'newTag', + ]); } public function test_store_lists(): void diff --git a/tests/Controller/Models/BulkEditControllerTest.php b/tests/Controller/Models/BulkEditControllerTest.php index 26f829bf..4a6fd2a3 100644 --- a/tests/Controller/Models/BulkEditControllerTest.php +++ b/tests/Controller/Models/BulkEditControllerTest.php @@ -48,24 +48,44 @@ public function test_links_edit(): void $this->post('bulk-edit/update-links', [ 'models' => '1,2,3,4', - 'tags' => '3', + 'tags' => json_encode([3, 'new-tag', '1337']), 'tags_mode' => 'append', - 'lists' => '3', + 'lists' => json_encode([3, 'new list', '1001']), 'lists_mode' => 'append', 'visibility' => null, ]) ->assertRedirect('links') ->assertSessionHas('flash_notification.0.message', 'Successfully updated 3 Links out of 4 selected ones.'); - array_walk($links, fn ($link) => $link->refresh()); - - $this->assertEqualsCanonicalizing([3, 1], $links[0]->lists()->pluck('id')->toArray()); - $this->assertEqualsCanonicalizing([1, 2, 3], $links[1]->lists()->pluck('id')->toArray()); - $this->assertEqualsCanonicalizing([3], $links[2]->lists()->pluck('id')->toArray()); - - $this->assertEqualsCanonicalizing([3, 1], $links[0]->tags()->pluck('id')->toArray()); - $this->assertEqualsCanonicalizing([1, 2, 3], $links[1]->tags()->pluck('id')->toArray()); - $this->assertEqualsCanonicalizing([3], $links[2]->tags()->pluck('id')->toArray()); + array_walk($links, fn($link) => $link->refresh()); + + $this->assertDatabaseCount('tags', 5); + $this->assertDatabaseHas('tags', [ + 'id' => 4, + 'name' => 'new-tag', + ]); + $this->assertDatabaseHas('tags', [ + 'id' => 5, + 'name' => '1337', + ]); + + $this->assertDatabaseCount('lists', 5); + $this->assertDatabaseHas('lists', [ + 'id' => 4, + 'name' => 'new list', + ]); + $this->assertDatabaseHas('lists', [ + 'id' => 5, + 'name' => '1001', + ]); + + $this->assertEqualsCanonicalizing([3, 1, 4, 5], $links[0]->lists()->pluck('id')->toArray()); + $this->assertEqualsCanonicalizing([1, 2, 3, 4, 5], $links[1]->lists()->pluck('id')->toArray()); + $this->assertEqualsCanonicalizing([3, 4, 5], $links[2]->lists()->pluck('id')->toArray()); + + $this->assertEqualsCanonicalizing([3, 1, 4, 5], $links[0]->tags()->pluck('id')->toArray()); + $this->assertEqualsCanonicalizing([1, 2, 3, 4, 5], $links[1]->tags()->pluck('id')->toArray()); + $this->assertEqualsCanonicalizing([3, 4, 5], $links[2]->tags()->pluck('id')->toArray()); $this->assertEquals(ModelAttribute::VISIBILITY_PUBLIC, $links[0]->visibility); $this->assertEquals(ModelAttribute::VISIBILITY_INTERNAL, $links[1]->visibility); @@ -88,7 +108,7 @@ public function test_links_edit_without_taxonomy(): void ->assertRedirect('links') ->assertSessionHas('flash_notification.0.message', 'Successfully updated 3 Links out of 4 selected ones.'); - array_walk($links, fn ($link) => $link->refresh()); + array_walk($links, fn($link) => $link->refresh()); $this->assertEqualsCanonicalizing([1], $links[0]->lists()->pluck('id')->toArray()); $this->assertEqualsCanonicalizing([1, 2], $links[1]->lists()->pluck('id')->toArray()); @@ -109,16 +129,16 @@ public function test_alternative_links_edit(): void $this->post('bulk-edit/update-links', [ 'models' => '1,2,3,4', - 'tags' => '2,3', + 'tags' => json_encode([2, 3]), 'tags_mode' => 'replace', - 'lists' => '3', + 'lists' => json_encode([3]), 'lists_mode' => 'replace', 'visibility' => ModelAttribute::VISIBILITY_INTERNAL, ]) ->assertRedirect('links') ->assertSessionHas('flash_notification.0.message', 'Successfully updated 3 Links out of 4 selected ones.'); - array_walk($links, fn ($link) => $link->refresh()); + array_walk($links, fn($link) => $link->refresh()); $this->assertEqualsCanonicalizing([3], $links[0]->lists()->pluck('id')->sort()->toArray()); $this->assertEqualsCanonicalizing([3], $links[1]->lists()->pluck('id')->sort()->toArray()); @@ -149,7 +169,7 @@ public function test_lists_edit(): void ->assertRedirect('lists') ->assertSessionHas('flash_notification.0.message', 'Successfully updated 3 Lists out of 4 selected ones.'); - array_walk($lists, fn ($list) => $list->refresh()); + array_walk($lists, fn($list) => $list->refresh()); $this->assertEquals(ModelAttribute::VISIBILITY_PUBLIC, $lists[0]->visibility); $this->assertEquals(ModelAttribute::VISIBILITY_INTERNAL, $lists[1]->visibility); @@ -172,7 +192,7 @@ public function test_alternative_lists_edit(): void ->assertRedirect('lists') ->assertSessionHas('flash_notification.0.message', 'Successfully updated 3 Lists out of 4 selected ones.'); - array_walk($lists, fn ($list) => $list->refresh()); + array_walk($lists, fn($list) => $list->refresh()); $this->assertEquals(ModelAttribute::VISIBILITY_INTERNAL, $lists[0]->visibility); $this->assertEquals(ModelAttribute::VISIBILITY_INTERNAL, $lists[1]->visibility); @@ -195,7 +215,7 @@ public function test_tags_edit(): void ->assertRedirect('tags') ->assertSessionHas('flash_notification.0.message', 'Successfully updated 3 Tags out of 4 selected ones.'); - array_walk($tags, fn ($tag) => $tag->refresh()); + array_walk($tags, fn($tag) => $tag->refresh()); $this->assertEquals(ModelAttribute::VISIBILITY_PUBLIC, $tags[0]->visibility); $this->assertEquals(ModelAttribute::VISIBILITY_INTERNAL, $tags[1]->visibility); @@ -218,7 +238,7 @@ public function test_alternative_tags_edit(): void ->assertRedirect('tags') ->assertSessionHas('flash_notification.0.message', 'Successfully updated 3 Tags out of 4 selected ones.'); - array_walk($tags, fn ($tag) => $tag->refresh()); + array_walk($tags, fn($tag) => $tag->refresh()); $this->assertEquals(ModelAttribute::VISIBILITY_INTERNAL, $tags[0]->visibility); $this->assertEquals(ModelAttribute::VISIBILITY_INTERNAL, $tags[1]->visibility); @@ -243,9 +263,12 @@ public function test_deletion() 'type' => 'links', ]) ->assertRedirect('links') - ->assertSessionHas('flash_notification.0.message', 'Successfully moved 2 Links out of 3 selected ones to the trash.'); + ->assertSessionHas( + 'flash_notification.0.message', + 'Successfully moved 2 Links out of 3 selected ones to the trash.' + ); - array_walk($links, fn ($link) => $link->refresh()); + array_walk($links, fn($link) => $link->refresh()); $this->assertNotNull($links[0]->deleted_at); $this->assertNotNull($links[1]->deleted_at); $this->assertNull($otherLink->deleted_at); @@ -255,9 +278,12 @@ public function test_deletion() 'type' => 'lists', ]) ->assertRedirect('lists') - ->assertSessionHas('flash_notification.1.message', 'Successfully moved 2 Lists out of 3 selected ones to the trash.'); + ->assertSessionHas( + 'flash_notification.1.message', + 'Successfully moved 2 Lists out of 3 selected ones to the trash.' + ); - array_walk($lists, fn ($list) => $list->refresh()); + array_walk($lists, fn($list) => $list->refresh()); $this->assertNotNull($lists[0]->deleted_at); $this->assertNotNull($lists[1]->deleted_at); $this->assertNull($otherList->deleted_at); @@ -267,9 +293,12 @@ public function test_deletion() 'type' => 'tags', ]) ->assertRedirect('tags') - ->assertSessionHas('flash_notification.2.message', 'Successfully moved 2 Tags out of 3 selected ones to the trash.'); + ->assertSessionHas( + 'flash_notification.2.message', + 'Successfully moved 2 Tags out of 3 selected ones to the trash.' + ); - array_walk($tags, fn ($tag) => $tag->refresh()); + array_walk($tags, fn($tag) => $tag->refresh()); $this->assertNotNull($tags[0]->deleted_at); $this->assertNotNull($tags[1]->deleted_at); $this->assertNull($otherTag->deleted_at); diff --git a/tests/Controller/Models/LinkControllerTest.php b/tests/Controller/Models/LinkControllerTest.php index ddb06a07..fab13d3a 100644 --- a/tests/Controller/Models/LinkControllerTest.php +++ b/tests/Controller/Models/LinkControllerTest.php @@ -87,25 +87,36 @@ public function test_minimal_store_request(): void public function test_full_store_request(): void { - $tag = Tag::factory()->create(); - $list = LinkList::factory()->create(); + $tag = Tag::factory()->create(['name' => 'testTag']); + $list = LinkList::factory()->create(['name' => 'Test List']); $this->post('links', [ 'url' => 'https://example.com', 'title' => 'My custom title', 'description' => 'My custom description', - 'lists' => $list->name, - 'tags' => $tag->name, + 'lists' => json_encode([$list->id, 'new list']), + 'tags' => json_encode([$tag->id, 'new-tag']), 'visibility' => 1, ])->assertRedirect('links/1'); + $this->assertDatabaseCount('tags', 4); + $this->assertDatabaseHas('tags', [ + 'id' => 4, + 'name' => 'new-tag', + ]); + $this->assertDatabaseCount('lists', 4); + $this->assertDatabaseHas('lists', [ + 'id' => 4, + 'name' => 'new list', + ]); + $databaseLink = Link::first(); $this->assertEquals('https://example.com', $databaseLink->url); $this->assertEquals('My custom title', $databaseLink->title); $this->assertEquals('My custom description', $databaseLink->description); - $this->assertEquals($list->name, $databaseLink->lists->first()->name); - $this->assertEquals($tag->name, $databaseLink->tags->first()->name); + $this->assertEqualsCanonicalizing(['Test List', 'new list'], $databaseLink->lists->pluck('name')->toArray()); + $this->assertEqualsCanonicalizing(['testTag', 'new-tag'], $databaseLink->tags->pluck('name')->toArray()); } public function test_store_request_with_duplicate(): void @@ -309,13 +320,15 @@ public function test_edit_view(): void public function test_update_response(): void { $this->createTestLinks(); + $this->createTestLists(); + $this->createTestTags(); $this->patch('links/1', [ 'url' => 'https://new-public-link.com', 'title' => 'New Title', 'description' => 'New Description', - 'lists' => null, - 'tags' => null, + 'lists' => json_encode([1, 'new list']), + 'tags' => json_encode([1, 'new-tag']), 'visibility' => 1, 'check_disabled' => '0', ])->assertRedirect('links/1'); @@ -326,6 +339,8 @@ public function test_update_response(): void $this->assertEquals('https://new-public-link.com', $link->url); $this->assertEquals('New Title', $link->title); $this->assertEquals('New Description', $link->description); + $this->assertEqualsCanonicalizing(['Public List', 'new list'], $link->lists->pluck('name')->toArray()); + $this->assertEqualsCanonicalizing(['Public Tag', 'new-tag'], $link->tags->pluck('name')->toArray()); $historyData = $link->audits()->first()->getModified(); From 5d6a283b2d17986308a6d560383032b6a046ed8a Mon Sep 17 00:00:00 2001 From: Kevin Woblick Date: Wed, 19 Mar 2025 11:03:44 +0100 Subject: [PATCH 51/61] Correct styling of rss button and active tag select items --- resources/assets/sass/third-party/tom-select/_select.scss | 4 ++++ resources/views/guest/links/index.blade.php | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/resources/assets/sass/third-party/tom-select/_select.scss b/resources/assets/sass/third-party/tom-select/_select.scss index 96cb247b..6d6a647a 100644 --- a/resources/assets/sass/third-party/tom-select/_select.scss +++ b/resources/assets/sass/third-party/tom-select/_select.scss @@ -4,6 +4,10 @@ > input::placeholder { color: $input-placeholder-color; } + + .item.active .text-muted { + color: $select-color-input !important; + } } .#{$select-ns}-dropdown, diff --git a/resources/views/guest/links/index.blade.php b/resources/views/guest/links/index.blade.php index e0df258d..f77b5526 100644 --- a/resources/views/guest/links/index.blade.php +++ b/resources/views/guest/links/index.blade.php @@ -11,7 +11,7 @@ @lang('link.links') - + @lang('linkace.add') From 24f83d1bfb738fa6b3b27e309322715b81b2e96f Mon Sep 17 00:00:00 2001 From: Kevin Woblick Date: Wed, 19 Mar 2025 11:46:15 +0100 Subject: [PATCH 52/61] Fixes for tag and list handling (#936) --- app/Helper/functions.php | 2 -- app/Http/Controllers/Models/LinkController.php | 16 ++++++++++++---- app/Http/Controllers/Traits/SearchesLinks.php | 6 ++++-- app/Repositories/LinkRepository.php | 4 ++-- resources/assets/js/components/Import.js | 1 - resources/assets/js/components/TagsSelect.js | 2 +- resources/views/app/search/search.blade.php | 1 - tests/Components/History/LinkEntryTest.php | 11 +++++------ tests/Controller/API/BulkStoreApiTest.php | 4 +++- tests/Controller/App/SearchControllerTest.php | 8 ++++---- tests/Controller/Models/LinkControllerTest.php | 8 ++++---- tests/Models/Link/LinkTaxonomyTest.php | 2 +- 12 files changed, 36 insertions(+), 29 deletions(-) diff --git a/app/Helper/functions.php b/app/Helper/functions.php index 70443d4d..599a8548 100644 --- a/app/Helper/functions.php +++ b/app/Helper/functions.php @@ -1,7 +1,6 @@ validated(); - $data['tags'] = json_decode($data['tags']) ?? []; - $data['lists'] = json_decode($data['lists']) ?? []; + if (isset($data['tags'])) { + $data['tags'] = json_decode($data['tags']); + } + if (isset($data['lists'])) { + $data['lists'] = json_decode($data['lists']); + } $link = LinkRepository::create($data, true); flash(trans('link.added_successfully'), 'success'); @@ -134,8 +138,12 @@ public function edit(Link $link): View public function update(LinkUpdateRequest $request, Link $link): RedirectResponse { $data = $request->validated(); - $data['tags'] = json_decode($data['tags']) ?? []; - $data['lists'] = json_decode($data['lists']) ?? []; + if (isset($data['tags'])) { + $data['tags'] = json_decode($data['tags']); + } + if (isset($data['lists'])) { + $data['lists'] = json_decode($data['lists']); + } $link = LinkRepository::update($link, $data); flash(trans('link.updated_successfully'), 'success'); diff --git a/app/Http/Controllers/Traits/SearchesLinks.php b/app/Http/Controllers/Traits/SearchesLinks.php index 05ebf567..c75f1f2e 100644 --- a/app/Http/Controllers/Traits/SearchesLinks.php +++ b/app/Http/Controllers/Traits/SearchesLinks.php @@ -72,7 +72,8 @@ protected function buildDatabaseQuery(SearchRequest $request): Builder if ($this->emptyLists = (bool)$request->input('empty_lists', false)) { $search->doesntHave('lists'); } elseif ($request->input('only_lists')) { - $this->searchLists = json_decode($request->input('only_lists', '[]')); + $lists = $request->input('only_lists', '[]'); + $this->searchLists = preg_match('/\[.+\]/', $lists) ? json_decode($lists) : explode(',', $lists); $search->whereHas('lists', function ($query) { $query->whereIn('id', $this->searchLists); }); @@ -82,7 +83,8 @@ protected function buildDatabaseQuery(SearchRequest $request): Builder if ($this->emptyTags = (bool)$request->input('empty_tags', false)) { $search->doesntHave('tags'); } elseif ($request->input('only_tags')) { - $this->searchTags = json_decode($request->input('only_tags', '[]')); + $tags = $request->input('only_tags', '[]'); + $this->searchTags = preg_match('/\[.+\]/', $tags) ? json_decode($tags) : explode(',', $tags); $search->whereHas('tags', function ($query) { $query->whereIn('id', $this->searchTags); }); diff --git a/app/Repositories/LinkRepository.php b/app/Repositories/LinkRepository.php index cb8077af..e4c340f3 100644 --- a/app/Repositories/LinkRepository.php +++ b/app/Repositories/LinkRepository.php @@ -115,7 +115,7 @@ public static function delete(Link $link): bool protected static function processLinkTaxonomies(Link $link, array $data): void { - if (isset($data['tags'])) { + if (!empty($data['tags'])) { self::updateTagsForLink($link, $data['tags']); } else { // Only save a "removed" revision if there were tags before @@ -131,7 +131,7 @@ protected static function processLinkTaxonomies(Link $link, array $data): void $link->tags()->detach(); } - if (isset($data['lists'])) { + if (!empty($data['lists'])) { self::updateListsForLink($link, $data['lists']); } else { // Only save a "removed" revision if there were lists before diff --git a/resources/assets/js/components/Import.js b/resources/assets/js/components/Import.js index bc597874..72e554a1 100644 --- a/resources/assets/js/components/Import.js +++ b/resources/assets/js/components/Import.js @@ -31,7 +31,6 @@ export default class Import { }).then((response) => { if (response.ok === false) { - console.log(response); this.$alertNetworkError.classList.remove('d-none'); return response; } diff --git a/resources/assets/js/components/TagsSelect.js b/resources/assets/js/components/TagsSelect.js index fe1c3591..be9ff0b1 100644 --- a/resources/assets/js/components/TagsSelect.js +++ b/resources/assets/js/components/TagsSelect.js @@ -46,7 +46,7 @@ export default class TagsSelect { const option = Object.values(this.options).find((option) => option.id === parseInt(item)); return option !== undefined ? option.id : item; }); - selectObject.$el.value = JSON.stringify(items.length > 0 ? items : []); + selectObject.$el.value = items.length > 0 ? JSON.stringify(items) : null; }, render: { option: function (item, escape) { diff --git a/resources/views/app/search/search.blade.php b/resources/views/app/search/search.blade.php index 8db139ca..65792d75 100644 --- a/resources/views/app/search/search.blade.php +++ b/resources/views/app/search/search.blade.php @@ -116,7 +116,6 @@ class="form-select form-select-sm {{ $errors->has('visibility') ? ' is-invalid'
- @php ray($query_settings['only_lists'], json_encode($query_settings['only_lists'])) @endphp diff --git a/tests/Components/History/LinkEntryTest.php b/tests/Components/History/LinkEntryTest.php index 2b4f49fb..d94ffd14 100644 --- a/tests/Components/History/LinkEntryTest.php +++ b/tests/Components/History/LinkEntryTest.php @@ -100,7 +100,7 @@ public function test_tags_added_change(): void 'title' => $link->title, 'description' => $link->description, 'lists' => null, - 'tags' => 'newtag', + 'tags' => json_encode(['newtag']), 'is_private' => $link->is_private, ]); @@ -125,7 +125,7 @@ public function test_tags_change(): void 'title' => $link->title, 'description' => $link->description, 'lists' => null, - 'tags' => 'newtag', + 'tags' => json_encode(['newtag']), 'is_private' => $link->is_private, ]); @@ -171,13 +171,12 @@ public function test_links_added_change(): void { $link = Link::factory()->create(); - $this->post('links/1', [ - '_method' => 'patch', + $this->patch('links/1', [ 'link_id' => $link->id, 'url' => $link->url, 'title' => $link->title, 'description' => $link->description, - 'lists' => 'New List,Example List', + 'lists' => json_encode(['New List', 'Example List']), 'tags' => null, 'is_private' => $link->is_private, ]); @@ -202,7 +201,7 @@ public function test_links_change(): void 'url' => $link->url, 'title' => $link->title, 'description' => $link->description, - 'lists' => 'New List,Example List', + 'lists' => json_encode(['New List', 'Example List']), 'tags' => null, 'is_private' => $link->is_private, ]); diff --git a/tests/Controller/API/BulkStoreApiTest.php b/tests/Controller/API/BulkStoreApiTest.php index 72f80400..ac34b6f7 100644 --- a/tests/Controller/API/BulkStoreApiTest.php +++ b/tests/Controller/API/BulkStoreApiTest.php @@ -64,9 +64,11 @@ public function test_store_links(): void $response->assertSuccessful()->assertJsonIsArray(); $this->assertEquals('https://example.com', $response->json()[0]['url']); + $this->assertEquals('https://duckduckgo.com', $response->json()[1]['url']); + $this->assertEquals($testList->name, $response->json()[0]['lists'][0]['name']); $this->assertEquals('new List', $response->json()[0]['lists'][1]['name']); - $this->assertEquals('https://duckduckgo.com', $response->json()[1]['url']); + $this->assertEquals($testTag->name, $response->json()[0]['tags'][0]['name']); $this->assertEquals('newTag', $response->json()[0]['tags'][1]['name']); diff --git a/tests/Controller/App/SearchControllerTest.php b/tests/Controller/App/SearchControllerTest.php index 2f756ab3..b82995dc 100644 --- a/tests/Controller/App/SearchControllerTest.php +++ b/tests/Controller/App/SearchControllerTest.php @@ -119,7 +119,7 @@ public function test_valid_broken_search_result(): void public function test_valid_tag_search_result(): void { $response = $this->post('search', [ - 'only_tags' => '1', + 'only_tags' => json_encode([1]), ]); $response->assertOk() @@ -130,7 +130,7 @@ public function test_valid_tag_search_result(): void public function test_valid_tag_search_result_without_result(): void { $response = $this->post('search', [ - 'only_tags' => '5', + 'only_tags' => json_encode([5]), ]); $response->assertOk() @@ -141,7 +141,7 @@ public function test_valid_tag_search_result_without_result(): void public function test_valid_list_search_result(): void { $response = $this->post('search', [ - 'only_lists' => '1', + 'only_lists' => json_encode([1]), ]); $response->assertOk() @@ -152,7 +152,7 @@ public function test_valid_list_search_result(): void public function test_valid_list_search_result_without_results(): void { $response = $this->post('search', [ - 'only_lists' => '5', + 'only_lists' => json_encode([5]), ]); $response->assertOk() diff --git a/tests/Controller/Models/LinkControllerTest.php b/tests/Controller/Models/LinkControllerTest.php index fab13d3a..ffad0f3c 100644 --- a/tests/Controller/Models/LinkControllerTest.php +++ b/tests/Controller/Models/LinkControllerTest.php @@ -99,14 +99,14 @@ public function test_full_store_request(): void 'visibility' => 1, ])->assertRedirect('links/1'); - $this->assertDatabaseCount('tags', 4); + $this->assertDatabaseCount('tags', 2); $this->assertDatabaseHas('tags', [ - 'id' => 4, + 'id' => 2, 'name' => 'new-tag', ]); - $this->assertDatabaseCount('lists', 4); + $this->assertDatabaseCount('lists', 2); $this->assertDatabaseHas('lists', [ - 'id' => 4, + 'id' => 2, 'name' => 'new list', ]); diff --git a/tests/Models/Link/LinkTaxonomyTest.php b/tests/Models/Link/LinkTaxonomyTest.php index 7bfbc01f..4a225d9f 100644 --- a/tests/Models/Link/LinkTaxonomyTest.php +++ b/tests/Models/Link/LinkTaxonomyTest.php @@ -53,7 +53,7 @@ public function test_taxonomy_output_with_old_data(): void $this->patch('links/2', [ 'url' => 'https://existing.com', - 'tags' => '2,3,test tag', + 'tags' => json_encode([2,3,'test tag']), ])->assertSessionHasErrors(['url']); $data = $link->oldTaxonomyOutput('tags'); From 4094e5715390dafa31dea512be59694429fccbdb Mon Sep 17 00:00:00 2001 From: Kevin Woblick Date: Wed, 19 Mar 2025 11:52:53 +0100 Subject: [PATCH 53/61] Correct test handling --- tests/Controller/API/BulkStoreApiTest.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/Controller/API/BulkStoreApiTest.php b/tests/Controller/API/BulkStoreApiTest.php index ac34b6f7..3984042d 100644 --- a/tests/Controller/API/BulkStoreApiTest.php +++ b/tests/Controller/API/BulkStoreApiTest.php @@ -36,8 +36,8 @@ public function test_store_links(): void 'duckduckgo.com' => Http::response($testHtml), ]); - $testList = LinkList::factory()->create(); - $testTag = Tag::factory()->create(); + $testList = LinkList::factory()->create(['name' => 'existing List']); + $testTag = Tag::factory()->create(['name' => 'existingTag']); $response = $this->postJson('api/v2/bulk/links', [ 'models' => [ @@ -66,10 +66,10 @@ public function test_store_links(): void $this->assertEquals('https://example.com', $response->json()[0]['url']); $this->assertEquals('https://duckduckgo.com', $response->json()[1]['url']); - $this->assertEquals($testList->name, $response->json()[0]['lists'][0]['name']); + $this->assertEquals('existing List', $response->json()[0]['lists'][0]['name']); $this->assertEquals('new List', $response->json()[0]['lists'][1]['name']); - $this->assertEquals($testTag->name, $response->json()[0]['tags'][0]['name']); + $this->assertEquals('existingTag', $response->json()[0]['tags'][0]['name']); $this->assertEquals('newTag', $response->json()[0]['tags'][1]['name']); $this->assertDatabaseHas('links', [ From 13657f4f8c29a1a7c20d3efbbd4a6ffc972feda9 Mon Sep 17 00:00:00 2001 From: Kevin Woblick Date: Fri, 21 Mar 2025 18:18:50 +0100 Subject: [PATCH 54/61] Fix handling of search queries for the new tag and list selects --- app/Http/Controllers/Traits/SearchesLinks.php | 20 +++++++++++-------- tests/Controller/App/SearchControllerTest.php | 4 ++++ tests/TestCase.php | 3 +++ 3 files changed, 19 insertions(+), 8 deletions(-) diff --git a/app/Http/Controllers/Traits/SearchesLinks.php b/app/Http/Controllers/Traits/SearchesLinks.php index c75f1f2e..47f63a76 100644 --- a/app/Http/Controllers/Traits/SearchesLinks.php +++ b/app/Http/Controllers/Traits/SearchesLinks.php @@ -73,10 +73,12 @@ protected function buildDatabaseQuery(SearchRequest $request): Builder $search->doesntHave('lists'); } elseif ($request->input('only_lists')) { $lists = $request->input('only_lists', '[]'); - $this->searchLists = preg_match('/\[.+\]/', $lists) ? json_decode($lists) : explode(',', $lists); - $search->whereHas('lists', function ($query) { - $query->whereIn('id', $this->searchLists); - }); + $this->searchLists = preg_match('/\[.*\]/', $lists) > 0 ? json_decode($lists) : explode(',', $lists); + if (!empty($this->searchLists)) { + $search->whereHas('lists', function ($query) { + $query->whereIn('id', $this->searchLists); + }); + } } // Show by specific tag only if applicable @@ -84,10 +86,12 @@ protected function buildDatabaseQuery(SearchRequest $request): Builder $search->doesntHave('tags'); } elseif ($request->input('only_tags')) { $tags = $request->input('only_tags', '[]'); - $this->searchTags = preg_match('/\[.+\]/', $tags) ? json_decode($tags) : explode(',', $tags); - $search->whereHas('tags', function ($query) { - $query->whereIn('id', $this->searchTags); - }); + $this->searchTags = preg_match('/\[.*\]/', $tags) > 0 ? json_decode($tags) : explode(',', $tags); + if (!empty($this->searchTags)) { + $search->whereHas('tags', function ($query) { + $query->whereIn('id', $this->searchTags); + }); + } } // Order the results if applicable and only allow predefined ordering diff --git a/tests/Controller/App/SearchControllerTest.php b/tests/Controller/App/SearchControllerTest.php index b82995dc..26dfa3ff 100644 --- a/tests/Controller/App/SearchControllerTest.php +++ b/tests/Controller/App/SearchControllerTest.php @@ -119,6 +119,7 @@ public function test_valid_broken_search_result(): void public function test_valid_tag_search_result(): void { $response = $this->post('search', [ + 'only_lists' => '[]', 'only_tags' => json_encode([1]), ]); @@ -130,6 +131,7 @@ public function test_valid_tag_search_result(): void public function test_valid_tag_search_result_without_result(): void { $response = $this->post('search', [ + 'only_lists' => '[]', 'only_tags' => json_encode([5]), ]); @@ -142,6 +144,7 @@ public function test_valid_list_search_result(): void { $response = $this->post('search', [ 'only_lists' => json_encode([1]), + 'only_tags' => '[]', ]); $response->assertOk() @@ -153,6 +156,7 @@ public function test_valid_list_search_result_without_results(): void { $response = $this->post('search', [ 'only_lists' => json_encode([5]), + 'only_tags' => '[]', ]); $response->assertOk() diff --git a/tests/TestCase.php b/tests/TestCase.php index 7f06595a..ba953e8e 100644 --- a/tests/TestCase.php +++ b/tests/TestCase.php @@ -6,6 +6,7 @@ use Illuminate\Foundation\Testing\TestCase as BaseTestCase; use Illuminate\Support\Facades\Http; use Illuminate\Support\Facades\Schema; +use Spatie\LaravelRay\Ray; abstract class TestCase extends BaseTestCase { @@ -16,6 +17,8 @@ protected function setUp(): void parent::setUp(); Http::preventStrayRequests(); + Ray::beforeSendRequest(fn()=> $this->fail('Ray is present in application code!')); + if (Schema::hasTable('settings')) { SystemSettings::fake([ 'setup_completed' => true, From d536ba8aa3ca57a2b910adfbacbe52debc301950 Mon Sep 17 00:00:00 2001 From: Kevin Woblick Date: Fri, 21 Mar 2025 18:19:06 +0100 Subject: [PATCH 55/61] v2.1.6 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 71d94de0..cb8af9a7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "linkace", - "version": "2.1.5", + "version": "2.1.6", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "linkace", - "version": "2.1.5", + "version": "2.1.6", "license": "GPL-3.0-or-later", "dependencies": { "bootstrap": "^5.3.3", diff --git a/package.json b/package.json index bb413dfc..3dce6f7e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "linkace", - "version": "2.1.5", + "version": "2.1.6", "description": "A small, selfhosted bookmark manager with advanced features, built with Laravel and Docker", "homepage": "https://github.com/Kovah/LinkAce", "repository": { From f8a494ac8f657826abe4df74df50502e07f71c00 Mon Sep 17 00:00:00 2001 From: Kevin Woblick Date: Sat, 22 Mar 2025 10:10:16 +0100 Subject: [PATCH 56/61] Remove ray() test --- tests/TestCase.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/tests/TestCase.php b/tests/TestCase.php index ba953e8e..df59e086 100644 --- a/tests/TestCase.php +++ b/tests/TestCase.php @@ -17,8 +17,6 @@ protected function setUp(): void parent::setUp(); Http::preventStrayRequests(); - Ray::beforeSendRequest(fn()=> $this->fail('Ray is present in application code!')); - if (Schema::hasTable('settings')) { SystemSettings::fake([ 'setup_completed' => true, From 02297850b4356abe4881d5e32569a1382d949672 Mon Sep 17 00:00:00 2001 From: Kevin Woblick Date: Thu, 27 Mar 2025 11:03:44 +0100 Subject: [PATCH 57/61] Minor fixes regarding SQLite web setup --- resources/views/setup/database.blade.php | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/resources/views/setup/database.blade.php b/resources/views/setup/database.blade.php index 385a6036..96b7e406 100644 --- a/resources/views/setup/database.blade.php +++ b/resources/views/setup/database.blade.php @@ -48,10 +48,10 @@ class="form-select{{ $errors->has('connection') ? ' is-invalid' : '' }}"> - + value="{{ old('db_path') ?: env('DB_DATABASE', database_path('database.sqlite')) }}"> @if ($errors->has('db_path'))