From b0b9873ba5a3e787699bdba40d15a4db754b7a6b Mon Sep 17 00:00:00 2001 From: Kovah Date: Tue, 10 Mar 2020 09:44:37 +0100 Subject: [PATCH 01/44] The user factory should also generate an api token --- database/factories/UserFactory.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/database/factories/UserFactory.php b/database/factories/UserFactory.php index 8205f421..e2191f3d 100644 --- a/database/factories/UserFactory.php +++ b/database/factories/UserFactory.php @@ -8,6 +8,6 @@ 'name' => $faker->userName, 'email' => $faker->unique()->safeEmail, 'password' => '$2y$10$9.preebMjZ.8obdvk5ZVdOCw7Cq1EJm6i1B1RJevxCXYW0lUiwDJG', // secretpassword - 'remember_token' => Str::random(10), + 'api_token' => Str::random(32), ]; }); From 91ca65c1ca76b75c976974e3cf30b397a12cfef2 Mon Sep 17 00:00:00 2001 From: Kovah Date: Tue, 10 Mar 2020 19:05:48 +0100 Subject: [PATCH 02/44] Refactor the link create and update requests to be compatible with the API system --- .../Controllers/Models/LinkController.php | 5 ++ app/Http/Requests/Models/LinkStoreRequest.php | 20 +++-- .../Requests/Models/LinkUpdateRequest.php | 20 +++-- app/Repositories/LinkRepository.php | 84 ++++++++++++------- .../Controller/Models/LinkControllerTest.php | 19 +---- 5 files changed, 90 insertions(+), 58 deletions(-) diff --git a/app/Http/Controllers/Models/LinkController.php b/app/Http/Controllers/Models/LinkController.php index 75476982..579e1015 100644 --- a/app/Http/Controllers/Models/LinkController.php +++ b/app/Http/Controllers/Models/LinkController.php @@ -158,6 +158,11 @@ public function destroy(LinkDeleteRequest $request, $id) return redirect()->route('links.index'); } + /** + * @param LinkToggleCheckRequest $request + * @param int $id + * @return RedirectResponse + */ public function updateCheckToggle(LinkToggleCheckRequest $request, $id) { $link = Link::findOrFail($id); diff --git a/app/Http/Requests/Models/LinkStoreRequest.php b/app/Http/Requests/Models/LinkStoreRequest.php index 957708e3..db5d62a6 100644 --- a/app/Http/Requests/Models/LinkStoreRequest.php +++ b/app/Http/Requests/Models/LinkStoreRequest.php @@ -3,6 +3,7 @@ namespace App\Http\Requests\Models; use Illuminate\Foundation\Http\FormRequest; +use Illuminate\Http\Request; use Illuminate\Validation\Rule; /** @@ -12,13 +13,18 @@ */ class LinkStoreRequest extends FormRequest { + /** @var bool */ + private $isApiRequest; + /** * Determine if the user is authorized to make this request. * * @return bool */ - public function authorize(): bool + public function authorize(Request $request): bool { + $this->isApiRequest = $request->isJson(); + return true; } @@ -32,15 +38,17 @@ public function rules(): array return [ 'url' => [ 'required', + 'string', Rule::unique('links')->where(function ($query) { return $query->where('user_id', auth()->user()->id); }), ], - 'title' => 'present', - 'description' => 'present', - 'lists' => 'present', - 'tags' => 'present', - 'is_private' => 'required|boolean', + 'title' => 'nullable|string', + 'description' => 'nullable|string', + 'lists' => $this->isApiRequest ? 'array' : 'nullable|string', + 'tags' => $this->isApiRequest ? 'array' : 'nullable|string', + 'is_private' => 'sometimes|boolean', + 'check_disabled' => 'sometimes|boolean', ]; } } diff --git a/app/Http/Requests/Models/LinkUpdateRequest.php b/app/Http/Requests/Models/LinkUpdateRequest.php index 15627489..2e83098b 100644 --- a/app/Http/Requests/Models/LinkUpdateRequest.php +++ b/app/Http/Requests/Models/LinkUpdateRequest.php @@ -15,7 +15,10 @@ class LinkUpdateRequest extends FormRequest { /** @var bool */ - private $requireUniqueUrl = false; + private $requireUniqueUrl; + + /** @var bool */ + private $isApiRequest; /** * Determine if the user is authorized to make this request. @@ -25,6 +28,8 @@ class LinkUpdateRequest extends FormRequest */ public function authorize(Request $request) { + $this->isApiRequest = $request->isJson(); + $this->requireUniqueUrl = Link::urlHasChanged($request->route('link'), $request->input('url', '')); return true; @@ -38,12 +43,13 @@ public function authorize(Request $request) public function rules() { $rules = [ - 'url' => 'required', - 'title' => 'present', - 'description' => 'present', - 'lists' => 'present', - 'tags' => 'present', - 'is_private' => 'required|boolean', + 'url' => 'required|string', + 'title' => 'nullable|string', + 'description' => 'nullable|string', + 'lists' => $this->isApiRequest ? 'array' : 'nullable|string', + 'tags' => $this->isApiRequest ? 'array' : 'nullable|string', + 'is_private' => 'sometimes|boolean', + 'check_disabled' => 'sometimes|boolean', ]; if ($this->requireUniqueUrl) { diff --git a/app/Repositories/LinkRepository.php b/app/Repositories/LinkRepository.php index c4294e9d..23a67a6b 100644 --- a/app/Repositories/LinkRepository.php +++ b/app/Repositories/LinkRepository.php @@ -31,8 +31,8 @@ public static function create(array $data): Link { $linkMeta = LinkAce::getMetaFromURL($data['url']); - $data['title'] = $data['title'] ?: $linkMeta['title']; - $data['description'] = $data['description'] ?: $linkMeta['description']; + $data['title'] = $data['title'] ?? $linkMeta['title']; + $data['description'] = $data['description'] ?? $linkMeta['description']; $data['user_id'] = auth()->user()->id; $data['icon'] = LinkIconMapper::mapLink($data['url']); @@ -96,54 +96,82 @@ public static function delete(Link $link): bool /** * Create or get the tags from the input and attach them to the link. * - * @param Link $link - * @param string $tags + * @param Link $link + * @param array|string $tags + */ + protected static function updateTagsForLink(Link $link, $tags): void + { + if (is_array($tags)) { + $newTags = self::processTaxonomyAsArray(Tag::class, $tags); + } else { + $newTags = self::processTaxonomyAsString(Tag::class, $tags); + } + + $link->tags()->sync($newTags); + } + + /** + * Create or get the lists from the input and attach them to the link. + * + * @param Link $link + * @param array|string $lists */ - protected static function updateTagsForLink(Link $link, string $tags): void + protected static function updateListsForLink(Link $link, $lists): void { - if (empty($tags)) { - return; + if (is_array($lists)) { + $newLists = self::processTaxonomyAsArray(LinkList::class, $lists); + } else { + $newLists = self::processTaxonomyAsString(LinkList::class, $lists); } + $link->lists()->sync($newLists); + } + + /** + * Tags or lists are passed as comma-delimited string in the LinkAce + * frontend. Parsing the string also creates the corresponding tag or list + * if it does not exist already. + * + * @param string $model + * @param string $tags + * @return array + */ + protected static function processTaxonomyAsString(string $model, string $tags): array + { $parsedTags = explode(',', $tags); $newTags = []; foreach ($parsedTags as $tag) { - $new_tag = Tag::firstOrCreate([ + $newTag = $model::firstOrCreate([ 'user_id' => auth()->user()->id, 'name' => $tag, ]); - $newTags[] = $new_tag->id; + $newTags[] = $newTag->id; } - $link->tags()->sync($newTags); + return $newTags; } /** - * Create or get the lists from the input and attach them to the link. + * Tags or lists are passed as arrays containing the model IDs in API + * calls. The passed IDs are first checked for existence before allowing + * them to be synced with the link. * - * @param Link $link - * @param string $lists + * @param string $model + * @param array $data + * @return array */ - protected static function updateListsForLink(Link $link, string $lists): void + protected static function processTaxonomyAsArray(string $model, array $data): array { - if (empty($lists)) { - return; - } - - $parsedLists = explode(',', $lists); - $newLists = []; - - foreach ($parsedLists as $list) { - $new_list = LinkList::firstOrCreate([ - 'user_id' => auth()->user()->id, - 'name' => $list, - ]); + $entries = []; - $newLists[] = $new_list->id; + foreach ($data as $entry) { + if ($model::first($entry)) { + $entries[] = $entry; + } } - $link->lists()->sync($newLists); + return $entries; } } diff --git a/tests/Feature/Controller/Models/LinkControllerTest.php b/tests/Feature/Controller/Models/LinkControllerTest.php index 45d13169..14740ed6 100644 --- a/tests/Feature/Controller/Models/LinkControllerTest.php +++ b/tests/Feature/Controller/Models/LinkControllerTest.php @@ -48,11 +48,6 @@ public function testMinimalStoreRequest(): void { $response = $this->post('links', [ 'url' => 'https://example.com', - 'title' => null, - 'description' => null, - 'lists' => null, - 'tags' => null, - 'is_private' => '0', ]); $response->assertStatus(302) @@ -93,11 +88,6 @@ public function testStoreRequestWithContinue(): void { $response = $this->post('links', [ 'url' => 'https://example.com', - 'title' => null, - 'description' => null, - 'lists' => null, - 'tags' => null, - 'is_private' => '0', 'reload_view' => '1', ]); @@ -113,15 +103,10 @@ public function testValidationErrorForCreate(): void { $response = $this->post('links', [ 'url' => null, - 'is_private' => '0', ]); $response->assertSessionHasErrors([ 'url', - 'title', - 'description', - 'lists', - 'tags', ]); } @@ -151,13 +136,13 @@ public function testUpdateResponse(): void $response = $this->post('links/1', [ '_method' => 'patch', - 'link_id' => $baseLink->id, 'url' => 'https://new-example.com', 'title' => 'New Title', 'description' => 'New Description', 'lists' => null, 'tags' => null, 'is_private' => '0', + 'check_disabled' => '0', ]); $response->assertStatus(302) @@ -170,7 +155,7 @@ public function testUpdateResponse(): void $this->assertEquals('New Description', $updatedLink->description); } - public function testMissingMissingErrorForUpdate(): void + public function testMissingModelErrorForUpdate(): void { $response = $this->post('links/1', [ '_method' => 'patch', From 86db497cceb2d35b06ca42adae35ebaedac443fc Mon Sep 17 00:00:00 2001 From: Kovah Date: Tue, 10 Mar 2020 19:07:31 +0100 Subject: [PATCH 03/44] Implement first version of the link model API --- app/Http/Controllers/API/LinkController.php | 95 +++++++++ routes/api.php | 8 +- tests/Feature/Controller/API/LinkApiTest.php | 205 +++++++++++++++++++ 3 files changed, 307 insertions(+), 1 deletion(-) create mode 100644 app/Http/Controllers/API/LinkController.php create mode 100644 tests/Feature/Controller/API/LinkApiTest.php diff --git a/app/Http/Controllers/API/LinkController.php b/app/Http/Controllers/API/LinkController.php new file mode 100644 index 00000000..ad816f4f --- /dev/null +++ b/app/Http/Controllers/API/LinkController.php @@ -0,0 +1,95 @@ +id()) + ->orderBy( + $request->get('order_by', 'created_at'), + $request->get('order_dir', 'DESC') + ) + ->paginate(getPaginationLimit()); + + return response()->json($links); + } + + /** + * Store a newly created resource in storage. + * + * @param LinkStoreRequest $request + * @return Response + */ + public function store(LinkStoreRequest $request) + { + $link = LinkRepository::create($request->all()); + + return response()->json($link); + } + + /** + * Display the specified resource. + * + * @param int $id + * @return Response + */ + public function show($id) + { + $link = Link::findOrFail($id); + + return response()->json($link); + } + + /** + * Update the specified resource in storage. + * + * @param LinkUpdateRequest $request + * @param int $id + * @return Response + */ + public function update(LinkUpdateRequest $request, $id) + { + $link = Link::findOrFail($id); + + $updatedLink = LinkRepository::update($link, $request->all()); + + return response()->json($updatedLink); + } + + /** + * Remove the specified resource from storage. + * + * @param LinkDeleteRequest $request + * @param int $id + * @return Response + */ + public function destroy(LinkDeleteRequest $request, $id) + { + $link = Link::findOrFail($id); + + $deletionSuccessfull = LinkRepository::delete($link); + + if ($deletionSuccessfull) { + return response(null, Response::HTTP_OK); + } + + return response(null, Response::HTTP_INTERNAL_SERVER_ERROR); + } +} diff --git a/routes/api.php b/routes/api.php index 85296795..d8c68550 100644 --- a/routes/api.php +++ b/routes/api.php @@ -1,6 +1,6 @@ group(function () { + Route::middleware('auth:api')->group(function () { + Route::apiResource('links', LinkController::class); + }); +}); diff --git a/tests/Feature/Controller/API/LinkApiTest.php b/tests/Feature/Controller/API/LinkApiTest.php new file mode 100644 index 00000000..2efd0f32 --- /dev/null +++ b/tests/Feature/Controller/API/LinkApiTest.php @@ -0,0 +1,205 @@ +user = factory(User::class)->create(); + } + + public function testUnauthorizedRequest(): void + { + $response = $this->getJson('api/v1/links'); + + $response->assertUnauthorized(); + } + + public function testIndexRequest(): void + { + $link = factory(Link::class)->create(); + + $response = $this->getJson('api/v1/links', $this->generateHeaders()); + + $response->assertStatus(200) + ->assertJson([ + 'data' => [ + ['url' => $link->url], + ], + ]); + } + + public function testMinimalCreateRequest(): void + { + $response = $this->postJson('api/v1/links', [ + 'url' => 'https://duckduckgo.com', + ], $this->generateHeaders()); + + $response->assertStatus(200) + ->assertJson([ + 'url' => 'https://duckduckgo.com', + ]); + + $databaseLink = Link::first(); + + $this->assertEquals('https://duckduckgo.com', $databaseLink->url); + } + + public function testFullCreateRequest(): void + { + $list = factory(LinkList::class)->create(); + $tag = factory(Tag::class)->create(); + + $response = $this->postJson('api/v1/links', [ + 'url' => 'https://duckduckgo.com', + 'title' => 'Search the Web', + 'description' => 'There could be a description here', + 'lists' => [$list->id], + 'tags' => [$tag->id], + 'is_private' => false, + 'check_disabled' => false, + ], $this->generateHeaders()); + + $response->assertStatus(200) + ->assertJson([ + 'url' => 'https://duckduckgo.com', + ]); + + $databaseLink = Link::first(); + + $this->assertEquals('https://duckduckgo.com', $databaseLink->url); + } + + public function testInvalidCreateRequest(): void + { + $response = $this->postJson('api/v1/links', [ + 'url' => null, + 'lists' =>'no array', + 'tags' => 123, + 'is_private' => 'hello', + 'check_disabled' => 'bla', + ], $this->generateHeaders()); + + $response->assertStatus(422) + ->assertJsonValidationErrors([ + 'url', + 'lists', + 'tags', + 'is_private', + 'check_disabled', + ]); + } + + public function testShowRequest(): void + { + $link = factory(Link::class)->create(); + + $response = $this->getJson('api/v1/links/1', $this->generateHeaders()); + + $response->assertStatus(200) + ->assertJson([ + 'url' => $link->url, + ]); + } + + public function testShowRequestNotFound(): void + { + $response = $this->getJson('api/v1/links/1', $this->generateHeaders()); + + $response->assertStatus(404); + } + + public function testUpdateRequest(): void + { + $link = factory(Link::class)->create(); + $list = factory(LinkList::class)->create(); + + $response = $this->patchJson('api/v1/links/1', [ + 'url' => 'https://duckduckgo.com', + 'title' => 'Custom Title', + 'description' => 'Custom Description', + 'lists' => [$list->id], + 'is_private' => false, + 'check_disabled' => false, + ], $this->generateHeaders()); + + $response->assertStatus(200) + ->assertJson([ + 'url' => 'https://duckduckgo.com', + ]); + + $databaseLink = Link::first(); + + $this->assertEquals('https://duckduckgo.com', $databaseLink->url); + } + + public function testInvalidUpdateRequest(): void + { + $link = factory(Link::class)->create(); + + $response = $this->patchJson('api/v1/links/1', [ + // + ], $this->generateHeaders()); + + $response->assertStatus(422) + ->assertJsonValidationErrors([ + 'url', + ]); + } + + public function testUpdateRequestNotFound(): void + { + $response = $this->patchJson('api/v1/links/1', [ + 'url' => 'https://duckduckgo.com', + 'title' => 'Custom Title', + 'description' => 'Custom Description', + 'lists' => [], + 'tags' => [], + 'is_private' => false, + 'check_disabled' => false, + ], $this->generateHeaders()); + + $response->assertStatus(404); + } + + public function testDeleteRequest(): void + { + $link = factory(Link::class)->create(); + + $response = $this->deleteJson('api/v1/links/1', [], $this->generateHeaders()); + + $response->assertStatus(200); + + $this->assertEquals(0, Link::count()); + } + + public function testDeleteRequestNotFound(): void + { + $response = $this->deleteJson('api/v1/links/1', [], $this->generateHeaders()); + + $response->assertStatus(404); + } + + protected function generateHeaders(): array + { + return [ + 'Authorization' => 'Bearer ' . $this->user->api_token, + ]; + } +} From 24ab7921cd8e0cabc3bd92bf9a365d699d225602 Mon Sep 17 00:00:00 2001 From: Kovah Date: Tue, 10 Mar 2020 20:33:32 +0100 Subject: [PATCH 04/44] Extend the link API with all model relations --- app/Http/Controllers/API/LinkController.php | 2 +- tests/Feature/Controller/API/LinkApiTest.php | 23 ++++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/app/Http/Controllers/API/LinkController.php b/app/Http/Controllers/API/LinkController.php index ad816f4f..8b434f31 100644 --- a/app/Http/Controllers/API/LinkController.php +++ b/app/Http/Controllers/API/LinkController.php @@ -52,7 +52,7 @@ public function store(LinkStoreRequest $request) */ public function show($id) { - $link = Link::findOrFail($id); + $link = Link::with(['lists', 'tags'])->findOrFail($id); return response()->json($link); } diff --git a/tests/Feature/Controller/API/LinkApiTest.php b/tests/Feature/Controller/API/LinkApiTest.php index 2efd0f32..7f27680e 100644 --- a/tests/Feature/Controller/API/LinkApiTest.php +++ b/tests/Feature/Controller/API/LinkApiTest.php @@ -118,6 +118,29 @@ public function testShowRequest(): void ]); } + public function testShowRequestWithRelations(): void + { + $link = factory(Link::class)->create(); + $list = factory(LinkList::class)->create(); + $tag = factory(Tag::class)->create(); + + $link->lists()->sync([$list->id]); + $link->tags()->sync([$tag->id]); + + $response = $this->getJson('api/v1/links/1', $this->generateHeaders()); + + $response->assertStatus(200) + ->assertJson([ + 'url' => $link->url, + 'lists' => [ + ['name' => $list->name], + ], + 'tags' => [ + ['name' => $tag->name], + ], + ]); + } + public function testShowRequestNotFound(): void { $response = $this->getJson('api/v1/links/1', $this->generateHeaders()); From 308151e83355c1b97c70c603de2e93c4a656b478 Mon Sep 17 00:00:00 2001 From: Kovah Date: Tue, 10 Mar 2020 23:49:24 +0100 Subject: [PATCH 05/44] Implement first version of the list API --- app/Http/Controllers/API/ListController.php | 97 +++++++++ app/Http/Requests/Models/ListStoreRequest.php | 5 +- .../Requests/Models/ListUpdateRequest.php | 12 +- routes/api.php | 2 + tests/Feature/Controller/API/ListApiTest.php | 204 ++++++++++++++++++ 5 files changed, 312 insertions(+), 8 deletions(-) create mode 100644 app/Http/Controllers/API/ListController.php create mode 100644 tests/Feature/Controller/API/ListApiTest.php diff --git a/app/Http/Controllers/API/ListController.php b/app/Http/Controllers/API/ListController.php new file mode 100644 index 00000000..94fb6768 --- /dev/null +++ b/app/Http/Controllers/API/ListController.php @@ -0,0 +1,97 @@ +id()) + ->orderBy( + $request->get('order_by', 'created_at'), + $request->get('order_dir', 'DESC') + ) + ->paginate(getPaginationLimit()); + + return response()->json($lists); + } + + /** + * Store a newly created resource in storage. + * + * @param ListStoreRequest $request + * @return Response + */ + public function store(ListStoreRequest $request) + { + $link = ListRepository::create($request->all()); + + return response()->json($link); + } + + /** + * Display the specified resource. + * + * @param int $id + * @return Response + */ + public function show($id) + { + $list = LinkList::findOrFail($id); + + $list->links = $list->links()->paginate(5); + + return response()->json($list); + } + + /** + * Update the specified resource in storage. + * + * @param ListUpdateRequest $request + * @param int $id + * @return Response + */ + public function update(ListUpdateRequest $request, $id) + { + $list = LinkList::findOrFail($id); + + $updatedList = ListRepository::update($list, $request->all()); + + return response()->json($updatedList); + } + + /** + * Remove the specified resource from storage. + * + * @param ListDeleteRequest $request + * @param int $id + * @return Response + */ + public function destroy(ListDeleteRequest $request, $id) + { + $list = LinkList::findOrFail($id); + + $deletionSuccessfull = ListRepository::delete($list); + + if ($deletionSuccessfull) { + return response(null, Response::HTTP_OK); + } + + return response(null, Response::HTTP_INTERNAL_SERVER_ERROR); + } +} diff --git a/app/Http/Requests/Models/ListStoreRequest.php b/app/Http/Requests/Models/ListStoreRequest.php index a955c169..9a96d36c 100644 --- a/app/Http/Requests/Models/ListStoreRequest.php +++ b/app/Http/Requests/Models/ListStoreRequest.php @@ -29,8 +29,9 @@ public function authorize() public function rules() { return [ - 'name' => 'required', - 'is_private' => 'required|integer', + 'name' => 'required|string', + 'description' => 'nullable|string', + 'is_private' => 'sometimes|boolean', ]; } } diff --git a/app/Http/Requests/Models/ListUpdateRequest.php b/app/Http/Requests/Models/ListUpdateRequest.php index 775c1311..edc5f26c 100644 --- a/app/Http/Requests/Models/ListUpdateRequest.php +++ b/app/Http/Requests/Models/ListUpdateRequest.php @@ -15,7 +15,7 @@ class ListUpdateRequest extends FormRequest { /** @var bool */ - private $requireUniqueUrl = false; + private $requireUniqueName = false; /** * Determine if the user is authorized to make this request. @@ -25,7 +25,7 @@ class ListUpdateRequest extends FormRequest */ public function authorize(Request $request) { - $this->requireUniqueUrl = LinkList::nameHasChanged($request->route('list'), $request->input('name', '')); + $this->requireUniqueName = LinkList::nameHasChanged($request->route('list'), $request->input('name', '')); return true; } @@ -38,12 +38,12 @@ public function authorize(Request $request) public function rules() { $rules = [ - 'list_id' => 'required', - 'name' => 'required', - 'is_private' => 'required|integer', + 'name' => 'required|string', + 'description' => 'nullable|string', + 'is_private' => 'sometimes|boolean', ]; - if ($this->requireUniqueUrl) { + if ($this->requireUniqueName) { $rules['name'] = [ 'required', Rule::unique('lists')->where(function ($query) { diff --git a/routes/api.php b/routes/api.php index d8c68550..cec86c00 100644 --- a/routes/api.php +++ b/routes/api.php @@ -1,6 +1,7 @@ group(function () { Route::middleware('auth:api')->group(function () { Route::apiResource('links', LinkController::class); + Route::apiResource('lists', ListController::class); }); }); diff --git a/tests/Feature/Controller/API/ListApiTest.php b/tests/Feature/Controller/API/ListApiTest.php new file mode 100644 index 00000000..110b72f2 --- /dev/null +++ b/tests/Feature/Controller/API/ListApiTest.php @@ -0,0 +1,204 @@ +user = factory(User::class)->create(); + } + + public function testUnauthorizedRequest(): void + { + $response = $this->getJson('api/v1/lists'); + + $response->assertUnauthorized(); + } + + public function testIndexRequest(): void + { + $list = factory(LinkList::class)->create(); + + $response = $this->getJson('api/v1/lists', $this->generateHeaders()); + + $response->assertStatus(200) + ->assertJson([ + 'data' => [ + ['name' => $list->name], + ], + ]); + } + + public function testMinimalCreateRequest(): void + { + $response = $this->postJson('api/v1/lists', [ + 'name' => 'Test List', + ], $this->generateHeaders()); + + $response->assertStatus(200) + ->assertJson([ + 'name' => 'Test List', + ]); + + $databaseList = LinkList::first(); + + $this->assertEquals('Test List', $databaseList->name); + } + + public function testFullCreateRequest(): void + { + $response = $this->postJson('api/v1/lists', [ + 'name' => 'Test List', + 'description' => 'There could be a description here', + 'is_private' => false, + 'check_disabled' => false, + ], $this->generateHeaders()); + + $response->assertStatus(200) + ->assertJson([ + 'name' => 'Test List', + ]); + + $databaseList = LinkList::first(); + + $this->assertEquals('Test List', $databaseList->name); + } + + public function testInvalidCreateRequest(): void + { + $response = $this->postJson('api/v1/lists', [ + 'name' => null, + 'is_private' => 'hello', + ], $this->generateHeaders()); + + $response->assertStatus(422) + ->assertJsonValidationErrors([ + 'name', + 'is_private', + ]); + } + + public function testShowRequest(): void + { + $list = factory(LinkList::class)->create(); + + $response = $this->getJson('api/v1/lists/1', $this->generateHeaders()); + + $response->assertStatus(200) + ->assertJson([ + 'name' => $list->name, + ]); + } + + public function testShowRequestWithRelations(): void + { + $link = factory(Link::class)->create(); + $list = factory(LinkList::class)->create(); + + $link->lists()->sync([$list->id]); + + $response = $this->getJson('api/v1/lists/1', $this->generateHeaders()); + + $response->assertStatus(200) + ->assertJson([ + 'name' => $list->name, + 'links' => [ + 'data' => [ + ['url' => $link->url] + ] + ], + ]); + } + + public function testShowRequestNotFound(): void + { + $response = $this->getJson('api/v1/lists/1', $this->generateHeaders()); + + $response->assertStatus(404); + } + + public function testUpdateRequest(): void + { + $list = factory(LinkList::class)->create(); + + $response = $this->patchJson('api/v1/lists/1', [ + 'name' => 'Updated List Title', + 'description' => 'Custom Description', + 'is_private' => false, + ], $this->generateHeaders()); + + $response->assertStatus(200) + ->assertJson([ + 'name' => 'Updated List Title', + ]); + + $databaseList = LinkList::first(); + + $this->assertEquals('Updated List Title', $databaseList->name); + } + + public function testInvalidUpdateRequest(): void + { + $list = factory(LinkList::class)->create(); + + $response = $this->patchJson('api/v1/lists/1', [ + // + ], $this->generateHeaders()); + + $response->assertStatus(422) + ->assertJsonValidationErrors([ + 'name', + ]); + } + + public function testUpdateRequestNotFound(): void + { + $response = $this->patchJson('api/v1/lists/1', [ + 'name' => 'Updated List Title', + 'description' => 'Custom Description', + 'is_private' => false, + ], $this->generateHeaders()); + + $response->assertStatus(404); + } + + public function testDeleteRequest(): void + { + $list = factory(LinkList::class)->create(); + + $response = $this->deleteJson('api/v1/lists/1', [], $this->generateHeaders()); + + $response->assertStatus(200); + + $this->assertEquals(0, LinkList::count()); + } + + public function testDeleteRequestNotFound(): void + { + $response = $this->deleteJson('api/v1/lists/1', [], $this->generateHeaders()); + + $response->assertStatus(404); + } + + protected function generateHeaders(): array + { + return [ + 'Authorization' => 'Bearer ' . $this->user->api_token, + ]; + } +} From b6f829fc5f7e63a61b75e483081c543c4ea619f5 Mon Sep 17 00:00:00 2001 From: Kovah Date: Fri, 17 Apr 2020 16:20:52 +0200 Subject: [PATCH 06/44] Add separate API call to get links of a list --- app/Http/Controllers/API/ListController.php | 2 +- .../Controllers/API/ListLinksController.php | 25 +++++++ routes/api.php | 23 +++++- tests/Feature/Controller/API/ListApiTest.php | 21 +----- .../Feature/Controller/API/ListLinksTest.php | 72 +++++++++++++++++++ 5 files changed, 121 insertions(+), 22 deletions(-) create mode 100644 app/Http/Controllers/API/ListLinksController.php create mode 100644 tests/Feature/Controller/API/ListLinksTest.php diff --git a/app/Http/Controllers/API/ListController.php b/app/Http/Controllers/API/ListController.php index 94fb6768..aaad4b7c 100644 --- a/app/Http/Controllers/API/ListController.php +++ b/app/Http/Controllers/API/ListController.php @@ -54,7 +54,7 @@ public function show($id) { $list = LinkList::findOrFail($id); - $list->links = $list->links()->paginate(5); + $list->links = route('api.lists.links', [$id], true); return response()->json($list); } diff --git a/app/Http/Controllers/API/ListLinksController.php b/app/Http/Controllers/API/ListLinksController.php new file mode 100644 index 00000000..7f324fb4 --- /dev/null +++ b/app/Http/Controllers/API/ListLinksController.php @@ -0,0 +1,25 @@ +links()->paginate(getPaginationLimit()); + + return response()->json($links); + } +} diff --git a/routes/api.php b/routes/api.php index cec86c00..0f96fe95 100644 --- a/routes/api.php +++ b/routes/api.php @@ -2,6 +2,7 @@ use App\Http\Controllers\API\LinkController; use App\Http\Controllers\API\ListController; +use App\Http\Controllers\API\ListLinksController; /* |-------------------------------------------------------------------------- @@ -16,7 +17,25 @@ Route::prefix('v1')->group(function () { Route::middleware('auth:api')->group(function () { - Route::apiResource('links', LinkController::class); - Route::apiResource('lists', ListController::class); + Route::apiResource('links', LinkController::class) + ->names([ + 'index' => 'api.links.index', + 'show' => 'api.links.show', + 'store' => 'api.links.store', + 'update' => 'api.links.update', + 'destroy' => 'api.links.destroy', + ]); + + Route::apiResource('lists', ListController::class) + ->names([ + 'index' => 'api.lists.index', + 'show' => 'api.lists.show', + 'store' => 'api.lists.store', + 'update' => 'api.lists.update', + 'destroy' => 'api.lists.destroy', + ]); + + Route::get('lists/{list}/links', ListLinksController::class) + ->name('api.lists.links'); }); }); diff --git a/tests/Feature/Controller/API/ListApiTest.php b/tests/Feature/Controller/API/ListApiTest.php index 110b72f2..e525ec7b 100644 --- a/tests/Feature/Controller/API/ListApiTest.php +++ b/tests/Feature/Controller/API/ListApiTest.php @@ -99,29 +99,12 @@ public function testShowRequest(): void $response = $this->getJson('api/v1/lists/1', $this->generateHeaders()); - $response->assertStatus(200) - ->assertJson([ - 'name' => $list->name, - ]); - } - - public function testShowRequestWithRelations(): void - { - $link = factory(Link::class)->create(); - $list = factory(LinkList::class)->create(); - - $link->lists()->sync([$list->id]); - - $response = $this->getJson('api/v1/lists/1', $this->generateHeaders()); + $expectedLinkApiUrl = 'http://localhost/api/v1/lists/1/links'; $response->assertStatus(200) ->assertJson([ 'name' => $list->name, - 'links' => [ - 'data' => [ - ['url' => $link->url] - ] - ], + 'links' => $expectedLinkApiUrl, ]); } diff --git a/tests/Feature/Controller/API/ListLinksTest.php b/tests/Feature/Controller/API/ListLinksTest.php new file mode 100644 index 00000000..047b8213 --- /dev/null +++ b/tests/Feature/Controller/API/ListLinksTest.php @@ -0,0 +1,72 @@ +user = factory(User::class)->create(); + } + + public function testLinksRequest(): void + { + $link = factory(Link::class)->create(); + $list = factory(LinkList::class)->create(); + + $link->lists()->sync([$list->id]); + + $response = $this->getJson('api/v1/lists/1/links', $this->generateHeaders()); + + $response->assertStatus(200) + ->assertJson([ + 'data' => [ + ['url' => $link->url] + ] + ]); + } + + public function testLinksRequestWithoutLinks(): void + { + $list = factory(LinkList::class)->create(); + + $response = $this->getJson('api/v1/lists/1/links', $this->generateHeaders()); + + $response->assertStatus(200) + ->assertJson([ + 'data' => [] + ]); + + $responseBody = json_decode($response->content()); + + $this->assertEmpty($responseBody->data); + } + + public function testShowRequestNotFound(): void + { + $response = $this->getJson('api/v1/lists/1/links', $this->generateHeaders()); + + $response->assertStatus(404); + } + + protected function generateHeaders(): array + { + return [ + 'Authorization' => 'Bearer ' . $this->user->api_token, + ]; + } +} From 16a1097c5ef11d8e5d092111f59efbd43e6d1ddb Mon Sep 17 00:00:00 2001 From: Kovah Date: Fri, 17 Apr 2020 16:31:44 +0200 Subject: [PATCH 07/44] Correct list link api test class name --- tests/Feature/Controller/API/ListLinksTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Feature/Controller/API/ListLinksTest.php b/tests/Feature/Controller/API/ListLinksTest.php index 047b8213..b518b3e3 100644 --- a/tests/Feature/Controller/API/ListLinksTest.php +++ b/tests/Feature/Controller/API/ListLinksTest.php @@ -9,7 +9,7 @@ use Illuminate\Foundation\Testing\DatabaseTransactions; use Tests\TestCase; -class ListApiTest extends TestCase +class ListLinksTest extends TestCase { use DatabaseTransactions; use DatabaseMigrations; From bf4346d26c656daba6975008db6cf6baaae066d1 Mon Sep 17 00:00:00 2001 From: Kovah Date: Sat, 18 Apr 2020 11:14:20 +0200 Subject: [PATCH 08/44] Implement first version of the tag API --- app/Http/Controllers/API/TagController.php | 95 ++++++++++ app/Http/Requests/Models/TagStoreRequest.php | 2 +- app/Http/Requests/Models/TagUpdateRequest.php | 1 - routes/api.php | 10 + tests/Feature/Controller/API/TagApiTest.php | 179 ++++++++++++++++++ 5 files changed, 285 insertions(+), 2 deletions(-) create mode 100644 app/Http/Controllers/API/TagController.php create mode 100644 tests/Feature/Controller/API/TagApiTest.php diff --git a/app/Http/Controllers/API/TagController.php b/app/Http/Controllers/API/TagController.php new file mode 100644 index 00000000..66d2e4c8 --- /dev/null +++ b/app/Http/Controllers/API/TagController.php @@ -0,0 +1,95 @@ +id()) + ->orderBy( + $request->get('order_by', 'created_at'), + $request->get('order_dir', 'DESC') + ) + ->paginate(getPaginationLimit()); + + return response()->json($tags); + } + + /** + * Store a newly created resource in storage. + * + * @param TagStoreRequest $request + * @return Response + */ + public function store(TagStoreRequest $request) + { + $tag = TagRepository::create($request->all()); + + return response()->json($tag); + } + + /** + * Display the specified resource. + * + * @param int $id + * @return Response + */ + public function show($id) + { + $tag = Tag::findOrFail($id); + + return response()->json($tag); + } + + /** + * Update the specified resource in storage. + * + * @param TagUpdateRequest $request + * @param int $id + * @return Response + */ + public function update(TagUpdateRequest $request, $id) + { + $tag = Tag::findOrFail($id); + + $updatedTag = TagRepository::update($tag, $request->all()); + + return response()->json($updatedTag); + } + + /** + * Remove the specified resource from storage. + * + * @param TagDeleteRequest $request + * @param int $id + * @return Response + */ + public function destroy(TagDeleteRequest $request, $id) + { + $tag = Tag::findOrFail($id); + + $deletionSuccessfull = TagRepository::delete($tag); + + if ($deletionSuccessfull) { + return response(null, Response::HTTP_OK); + } + + return response(null, Response::HTTP_INTERNAL_SERVER_ERROR); + } +} diff --git a/app/Http/Requests/Models/TagStoreRequest.php b/app/Http/Requests/Models/TagStoreRequest.php index e737d6f4..aabb0c75 100644 --- a/app/Http/Requests/Models/TagStoreRequest.php +++ b/app/Http/Requests/Models/TagStoreRequest.php @@ -36,7 +36,7 @@ public function rules() return $query->where('user_id', auth()->user()->id); }), ], - 'is_private' => 'required|boolean', + 'is_private' => 'sometimes|boolean', ]; } } diff --git a/app/Http/Requests/Models/TagUpdateRequest.php b/app/Http/Requests/Models/TagUpdateRequest.php index af3f5791..f4d5532b 100644 --- a/app/Http/Requests/Models/TagUpdateRequest.php +++ b/app/Http/Requests/Models/TagUpdateRequest.php @@ -38,7 +38,6 @@ public function authorize(Request $request) public function rules() { $rules = [ - 'tag_id' => 'required', 'name' => 'required', 'is_private' => 'required|boolean', ]; diff --git a/routes/api.php b/routes/api.php index 0f96fe95..18bbd047 100644 --- a/routes/api.php +++ b/routes/api.php @@ -3,6 +3,7 @@ use App\Http\Controllers\API\LinkController; use App\Http\Controllers\API\ListController; use App\Http\Controllers\API\ListLinksController; +use App\Http\Controllers\API\TagController; /* |-------------------------------------------------------------------------- @@ -37,5 +38,14 @@ Route::get('lists/{list}/links', ListLinksController::class) ->name('api.lists.links'); + + Route::apiResource('tags', TagController::class) + ->names([ + 'index' => 'api.tags.index', + 'show' => 'api.tags.show', + 'store' => 'api.tags.store', + 'update' => 'api.tags.update', + 'destroy' => 'api.tags.destroy', + ]); }); }); diff --git a/tests/Feature/Controller/API/TagApiTest.php b/tests/Feature/Controller/API/TagApiTest.php new file mode 100644 index 00000000..dde3a450 --- /dev/null +++ b/tests/Feature/Controller/API/TagApiTest.php @@ -0,0 +1,179 @@ +user = factory(User::class)->create(); + } + + public function testUnauthorizedRequest(): void + { + $response = $this->getJson('api/v1/tags'); + + $response->assertUnauthorized(); + } + + public function testIndexRequest(): void + { + $tag = factory(Tag::class)->create(); + + $response = $this->getJson('api/v1/tags', $this->generateHeaders()); + + $response->assertStatus(200) + ->assertJson([ + 'data' => [ + ['name' => $tag->name], + ], + ]); + } + + public function testMinimalCreateRequest(): void + { + $response = $this->postJson('api/v1/tags', [ + 'name' => 'Test Tag', + ], $this->generateHeaders()); + + $response->assertStatus(200) + ->assertJson([ + 'name' => 'Test Tag', + ]); + + $databaseTag = Tag::first(); + + $this->assertEquals('Test Tag', $databaseTag->name); + } + + public function testFullCreateRequest(): void + { + $response = $this->postJson('api/v1/tags', [ + 'name' => 'Test Tag', + 'is_private' => false, + ], $this->generateHeaders()); + + $response->assertStatus(200) + ->assertJson([ + 'name' => 'Test Tag', + ]); + + $databaseTag = Tag::first(); + + $this->assertEquals('Test Tag', $databaseTag->name); + } + + public function testInvalidCreateRequest(): void + { + $response = $this->postJson('api/v1/tags', [ + 'name' => null, + 'is_private' => 'hello', + ], $this->generateHeaders()); + + $response->assertStatus(422) + ->assertJsonValidationErrors([ + 'name', + 'is_private', + ]); + } + + public function testShowRequest(): void + { + $tag = factory(Tag::class)->create(); + + $response = $this->getJson('api/v1/tags/1', $this->generateHeaders()); + + $response->assertStatus(200) + ->assertJson([ + 'name' => $tag->name, + ]); + } + + public function testShowRequestNotFound(): void + { + $response = $this->getJson('api/v1/tags/1', $this->generateHeaders()); + + $response->assertStatus(404); + } + + public function testUpdateRequest(): void + { + $tag = factory(Tag::class)->create(); + + $response = $this->patchJson('api/v1/tags/1', [ + 'name' => 'Updated Tag Title', + 'is_private' => false, + ], $this->generateHeaders()); + + $response->assertStatus(200) + ->assertJson([ + 'name' => 'Updated Tag Title', + ]); + + $databaseList = Tag::first(); + + $this->assertEquals('Updated Tag Title', $databaseList->name); + } + + public function testInvalidUpdateRequest(): void + { + $tag = factory(Tag::class)->create(); + + $response = $this->patchJson('api/v1/tags/1', [ + // + ], $this->generateHeaders()); + + $response->assertStatus(422) + ->assertJsonValidationErrors([ + 'name', + ]); + } + + public function testUpdateRequestNotFound(): void + { + $response = $this->patchJson('api/v1/tags/1', [ + 'name' => 'Updated Tag Title', + 'is_private' => false, + ], $this->generateHeaders()); + + $response->assertStatus(404); + } + + public function testDeleteRequest(): void + { + $tag = factory(Tag::class)->create(); + + $response = $this->deleteJson('api/v1/tags/1', [], $this->generateHeaders()); + + $response->assertStatus(200); + + $this->assertEquals(0, Tag::count()); + } + + public function testDeleteRequestNotFound(): void + { + $response = $this->deleteJson('api/v1/tags/1', [], $this->generateHeaders()); + + $response->assertStatus(404); + } + + protected function generateHeaders(): array + { + return [ + 'Authorization' => 'Bearer ' . $this->user->api_token, + ]; + } +} From 79147e71962dce5a9c200933b1e4e57f815e3120 Mon Sep 17 00:00:00 2001 From: Kovah Date: Sun, 19 Apr 2020 15:36:08 +0200 Subject: [PATCH 09/44] Minor fix for dark-mode card borders and variables --- resources/assets/sass/_variables-dark.scss | 37 ++++++++++++++++++- resources/assets/sass/custom/_dark-fixes.scss | 4 +- 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/resources/assets/sass/_variables-dark.scss b/resources/assets/sass/_variables-dark.scss index d25b8c69..3c8bbb3b 100644 --- a/resources/assets/sass/_variables-dark.scss +++ b/resources/assets/sass/_variables-dark.scss @@ -11,7 +11,7 @@ $gray-800: #3A3F44; $gray-900: #272B30; $black: #000; -$blue: #2F405A; +$blue: #44679F; $red: #ee5f5b; $orange: #fd7e14; $yellow: #f89406; @@ -28,6 +28,41 @@ $danger: $red; $light: $gray-200; $dark: $gray-900; +$colors: (); +$colors: map-merge( + ( + "blue": $blue, + "indigo": $indigo, + "purple": $purple, + "pink": $pink, + "red": $red, + "orange": $orange, + "yellow": $yellow, + "green": $green, + "teal": $teal, + "cyan": $cyan, + "white": $white, + "gray": $gray-600, + "gray-dark": $gray-800 + ), + $colors +); + +$theme-colors: (); +$theme-colors: map-merge( + ( + "primary": $primary, + "secondary": $secondary, + "success": $success, + "info": $info, + "warning": $warning, + "danger": $danger, + "light": $light, + "dark": $dark + ), + $theme-colors +); + $yiq-contrasted-threshold: 170; diff --git a/resources/assets/sass/custom/_dark-fixes.scss b/resources/assets/sass/custom/_dark-fixes.scss index 6325cd24..5493c464 100644 --- a/resources/assets/sass/custom/_dark-fixes.scss +++ b/resources/assets/sass/custom/_dark-fixes.scss @@ -19,7 +19,9 @@ .card { box-shadow: $box-shadow-sm; - border: 0; + border-left: 0; + border-right: 0; + border-color: transparent; } .card-table { From 92ebe792e49aa83e50422be6157ce8c5ba03d1f7 Mon Sep 17 00:00:00 2001 From: Kovah Date: Sun, 19 Apr 2020 15:39:34 +0200 Subject: [PATCH 10/44] Add separate API call to get links of a tag --- .../Controllers/API/TagLinksController.php | 25 +++++++ routes/api.php | 4 ++ tests/Feature/Controller/API/TagLinksTest.php | 72 +++++++++++++++++++ 3 files changed, 101 insertions(+) create mode 100644 app/Http/Controllers/API/TagLinksController.php create mode 100644 tests/Feature/Controller/API/TagLinksTest.php diff --git a/app/Http/Controllers/API/TagLinksController.php b/app/Http/Controllers/API/TagLinksController.php new file mode 100644 index 00000000..8d9d663f --- /dev/null +++ b/app/Http/Controllers/API/TagLinksController.php @@ -0,0 +1,25 @@ +links()->paginate(getPaginationLimit()); + + return response()->json($links); + } +} diff --git a/routes/api.php b/routes/api.php index 18bbd047..2cb42acf 100644 --- a/routes/api.php +++ b/routes/api.php @@ -4,6 +4,7 @@ use App\Http\Controllers\API\ListController; use App\Http\Controllers\API\ListLinksController; use App\Http\Controllers\API\TagController; +use App\Http\Controllers\API\TagLinksController; /* |-------------------------------------------------------------------------- @@ -47,5 +48,8 @@ 'update' => 'api.tags.update', 'destroy' => 'api.tags.destroy', ]); + + Route::get('tags/{tag}/links', TagLinksController::class) + ->name('api.tags.links'); }); }); diff --git a/tests/Feature/Controller/API/TagLinksTest.php b/tests/Feature/Controller/API/TagLinksTest.php new file mode 100644 index 00000000..82e15e31 --- /dev/null +++ b/tests/Feature/Controller/API/TagLinksTest.php @@ -0,0 +1,72 @@ +user = factory(User::class)->create(); + } + + public function testLinksRequest(): void + { + $link = factory(Link::class)->create(); + $tag = factory(Tag::class)->create(); + + $link->tags()->sync([$tag->id]); + + $response = $this->getJson('api/v1/tags/1/links', $this->generateHeaders()); + + $response->assertStatus(200) + ->assertJson([ + 'data' => [ + ['url' => $link->url], + ], + ]); + } + + public function testLinksRequestWithoutLinks(): void + { + $tag = factory(Tag::class)->create(); + + $response = $this->getJson('api/v1/tags/1/links', $this->generateHeaders()); + + $response->assertStatus(200) + ->assertJson([ + 'data' => [], + ]); + + $responseBody = json_decode($response->content()); + + $this->assertEmpty($responseBody->data); + } + + public function testShowRequestNotFound(): void + { + $response = $this->getJson('api/v1/tags/1/links', $this->generateHeaders()); + + $response->assertStatus(404); + } + + protected function generateHeaders(): array + { + return [ + 'Authorization' => 'Bearer ' . $this->user->api_token, + ]; + } +} From 09c80989717dc93041aa3c6e8289a4a33af8690e Mon Sep 17 00:00:00 2001 From: Kovah Date: Sun, 19 Apr 2020 15:49:14 +0200 Subject: [PATCH 11/44] Add separate API call to get notes of a link --- .../Controllers/API/LinkNotesController.php | 25 +++++++ routes/api.php | 4 ++ .../Feature/Controller/API/LinkNotesTest.php | 72 +++++++++++++++++++ 3 files changed, 101 insertions(+) create mode 100644 app/Http/Controllers/API/LinkNotesController.php create mode 100644 tests/Feature/Controller/API/LinkNotesTest.php diff --git a/app/Http/Controllers/API/LinkNotesController.php b/app/Http/Controllers/API/LinkNotesController.php new file mode 100644 index 00000000..d2efb1e6 --- /dev/null +++ b/app/Http/Controllers/API/LinkNotesController.php @@ -0,0 +1,25 @@ +notes()->paginate(getPaginationLimit()); + + return response()->json($notes); + } +} diff --git a/routes/api.php b/routes/api.php index 2cb42acf..e61b10a1 100644 --- a/routes/api.php +++ b/routes/api.php @@ -1,6 +1,7 @@ 'api.links.destroy', ]); + Route::get('links/{link}/notes', LinkNotesController::class) + ->name('api.links.notes'); + Route::apiResource('lists', ListController::class) ->names([ 'index' => 'api.lists.index', diff --git a/tests/Feature/Controller/API/LinkNotesTest.php b/tests/Feature/Controller/API/LinkNotesTest.php new file mode 100644 index 00000000..258256d6 --- /dev/null +++ b/tests/Feature/Controller/API/LinkNotesTest.php @@ -0,0 +1,72 @@ +user = factory(User::class)->create(); + } + + public function testLinksRequest(): void + { + $link = factory(Link::class)->create(); + $note = factory(Note::class)->create([ + 'link_id' => $link->id, + ]); + + $response = $this->getJson('api/v1/links/1/notes', $this->generateHeaders()); + + $response->assertStatus(200) + ->assertJson([ + 'data' => [ + ['note' => $note->note], + ], + ]); + } + + public function testLinksRequestWithoutLinks(): void + { + $link = factory(Link::class)->create(); + + $response = $this->getJson('api/v1/links/1/notes', $this->generateHeaders()); + + $response->assertStatus(200) + ->assertJson([ + 'data' => [], + ]); + + $responseBody = json_decode($response->content()); + + $this->assertEmpty($responseBody->data); + } + + public function testShowRequestNotFound(): void + { + $response = $this->getJson('api/v1/links/1/notes', $this->generateHeaders()); + + $response->assertStatus(404); + } + + protected function generateHeaders(): array + { + return [ + 'Authorization' => 'Bearer ' . $this->user->api_token, + ]; + } +} From 7726f90733c160c77b88d2909963e8d3d4b18b79 Mon Sep 17 00:00:00 2001 From: Kovah Date: Sun, 19 Apr 2020 15:50:08 +0200 Subject: [PATCH 12/44] Correct the namespace for all API tests --- tests/Feature/Controller/API/LinkApiTest.php | 2 +- tests/Feature/Controller/API/LinkNotesTest.php | 2 +- tests/Feature/Controller/API/ListApiTest.php | 2 +- tests/Feature/Controller/API/ListLinksTest.php | 2 +- tests/Feature/Controller/API/TagApiTest.php | 2 +- tests/Feature/Controller/API/TagLinksTest.php | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/tests/Feature/Controller/API/LinkApiTest.php b/tests/Feature/Controller/API/LinkApiTest.php index 7f27680e..517a0d08 100644 --- a/tests/Feature/Controller/API/LinkApiTest.php +++ b/tests/Feature/Controller/API/LinkApiTest.php @@ -1,6 +1,6 @@ Date: Sun, 19 Apr 2020 23:19:39 +0200 Subject: [PATCH 13/44] Implement first version of the note API --- app/Http/Controllers/Models/NoteController.php | 5 ++--- app/Http/Requests/Models/NoteStoreRequest.php | 2 +- app/Http/Requests/Models/NoteUpdateRequest.php | 4 ++-- routes/api.php | 9 +++++++++ tests/Feature/Controller/Models/NoteControllerTest.php | 4 ++-- 5 files changed, 16 insertions(+), 8 deletions(-) diff --git a/app/Http/Controllers/Models/NoteController.php b/app/Http/Controllers/Models/NoteController.php index 55673d93..809096b5 100644 --- a/app/Http/Controllers/Models/NoteController.php +++ b/app/Http/Controllers/Models/NoteController.php @@ -69,10 +69,9 @@ public function edit($id) */ public function update(NoteUpdateRequest $request, $id) { - $note = Note::findOrFail($request->get('note_id')); + $note = Note::findOrFail($id); - $data = $request->except(['_token', 'note_id']); - $note = NoteRepository::update($note, $data); + $note = NoteRepository::update($note, $request->except(['_token'])); alert(trans('note.updated_successfully'), 'success'); diff --git a/app/Http/Requests/Models/NoteStoreRequest.php b/app/Http/Requests/Models/NoteStoreRequest.php index 00108ac4..cbd2da68 100644 --- a/app/Http/Requests/Models/NoteStoreRequest.php +++ b/app/Http/Requests/Models/NoteStoreRequest.php @@ -31,7 +31,7 @@ public function rules() return [ 'link_id' => 'required', 'note' => 'required', - 'is_private' => 'boolean', + 'is_private' => 'sometimes|boolean', ]; } } diff --git a/app/Http/Requests/Models/NoteUpdateRequest.php b/app/Http/Requests/Models/NoteUpdateRequest.php index 88a49b49..be257407 100644 --- a/app/Http/Requests/Models/NoteUpdateRequest.php +++ b/app/Http/Requests/Models/NoteUpdateRequest.php @@ -31,9 +31,9 @@ public function authorize(Request $request) public function rules() { return [ - 'note_id' => 'required', + 'link_id' => 'required', 'note' => 'required', - 'is_private' => 'boolean', + 'is_private' => 'sometimes|boolean', ]; } } diff --git a/routes/api.php b/routes/api.php index e61b10a1..8befa73c 100644 --- a/routes/api.php +++ b/routes/api.php @@ -4,6 +4,7 @@ use App\Http\Controllers\API\LinkNotesController; use App\Http\Controllers\API\ListController; use App\Http\Controllers\API\ListLinksController; +use App\Http\Controllers\API\NoteController; use App\Http\Controllers\API\TagController; use App\Http\Controllers\API\TagLinksController; @@ -55,5 +56,13 @@ Route::get('tags/{tag}/links', TagLinksController::class) ->name('api.tags.links'); + + Route::apiResource('notes', NoteController::class) + ->names([ + 'store' => 'api.notes.store', + 'update' => 'api.notes.update', + 'destroy' => 'api.notes.destroy', + ]) + ->except(['index', 'show']); }); }); diff --git a/tests/Feature/Controller/Models/NoteControllerTest.php b/tests/Feature/Controller/Models/NoteControllerTest.php index 1f41532a..bfe0cbab 100644 --- a/tests/Feature/Controller/Models/NoteControllerTest.php +++ b/tests/Feature/Controller/Models/NoteControllerTest.php @@ -90,7 +90,7 @@ public function testUpdateResponse(): void $response = $this->post('notes/1', [ '_method' => 'patch', - 'note_id' => $baseNote->id, + 'link_id' => $baseNote->link_id, 'note' => 'Lorem ipsum dolor est updated', 'is_private' => '0', ]); @@ -107,7 +107,7 @@ public function testMissingModelErrorForUpdate(): void { $response = $this->post('notes/1', [ '_method' => 'patch', - 'note_id' => '1', + 'link_id' => '1', 'note' => 'Lorem ipsum dolor est updated', 'is_private' => '0', ]); From 285fe81b435061f1115d74b2660a850c54ed7a94 Mon Sep 17 00:00:00 2001 From: Kovah Date: Mon, 20 Apr 2020 10:49:29 +0200 Subject: [PATCH 14/44] Implement first version of the note API pt. 2 --- app/Http/Controllers/API/NoteController.php | 63 ++++++++ tests/Feature/Controller/API/NoteApiTest.php | 153 +++++++++++++++++++ 2 files changed, 216 insertions(+) create mode 100644 app/Http/Controllers/API/NoteController.php create mode 100644 tests/Feature/Controller/API/NoteApiTest.php diff --git a/app/Http/Controllers/API/NoteController.php b/app/Http/Controllers/API/NoteController.php new file mode 100644 index 00000000..d95418e8 --- /dev/null +++ b/app/Http/Controllers/API/NoteController.php @@ -0,0 +1,63 @@ +all()); + + return response()->json($note); + } + + /** + * Update the specified resource in storage. + * + * @param NoteUpdateRequest $request + * @param int $id + * @return Response + */ + public function update(NoteUpdateRequest $request, $id) + { + $note = Note::findOrFail($id); + + $updatedNote = NoteRepository::update($note, $request->all()); + + return response()->json($updatedNote); + } + + /** + * Remove the specified resource from storage. + * + * @param NoteDeleteRequest $request + * @param int $id + * @return Response + */ + public function destroy(NoteDeleteRequest $request, $id) + { + $note = Note::findOrFail($id); + + $deletionSuccessfull = NoteRepository::delete($note); + + if ($deletionSuccessfull) { + return response(null, Response::HTTP_OK); + } + + return response(null, Response::HTTP_INTERNAL_SERVER_ERROR); + } +} diff --git a/tests/Feature/Controller/API/NoteApiTest.php b/tests/Feature/Controller/API/NoteApiTest.php new file mode 100644 index 00000000..07fcc47e --- /dev/null +++ b/tests/Feature/Controller/API/NoteApiTest.php @@ -0,0 +1,153 @@ +user = factory(User::class)->create(); + } + + public function testMinimalCreateRequest(): void + { + $link = factory(Link::class)->create(); + + $response = $this->postJson('api/v1/notes', [ + 'link_id' => $link->id, + 'note' => 'Quae vero auctorem tractata ab fiducia dicuntur.', + ], $this->generateHeaders()); + + $response->assertStatus(200) + ->assertJson([ + 'note' => 'Quae vero auctorem tractata ab fiducia dicuntur.', + ]); + + $databaseNote = Note::first(); + + $this->assertEquals('Quae vero auctorem tractata ab fiducia dicuntur.', $databaseNote->note); + } + + public function testFullCreateRequest(): void + { + $link = factory(Link::class)->create(); + + $response = $this->postJson('api/v1/notes', [ + 'link_id' => $link->id, + 'note' => 'Quae vero auctorem tractata ab fiducia dicuntur.', + 'is_private' => true, + ], $this->generateHeaders()); + + $response->assertStatus(200) + ->assertJson([ + 'note' => 'Quae vero auctorem tractata ab fiducia dicuntur.', + 'is_private' => true, + ]); + + $databaseNote = Note::first(); + + $this->assertEquals('Quae vero auctorem tractata ab fiducia dicuntur.', $databaseNote->note); + } + + public function testInvalidCreateRequest(): void + { + $response = $this->postJson('api/v1/notes', [ + 'link_id' => null, + 'note' => null, + ], $this->generateHeaders()); + + $response->assertStatus(422) + ->assertJsonValidationErrors([ + 'link_id', + 'note', + ]); + } + + public function testUpdateRequest(): void + { + $link = factory(Link::class)->create(); + $note = factory(Note::class)->create([ + 'link_id' => $link->id, + ]); + + $response = $this->patchJson('api/v1/notes/1', [ + 'link_id' => $link->id, + 'note' => 'Gallia est omnis divisa in partes tres, quarum.', + 'is_private' => false, + ], $this->generateHeaders()); + + $response->assertStatus(200) + ->assertJson([ + 'note' => 'Gallia est omnis divisa in partes tres, quarum.', + ]); + + $databaseNote = Note::first(); + + $this->assertEquals('Gallia est omnis divisa in partes tres, quarum.', $databaseNote->note); + } + + public function testInvalidUpdateRequest(): void + { + $note = factory(Note::class)->create(); + + $response = $this->patchJson('api/v1/notes/1', [ + // + ], $this->generateHeaders()); + + $response->assertStatus(422) + ->assertJsonValidationErrors([ + 'link_id', + 'note', + ]); + } + + public function testUpdateRequestNotFound(): void + { + $response = $this->patchJson('api/v1/notes/1', [ + 'link_id' => 1, + 'note' => 'Sed haec quis possit intrepidus aestimare tellus.', + 'is_private' => false, + ], $this->generateHeaders()); + + $response->assertStatus(404); + } + + public function testDeleteRequest(): void + { + $note = factory(Note::class)->create(); + + $response = $this->deleteJson('api/v1/notes/1', [], $this->generateHeaders()); + + $response->assertStatus(200); + + $this->assertEquals(0, Note::count()); + } + + public function testDeleteRequestNotFound(): void + { + $response = $this->deleteJson('api/v1/notes/1', [], $this->generateHeaders()); + + $response->assertStatus(404); + } + + protected function generateHeaders(): array + { + return [ + 'Authorization' => 'Bearer ' . $this->user->api_token, + ]; + } +} From 8e9adafe805d87c78fc08c8e1393c18d3cad04af Mon Sep 17 00:00:00 2001 From: Kovah Date: Mon, 8 Jun 2020 16:37:04 +0200 Subject: [PATCH 15/44] Correct handling of link taxonomies in the link controller --- app/Repositories/LinkRepository.php | 75 ++++++++++++++--------------- 1 file changed, 37 insertions(+), 38 deletions(-) diff --git a/app/Repositories/LinkRepository.php b/app/Repositories/LinkRepository.php index c3e2c4a5..bcf456f8 100644 --- a/app/Repositories/LinkRepository.php +++ b/app/Repositories/LinkRepository.php @@ -48,37 +48,7 @@ public static function create(array $data, bool $flashAlerts = false): Link /** @var Link $link */ $link = Link::create($data); - if (isset($data['tags'])) { - self::updateTagsForLink($link, $data['tags']); - } else { - // Only save a "removed" revision if there were tags before - if ($link->tags()->count() > 0) { - self::createRelationshipRevision( - $link, - Link::REV_TAGS_NAME, - $link->tags->pluck('id')->join(','), - null - ); - } - - $link->tags()->detach(); - } - - if (isset($data['lists'])) { - self::updateListsForLink($link, $data['lists']); - } else { - // Only save a "removed" revision if there were lists before - if ($link->lists()->count() > 0) { - self::createRelationshipRevision( - $link, - Link::REV_LISTS_NAME, - $link->lists->pluck('id')->join(','), - null - ); - } - - $link->lists()->detach(); - } + self::processLinkTaxonmies($link, $data); $link->initiateInternetArchiveBackup(); @@ -98,13 +68,7 @@ public static function update(Link $link, array $data): Link $link->update($data); - if (isset($data['tags'])) { - self::updateTagsForLink($link, $data['tags']); - } - - if (isset($data['lists'])) { - self::updateListsForLink($link, $data['lists']); - } + self::processLinkTaxonmies($link, $data); return $link; } @@ -127,6 +91,41 @@ public static function delete(Link $link): bool return true; } + protected static function processLinkTaxonmies(Link $link, array $data) + { + if (isset($data['tags'])) { + self::updateTagsForLink($link, $data['tags']); + } else { + // Only save a "removed" revision if there were tags before + if ($link->tags()->count() > 0) { + self::createRelationshipRevision( + $link, + Link::REV_TAGS_NAME, + $link->tags->pluck('id')->join(','), + null + ); + } + + $link->tags()->detach(); + } + + if (isset($data['lists'])) { + self::updateListsForLink($link, $data['lists']); + } else { + // Only save a "removed" revision if there were lists before + if ($link->lists()->count() > 0) { + self::createRelationshipRevision( + $link, + Link::REV_LISTS_NAME, + $link->lists->pluck('id')->join(','), + null + ); + } + + $link->lists()->detach(); + } + } + /** * Create or get the tags from the input and attach them to the link. * From 61524f7530444bc3ed57a8ca064e1c86adf3aca5 Mon Sep 17 00:00:00 2001 From: Kovah Date: Tue, 9 Jun 2020 09:10:45 +0200 Subject: [PATCH 16/44] Correct namespace of API tests --- tests/Controller/API/LinkApiTest.php | 2 +- tests/Controller/API/LinkNotesTest.php | 2 +- tests/Controller/API/ListApiTest.php | 2 +- tests/Controller/API/ListLinksTest.php | 2 +- tests/Controller/API/NoteApiTest.php | 2 +- tests/Controller/API/TagApiTest.php | 2 +- tests/Controller/API/TagLinksTest.php | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/tests/Controller/API/LinkApiTest.php b/tests/Controller/API/LinkApiTest.php index 517a0d08..04b2bc20 100644 --- a/tests/Controller/API/LinkApiTest.php +++ b/tests/Controller/API/LinkApiTest.php @@ -1,6 +1,6 @@ Date: Tue, 9 Jun 2020 09:24:49 +0200 Subject: [PATCH 17/44] Move Cron Controller Test out of API directory --- tests/Controller/{API => App}/CronControllerTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename tests/Controller/{API => App}/CronControllerTest.php (97%) diff --git a/tests/Controller/API/CronControllerTest.php b/tests/Controller/App/CronControllerTest.php similarity index 97% rename from tests/Controller/API/CronControllerTest.php rename to tests/Controller/App/CronControllerTest.php index 48776c59..77e3ea4f 100644 --- a/tests/Controller/API/CronControllerTest.php +++ b/tests/Controller/App/CronControllerTest.php @@ -1,6 +1,6 @@ Date: Tue, 9 Jun 2020 09:53:26 +0200 Subject: [PATCH 18/44] Implement abstract API test class to reduce duplicated code, also add HTTP and Queue faking (#6) --- tests/Controller/API/ApiTestCase.php | 39 ++++++++++++++++++++++ tests/Controller/API/LinkApiTest.php | 46 +++++++++----------------- tests/Controller/API/LinkNotesTest.php | 18 +--------- tests/Controller/API/ListApiTest.php | 20 +---------- tests/Controller/API/ListLinksTest.php | 18 +--------- tests/Controller/API/NoteApiTest.php | 18 +--------- tests/Controller/API/TagApiTest.php | 18 +--------- tests/Controller/API/TagLinksTest.php | 18 +--------- 8 files changed, 61 insertions(+), 134 deletions(-) create mode 100644 tests/Controller/API/ApiTestCase.php diff --git a/tests/Controller/API/ApiTestCase.php b/tests/Controller/API/ApiTestCase.php new file mode 100644 index 00000000..e24ef894 --- /dev/null +++ b/tests/Controller/API/ApiTestCase.php @@ -0,0 +1,39 @@ +user = factory(User::class)->create(); + + Queue::fake(); + + $testHtml = '' . + 'Example Title' . + '' . + ''; + + Http::fake([ + 'example.com' => Http::response($testHtml, 200), + ]); + } + + protected function generateHeaders(): array + { + return [ + 'Authorization' => 'Bearer ' . $this->user->api_token, + ]; + } +} diff --git a/tests/Controller/API/LinkApiTest.php b/tests/Controller/API/LinkApiTest.php index 04b2bc20..1dfe0c65 100644 --- a/tests/Controller/API/LinkApiTest.php +++ b/tests/Controller/API/LinkApiTest.php @@ -2,28 +2,19 @@ namespace Tests\Controller\API; +use App\Jobs\SaveLinkToWaybackmachine; use App\Models\Link; use App\Models\LinkList; use App\Models\Tag; -use App\Models\User; use Illuminate\Foundation\Testing\DatabaseMigrations; use Illuminate\Foundation\Testing\DatabaseTransactions; -use Tests\TestCase; +use Illuminate\Support\Facades\Queue; -class LinkApiTest extends TestCase +class LinkApiTest extends ApiTestCase { use DatabaseTransactions; use DatabaseMigrations; - private $user; - - protected function setUp(): void - { - parent::setUp(); - - $this->user = factory(User::class)->create(); - } - public function testUnauthorizedRequest(): void { $response = $this->getJson('api/v1/links'); @@ -48,17 +39,17 @@ public function testIndexRequest(): void public function testMinimalCreateRequest(): void { $response = $this->postJson('api/v1/links', [ - 'url' => 'https://duckduckgo.com', + 'url' => 'http://example.com', ], $this->generateHeaders()); $response->assertStatus(200) ->assertJson([ - 'url' => 'https://duckduckgo.com', + 'url' => 'http://example.com', ]); $databaseLink = Link::first(); - $this->assertEquals('https://duckduckgo.com', $databaseLink->url); + $this->assertEquals('http://example.com', $databaseLink->url); } public function testFullCreateRequest(): void @@ -67,7 +58,7 @@ public function testFullCreateRequest(): void $tag = factory(Tag::class)->create(); $response = $this->postJson('api/v1/links', [ - 'url' => 'https://duckduckgo.com', + 'url' => 'http://example.com', 'title' => 'Search the Web', 'description' => 'There could be a description here', 'lists' => [$list->id], @@ -78,19 +69,21 @@ public function testFullCreateRequest(): void $response->assertStatus(200) ->assertJson([ - 'url' => 'https://duckduckgo.com', + 'url' => 'http://example.com', ]); $databaseLink = Link::first(); - $this->assertEquals('https://duckduckgo.com', $databaseLink->url); + $this->assertEquals('http://example.com', $databaseLink->url); + + Queue::assertPushed(SaveLinkToWaybackmachine::class); } public function testInvalidCreateRequest(): void { $response = $this->postJson('api/v1/links', [ 'url' => null, - 'lists' =>'no array', + 'lists' => 'no array', 'tags' => 123, 'is_private' => 'hello', 'check_disabled' => 'bla', @@ -154,7 +147,7 @@ public function testUpdateRequest(): void $list = factory(LinkList::class)->create(); $response = $this->patchJson('api/v1/links/1', [ - 'url' => 'https://duckduckgo.com', + 'url' => 'http://example.com', 'title' => 'Custom Title', 'description' => 'Custom Description', 'lists' => [$list->id], @@ -164,12 +157,12 @@ public function testUpdateRequest(): void $response->assertStatus(200) ->assertJson([ - 'url' => 'https://duckduckgo.com', + 'url' => 'http://example.com', ]); $databaseLink = Link::first(); - $this->assertEquals('https://duckduckgo.com', $databaseLink->url); + $this->assertEquals('http://example.com', $databaseLink->url); } public function testInvalidUpdateRequest(): void @@ -189,7 +182,7 @@ public function testInvalidUpdateRequest(): void public function testUpdateRequestNotFound(): void { $response = $this->patchJson('api/v1/links/1', [ - 'url' => 'https://duckduckgo.com', + 'url' => 'http://example.com', 'title' => 'Custom Title', 'description' => 'Custom Description', 'lists' => [], @@ -218,11 +211,4 @@ public function testDeleteRequestNotFound(): void $response->assertStatus(404); } - - protected function generateHeaders(): array - { - return [ - 'Authorization' => 'Bearer ' . $this->user->api_token, - ]; - } } diff --git a/tests/Controller/API/LinkNotesTest.php b/tests/Controller/API/LinkNotesTest.php index 00cae8c6..46c9a933 100644 --- a/tests/Controller/API/LinkNotesTest.php +++ b/tests/Controller/API/LinkNotesTest.php @@ -9,20 +9,11 @@ use Illuminate\Foundation\Testing\DatabaseTransactions; use Tests\TestCase; -class LinkNotesTest extends TestCase +class LinkNotesTest extends ApiTestCase { use DatabaseTransactions; use DatabaseMigrations; - private $user; - - protected function setUp(): void - { - parent::setUp(); - - $this->user = factory(User::class)->create(); - } - public function testLinksRequest(): void { $link = factory(Link::class)->create(); @@ -62,11 +53,4 @@ public function testShowRequestNotFound(): void $response->assertStatus(404); } - - protected function generateHeaders(): array - { - return [ - 'Authorization' => 'Bearer ' . $this->user->api_token, - ]; - } } diff --git a/tests/Controller/API/ListApiTest.php b/tests/Controller/API/ListApiTest.php index f50b49bb..d4282759 100644 --- a/tests/Controller/API/ListApiTest.php +++ b/tests/Controller/API/ListApiTest.php @@ -2,27 +2,16 @@ namespace Tests\Controller\API; -use App\Models\Link; use App\Models\LinkList; use App\Models\User; use Illuminate\Foundation\Testing\DatabaseMigrations; use Illuminate\Foundation\Testing\DatabaseTransactions; -use Tests\TestCase; -class ListApiTest extends TestCase +class ListApiTest extends ApiTestCase { use DatabaseTransactions; use DatabaseMigrations; - private $user; - - protected function setUp(): void - { - parent::setUp(); - - $this->user = factory(User::class)->create(); - } - public function testUnauthorizedRequest(): void { $response = $this->getJson('api/v1/lists'); @@ -177,11 +166,4 @@ public function testDeleteRequestNotFound(): void $response->assertStatus(404); } - - protected function generateHeaders(): array - { - return [ - 'Authorization' => 'Bearer ' . $this->user->api_token, - ]; - } } diff --git a/tests/Controller/API/ListLinksTest.php b/tests/Controller/API/ListLinksTest.php index 63fc1cc9..80cd98f9 100644 --- a/tests/Controller/API/ListLinksTest.php +++ b/tests/Controller/API/ListLinksTest.php @@ -9,20 +9,11 @@ use Illuminate\Foundation\Testing\DatabaseTransactions; use Tests\TestCase; -class ListLinksTest extends TestCase +class ListLinksTest extends ApiTestCase { use DatabaseTransactions; use DatabaseMigrations; - private $user; - - protected function setUp(): void - { - parent::setUp(); - - $this->user = factory(User::class)->create(); - } - public function testLinksRequest(): void { $link = factory(Link::class)->create(); @@ -62,11 +53,4 @@ public function testShowRequestNotFound(): void $response->assertStatus(404); } - - protected function generateHeaders(): array - { - return [ - 'Authorization' => 'Bearer ' . $this->user->api_token, - ]; - } } diff --git a/tests/Controller/API/NoteApiTest.php b/tests/Controller/API/NoteApiTest.php index 3f3c1238..662b537a 100644 --- a/tests/Controller/API/NoteApiTest.php +++ b/tests/Controller/API/NoteApiTest.php @@ -9,20 +9,11 @@ use Illuminate\Foundation\Testing\DatabaseTransactions; use Tests\TestCase; -class NoteApiTest extends TestCase +class NoteApiTest extends ApiTestCase { use DatabaseTransactions; use DatabaseMigrations; - private $user; - - protected function setUp(): void - { - parent::setUp(); - - $this->user = factory(User::class)->create(); - } - public function testMinimalCreateRequest(): void { $link = factory(Link::class)->create(); @@ -143,11 +134,4 @@ public function testDeleteRequestNotFound(): void $response->assertStatus(404); } - - protected function generateHeaders(): array - { - return [ - 'Authorization' => 'Bearer ' . $this->user->api_token, - ]; - } } diff --git a/tests/Controller/API/TagApiTest.php b/tests/Controller/API/TagApiTest.php index ff9b0942..ba2dc5d3 100644 --- a/tests/Controller/API/TagApiTest.php +++ b/tests/Controller/API/TagApiTest.php @@ -8,20 +8,11 @@ use Illuminate\Foundation\Testing\DatabaseTransactions; use Tests\TestCase; -class TagApiTest extends TestCase +class TagApiTest extends ApiTestCase { use DatabaseTransactions; use DatabaseMigrations; - private $user; - - protected function setUp(): void - { - parent::setUp(); - - $this->user = factory(User::class)->create(); - } - public function testUnauthorizedRequest(): void { $response = $this->getJson('api/v1/tags'); @@ -169,11 +160,4 @@ public function testDeleteRequestNotFound(): void $response->assertStatus(404); } - - protected function generateHeaders(): array - { - return [ - 'Authorization' => 'Bearer ' . $this->user->api_token, - ]; - } } diff --git a/tests/Controller/API/TagLinksTest.php b/tests/Controller/API/TagLinksTest.php index e43e0f1c..ae335205 100644 --- a/tests/Controller/API/TagLinksTest.php +++ b/tests/Controller/API/TagLinksTest.php @@ -9,20 +9,11 @@ use Illuminate\Foundation\Testing\DatabaseTransactions; use Tests\TestCase; -class TagLinksTest extends TestCase +class TagLinksTest extends ApiTestCase { use DatabaseTransactions; use DatabaseMigrations; - private $user; - - protected function setUp(): void - { - parent::setUp(); - - $this->user = factory(User::class)->create(); - } - public function testLinksRequest(): void { $link = factory(Link::class)->create(); @@ -62,11 +53,4 @@ public function testShowRequestNotFound(): void $response->assertStatus(404); } - - protected function generateHeaders(): array - { - return [ - 'Authorization' => 'Bearer ' . $this->user->api_token, - ]; - } } From 1436fa360cf323bf6559bf6faa0caec6cb1bbde2 Mon Sep 17 00:00:00 2001 From: Kovah Date: Tue, 9 Jun 2020 09:55:31 +0200 Subject: [PATCH 19/44] Add API endpoint for searching tags for link editing (#6) --- app/Http/Controllers/API/SearchController.php | 27 +++++ app/Models/User.php | 1 + routes/api.php | 4 + tests/Controller/API/SearchTagsTest.php | 101 ++++++++++++++++++ 4 files changed, 133 insertions(+) create mode 100644 app/Http/Controllers/API/SearchController.php create mode 100644 tests/Controller/API/SearchTagsTest.php diff --git a/app/Http/Controllers/API/SearchController.php b/app/Http/Controllers/API/SearchController.php new file mode 100644 index 00000000..a613f84a --- /dev/null +++ b/app/Http/Controllers/API/SearchController.php @@ -0,0 +1,27 @@ +input('query', false); + + if (!$query) { + return response()->json([]); + } + + $tags = Tag::byUser($request->user()->id) + ->where('name', 'like', '%' . $query . '%') + ->orderBy('name', 'asc') + ->pluck('name', 'id'); + + return response()->json($tags); + } +} diff --git a/app/Models/User.php b/app/Models/User.php index 33a81d48..462e2b28 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -19,6 +19,7 @@ * @property string $email * @property string $password * @property string|null $remember_token + * @property string|null $api_token * @property Carbon|null $created_at * @property Carbon|null $updated_at */ diff --git a/routes/api.php b/routes/api.php index 8befa73c..8f44bdb3 100644 --- a/routes/api.php +++ b/routes/api.php @@ -5,6 +5,7 @@ use App\Http\Controllers\API\ListController; use App\Http\Controllers\API\ListLinksController; use App\Http\Controllers\API\NoteController; +use App\Http\Controllers\API\SearchController; use App\Http\Controllers\API\TagController; use App\Http\Controllers\API\TagLinksController; @@ -64,5 +65,8 @@ 'destroy' => 'api.notes.destroy', ]) ->except(['index', 'show']); + + Route::get('search/tags', [SearchController::class, 'searchTags']) + ->name('api.search.tags'); }); }); diff --git a/tests/Controller/API/SearchTagsTest.php b/tests/Controller/API/SearchTagsTest.php new file mode 100644 index 00000000..b40257a9 --- /dev/null +++ b/tests/Controller/API/SearchTagsTest.php @@ -0,0 +1,101 @@ +getJson('api/v1/links'); + + $response->assertUnauthorized(); + } + + public function testWithoutQuery(): void + { + $response = $this->getJson('api/v1/search/tags', $this->generateHeaders()); + + $response->assertStatus(200) + ->assertExactJson([]); + } + + public function testWithEmptyQuery(): void + { + factory(Tag::class)->create([ + 'user_id' => $this->user->id, + 'name' => 'artificial-intelligence', + ]); + + $response = $this->getJson('api/v1/search/tags?query=', $this->generateHeaders()); + + $response->assertStatus(200) + ->assertExactJson([]); + } + + public function testWithMultipleResults(): void + { + $tag = factory(Tag::class)->create([ + 'user_id' => $this->user->id, + 'name' => 'programming', + ]); + + $tag2 = factory(Tag::class)->create([ + 'user_id' => $this->user->id, + 'name' => 'programming-books', + ]); + + $tag3 = factory(Tag::class)->create([ + 'user_id' => $this->user->id, + 'name' => 'pair-programming', + ]); + + factory(Tag::class)->create([ + 'user_id' => $this->user->id, + 'name' => 'learning', + ]); + + $url = sprintf('api/v1/search/tags?query=%s', 'programming'); + $response = $this->getJson($url, $this->generateHeaders()); + + $response->assertStatus(200) + ->assertExactJson([ + $tag->id => $tag->name, + $tag2->id => $tag2->name, + $tag3->id => $tag3->name, + ]); + } + + public function testWithShortQuery(): void + { + $tag = factory(Tag::class)->create([ + 'user_id' => $this->user->id, + 'name' => 'programming', + ]); + + $tag2 = factory(Tag::class)->create([ + 'user_id' => $this->user->id, + 'name' => 'programming-books', + ]); + + factory(Tag::class)->create([ + 'user_id' => $this->user->id, + 'name' => 'learning', + ]); + + $url = sprintf('api/v1/search/tags?query=%s', 'p'); + $response = $this->getJson($url, $this->generateHeaders()); + + $response->assertStatus(200) + ->assertExactJson([ + $tag->id => $tag->name, + $tag2->id => $tag2->name, + ]); + } +} From 22c85f29d472449f864bcd5a5e9fdecd723f2e0d Mon Sep 17 00:00:00 2001 From: Kovah Date: Tue, 9 Jun 2020 15:50:49 +0200 Subject: [PATCH 20/44] Add API endpoint for searching lists for link editing (#6) --- app/Http/Controllers/API/SearchController.php | 33 +++++++ routes/api.php | 2 + tests/Controller/API/SearchListsTest.php | 98 +++++++++++++++++++ tests/Controller/API/SearchTagsTest.php | 5 +- 4 files changed, 137 insertions(+), 1 deletion(-) create mode 100644 tests/Controller/API/SearchListsTest.php diff --git a/app/Http/Controllers/API/SearchController.php b/app/Http/Controllers/API/SearchController.php index a613f84a..fb7fe661 100644 --- a/app/Http/Controllers/API/SearchController.php +++ b/app/Http/Controllers/API/SearchController.php @@ -3,12 +3,21 @@ namespace App\Http\Controllers\API; use App\Http\Controllers\Controller; +use App\Models\LinkList; use App\Models\Tag; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; class SearchController extends Controller { + /** + * Search tags by query for usage in link editing. To catch as many as + * possible tags for a query, a LIKE operation with `%[query]%` is run. + * Tags are returned as a simple array with tag id => tag name pairs. + * + * @param Request $request + * @return JsonResponse + */ public function searchTags(Request $request): JsonResponse { $query = $request->input('query', false); @@ -24,4 +33,28 @@ public function searchTags(Request $request): JsonResponse return response()->json($tags); } + + /** + * Search lists by query for usage in link editing. To catch as many as + * possible lists for a query, a LIKE operation with `%[query]%` is run. + * Tags are returned as a simple array with list id => list name pairs. + * + * @param Request $request + * @return JsonResponse + */ + public function searchLists(Request $request): JsonResponse + { + $query = $request->input('query', false); + + if (!$query) { + return response()->json([]); + } + + $tags = LinkList::byUser($request->user()->id) + ->where('name', 'like', '%' . $query . '%') + ->orderBy('name', 'asc') + ->pluck('name', 'id'); + + return response()->json($tags); + } } diff --git a/routes/api.php b/routes/api.php index 8f44bdb3..bb2c34a6 100644 --- a/routes/api.php +++ b/routes/api.php @@ -68,5 +68,7 @@ Route::get('search/tags', [SearchController::class, 'searchTags']) ->name('api.search.tags'); + Route::get('search/lists', [SearchController::class, 'searchLists']) + ->name('api.search.lists'); }); }); diff --git a/tests/Controller/API/SearchListsTest.php b/tests/Controller/API/SearchListsTest.php new file mode 100644 index 00000000..aeeda45c --- /dev/null +++ b/tests/Controller/API/SearchListsTest.php @@ -0,0 +1,98 @@ +getJson('api/v1/search/lists'); + + $response->assertUnauthorized(); + } + + public function testWithoutQuery(): void + { + $response = $this->getJson('api/v1/search/lists', $this->generateHeaders()); + + $response->assertStatus(200) + ->assertExactJson([]); + } + + public function testWithEmptyQuery(): void + { + // This list must not be present in the results + factory(LinkList::class)->create([ + 'user_id' => $this->user->id, + 'name' => 'Scientific Articles', + ]); + + $response = $this->getJson('api/v1/search/lists?query=', $this->generateHeaders()); + + $response->assertStatus(200) + ->assertExactJson([]); + } + + public function testWithMultipleResults(): void + { + $list = factory(LinkList::class)->create([ + 'user_id' => $this->user->id, + 'name' => 'Scientific Articles', + ]); + + $list2 = factory(LinkList::class)->create([ + 'user_id' => $this->user->id, + 'name' => 'Articles about Web Development', + ]); + + // This list must not be present in the results + factory(LinkList::class)->create([ + 'user_id' => $this->user->id, + 'name' => 'Learning Theory Resources', + ]); + + $url = sprintf('api/v1/search/lists?query=%s', 'articles'); + $response = $this->getJson($url, $this->generateHeaders()); + + $response->assertStatus(200) + ->assertExactJson([ + $list->id => $list->name, + $list2->id => $list2->name, + ]); + } + + public function testWithShortQuery(): void + { + $list = factory(LinkList::class)->create([ + 'user_id' => $this->user->id, + 'name' => 'Scientific Articles', + ]); + + $list2 = factory(LinkList::class)->create([ + 'user_id' => $this->user->id, + 'name' => 'Articles about Web Development', + ]); + + // This list must not be present in the results + factory(LinkList::class)->create([ + 'user_id' => $this->user->id, + 'name' => 'Quantum Theories', + ]); + + $url = sprintf('api/v1/search/lists?query=%s', 'ar'); + $response = $this->getJson($url, $this->generateHeaders()); + + $response->assertStatus(200) + ->assertExactJson([ + $list->id => $list->name, + $list2->id => $list2->name, + ]); + } +} diff --git a/tests/Controller/API/SearchTagsTest.php b/tests/Controller/API/SearchTagsTest.php index b40257a9..34d448be 100644 --- a/tests/Controller/API/SearchTagsTest.php +++ b/tests/Controller/API/SearchTagsTest.php @@ -13,7 +13,7 @@ class SearchTagsTest extends ApiTestCase public function testUnauthorizedRequest(): void { - $response = $this->getJson('api/v1/links'); + $response = $this->getJson('api/v1/search/tags'); $response->assertUnauthorized(); } @@ -28,6 +28,7 @@ public function testWithoutQuery(): void public function testWithEmptyQuery(): void { + // This tag must not be present in the results factory(Tag::class)->create([ 'user_id' => $this->user->id, 'name' => 'artificial-intelligence', @@ -56,6 +57,7 @@ public function testWithMultipleResults(): void 'name' => 'pair-programming', ]); + // This tag must not be present in the results factory(Tag::class)->create([ 'user_id' => $this->user->id, 'name' => 'learning', @@ -84,6 +86,7 @@ public function testWithShortQuery(): void 'name' => 'programming-books', ]); + // This tag must not be present in the results factory(Tag::class)->create([ 'user_id' => $this->user->id, 'name' => 'learning', From 330ae06a3c8c69476cf30e6d6808efdc1db4c256 Mon Sep 17 00:00:00 2001 From: Kovah Date: Thu, 11 Jun 2020 23:25:56 +0200 Subject: [PATCH 21/44] Move search functionality into trait and correct results order handling --- app/Http/Controllers/App/SearchController.php | 89 +++---------------- app/Http/Controllers/Traits/SearchesLinks.php | 82 +++++++++++++++++ 2 files changed, 96 insertions(+), 75 deletions(-) create mode 100644 app/Http/Controllers/Traits/SearchesLinks.php diff --git a/app/Http/Controllers/App/SearchController.php b/app/Http/Controllers/App/SearchController.php index 9f98c5d2..c519e44a 100644 --- a/app/Http/Controllers/App/SearchController.php +++ b/app/Http/Controllers/App/SearchController.php @@ -3,9 +3,8 @@ namespace App\Http\Controllers\App; use App\Http\Controllers\Controller; +use App\Http\Controllers\Traits\SearchesLinks; use App\Http\Requests\SearchRequest; -use App\Models\Link; -use App\Models\LinkList; use Illuminate\Contracts\View\Factory; use Illuminate\View\View; @@ -16,15 +15,7 @@ */ class SearchController extends Controller { - /** @var array */ - public $order_by_options = [ - 'title:asc', - 'title:desc', - 'url:asc', - 'url:desc', - 'created_at:asc', - 'created_at:desc', - ]; + use SearchesLinks; /** * @return Factory|View @@ -33,7 +24,7 @@ public function getSearch() { return view('actions.search.search') ->with('results', collect([])) - ->with('order_by_options', $this->order_by_options) + ->with('order_by_options', $this->orderByOptions) ->with('query_settings', [ 'old_query' => null, 'search_title' => false, @@ -42,7 +33,7 @@ public function getSearch() 'broken_only' => false, 'only_lists' => '', 'only_tags' => '', - 'order_by' => $this->order_by_options[0], + 'order_by' => $this->orderByOptions[0], ]); } @@ -52,73 +43,21 @@ public function getSearch() */ public function doSearch(SearchRequest $request) { - $search_title = false; - $search_description = false; - - // Start building the search - $search = Link::byUser(auth()->id()); - - // Search for the URL - if ($raw_query = $request->get('query', false)) { - $query = '%' . $raw_query . '%'; - $search->where('url', 'like', $query); - - // Also search for the title if applicable - if ($search_title = $request->get('search_title', false)) { - $search->orWhere('title', 'like', $query); - } - - // Also search for the title if applicable - if ($search_description = $request->get('search_description', false)) { - $search->orWhere('description', 'like', $query); - } - } - - // Show private only if applicable - if ($private_only = $request->get('private_only', false)) { - $search->where('is_private', true); - } - - // Show broken only if applicable - if ($broken_only = $request->get('broken_only', false)) { - $search->where('status', '>', 1); - } - - // Show by specific list only if applicable - if ($list_names = $request->get('only_lists', false)) { - $search->whereHas('lists', function ($query) use ($list_names) { - $query->whereIn('name', explode(',', $list_names)); - }); - } - - // Show by specific tag only if applicable - if ($tag_names = $request->get('only_tags', false)) { - $search->whereHas('tags', function ($query) use ($tag_names) { - $query->whereIn('name', explode(',', $tag_names)); - }); - } - - // Order the results if applicable - if ($orderby = $request->get('orderby', $this->order_by_options[0])) { - $order_by = explode(':', $orderby); - $search->orderBy($order_by[0], $order_by[1]); - } - - // Get the results + $search = $this->buildDatabaseQuery($request); $results = $search->paginate(getPaginationLimit()); return view('actions.search.search') ->with('results', $results) - ->with('order_by_options', $this->order_by_options) + ->with('order_by_options', $this->orderByOptions) ->with('query_settings', [ - 'old_query' => $raw_query, - 'search_title' => $search_title, - 'search_description' => $search_description, - 'private_only' => $private_only, - 'broken_only' => $broken_only, - 'only_lists' => $list_names, - 'only_tags' => $tag_names, - 'order_by' => $orderby, + 'old_query' => $this->searchQuery, + 'search_title' => $this->searchTitle, + 'search_description' => $this->searchDescription, + 'private_only' => $this->searchPrivateOnly, + 'broken_only' => $this->searchBrokenOnly, + 'only_lists' => $this->searchListNames, + 'only_tags' => $this->searchTagNames, + 'order_by' => $this->searchOrderBy, ]); } } diff --git a/app/Http/Controllers/Traits/SearchesLinks.php b/app/Http/Controllers/Traits/SearchesLinks.php new file mode 100644 index 00000000..ab2b3603 --- /dev/null +++ b/app/Http/Controllers/Traits/SearchesLinks.php @@ -0,0 +1,82 @@ +user()->id); + + // Search for the URL + if ($this->searchQuery = $request->input('query', false)) { + $query = '%' . $this->searchQuery . '%'; + $search->where('url', 'like', $query); + + // Also search for the title if applicable + if ($this->searchTitle = $request->input('search_title', false)) { + $search->orWhere('title', 'like', $query); + } + + // Also search for the title if applicable + if ($this->searchDescription = $request->input('search_description', false)) { + $search->orWhere('description', 'like', $query); + } + } + + // Show private only if applicable + if ($this->searchPrivateOnly = $request->input('private_only', false)) { + $search->where('is_private', true); + } + + // Show broken only if applicable + if ($this->searchBrokenOnly = $request->input('broken_only', false)) { + $search->where('status', '>', 1); + } + + // Show by specific list only if applicable + if ($this->searchListNames = $request->input('only_lists', false)) { + $search->whereHas('lists', function ($query) { + $query->whereIn('name', explode(',', $this->searchListNames)); + }); + } + + // Show by specific tag only if applicable + if ($this->searchTagNames = $request->input('only_tags', false)) { + $search->whereHas('tags', function ($query) { + $query->whereIn('name', explode(',', $this->searchTagNames)); + }); + } + + // Order the results if applicable + if ($this->searchOrderBy = $request->input('order_by', $this->orderByOptions[0])) { + $search->orderBy(...explode(':', $this->searchOrderBy)); + } + + // Return the query builder itself + return $search; + } +} From 7cae102e13d58dd23c0f3f9b925bfde9c76b48ff Mon Sep 17 00:00:00 2001 From: Kovah Date: Fri, 12 Jun 2020 00:21:36 +0200 Subject: [PATCH 22/44] Add missing validation to the search request, add handling for API requests by switching between name and ID querying for lists and tags --- app/Http/Controllers/App/SearchController.php | 4 ++-- app/Http/Controllers/Traits/SearchesLinks.php | 22 ++++++++++--------- app/Http/Requests/SearchRequest.php | 20 ++++++++++++++++- resources/lang/en/search.php | 4 ++++ .../views/actions/search/search.blade.php | 8 ------- 5 files changed, 37 insertions(+), 21 deletions(-) diff --git a/app/Http/Controllers/App/SearchController.php b/app/Http/Controllers/App/SearchController.php index c519e44a..7518e5cc 100644 --- a/app/Http/Controllers/App/SearchController.php +++ b/app/Http/Controllers/App/SearchController.php @@ -55,8 +55,8 @@ public function doSearch(SearchRequest $request) 'search_description' => $this->searchDescription, 'private_only' => $this->searchPrivateOnly, 'broken_only' => $this->searchBrokenOnly, - 'only_lists' => $this->searchListNames, - 'only_tags' => $this->searchTagNames, + 'only_lists' => $this->searchLists, + 'only_tags' => $this->searchTags, 'order_by' => $this->searchOrderBy, ]); } diff --git a/app/Http/Controllers/Traits/SearchesLinks.php b/app/Http/Controllers/Traits/SearchesLinks.php index ab2b3603..f5c0c49e 100644 --- a/app/Http/Controllers/Traits/SearchesLinks.php +++ b/app/Http/Controllers/Traits/SearchesLinks.php @@ -2,8 +2,8 @@ namespace App\Http\Controllers\Traits; +use App\Http\Requests\SearchRequest; use App\Models\Link; -use Illuminate\Http\Request; trait SearchesLinks { @@ -12,8 +12,8 @@ trait SearchesLinks protected $searchDescription; protected $searchPrivateOnly; protected $searchBrokenOnly; - protected $searchListNames; - protected $searchTagNames; + protected $searchLists; + protected $searchTags; protected $searchOrderBy; /** @var array */ @@ -26,7 +26,7 @@ trait SearchesLinks 'created_at:desc', ]; - public function buildDatabaseQuery(Request $request) + public function buildDatabaseQuery(SearchRequest $request) { // Start building the search $search = Link::byUser($request->user()->id); @@ -58,16 +58,18 @@ public function buildDatabaseQuery(Request $request) } // Show by specific list only if applicable - if ($this->searchListNames = $request->input('only_lists', false)) { - $search->whereHas('lists', function ($query) { - $query->whereIn('name', explode(',', $this->searchListNames)); + if ($this->searchLists = $request->input('only_lists', false)) { + $search->whereHas('lists', function ($query) use ($request) { + $field = $request->isJson() ? 'id' : 'name'; + $query->whereIn($field, explode(',', $this->searchLists)); }); } // Show by specific tag only if applicable - if ($this->searchTagNames = $request->input('only_tags', false)) { - $search->whereHas('tags', function ($query) { - $query->whereIn('name', explode(',', $this->searchTagNames)); + if ($this->searchTags = $request->input('only_tags', false)) { + $search->whereHas('tags', function ($query) use ($request) { + $field = $request->isJson() ? 'id' : 'name'; + $query->whereIn($field, explode(',', $this->searchTags)); }); } diff --git a/app/Http/Requests/SearchRequest.php b/app/Http/Requests/SearchRequest.php index fed2896b..840b8ccd 100644 --- a/app/Http/Requests/SearchRequest.php +++ b/app/Http/Requests/SearchRequest.php @@ -28,6 +28,24 @@ public function authorize() */ public function rules() { - return []; + return [ + 'query' => 'bail|required_without_all:only_lists,only_tags', + 'only_lists' => 'bail|required_without_all:query,only_tags', + 'only_tags' => 'bail|required_without_all:query,only_lists', + ]; + } + + /** + * Specifies custom error messages for the special validations. + * + * @return array + */ + public function messages(): array + { + return [ + 'query.required_without_all' => trans('search.validation_query_missing'), + 'only_lists.required_without_all' => trans('search.validation_lists_missing'), + 'only_tags.required_without_all' => trans('search.validation_tags_missing'), + ]; } } diff --git a/resources/lang/en/search.php b/resources/lang/en/search.php index b34ab7b9..fb9045ea 100644 --- a/resources/lang/en/search.php +++ b/resources/lang/en/search.php @@ -20,4 +20,8 @@ 'order_by.created_at:desc' => 'Creation Date descending', 'no_results' => 'No results found.', + + 'validation_query_missing' => 'A search query must be present if no lists or tags were provided.', + 'validation_lists_missing' => 'A list must be present if no query or some tags were provided.', + 'validation_tags_missing' => 'A tag must be present if no query or some lists were provided.', ]; diff --git a/resources/views/actions/search/search.blade.php b/resources/views/actions/search/search.blade.php index 80c2fb2a..4dbdec0c 100644 --- a/resources/views/actions/search/search.blade.php +++ b/resources/views/actions/search/search.blade.php @@ -109,14 +109,6 @@ class="custom-control-input"
- @if ($errors->any()) -
- @foreach ($errors->all() as $error) - {{ $error }}
- @endforeach -
- @endif - @if($results->isEmpty())
@lang('search.no_results') From 3ffe6daadb3b55c0b76ca6d2207d544f6ef3501e Mon Sep 17 00:00:00 2001 From: Kovah Date: Fri, 12 Jun 2020 00:24:44 +0200 Subject: [PATCH 23/44] Add API endpoint for searching links with various features (#6) --- app/Http/Controllers/API/SearchController.php | 26 ++ routes/api.php | 2 + tests/Controller/API/SearchLinksTest.php | 236 ++++++++++++++++++ 3 files changed, 264 insertions(+) create mode 100644 tests/Controller/API/SearchLinksTest.php diff --git a/app/Http/Controllers/API/SearchController.php b/app/Http/Controllers/API/SearchController.php index fb7fe661..205c913c 100644 --- a/app/Http/Controllers/API/SearchController.php +++ b/app/Http/Controllers/API/SearchController.php @@ -3,6 +3,8 @@ namespace App\Http\Controllers\API; use App\Http\Controllers\Controller; +use App\Http\Controllers\Traits\SearchesLinks; +use App\Http\Requests\SearchRequest; use App\Models\LinkList; use App\Models\Tag; use Illuminate\Http\JsonResponse; @@ -10,6 +12,30 @@ class SearchController extends Controller { + use SearchesLinks; + + /** + * Search links with the help of the SearchesLinks trait, which offers the + * same search features like in the web app: + * - toggle searching by title + * - toggle searching by description + * - toggle searching private links only + * - toggle searching broken links only + * - search by lists + * - search by tags + * - order the results by various parameters + * + * @param SearchRequest $request + * @return JsonResponse + */ + public function searchLinks(SearchRequest $request): JsonResponse + { + $search = $this->buildDatabaseQuery($request); + $links = $search->paginate(getPaginationLimit()); + + return response()->json($links); + } + /** * Search tags by query for usage in link editing. To catch as many as * possible tags for a query, a LIKE operation with `%[query]%` is run. diff --git a/routes/api.php b/routes/api.php index bb2c34a6..7d0a6161 100644 --- a/routes/api.php +++ b/routes/api.php @@ -66,6 +66,8 @@ ]) ->except(['index', 'show']); + Route::get('search/links', [SearchController::class, 'searchLinks']) + ->name('api.search.links'); Route::get('search/tags', [SearchController::class, 'searchTags']) ->name('api.search.tags'); Route::get('search/lists', [SearchController::class, 'searchLists']) diff --git a/tests/Controller/API/SearchLinksTest.php b/tests/Controller/API/SearchLinksTest.php new file mode 100644 index 00000000..89022cb3 --- /dev/null +++ b/tests/Controller/API/SearchLinksTest.php @@ -0,0 +1,236 @@ +getJson('api/v1/search/links'); + + $response->assertUnauthorized(); + } + + public function testWithoutQuery(): void + { + $response = $this->getJson('api/v1/search/links', $this->generateHeaders()); + + $response->assertJsonValidationErrors([ + 'query', + 'only_lists', + 'only_tags', + ]); + } + + public function testRegularSearchResult(): void + { + $link = factory(Link::class)->create([ + 'user_id' => $this->user->id, + 'url' => 'https://example.com', + ]); + + $link2 = factory(Link::class)->create([ + 'user_id' => $this->user->id, + 'url' => 'https://another-example.org', + ]); + + // This link must not be present in the results + $excludedLink = factory(Link::class)->create([ + 'user_id' => $this->user->id, + 'url' => 'https://test.com', + ]); + + $url = sprintf('api/v1/search/links?query=%s', 'example'); + $response = $this->getJson($url, $this->generateHeaders()); + + $response->assertStatus(200) + ->assertJsonFragment([ + 'current_page' => 1, + ]) + ->assertJsonFragment([ + 'url' => $link->url, + ]) + ->assertJsonFragment([ + 'url' => $link2->url, + ]) + ->assertJsonMissing([ + 'url' => $excludedLink->url, + ]); + } + + public function testSearchByTitle(): void + { + $link = factory(Link::class)->create([ + 'user_id' => $this->user->id, + 'title' => 'Test Title', + ]); + + // This link must not be present in the results + $excludedLink = factory(Link::class)->create([ + 'user_id' => $this->user->id, + 'title' => 'Nobody cares', + ]); + + $url = sprintf('api/v1/search/links?query=%s&search_title=1', 'Test'); + $response = $this->getJson($url, $this->generateHeaders()); + + $response->assertStatus(200) + ->assertJsonFragment([ + 'url' => $link->url, + ]) + ->assertJsonMissing([ + 'url' => $excludedLink->url, + ]); + } + + public function testSearchByDescription() + { + $link = factory(Link::class)->create([ + 'user_id' => $this->user->id, + 'url' => 'https://test.com', + 'description' => 'Example description', + ]); + + // This link must not be present in the results + $excludedLink = factory(Link::class)->create([ + 'user_id' => $this->user->id, + 'url' => 'https://test.org', + 'description' => 'Lorem Ipsum', + ]); + + $url = sprintf('api/v1/search/links?query=%s&search_description=1', 'Example'); + $response = $this->getJson($url, $this->generateHeaders()); + + $response->assertStatus(200) + ->assertJsonFragment([ + 'url' => $link->url, + ]) + ->assertJsonMissing([ + 'url' => $excludedLink->url, + ]); + } + + public function testSearchPrivateOnly() + { + $link = factory(Link::class)->create([ + 'user_id' => $this->user->id, + 'url' => 'https://test.com', + 'is_private' => true, + ]); + + // This link must not be present in the results + $excludedLink = factory(Link::class)->create([ + 'user_id' => $this->user->id, + 'url' => 'https://test.org', + 'is_private' => false, + ]); + + $url = sprintf('api/v1/search/links?query=%s&private_only=1', 'test'); + $response = $this->getJson($url, $this->generateHeaders()); + + $response->assertStatus(200) + ->assertJsonFragment([ + 'url' => $link->url, + ]) + ->assertJsonMissing([ + 'url' => $excludedLink->url, + ]); + } + + public function testSearchBrokenOnly() + { + $link = factory(Link::class)->create([ + 'user_id' => $this->user->id, + 'url' => 'https://test.com', + 'status' => Link::STATUS_BROKEN, + ]); + + // This link must not be present in the results + $excludedLink = factory(Link::class)->create([ + 'user_id' => $this->user->id, + 'url' => 'https://test.org', + ]); + + $url = sprintf('api/v1/search/links?query=%s&broken_only=1', 'test'); + $response = $this->getJson($url, $this->generateHeaders()); + + $response->assertStatus(200) + ->assertJsonFragment([ + 'url' => $link->url, + ]) + ->assertJsonMissing([ + 'url' => $excludedLink->url, + ]); + } + + public function testSearchWithLists() + { + $list = factory(LinkList::class)->create([ + 'user_id' => $this->user->id, + 'name' => 'Scientific Articles', + ]); + + $link = factory(Link::class)->create([ + 'user_id' => $this->user->id, + 'url' => 'https://test.com', + ]); + + $link->lists()->sync([$list->id]); + + // This link must not be present in the results + $excludedLink = factory(Link::class)->create([ + 'user_id' => $this->user->id, + 'url' => 'https://test.org', + ]); + + $url = sprintf('api/v1/search/links?only_lists=%s', $list->id); + $response = $this->getJson($url, $this->generateHeaders()); + + $response->assertStatus(200) + ->assertJsonFragment([ + 'url' => $link->url, + ]) + ->assertJsonMissing([ + 'url' => $excludedLink->url, + ]); + } + + public function testSearchWithTags() + { + $tag = factory(Tag::class)->create([ + 'user_id' => $this->user->id, + 'name' => 'artificial-intelligence', + ]); + + $link = factory(Link::class)->create([ + 'user_id' => $this->user->id, + 'url' => 'https://test.com', + ]); + + $link->tags()->sync([$tag->id]); + + // This link must not be present in the results + $excludedLink = factory(Link::class)->create([ + 'user_id' => $this->user->id, + 'url' => 'https://test.org', + ]); + + $url = sprintf('api/v1/search/links?only_tags=%s', $tag->id); + $response = $this->getJson($url, $this->generateHeaders()); + + $response->assertStatus(200) + ->assertJsonFragment([ + 'url' => $link->url, + ]) + ->assertJsonMissing([ + 'url' => $excludedLink->url, + ]); + } +} From 3eb941bdb85886283fbc496b28888f37d3509043 Mon Sep 17 00:00:00 2001 From: Kovah Date: Wed, 24 Jun 2020 17:10:10 +0200 Subject: [PATCH 24/44] Add new endpoint to check an url for existing links (#6) --- .../Controllers/API/LinkCheckController.php | 32 ++++++++++ routes/api.php | 5 ++ tests/Controller/API/LinkCheckApiTest.php | 58 +++++++++++++++++++ 3 files changed, 95 insertions(+) create mode 100644 app/Http/Controllers/API/LinkCheckController.php create mode 100644 tests/Controller/API/LinkCheckApiTest.php diff --git a/app/Http/Controllers/API/LinkCheckController.php b/app/Http/Controllers/API/LinkCheckController.php new file mode 100644 index 00000000..8103a312 --- /dev/null +++ b/app/Http/Controllers/API/LinkCheckController.php @@ -0,0 +1,32 @@ +input('url', false); + + if (!$searchedUrl) { + return response()->json(['linksFound' => false]); + } + + $linkCount = Link::byUser($request->user()->id) + ->where('url', trim($searchedUrl)) + ->count(); + + return response()->json(['linksFound' => $linkCount > 0]); + } +} diff --git a/routes/api.php b/routes/api.php index 7d0a6161..d082b2b9 100644 --- a/routes/api.php +++ b/routes/api.php @@ -1,5 +1,6 @@ group(function () { Route::middleware('auth:api')->group(function () { + + Route::get('links/check', LinkCheckController::class) + ->name('api.links.check'); + Route::apiResource('links', LinkController::class) ->names([ 'index' => 'api.links.index', diff --git a/tests/Controller/API/LinkCheckApiTest.php b/tests/Controller/API/LinkCheckApiTest.php new file mode 100644 index 00000000..1355b1ce --- /dev/null +++ b/tests/Controller/API/LinkCheckApiTest.php @@ -0,0 +1,58 @@ +getJson('api/v1/links/check'); + + $response->assertUnauthorized(); + } + + public function testSuccessfulLinkCheck(): void + { + factory(Link::class)->create([ + 'url' => 'https://example.com', + ]); + + $response = $this->getJson('api/v1/links/check?url=https://example.com', $this->generateHeaders()); + + $response->assertStatus(200) + ->assertJson([ + 'linksFound' => true, + ]); + } + + public function testNegativeLinkCheck(): void + { + factory(Link::class)->create([ + 'url' => 'https://test.com', + ]); + + $response = $this->getJson('api/v1/links/check?url=https://example.com', $this->generateHeaders()); + + $response->assertStatus(200) + ->assertJson([ + 'linksFound' => false, + ]); + } + + public function testCheckWithoutQuery(): void + { + $response = $this->getJson('api/v1/links/check', $this->generateHeaders()); + + $response->assertStatus(200) + ->assertJson([ + 'linksFound' => false, + ]); + } +} From 17dd6c88447ef87a0ec4fef7cc2193dc4cd2edd2 Mon Sep 17 00:00:00 2001 From: Kovah Date: Wed, 24 Jun 2020 20:54:17 +0200 Subject: [PATCH 25/44] Update PHP dependencies --- composer.lock | 15215 ++++++++++++++++++++++++------------------------ 1 file changed, 7626 insertions(+), 7589 deletions(-) diff --git a/composer.lock b/composer.lock index 6b24936f..ae0b2bee 100644 --- a/composer.lock +++ b/composer.lock @@ -1,7594 +1,7631 @@ { - "_readme": [ - "This file locks the dependencies of your project to a known state", - "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", - "This file is @generated automatically" - ], - "content-hash": "a169214e2e8bb728e2f5154724e9798b", - "packages": [ - { - "name": "brick/math", - "version": "0.8.15", - "source": { - "type": "git", - "url": "https://github.com/brick/math.git", - "reference": "9b08d412b9da9455b210459ff71414de7e6241cd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/brick/math/zipball/9b08d412b9da9455b210459ff71414de7e6241cd", - "reference": "9b08d412b9da9455b210459ff71414de7e6241cd", - "shasum": "" - }, - "require": { - "ext-json": "*", - "php": "^7.1|^8.0" - }, - "require-dev": { - "php-coveralls/php-coveralls": "^2.2", - "phpunit/phpunit": "^7.5.15|^8.5", - "vimeo/psalm": "^3.5" - }, - "type": "library", - "autoload": { - "psr-4": { - "Brick\\Math\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Arbitrary-precision arithmetic library", - "keywords": [ - "Arbitrary-precision", - "BigInteger", - "BigRational", - "arithmetic", - "bigdecimal", - "bignum", - "brick", - "math" - ], - "time": "2020-04-15T15:59:35+00:00" - }, - { - "name": "composer/semver", - "version": "1.5.1", - "source": { - "type": "git", - "url": "https://github.com/composer/semver.git", - "reference": "c6bea70230ef4dd483e6bbcab6005f682ed3a8de" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/semver/zipball/c6bea70230ef4dd483e6bbcab6005f682ed3a8de", - "reference": "c6bea70230ef4dd483e6bbcab6005f682ed3a8de", - "shasum": "" - }, - "require": { - "php": "^5.3.2 || ^7.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.5 || ^5.0.5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Composer\\Semver\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nils Adermann", - "email": "naderman@naderman.de", - "homepage": "http://www.naderman.de" - }, - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - }, - { - "name": "Rob Bast", - "email": "rob.bast@gmail.com", - "homepage": "http://robbast.nl" - } - ], - "description": "Semver library that offers utilities, version constraint parsing and validation.", - "keywords": [ - "semantic", - "semver", - "validation", - "versioning" - ], - "time": "2020-01-13T12:06:48+00:00" - }, - { - "name": "doctrine/cache", - "version": "1.10.1", - "source": { - "type": "git", - "url": "https://github.com/doctrine/cache.git", - "reference": "35a4a70cd94e09e2259dfae7488afc6b474ecbd3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/cache/zipball/35a4a70cd94e09e2259dfae7488afc6b474ecbd3", - "reference": "35a4a70cd94e09e2259dfae7488afc6b474ecbd3", - "shasum": "" - }, - "require": { - "php": "~7.1 || ^8.0" - }, - "conflict": { - "doctrine/common": ">2.2,<2.4" - }, - "require-dev": { - "alcaeus/mongo-php-adapter": "^1.1", - "doctrine/coding-standard": "^6.0", - "mongodb/mongodb": "^1.1", - "phpunit/phpunit": "^7.0", - "predis/predis": "~1.0" - }, - "suggest": { - "alcaeus/mongo-php-adapter": "Required to use legacy MongoDB driver" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.9.x-dev" - } - }, - "autoload": { - "psr-4": { - "Doctrine\\Common\\Cache\\": "lib/Doctrine/Common/Cache" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - } - ], - "description": "PHP Doctrine Cache library is a popular cache implementation that supports many different drivers such as redis, memcache, apc, mongodb and others.", - "homepage": "https://www.doctrine-project.org/projects/cache.html", - "keywords": [ - "abstraction", - "apcu", - "cache", - "caching", - "couchdb", - "memcached", - "php", - "redis", - "xcache" - ], - "time": "2020-05-27T16:24:54+00:00" - }, - { - "name": "doctrine/dbal", - "version": "2.10.2", - "source": { - "type": "git", - "url": "https://github.com/doctrine/dbal.git", - "reference": "aab745e7b6b2de3b47019da81e7225e14dcfdac8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/aab745e7b6b2de3b47019da81e7225e14dcfdac8", - "reference": "aab745e7b6b2de3b47019da81e7225e14dcfdac8", - "shasum": "" - }, - "require": { - "doctrine/cache": "^1.0", - "doctrine/event-manager": "^1.0", - "ext-pdo": "*", - "php": "^7.2" - }, - "require-dev": { - "doctrine/coding-standard": "^6.0", - "jetbrains/phpstorm-stubs": "^2019.1", - "nikic/php-parser": "^4.4", - "phpstan/phpstan": "^0.12", - "phpunit/phpunit": "^8.4.1", - "symfony/console": "^2.0.5|^3.0|^4.0|^5.0", - "vimeo/psalm": "^3.11" - }, - "suggest": { - "symfony/console": "For helpful console commands such as SQL execution and import of files." - }, - "bin": [ - "bin/doctrine-dbal" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.10.x-dev", - "dev-develop": "3.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Doctrine\\DBAL\\": "lib/Doctrine/DBAL" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - } - ], - "description": "Powerful PHP database abstraction layer (DBAL) with many features for database schema introspection and management.", - "homepage": "https://www.doctrine-project.org/projects/dbal.html", - "keywords": [ - "abstraction", - "database", - "db2", - "dbal", - "mariadb", - "mssql", - "mysql", - "oci8", - "oracle", - "pdo", - "pgsql", - "postgresql", - "queryobject", - "sasql", - "sql", - "sqlanywhere", - "sqlite", - "sqlserver", - "sqlsrv" - ], - "time": "2020-04-20T17:19:26+00:00" - }, - { - "name": "doctrine/event-manager", - "version": "1.1.0", - "source": { - "type": "git", - "url": "https://github.com/doctrine/event-manager.git", - "reference": "629572819973f13486371cb611386eb17851e85c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/event-manager/zipball/629572819973f13486371cb611386eb17851e85c", - "reference": "629572819973f13486371cb611386eb17851e85c", - "shasum": "" - }, - "require": { - "php": "^7.1" - }, - "conflict": { - "doctrine/common": "<2.9@dev" - }, - "require-dev": { - "doctrine/coding-standard": "^6.0", - "phpunit/phpunit": "^7.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Doctrine\\Common\\": "lib/Doctrine/Common" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - }, - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com" - } - ], - "description": "The Doctrine Event Manager is a simple PHP event system that was built to be used with the various Doctrine projects.", - "homepage": "https://www.doctrine-project.org/projects/event-manager.html", - "keywords": [ - "event", - "event dispatcher", - "event manager", - "event system", - "events" - ], - "time": "2019-11-10T09:48:07+00:00" - }, - { - "name": "doctrine/inflector", - "version": "2.0.3", - "source": { - "type": "git", - "url": "https://github.com/doctrine/inflector.git", - "reference": "9cf661f4eb38f7c881cac67c75ea9b00bf97b210" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/inflector/zipball/9cf661f4eb38f7c881cac67c75ea9b00bf97b210", - "reference": "9cf661f4eb38f7c881cac67c75ea9b00bf97b210", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "require-dev": { - "doctrine/coding-standard": "^7.0", - "phpstan/phpstan": "^0.11", - "phpstan/phpstan-phpunit": "^0.11", - "phpstan/phpstan-strict-rules": "^0.11", - "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Doctrine\\Inflector\\": "lib/Doctrine/Inflector" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - } - ], - "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.", - "homepage": "https://www.doctrine-project.org/projects/inflector.html", - "keywords": [ - "inflection", - "inflector", - "lowercase", - "manipulation", - "php", - "plural", - "singular", - "strings", - "uppercase", - "words" - ], - "time": "2020-05-29T15:13:26+00:00" - }, - { - "name": "doctrine/lexer", - "version": "1.2.1", - "source": { - "type": "git", - "url": "https://github.com/doctrine/lexer.git", - "reference": "e864bbf5904cb8f5bb334f99209b48018522f042" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/lexer/zipball/e864bbf5904cb8f5bb334f99209b48018522f042", - "reference": "e864bbf5904cb8f5bb334f99209b48018522f042", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "require-dev": { - "doctrine/coding-standard": "^6.0", - "phpstan/phpstan": "^0.11.8", - "phpunit/phpunit": "^8.2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.2.x-dev" - } - }, - "autoload": { - "psr-4": { - "Doctrine\\Common\\Lexer\\": "lib/Doctrine/Common/Lexer" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - } - ], - "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", - "homepage": "https://www.doctrine-project.org/projects/lexer.html", - "keywords": [ - "annotations", - "docblock", - "lexer", - "parser", - "php" - ], - "time": "2020-05-25T17:44:05+00:00" - }, - { - "name": "dragonmantank/cron-expression", - "version": "v2.3.0", - "source": { - "type": "git", - "url": "https://github.com/dragonmantank/cron-expression.git", - "reference": "72b6fbf76adb3cf5bc0db68559b33d41219aba27" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/72b6fbf76adb3cf5bc0db68559b33d41219aba27", - "reference": "72b6fbf76adb3cf5bc0db68559b33d41219aba27", - "shasum": "" - }, - "require": { - "php": "^7.0" - }, - "require-dev": { - "phpunit/phpunit": "^6.4|^7.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.3-dev" - } - }, - "autoload": { - "psr-4": { - "Cron\\": "src/Cron/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - }, - { - "name": "Chris Tankersley", - "email": "chris@ctankersley.com", - "homepage": "https://github.com/dragonmantank" - } - ], - "description": "CRON for PHP: Calculate the next or previous run date and determine if a CRON expression is due", - "keywords": [ - "cron", - "schedule" - ], - "time": "2019-03-31T00:38:28+00:00" - }, - { - "name": "egulias/email-validator", - "version": "2.1.17", - "source": { - "type": "git", - "url": "https://github.com/egulias/EmailValidator.git", - "reference": "ade6887fd9bd74177769645ab5c474824f8a418a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/ade6887fd9bd74177769645ab5c474824f8a418a", - "reference": "ade6887fd9bd74177769645ab5c474824f8a418a", - "shasum": "" - }, - "require": { - "doctrine/lexer": "^1.0.1", - "php": ">=5.5", - "symfony/polyfill-intl-idn": "^1.10" - }, - "require-dev": { - "dominicsayers/isemail": "^3.0.7", - "phpunit/phpunit": "^4.8.36|^7.5.15", - "satooshi/php-coveralls": "^1.0.1" - }, - "suggest": { - "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Egulias\\EmailValidator\\": "EmailValidator" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Eduardo Gulias Davis" - } - ], - "description": "A library for validating emails against several RFCs", - "homepage": "https://github.com/egulias/EmailValidator", - "keywords": [ - "email", - "emailvalidation", - "emailvalidator", - "validation", - "validator" - ], - "time": "2020-02-13T22:36:52+00:00" - }, - { - "name": "fideloper/proxy", - "version": "4.3.0", - "source": { - "type": "git", - "url": "https://github.com/fideloper/TrustedProxy.git", - "reference": "ec38ad69ee378a1eec04fb0e417a97cfaf7ed11a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/fideloper/TrustedProxy/zipball/ec38ad69ee378a1eec04fb0e417a97cfaf7ed11a", - "reference": "ec38ad69ee378a1eec04fb0e417a97cfaf7ed11a", - "shasum": "" - }, - "require": { - "illuminate/contracts": "^5.0|^6.0|^7.0|^8.0", - "php": ">=5.4.0" - }, - "require-dev": { - "illuminate/http": "^5.0|^6.0|^7.0|^8.0", - "mockery/mockery": "^1.0", - "phpunit/phpunit": "^6.0" - }, - "type": "library", - "extra": { - "laravel": { - "providers": [ - "Fideloper\\Proxy\\TrustedProxyServiceProvider" - ] - } - }, - "autoload": { - "psr-4": { - "Fideloper\\Proxy\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Chris Fidao", - "email": "fideloper@gmail.com" - } - ], - "description": "Set trusted proxies for Laravel", - "keywords": [ - "load balancing", - "proxy", - "trusted proxy" - ], - "time": "2020-02-22T01:51:47+00:00" - }, - { - "name": "guzzlehttp/guzzle", - "version": "6.5.4", - "source": { - "type": "git", - "url": "https://github.com/guzzle/guzzle.git", - "reference": "a4a1b6930528a8f7ee03518e6442ec7a44155d9d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/a4a1b6930528a8f7ee03518e6442ec7a44155d9d", - "reference": "a4a1b6930528a8f7ee03518e6442ec7a44155d9d", - "shasum": "" - }, - "require": { - "ext-json": "*", - "guzzlehttp/promises": "^1.0", - "guzzlehttp/psr7": "^1.6.1", - "php": ">=5.5", - "symfony/polyfill-intl-idn": "1.17.0" - }, - "require-dev": { - "ext-curl": "*", - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0", - "psr/log": "^1.1" - }, - "suggest": { - "psr/log": "Required for using the Log middleware" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "6.5-dev" - } - }, - "autoload": { - "psr-4": { - "GuzzleHttp\\": "src/" - }, - "files": [ - "src/functions_include.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - } - ], - "description": "Guzzle is a PHP HTTP client library", - "homepage": "http://guzzlephp.org/", - "keywords": [ - "client", - "curl", - "framework", - "http", - "http client", - "rest", - "web service" - ], - "time": "2020-05-25T19:35:05+00:00" - }, - { - "name": "guzzlehttp/promises", - "version": "v1.3.1", - "source": { - "type": "git", - "url": "https://github.com/guzzle/promises.git", - "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/a59da6cf61d80060647ff4d3eb2c03a2bc694646", - "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646", - "shasum": "" - }, - "require": { - "php": ">=5.5.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.4-dev" - } - }, - "autoload": { - "psr-4": { - "GuzzleHttp\\Promise\\": "src/" - }, - "files": [ - "src/functions_include.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - } - ], - "description": "Guzzle promises library", - "keywords": [ - "promise" - ], - "time": "2016-12-20T10:07:11+00:00" - }, - { - "name": "guzzlehttp/psr7", - "version": "1.6.1", - "source": { - "type": "git", - "url": "https://github.com/guzzle/psr7.git", - "reference": "239400de7a173fe9901b9ac7c06497751f00727a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/239400de7a173fe9901b9ac7c06497751f00727a", - "reference": "239400de7a173fe9901b9ac7c06497751f00727a", - "shasum": "" - }, - "require": { - "php": ">=5.4.0", - "psr/http-message": "~1.0", - "ralouphie/getallheaders": "^2.0.5 || ^3.0.0" - }, - "provide": { - "psr/http-message-implementation": "1.0" - }, - "require-dev": { - "ext-zlib": "*", - "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.8" - }, - "suggest": { - "zendframework/zend-httphandlerrunner": "Emit PSR-7 responses" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.6-dev" - } - }, - "autoload": { - "psr-4": { - "GuzzleHttp\\Psr7\\": "src/" - }, - "files": [ - "src/functions_include.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - }, - { - "name": "Tobias Schultze", - "homepage": "https://github.com/Tobion" - } - ], - "description": "PSR-7 message implementation that also provides common utility methods", - "keywords": [ - "http", - "message", - "psr-7", - "request", - "response", - "stream", - "uri", - "url" - ], - "time": "2019-07-01T23:21:34+00:00" - }, - { - "name": "katzgrau/klogger", - "version": "1.2.1", - "source": { - "type": "git", - "url": "https://github.com/katzgrau/KLogger.git", - "reference": "a4ed373fa8a214aa4ae7aa4f221fe2c6ce862ef1" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/katzgrau/KLogger/zipball/a4ed373fa8a214aa4ae7aa4f221fe2c6ce862ef1", - "reference": "a4ed373fa8a214aa4ae7aa4f221fe2c6ce862ef1", - "shasum": "" - }, - "require": { - "php": ">=5.3", - "psr/log": "^1.0.0" - }, - "require-dev": { - "phpunit/phpunit": "4.0.*" - }, - "type": "library", - "autoload": { - "psr-4": { - "Katzgrau\\KLogger\\": "src/" - }, - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Kenny Katzgrau", - "email": "katzgrau@gmail.com" - }, - { - "name": "Dan Horrigan", - "email": "dan@dhorrigan.com" - } - ], - "description": "A Simple Logging Class", - "keywords": [ - "logging" - ], - "time": "2016-11-07T19:29:14+00:00" - }, - { - "name": "laracasts/flash", - "version": "3.1", - "source": { - "type": "git", - "url": "https://github.com/laracasts/flash.git", - "reference": "150d4348477db31b9a93ccd07f713e3d0513b3bf" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/laracasts/flash/zipball/150d4348477db31b9a93ccd07f713e3d0513b3bf", - "reference": "150d4348477db31b9a93ccd07f713e3d0513b3bf", - "shasum": "" - }, - "require": { - "illuminate/support": "~5.0|^6.0|^7.0", - "php": ">=5.4.0" - }, - "require-dev": { - "mockery/mockery": "dev-master", - "phpunit/phpunit": "^6.1" - }, - "type": "library", - "extra": { - "laravel": { - "providers": [ - "Laracasts\\Flash\\FlashServiceProvider" - ], - "aliases": { - "Flash": "Laracasts\\Flash\\Flash" - } - } - }, - "autoload": { - "psr-0": { - "Laracasts\\Flash": "src/" - }, - "files": [ - "src/Laracasts/Flash/functions.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jeffrey Way", - "email": "jeffrey@laracasts.com" - } - ], - "description": "Easy flash notifications", - "time": "2020-03-03T15:50:52+00:00" - }, - { - "name": "laravel/framework", - "version": "v7.13.0", - "source": { - "type": "git", - "url": "https://github.com/laravel/framework.git", - "reference": "6fa69bfbd57744a5bbec5538ce483919b3fd625f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/6fa69bfbd57744a5bbec5538ce483919b3fd625f", - "reference": "6fa69bfbd57744a5bbec5538ce483919b3fd625f", - "shasum": "" - }, - "require": { - "doctrine/inflector": "^1.4|^2.0", - "dragonmantank/cron-expression": "^2.0", - "egulias/email-validator": "^2.1.10", - "ext-json": "*", - "ext-mbstring": "*", - "ext-openssl": "*", - "league/commonmark": "^1.3", - "league/flysystem": "^1.0.8", - "monolog/monolog": "^2.0", - "nesbot/carbon": "^2.17", - "opis/closure": "^3.1", - "php": "^7.2.5", - "psr/container": "^1.0", - "psr/simple-cache": "^1.0", - "ramsey/uuid": "^3.7|^4.0", - "swiftmailer/swiftmailer": "^6.0", - "symfony/console": "^5.0", - "symfony/error-handler": "^5.0", - "symfony/finder": "^5.0", - "symfony/http-foundation": "^5.0", - "symfony/http-kernel": "^5.0", - "symfony/mime": "^5.0", - "symfony/polyfill-php73": "^1.17", - "symfony/process": "^5.0", - "symfony/routing": "^5.0", - "symfony/var-dumper": "^5.0", - "tijsverkoyen/css-to-inline-styles": "^2.2.2", - "vlucas/phpdotenv": "^4.0", - "voku/portable-ascii": "^1.4.8" - }, - "conflict": { - "tightenco/collect": "<5.5.33" - }, - "replace": { - "illuminate/auth": "self.version", - "illuminate/broadcasting": "self.version", - "illuminate/bus": "self.version", - "illuminate/cache": "self.version", - "illuminate/config": "self.version", - "illuminate/console": "self.version", - "illuminate/container": "self.version", - "illuminate/contracts": "self.version", - "illuminate/cookie": "self.version", - "illuminate/database": "self.version", - "illuminate/encryption": "self.version", - "illuminate/events": "self.version", - "illuminate/filesystem": "self.version", - "illuminate/hashing": "self.version", - "illuminate/http": "self.version", - "illuminate/log": "self.version", - "illuminate/mail": "self.version", - "illuminate/notifications": "self.version", - "illuminate/pagination": "self.version", - "illuminate/pipeline": "self.version", - "illuminate/queue": "self.version", - "illuminate/redis": "self.version", - "illuminate/routing": "self.version", - "illuminate/session": "self.version", - "illuminate/support": "self.version", - "illuminate/testing": "self.version", - "illuminate/translation": "self.version", - "illuminate/validation": "self.version", - "illuminate/view": "self.version" - }, - "require-dev": { - "aws/aws-sdk-php": "^3.0", - "doctrine/dbal": "^2.6", - "filp/whoops": "^2.4", - "guzzlehttp/guzzle": "^6.3.1|^7.0", - "league/flysystem-cached-adapter": "^1.0", - "mockery/mockery": "^1.3.1", - "moontoast/math": "^1.1", - "orchestra/testbench-core": "^5.0", - "pda/pheanstalk": "^4.0", - "phpunit/phpunit": "^8.4|^9.0", - "predis/predis": "^1.1.1", - "symfony/cache": "^5.0" - }, - "suggest": { - "aws/aws-sdk-php": "Required to use the SQS queue driver, DynamoDb failed job storage and SES mail driver (^3.0).", - "doctrine/dbal": "Required to rename columns and drop SQLite columns (^2.6).", - "ext-gd": "Required to use Illuminate\\Http\\Testing\\FileFactory::image().", - "ext-memcached": "Required to use the memcache cache driver.", - "ext-pcntl": "Required to use all features of the queue worker.", - "ext-posix": "Required to use all features of the queue worker.", - "ext-redis": "Required to use the Redis cache and queue drivers (^4.0|^5.0).", - "filp/whoops": "Required for friendly error pages in development (^2.4).", - "fzaninotto/faker": "Required to use the eloquent factory builder (^1.9.1).", - "guzzlehttp/guzzle": "Required to use the HTTP Client, Mailgun mail driver and the ping methods on schedules (^6.3.1|^7.0).", - "laravel/tinker": "Required to use the tinker console command (^2.0).", - "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (^1.0).", - "league/flysystem-cached-adapter": "Required to use the Flysystem cache (^1.0).", - "league/flysystem-sftp": "Required to use the Flysystem SFTP driver (^1.0).", - "mockery/mockery": "Required to use mocking (^1.3.1).", - "moontoast/math": "Required to use ordered UUIDs (^1.1).", - "nyholm/psr7": "Required to use PSR-7 bridging features (^1.2).", - "pda/pheanstalk": "Required to use the beanstalk queue driver (^4.0).", - "phpunit/phpunit": "Required to use assertions and run tests (^8.4|^9.0).", - "psr/http-message": "Required to allow Storage::put to accept a StreamInterface (^1.0).", - "pusher/pusher-php-server": "Required to use the Pusher broadcast driver (^4.0).", - "symfony/cache": "Required to PSR-6 cache bridge (^5.0).", - "symfony/filesystem": "Required to create relative storage directory symbolic links (^5.0).", - "symfony/psr-http-message-bridge": "Required to use PSR-7 bridging features (^2.0).", - "wildbit/swiftmailer-postmark": "Required to use Postmark mail driver (^3.0)." - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "7.x-dev" - } - }, - "autoload": { - "files": [ - "src/Illuminate/Foundation/helpers.php", - "src/Illuminate/Support/helpers.php" - ], - "psr-4": { - "Illuminate\\": "src/Illuminate/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" - } - ], - "description": "The Laravel Framework.", - "homepage": "https://laravel.com", - "keywords": [ - "framework", - "laravel" - ], - "time": "2020-05-26T14:32:43+00:00" - }, - { - "name": "laravel/ui", - "version": "v2.0.3", - "source": { - "type": "git", - "url": "https://github.com/laravel/ui.git", - "reference": "15368c5328efb7ce94f35ca750acde9b496ab1b1" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/laravel/ui/zipball/15368c5328efb7ce94f35ca750acde9b496ab1b1", - "reference": "15368c5328efb7ce94f35ca750acde9b496ab1b1", - "shasum": "" - }, - "require": { - "illuminate/console": "^7.0", - "illuminate/filesystem": "^7.0", - "illuminate/support": "^7.0", - "php": "^7.2.5" - }, - "require-dev": { - "mockery/mockery": "^1.0", - "phpunit/phpunit": "^8.0" - }, - "type": "library", - "extra": { - "laravel": { - "providers": [ - "Laravel\\Ui\\UiServiceProvider" - ] - } - }, - "autoload": { - "psr-4": { - "Laravel\\Ui\\": "src/", - "Illuminate\\Foundation\\Auth\\": "auth-backend/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" - } - ], - "description": "Laravel UI utilities and presets.", - "keywords": [ - "laravel", - "ui" - ], - "time": "2020-04-29T15:06:45+00:00" - }, - { - "name": "league/commonmark", - "version": "1.4.3", - "source": { - "type": "git", - "url": "https://github.com/thephpleague/commonmark.git", - "reference": "412639f7cfbc0b31ad2455b2fe965095f66ae505" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/412639f7cfbc0b31ad2455b2fe965095f66ae505", - "reference": "412639f7cfbc0b31ad2455b2fe965095f66ae505", - "shasum": "" - }, - "require": { - "ext-mbstring": "*", - "php": "^7.1" - }, - "conflict": { - "scrutinizer/ocular": "1.7.*" - }, - "require-dev": { - "cebe/markdown": "~1.0", - "commonmark/commonmark.js": "0.29.1", - "erusev/parsedown": "~1.0", - "ext-json": "*", - "github/gfm": "0.29.0", - "michelf/php-markdown": "~1.4", - "mikehaertl/php-shellcommand": "^1.4", - "phpstan/phpstan": "^0.12", - "phpunit/phpunit": "^7.5", - "scrutinizer/ocular": "^1.5", - "symfony/finder": "^4.2" - }, - "bin": [ - "bin/commonmark" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.4-dev" - } - }, - "autoload": { - "psr-4": { - "League\\CommonMark\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Colin O'Dell", - "email": "colinodell@gmail.com", - "homepage": "https://www.colinodell.com", - "role": "Lead Developer" - } - ], - "description": "Highly-extensible PHP Markdown parser which fully supports the CommonMark spec and Github-Flavored Markdown (GFM)", - "homepage": "https://commonmark.thephpleague.com", - "keywords": [ - "commonmark", - "flavored", - "gfm", - "github", - "github-flavored", - "markdown", - "md", - "parser" - ], - "time": "2020-05-04T22:15:21+00:00" + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "a169214e2e8bb728e2f5154724e9798b", + "packages": [ + { + "name": "brick/math", + "version": "0.8.15", + "source": { + "type": "git", + "url": "https://github.com/brick/math.git", + "reference": "9b08d412b9da9455b210459ff71414de7e6241cd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/brick/math/zipball/9b08d412b9da9455b210459ff71414de7e6241cd", + "reference": "9b08d412b9da9455b210459ff71414de7e6241cd", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": "^7.1|^8.0" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.2", + "phpunit/phpunit": "^7.5.15|^8.5", + "vimeo/psalm": "^3.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Brick\\Math\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Arbitrary-precision arithmetic library", + "keywords": [ + "Arbitrary-precision", + "BigInteger", + "BigRational", + "arithmetic", + "bigdecimal", + "bignum", + "brick", + "math" + ], + "time": "2020-04-15T15:59:35+00:00" + }, + { + "name": "composer/semver", + "version": "1.5.1", + "source": { + "type": "git", + "url": "https://github.com/composer/semver.git", + "reference": "c6bea70230ef4dd483e6bbcab6005f682ed3a8de" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/semver/zipball/c6bea70230ef4dd483e6bbcab6005f682ed3a8de", + "reference": "c6bea70230ef4dd483e6bbcab6005f682ed3a8de", + "shasum": "" + }, + "require": { + "php": "^5.3.2 || ^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.5 || ^5.0.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Semver\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nils Adermann", + "email": "naderman@naderman.de", + "homepage": "http://www.naderman.de" + }, + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + }, + { + "name": "Rob Bast", + "email": "rob.bast@gmail.com", + "homepage": "http://robbast.nl" + } + ], + "description": "Semver library that offers utilities, version constraint parsing and validation.", + "keywords": [ + "semantic", + "semver", + "validation", + "versioning" + ], + "time": "2020-01-13T12:06:48+00:00" + }, + { + "name": "doctrine/cache", + "version": "1.10.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/cache.git", + "reference": "35a4a70cd94e09e2259dfae7488afc6b474ecbd3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/cache/zipball/35a4a70cd94e09e2259dfae7488afc6b474ecbd3", + "reference": "35a4a70cd94e09e2259dfae7488afc6b474ecbd3", + "shasum": "" + }, + "require": { + "php": "~7.1 || ^8.0" + }, + "conflict": { + "doctrine/common": ">2.2,<2.4" + }, + "require-dev": { + "alcaeus/mongo-php-adapter": "^1.1", + "doctrine/coding-standard": "^6.0", + "mongodb/mongodb": "^1.1", + "phpunit/phpunit": "^7.0", + "predis/predis": "~1.0" + }, + "suggest": { + "alcaeus/mongo-php-adapter": "Required to use legacy MongoDB driver" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.9.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Common\\Cache\\": "lib/Doctrine/Common/Cache" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Cache library is a popular cache implementation that supports many different drivers such as redis, memcache, apc, mongodb and others.", + "homepage": "https://www.doctrine-project.org/projects/cache.html", + "keywords": [ + "abstraction", + "apcu", + "cache", + "caching", + "couchdb", + "memcached", + "php", + "redis", + "xcache" + ], + "time": "2020-05-27T16:24:54+00:00" + }, + { + "name": "doctrine/dbal", + "version": "2.10.2", + "source": { + "type": "git", + "url": "https://github.com/doctrine/dbal.git", + "reference": "aab745e7b6b2de3b47019da81e7225e14dcfdac8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/aab745e7b6b2de3b47019da81e7225e14dcfdac8", + "reference": "aab745e7b6b2de3b47019da81e7225e14dcfdac8", + "shasum": "" + }, + "require": { + "doctrine/cache": "^1.0", + "doctrine/event-manager": "^1.0", + "ext-pdo": "*", + "php": "^7.2" + }, + "require-dev": { + "doctrine/coding-standard": "^6.0", + "jetbrains/phpstorm-stubs": "^2019.1", + "nikic/php-parser": "^4.4", + "phpstan/phpstan": "^0.12", + "phpunit/phpunit": "^8.4.1", + "symfony/console": "^2.0.5|^3.0|^4.0|^5.0", + "vimeo/psalm": "^3.11" + }, + "suggest": { + "symfony/console": "For helpful console commands such as SQL execution and import of files." + }, + "bin": [ + "bin/doctrine-dbal" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.10.x-dev", + "dev-develop": "3.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\DBAL\\": "lib/Doctrine/DBAL" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + } + ], + "description": "Powerful PHP database abstraction layer (DBAL) with many features for database schema introspection and management.", + "homepage": "https://www.doctrine-project.org/projects/dbal.html", + "keywords": [ + "abstraction", + "database", + "db2", + "dbal", + "mariadb", + "mssql", + "mysql", + "oci8", + "oracle", + "pdo", + "pgsql", + "postgresql", + "queryobject", + "sasql", + "sql", + "sqlanywhere", + "sqlite", + "sqlserver", + "sqlsrv" + ], + "time": "2020-04-20T17:19:26+00:00" + }, + { + "name": "doctrine/event-manager", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/event-manager.git", + "reference": "629572819973f13486371cb611386eb17851e85c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/event-manager/zipball/629572819973f13486371cb611386eb17851e85c", + "reference": "629572819973f13486371cb611386eb17851e85c", + "shasum": "" + }, + "require": { + "php": "^7.1" + }, + "conflict": { + "doctrine/common": "<2.9@dev" + }, + "require-dev": { + "doctrine/coding-standard": "^6.0", + "phpunit/phpunit": "^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Common\\": "lib/Doctrine/Common" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + }, + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" + } + ], + "description": "The Doctrine Event Manager is a simple PHP event system that was built to be used with the various Doctrine projects.", + "homepage": "https://www.doctrine-project.org/projects/event-manager.html", + "keywords": [ + "event", + "event dispatcher", + "event manager", + "event system", + "events" + ], + "time": "2019-11-10T09:48:07+00:00" + }, + { + "name": "doctrine/inflector", + "version": "2.0.3", + "source": { + "type": "git", + "url": "https://github.com/doctrine/inflector.git", + "reference": "9cf661f4eb38f7c881cac67c75ea9b00bf97b210" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/9cf661f4eb38f7c881cac67c75ea9b00bf97b210", + "reference": "9cf661f4eb38f7c881cac67c75ea9b00bf97b210", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^7.0", + "phpstan/phpstan": "^0.11", + "phpstan/phpstan-phpunit": "^0.11", + "phpstan/phpstan-strict-rules": "^0.11", + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Inflector\\": "lib/Doctrine/Inflector" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.", + "homepage": "https://www.doctrine-project.org/projects/inflector.html", + "keywords": [ + "inflection", + "inflector", + "lowercase", + "manipulation", + "php", + "plural", + "singular", + "strings", + "uppercase", + "words" + ], + "time": "2020-05-29T15:13:26+00:00" + }, + { + "name": "doctrine/lexer", + "version": "1.2.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/lexer.git", + "reference": "e864bbf5904cb8f5bb334f99209b48018522f042" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/e864bbf5904cb8f5bb334f99209b48018522f042", + "reference": "e864bbf5904cb8f5bb334f99209b48018522f042", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^6.0", + "phpstan/phpstan": "^0.11.8", + "phpunit/phpunit": "^8.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Common\\Lexer\\": "lib/Doctrine/Common/Lexer" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", + "homepage": "https://www.doctrine-project.org/projects/lexer.html", + "keywords": [ + "annotations", + "docblock", + "lexer", + "parser", + "php" + ], + "time": "2020-05-25T17:44:05+00:00" + }, + { + "name": "dragonmantank/cron-expression", + "version": "v2.3.0", + "source": { + "type": "git", + "url": "https://github.com/dragonmantank/cron-expression.git", + "reference": "72b6fbf76adb3cf5bc0db68559b33d41219aba27" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/72b6fbf76adb3cf5bc0db68559b33d41219aba27", + "reference": "72b6fbf76adb3cf5bc0db68559b33d41219aba27", + "shasum": "" + }, + "require": { + "php": "^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.4|^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev" + } + }, + "autoload": { + "psr-4": { + "Cron\\": "src/Cron/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Chris Tankersley", + "email": "chris@ctankersley.com", + "homepage": "https://github.com/dragonmantank" + } + ], + "description": "CRON for PHP: Calculate the next or previous run date and determine if a CRON expression is due", + "keywords": [ + "cron", + "schedule" + ], + "time": "2019-03-31T00:38:28+00:00" + }, + { + "name": "egulias/email-validator", + "version": "2.1.18", + "source": { + "type": "git", + "url": "https://github.com/egulias/EmailValidator.git", + "reference": "cfa3d44471c7f5bfb684ac2b0da7114283d78441" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/cfa3d44471c7f5bfb684ac2b0da7114283d78441", + "reference": "cfa3d44471c7f5bfb684ac2b0da7114283d78441", + "shasum": "" + }, + "require": { + "doctrine/lexer": "^1.0.1", + "php": ">=5.5", + "symfony/polyfill-intl-idn": "^1.10" + }, + "require-dev": { + "dominicsayers/isemail": "^3.0.7", + "phpunit/phpunit": "^4.8.36|^7.5.15", + "satooshi/php-coveralls": "^1.0.1" + }, + "suggest": { + "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Egulias\\EmailValidator\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Eduardo Gulias Davis" + } + ], + "description": "A library for validating emails against several RFCs", + "homepage": "https://github.com/egulias/EmailValidator", + "keywords": [ + "email", + "emailvalidation", + "emailvalidator", + "validation", + "validator" + ], + "time": "2020-06-16T20:11:17+00:00" + }, + { + "name": "fideloper/proxy", + "version": "4.4.0", + "source": { + "type": "git", + "url": "https://github.com/fideloper/TrustedProxy.git", + "reference": "9beebf48a1c344ed67c1d36bb1b8709db7c3c1a8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/fideloper/TrustedProxy/zipball/9beebf48a1c344ed67c1d36bb1b8709db7c3c1a8", + "reference": "9beebf48a1c344ed67c1d36bb1b8709db7c3c1a8", + "shasum": "" + }, + "require": { + "illuminate/contracts": "^5.0|^6.0|^7.0|^8.0", + "php": ">=5.4.0" + }, + "require-dev": { + "illuminate/http": "^5.0|^6.0|^7.0|^8.0", + "mockery/mockery": "^1.0", + "phpunit/phpunit": "^6.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Fideloper\\Proxy\\TrustedProxyServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Fideloper\\Proxy\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Chris Fidao", + "email": "fideloper@gmail.com" + } + ], + "description": "Set trusted proxies for Laravel", + "keywords": [ + "load balancing", + "proxy", + "trusted proxy" + ], + "time": "2020-06-23T01:36:47+00:00" + }, + { + "name": "guzzlehttp/guzzle", + "version": "6.5.5", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "9d4290de1cfd701f38099ef7e183b64b4b7b0c5e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/9d4290de1cfd701f38099ef7e183b64b4b7b0c5e", + "reference": "9d4290de1cfd701f38099ef7e183b64b4b7b0c5e", + "shasum": "" + }, + "require": { + "ext-json": "*", + "guzzlehttp/promises": "^1.0", + "guzzlehttp/psr7": "^1.6.1", + "php": ">=5.5", + "symfony/polyfill-intl-idn": "^1.17.0" + }, + "require-dev": { + "ext-curl": "*", + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0", + "psr/log": "^1.1" + }, + "suggest": { + "psr/log": "Required for using the Log middleware" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "6.5-dev" + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\": "src/" + }, + "files": [ + "src/functions_include.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "description": "Guzzle is a PHP HTTP client library", + "homepage": "http://guzzlephp.org/", + "keywords": [ + "client", + "curl", + "framework", + "http", + "http client", + "rest", + "web service" + ], + "time": "2020-06-16T21:01:06+00:00" + }, + { + "name": "guzzlehttp/promises", + "version": "v1.3.1", + "source": { + "type": "git", + "url": "https://github.com/guzzle/promises.git", + "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/promises/zipball/a59da6cf61d80060647ff4d3eb2c03a2bc694646", + "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646", + "shasum": "" + }, + "require": { + "php": ">=5.5.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4-dev" + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Promise\\": "src/" + }, + "files": [ + "src/functions_include.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "description": "Guzzle promises library", + "keywords": [ + "promise" + ], + "time": "2016-12-20T10:07:11+00:00" + }, + { + "name": "guzzlehttp/psr7", + "version": "1.6.1", + "source": { + "type": "git", + "url": "https://github.com/guzzle/psr7.git", + "reference": "239400de7a173fe9901b9ac7c06497751f00727a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/239400de7a173fe9901b9ac7c06497751f00727a", + "reference": "239400de7a173fe9901b9ac7c06497751f00727a", + "shasum": "" + }, + "require": { + "php": ">=5.4.0", + "psr/http-message": "~1.0", + "ralouphie/getallheaders": "^2.0.5 || ^3.0.0" + }, + "provide": { + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "ext-zlib": "*", + "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.8" + }, + "suggest": { + "zendframework/zend-httphandlerrunner": "Emit PSR-7 responses" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.6-dev" + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Psr7\\": "src/" + }, + "files": [ + "src/functions_include.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Tobias Schultze", + "homepage": "https://github.com/Tobion" + } + ], + "description": "PSR-7 message implementation that also provides common utility methods", + "keywords": [ + "http", + "message", + "psr-7", + "request", + "response", + "stream", + "uri", + "url" + ], + "time": "2019-07-01T23:21:34+00:00" + }, + { + "name": "katzgrau/klogger", + "version": "1.2.1", + "source": { + "type": "git", + "url": "https://github.com/katzgrau/KLogger.git", + "reference": "a4ed373fa8a214aa4ae7aa4f221fe2c6ce862ef1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/katzgrau/KLogger/zipball/a4ed373fa8a214aa4ae7aa4f221fe2c6ce862ef1", + "reference": "a4ed373fa8a214aa4ae7aa4f221fe2c6ce862ef1", + "shasum": "" + }, + "require": { + "php": ">=5.3", + "psr/log": "^1.0.0" + }, + "require-dev": { + "phpunit/phpunit": "4.0.*" + }, + "type": "library", + "autoload": { + "psr-4": { + "Katzgrau\\KLogger\\": "src/" + }, + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Kenny Katzgrau", + "email": "katzgrau@gmail.com" + }, + { + "name": "Dan Horrigan", + "email": "dan@dhorrigan.com" + } + ], + "description": "A Simple Logging Class", + "keywords": [ + "logging" + ], + "time": "2016-11-07T19:29:14+00:00" + }, + { + "name": "laracasts/flash", + "version": "3.1", + "source": { + "type": "git", + "url": "https://github.com/laracasts/flash.git", + "reference": "150d4348477db31b9a93ccd07f713e3d0513b3bf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laracasts/flash/zipball/150d4348477db31b9a93ccd07f713e3d0513b3bf", + "reference": "150d4348477db31b9a93ccd07f713e3d0513b3bf", + "shasum": "" + }, + "require": { + "illuminate/support": "~5.0|^6.0|^7.0", + "php": ">=5.4.0" + }, + "require-dev": { + "mockery/mockery": "dev-master", + "phpunit/phpunit": "^6.1" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Laracasts\\Flash\\FlashServiceProvider" + ], + "aliases": { + "Flash": "Laracasts\\Flash\\Flash" + } + } + }, + "autoload": { + "psr-0": { + "Laracasts\\Flash": "src/" + }, + "files": [ + "src/Laracasts/Flash/functions.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jeffrey Way", + "email": "jeffrey@laracasts.com" + } + ], + "description": "Easy flash notifications", + "time": "2020-03-03T15:50:52+00:00" + }, + { + "name": "laravel/framework", + "version": "v7.17.2", + "source": { + "type": "git", + "url": "https://github.com/laravel/framework.git", + "reference": "d16ff3a0a66d98e04163456b39c4b7302cf50a40" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/framework/zipball/d16ff3a0a66d98e04163456b39c4b7302cf50a40", + "reference": "d16ff3a0a66d98e04163456b39c4b7302cf50a40", + "shasum": "" + }, + "require": { + "doctrine/inflector": "^1.4|^2.0", + "dragonmantank/cron-expression": "^2.0", + "egulias/email-validator": "^2.1.10", + "ext-json": "*", + "ext-mbstring": "*", + "ext-openssl": "*", + "league/commonmark": "^1.3", + "league/flysystem": "^1.0.34", + "monolog/monolog": "^2.0", + "nesbot/carbon": "^2.17", + "opis/closure": "^3.1", + "php": "^7.2.5", + "psr/container": "^1.0", + "psr/simple-cache": "^1.0", + "ramsey/uuid": "^3.7|^4.0", + "swiftmailer/swiftmailer": "^6.0", + "symfony/console": "^5.0", + "symfony/error-handler": "^5.0", + "symfony/finder": "^5.0", + "symfony/http-foundation": "^5.0", + "symfony/http-kernel": "^5.0", + "symfony/mime": "^5.0", + "symfony/polyfill-php73": "^1.17", + "symfony/process": "^5.0", + "symfony/routing": "^5.0", + "symfony/var-dumper": "^5.0", + "tijsverkoyen/css-to-inline-styles": "^2.2.2", + "vlucas/phpdotenv": "^4.0", + "voku/portable-ascii": "^1.4.8" + }, + "conflict": { + "tightenco/collect": "<5.5.33" + }, + "provide": { + "psr/container-implementation": "1.0" + }, + "replace": { + "illuminate/auth": "self.version", + "illuminate/broadcasting": "self.version", + "illuminate/bus": "self.version", + "illuminate/cache": "self.version", + "illuminate/config": "self.version", + "illuminate/console": "self.version", + "illuminate/container": "self.version", + "illuminate/contracts": "self.version", + "illuminate/cookie": "self.version", + "illuminate/database": "self.version", + "illuminate/encryption": "self.version", + "illuminate/events": "self.version", + "illuminate/filesystem": "self.version", + "illuminate/hashing": "self.version", + "illuminate/http": "self.version", + "illuminate/log": "self.version", + "illuminate/mail": "self.version", + "illuminate/notifications": "self.version", + "illuminate/pagination": "self.version", + "illuminate/pipeline": "self.version", + "illuminate/queue": "self.version", + "illuminate/redis": "self.version", + "illuminate/routing": "self.version", + "illuminate/session": "self.version", + "illuminate/support": "self.version", + "illuminate/testing": "self.version", + "illuminate/translation": "self.version", + "illuminate/validation": "self.version", + "illuminate/view": "self.version" + }, + "require-dev": { + "aws/aws-sdk-php": "^3.0", + "doctrine/dbal": "^2.6", + "filp/whoops": "^2.4", + "guzzlehttp/guzzle": "^6.3.1|^7.0", + "league/flysystem-cached-adapter": "^1.0", + "mockery/mockery": "^1.3.1", + "moontoast/math": "^1.1", + "orchestra/testbench-core": "^5.0", + "pda/pheanstalk": "^4.0", + "phpunit/phpunit": "^8.4|^9.0", + "predis/predis": "^1.1.1", + "symfony/cache": "^5.0" + }, + "suggest": { + "aws/aws-sdk-php": "Required to use the SQS queue driver, DynamoDb failed job storage and SES mail driver (^3.0).", + "doctrine/dbal": "Required to rename columns and drop SQLite columns (^2.6).", + "ext-ftp": "Required to use the Flysystem FTP driver.", + "ext-gd": "Required to use Illuminate\\Http\\Testing\\FileFactory::image().", + "ext-memcached": "Required to use the memcache cache driver.", + "ext-pcntl": "Required to use all features of the queue worker.", + "ext-posix": "Required to use all features of the queue worker.", + "ext-redis": "Required to use the Redis cache and queue drivers (^4.0|^5.0).", + "filp/whoops": "Required for friendly error pages in development (^2.4).", + "fzaninotto/faker": "Required to use the eloquent factory builder (^1.9.1).", + "guzzlehttp/guzzle": "Required to use the HTTP Client, Mailgun mail driver and the ping methods on schedules (^6.3.1|^7.0).", + "laravel/tinker": "Required to use the tinker console command (^2.0).", + "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (^1.0).", + "league/flysystem-cached-adapter": "Required to use the Flysystem cache (^1.0).", + "league/flysystem-sftp": "Required to use the Flysystem SFTP driver (^1.0).", + "mockery/mockery": "Required to use mocking (^1.3.1).", + "moontoast/math": "Required to use ordered UUIDs (^1.1).", + "nyholm/psr7": "Required to use PSR-7 bridging features (^1.2).", + "pda/pheanstalk": "Required to use the beanstalk queue driver (^4.0).", + "phpunit/phpunit": "Required to use assertions and run tests (^8.4|^9.0).", + "psr/http-message": "Required to allow Storage::put to accept a StreamInterface (^1.0).", + "pusher/pusher-php-server": "Required to use the Pusher broadcast driver (^4.0).", + "symfony/cache": "Required to PSR-6 cache bridge (^5.0).", + "symfony/filesystem": "Required to create relative storage directory symbolic links (^5.0).", + "symfony/psr-http-message-bridge": "Required to use PSR-7 bridging features (^2.0).", + "wildbit/swiftmailer-postmark": "Required to use Postmark mail driver (^3.0)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "7.x-dev" + } + }, + "autoload": { + "files": [ + "src/Illuminate/Foundation/helpers.php", + "src/Illuminate/Support/helpers.php" + ], + "psr-4": { + "Illuminate\\": "src/Illuminate/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Laravel Framework.", + "homepage": "https://laravel.com", + "keywords": [ + "framework", + "laravel" + ], + "time": "2020-06-24T13:11:25+00:00" + }, + { + "name": "laravel/ui", + "version": "v2.0.3", + "source": { + "type": "git", + "url": "https://github.com/laravel/ui.git", + "reference": "15368c5328efb7ce94f35ca750acde9b496ab1b1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/ui/zipball/15368c5328efb7ce94f35ca750acde9b496ab1b1", + "reference": "15368c5328efb7ce94f35ca750acde9b496ab1b1", + "shasum": "" + }, + "require": { + "illuminate/console": "^7.0", + "illuminate/filesystem": "^7.0", + "illuminate/support": "^7.0", + "php": "^7.2.5" + }, + "require-dev": { + "mockery/mockery": "^1.0", + "phpunit/phpunit": "^8.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Laravel\\Ui\\UiServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Laravel\\Ui\\": "src/", + "Illuminate\\Foundation\\Auth\\": "auth-backend/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Laravel UI utilities and presets.", + "keywords": [ + "laravel", + "ui" + ], + "time": "2020-04-29T15:06:45+00:00" + }, + { + "name": "league/commonmark", + "version": "1.5.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/commonmark.git", + "reference": "fc33ca12575e98e57cdce7d5f38b2ca5335714b3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/fc33ca12575e98e57cdce7d5f38b2ca5335714b3", + "reference": "fc33ca12575e98e57cdce7d5f38b2ca5335714b3", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": "^7.1 || ^8.0" + }, + "conflict": { + "scrutinizer/ocular": "1.7.*" + }, + "require-dev": { + "cebe/markdown": "~1.0", + "commonmark/commonmark.js": "0.29.1", + "erusev/parsedown": "~1.0", + "ext-json": "*", + "github/gfm": "0.29.0", + "michelf/php-markdown": "~1.4", + "mikehaertl/php-shellcommand": "^1.4", + "phpstan/phpstan": "^0.12", + "phpunit/phpunit": "^7.5", + "scrutinizer/ocular": "^1.5", + "symfony/finder": "^4.2" + }, + "bin": [ + "bin/commonmark" + ], + "type": "library", + "autoload": { + "psr-4": { + "League\\CommonMark\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com", + "role": "Lead Developer" + } + ], + "description": "Highly-extensible PHP Markdown parser which fully supports the CommonMark spec and Github-Flavored Markdown (GFM)", + "homepage": "https://commonmark.thephpleague.com", + "keywords": [ + "commonmark", + "flavored", + "gfm", + "github", + "github-flavored", + "markdown", + "md", + "parser" + ], + "time": "2020-06-21T20:50:13+00:00" + }, + { + "name": "league/csv", + "version": "9.6.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/csv.git", + "reference": "7351a74625601914409b42b32cabb91a93773b7b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/csv/zipball/7351a74625601914409b42b32cabb91a93773b7b", + "reference": "7351a74625601914409b42b32cabb91a93773b7b", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-mbstring": "*", + "php": "^7.2.5" + }, + "require-dev": { + "ext-curl": "*", + "friendsofphp/php-cs-fixer": "^2.16", + "phpstan/phpstan": "^0.12.0", + "phpstan/phpstan-phpunit": "^0.12.0", + "phpstan/phpstan-strict-rules": "^0.12.0", + "phpunit/phpunit": "^8.0" + }, + "suggest": { + "ext-dom": "Required to use the XMLConverter and or the HTMLConverter classes", + "ext-iconv": "Needed to ease transcoding CSV using iconv stream filters" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "9.x-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Csv\\": "src" + }, + "files": [ + "src/functions_include.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ignace Nyamagana Butera", + "email": "nyamsprod@gmail.com", + "homepage": "https://github.com/nyamsprod/", + "role": "Developer" + } + ], + "description": "CSV data manipulation made easy in PHP", + "homepage": "http://csv.thephpleague.com", + "keywords": [ + "convert", + "csv", + "export", + "filter", + "import", + "read", + "transform", + "write" + ], + "time": "2020-03-17T15:15:35+00:00" + }, + { + "name": "league/flysystem", + "version": "1.0.69", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/flysystem.git", + "reference": "7106f78428a344bc4f643c233a94e48795f10967" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/7106f78428a344bc4f643c233a94e48795f10967", + "reference": "7106f78428a344bc4f643c233a94e48795f10967", + "shasum": "" + }, + "require": { + "ext-fileinfo": "*", + "php": ">=5.5.9" + }, + "conflict": { + "league/flysystem-sftp": "<1.0.6" + }, + "require-dev": { + "phpspec/phpspec": "^3.4", + "phpunit/phpunit": "^5.7.26" + }, + "suggest": { + "ext-fileinfo": "Required for MimeType", + "ext-ftp": "Allows you to use FTP server storage", + "ext-openssl": "Allows you to use FTPS server storage", + "league/flysystem-aws-s3-v2": "Allows you to use S3 storage with AWS SDK v2", + "league/flysystem-aws-s3-v3": "Allows you to use S3 storage with AWS SDK v3", + "league/flysystem-azure": "Allows you to use Windows Azure Blob storage", + "league/flysystem-cached-adapter": "Flysystem adapter decorator for metadata caching", + "league/flysystem-eventable-filesystem": "Allows you to use EventableFilesystem", + "league/flysystem-rackspace": "Allows you to use Rackspace Cloud Files", + "league/flysystem-sftp": "Allows you to use SFTP server storage via phpseclib", + "league/flysystem-webdav": "Allows you to use WebDAV storage", + "league/flysystem-ziparchive": "Allows you to use ZipArchive adapter", + "spatie/flysystem-dropbox": "Allows you to use Dropbox storage", + "srmklive/flysystem-dropbox-v2": "Allows you to use Dropbox storage for PHP 5 applications" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Flysystem\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frenky.net" + } + ], + "description": "Filesystem abstraction: Many filesystems, one API.", + "keywords": [ + "Cloud Files", + "WebDAV", + "abstraction", + "aws", + "cloud", + "copy.com", + "dropbox", + "file systems", + "files", + "filesystem", + "filesystems", + "ftp", + "rackspace", + "remote", + "s3", + "sftp", + "storage" + ], + "time": "2020-05-18T15:13:39+00:00" + }, + { + "name": "monolog/monolog", + "version": "2.1.0", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/monolog.git", + "reference": "38914429aac460e8e4616c8cb486ecb40ec90bb1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/38914429aac460e8e4616c8cb486ecb40ec90bb1", + "reference": "38914429aac460e8e4616c8cb486ecb40ec90bb1", + "shasum": "" + }, + "require": { + "php": ">=7.2", + "psr/log": "^1.0.1" + }, + "provide": { + "psr/log-implementation": "1.0.0" + }, + "require-dev": { + "aws/aws-sdk-php": "^2.4.9 || ^3.0", + "doctrine/couchdb": "~1.0@dev", + "elasticsearch/elasticsearch": "^6.0", + "graylog2/gelf-php": "^1.4.2", + "php-amqplib/php-amqplib": "~2.4", + "php-console/php-console": "^3.1.3", + "php-parallel-lint/php-parallel-lint": "^1.0", + "phpspec/prophecy": "^1.6.1", + "phpunit/phpunit": "^8.5", + "predis/predis": "^1.1", + "rollbar/rollbar": "^1.3", + "ruflin/elastica": ">=0.90 <3.0", + "swiftmailer/swiftmailer": "^5.3|^6.0" + }, + "suggest": { + "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", + "doctrine/couchdb": "Allow sending log messages to a CouchDB server", + "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client", + "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", + "ext-mbstring": "Allow to work properly with unicode symbols", + "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)", + "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", + "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)", + "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", + "php-console/php-console": "Allow sending log messages to Google Chrome", + "rollbar/rollbar": "Allow sending log messages to Rollbar", + "ruflin/elastica": "Allow sending log messages to an Elastic Search server" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Monolog\\": "src/Monolog" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "Sends your logs to files, sockets, inboxes, databases and various web services", + "homepage": "http://github.com/Seldaek/monolog", + "keywords": [ + "log", + "logging", + "psr-3" + ], + "time": "2020-05-22T08:12:19+00:00" + }, + { + "name": "nesbot/carbon", + "version": "2.35.0", + "source": { + "type": "git", + "url": "https://github.com/briannesbitt/Carbon.git", + "reference": "4b9bd835261ef23d36397a46a76b496a458305e5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/4b9bd835261ef23d36397a46a76b496a458305e5", + "reference": "4b9bd835261ef23d36397a46a76b496a458305e5", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": "^7.1.8 || ^8.0", + "symfony/polyfill-mbstring": "^1.0", + "symfony/translation": "^3.4 || ^4.0 || ^5.0" + }, + "require-dev": { + "doctrine/orm": "^2.7", + "friendsofphp/php-cs-fixer": "^2.14 || ^3.0", + "kylekatarnls/multi-tester": "^1.1", + "phpmd/phpmd": "^2.8", + "phpstan/phpstan": "^0.11", + "phpunit/phpunit": "^7.5 || ^8.0", + "squizlabs/php_codesniffer": "^3.4" + }, + "bin": [ + "bin/carbon" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.x-dev", + "dev-3.x": "3.x-dev" + }, + "laravel": { + "providers": [ + "Carbon\\Laravel\\ServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Carbon\\": "src/Carbon/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Brian Nesbitt", + "email": "brian@nesbot.com", + "homepage": "http://nesbot.com" + }, + { + "name": "kylekatarnls", + "homepage": "http://github.com/kylekatarnls" + } + ], + "description": "An API extension for DateTime that supports 281 different languages.", + "homepage": "http://carbon.nesbot.com", + "keywords": [ + "date", + "datetime", + "time" + ], + "time": "2020-05-24T18:27:52+00:00" + }, + { + "name": "opis/closure", + "version": "3.5.5", + "source": { + "type": "git", + "url": "https://github.com/opis/closure.git", + "reference": "dec9fc5ecfca93f45cd6121f8e6f14457dff372c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/opis/closure/zipball/dec9fc5ecfca93f45cd6121f8e6f14457dff372c", + "reference": "dec9fc5ecfca93f45cd6121f8e6f14457dff372c", + "shasum": "" + }, + "require": { + "php": "^5.4 || ^7.0" + }, + "require-dev": { + "jeremeamia/superclosure": "^2.0", + "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.5.x-dev" + } + }, + "autoload": { + "psr-4": { + "Opis\\Closure\\": "src/" + }, + "files": [ + "functions.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marius Sarca", + "email": "marius.sarca@gmail.com" + }, + { + "name": "Sorin Sarca", + "email": "sarca_sorin@hotmail.com" + } + ], + "description": "A library that can be used to serialize closures (anonymous functions) and arbitrary objects.", + "homepage": "https://opis.io/closure", + "keywords": [ + "anonymous functions", + "closure", + "function", + "serializable", + "serialization", + "serialize" + ], + "time": "2020-06-17T14:59:55+00:00" + }, + { + "name": "phpoption/phpoption", + "version": "1.7.4", + "source": { + "type": "git", + "url": "https://github.com/schmittjoh/php-option.git", + "reference": "b2ada2ad5d8a32b89088b8adc31ecd2e3a13baf3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/b2ada2ad5d8a32b89088b8adc31ecd2e3a13baf3", + "reference": "b2ada2ad5d8a32b89088b8adc31ecd2e3a13baf3", + "shasum": "" + }, + "require": { + "php": "^5.5.9 || ^7.0 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.3", + "phpunit/phpunit": "^4.8.35 || ^5.0 || ^6.0 || ^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.7-dev" + } + }, + "autoload": { + "psr-4": { + "PhpOption\\": "src/PhpOption/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Johannes M. Schmitt", + "email": "schmittjoh@gmail.com" + }, + { + "name": "Graham Campbell", + "email": "graham@alt-three.com" + } + ], + "description": "Option Type for PHP", + "keywords": [ + "language", + "option", + "php", + "type" + ], + "time": "2020-06-07T10:40:07+00:00" + }, + { + "name": "predis/predis", + "version": "v1.1.1", + "source": { + "type": "git", + "url": "https://github.com/nrk/predis.git", + "reference": "f0210e38881631afeafb56ab43405a92cafd9fd1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nrk/predis/zipball/f0210e38881631afeafb56ab43405a92cafd9fd1", + "reference": "f0210e38881631afeafb56ab43405a92cafd9fd1", + "shasum": "" + }, + "require": { + "php": ">=5.3.9" + }, + "require-dev": { + "phpunit/phpunit": "~4.8" + }, + "suggest": { + "ext-curl": "Allows access to Webdis when paired with phpiredis", + "ext-phpiredis": "Allows faster serialization and deserialization of the Redis protocol" + }, + "type": "library", + "autoload": { + "psr-4": { + "Predis\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Daniele Alessandri", + "email": "suppakilla@gmail.com", + "homepage": "http://clorophilla.net" + } + ], + "description": "Flexible and feature-complete Redis client for PHP and HHVM", + "homepage": "http://github.com/nrk/predis", + "keywords": [ + "nosql", + "predis", + "redis" + ], + "time": "2016-06-16T16:22:20+00:00" + }, + { + "name": "psr/container", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f", + "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "time": "2017-02-14T16:28:37+00:00" + }, + { + "name": "psr/event-dispatcher", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/event-dispatcher.git", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\EventDispatcher\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Standard interfaces for event handling.", + "keywords": [ + "events", + "psr", + "psr-14" + ], + "time": "2019-01-08T18:20:26+00:00" + }, + { + "name": "psr/http-message", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "time": "2016-08-06T14:39:51+00:00" + }, + { + "name": "psr/log", + "version": "1.1.3", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/0f73288fd15629204f9d42b7055f72dacbe811fc", + "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "Psr/Log/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "time": "2020-03-23T09:12:05+00:00" + }, + { + "name": "psr/simple-cache", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/simple-cache.git", + "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", + "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\SimpleCache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interfaces for simple caching", + "keywords": [ + "cache", + "caching", + "psr", + "psr-16", + "simple-cache" + ], + "time": "2017-10-23T01:57:42+00:00" + }, + { + "name": "ralouphie/getallheaders", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/ralouphie/getallheaders.git", + "reference": "120b605dfeb996808c31b6477290a714d356e822" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", + "reference": "120b605dfeb996808c31b6477290a714d356e822", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^5 || ^6.5" + }, + "type": "library", + "autoload": { + "files": [ + "src/getallheaders.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ralph Khattar", + "email": "ralph.khattar@gmail.com" + } + ], + "description": "A polyfill for getallheaders.", + "time": "2019-03-08T08:55:37+00:00" + }, + { + "name": "ramsey/collection", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/ramsey/collection.git", + "reference": "925ad8cf55ba7a3fc92e332c58fd0478ace3e1ca" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/collection/zipball/925ad8cf55ba7a3fc92e332c58fd0478ace3e1ca", + "reference": "925ad8cf55ba7a3fc92e332c58fd0478ace3e1ca", + "shasum": "" + }, + "require": { + "php": "^7.2" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.5.0", + "fzaninotto/faker": "^1.5", + "jakub-onderka/php-parallel-lint": "^1", + "jangregor/phpstan-prophecy": "^0.6", + "mockery/mockery": "^1.3", + "phpstan/extension-installer": "^1", + "phpstan/phpdoc-parser": "0.4.1", + "phpstan/phpstan": "^0.12", + "phpstan/phpstan-mockery": "^0.12", + "phpstan/phpstan-phpunit": "^0.12", + "phpunit/phpunit": "^8.5", + "slevomat/coding-standard": "^6.0", + "squizlabs/php_codesniffer": "^3.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Ramsey\\Collection\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ben Ramsey", + "email": "ben@benramsey.com", + "homepage": "https://benramsey.com" + } + ], + "description": "A PHP 7.2+ library for representing and manipulating collections.", + "homepage": "https://github.com/ramsey/collection", + "keywords": [ + "array", + "collection", + "hash", + "map", + "queue", + "set" + ], + "time": "2020-01-05T00:22:59+00:00" + }, + { + "name": "ramsey/uuid", + "version": "4.0.1", + "source": { + "type": "git", + "url": "https://github.com/ramsey/uuid.git", + "reference": "ba8fff1d3abb8bb4d35a135ed22a31c6ef3ede3d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/ba8fff1d3abb8bb4d35a135ed22a31c6ef3ede3d", + "reference": "ba8fff1d3abb8bb4d35a135ed22a31c6ef3ede3d", + "shasum": "" + }, + "require": { + "brick/math": "^0.8", + "ext-json": "*", + "php": "^7.2 || ^8", + "ramsey/collection": "^1.0", + "symfony/polyfill-ctype": "^1.8" + }, + "replace": { + "rhumsaa/uuid": "self.version" + }, + "require-dev": { + "codeception/aspect-mock": "^3", + "dealerdirect/phpcodesniffer-composer-installer": "^0.6.2", + "doctrine/annotations": "^1.8", + "goaop/framework": "^2", + "mockery/mockery": "^1.3", + "moontoast/math": "^1.1", + "paragonie/random-lib": "^2", + "php-mock/php-mock-mockery": "^1.3", + "php-mock/php-mock-phpunit": "^2.5", + "php-parallel-lint/php-parallel-lint": "^1.1", + "phpstan/extension-installer": "^1.0", + "phpstan/phpdoc-parser": "0.4.3", + "phpstan/phpstan": "^0.12", + "phpstan/phpstan-mockery": "^0.12", + "phpstan/phpstan-phpunit": "^0.12", + "phpunit/phpunit": "^8.5", + "psy/psysh": "^0.10.0", + "slevomat/coding-standard": "^6.0", + "squizlabs/php_codesniffer": "^3.5", + "vimeo/psalm": "3.9.4" + }, + "suggest": { + "ext-bcmath": "Enables faster math with arbitrary-precision integers using BCMath.", + "ext-ctype": "Enables faster processing of character classification using ctype functions.", + "ext-gmp": "Enables faster math with arbitrary-precision integers using GMP.", + "ext-uuid": "Enables the use of PeclUuidTimeGenerator and PeclUuidRandomGenerator.", + "paragonie/random-lib": "Provides RandomLib for use with the RandomLibAdapter", + "ramsey/uuid-doctrine": "Allows the use of Ramsey\\Uuid\\Uuid as Doctrine field type." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.x-dev" + } + }, + "autoload": { + "psr-4": { + "Ramsey\\Uuid\\": "src/" + }, + "files": [ + "src/functions.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A PHP library for generating and working with universally unique identifiers (UUIDs).", + "homepage": "https://github.com/ramsey/uuid", + "keywords": [ + "guid", + "identifier", + "uuid" + ], + "time": "2020-03-29T20:13:32+00:00" + }, + { + "name": "shaarli/netscape-bookmark-parser", + "version": "v2.2.0", + "source": { + "type": "git", + "url": "https://github.com/shaarli/netscape-bookmark-parser.git", + "reference": "432a010af2bb1832d6fbc4763e6b0100b980a1df" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/shaarli/netscape-bookmark-parser/zipball/432a010af2bb1832d6fbc4763e6b0100b980a1df", + "reference": "432a010af2bb1832d6fbc4763e6b0100b980a1df", + "shasum": "" + }, + "require": { + "katzgrau/klogger": "~1.0", + "php": ">=5.6" + }, + "require-dev": { + "phpunit/phpunit": "^5.0" + }, + "type": "library", + "autoload": { + "files": [ + "NetscapeBookmarkParser.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Kafene", + "email": "io@kafene.org", + "homepage": "https://github.com/kafene", + "role": "Developer" + }, + { + "name": "VirtualTam", + "email": "virtualtam@flibidi.net", + "homepage": "https://github.com/virtualtam", + "role": "Developer" + } + ], + "description": "Generic Netscape bookmark parser", + "homepage": "https://github.com/shaarli/netscape-bookmark-parser", + "keywords": [ + "bookmark", + "link", + "netscape", + "parse" + ], + "time": "2020-06-06T15:53:53+00:00" + }, + { + "name": "spatie/db-dumper", + "version": "2.16.1", + "source": { + "type": "git", + "url": "https://github.com/spatie/db-dumper.git", + "reference": "56448e8f41d4e8e83babf701d5708b1e597e8ec6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/db-dumper/zipball/56448e8f41d4e8e83babf701d5708b1e597e8ec6", + "reference": "56448e8f41d4e8e83babf701d5708b1e597e8ec6", + "shasum": "" + }, + "require": { + "php": "^7.2", + "symfony/process": "^4.2|^5.0" + }, + "require-dev": { + "phpunit/phpunit": "^7.0|^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spatie\\DbDumper\\": "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": "Dump databases", + "homepage": "https://github.com/spatie/db-dumper", + "keywords": [ + "database", + "db-dumper", + "dump", + "mysqldump", + "spatie" + ], + "time": "2020-05-06T14:32:38+00:00" + }, + { + "name": "spatie/laravel-backup", + "version": "6.11.1", + "source": { + "type": "git", + "url": "https://github.com/spatie/laravel-backup.git", + "reference": "3ede36961b79b6ea4a6b5f708f2cc60fee74ad6c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/laravel-backup/zipball/3ede36961b79b6ea4a6b5f708f2cc60fee74ad6c", + "reference": "3ede36961b79b6ea4a6b5f708f2cc60fee74ad6c", + "shasum": "" + }, + "require": { + "illuminate/console": "^5.8.15|^6.0|^7.0", + "illuminate/contracts": "^5.8.15|^6.0|^7.0", + "illuminate/events": "^5.8.15|^6.0|^7.0", + "illuminate/filesystem": "^5.8.15|^6.0|^7.0", + "illuminate/notifications": "^5.8.15|^6.0|^7.0", + "illuminate/support": "^5.8.15|^6.0|^7.0", + "league/flysystem": "^1.0.49", + "php": "^7.2", + "spatie/db-dumper": "^2.12", + "spatie/temporary-directory": "^1.1", + "symfony/finder": "^4.2|^5.0" + }, + "require-dev": { + "laravel/slack-notification-channel": "^1.0", + "league/flysystem-aws-s3-v3": "^1.0", + "mockery/mockery": "^1.3", + "orchestra/testbench": "3.8.*|4.*|5.*", + "phpunit/phpunit": "^8.4|^9.0" + }, + "suggest": { + "laravel/slack-notification-channel": "Required for sending notifications via Slack" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Spatie\\Backup\\BackupServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Spatie\\Backup\\": "src" + }, + "files": [ + "src/Helpers/functions.php" + ] + }, + "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 Laravel package to backup your application", + "homepage": "https://github.com/spatie/laravel-backup", + "keywords": [ + "backup", + "database", + "laravel-backup", + "spatie" + ], + "time": "2020-06-18T09:59:06+00:00" + }, + { + "name": "spatie/temporary-directory", + "version": "1.2.3", + "source": { + "type": "git", + "url": "https://github.com/spatie/temporary-directory.git", + "reference": "eeb84a7a3543e90759cd852ccb468e3d3340d99d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/temporary-directory/zipball/eeb84a7a3543e90759cd852ccb468e3d3340d99d", + "reference": "eeb84a7a3543e90759cd852ccb468e3d3340d99d", + "shasum": "" + }, + "require": { + "php": "^7.2" + }, + "require-dev": { + "phpunit/phpunit": "^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spatie\\TemporaryDirectory\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Alex Vanderbist", + "email": "alex@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "Easily create, use and destroy temporary directories", + "homepage": "https://github.com/spatie/temporary-directory", + "keywords": [ + "spatie", + "temporary-directory" + ], + "time": "2020-06-08T08:58:45+00:00" + }, + { + "name": "swiftmailer/swiftmailer", + "version": "v6.2.3", + "source": { + "type": "git", + "url": "https://github.com/swiftmailer/swiftmailer.git", + "reference": "149cfdf118b169f7840bbe3ef0d4bc795d1780c9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/149cfdf118b169f7840bbe3ef0d4bc795d1780c9", + "reference": "149cfdf118b169f7840bbe3ef0d4bc795d1780c9", + "shasum": "" + }, + "require": { + "egulias/email-validator": "~2.0", + "php": ">=7.0.0", + "symfony/polyfill-iconv": "^1.0", + "symfony/polyfill-intl-idn": "^1.10", + "symfony/polyfill-mbstring": "^1.0" + }, + "require-dev": { + "mockery/mockery": "~0.9.1", + "symfony/phpunit-bridge": "^3.4.19|^4.1.8" + }, + "suggest": { + "ext-intl": "Needed to support internationalized email addresses", + "true/punycode": "Needed to support internationalized email addresses, if ext-intl is not installed" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "6.2-dev" + } + }, + "autoload": { + "files": [ + "lib/swift_required.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Chris Corbyn" + }, + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + } + ], + "description": "Swiftmailer, free feature-rich PHP mailer", + "homepage": "https://swiftmailer.symfony.com", + "keywords": [ + "email", + "mail", + "mailer" + ], + "time": "2019-11-12T09:31:26+00:00" + }, + { + "name": "symfony/console", + "version": "v5.1.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "34ac555a3627e324b660e318daa07572e1140123" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/34ac555a3627e324b660e318daa07572e1140123", + "reference": "34ac555a3627e324b660e318daa07572e1140123", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php73": "^1.8", + "symfony/polyfill-php80": "^1.15", + "symfony/service-contracts": "^1.1|^2", + "symfony/string": "^5.1" + }, + "conflict": { + "symfony/dependency-injection": "<4.4", + "symfony/dotenv": "<5.1", + "symfony/event-dispatcher": "<4.4", + "symfony/lock": "<4.4", + "symfony/process": "<4.4" + }, + "provide": { + "psr/log-implementation": "1.0" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/config": "^4.4|^5.0", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/event-dispatcher": "^4.4|^5.0", + "symfony/lock": "^4.4|^5.0", + "symfony/process": "^4.4|^5.0", + "symfony/var-dumper": "^4.4|^5.0" + }, + "suggest": { + "psr/log": "For using the console logger", + "symfony/event-dispatcher": "", + "symfony/lock": "", + "symfony/process": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "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": "Symfony Console Component", + "homepage": "https://symfony.com", + "time": "2020-06-15T12:59:21+00:00" + }, + { + "name": "symfony/css-selector", + "version": "v5.1.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/css-selector.git", + "reference": "e544e24472d4c97b2d11ade7caacd446727c6bf9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/e544e24472d4c97b2d11ade7caacd446727c6bf9", + "reference": "e544e24472d4c97b2d11ade7caacd446727c6bf9", + "shasum": "" + }, + "require": { + "php": ">=7.2.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\CssSelector\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Jean-François Simon", + "email": "jeanfrancois.simon@sensiolabs.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony CssSelector Component", + "homepage": "https://symfony.com", + "time": "2020-05-20T17:43:50+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v2.1.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "dd99cb3a0aff6cadd2a8d7d7ed72c2161e218337" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/dd99cb3a0aff6cadd2a8d7d7ed72c2161e218337", + "reference": "dd99cb3a0aff6cadd2a8d7d7ed72c2161e218337", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.1-dev" + } + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "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": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "time": "2020-05-27T08:34:37+00:00" + }, + { + "name": "symfony/error-handler", + "version": "v5.1.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/error-handler.git", + "reference": "7d0b927b9d3dc41d7d46cda38cbfcd20cdcbb896" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/7d0b927b9d3dc41d7d46cda38cbfcd20cdcbb896", + "reference": "7d0b927b9d3dc41d7d46cda38cbfcd20cdcbb896", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/log": "^1.0", + "symfony/polyfill-php80": "^1.15", + "symfony/var-dumper": "^4.4|^5.0" + }, + "require-dev": { + "symfony/deprecation-contracts": "^2.1", + "symfony/http-kernel": "^4.4|^5.0", + "symfony/serializer": "^4.4|^5.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\ErrorHandler\\": "" + }, + "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": "Symfony ErrorHandler Component", + "homepage": "https://symfony.com", + "time": "2020-05-30T20:35:19+00:00" + }, + { + "name": "symfony/event-dispatcher", + "version": "v5.1.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "cc0d059e2e997e79ca34125a52f3e33de4424ac7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/cc0d059e2e997e79ca34125a52f3e33de4424ac7", + "reference": "cc0d059e2e997e79ca34125a52f3e33de4424ac7", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/event-dispatcher-contracts": "^2", + "symfony/polyfill-php80": "^1.15" + }, + "conflict": { + "symfony/dependency-injection": "<4.4" + }, + "provide": { + "psr/event-dispatcher-implementation": "1.0", + "symfony/event-dispatcher-implementation": "2.0" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/config": "^4.4|^5.0", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/expression-language": "^4.4|^5.0", + "symfony/http-foundation": "^4.4|^5.0", + "symfony/service-contracts": "^1.1|^2", + "symfony/stopwatch": "^4.4|^5.0" + }, + "suggest": { + "symfony/dependency-injection": "", + "symfony/http-kernel": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\EventDispatcher\\": "" + }, + "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": "Symfony EventDispatcher Component", + "homepage": "https://symfony.com", + "time": "2020-05-20T17:43:50+00:00" + }, + { + "name": "symfony/event-dispatcher-contracts", + "version": "v2.1.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher-contracts.git", + "reference": "405952c4e90941a17e52ef7489a2bd94870bb290" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/405952c4e90941a17e52ef7489a2bd94870bb290", + "reference": "405952c4e90941a17e52ef7489a2bd94870bb290", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/event-dispatcher": "^1" + }, + "suggest": { + "symfony/event-dispatcher-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\EventDispatcher\\": "" + } + }, + "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": "Generic abstractions related to dispatching event", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "time": "2020-05-20T17:43:50+00:00" + }, + { + "name": "symfony/finder", + "version": "v5.1.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "4298870062bfc667cb78d2b379be4bf5dec5f187" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/4298870062bfc667cb78d2b379be4bf5dec5f187", + "reference": "4298870062bfc667cb78d2b379be4bf5dec5f187", + "shasum": "" + }, + "require": { + "php": ">=7.2.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + }, + "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": "Symfony Finder Component", + "homepage": "https://symfony.com", + "time": "2020-05-20T17:43:50+00:00" + }, + { + "name": "symfony/http-foundation", + "version": "v5.1.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-foundation.git", + "reference": "f93055171b847915225bd5b0a5792888419d8d75" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/f93055171b847915225bd5b0a5792888419d8d75", + "reference": "f93055171b847915225bd5b0a5792888419d8d75", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-mbstring": "~1.1", + "symfony/polyfill-php80": "^1.15" + }, + "require-dev": { + "predis/predis": "~1.0", + "symfony/cache": "^4.4|^5.0", + "symfony/expression-language": "^4.4|^5.0", + "symfony/mime": "^4.4|^5.0" + }, + "suggest": { + "symfony/mime": "To use the file extension guesser" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpFoundation\\": "" + }, + "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": "Symfony HttpFoundation Component", + "homepage": "https://symfony.com", + "time": "2020-06-15T06:52:54+00:00" + }, + { + "name": "symfony/http-kernel", + "version": "v5.1.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-kernel.git", + "reference": "a18c27ace1ef344ffcb129a5b089bad7643b387a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/a18c27ace1ef344ffcb129a5b089bad7643b387a", + "reference": "a18c27ace1ef344ffcb129a5b089bad7643b387a", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/log": "~1.0", + "symfony/deprecation-contracts": "^2.1", + "symfony/error-handler": "^4.4|^5.0", + "symfony/event-dispatcher": "^5.0", + "symfony/http-foundation": "^4.4|^5.0", + "symfony/polyfill-ctype": "^1.8", + "symfony/polyfill-php73": "^1.9", + "symfony/polyfill-php80": "^1.15" + }, + "conflict": { + "symfony/browser-kit": "<4.4", + "symfony/cache": "<5.0", + "symfony/config": "<5.0", + "symfony/console": "<4.4", + "symfony/dependency-injection": "<4.4", + "symfony/doctrine-bridge": "<5.0", + "symfony/form": "<5.0", + "symfony/http-client": "<5.0", + "symfony/mailer": "<5.0", + "symfony/messenger": "<5.0", + "symfony/translation": "<5.0", + "symfony/twig-bridge": "<5.0", + "symfony/validator": "<5.0", + "twig/twig": "<2.4" + }, + "provide": { + "psr/log-implementation": "1.0" + }, + "require-dev": { + "psr/cache": "~1.0", + "symfony/browser-kit": "^4.4|^5.0", + "symfony/config": "^5.0", + "symfony/console": "^4.4|^5.0", + "symfony/css-selector": "^4.4|^5.0", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/dom-crawler": "^4.4|^5.0", + "symfony/expression-language": "^4.4|^5.0", + "symfony/finder": "^4.4|^5.0", + "symfony/process": "^4.4|^5.0", + "symfony/routing": "^4.4|^5.0", + "symfony/stopwatch": "^4.4|^5.0", + "symfony/translation": "^4.4|^5.0", + "symfony/translation-contracts": "^1.1|^2", + "twig/twig": "^2.4|^3.0" + }, + "suggest": { + "symfony/browser-kit": "", + "symfony/config": "", + "symfony/console": "", + "symfony/dependency-injection": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpKernel\\": "" + }, + "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": "Symfony HttpKernel Component", + "homepage": "https://symfony.com", + "time": "2020-06-15T13:51:38+00:00" + }, + { + "name": "symfony/mime", + "version": "v5.1.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/mime.git", + "reference": "c0c418f05e727606e85b482a8591519c4712cf45" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mime/zipball/c0c418f05e727606e85b482a8591519c4712cf45", + "reference": "c0c418f05e727606e85b482a8591519c4712cf45", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-intl-idn": "^1.10", + "symfony/polyfill-mbstring": "^1.0", + "symfony/polyfill-php80": "^1.15" + }, + "conflict": { + "symfony/mailer": "<4.4" + }, + "require-dev": { + "egulias/email-validator": "^2.1.10", + "symfony/dependency-injection": "^4.4|^5.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Mime\\": "" + }, + "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": "A library to manipulate MIME messages", + "homepage": "https://symfony.com", + "keywords": [ + "mime", + "mime-type" + ], + "time": "2020-06-09T15:07:35+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.17.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "2edd75b8b35d62fd3eeabba73b26b8f1f60ce13d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/2edd75b8b35d62fd3eeabba73b26b8f1f60ce13d", + "reference": "2edd75b8b35d62fd3eeabba73b26b8f1f60ce13d", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.17-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "time": "2020-06-06T08:46:27+00:00" + }, + { + "name": "symfony/polyfill-iconv", + "version": "v1.17.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-iconv.git", + "reference": "ba6c9c18db36235b859cc29b8372d1c01298c035" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-iconv/zipball/ba6c9c18db36235b859cc29b8372d1c01298c035", + "reference": "ba6c9c18db36235b859cc29b8372d1c01298c035", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "suggest": { + "ext-iconv": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.17-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Iconv\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "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" + ], + "time": "2020-06-06T08:46:27+00:00" + }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.17.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "6e4dbcf5e81eba86e36731f94fe56b1726835846" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/6e4dbcf5e81eba86e36731f94fe56b1726835846", + "reference": "6e4dbcf5e81eba86e36731f94fe56b1726835846", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.17-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "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 intl's grapheme_* functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "grapheme", + "intl", + "polyfill", + "portable", + "shim" + ], + "time": "2020-06-06T08:46:27+00:00" + }, + { + "name": "symfony/polyfill-intl-idn", + "version": "v1.17.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-idn.git", + "reference": "a57f8161502549a742a63c09f0a604997bf47027" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/a57f8161502549a742a63c09f0a604997bf47027", + "reference": "a57f8161502549a742a63c09f0a604997bf47027", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "symfony/polyfill-mbstring": "^1.3", + "symfony/polyfill-php72": "^1.10" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.17-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Intl\\Idn\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Laurent Bassin", + "email": "laurent@bassin.info" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "idn", + "intl", + "polyfill", + "portable", + "shim" + ], + "time": "2020-06-06T08:46:27+00:00" + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.17.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "40309d1700e8f72447bb9e7b54af756eeea35620" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/40309d1700e8f72447bb9e7b54af756eeea35620", + "reference": "40309d1700e8f72447bb9e7b54af756eeea35620", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.17-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] + }, + "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 intl's Normalizer class and related functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "intl", + "normalizer", + "polyfill", + "portable", + "shim" + ], + "time": "2020-06-14T14:40:37+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.17.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "7110338d81ce1cbc3e273136e4574663627037a7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/7110338d81ce1cbc3e273136e4574663627037a7", + "reference": "7110338d81ce1cbc3e273136e4574663627037a7", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.17-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "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 Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "time": "2020-06-06T08:46:27+00:00" + }, + { + "name": "symfony/polyfill-php72", + "version": "v1.17.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php72.git", + "reference": "f048e612a3905f34931127360bdd2def19a5e582" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/f048e612a3905f34931127360bdd2def19a5e582", + "reference": "f048e612a3905f34931127360bdd2def19a5e582", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.17-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php72\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "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 backporting some PHP 7.2+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "time": "2020-05-12T16:47:27+00:00" + }, + { + "name": "symfony/polyfill-php73", + "version": "v1.17.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php73.git", + "reference": "fa0837fe02d617d31fbb25f990655861bb27bd1a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/fa0837fe02d617d31fbb25f990655861bb27bd1a", + "reference": "fa0837fe02d617d31fbb25f990655861bb27bd1a", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.17-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php73\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] + }, + "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 backporting some PHP 7.3+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "time": "2020-06-06T08:46:27+00:00" + }, + { + "name": "symfony/polyfill-php80", + "version": "v1.17.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "4a5b6bba3259902e386eb80dd1956181ee90b5b2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/4a5b6bba3259902e386eb80dd1956181ee90b5b2", + "reference": "4a5b6bba3259902e386eb80dd1956181ee90b5b2", + "shasum": "" + }, + "require": { + "php": ">=7.0.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.17-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "time": "2020-06-06T08:46:27+00:00" + }, + { + "name": "symfony/process", + "version": "v5.1.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "7f6378c1fa2147eeb1b4c385856ce9de0d46ebd1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/7f6378c1fa2147eeb1b4c385856ce9de0d46ebd1", + "reference": "7f6378c1fa2147eeb1b4c385856ce9de0d46ebd1", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-php80": "^1.15" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "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": "Symfony Process Component", + "homepage": "https://symfony.com", + "time": "2020-05-30T20:35:19+00:00" + }, + { + "name": "symfony/routing", + "version": "v5.1.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/routing.git", + "reference": "bbd0ba121d623f66d165a55a108008968911f3eb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/routing/zipball/bbd0ba121d623f66d165a55a108008968911f3eb", + "reference": "bbd0ba121d623f66d165a55a108008968911f3eb", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-php80": "^1.15" + }, + "conflict": { + "symfony/config": "<5.0", + "symfony/dependency-injection": "<4.4", + "symfony/yaml": "<4.4" + }, + "require-dev": { + "doctrine/annotations": "~1.2", + "psr/log": "~1.0", + "symfony/config": "^5.0", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/expression-language": "^4.4|^5.0", + "symfony/http-foundation": "^4.4|^5.0", + "symfony/yaml": "^4.4|^5.0" + }, + "suggest": { + "doctrine/annotations": "For using the annotation loader", + "symfony/config": "For using the all-in-one router or any loader", + "symfony/expression-language": "For using expression matching", + "symfony/http-foundation": "For using a Symfony Request object", + "symfony/yaml": "For using the YAML loader" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Routing\\": "" + }, + "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": "Symfony Routing Component", + "homepage": "https://symfony.com", + "keywords": [ + "router", + "routing", + "uri", + "url" + ], + "time": "2020-06-10T11:49:58+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "v2.1.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "66a8f0957a3ca54e4f724e49028ab19d75a8918b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/66a8f0957a3ca54e4f724e49028ab19d75a8918b", + "reference": "66a8f0957a3ca54e4f724e49028ab19d75a8918b", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/container": "^1.0" + }, + "suggest": { + "symfony/service-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + } + }, + "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": "Generic abstractions related to writing services", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "time": "2020-05-20T17:43:50+00:00" + }, + { + "name": "symfony/string", + "version": "v5.1.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "ac70459db781108db7c6d8981dd31ce0e29e3298" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/ac70459db781108db7c6d8981dd31ce0e29e3298", + "reference": "ac70459db781108db7c6d8981dd31ce0e29e3298", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.0", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "~1.15" + }, + "require-dev": { + "symfony/error-handler": "^4.4|^5.0", + "symfony/http-client": "^4.4|^5.0", + "symfony/translation-contracts": "^1.1|^2", + "symfony/var-exporter": "^4.4|^5.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\String\\": "" + }, + "files": [ + "Resources/functions.php" + ], + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "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 String component", + "homepage": "https://symfony.com", + "keywords": [ + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" + ], + "time": "2020-06-11T12:16:36+00:00" + }, + { + "name": "symfony/translation", + "version": "v5.1.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation.git", + "reference": "d387f07d4c15f9c09439cf3f13ddbe0b2c5e8be2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation/zipball/d387f07d4c15f9c09439cf3f13ddbe0b2c5e8be2", + "reference": "d387f07d4c15f9c09439cf3f13ddbe0b2c5e8be2", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "^1.15", + "symfony/translation-contracts": "^2" + }, + "conflict": { + "symfony/config": "<4.4", + "symfony/dependency-injection": "<5.0", + "symfony/http-kernel": "<5.0", + "symfony/twig-bundle": "<5.0", + "symfony/yaml": "<4.4" + }, + "provide": { + "symfony/translation-implementation": "2.0" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/config": "^4.4|^5.0", + "symfony/console": "^4.4|^5.0", + "symfony/dependency-injection": "^5.0", + "symfony/finder": "^4.4|^5.0", + "symfony/http-kernel": "^5.0", + "symfony/intl": "^4.4|^5.0", + "symfony/service-contracts": "^1.1.2|^2", + "symfony/yaml": "^4.4|^5.0" + }, + "suggest": { + "psr/log-implementation": "To use logging capability in translator", + "symfony/config": "", + "symfony/yaml": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Translation\\": "" + }, + "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": "Symfony Translation Component", + "homepage": "https://symfony.com", + "time": "2020-05-30T20:35:19+00:00" + }, + { + "name": "symfony/translation-contracts", + "version": "v2.1.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation-contracts.git", + "reference": "e5ca07c8f817f865f618aa072c2fe8e0e637340e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/e5ca07c8f817f865f618aa072c2fe8e0e637340e", + "reference": "e5ca07c8f817f865f618aa072c2fe8e0e637340e", + "shasum": "" + }, + "require": { + "php": ">=7.2.5" + }, + "suggest": { + "symfony/translation-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Translation\\": "" + } + }, + "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": "Generic abstractions related to translation", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "time": "2020-05-20T17:43:50+00:00" + }, + { + "name": "symfony/var-dumper", + "version": "v5.1.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-dumper.git", + "reference": "46a942903059b0b05e601f00eb64179e05578c0f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/46a942903059b0b05e601f00eb64179e05578c0f", + "reference": "46a942903059b0b05e601f00eb64179e05578c0f", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "^1.15" + }, + "conflict": { + "phpunit/phpunit": "<5.4.3", + "symfony/console": "<4.4" + }, + "require-dev": { + "ext-iconv": "*", + "symfony/console": "^4.4|^5.0", + "symfony/process": "^4.4|^5.0", + "twig/twig": "^2.4|^3.0" + }, + "suggest": { + "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).", + "ext-intl": "To show region name in time zone dump", + "symfony/console": "To use the ServerDumpCommand and/or the bin/var-dump-server script" + }, + "bin": [ + "Resources/bin/var-dump-server" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "autoload": { + "files": [ + "Resources/functions/dump.php" + ], + "psr-4": { + "Symfony\\Component\\VarDumper\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "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 mechanism for exploring and dumping PHP variables", + "homepage": "https://symfony.com", + "keywords": [ + "debug", + "dump" + ], + "time": "2020-05-30T20:35:19+00:00" + }, + { + "name": "tijsverkoyen/css-to-inline-styles", + "version": "2.2.2", + "source": { + "type": "git", + "url": "https://github.com/tijsverkoyen/CssToInlineStyles.git", + "reference": "dda2ee426acd6d801d5b7fd1001cde9b5f790e15" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/tijsverkoyen/CssToInlineStyles/zipball/dda2ee426acd6d801d5b7fd1001cde9b5f790e15", + "reference": "dda2ee426acd6d801d5b7fd1001cde9b5f790e15", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "php": "^5.5 || ^7.0", + "symfony/css-selector": "^2.7 || ^3.0 || ^4.0 || ^5.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2.x-dev" + } + }, + "autoload": { + "psr-4": { + "TijsVerkoyen\\CssToInlineStyles\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Tijs Verkoyen", + "email": "css_to_inline_styles@verkoyen.eu", + "role": "Developer" + } + ], + "description": "CssToInlineStyles is a class that enables you to convert HTML-pages/files into HTML-pages/files with inline styles. This is very useful when you're sending emails.", + "homepage": "https://github.com/tijsverkoyen/CssToInlineStyles", + "time": "2019-10-24T08:53:34+00:00" + }, + { + "name": "venturecraft/revisionable", + "version": "1.34.0", + "source": { + "type": "git", + "url": "https://github.com/VentureCraft/revisionable.git", + "reference": "151336f0cd51921a00a1ac249afdbcbedb3bc8b3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/VentureCraft/revisionable/zipball/151336f0cd51921a00a1ac249afdbcbedb3bc8b3", + "reference": "151336f0cd51921a00a1ac249afdbcbedb3bc8b3", + "shasum": "" + }, + "require": { + "illuminate/support": "~4.0|~5.0|~5.1|^6.0|^7.0", + "laravel/framework": "~5.4|^6.0|^7.0", + "php": ">=5.4.0" + }, + "require-dev": { + "orchestra/testbench": "~3.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Venturecraft\\Revisionable\\RevisionableServiceProvider" + ] + } + }, + "autoload": { + "classmap": [ + "src/migrations" + ], + "psr-0": { + "Venturecraft\\Revisionable": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Chris Duell", + "email": "me@chrisduell.com" + } + ], + "description": "Keep a revision history for your models without thinking, created as a package for use with Laravel", + "homepage": "http://github.com/venturecraft/revisionable", + "keywords": [ + "Audit", + "ardent", + "history", + "laravel", + "model", + "revision" + ], + "time": "2020-03-03T22:35:12+00:00" + }, + { + "name": "vlucas/phpdotenv", + "version": "v4.1.7", + "source": { + "type": "git", + "url": "https://github.com/vlucas/phpdotenv.git", + "reference": "db63b2ea280fdcf13c4ca392121b0b2450b51193" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/db63b2ea280fdcf13c4ca392121b0b2450b51193", + "reference": "db63b2ea280fdcf13c4ca392121b0b2450b51193", + "shasum": "" + }, + "require": { + "php": "^5.5.9 || ^7.0 || ^8.0", + "phpoption/phpoption": "^1.7.3", + "symfony/polyfill-ctype": "^1.16" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4.1", + "ext-filter": "*", + "ext-pcre": "*", + "phpunit/phpunit": "^4.8.35 || ^5.7.27 || ^6.5.6 || ^7.0" + }, + "suggest": { + "ext-filter": "Required to use the boolean validator.", + "ext-pcre": "Required to use most of the library." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.1-dev" + } + }, + "autoload": { + "psr-4": { + "Dotenv\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "graham@alt-three.com", + "homepage": "https://gjcampbell.co.uk/" + }, + { + "name": "Vance Lucas", + "email": "vance@vancelucas.com", + "homepage": "https://vancelucas.com/" + } + ], + "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.", + "keywords": [ + "dotenv", + "env", + "environment" + ], + "time": "2020-06-07T18:25:35+00:00" + }, + { + "name": "voku/portable-ascii", + "version": "1.5.2", + "source": { + "type": "git", + "url": "https://github.com/voku/portable-ascii.git", + "reference": "618631dc601d8eb6ea0a9fbf654ec82f066c4e97" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/voku/portable-ascii/zipball/618631dc601d8eb6ea0a9fbf654ec82f066c4e97", + "reference": "618631dc601d8eb6ea0a9fbf654ec82f066c4e97", + "shasum": "" + }, + "require": { + "php": ">=7.0.0" + }, + "require-dev": { + "phpunit/phpunit": "~6.0 || ~7.0" + }, + "suggest": { + "ext-intl": "Use Intl for transliterator_transliterate() support" + }, + "type": "library", + "autoload": { + "psr-4": { + "voku\\": "src/voku/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Lars Moelleken", + "homepage": "http://www.moelleken.org/" + } + ], + "description": "Portable ASCII library - performance optimized (ascii) string functions for php.", + "homepage": "https://github.com/voku/portable-ascii", + "keywords": [ + "ascii", + "clean", + "php" + ], + "time": "2020-06-15T23:49:30+00:00" + } + ], + "packages-dev": [ + { + "name": "barryvdh/laravel-debugbar", + "version": "v3.3.3", + "source": { + "type": "git", + "url": "https://github.com/barryvdh/laravel-debugbar.git", + "reference": "57f2219f6d9efe41ed1bc880d86701c52f261bf5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/57f2219f6d9efe41ed1bc880d86701c52f261bf5", + "reference": "57f2219f6d9efe41ed1bc880d86701c52f261bf5", + "shasum": "" + }, + "require": { + "illuminate/routing": "^5.5|^6|^7", + "illuminate/session": "^5.5|^6|^7", + "illuminate/support": "^5.5|^6|^7", + "maximebf/debugbar": "^1.15.1", + "php": ">=7.0", + "symfony/debug": "^3|^4|^5", + "symfony/finder": "^3|^4|^5" + }, + "require-dev": { + "laravel/framework": "5.5.x" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.2-dev" + }, + "laravel": { + "providers": [ + "Barryvdh\\Debugbar\\ServiceProvider" + ], + "aliases": { + "Debugbar": "Barryvdh\\Debugbar\\Facade" + } + } + }, + "autoload": { + "psr-4": { + "Barryvdh\\Debugbar\\": "src/" + }, + "files": [ + "src/helpers.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Barry vd. Heuvel", + "email": "barryvdh@gmail.com" + } + ], + "description": "PHP Debugbar integration for Laravel", + "keywords": [ + "debug", + "debugbar", + "laravel", + "profiler", + "webprofiler" + ], + "time": "2020-05-05T10:53:32+00:00" + }, + { + "name": "barryvdh/laravel-ide-helper", + "version": "v2.7.0", + "source": { + "type": "git", + "url": "https://github.com/barryvdh/laravel-ide-helper.git", + "reference": "5f677edc14bdcfdcac36633e6eea71b2728a4dbc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/barryvdh/laravel-ide-helper/zipball/5f677edc14bdcfdcac36633e6eea71b2728a4dbc", + "reference": "5f677edc14bdcfdcac36633e6eea71b2728a4dbc", + "shasum": "" + }, + "require": { + "barryvdh/reflection-docblock": "^2.0.6", + "composer/composer": "^1.6", + "doctrine/dbal": "~2.3", + "illuminate/console": "^5.5|^6|^7", + "illuminate/filesystem": "^5.5|^6|^7", + "illuminate/support": "^5.5|^6|^7", + "php": ">=7.2" + }, + "require-dev": { + "illuminate/config": "^5.5|^6|^7", + "illuminate/view": "^5.5|^6|^7", + "mockery/mockery": "^1.3", + "orchestra/testbench": "^3|^4|^5", + "phpro/grumphp": "^0.17.1", + "squizlabs/php_codesniffer": "^3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.6-dev" + }, + "laravel": { + "providers": [ + "Barryvdh\\LaravelIdeHelper\\IdeHelperServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Barryvdh\\LaravelIdeHelper\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Barry vd. Heuvel", + "email": "barryvdh@gmail.com" + } + ], + "description": "Laravel IDE Helper, generates correct PHPDocs for all Facade classes, to improve auto-completion.", + "keywords": [ + "autocomplete", + "codeintel", + "helper", + "ide", + "laravel", + "netbeans", + "phpdoc", + "phpstorm", + "sublime" + ], + "time": "2020-04-22T09:57:26+00:00" + }, + { + "name": "barryvdh/reflection-docblock", + "version": "v2.0.6", + "source": { + "type": "git", + "url": "https://github.com/barryvdh/ReflectionDocBlock.git", + "reference": "6b69015d83d3daf9004a71a89f26e27d27ef6a16" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/barryvdh/ReflectionDocBlock/zipball/6b69015d83d3daf9004a71a89f26e27d27ef6a16", + "reference": "6b69015d83d3daf9004a71a89f26e27d27ef6a16", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.0,<4.5" + }, + "suggest": { + "dflydev/markdown": "~1.0", + "erusev/parsedown": "~1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-0": { + "Barryvdh": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "mike.vanriel@naenius.com" + } + ], + "time": "2018-12-13T10:34:14+00:00" + }, + { + "name": "composer/ca-bundle", + "version": "1.2.7", + "source": { + "type": "git", + "url": "https://github.com/composer/ca-bundle.git", + "reference": "95c63ab2117a72f48f5a55da9740a3273d45b7fd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/ca-bundle/zipball/95c63ab2117a72f48f5a55da9740a3273d45b7fd", + "reference": "95c63ab2117a72f48f5a55da9740a3273d45b7fd", + "shasum": "" + }, + "require": { + "ext-openssl": "*", + "ext-pcre": "*", + "php": "^5.3.2 || ^7.0 || ^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35 || ^5.7 || 6.5 - 8", + "psr/log": "^1.0", + "symfony/process": "^2.5 || ^3.0 || ^4.0 || ^5.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\CaBundle\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "Lets you find a path to the system CA bundle, and includes a fallback to the Mozilla CA bundle.", + "keywords": [ + "cabundle", + "cacert", + "certificate", + "ssl", + "tls" + ], + "time": "2020-04-08T08:27:21+00:00" + }, + { + "name": "composer/composer", + "version": "1.10.7", + "source": { + "type": "git", + "url": "https://github.com/composer/composer.git", + "reference": "956608ea4f7de9e58c53dfb019d85ae62b193c39" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/composer/zipball/956608ea4f7de9e58c53dfb019d85ae62b193c39", + "reference": "956608ea4f7de9e58c53dfb019d85ae62b193c39", + "shasum": "" + }, + "require": { + "composer/ca-bundle": "^1.0", + "composer/semver": "^1.0", + "composer/spdx-licenses": "^1.2", + "composer/xdebug-handler": "^1.1", + "justinrainbow/json-schema": "^5.2.10", + "php": "^5.3.2 || ^7.0", + "psr/log": "^1.0", + "seld/jsonlint": "^1.4", + "seld/phar-utils": "^1.0", + "symfony/console": "^2.7 || ^3.0 || ^4.0 || ^5.0", + "symfony/filesystem": "^2.7 || ^3.0 || ^4.0 || ^5.0", + "symfony/finder": "^2.7 || ^3.0 || ^4.0 || ^5.0", + "symfony/process": "^2.7 || ^3.0 || ^4.0 || ^5.0" + }, + "conflict": { + "symfony/console": "2.8.38", + "symfony/phpunit-bridge": "3.4.40" + }, + "require-dev": { + "phpspec/prophecy": "^1.10", + "symfony/phpunit-bridge": "^3.4" + }, + "suggest": { + "ext-openssl": "Enabling the openssl extension allows you to access https URLs for repositories and packages", + "ext-zip": "Enabling the zip extension allows you to unzip archives", + "ext-zlib": "Allow gzip compression of HTTP requests" + }, + "bin": [ + "bin/composer" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.10-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\": "src/Composer" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nils Adermann", + "email": "naderman@naderman.de", + "homepage": "http://www.naderman.de" + }, + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "Composer helps you declare, manage and install dependencies of PHP projects. It ensures you have the right stack everywhere.", + "homepage": "https://getcomposer.org/", + "keywords": [ + "autoload", + "dependency", + "package" + ], + "time": "2020-06-03T08:03:56+00:00" + }, + { + "name": "composer/spdx-licenses", + "version": "1.5.3", + "source": { + "type": "git", + "url": "https://github.com/composer/spdx-licenses.git", + "reference": "0c3e51e1880ca149682332770e25977c70cf9dae" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/0c3e51e1880ca149682332770e25977c70cf9dae", + "reference": "0c3e51e1880ca149682332770e25977c70cf9dae", + "shasum": "" + }, + "require": { + "php": "^5.3.2 || ^7.0 || ^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35 || ^5.7 || 6.5 - 7" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Spdx\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nils Adermann", + "email": "naderman@naderman.de", + "homepage": "http://www.naderman.de" + }, + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + }, + { + "name": "Rob Bast", + "email": "rob.bast@gmail.com", + "homepage": "http://robbast.nl" + } + ], + "description": "SPDX licenses list and validation library.", + "keywords": [ + "license", + "spdx", + "validator" + ], + "time": "2020-02-14T07:44:31+00:00" + }, + { + "name": "composer/xdebug-handler", + "version": "1.4.2", + "source": { + "type": "git", + "url": "https://github.com/composer/xdebug-handler.git", + "reference": "fa2aaf99e2087f013a14f7432c1cd2dd7d8f1f51" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/fa2aaf99e2087f013a14f7432c1cd2dd7d8f1f51", + "reference": "fa2aaf99e2087f013a14f7432c1cd2dd7d8f1f51", + "shasum": "" + }, + "require": { + "php": "^5.3.2 || ^7.0 || ^8.0", + "psr/log": "^1.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35 || ^5.7 || 6.5 - 8" + }, + "type": "library", + "autoload": { + "psr-4": { + "Composer\\XdebugHandler\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "John Stevenson", + "email": "john-stevenson@blueyonder.co.uk" + } + ], + "description": "Restarts a process without Xdebug.", + "keywords": [ + "Xdebug", + "performance" + ], + "time": "2020-06-04T11:16:35+00:00" + }, + { + "name": "dnoegel/php-xdg-base-dir", + "version": "v0.1.1", + "source": { + "type": "git", + "url": "https://github.com/dnoegel/php-xdg-base-dir.git", + "reference": "8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dnoegel/php-xdg-base-dir/zipball/8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd", + "reference": "8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd", + "shasum": "" + }, + "require": { + "php": ">=5.3.2" + }, + "require-dev": { + "phpunit/phpunit": "~7.0|~6.0|~5.0|~4.8.35" + }, + "type": "library", + "autoload": { + "psr-4": { + "XdgBaseDir\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "implementation of xdg base directory specification for php", + "time": "2019-12-04T15:06:13+00:00" + }, + { + "name": "doctrine/instantiator", + "version": "1.3.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/instantiator.git", + "reference": "f350df0268e904597e3bd9c4685c53e0e333feea" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/f350df0268e904597e3bd9c4685c53e0e333feea", + "reference": "f350df0268e904597e3bd9c4685c53e0e333feea", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^6.0", + "ext-pdo": "*", + "ext-phar": "*", + "phpbench/phpbench": "^0.13", + "phpstan/phpstan-phpunit": "^0.11", + "phpstan/phpstan-shim": "^0.11", + "phpunit/phpunit": "^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "homepage": "http://ocramius.github.com/" + } + ], + "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", + "homepage": "https://www.doctrine-project.org/projects/instantiator.html", + "keywords": [ + "constructor", + "instantiate" + ], + "time": "2020-05-29T17:27:14+00:00" + }, + { + "name": "facade/flare-client-php", + "version": "1.3.2", + "source": { + "type": "git", + "url": "https://github.com/facade/flare-client-php.git", + "reference": "db1e03426e7f9472c9ecd1092aff00f56aa6c004" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/facade/flare-client-php/zipball/db1e03426e7f9472c9ecd1092aff00f56aa6c004", + "reference": "db1e03426e7f9472c9ecd1092aff00f56aa6c004", + "shasum": "" + }, + "require": { + "facade/ignition-contracts": "~1.0", + "illuminate/pipeline": "^5.5|^6.0|^7.0", + "php": "^7.1", + "symfony/http-foundation": "^3.3|^4.1|^5.0", + "symfony/var-dumper": "^3.4|^4.0|^5.0" + }, + "require-dev": { + "larapack/dd": "^1.1", + "phpunit/phpunit": "^7.5.16", + "spatie/phpunit-snapshot-assertions": "^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "psr-4": { + "Facade\\FlareClient\\": "src" + }, + "files": [ + "src/helpers.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Send PHP errors to Flare", + "homepage": "https://github.com/facade/flare-client-php", + "keywords": [ + "exception", + "facade", + "flare", + "reporting" + ], + "time": "2020-03-02T15:52:04+00:00" + }, + { + "name": "facade/ignition", + "version": "2.0.7", + "source": { + "type": "git", + "url": "https://github.com/facade/ignition.git", + "reference": "e6bedc1e74507d584fbcb041ebe0f7f215109cf2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/facade/ignition/zipball/e6bedc1e74507d584fbcb041ebe0f7f215109cf2", + "reference": "e6bedc1e74507d584fbcb041ebe0f7f215109cf2", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-mbstring": "*", + "facade/flare-client-php": "^1.0", + "facade/ignition-contracts": "^1.0", + "filp/whoops": "^2.4", + "illuminate/support": "^7.0|^8.0", + "monolog/monolog": "^2.0", + "php": "^7.2.5", + "scrivo/highlight.php": "^9.15", + "symfony/console": "^5.0", + "symfony/var-dumper": "^5.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^2.14", + "mockery/mockery": "^1.3", + "orchestra/testbench": "5.0" + }, + "suggest": { + "laravel/telescope": "^3.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" + }, + "laravel": { + "providers": [ + "Facade\\Ignition\\IgnitionServiceProvider" + ], + "aliases": { + "Flare": "Facade\\Ignition\\Facades\\Flare" + } + } + }, + "autoload": { + "psr-4": { + "Facade\\Ignition\\": "src" + }, + "files": [ + "src/helpers.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A beautiful error page for Laravel applications.", + "homepage": "https://github.com/facade/ignition", + "keywords": [ + "error", + "flare", + "laravel", + "page" + ], + "time": "2020-06-08T09:14:08+00:00" + }, + { + "name": "facade/ignition-contracts", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/facade/ignition-contracts.git", + "reference": "f445db0fb86f48e205787b2592840dd9c80ded28" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/facade/ignition-contracts/zipball/f445db0fb86f48e205787b2592840dd9c80ded28", + "reference": "f445db0fb86f48e205787b2592840dd9c80ded28", + "shasum": "" + }, + "require": { + "php": "^7.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Facade\\IgnitionContracts\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://flareapp.io", + "role": "Developer" + } + ], + "description": "Solution contracts for Ignition", + "homepage": "https://github.com/facade/ignition-contracts", + "keywords": [ + "contracts", + "flare", + "ignition" + ], + "time": "2019-08-30T14:06:08+00:00" + }, + { + "name": "filp/whoops", + "version": "2.7.3", + "source": { + "type": "git", + "url": "https://github.com/filp/whoops.git", + "reference": "5d5fe9bb3d656b514d455645b3addc5f7ba7714d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/filp/whoops/zipball/5d5fe9bb3d656b514d455645b3addc5f7ba7714d", + "reference": "5d5fe9bb3d656b514d455645b3addc5f7ba7714d", + "shasum": "" + }, + "require": { + "php": "^5.5.9 || ^7.0", + "psr/log": "^1.0.1" + }, + "require-dev": { + "mockery/mockery": "^0.9 || ^1.0", + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0", + "symfony/var-dumper": "^2.6 || ^3.0 || ^4.0 || ^5.0" + }, + "suggest": { + "symfony/var-dumper": "Pretty print complex values better with var-dumper available", + "whoops/soap": "Formats errors as SOAP responses" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.6-dev" + } + }, + "autoload": { + "psr-4": { + "Whoops\\": "src/Whoops/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Filipe Dobreira", + "homepage": "https://github.com/filp", + "role": "Developer" + } + ], + "description": "php error handling for cool kids", + "homepage": "https://filp.github.io/whoops/", + "keywords": [ + "error", + "exception", + "handling", + "library", + "throwable", + "whoops" + ], + "time": "2020-06-14T09:00:00+00:00" + }, + { + "name": "fzaninotto/faker", + "version": "v1.9.1", + "source": { + "type": "git", + "url": "https://github.com/fzaninotto/Faker.git", + "reference": "fc10d778e4b84d5bd315dad194661e091d307c6f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/fzaninotto/Faker/zipball/fc10d778e4b84d5bd315dad194661e091d307c6f", + "reference": "fc10d778e4b84d5bd315dad194661e091d307c6f", + "shasum": "" + }, + "require": { + "php": "^5.3.3 || ^7.0" + }, + "require-dev": { + "ext-intl": "*", + "phpunit/phpunit": "^4.8.35 || ^5.7", + "squizlabs/php_codesniffer": "^2.9.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.9-dev" + } + }, + "autoload": { + "psr-4": { + "Faker\\": "src/Faker/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "François Zaninotto" + } + ], + "description": "Faker is a PHP library that generates fake data for you.", + "keywords": [ + "data", + "faker", + "fixtures" + ], + "time": "2019-12-12T13:22:17+00:00" + }, + { + "name": "hamcrest/hamcrest-php", + "version": "v2.0.0", + "source": { + "type": "git", + "url": "https://github.com/hamcrest/hamcrest-php.git", + "reference": "776503d3a8e85d4f9a1148614f95b7a608b046ad" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hamcrest/hamcrest-php/zipball/776503d3a8e85d4f9a1148614f95b7a608b046ad", + "reference": "776503d3a8e85d4f9a1148614f95b7a608b046ad", + "shasum": "" + }, + "require": { + "php": "^5.3|^7.0" + }, + "replace": { + "cordoval/hamcrest-php": "*", + "davedevelopment/hamcrest-php": "*", + "kodova/hamcrest-php": "*" + }, + "require-dev": { + "phpunit/php-file-iterator": "1.3.3", + "phpunit/phpunit": "~4.0", + "satooshi/php-coveralls": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "hamcrest" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD" + ], + "description": "This is the PHP port of Hamcrest Matchers", + "keywords": [ + "test" + ], + "time": "2016-01-20T08:20:44+00:00" + }, + { + "name": "justinrainbow/json-schema", + "version": "5.2.10", + "source": { + "type": "git", + "url": "https://github.com/justinrainbow/json-schema.git", + "reference": "2ba9c8c862ecd5510ed16c6340aa9f6eadb4f31b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/2ba9c8c862ecd5510ed16c6340aa9f6eadb4f31b", + "reference": "2ba9c8c862ecd5510ed16c6340aa9f6eadb4f31b", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "~2.2.20||~2.15.1", + "json-schema/json-schema-test-suite": "1.2.0", + "phpunit/phpunit": "^4.8.35" + }, + "bin": [ + "bin/validate-json" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "JsonSchema\\": "src/JsonSchema/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bruno Prieto Reis", + "email": "bruno.p.reis@gmail.com" + }, + { + "name": "Justin Rainbow", + "email": "justin.rainbow@gmail.com" + }, + { + "name": "Igor Wiedler", + "email": "igor@wiedler.ch" + }, + { + "name": "Robert Schönthal", + "email": "seroscho@googlemail.com" + } + ], + "description": "A library to validate a json schema.", + "homepage": "https://github.com/justinrainbow/json-schema", + "keywords": [ + "json", + "schema" + ], + "time": "2020-05-27T16:41:55+00:00" + }, + { + "name": "laravel/tinker", + "version": "v2.4.0", + "source": { + "type": "git", + "url": "https://github.com/laravel/tinker.git", + "reference": "cde90a7335a2130a4488beb68f4b2141869241db" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/tinker/zipball/cde90a7335a2130a4488beb68f4b2141869241db", + "reference": "cde90a7335a2130a4488beb68f4b2141869241db", + "shasum": "" + }, + "require": { + "illuminate/console": "^6.0|^7.0|^8.0", + "illuminate/contracts": "^6.0|^7.0|^8.0", + "illuminate/support": "^6.0|^7.0|^8.0", + "php": "^7.2", + "psy/psysh": "^0.10.3", + "symfony/var-dumper": "^4.3|^5.0" + }, + "require-dev": { + "mockery/mockery": "^1.3.1", + "phpunit/phpunit": "^8.4|^9.0" + }, + "suggest": { + "illuminate/database": "The Illuminate Database package (^6.0|^7.0|^8.0)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" + }, + "laravel": { + "providers": [ + "Laravel\\Tinker\\TinkerServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Laravel\\Tinker\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Powerful REPL for the Laravel framework.", + "keywords": [ + "REPL", + "Tinker", + "laravel", + "psysh" + ], + "time": "2020-04-07T15:01:31+00:00" + }, + { + "name": "maximebf/debugbar", + "version": "v1.16.3", + "source": { + "type": "git", + "url": "https://github.com/maximebf/php-debugbar.git", + "reference": "1a1605b8e9bacb34cc0c6278206d699772e1d372" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/maximebf/php-debugbar/zipball/1a1605b8e9bacb34cc0c6278206d699772e1d372", + "reference": "1a1605b8e9bacb34cc0c6278206d699772e1d372", + "shasum": "" + }, + "require": { + "php": "^7.1", + "psr/log": "^1.0", + "symfony/var-dumper": "^2.6|^3|^4|^5" + }, + "require-dev": { + "phpunit/phpunit": "^5" + }, + "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.16-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" + ], + "time": "2020-05-06T07:06:27+00:00" + }, + { + "name": "mockery/mockery", + "version": "1.3.1", + "source": { + "type": "git", + "url": "https://github.com/mockery/mockery.git", + "reference": "f69bbde7d7a75d6b2862d9ca8fab1cd28014b4be" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/mockery/mockery/zipball/f69bbde7d7a75d6b2862d9ca8fab1cd28014b4be", + "reference": "f69bbde7d7a75d6b2862d9ca8fab1cd28014b4be", + "shasum": "" + }, + "require": { + "hamcrest/hamcrest-php": "~2.0", + "lib-pcre": ">=7.0", + "php": ">=5.6.0" + }, + "require-dev": { + "phpunit/phpunit": "~5.7.10|~6.5|~7.0|~8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.3.x-dev" + } + }, + "autoload": { + "psr-0": { + "Mockery": "library/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Pádraic Brady", + "email": "padraic.brady@gmail.com", + "homepage": "http://blog.astrumfutura.com" + }, + { + "name": "Dave Marshall", + "email": "dave.marshall@atstsolutions.co.uk", + "homepage": "http://davedevelopment.co.uk" + } + ], + "description": "Mockery is a simple yet flexible PHP mock object framework", + "homepage": "https://github.com/mockery/mockery", + "keywords": [ + "BDD", + "TDD", + "library", + "mock", + "mock objects", + "mockery", + "stub", + "test", + "test double", + "testing" + ], + "time": "2019-12-26T09:49:15+00:00" + }, + { + "name": "myclabs/deep-copy", + "version": "1.9.5", + "source": { + "type": "git", + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "b2c28789e80a97badd14145fda39b545d83ca3ef" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/b2c28789e80a97badd14145fda39b545d83ca3ef", + "reference": "b2c28789e80a97badd14145fda39b545d83ca3ef", + "shasum": "" + }, + "require": { + "php": "^7.1" + }, + "replace": { + "myclabs/deep-copy": "self.version" + }, + "require-dev": { + "doctrine/collections": "^1.0", + "doctrine/common": "^2.6", + "phpunit/phpunit": "^7.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "DeepCopy\\": "src/DeepCopy/" + }, + "files": [ + "src/DeepCopy/deep_copy.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Create deep copies (clones) of your objects", + "keywords": [ + "clone", + "copy", + "duplicate", + "object", + "object graph" + ], + "time": "2020-01-17T21:11:47+00:00" + }, + { + "name": "nikic/php-parser", + "version": "v4.5.0", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "53c2753d756f5adb586dca79c2ec0e2654dd9463" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/53c2753d756f5adb586dca79c2ec0e2654dd9463", + "reference": "53c2753d756f5adb586dca79c2ec0e2654dd9463", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": ">=7.0" + }, + "require-dev": { + "ircmaxell/php-yacc": "0.0.5", + "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0" + }, + "bin": [ + "bin/php-parse" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.3-dev" + } + }, + "autoload": { + "psr-4": { + "PhpParser\\": "lib/PhpParser" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Nikita Popov" + } + ], + "description": "A PHP parser written in PHP", + "keywords": [ + "parser", + "php" + ], + "time": "2020-06-03T07:24:19+00:00" + }, + { + "name": "nunomaduro/collision", + "version": "v4.2.0", + "source": { + "type": "git", + "url": "https://github.com/nunomaduro/collision.git", + "reference": "d50490417eded97be300a92cd7df7badc37a9018" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nunomaduro/collision/zipball/d50490417eded97be300a92cd7df7badc37a9018", + "reference": "d50490417eded97be300a92cd7df7badc37a9018", + "shasum": "" + }, + "require": { + "facade/ignition-contracts": "^1.0", + "filp/whoops": "^2.4", + "php": "^7.2.5", + "symfony/console": "^5.0" + }, + "require-dev": { + "facade/ignition": "^2.0", + "fideloper/proxy": "^4.2", + "friendsofphp/php-cs-fixer": "^2.16", + "fruitcake/laravel-cors": "^1.0", + "laravel/framework": "^7.0", + "laravel/tinker": "^2.0", + "nunomaduro/larastan": "^0.5", + "orchestra/testbench": "^5.0", + "phpstan/phpstan": "^0.12.3", + "phpunit/phpunit": "^8.5.1 || ^9.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "NunoMaduro\\Collision\\Adapters\\Laravel\\CollisionServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "NunoMaduro\\Collision\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "Cli error handling for console/command-line PHP applications.", + "keywords": [ + "artisan", + "cli", + "command-line", + "console", + "error", + "handling", + "laravel", + "laravel-zero", + "php", + "symfony" + ], + "time": "2020-04-04T19:56:08+00:00" + }, + { + "name": "phar-io/manifest", + "version": "1.0.3", + "source": { + "type": "git", + "url": "https://github.com/phar-io/manifest.git", + "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/7761fcacf03b4d4f16e7ccb606d4879ca431fcf4", + "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-phar": "*", + "phar-io/version": "^2.0", + "php": "^5.6 || ^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", + "time": "2018-07-08T19:23:20+00:00" + }, + { + "name": "phar-io/version", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/phar-io/version.git", + "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/version/zipball/45a2ec53a73c70ce41d55cedef9063630abaf1b6", + "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6", + "shasum": "" + }, + "require": { + "php": "^5.6 || ^7.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Library for handling version information and constraints", + "time": "2018-07-08T19:19:57+00:00" + }, + { + "name": "phpdocumentor/reflection-common", + "version": "2.1.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionCommon.git", + "reference": "6568f4687e5b41b054365f9ae03fcb1ed5f2069b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/6568f4687e5b41b054365f9ae03fcb1ed5f2069b", + "reference": "6568f4687e5b41b054365f9ae03fcb1ed5f2069b", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jaap van Otterdijk", + "email": "opensource@ijaap.nl" + } + ], + "description": "Common reflection classes used by phpdocumentor to reflect the code structure", + "homepage": "http://www.phpdoc.org", + "keywords": [ + "FQSEN", + "phpDocumentor", + "phpdoc", + "reflection", + "static analysis" + ], + "time": "2020-04-27T09:25:28+00:00" + }, + { + "name": "phpdocumentor/reflection-docblock", + "version": "5.1.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", + "reference": "cd72d394ca794d3466a3b2fc09d5a6c1dc86b47e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/cd72d394ca794d3466a3b2fc09d5a6c1dc86b47e", + "reference": "cd72d394ca794d3466a3b2fc09d5a6c1dc86b47e", + "shasum": "" + }, + "require": { + "ext-filter": "^7.1", + "php": "^7.2", + "phpdocumentor/reflection-common": "^2.0", + "phpdocumentor/type-resolver": "^1.0", + "webmozart/assert": "^1" + }, + "require-dev": { + "doctrine/instantiator": "^1", + "mockery/mockery": "^1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + }, + { + "name": "Jaap van Otterdijk", + "email": "account@ijaap.nl" + } + ], + "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", + "time": "2020-02-22T12:28:44+00:00" + }, + { + "name": "phpdocumentor/type-resolver", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/TypeResolver.git", + "reference": "30441f2752e493c639526b215ed81d54f369d693" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/30441f2752e493c639526b215ed81d54f369d693", + "reference": "30441f2752e493c639526b215ed81d54f369d693", + "shasum": "" + }, + "require": { + "php": "^7.2", + "phpdocumentor/reflection-common": "^2.0" + }, + "require-dev": { + "ext-tokenizer": "^7.2", + "mockery/mockery": "~1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-1.x": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + } + ], + "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", + "time": "2020-06-19T20:22:09+00:00" + }, + { + "name": "phpspec/prophecy", + "version": "v1.10.3", + "source": { + "type": "git", + "url": "https://github.com/phpspec/prophecy.git", + "reference": "451c3cd1418cf640de218914901e51b064abb093" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpspec/prophecy/zipball/451c3cd1418cf640de218914901e51b064abb093", + "reference": "451c3cd1418cf640de218914901e51b064abb093", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "^1.0.2", + "php": "^5.3|^7.0", + "phpdocumentor/reflection-docblock": "^2.0|^3.0.2|^4.0|^5.0", + "sebastian/comparator": "^1.2.3|^2.0|^3.0|^4.0", + "sebastian/recursion-context": "^1.0|^2.0|^3.0|^4.0" + }, + "require-dev": { + "phpspec/phpspec": "^2.5 || ^3.2", + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5 || ^7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.10.x-dev" + } + }, + "autoload": { + "psr-4": { + "Prophecy\\": "src/Prophecy" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Konstantin Kudryashov", + "email": "ever.zet@gmail.com", + "homepage": "http://everzet.com" + }, + { + "name": "Marcello Duarte", + "email": "marcello.duarte@gmail.com" + } + ], + "description": "Highly opinionated mocking framework for PHP 5.3+", + "homepage": "https://github.com/phpspec/prophecy", + "keywords": [ + "Double", + "Dummy", + "fake", + "mock", + "spy", + "stub" + ], + "time": "2020-03-05T15:02:03+00:00" + }, + { + "name": "phpunit/php-code-coverage", + "version": "7.0.10", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "f1884187926fbb755a9aaf0b3836ad3165b478bf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/f1884187926fbb755a9aaf0b3836ad3165b478bf", + "reference": "f1884187926fbb755a9aaf0b3836ad3165b478bf", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-xmlwriter": "*", + "php": "^7.2", + "phpunit/php-file-iterator": "^2.0.2", + "phpunit/php-text-template": "^1.2.1", + "phpunit/php-token-stream": "^3.1.1", + "sebastian/code-unit-reverse-lookup": "^1.0.1", + "sebastian/environment": "^4.2.2", + "sebastian/version": "^2.0.1", + "theseer/tokenizer": "^1.1.3" + }, + "require-dev": { + "phpunit/phpunit": "^8.2.2" + }, + "suggest": { + "ext-xdebug": "^2.7.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "7.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", + "homepage": "https://github.com/sebastianbergmann/php-code-coverage", + "keywords": [ + "coverage", + "testing", + "xunit" + ], + "time": "2019-11-20T13:55:58+00:00" + }, + { + "name": "phpunit/php-file-iterator", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "050bedf145a257b1ff02746c31894800e5122946" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/050bedf145a257b1ff02746c31894800e5122946", + "reference": "050bedf145a257b1ff02746c31894800e5122946", + "shasum": "" + }, + "require": { + "php": "^7.1" + }, + "require-dev": { + "phpunit/phpunit": "^7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "FilterIterator implementation that filters files based on a list of suffixes.", + "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", + "keywords": [ + "filesystem", + "iterator" + ], + "time": "2018-09-13T20:33:42+00:00" + }, + { + "name": "phpunit/php-text-template", + "version": "1.2.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686", + "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "keywords": [ + "template" + ], + "time": "2015-06-21T13:50:34+00:00" + }, + { + "name": "phpunit/php-timer", + "version": "2.1.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "1038454804406b0b5f5f520358e78c1c2f71501e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/1038454804406b0b5f5f520358e78c1c2f71501e", + "reference": "1038454804406b0b5f5f520358e78c1c2f71501e", + "shasum": "" + }, + "require": { + "php": "^7.1" + }, + "require-dev": { + "phpunit/phpunit": "^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", + "keywords": [ + "timer" + ], + "time": "2019-06-07T04:22:29+00:00" + }, + { + "name": "phpunit/php-token-stream", + "version": "3.1.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-token-stream.git", + "reference": "995192df77f63a59e47f025390d2d1fdf8f425ff" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/995192df77f63a59e47f025390d2d1fdf8f425ff", + "reference": "995192df77f63a59e47f025390d2d1fdf8f425ff", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": "^7.1" + }, + "require-dev": { + "phpunit/phpunit": "^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Wrapper around PHP's tokenizer extension.", + "homepage": "https://github.com/sebastianbergmann/php-token-stream/", + "keywords": [ + "tokenizer" + ], + "time": "2019-09-17T06:23:10+00:00" + }, + { + "name": "phpunit/phpunit", + "version": "8.5.8", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "34c18baa6a44f1d1fbf0338907139e9dce95b997" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/34c18baa6a44f1d1fbf0338907139e9dce95b997", + "reference": "34c18baa6a44f1d1fbf0338907139e9dce95b997", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "^1.2.0", + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-xml": "*", + "ext-xmlwriter": "*", + "myclabs/deep-copy": "^1.9.1", + "phar-io/manifest": "^1.0.3", + "phar-io/version": "^2.0.1", + "php": "^7.2", + "phpspec/prophecy": "^1.8.1", + "phpunit/php-code-coverage": "^7.0.7", + "phpunit/php-file-iterator": "^2.0.2", + "phpunit/php-text-template": "^1.2.1", + "phpunit/php-timer": "^2.1.2", + "sebastian/comparator": "^3.0.2", + "sebastian/diff": "^3.0.2", + "sebastian/environment": "^4.2.2", + "sebastian/exporter": "^3.1.1", + "sebastian/global-state": "^3.0.0", + "sebastian/object-enumerator": "^3.0.3", + "sebastian/resource-operations": "^2.0.1", + "sebastian/type": "^1.1.3", + "sebastian/version": "^2.0.1" + }, + "require-dev": { + "ext-pdo": "*" + }, + "suggest": { + "ext-soap": "*", + "ext-xdebug": "*", + "phpunit/php-invoker": "^2.0.0" + }, + "bin": [ + "phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "8.5-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "The PHP Unit Testing framework.", + "homepage": "https://phpunit.de/", + "keywords": [ + "phpunit", + "testing", + "xunit" + ], + "time": "2020-06-22T07:06:58+00:00" + }, + { + "name": "psy/psysh", + "version": "v0.10.4", + "source": { + "type": "git", + "url": "https://github.com/bobthecow/psysh.git", + "reference": "a8aec1b2981ab66882a01cce36a49b6317dc3560" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/a8aec1b2981ab66882a01cce36a49b6317dc3560", + "reference": "a8aec1b2981ab66882a01cce36a49b6317dc3560", + "shasum": "" + }, + "require": { + "dnoegel/php-xdg-base-dir": "0.1.*", + "ext-json": "*", + "ext-tokenizer": "*", + "nikic/php-parser": "~4.0|~3.0|~2.0|~1.3", + "php": "^8.0 || ^7.0 || ^5.5.9", + "symfony/console": "~5.0|~4.0|~3.0|^2.4.2|~2.3.10", + "symfony/var-dumper": "~5.0|~4.0|~3.0|~2.7" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.2", + "hoa/console": "3.17.*" + }, + "suggest": { + "ext-pcntl": "Enabling the PCNTL extension makes PsySH a lot happier :)", + "ext-pdo-sqlite": "The doc command requires SQLite to work.", + "ext-posix": "If you have PCNTL, you'll want the POSIX extension as well.", + "ext-readline": "Enables support for arrow-key history navigation, and showing and manipulating command history.", + "hoa/console": "A pure PHP readline implementation. You'll want this if your PHP install doesn't already support readline or libedit." + }, + "bin": [ + "bin/psysh" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "0.10.x-dev" + } + }, + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Psy\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Justin Hileman", + "email": "justin@justinhileman.info", + "homepage": "http://justinhileman.com" + } + ], + "description": "An interactive shell for modern PHP.", + "homepage": "http://psysh.org", + "keywords": [ + "REPL", + "console", + "interactive", + "shell" + ], + "time": "2020-05-03T19:32:03+00:00" + }, + { + "name": "roave/security-advisories", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/Roave/SecurityAdvisories.git", + "reference": "6d2e5ab854782830911ddd33b7d4649b9f18c10f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/6d2e5ab854782830911ddd33b7d4649b9f18c10f", + "reference": "6d2e5ab854782830911ddd33b7d4649b9f18c10f", + "shasum": "" + }, + "conflict": { + "3f/pygmentize": "<1.2", + "adodb/adodb-php": "<5.20.12", + "alterphp/easyadmin-extension-bundle": ">=1.2,<1.2.11|>=1.3,<1.3.1", + "amphp/artax": "<1.0.6|>=2,<2.0.6", + "amphp/http": "<1.0.1", + "amphp/http-client": ">=4,<4.4", + "api-platform/core": ">=2.2,<2.2.10|>=2.3,<2.3.6", + "asymmetricrypt/asymmetricrypt": ">=0,<9.9.99", + "aws/aws-sdk-php": ">=3,<3.2.1", + "bagisto/bagisto": "<0.1.5", + "barrelstrength/sprout-base-email": "<1.2.7", + "barrelstrength/sprout-forms": "<3.9", + "bolt/bolt": "<3.7.1", + "brightlocal/phpwhois": "<=4.2.5", + "buddypress/buddypress": "<5.1.2", + "bugsnag/bugsnag-laravel": ">=2,<2.0.2", + "cakephp/cakephp": ">=1.3,<1.3.18|>=2,<2.4.99|>=2.5,<2.5.99|>=2.6,<2.6.12|>=2.7,<2.7.6|>=3,<3.5.18|>=3.6,<3.6.15|>=3.7,<3.7.7", + "cart2quote/module-quotation": ">=4.1.6,<=4.4.5|>=5,<5.4.4", + "cartalyst/sentry": "<=2.1.6", + "centreon/centreon": "<18.10.8|>=19,<19.4.5", + "cesnet/simplesamlphp-module-proxystatistics": "<3.1", + "codeigniter/framework": "<=3.0.6", + "composer/composer": "<=1-alpha.11", + "contao-components/mediaelement": ">=2.14.2,<2.21.1", + "contao/core": ">=2,<3.5.39", + "contao/core-bundle": ">=4,<4.4.46|>=4.5,<4.8.6", + "contao/listing-bundle": ">=4,<4.4.8", + "datadog/dd-trace": ">=0.30,<0.30.2", + "david-garcia/phpwhois": "<=4.3.1", + "doctrine/annotations": ">=1,<1.2.7", + "doctrine/cache": ">=1,<1.3.2|>=1.4,<1.4.2", + "doctrine/common": ">=2,<2.4.3|>=2.5,<2.5.1", + "doctrine/dbal": ">=2,<2.0.8|>=2.1,<2.1.2", + "doctrine/doctrine-bundle": "<1.5.2", + "doctrine/doctrine-module": "<=0.7.1", + "doctrine/mongodb-odm": ">=1,<1.0.2", + "doctrine/mongodb-odm-bundle": ">=2,<3.0.1", + "doctrine/orm": ">=2,<2.4.8|>=2.5,<2.5.1", + "dolibarr/dolibarr": "<11.0.4", + "dompdf/dompdf": ">=0.6,<0.6.2", + "drupal/core": ">=7,<7.72|>=8,<8.8.8|>=8.9,<8.9.1|>=9,<9.0.1", + "drupal/drupal": ">=7,<7.72|>=8,<8.8.8|>=8.9,<8.9.1|>=9,<9.0.1", + "endroid/qr-code-bundle": "<3.4.2", + "enshrined/svg-sanitize": "<0.13.1", + "erusev/parsedown": "<1.7.2", + "ezsystems/demobundle": ">=5.4,<5.4.6.1", + "ezsystems/ezdemo-ls-extension": ">=5.4,<5.4.2.1", + "ezsystems/ezfind-ls": ">=5.3,<5.3.6.1|>=5.4,<5.4.11.1|>=2017.12,<2017.12.0.1", + "ezsystems/ezplatform": ">=1.7,<1.7.9.1|>=1.13,<1.13.5.1|>=2.5,<2.5.4", + "ezsystems/ezplatform-admin-ui": ">=1.3,<1.3.5|>=1.4,<1.4.6", + "ezsystems/ezplatform-admin-ui-assets": ">=4,<4.2", + "ezsystems/ezplatform-kernel": ">=1,<1.0.2.1", + "ezsystems/ezplatform-user": ">=1,<1.0.1", + "ezsystems/ezpublish-kernel": ">=5.3,<5.3.12.1|>=5.4,<5.4.14.2|>=6,<6.7.9.1|>=6.8,<6.13.6.3|>=7,<7.2.4.1|>=7.3,<7.3.2.1|>=7.5,<7.5.7.1", + "ezsystems/ezpublish-legacy": ">=5.3,<5.3.12.6|>=5.4,<5.4.14.1|>=2011,<2017.12.7.2|>=2018.6,<2018.6.1.4|>=2018.9,<2018.9.1.3|>=2019.3,<2019.3.4.2", + "ezsystems/repository-forms": ">=2.3,<2.3.2.1", + "ezyang/htmlpurifier": "<4.1.1", + "firebase/php-jwt": "<2", + "fooman/tcpdf": "<6.2.22", + "fossar/tcpdf-parser": "<6.2.22", + "friendsofsymfony/oauth2-php": "<1.3", + "friendsofsymfony/rest-bundle": ">=1.2,<1.2.2", + "friendsofsymfony/user-bundle": ">=1.2,<1.3.5", + "fuel/core": "<1.8.1", + "getgrav/grav": "<1.7-beta.8", + "gree/jose": "<=2.2", + "gregwar/rst": "<1.0.3", + "guzzlehttp/guzzle": ">=4-rc.2,<4.2.4|>=5,<5.3.1|>=6,<6.2.1", + "illuminate/auth": ">=4,<4.0.99|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.10", + "illuminate/cookie": ">=4,<=4.0.11|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.42|>=5.6,<5.6.30", + "illuminate/database": ">=4,<4.0.99|>=4.1,<4.1.29", + "illuminate/encryption": ">=4,<=4.0.11|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.40|>=5.6,<5.6.15", + "illuminate/view": ">=7,<7.1.2", + "ivankristianto/phpwhois": "<=4.3", + "james-heinrich/getid3": "<1.9.9", + "joomla/session": "<1.3.1", + "jsmitty12/phpwhois": "<5.1", + "kazist/phpwhois": "<=4.2.6", + "kreait/firebase-php": ">=3.2,<3.8.1", + "la-haute-societe/tcpdf": "<6.2.22", + "laravel/framework": ">=4,<4.0.99|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.42|>=5.6,<5.6.30|>=7,<7.1.2", + "laravel/socialite": ">=1,<1.0.99|>=2,<2.0.10", + "league/commonmark": "<0.18.3", + "librenms/librenms": "<1.53", + "magento/community-edition": ">=2,<2.2.10|>=2.3,<2.3.3", + "magento/magento1ce": "<1.9.4.3", + "magento/magento1ee": ">=1,<1.14.4.3", + "magento/product-community-edition": ">=2,<2.2.10|>=2.3,<2.3.2-p.2", + "monolog/monolog": ">=1.8,<1.12", + "namshi/jose": "<2.2", + "nzo/url-encryptor-bundle": ">=4,<4.3.2|>=5,<5.0.1", + "october/october": ">=1.0.319,<1.0.466", + "onelogin/php-saml": "<2.10.4", + "oneup/uploader-bundle": "<1.9.3|>=2,<2.1.5", + "openid/php-openid": "<2.3", + "oro/crm": ">=1.7,<1.7.4", + "oro/platform": ">=1.7,<1.7.4", + "padraic/humbug_get_contents": "<1.1.2", + "pagarme/pagarme-php": ">=0,<3", + "paragonie/random_compat": "<2", + "paypal/merchant-sdk-php": "<3.12", + "pear/archive_tar": "<1.4.4", + "phpfastcache/phpfastcache": ">=5,<5.0.13", + "phpmailer/phpmailer": "<6.1.6", + "phpmussel/phpmussel": ">=1,<1.6", + "phpmyadmin/phpmyadmin": "<4.9.2", + "phpoffice/phpexcel": "<1.8.2", + "phpoffice/phpspreadsheet": "<1.8", + "phpunit/phpunit": ">=4.8.19,<4.8.28|>=5.0.10,<5.6.3", + "phpwhois/phpwhois": "<=4.2.5", + "phpxmlrpc/extras": "<0.6.1", + "pimcore/pimcore": "<6.3", + "prestashop/autoupgrade": ">=4,<4.10.1", + "prestashop/gamification": "<2.3.2", + "prestashop/ps_facetedsearch": "<3.4.1", + "privatebin/privatebin": "<1.2.2|>=1.3,<1.3.2", + "propel/propel": ">=2-alpha.1,<=2-alpha.7", + "propel/propel1": ">=1,<=1.7.1", + "pusher/pusher-php-server": "<2.2.1", + "rainlab/debugbar-plugin": "<3.1", + "robrichards/xmlseclibs": "<3.0.4", + "sabre/dav": ">=1.6,<1.6.99|>=1.7,<1.7.11|>=1.8,<1.8.9", + "scheb/two-factor-bundle": ">=0,<3.26|>=4,<4.11", + "sensiolabs/connect": "<4.2.3", + "serluck/phpwhois": "<=4.2.6", + "shopware/shopware": "<5.3.7", + "silverstripe/admin": ">=1.0.3,<1.0.4|>=1.1,<1.1.1", + "silverstripe/assets": ">=1,<1.4.7|>=1.5,<1.5.2", + "silverstripe/cms": "<4.3.6|>=4.4,<4.4.4", + "silverstripe/comments": ">=1.3,<1.9.99|>=2,<2.9.99|>=3,<3.1.1", + "silverstripe/forum": "<=0.6.1|>=0.7,<=0.7.3", + "silverstripe/framework": "<4.4.5|>=4.5,<4.5.2", + "silverstripe/graphql": ">=2,<2.0.5|>=3,<3.1.2", + "silverstripe/registry": ">=2.1,<2.1.2|>=2.2,<2.2.1", + "silverstripe/restfulserver": ">=1,<1.0.9|>=2,<2.0.4", + "silverstripe/subsites": ">=2,<2.1.1", + "silverstripe/taxonomy": ">=1.3,<1.3.1|>=2,<2.0.1", + "silverstripe/userforms": "<3", + "simple-updates/phpwhois": "<=1", + "simplesamlphp/saml2": "<1.10.6|>=2,<2.3.8|>=3,<3.1.4", + "simplesamlphp/simplesamlphp": "<1.18.6", + "simplesamlphp/simplesamlphp-module-infocard": "<1.0.1", + "simplito/elliptic-php": "<1.0.6", + "slim/slim": "<2.6", + "smarty/smarty": "<3.1.33", + "socalnick/scn-social-auth": "<1.15.2", + "spoonity/tcpdf": "<6.2.22", + "squizlabs/php_codesniffer": ">=1,<2.8.1|>=3,<3.0.1", + "ssddanbrown/bookstack": "<0.29.2", + "stormpath/sdk": ">=0,<9.9.99", + "studio-42/elfinder": "<2.1.49", + "swiftmailer/swiftmailer": ">=4,<5.4.5", + "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,<1.1.19|>=1.2,<1.2.18|>=1.3,<1.3.13|>=1.4,<1.4.5|>=1.5,<1.5.1", + "sylius/resource-bundle": "<1.3.13|>=1.4,<1.4.6|>=1.5,<1.5.1|>=1.6,<1.6.3", + "sylius/sylius": "<1.3.16|>=1.4,<1.4.12|>=1.5,<1.5.9|>=1.6,<1.6.5", + "symbiote/silverstripe-multivaluefield": ">=3,<3.0.99", + "symbiote/silverstripe-versionedfiles": "<=2.0.3", + "symfony/cache": ">=3.1,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8", + "symfony/dependency-injection": ">=2,<2.0.17|>=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", + "symfony/error-handler": ">=4.4,<4.4.4|>=5,<5.0.4", + "symfony/form": ">=2.3,<2.3.35|>=2.4,<2.6.12|>=2.7,<2.7.50|>=2.8,<2.8.49|>=3,<3.4.20|>=4,<4.0.15|>=4.1,<4.1.9|>=4.2,<4.2.1", + "symfony/framework-bundle": ">=2,<2.3.18|>=2.4,<2.4.8|>=2.5,<2.5.2|>=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", + "symfony/http-foundation": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8|>=4.4,<4.4.7|>=5,<5.0.7", + "symfony/http-kernel": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8", + "symfony/intl": ">=2.7,<2.7.38|>=2.8,<2.8.31|>=3,<3.2.14|>=3.3,<3.3.13", + "symfony/mime": ">=4.3,<4.3.8", + "symfony/phpunit-bridge": ">=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", + "symfony/polyfill": ">=1,<1.10", + "symfony/polyfill-php55": ">=1,<1.10", + "symfony/proxy-manager-bridge": ">=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", + "symfony/routing": ">=2,<2.0.19", + "symfony/security": ">=2,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7|>=4.4,<4.4.7|>=5,<5.0.7", + "symfony/security-bundle": ">=2,<2.7.48|>=2.8,<2.8.41|>=3,<3.3.17|>=3.4,<3.4.11|>=4,<4.0.11", + "symfony/security-core": ">=2.4,<2.6.13|>=2.7,<2.7.9|>=2.7.30,<2.7.32|>=2.8,<2.8.37|>=3,<3.3.17|>=3.4,<3.4.7|>=4,<4.0.7", + "symfony/security-csrf": ">=2.4,<2.7.48|>=2.8,<2.8.41|>=3,<3.3.17|>=3.4,<3.4.11|>=4,<4.0.11", + "symfony/security-guard": ">=2.8,<2.8.41|>=3,<3.3.17|>=3.4,<3.4.11|>=4,<4.0.11", + "symfony/security-http": ">=2.3,<2.3.41|>=2.4,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.2.12|>=4.3,<4.3.8|>=4.4,<4.4.7|>=5,<5.0.7", + "symfony/serializer": ">=2,<2.0.11", + "symfony/symfony": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8|>=4.4,<4.4.7|>=5,<5.0.7", + "symfony/translation": ">=2,<2.0.17", + "symfony/validator": ">=2,<2.0.24|>=2.1,<2.1.12|>=2.2,<2.2.5|>=2.3,<2.3.3", + "symfony/var-exporter": ">=4.2,<4.2.12|>=4.3,<4.3.8", + "symfony/web-profiler-bundle": ">=2,<2.3.19|>=2.4,<2.4.9|>=2.5,<2.5.4", + "symfony/yaml": ">=2,<2.0.22|>=2.1,<2.1.7", + "t3g/svg-sanitizer": "<1.0.3", + "tecnickcom/tcpdf": "<6.2.22", + "thelia/backoffice-default-template": ">=2.1,<2.1.2", + "thelia/thelia": ">=2.1-beta.1,<2.1.3", + "theonedemon/phpwhois": "<=4.2.5", + "titon/framework": ">=0,<9.9.99", + "truckersmp/phpwhois": "<=4.3.1", + "twig/twig": "<1.38|>=2,<2.7", + "typo3/cms": ">=6.2,<6.2.30|>=7,<7.6.32|>=8,<8.7.30|>=9,<9.5.17|>=10,<10.4.2", + "typo3/cms-core": ">=8,<8.7.30|>=9,<9.5.17|>=10,<10.4.2", + "typo3/flow": ">=1,<1.0.4|>=1.1,<1.1.1|>=2,<2.0.1|>=2.3,<2.3.16|>=3,<3.0.10|>=3.1,<3.1.7|>=3.2,<3.2.7|>=3.3,<3.3.5", + "typo3/neos": ">=1.1,<1.1.3|>=1.2,<1.2.13|>=2,<2.0.4", + "typo3/phar-stream-wrapper": ">=1,<2.1.1|>=3,<3.1.1", + "ua-parser/uap-php": "<3.8", + "usmanhalalit/pixie": "<1.0.3|>=2,<2.0.2", + "verot/class.upload.php": "<=1.0.3|>=2,<=2.0.4", + "wallabag/tcpdf": "<6.2.22", + "willdurand/js-translation-bundle": "<2.1.1", + "yii2mod/yii2-cms": "<1.9.2", + "yiisoft/yii": ">=1.1.14,<1.1.15", + "yiisoft/yii2": "<2.0.15", + "yiisoft/yii2-bootstrap": "<2.0.4", + "yiisoft/yii2-dev": "<2.0.15", + "yiisoft/yii2-elasticsearch": "<2.0.5", + "yiisoft/yii2-gii": "<2.0.4", + "yiisoft/yii2-jui": "<2.0.4", + "yiisoft/yii2-redis": "<2.0.8", + "yourls/yourls": "<1.7.4", + "zendframework/zend-cache": ">=2.4,<2.4.8|>=2.5,<2.5.3", + "zendframework/zend-captcha": ">=2,<2.4.9|>=2.5,<2.5.2", + "zendframework/zend-crypt": ">=2,<2.4.9|>=2.5,<2.5.2", + "zendframework/zend-db": ">=2,<2.0.99|>=2.1,<2.1.99|>=2.2,<2.2.10|>=2.3,<2.3.5", + "zendframework/zend-developer-tools": ">=1.2.2,<1.2.3", + "zendframework/zend-diactoros": ">=1,<1.8.4", + "zendframework/zend-feed": ">=1,<2.10.3", + "zendframework/zend-form": ">=2,<2.2.7|>=2.3,<2.3.1", + "zendframework/zend-http": ">=1,<2.8.1", + "zendframework/zend-json": ">=2.1,<2.1.6|>=2.2,<2.2.6", + "zendframework/zend-ldap": ">=2,<2.0.99|>=2.1,<2.1.99|>=2.2,<2.2.8|>=2.3,<2.3.3", + "zendframework/zend-mail": ">=2,<2.4.11|>=2.5,<2.7.2", + "zendframework/zend-navigation": ">=2,<2.2.7|>=2.3,<2.3.1", + "zendframework/zend-session": ">=2,<2.0.99|>=2.1,<2.1.99|>=2.2,<2.2.9|>=2.3,<2.3.4", + "zendframework/zend-validator": ">=2.3,<2.3.6", + "zendframework/zend-view": ">=2,<2.2.7|>=2.3,<2.3.1", + "zendframework/zend-xmlrpc": ">=2.1,<2.1.6|>=2.2,<2.2.6", + "zendframework/zendframework": "<2.5.1", + "zendframework/zendframework1": "<1.12.20", + "zendframework/zendopenid": ">=2,<2.0.2", + "zendframework/zendxml": ">=1,<1.0.1", + "zetacomponents/mail": "<1.8.2", + "zf-commons/zfc-user": "<1.2.2", + "zfcampus/zf-apigility-doctrine": ">=1,<1.0.3", + "zfr/zfr-oauth2-server-module": "<0.1.2" + }, + "type": "metapackage", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "role": "maintainer" + }, + { + "name": "Ilya Tribusean", + "email": "slash3b@gmail.com", + "role": "maintainer" + } + ], + "description": "Prevents installation of composer packages with known security vulnerabilities: no API, simply require it", + "time": "2020-06-19T13:23:43+00:00" + }, + { + "name": "scrivo/highlight.php", + "version": "v9.18.1.1", + "source": { + "type": "git", + "url": "https://github.com/scrivo/highlight.php.git", + "reference": "52fc21c99fd888e33aed4879e55a3646f8d40558" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/scrivo/highlight.php/zipball/52fc21c99fd888e33aed4879e55a3646f8d40558", + "reference": "52fc21c99fd888e33aed4879e55a3646f8d40558", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-mbstring": "*", + "php": ">=5.4" + }, + "require-dev": { + "phpunit/phpunit": "^4.8|^5.7", + "sabberworm/php-css-parser": "^8.3", + "symfony/finder": "^2.8|^3.4", + "symfony/var-dumper": "^2.8|^3.4" + }, + "suggest": { + "ext-dom": "Needed to make use of the features in the utilities namespace" + }, + "type": "library", + "autoload": { + "psr-0": { + "Highlight\\": "", + "HighlightUtilities\\": "" + }, + "files": [ + "HighlightUtilities/functions.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Geert Bergman", + "homepage": "http://www.scrivo.org/", + "role": "Project Author" + }, + { + "name": "Vladimir Jimenez", + "homepage": "https://allejo.io", + "role": "Maintainer" + }, + { + "name": "Martin Folkers", + "homepage": "https://twobrain.io", + "role": "Contributor" + } + ], + "description": "Server side syntax highlighter that supports 185 languages. It's a PHP port of highlight.js", + "keywords": [ + "code", + "highlight", + "highlight.js", + "highlight.php", + "syntax" + ], + "time": "2020-03-02T05:59:21+00:00" + }, + { + "name": "sebastian/code-unit-reverse-lookup", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", + "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", + "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", + "shasum": "" + }, + "require": { + "php": "^5.6 || ^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^5.7 || ^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Looks up which function or method a line of code belongs to", + "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", + "time": "2017-03-04T06:30:41+00:00" + }, + { + "name": "sebastian/comparator", + "version": "3.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "5de4fc177adf9bce8df98d8d141a7559d7ccf6da" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/5de4fc177adf9bce8df98d8d141a7559d7ccf6da", + "reference": "5de4fc177adf9bce8df98d8d141a7559d7ccf6da", + "shasum": "" + }, + "require": { + "php": "^7.1", + "sebastian/diff": "^3.0", + "sebastian/exporter": "^3.1" + }, + "require-dev": { + "phpunit/phpunit": "^7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides the functionality to compare PHP values for equality", + "homepage": "https://github.com/sebastianbergmann/comparator", + "keywords": [ + "comparator", + "compare", + "equality" + ], + "time": "2018-07-12T15:12:46+00:00" + }, + { + "name": "sebastian/diff", + "version": "3.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "720fcc7e9b5cf384ea68d9d930d480907a0c1a29" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/720fcc7e9b5cf384ea68d9d930d480907a0c1a29", + "reference": "720fcc7e9b5cf384ea68d9d930d480907a0c1a29", + "shasum": "" + }, + "require": { + "php": "^7.1" + }, + "require-dev": { + "phpunit/phpunit": "^7.5 || ^8.0", + "symfony/process": "^2 || ^3.3 || ^4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Diff implementation", + "homepage": "https://github.com/sebastianbergmann/diff", + "keywords": [ + "diff", + "udiff", + "unidiff", + "unified diff" + ], + "time": "2019-02-04T06:01:07+00:00" + }, + { + "name": "sebastian/environment", + "version": "4.2.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "464c90d7bdf5ad4e8a6aea15c091fec0603d4368" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/464c90d7bdf5ad4e8a6aea15c091fec0603d4368", + "reference": "464c90d7bdf5ad4e8a6aea15c091fec0603d4368", + "shasum": "" + }, + "require": { + "php": "^7.1" + }, + "require-dev": { + "phpunit/phpunit": "^7.5" + }, + "suggest": { + "ext-posix": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.2-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides functionality to handle HHVM/PHP environments", + "homepage": "http://www.github.com/sebastianbergmann/environment", + "keywords": [ + "Xdebug", + "environment", + "hhvm" + ], + "time": "2019-11-20T08:46:58+00:00" + }, + { + "name": "sebastian/exporter", + "version": "3.1.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "68609e1261d215ea5b21b7987539cbfbe156ec3e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/68609e1261d215ea5b21b7987539cbfbe156ec3e", + "reference": "68609e1261d215ea5b21b7987539cbfbe156ec3e", + "shasum": "" + }, + "require": { + "php": "^7.0", + "sebastian/recursion-context": "^3.0" + }, + "require-dev": { + "ext-mbstring": "*", + "phpunit/phpunit": "^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Provides the functionality to export PHP variables for visualization", + "homepage": "http://www.github.com/sebastianbergmann/exporter", + "keywords": [ + "export", + "exporter" + ], + "time": "2019-09-14T09:02:43+00:00" + }, + { + "name": "sebastian/global-state", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "edf8a461cf1d4005f19fb0b6b8b95a9f7fa0adc4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/edf8a461cf1d4005f19fb0b6b8b95a9f7fa0adc4", + "reference": "edf8a461cf1d4005f19fb0b6b8b95a9f7fa0adc4", + "shasum": "" + }, + "require": { + "php": "^7.2", + "sebastian/object-reflector": "^1.1.1", + "sebastian/recursion-context": "^3.0" + }, + "require-dev": { + "ext-dom": "*", + "phpunit/phpunit": "^8.0" + }, + "suggest": { + "ext-uopz": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Snapshotting of global state", + "homepage": "http://www.github.com/sebastianbergmann/global-state", + "keywords": [ + "global state" + ], + "time": "2019-02-01T05:30:01+00:00" + }, + { + "name": "sebastian/object-enumerator", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-enumerator.git", + "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/7cfd9e65d11ffb5af41198476395774d4c8a84c5", + "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5", + "shasum": "" + }, + "require": { + "php": "^7.0", + "sebastian/object-reflector": "^1.1.1", + "sebastian/recursion-context": "^3.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Traverses array structures and object graphs to enumerate all referenced objects", + "homepage": "https://github.com/sebastianbergmann/object-enumerator/", + "time": "2017-08-03T12:35:26+00:00" + }, + { + "name": "sebastian/object-reflector", + "version": "1.1.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-reflector.git", + "reference": "773f97c67f28de00d397be301821b06708fca0be" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/773f97c67f28de00d397be301821b06708fca0be", + "reference": "773f97c67f28de00d397be301821b06708fca0be", + "shasum": "" + }, + "require": { + "php": "^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Allows reflection of object attributes, including inherited and non-public ones", + "homepage": "https://github.com/sebastianbergmann/object-reflector/", + "time": "2017-03-29T09:07:27+00:00" + }, + { + "name": "sebastian/recursion-context", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8", + "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8", + "shasum": "" + }, + "require": { + "php": "^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides functionality to recursively process PHP variables", + "homepage": "http://www.github.com/sebastianbergmann/recursion-context", + "time": "2017-03-03T06:23:57+00:00" + }, + { + "name": "sebastian/resource-operations", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/resource-operations.git", + "reference": "4d7a795d35b889bf80a0cc04e08d77cedfa917a9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/4d7a795d35b889bf80a0cc04e08d77cedfa917a9", + "reference": "4d7a795d35b889bf80a0cc04e08d77cedfa917a9", + "shasum": "" + }, + "require": { + "php": "^7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides a list of PHP built-in functions that operate on resources", + "homepage": "https://www.github.com/sebastianbergmann/resource-operations", + "time": "2018-10-04T04:07:39+00:00" + }, + { + "name": "sebastian/type", + "version": "1.1.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/type.git", + "reference": "3aaaa15fa71d27650d62a948be022fe3b48541a3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/3aaaa15fa71d27650d62a948be022fe3b48541a3", + "reference": "3aaaa15fa71d27650d62a948be022fe3b48541a3", + "shasum": "" + }, + "require": { + "php": "^7.2" + }, + "require-dev": { + "phpunit/phpunit": "^8.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the types of the PHP type system", + "homepage": "https://github.com/sebastianbergmann/type", + "time": "2019-07-02T08:10:15+00:00" + }, + { + "name": "sebastian/version", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019", + "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that helps with managing the version number of Git-hosted PHP projects", + "homepage": "https://github.com/sebastianbergmann/version", + "time": "2016-10-03T07:35:21+00:00" + }, + { + "name": "seld/jsonlint", + "version": "1.8.0", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/jsonlint.git", + "reference": "ff2aa5420bfbc296cf6a0bc785fa5b35736de7c1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/ff2aa5420bfbc296cf6a0bc785fa5b35736de7c1", + "reference": "ff2aa5420bfbc296cf6a0bc785fa5b35736de7c1", + "shasum": "" + }, + "require": { + "php": "^5.3 || ^7.0 || ^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" + }, + "bin": [ + "bin/jsonlint" + ], + "type": "library", + "autoload": { + "psr-4": { + "Seld\\JsonLint\\": "src/Seld/JsonLint/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "JSON Linter", + "keywords": [ + "json", + "linter", + "parser", + "validator" + ], + "time": "2020-04-30T19:05:18+00:00" + }, + { + "name": "seld/phar-utils", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/phar-utils.git", + "reference": "8800503d56b9867d43d9c303b9cbcc26016e82f0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/phar-utils/zipball/8800503d56b9867d43d9c303b9cbcc26016e82f0", + "reference": "8800503d56b9867d43d9c303b9cbcc26016e82f0", + "shasum": "" + }, + "require": { + "php": ">=5.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Seld\\PharUtils\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be" + } + ], + "description": "PHAR file format utilities, for when PHP phars you up", + "keywords": [ + "phar" + ], + "time": "2020-02-14T15:25:33+00:00" + }, + { + "name": "squizlabs/php_codesniffer", + "version": "3.5.5", + "source": { + "type": "git", + "url": "https://github.com/squizlabs/PHP_CodeSniffer.git", + "reference": "73e2e7f57d958e7228fce50dc0c61f58f017f9f6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/73e2e7f57d958e7228fce50dc0c61f58f017f9f6", + "reference": "73e2e7f57d958e7228fce50dc0c61f58f017f9f6", + "shasum": "" + }, + "require": { + "ext-simplexml": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": ">=5.4.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0" + }, + "bin": [ + "bin/phpcs", + "bin/phpcbf" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Greg Sherwood", + "role": "lead" + } + ], + "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.", + "homepage": "https://github.com/squizlabs/PHP_CodeSniffer", + "keywords": [ + "phpcs", + "standards" + ], + "time": "2020-04-17T01:09:41+00:00" + }, + { + "name": "symfony/debug", + "version": "v4.4.10", + "source": { + "type": "git", + "url": "https://github.com/symfony/debug.git", + "reference": "28f92d08bb6d1fddf8158e02c194ad43870007e6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/debug/zipball/28f92d08bb6d1fddf8158e02c194ad43870007e6", + "reference": "28f92d08bb6d1fddf8158e02c194ad43870007e6", + "shasum": "" + }, + "require": { + "php": ">=7.1.3", + "psr/log": "~1.0", + "symfony/polyfill-php80": "^1.15" + }, + "conflict": { + "symfony/http-kernel": "<3.4" + }, + "require-dev": { + "symfony/http-kernel": "^3.4|^4.0|^5.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.4-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Debug\\": "" + }, + "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": "Symfony Debug Component", + "homepage": "https://symfony.com", + "time": "2020-05-24T08:33:35+00:00" + }, + { + "name": "symfony/filesystem", + "version": "v5.1.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/filesystem.git", + "reference": "6e4320f06d5f2cce0d96530162491f4465179157" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/6e4320f06d5f2cce0d96530162491f4465179157", + "reference": "6e4320f06d5f2cce0d96530162491f4465179157", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-ctype": "~1.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Filesystem\\": "" + }, + "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": "Symfony Filesystem Component", + "homepage": "https://symfony.com", + "time": "2020-05-30T20:35:19+00:00" + }, + { + "name": "theseer/tokenizer", + "version": "1.1.3", + "source": { + "type": "git", + "url": "https://github.com/theseer/tokenizer.git", + "reference": "11336f6f84e16a720dae9d8e6ed5019efa85a0f9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/11336f6f84e16a720dae9d8e6ed5019efa85a0f9", + "reference": "11336f6f84e16a720dae9d8e6ed5019efa85a0f9", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": "^7.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + } + ], + "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", + "time": "2019-06-13T22:48:21+00:00" + }, + { + "name": "webmozart/assert", + "version": "1.9.0", + "source": { + "type": "git", + "url": "https://github.com/webmozart/assert.git", + "reference": "9dc4f203e36f2b486149058bade43c851dd97451" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webmozart/assert/zipball/9dc4f203e36f2b486149058bade43c851dd97451", + "reference": "9dc4f203e36f2b486149058bade43c851dd97451", + "shasum": "" + }, + "require": { + "php": "^5.3.3 || ^7.0", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "phpstan/phpstan": "<0.12.20", + "vimeo/psalm": "<3.9.1" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.36 || ^7.5.13" + }, + "type": "library", + "autoload": { + "psr-4": { + "Webmozart\\Assert\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Assertions to validate method input/output with nice error messages.", + "keywords": [ + "assert", + "check", + "validate" + ], + "time": "2020-06-16T10:16:42+00:00" + } + ], + "aliases": [], + "minimum-stability": "dev", + "stability-flags": { + "roave/security-advisories": 20 }, - { - "name": "league/csv", - "version": "9.6.0", - "source": { - "type": "git", - "url": "https://github.com/thephpleague/csv.git", - "reference": "7351a74625601914409b42b32cabb91a93773b7b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/thephpleague/csv/zipball/7351a74625601914409b42b32cabb91a93773b7b", - "reference": "7351a74625601914409b42b32cabb91a93773b7b", - "shasum": "" - }, - "require": { - "ext-json": "*", - "ext-mbstring": "*", + "prefer-stable": true, + "prefer-lowest": false, + "platform": { "php": "^7.2.5" - }, - "require-dev": { - "ext-curl": "*", - "friendsofphp/php-cs-fixer": "^2.16", - "phpstan/phpstan": "^0.12.0", - "phpstan/phpstan-phpunit": "^0.12.0", - "phpstan/phpstan-strict-rules": "^0.12.0", - "phpunit/phpunit": "^8.0" - }, - "suggest": { - "ext-dom": "Required to use the XMLConverter and or the HTMLConverter classes", - "ext-iconv": "Needed to ease transcoding CSV using iconv stream filters" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "9.x-dev" - } - }, - "autoload": { - "psr-4": { - "League\\Csv\\": "src" - }, - "files": [ - "src/functions_include.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Ignace Nyamagana Butera", - "email": "nyamsprod@gmail.com", - "homepage": "https://github.com/nyamsprod/", - "role": "Developer" - } - ], - "description": "CSV data manipulation made easy in PHP", - "homepage": "http://csv.thephpleague.com", - "keywords": [ - "convert", - "csv", - "export", - "filter", - "import", - "read", - "transform", - "write" - ], - "time": "2020-03-17T15:15:35+00:00" - }, - { - "name": "league/flysystem", - "version": "1.0.69", - "source": { - "type": "git", - "url": "https://github.com/thephpleague/flysystem.git", - "reference": "7106f78428a344bc4f643c233a94e48795f10967" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/7106f78428a344bc4f643c233a94e48795f10967", - "reference": "7106f78428a344bc4f643c233a94e48795f10967", - "shasum": "" - }, - "require": { - "ext-fileinfo": "*", - "php": ">=5.5.9" - }, - "conflict": { - "league/flysystem-sftp": "<1.0.6" - }, - "require-dev": { - "phpspec/phpspec": "^3.4", - "phpunit/phpunit": "^5.7.26" - }, - "suggest": { - "ext-fileinfo": "Required for MimeType", - "ext-ftp": "Allows you to use FTP server storage", - "ext-openssl": "Allows you to use FTPS server storage", - "league/flysystem-aws-s3-v2": "Allows you to use S3 storage with AWS SDK v2", - "league/flysystem-aws-s3-v3": "Allows you to use S3 storage with AWS SDK v3", - "league/flysystem-azure": "Allows you to use Windows Azure Blob storage", - "league/flysystem-cached-adapter": "Flysystem adapter decorator for metadata caching", - "league/flysystem-eventable-filesystem": "Allows you to use EventableFilesystem", - "league/flysystem-rackspace": "Allows you to use Rackspace Cloud Files", - "league/flysystem-sftp": "Allows you to use SFTP server storage via phpseclib", - "league/flysystem-webdav": "Allows you to use WebDAV storage", - "league/flysystem-ziparchive": "Allows you to use ZipArchive adapter", - "spatie/flysystem-dropbox": "Allows you to use Dropbox storage", - "srmklive/flysystem-dropbox-v2": "Allows you to use Dropbox storage for PHP 5 applications" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1-dev" - } - }, - "autoload": { - "psr-4": { - "League\\Flysystem\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Frank de Jonge", - "email": "info@frenky.net" - } - ], - "description": "Filesystem abstraction: Many filesystems, one API.", - "keywords": [ - "Cloud Files", - "WebDAV", - "abstraction", - "aws", - "cloud", - "copy.com", - "dropbox", - "file systems", - "files", - "filesystem", - "filesystems", - "ftp", - "rackspace", - "remote", - "s3", - "sftp", - "storage" - ], - "time": "2020-05-18T15:13:39+00:00" - }, - { - "name": "monolog/monolog", - "version": "2.1.0", - "source": { - "type": "git", - "url": "https://github.com/Seldaek/monolog.git", - "reference": "38914429aac460e8e4616c8cb486ecb40ec90bb1" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/38914429aac460e8e4616c8cb486ecb40ec90bb1", - "reference": "38914429aac460e8e4616c8cb486ecb40ec90bb1", - "shasum": "" - }, - "require": { - "php": ">=7.2", - "psr/log": "^1.0.1" - }, - "provide": { - "psr/log-implementation": "1.0.0" - }, - "require-dev": { - "aws/aws-sdk-php": "^2.4.9 || ^3.0", - "doctrine/couchdb": "~1.0@dev", - "elasticsearch/elasticsearch": "^6.0", - "graylog2/gelf-php": "^1.4.2", - "php-amqplib/php-amqplib": "~2.4", - "php-console/php-console": "^3.1.3", - "php-parallel-lint/php-parallel-lint": "^1.0", - "phpspec/prophecy": "^1.6.1", - "phpunit/phpunit": "^8.5", - "predis/predis": "^1.1", - "rollbar/rollbar": "^1.3", - "ruflin/elastica": ">=0.90 <3.0", - "swiftmailer/swiftmailer": "^5.3|^6.0" - }, - "suggest": { - "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", - "doctrine/couchdb": "Allow sending log messages to a CouchDB server", - "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client", - "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", - "ext-mbstring": "Allow to work properly with unicode symbols", - "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)", - "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", - "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)", - "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", - "php-console/php-console": "Allow sending log messages to Google Chrome", - "rollbar/rollbar": "Allow sending log messages to Rollbar", - "ruflin/elastica": "Allow sending log messages to an Elastic Search server" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.x-dev" - } - }, - "autoload": { - "psr-4": { - "Monolog\\": "src/Monolog" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - } - ], - "description": "Sends your logs to files, sockets, inboxes, databases and various web services", - "homepage": "http://github.com/Seldaek/monolog", - "keywords": [ - "log", - "logging", - "psr-3" - ], - "time": "2020-05-22T08:12:19+00:00" - }, - { - "name": "nesbot/carbon", - "version": "2.35.0", - "source": { - "type": "git", - "url": "https://github.com/briannesbitt/Carbon.git", - "reference": "4b9bd835261ef23d36397a46a76b496a458305e5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/4b9bd835261ef23d36397a46a76b496a458305e5", - "reference": "4b9bd835261ef23d36397a46a76b496a458305e5", - "shasum": "" - }, - "require": { - "ext-json": "*", - "php": "^7.1.8 || ^8.0", - "symfony/polyfill-mbstring": "^1.0", - "symfony/translation": "^3.4 || ^4.0 || ^5.0" - }, - "require-dev": { - "doctrine/orm": "^2.7", - "friendsofphp/php-cs-fixer": "^2.14 || ^3.0", - "kylekatarnls/multi-tester": "^1.1", - "phpmd/phpmd": "^2.8", - "phpstan/phpstan": "^0.11", - "phpunit/phpunit": "^7.5 || ^8.0", - "squizlabs/php_codesniffer": "^3.4" - }, - "bin": [ - "bin/carbon" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.x-dev", - "dev-3.x": "3.x-dev" - }, - "laravel": { - "providers": [ - "Carbon\\Laravel\\ServiceProvider" - ] - } - }, - "autoload": { - "psr-4": { - "Carbon\\": "src/Carbon/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Brian Nesbitt", - "email": "brian@nesbot.com", - "homepage": "http://nesbot.com" - }, - { - "name": "kylekatarnls", - "homepage": "http://github.com/kylekatarnls" - } - ], - "description": "An API extension for DateTime that supports 281 different languages.", - "homepage": "http://carbon.nesbot.com", - "keywords": [ - "date", - "datetime", - "time" - ], - "time": "2020-05-24T18:27:52+00:00" - }, - { - "name": "opis/closure", - "version": "3.5.3", - "source": { - "type": "git", - "url": "https://github.com/opis/closure.git", - "reference": "cac47092144043d5d676e2e7cf8d0d2f83fc89ca" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/opis/closure/zipball/cac47092144043d5d676e2e7cf8d0d2f83fc89ca", - "reference": "cac47092144043d5d676e2e7cf8d0d2f83fc89ca", - "shasum": "" - }, - "require": { - "php": "^5.4 || ^7.0" - }, - "require-dev": { - "jeremeamia/superclosure": "^2.0", - "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.5.x-dev" - } - }, - "autoload": { - "psr-4": { - "Opis\\Closure\\": "src/" - }, - "files": [ - "functions.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Marius Sarca", - "email": "marius.sarca@gmail.com" - }, - { - "name": "Sorin Sarca", - "email": "sarca_sorin@hotmail.com" - } - ], - "description": "A library that can be used to serialize closures (anonymous functions) and arbitrary objects.", - "homepage": "https://opis.io/closure", - "keywords": [ - "anonymous functions", - "closure", - "function", - "serializable", - "serialization", - "serialize" - ], - "time": "2020-05-25T09:32:45+00:00" - }, - { - "name": "phpoption/phpoption", - "version": "1.7.3", - "source": { - "type": "git", - "url": "https://github.com/schmittjoh/php-option.git", - "reference": "4acfd6a4b33a509d8c88f50e5222f734b6aeebae" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/4acfd6a4b33a509d8c88f50e5222f734b6aeebae", - "reference": "4acfd6a4b33a509d8c88f50e5222f734b6aeebae", - "shasum": "" - }, - "require": { - "php": "^5.5.9 || ^7.0 || ^8.0" - }, - "require-dev": { - "bamarni/composer-bin-plugin": "^1.3", - "phpunit/phpunit": "^4.8.35 || ^5.0 || ^6.0 || ^7.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.7-dev" - } - }, - "autoload": { - "psr-4": { - "PhpOption\\": "src/PhpOption/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "authors": [ - { - "name": "Johannes M. Schmitt", - "email": "schmittjoh@gmail.com" - }, - { - "name": "Graham Campbell", - "email": "graham@alt-three.com" - } - ], - "description": "Option Type for PHP", - "keywords": [ - "language", - "option", - "php", - "type" - ], - "time": "2020-03-21T18:07:53+00:00" - }, - { - "name": "predis/predis", - "version": "v1.1.1", - "source": { - "type": "git", - "url": "https://github.com/nrk/predis.git", - "reference": "f0210e38881631afeafb56ab43405a92cafd9fd1" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nrk/predis/zipball/f0210e38881631afeafb56ab43405a92cafd9fd1", - "reference": "f0210e38881631afeafb56ab43405a92cafd9fd1", - "shasum": "" - }, - "require": { - "php": ">=5.3.9" - }, - "require-dev": { - "phpunit/phpunit": "~4.8" - }, - "suggest": { - "ext-curl": "Allows access to Webdis when paired with phpiredis", - "ext-phpiredis": "Allows faster serialization and deserialization of the Redis protocol" - }, - "type": "library", - "autoload": { - "psr-4": { - "Predis\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Daniele Alessandri", - "email": "suppakilla@gmail.com", - "homepage": "http://clorophilla.net" - } - ], - "description": "Flexible and feature-complete Redis client for PHP and HHVM", - "homepage": "http://github.com/nrk/predis", - "keywords": [ - "nosql", - "predis", - "redis" - ], - "time": "2016-06-16T16:22:20+00:00" - }, - { - "name": "psr/container", - "version": "1.0.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/container.git", - "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f", - "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Container\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common Container Interface (PHP FIG PSR-11)", - "homepage": "https://github.com/php-fig/container", - "keywords": [ - "PSR-11", - "container", - "container-interface", - "container-interop", - "psr" - ], - "time": "2017-02-14T16:28:37+00:00" - }, - { - "name": "psr/event-dispatcher", - "version": "1.0.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/event-dispatcher.git", - "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", - "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", - "shasum": "" - }, - "require": { - "php": ">=7.2.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\EventDispatcher\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Standard interfaces for event handling.", - "keywords": [ - "events", - "psr", - "psr-14" - ], - "time": "2019-01-08T18:20:26+00:00" - }, - { - "name": "psr/http-message", - "version": "1.0.1", - "source": { - "type": "git", - "url": "https://github.com/php-fig/http-message.git", - "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", - "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Http\\Message\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interface for HTTP messages", - "homepage": "https://github.com/php-fig/http-message", - "keywords": [ - "http", - "http-message", - "psr", - "psr-7", - "request", - "response" - ], - "time": "2016-08-06T14:39:51+00:00" - }, - { - "name": "psr/log", - "version": "1.1.3", - "source": { - "type": "git", - "url": "https://github.com/php-fig/log.git", - "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/0f73288fd15629204f9d42b7055f72dacbe811fc", - "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Log\\": "Psr/Log/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interface for logging libraries", - "homepage": "https://github.com/php-fig/log", - "keywords": [ - "log", - "psr", - "psr-3" - ], - "time": "2020-03-23T09:12:05+00:00" }, - { - "name": "psr/simple-cache", - "version": "1.0.1", - "source": { - "type": "git", - "url": "https://github.com/php-fig/simple-cache.git", - "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", - "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\SimpleCache\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interfaces for simple caching", - "keywords": [ - "cache", - "caching", - "psr", - "psr-16", - "simple-cache" - ], - "time": "2017-10-23T01:57:42+00:00" - }, - { - "name": "ralouphie/getallheaders", - "version": "3.0.3", - "source": { - "type": "git", - "url": "https://github.com/ralouphie/getallheaders.git", - "reference": "120b605dfeb996808c31b6477290a714d356e822" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", - "reference": "120b605dfeb996808c31b6477290a714d356e822", - "shasum": "" - }, - "require": { - "php": ">=5.6" - }, - "require-dev": { - "php-coveralls/php-coveralls": "^2.1", - "phpunit/phpunit": "^5 || ^6.5" - }, - "type": "library", - "autoload": { - "files": [ - "src/getallheaders.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Ralph Khattar", - "email": "ralph.khattar@gmail.com" - } - ], - "description": "A polyfill for getallheaders.", - "time": "2019-03-08T08:55:37+00:00" - }, - { - "name": "ramsey/collection", - "version": "1.0.1", - "source": { - "type": "git", - "url": "https://github.com/ramsey/collection.git", - "reference": "925ad8cf55ba7a3fc92e332c58fd0478ace3e1ca" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/ramsey/collection/zipball/925ad8cf55ba7a3fc92e332c58fd0478ace3e1ca", - "reference": "925ad8cf55ba7a3fc92e332c58fd0478ace3e1ca", - "shasum": "" - }, - "require": { - "php": "^7.2" - }, - "require-dev": { - "dealerdirect/phpcodesniffer-composer-installer": "^0.5.0", - "fzaninotto/faker": "^1.5", - "jakub-onderka/php-parallel-lint": "^1", - "jangregor/phpstan-prophecy": "^0.6", - "mockery/mockery": "^1.3", - "phpstan/extension-installer": "^1", - "phpstan/phpdoc-parser": "0.4.1", - "phpstan/phpstan": "^0.12", - "phpstan/phpstan-mockery": "^0.12", - "phpstan/phpstan-phpunit": "^0.12", - "phpunit/phpunit": "^8.5", - "slevomat/coding-standard": "^6.0", - "squizlabs/php_codesniffer": "^3.5" - }, - "type": "library", - "autoload": { - "psr-4": { - "Ramsey\\Collection\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Ben Ramsey", - "email": "ben@benramsey.com", - "homepage": "https://benramsey.com" - } - ], - "description": "A PHP 7.2+ library for representing and manipulating collections.", - "homepage": "https://github.com/ramsey/collection", - "keywords": [ - "array", - "collection", - "hash", - "map", - "queue", - "set" - ], - "time": "2020-01-05T00:22:59+00:00" - }, - { - "name": "ramsey/uuid", - "version": "4.0.1", - "source": { - "type": "git", - "url": "https://github.com/ramsey/uuid.git", - "reference": "ba8fff1d3abb8bb4d35a135ed22a31c6ef3ede3d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/ramsey/uuid/zipball/ba8fff1d3abb8bb4d35a135ed22a31c6ef3ede3d", - "reference": "ba8fff1d3abb8bb4d35a135ed22a31c6ef3ede3d", - "shasum": "" - }, - "require": { - "brick/math": "^0.8", - "ext-json": "*", - "php": "^7.2 || ^8", - "ramsey/collection": "^1.0", - "symfony/polyfill-ctype": "^1.8" - }, - "replace": { - "rhumsaa/uuid": "self.version" - }, - "require-dev": { - "codeception/aspect-mock": "^3", - "dealerdirect/phpcodesniffer-composer-installer": "^0.6.2", - "doctrine/annotations": "^1.8", - "goaop/framework": "^2", - "mockery/mockery": "^1.3", - "moontoast/math": "^1.1", - "paragonie/random-lib": "^2", - "php-mock/php-mock-mockery": "^1.3", - "php-mock/php-mock-phpunit": "^2.5", - "php-parallel-lint/php-parallel-lint": "^1.1", - "phpstan/extension-installer": "^1.0", - "phpstan/phpdoc-parser": "0.4.3", - "phpstan/phpstan": "^0.12", - "phpstan/phpstan-mockery": "^0.12", - "phpstan/phpstan-phpunit": "^0.12", - "phpunit/phpunit": "^8.5", - "psy/psysh": "^0.10.0", - "slevomat/coding-standard": "^6.0", - "squizlabs/php_codesniffer": "^3.5", - "vimeo/psalm": "3.9.4" - }, - "suggest": { - "ext-bcmath": "Enables faster math with arbitrary-precision integers using BCMath.", - "ext-ctype": "Enables faster processing of character classification using ctype functions.", - "ext-gmp": "Enables faster math with arbitrary-precision integers using GMP.", - "ext-uuid": "Enables the use of PeclUuidTimeGenerator and PeclUuidRandomGenerator.", - "paragonie/random-lib": "Provides RandomLib for use with the RandomLibAdapter", - "ramsey/uuid-doctrine": "Allows the use of Ramsey\\Uuid\\Uuid as Doctrine field type." - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.x-dev" - } - }, - "autoload": { - "psr-4": { - "Ramsey\\Uuid\\": "src/" - }, - "files": [ - "src/functions.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "A PHP library for generating and working with universally unique identifiers (UUIDs).", - "homepage": "https://github.com/ramsey/uuid", - "keywords": [ - "guid", - "identifier", - "uuid" - ], - "time": "2020-03-29T20:13:32+00:00" - }, - { - "name": "shaarli/netscape-bookmark-parser", - "version": "v2.1.0", - "source": { - "type": "git", - "url": "https://github.com/shaarli/netscape-bookmark-parser.git", - "reference": "819008ee42c4dd7e45d988176a4a22d6ed689577" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/shaarli/netscape-bookmark-parser/zipball/819008ee42c4dd7e45d988176a4a22d6ed689577", - "reference": "819008ee42c4dd7e45d988176a4a22d6ed689577", - "shasum": "" - }, - "require": { - "katzgrau/klogger": "~1.0", - "php": ">=5.6" - }, - "require-dev": { - "phpunit/phpunit": "^5.0" - }, - "type": "library", - "autoload": { - "files": [ - "NetscapeBookmarkParser.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Kafene", - "email": "io@kafene.org", - "homepage": "https://github.com/kafene", - "role": "Developer" - }, - { - "name": "VirtualTam", - "email": "virtualtam@flibidi.net", - "homepage": "https://github.com/virtualtam", - "role": "Developer" - } - ], - "description": "Generic Netscape bookmark parser", - "homepage": "https://github.com/shaarli/netscape-bookmark-parser", - "keywords": [ - "bookmark", - "link", - "netscape", - "parser" - ], - "time": "2018-10-06T14:43:38+00:00" - }, - { - "name": "spatie/db-dumper", - "version": "2.16.1", - "source": { - "type": "git", - "url": "https://github.com/spatie/db-dumper.git", - "reference": "56448e8f41d4e8e83babf701d5708b1e597e8ec6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/spatie/db-dumper/zipball/56448e8f41d4e8e83babf701d5708b1e597e8ec6", - "reference": "56448e8f41d4e8e83babf701d5708b1e597e8ec6", - "shasum": "" - }, - "require": { - "php": "^7.2", - "symfony/process": "^4.2|^5.0" - }, - "require-dev": { - "phpunit/phpunit": "^7.0|^8.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Spatie\\DbDumper\\": "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": "Dump databases", - "homepage": "https://github.com/spatie/db-dumper", - "keywords": [ - "database", - "db-dumper", - "dump", - "mysqldump", - "spatie" - ], - "time": "2020-05-06T14:32:38+00:00" - }, - { - "name": "spatie/laravel-backup", - "version": "6.10.0", - "source": { - "type": "git", - "url": "https://github.com/spatie/laravel-backup.git", - "reference": "ac45933316893ec89883ebb9d9a51e9c6f13ebaa" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-backup/zipball/ac45933316893ec89883ebb9d9a51e9c6f13ebaa", - "reference": "ac45933316893ec89883ebb9d9a51e9c6f13ebaa", - "shasum": "" - }, - "require": { - "illuminate/console": "^5.8.15|^6.0|^7.0", - "illuminate/contracts": "^5.8.15|^6.0|^7.0", - "illuminate/events": "^5.8.15|^6.0|^7.0", - "illuminate/filesystem": "^5.8.15|^6.0|^7.0", - "illuminate/notifications": "^5.8.15|^6.0|^7.0", - "illuminate/support": "^5.8.15|^6.0|^7.0", - "league/flysystem": "^1.0.49", - "php": "^7.2", - "spatie/db-dumper": "^2.12", - "spatie/temporary-directory": "^1.1", - "symfony/finder": "^4.2|^5.0" - }, - "require-dev": { - "laravel/slack-notification-channel": "^1.0", - "league/flysystem-aws-s3-v3": "^1.0", - "mockery/mockery": "^1.3", - "orchestra/testbench": "3.8.*|4.*|5.*", - "phpunit/phpunit": "^8.4|^9.0" - }, - "suggest": { - "laravel/slack-notification-channel": "Required for sending notifications via Slack" - }, - "type": "library", - "extra": { - "laravel": { - "providers": [ - "Spatie\\Backup\\BackupServiceProvider" - ] - } - }, - "autoload": { - "psr-4": { - "Spatie\\Backup\\": "src" - }, - "files": [ - "src/Helpers/functions.php" - ] - }, - "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 Laravel package to backup your application", - "homepage": "https://github.com/spatie/laravel-backup", - "keywords": [ - "backup", - "database", - "laravel-backup", - "spatie" - ], - "time": "2020-05-20T19:11:25+00:00" - }, - { - "name": "spatie/temporary-directory", - "version": "1.2.2", - "source": { - "type": "git", - "url": "https://github.com/spatie/temporary-directory.git", - "reference": "fcb127e615700751dac2aefee0ea2808ff3f5bb1" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/spatie/temporary-directory/zipball/fcb127e615700751dac2aefee0ea2808ff3f5bb1", - "reference": "fcb127e615700751dac2aefee0ea2808ff3f5bb1", - "shasum": "" - }, - "require": { - "php": "^7.2" - }, - "require-dev": { - "phpunit/phpunit": "^8.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Spatie\\TemporaryDirectory\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Alex Vanderbist", - "email": "alex@spatie.be", - "homepage": "https://spatie.be", - "role": "Developer" - } - ], - "description": "Easily create, use and destroy temporary directories", - "homepage": "https://github.com/spatie/temporary-directory", - "keywords": [ - "spatie", - "temporary-directory" - ], - "time": "2019-12-15T18:52:09+00:00" - }, - { - "name": "swiftmailer/swiftmailer", - "version": "v6.2.3", - "source": { - "type": "git", - "url": "https://github.com/swiftmailer/swiftmailer.git", - "reference": "149cfdf118b169f7840bbe3ef0d4bc795d1780c9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/149cfdf118b169f7840bbe3ef0d4bc795d1780c9", - "reference": "149cfdf118b169f7840bbe3ef0d4bc795d1780c9", - "shasum": "" - }, - "require": { - "egulias/email-validator": "~2.0", - "php": ">=7.0.0", - "symfony/polyfill-iconv": "^1.0", - "symfony/polyfill-intl-idn": "^1.10", - "symfony/polyfill-mbstring": "^1.0" - }, - "require-dev": { - "mockery/mockery": "~0.9.1", - "symfony/phpunit-bridge": "^3.4.19|^4.1.8" - }, - "suggest": { - "ext-intl": "Needed to support internationalized email addresses", - "true/punycode": "Needed to support internationalized email addresses, if ext-intl is not installed" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "6.2-dev" - } - }, - "autoload": { - "files": [ - "lib/swift_required.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Chris Corbyn" - }, - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - } - ], - "description": "Swiftmailer, free feature-rich PHP mailer", - "homepage": "https://swiftmailer.symfony.com", - "keywords": [ - "email", - "mail", - "mailer" - ], - "time": "2019-11-12T09:31:26+00:00" - }, - { - "name": "symfony/console", - "version": "v5.1.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/console.git", - "reference": "00bed125812716d09b163f0727ef33bb49bf3448" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/00bed125812716d09b163f0727ef33bb49bf3448", - "reference": "00bed125812716d09b163f0727ef33bb49bf3448", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php73": "^1.8", - "symfony/polyfill-php80": "^1.15", - "symfony/service-contracts": "^1.1|^2", - "symfony/string": "^5.1" - }, - "conflict": { - "symfony/dependency-injection": "<4.4", - "symfony/dotenv": "<5.1", - "symfony/event-dispatcher": "<4.4", - "symfony/lock": "<4.4", - "symfony/process": "<4.4" - }, - "provide": { - "psr/log-implementation": "1.0" - }, - "require-dev": { - "psr/log": "~1.0", - "symfony/config": "^4.4|^5.0", - "symfony/dependency-injection": "^4.4|^5.0", - "symfony/event-dispatcher": "^4.4|^5.0", - "symfony/lock": "^4.4|^5.0", - "symfony/process": "^4.4|^5.0", - "symfony/var-dumper": "^4.4|^5.0" - }, - "suggest": { - "psr/log": "For using the console logger", - "symfony/event-dispatcher": "", - "symfony/lock": "", - "symfony/process": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.1-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\Console\\": "" - }, - "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": "Symfony Console Component", - "homepage": "https://symfony.com", - "time": "2020-05-30T20:35:19+00:00" - }, - { - "name": "symfony/css-selector", - "version": "v5.1.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/css-selector.git", - "reference": "e544e24472d4c97b2d11ade7caacd446727c6bf9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/e544e24472d4c97b2d11ade7caacd446727c6bf9", - "reference": "e544e24472d4c97b2d11ade7caacd446727c6bf9", - "shasum": "" - }, - "require": { - "php": ">=7.2.5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.1-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\CssSelector\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Jean-François Simon", - "email": "jeanfrancois.simon@sensiolabs.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony CssSelector Component", - "homepage": "https://symfony.com", - "time": "2020-05-20T17:43:50+00:00" - }, - { - "name": "symfony/deprecation-contracts", - "version": "v2.1.2", - "source": { - "type": "git", - "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "dd99cb3a0aff6cadd2a8d7d7ed72c2161e218337" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/dd99cb3a0aff6cadd2a8d7d7ed72c2161e218337", - "reference": "dd99cb3a0aff6cadd2a8d7d7ed72c2161e218337", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.1-dev" - } - }, - "autoload": { - "files": [ - "function.php" - ] - }, - "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": "A generic function and convention to trigger deprecation notices", - "homepage": "https://symfony.com", - "time": "2020-05-27T08:34:37+00:00" - }, - { - "name": "symfony/error-handler", - "version": "v5.1.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/error-handler.git", - "reference": "7d0b927b9d3dc41d7d46cda38cbfcd20cdcbb896" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/7d0b927b9d3dc41d7d46cda38cbfcd20cdcbb896", - "reference": "7d0b927b9d3dc41d7d46cda38cbfcd20cdcbb896", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "psr/log": "^1.0", - "symfony/polyfill-php80": "^1.15", - "symfony/var-dumper": "^4.4|^5.0" - }, - "require-dev": { - "symfony/deprecation-contracts": "^2.1", - "symfony/http-kernel": "^4.4|^5.0", - "symfony/serializer": "^4.4|^5.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.1-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\ErrorHandler\\": "" - }, - "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": "Symfony ErrorHandler Component", - "homepage": "https://symfony.com", - "time": "2020-05-30T20:35:19+00:00" - }, - { - "name": "symfony/event-dispatcher", - "version": "v5.1.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "cc0d059e2e997e79ca34125a52f3e33de4424ac7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/cc0d059e2e997e79ca34125a52f3e33de4424ac7", - "reference": "cc0d059e2e997e79ca34125a52f3e33de4424ac7", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1", - "symfony/event-dispatcher-contracts": "^2", - "symfony/polyfill-php80": "^1.15" - }, - "conflict": { - "symfony/dependency-injection": "<4.4" - }, - "provide": { - "psr/event-dispatcher-implementation": "1.0", - "symfony/event-dispatcher-implementation": "2.0" - }, - "require-dev": { - "psr/log": "~1.0", - "symfony/config": "^4.4|^5.0", - "symfony/dependency-injection": "^4.4|^5.0", - "symfony/expression-language": "^4.4|^5.0", - "symfony/http-foundation": "^4.4|^5.0", - "symfony/service-contracts": "^1.1|^2", - "symfony/stopwatch": "^4.4|^5.0" - }, - "suggest": { - "symfony/dependency-injection": "", - "symfony/http-kernel": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.1-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\EventDispatcher\\": "" - }, - "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": "Symfony EventDispatcher Component", - "homepage": "https://symfony.com", - "time": "2020-05-20T17:43:50+00:00" - }, - { - "name": "symfony/event-dispatcher-contracts", - "version": "v2.1.2", - "source": { - "type": "git", - "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "405952c4e90941a17e52ef7489a2bd94870bb290" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/405952c4e90941a17e52ef7489a2bd94870bb290", - "reference": "405952c4e90941a17e52ef7489a2bd94870bb290", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "psr/event-dispatcher": "^1" - }, - "suggest": { - "symfony/event-dispatcher-implementation": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.1-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Contracts\\EventDispatcher\\": "" - } - }, - "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": "Generic abstractions related to dispatching event", - "homepage": "https://symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ], - "time": "2020-05-20T17:43:50+00:00" - }, - { - "name": "symfony/finder", - "version": "v5.1.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/finder.git", - "reference": "4298870062bfc667cb78d2b379be4bf5dec5f187" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/4298870062bfc667cb78d2b379be4bf5dec5f187", - "reference": "4298870062bfc667cb78d2b379be4bf5dec5f187", - "shasum": "" - }, - "require": { - "php": ">=7.2.5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.1-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\Finder\\": "" - }, - "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": "Symfony Finder Component", - "homepage": "https://symfony.com", - "time": "2020-05-20T17:43:50+00:00" - }, - { - "name": "symfony/http-foundation", - "version": "v5.1.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/http-foundation.git", - "reference": "e0d853bddc2b2cfb0d67b0b4496c03fffe1d37fa" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/e0d853bddc2b2cfb0d67b0b4496c03fffe1d37fa", - "reference": "e0d853bddc2b2cfb0d67b0b4496c03fffe1d37fa", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1", - "symfony/polyfill-mbstring": "~1.1", - "symfony/polyfill-php80": "^1.15" - }, - "require-dev": { - "predis/predis": "~1.0", - "symfony/cache": "^4.4|^5.0", - "symfony/expression-language": "^4.4|^5.0", - "symfony/mime": "^4.4|^5.0" - }, - "suggest": { - "symfony/mime": "To use the file extension guesser" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.1-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\HttpFoundation\\": "" - }, - "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": "Symfony HttpFoundation Component", - "homepage": "https://symfony.com", - "time": "2020-05-24T12:18:07+00:00" - }, - { - "name": "symfony/http-kernel", - "version": "v5.1.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/http-kernel.git", - "reference": "75ff5327a7d6ede3ccc2fac3ebca9ed776b3e85c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/75ff5327a7d6ede3ccc2fac3ebca9ed776b3e85c", - "reference": "75ff5327a7d6ede3ccc2fac3ebca9ed776b3e85c", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "psr/log": "~1.0", - "symfony/deprecation-contracts": "^2.1", - "symfony/error-handler": "^4.4|^5.0", - "symfony/event-dispatcher": "^5.0", - "symfony/http-foundation": "^4.4|^5.0", - "symfony/polyfill-ctype": "^1.8", - "symfony/polyfill-php73": "^1.9", - "symfony/polyfill-php80": "^1.15" - }, - "conflict": { - "symfony/browser-kit": "<4.4", - "symfony/cache": "<5.0", - "symfony/config": "<5.0", - "symfony/console": "<4.4", - "symfony/dependency-injection": "<4.4", - "symfony/doctrine-bridge": "<5.0", - "symfony/form": "<5.0", - "symfony/http-client": "<5.0", - "symfony/mailer": "<5.0", - "symfony/messenger": "<5.0", - "symfony/translation": "<5.0", - "symfony/twig-bridge": "<5.0", - "symfony/validator": "<5.0", - "twig/twig": "<2.4" - }, - "provide": { - "psr/log-implementation": "1.0" - }, - "require-dev": { - "psr/cache": "~1.0", - "symfony/browser-kit": "^4.4|^5.0", - "symfony/config": "^5.0", - "symfony/console": "^4.4|^5.0", - "symfony/css-selector": "^4.4|^5.0", - "symfony/dependency-injection": "^4.4|^5.0", - "symfony/dom-crawler": "^4.4|^5.0", - "symfony/expression-language": "^4.4|^5.0", - "symfony/finder": "^4.4|^5.0", - "symfony/process": "^4.4|^5.0", - "symfony/routing": "^4.4|^5.0", - "symfony/stopwatch": "^4.4|^5.0", - "symfony/translation": "^4.4|^5.0", - "symfony/translation-contracts": "^1.1|^2", - "twig/twig": "^2.4|^3.0" - }, - "suggest": { - "symfony/browser-kit": "", - "symfony/config": "", - "symfony/console": "", - "symfony/dependency-injection": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.1-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\HttpKernel\\": "" - }, - "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": "Symfony HttpKernel Component", - "homepage": "https://symfony.com", - "time": "2020-05-31T06:14:18+00:00" - }, - { - "name": "symfony/mime", - "version": "v5.1.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/mime.git", - "reference": "56261f89385f9d13cf843a5101ac72131190bc91" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/56261f89385f9d13cf843a5101ac72131190bc91", - "reference": "56261f89385f9d13cf843a5101ac72131190bc91", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/polyfill-intl-idn": "^1.10", - "symfony/polyfill-mbstring": "^1.0", - "symfony/polyfill-php80": "^1.15" - }, - "conflict": { - "symfony/mailer": "<4.4" - }, - "require-dev": { - "egulias/email-validator": "^2.1.10", - "symfony/dependency-injection": "^4.4|^5.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.1-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\Mime\\": "" - }, - "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": "A library to manipulate MIME messages", - "homepage": "https://symfony.com", - "keywords": [ - "mime", - "mime-type" - ], - "time": "2020-05-25T12:33:44+00:00" - }, - { - "name": "symfony/polyfill-ctype", - "version": "v1.17.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "e94c8b1bbe2bc77507a1056cdb06451c75b427f9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/e94c8b1bbe2bc77507a1056cdb06451c75b427f9", - "reference": "e94c8b1bbe2bc77507a1056cdb06451c75b427f9", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "suggest": { - "ext-ctype": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.17-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Ctype\\": "" - }, - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Gert de Pagter", - "email": "BackEndTea@gmail.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for ctype functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "ctype", - "polyfill", - "portable" - ], - "time": "2020-05-12T16:14:59+00:00" - }, - { - "name": "symfony/polyfill-iconv", - "version": "v1.17.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-iconv.git", - "reference": "c4de7601eefbf25f9d47190abe07f79fe0a27424" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-iconv/zipball/c4de7601eefbf25f9d47190abe07f79fe0a27424", - "reference": "c4de7601eefbf25f9d47190abe07f79fe0a27424", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "suggest": { - "ext-iconv": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.17-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Iconv\\": "" - }, - "files": [ - "bootstrap.php" - ] - }, - "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" - ], - "time": "2020-05-12T16:47:27+00:00" - }, - { - "name": "symfony/polyfill-intl-grapheme", - "version": "v1.17.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "e094b0770f7833fdf257e6ba4775be4e258230b2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/e094b0770f7833fdf257e6ba4775be4e258230b2", - "reference": "e094b0770f7833fdf257e6ba4775be4e258230b2", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "suggest": { - "ext-intl": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.17-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Intl\\Grapheme\\": "" - }, - "files": [ - "bootstrap.php" - ] - }, - "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 intl's grapheme_* functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "grapheme", - "intl", - "polyfill", - "portable", - "shim" - ], - "time": "2020-05-12T16:47:27+00:00" - }, - { - "name": "symfony/polyfill-intl-idn", - "version": "v1.17.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "3bff59ea7047e925be6b7f2059d60af31bb46d6a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/3bff59ea7047e925be6b7f2059d60af31bb46d6a", - "reference": "3bff59ea7047e925be6b7f2059d60af31bb46d6a", - "shasum": "" - }, - "require": { - "php": ">=5.3.3", - "symfony/polyfill-mbstring": "^1.3", - "symfony/polyfill-php72": "^1.10" - }, - "suggest": { - "ext-intl": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.17-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Intl\\Idn\\": "" - }, - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Laurent Bassin", - "email": "laurent@bassin.info" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "idn", - "intl", - "polyfill", - "portable", - "shim" - ], - "time": "2020-05-12T16:47:27+00:00" - }, - { - "name": "symfony/polyfill-intl-normalizer", - "version": "v1.17.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "1357b1d168eb7f68ad6a134838e46b0b159444a9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/1357b1d168eb7f68ad6a134838e46b0b159444a9", - "reference": "1357b1d168eb7f68ad6a134838e46b0b159444a9", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "suggest": { - "ext-intl": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.17-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Intl\\Normalizer\\": "" - }, - "files": [ - "bootstrap.php" - ], - "classmap": [ - "Resources/stubs" - ] - }, - "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 intl's Normalizer class and related functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "intl", - "normalizer", - "polyfill", - "portable", - "shim" - ], - "time": "2020-05-12T16:14:59+00:00" - }, - { - "name": "symfony/polyfill-mbstring", - "version": "v1.17.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "fa79b11539418b02fc5e1897267673ba2c19419c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/fa79b11539418b02fc5e1897267673ba2c19419c", - "reference": "fa79b11539418b02fc5e1897267673ba2c19419c", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "suggest": { - "ext-mbstring": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.17-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Mbstring\\": "" - }, - "files": [ - "bootstrap.php" - ] - }, - "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 Mbstring extension", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "mbstring", - "polyfill", - "portable", - "shim" - ], - "time": "2020-05-12T16:47:27+00:00" - }, - { - "name": "symfony/polyfill-php72", - "version": "v1.17.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "f048e612a3905f34931127360bdd2def19a5e582" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/f048e612a3905f34931127360bdd2def19a5e582", - "reference": "f048e612a3905f34931127360bdd2def19a5e582", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.17-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Php72\\": "" - }, - "files": [ - "bootstrap.php" - ] - }, - "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 backporting some PHP 7.2+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "time": "2020-05-12T16:47:27+00:00" - }, - { - "name": "symfony/polyfill-php73", - "version": "v1.17.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "a760d8964ff79ab9bf057613a5808284ec852ccc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/a760d8964ff79ab9bf057613a5808284ec852ccc", - "reference": "a760d8964ff79ab9bf057613a5808284ec852ccc", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.17-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Php73\\": "" - }, - "files": [ - "bootstrap.php" - ], - "classmap": [ - "Resources/stubs" - ] - }, - "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 backporting some PHP 7.3+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "time": "2020-05-12T16:47:27+00:00" - }, - { - "name": "symfony/polyfill-php80", - "version": "v1.17.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "5e30b2799bc1ad68f7feb62b60a73743589438dd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/5e30b2799bc1ad68f7feb62b60a73743589438dd", - "reference": "5e30b2799bc1ad68f7feb62b60a73743589438dd", - "shasum": "" - }, - "require": { - "php": ">=7.0.8" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.17-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Php80\\": "" - }, - "files": [ - "bootstrap.php" - ], - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Ion Bazan", - "email": "ion.bazan@gmail.com" - }, - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "time": "2020-05-12T16:47:27+00:00" - }, - { - "name": "symfony/process", - "version": "v5.1.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/process.git", - "reference": "7f6378c1fa2147eeb1b4c385856ce9de0d46ebd1" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/7f6378c1fa2147eeb1b4c385856ce9de0d46ebd1", - "reference": "7f6378c1fa2147eeb1b4c385856ce9de0d46ebd1", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/polyfill-php80": "^1.15" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.1-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\Process\\": "" - }, - "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": "Symfony Process Component", - "homepage": "https://symfony.com", - "time": "2020-05-30T20:35:19+00:00" - }, - { - "name": "symfony/routing", - "version": "v5.1.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/routing.git", - "reference": "95cf30145b26c758d6d832aa2d0de3128978d556" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/95cf30145b26c758d6d832aa2d0de3128978d556", - "reference": "95cf30145b26c758d6d832aa2d0de3128978d556", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1", - "symfony/polyfill-php80": "^1.15" - }, - "conflict": { - "symfony/config": "<5.0", - "symfony/dependency-injection": "<4.4", - "symfony/yaml": "<4.4" - }, - "require-dev": { - "doctrine/annotations": "~1.2", - "psr/log": "~1.0", - "symfony/config": "^5.0", - "symfony/dependency-injection": "^4.4|^5.0", - "symfony/expression-language": "^4.4|^5.0", - "symfony/http-foundation": "^4.4|^5.0", - "symfony/yaml": "^4.4|^5.0" - }, - "suggest": { - "doctrine/annotations": "For using the annotation loader", - "symfony/config": "For using the all-in-one router or any loader", - "symfony/expression-language": "For using expression matching", - "symfony/http-foundation": "For using a Symfony Request object", - "symfony/yaml": "For using the YAML loader" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.1-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\Routing\\": "" - }, - "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": "Symfony Routing Component", - "homepage": "https://symfony.com", - "keywords": [ - "router", - "routing", - "uri", - "url" - ], - "time": "2020-05-30T20:35:19+00:00" - }, - { - "name": "symfony/service-contracts", - "version": "v2.1.2", - "source": { - "type": "git", - "url": "https://github.com/symfony/service-contracts.git", - "reference": "66a8f0957a3ca54e4f724e49028ab19d75a8918b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/66a8f0957a3ca54e4f724e49028ab19d75a8918b", - "reference": "66a8f0957a3ca54e4f724e49028ab19d75a8918b", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "psr/container": "^1.0" - }, - "suggest": { - "symfony/service-implementation": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.1-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Contracts\\Service\\": "" - } - }, - "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": "Generic abstractions related to writing services", - "homepage": "https://symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ], - "time": "2020-05-20T17:43:50+00:00" - }, - { - "name": "symfony/string", - "version": "v5.1.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/string.git", - "reference": "90c2a5103f07feb19069379f3abdcdbacc7753a9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/90c2a5103f07feb19069379f3abdcdbacc7753a9", - "reference": "90c2a5103f07feb19069379f3abdcdbacc7753a9", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-intl-grapheme": "~1.0", - "symfony/polyfill-intl-normalizer": "~1.0", - "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php80": "~1.15" - }, - "require-dev": { - "symfony/error-handler": "^4.4|^5.0", - "symfony/http-client": "^4.4|^5.0", - "symfony/translation-contracts": "^1.1|^2", - "symfony/var-exporter": "^4.4|^5.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.1-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\String\\": "" - }, - "files": [ - "Resources/functions.php" - ], - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "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 String component", - "homepage": "https://symfony.com", - "keywords": [ - "grapheme", - "i18n", - "string", - "unicode", - "utf-8", - "utf8" - ], - "time": "2020-05-20T17:43:50+00:00" - }, - { - "name": "symfony/translation", - "version": "v5.1.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/translation.git", - "reference": "d387f07d4c15f9c09439cf3f13ddbe0b2c5e8be2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/d387f07d4c15f9c09439cf3f13ddbe0b2c5e8be2", - "reference": "d387f07d4c15f9c09439cf3f13ddbe0b2c5e8be2", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php80": "^1.15", - "symfony/translation-contracts": "^2" - }, - "conflict": { - "symfony/config": "<4.4", - "symfony/dependency-injection": "<5.0", - "symfony/http-kernel": "<5.0", - "symfony/twig-bundle": "<5.0", - "symfony/yaml": "<4.4" - }, - "provide": { - "symfony/translation-implementation": "2.0" - }, - "require-dev": { - "psr/log": "~1.0", - "symfony/config": "^4.4|^5.0", - "symfony/console": "^4.4|^5.0", - "symfony/dependency-injection": "^5.0", - "symfony/finder": "^4.4|^5.0", - "symfony/http-kernel": "^5.0", - "symfony/intl": "^4.4|^5.0", - "symfony/service-contracts": "^1.1.2|^2", - "symfony/yaml": "^4.4|^5.0" - }, - "suggest": { - "psr/log-implementation": "To use logging capability in translator", - "symfony/config": "", - "symfony/yaml": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.1-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\Translation\\": "" - }, - "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": "Symfony Translation Component", - "homepage": "https://symfony.com", - "time": "2020-05-30T20:35:19+00:00" - }, - { - "name": "symfony/translation-contracts", - "version": "v2.1.2", - "source": { - "type": "git", - "url": "https://github.com/symfony/translation-contracts.git", - "reference": "e5ca07c8f817f865f618aa072c2fe8e0e637340e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/e5ca07c8f817f865f618aa072c2fe8e0e637340e", - "reference": "e5ca07c8f817f865f618aa072c2fe8e0e637340e", - "shasum": "" - }, - "require": { - "php": ">=7.2.5" - }, - "suggest": { - "symfony/translation-implementation": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.1-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Contracts\\Translation\\": "" - } - }, - "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": "Generic abstractions related to translation", - "homepage": "https://symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ], - "time": "2020-05-20T17:43:50+00:00" - }, - { - "name": "symfony/var-dumper", - "version": "v5.1.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/var-dumper.git", - "reference": "46a942903059b0b05e601f00eb64179e05578c0f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/46a942903059b0b05e601f00eb64179e05578c0f", - "reference": "46a942903059b0b05e601f00eb64179e05578c0f", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php80": "^1.15" - }, - "conflict": { - "phpunit/phpunit": "<5.4.3", - "symfony/console": "<4.4" - }, - "require-dev": { - "ext-iconv": "*", - "symfony/console": "^4.4|^5.0", - "symfony/process": "^4.4|^5.0", - "twig/twig": "^2.4|^3.0" - }, - "suggest": { - "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).", - "ext-intl": "To show region name in time zone dump", - "symfony/console": "To use the ServerDumpCommand and/or the bin/var-dump-server script" - }, - "bin": [ - "Resources/bin/var-dump-server" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.1-dev" - } - }, - "autoload": { - "files": [ - "Resources/functions/dump.php" - ], - "psr-4": { - "Symfony\\Component\\VarDumper\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "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 mechanism for exploring and dumping PHP variables", - "homepage": "https://symfony.com", - "keywords": [ - "debug", - "dump" - ], - "time": "2020-05-30T20:35:19+00:00" - }, - { - "name": "tijsverkoyen/css-to-inline-styles", - "version": "2.2.2", - "source": { - "type": "git", - "url": "https://github.com/tijsverkoyen/CssToInlineStyles.git", - "reference": "dda2ee426acd6d801d5b7fd1001cde9b5f790e15" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/tijsverkoyen/CssToInlineStyles/zipball/dda2ee426acd6d801d5b7fd1001cde9b5f790e15", - "reference": "dda2ee426acd6d801d5b7fd1001cde9b5f790e15", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-libxml": "*", - "php": "^5.5 || ^7.0", - "symfony/css-selector": "^2.7 || ^3.0 || ^4.0 || ^5.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.2.x-dev" - } - }, - "autoload": { - "psr-4": { - "TijsVerkoyen\\CssToInlineStyles\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Tijs Verkoyen", - "email": "css_to_inline_styles@verkoyen.eu", - "role": "Developer" - } - ], - "description": "CssToInlineStyles is a class that enables you to convert HTML-pages/files into HTML-pages/files with inline styles. This is very useful when you're sending emails.", - "homepage": "https://github.com/tijsverkoyen/CssToInlineStyles", - "time": "2019-10-24T08:53:34+00:00" - }, - { - "name": "venturecraft/revisionable", - "version": "1.34.0", - "source": { - "type": "git", - "url": "https://github.com/VentureCraft/revisionable.git", - "reference": "151336f0cd51921a00a1ac249afdbcbedb3bc8b3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/VentureCraft/revisionable/zipball/151336f0cd51921a00a1ac249afdbcbedb3bc8b3", - "reference": "151336f0cd51921a00a1ac249afdbcbedb3bc8b3", - "shasum": "" - }, - "require": { - "illuminate/support": "~4.0|~5.0|~5.1|^6.0|^7.0", - "laravel/framework": "~5.4|^6.0|^7.0", - "php": ">=5.4.0" - }, - "require-dev": { - "orchestra/testbench": "~3.0" - }, - "type": "library", - "extra": { - "laravel": { - "providers": [ - "Venturecraft\\Revisionable\\RevisionableServiceProvider" - ] - } - }, - "autoload": { - "classmap": [ - "src/migrations" - ], - "psr-0": { - "Venturecraft\\Revisionable": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Chris Duell", - "email": "me@chrisduell.com" - } - ], - "description": "Keep a revision history for your models without thinking, created as a package for use with Laravel", - "homepage": "http://github.com/venturecraft/revisionable", - "keywords": [ - "Audit", - "ardent", - "history", - "laravel", - "model", - "revision" - ], - "time": "2020-03-03T22:35:12+00:00" - }, - { - "name": "vlucas/phpdotenv", - "version": "v4.1.6", - "source": { - "type": "git", - "url": "https://github.com/vlucas/phpdotenv.git", - "reference": "0b32505d67c1abbfa829283c86bfc0642a661bf6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/0b32505d67c1abbfa829283c86bfc0642a661bf6", - "reference": "0b32505d67c1abbfa829283c86bfc0642a661bf6", - "shasum": "" - }, - "require": { - "php": "^5.5.9 || ^7.0 || ^8.0", - "phpoption/phpoption": "^1.7.2", - "symfony/polyfill-ctype": "^1.9" - }, - "require-dev": { - "bamarni/composer-bin-plugin": "^1.3", - "ext-filter": "*", - "ext-pcre": "*", - "phpunit/phpunit": "^4.8.35 || ^5.0 || ^6.0 || ^7.0" - }, - "suggest": { - "ext-filter": "Required to use the boolean validator.", - "ext-pcre": "Required to use most of the library." - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.1-dev" - } - }, - "autoload": { - "psr-4": { - "Dotenv\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Graham Campbell", - "email": "graham@alt-three.com", - "homepage": "https://gjcampbell.co.uk/" - }, - { - "name": "Vance Lucas", - "email": "vance@vancelucas.com", - "homepage": "https://vancelucas.com/" - } - ], - "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.", - "keywords": [ - "dotenv", - "env", - "environment" - ], - "time": "2020-05-23T09:43:32+00:00" - }, - { - "name": "voku/portable-ascii", - "version": "1.5.1", - "source": { - "type": "git", - "url": "https://github.com/voku/portable-ascii.git", - "reference": "e7f9bd5deff09a57318f9b900ab33a05acfcf4d3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/voku/portable-ascii/zipball/e7f9bd5deff09a57318f9b900ab33a05acfcf4d3", - "reference": "e7f9bd5deff09a57318f9b900ab33a05acfcf4d3", - "shasum": "" - }, - "require": { - "php": ">=7.0.0" - }, - "require-dev": { - "phpunit/phpunit": "~6.0 || ~7.0" - }, - "suggest": { - "ext-intl": "Use Intl for transliterator_transliterate() support" - }, - "type": "library", - "autoload": { - "psr-4": { - "voku\\": "src/voku/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Lars Moelleken", - "homepage": "http://www.moelleken.org/" - } - ], - "description": "Portable ASCII library - performance optimized (ascii) string functions for php.", - "homepage": "https://github.com/voku/portable-ascii", - "keywords": [ - "ascii", - "clean", - "php" - ], - "time": "2020-05-26T06:40:44+00:00" - } - ], - "packages-dev": [ - { - "name": "barryvdh/laravel-debugbar", - "version": "v3.3.3", - "source": { - "type": "git", - "url": "https://github.com/barryvdh/laravel-debugbar.git", - "reference": "57f2219f6d9efe41ed1bc880d86701c52f261bf5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/57f2219f6d9efe41ed1bc880d86701c52f261bf5", - "reference": "57f2219f6d9efe41ed1bc880d86701c52f261bf5", - "shasum": "" - }, - "require": { - "illuminate/routing": "^5.5|^6|^7", - "illuminate/session": "^5.5|^6|^7", - "illuminate/support": "^5.5|^6|^7", - "maximebf/debugbar": "^1.15.1", - "php": ">=7.0", - "symfony/debug": "^3|^4|^5", - "symfony/finder": "^3|^4|^5" - }, - "require-dev": { - "laravel/framework": "5.5.x" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.2-dev" - }, - "laravel": { - "providers": [ - "Barryvdh\\Debugbar\\ServiceProvider" - ], - "aliases": { - "Debugbar": "Barryvdh\\Debugbar\\Facade" - } - } - }, - "autoload": { - "psr-4": { - "Barryvdh\\Debugbar\\": "src/" - }, - "files": [ - "src/helpers.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Barry vd. Heuvel", - "email": "barryvdh@gmail.com" - } - ], - "description": "PHP Debugbar integration for Laravel", - "keywords": [ - "debug", - "debugbar", - "laravel", - "profiler", - "webprofiler" - ], - "time": "2020-05-05T10:53:32+00:00" - }, - { - "name": "barryvdh/laravel-ide-helper", - "version": "v2.7.0", - "source": { - "type": "git", - "url": "https://github.com/barryvdh/laravel-ide-helper.git", - "reference": "5f677edc14bdcfdcac36633e6eea71b2728a4dbc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/barryvdh/laravel-ide-helper/zipball/5f677edc14bdcfdcac36633e6eea71b2728a4dbc", - "reference": "5f677edc14bdcfdcac36633e6eea71b2728a4dbc", - "shasum": "" - }, - "require": { - "barryvdh/reflection-docblock": "^2.0.6", - "composer/composer": "^1.6", - "doctrine/dbal": "~2.3", - "illuminate/console": "^5.5|^6|^7", - "illuminate/filesystem": "^5.5|^6|^7", - "illuminate/support": "^5.5|^6|^7", - "php": ">=7.2" - }, - "require-dev": { - "illuminate/config": "^5.5|^6|^7", - "illuminate/view": "^5.5|^6|^7", - "mockery/mockery": "^1.3", - "orchestra/testbench": "^3|^4|^5", - "phpro/grumphp": "^0.17.1", - "squizlabs/php_codesniffer": "^3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.6-dev" - }, - "laravel": { - "providers": [ - "Barryvdh\\LaravelIdeHelper\\IdeHelperServiceProvider" - ] - } - }, - "autoload": { - "psr-4": { - "Barryvdh\\LaravelIdeHelper\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Barry vd. Heuvel", - "email": "barryvdh@gmail.com" - } - ], - "description": "Laravel IDE Helper, generates correct PHPDocs for all Facade classes, to improve auto-completion.", - "keywords": [ - "autocomplete", - "codeintel", - "helper", - "ide", - "laravel", - "netbeans", - "phpdoc", - "phpstorm", - "sublime" - ], - "time": "2020-04-22T09:57:26+00:00" - }, - { - "name": "barryvdh/reflection-docblock", - "version": "v2.0.6", - "source": { - "type": "git", - "url": "https://github.com/barryvdh/ReflectionDocBlock.git", - "reference": "6b69015d83d3daf9004a71a89f26e27d27ef6a16" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/barryvdh/ReflectionDocBlock/zipball/6b69015d83d3daf9004a71a89f26e27d27ef6a16", - "reference": "6b69015d83d3daf9004a71a89f26e27d27ef6a16", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "phpunit/phpunit": "~4.0,<4.5" - }, - "suggest": { - "dflydev/markdown": "~1.0", - "erusev/parsedown": "~1.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "psr-0": { - "Barryvdh": [ - "src/" - ] - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mike van Riel", - "email": "mike.vanriel@naenius.com" - } - ], - "time": "2018-12-13T10:34:14+00:00" - }, - { - "name": "composer/ca-bundle", - "version": "1.2.7", - "source": { - "type": "git", - "url": "https://github.com/composer/ca-bundle.git", - "reference": "95c63ab2117a72f48f5a55da9740a3273d45b7fd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/ca-bundle/zipball/95c63ab2117a72f48f5a55da9740a3273d45b7fd", - "reference": "95c63ab2117a72f48f5a55da9740a3273d45b7fd", - "shasum": "" - }, - "require": { - "ext-openssl": "*", - "ext-pcre": "*", - "php": "^5.3.2 || ^7.0 || ^8.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.7 || 6.5 - 8", - "psr/log": "^1.0", - "symfony/process": "^2.5 || ^3.0 || ^4.0 || ^5.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Composer\\CaBundle\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - } - ], - "description": "Lets you find a path to the system CA bundle, and includes a fallback to the Mozilla CA bundle.", - "keywords": [ - "cabundle", - "cacert", - "certificate", - "ssl", - "tls" - ], - "time": "2020-04-08T08:27:21+00:00" - }, - { - "name": "composer/composer", - "version": "1.10.6", - "source": { - "type": "git", - "url": "https://github.com/composer/composer.git", - "reference": "be81b9c4735362c26876bdbfd3b5bc7e7f711c88" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/composer/zipball/be81b9c4735362c26876bdbfd3b5bc7e7f711c88", - "reference": "be81b9c4735362c26876bdbfd3b5bc7e7f711c88", - "shasum": "" - }, - "require": { - "composer/ca-bundle": "^1.0", - "composer/semver": "^1.0", - "composer/spdx-licenses": "^1.2", - "composer/xdebug-handler": "^1.1", - "justinrainbow/json-schema": "^3.0 || ^4.0 || ^5.0", - "php": "^5.3.2 || ^7.0", - "psr/log": "^1.0", - "seld/jsonlint": "^1.4", - "seld/phar-utils": "^1.0", - "symfony/console": "^2.7 || ^3.0 || ^4.0 || ^5.0", - "symfony/filesystem": "^2.7 || ^3.0 || ^4.0 || ^5.0", - "symfony/finder": "^2.7 || ^3.0 || ^4.0 || ^5.0", - "symfony/process": "^2.7 || ^3.0 || ^4.0 || ^5.0" - }, - "conflict": { - "symfony/console": "2.8.38", - "symfony/phpunit-bridge": "3.4.40" - }, - "require-dev": { - "phpspec/prophecy": "^1.10", - "symfony/phpunit-bridge": "^3.4" - }, - "suggest": { - "ext-openssl": "Enabling the openssl extension allows you to access https URLs for repositories and packages", - "ext-zip": "Enabling the zip extension allows you to unzip archives", - "ext-zlib": "Allow gzip compression of HTTP requests" - }, - "bin": [ - "bin/composer" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.10-dev" - } - }, - "autoload": { - "psr-4": { - "Composer\\": "src/Composer" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nils Adermann", - "email": "naderman@naderman.de", - "homepage": "http://www.naderman.de" - }, - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - } - ], - "description": "Composer helps you declare, manage and install dependencies of PHP projects. It ensures you have the right stack everywhere.", - "homepage": "https://getcomposer.org/", - "keywords": [ - "autoload", - "dependency", - "package" - ], - "time": "2020-05-06T08:28:10+00:00" - }, - { - "name": "composer/spdx-licenses", - "version": "1.5.3", - "source": { - "type": "git", - "url": "https://github.com/composer/spdx-licenses.git", - "reference": "0c3e51e1880ca149682332770e25977c70cf9dae" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/0c3e51e1880ca149682332770e25977c70cf9dae", - "reference": "0c3e51e1880ca149682332770e25977c70cf9dae", - "shasum": "" - }, - "require": { - "php": "^5.3.2 || ^7.0 || ^8.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.7 || 6.5 - 7" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Composer\\Spdx\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nils Adermann", - "email": "naderman@naderman.de", - "homepage": "http://www.naderman.de" - }, - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - }, - { - "name": "Rob Bast", - "email": "rob.bast@gmail.com", - "homepage": "http://robbast.nl" - } - ], - "description": "SPDX licenses list and validation library.", - "keywords": [ - "license", - "spdx", - "validator" - ], - "time": "2020-02-14T07:44:31+00:00" - }, - { - "name": "composer/xdebug-handler", - "version": "1.4.1", - "source": { - "type": "git", - "url": "https://github.com/composer/xdebug-handler.git", - "reference": "1ab9842d69e64fb3a01be6b656501032d1b78cb7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/1ab9842d69e64fb3a01be6b656501032d1b78cb7", - "reference": "1ab9842d69e64fb3a01be6b656501032d1b78cb7", - "shasum": "" - }, - "require": { - "php": "^5.3.2 || ^7.0 || ^8.0", - "psr/log": "^1.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.7 || 6.5 - 8" - }, - "type": "library", - "autoload": { - "psr-4": { - "Composer\\XdebugHandler\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "John Stevenson", - "email": "john-stevenson@blueyonder.co.uk" - } - ], - "description": "Restarts a process without Xdebug.", - "keywords": [ - "Xdebug", - "performance" - ], - "time": "2020-03-01T12:26:26+00:00" - }, - { - "name": "dnoegel/php-xdg-base-dir", - "version": "v0.1.1", - "source": { - "type": "git", - "url": "https://github.com/dnoegel/php-xdg-base-dir.git", - "reference": "8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/dnoegel/php-xdg-base-dir/zipball/8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd", - "reference": "8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd", - "shasum": "" - }, - "require": { - "php": ">=5.3.2" - }, - "require-dev": { - "phpunit/phpunit": "~7.0|~6.0|~5.0|~4.8.35" - }, - "type": "library", - "autoload": { - "psr-4": { - "XdgBaseDir\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "implementation of xdg base directory specification for php", - "time": "2019-12-04T15:06:13+00:00" - }, - { - "name": "doctrine/instantiator", - "version": "1.3.1", - "source": { - "type": "git", - "url": "https://github.com/doctrine/instantiator.git", - "reference": "f350df0268e904597e3bd9c4685c53e0e333feea" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/f350df0268e904597e3bd9c4685c53e0e333feea", - "reference": "f350df0268e904597e3bd9c4685c53e0e333feea", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0" - }, - "require-dev": { - "doctrine/coding-standard": "^6.0", - "ext-pdo": "*", - "ext-phar": "*", - "phpbench/phpbench": "^0.13", - "phpstan/phpstan-phpunit": "^0.11", - "phpstan/phpstan-shim": "^0.11", - "phpunit/phpunit": "^7.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.2.x-dev" - } - }, - "autoload": { - "psr-4": { - "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com", - "homepage": "http://ocramius.github.com/" - } - ], - "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", - "homepage": "https://www.doctrine-project.org/projects/instantiator.html", - "keywords": [ - "constructor", - "instantiate" - ], - "time": "2020-05-29T17:27:14+00:00" - }, - { - "name": "facade/flare-client-php", - "version": "1.3.2", - "source": { - "type": "git", - "url": "https://github.com/facade/flare-client-php.git", - "reference": "db1e03426e7f9472c9ecd1092aff00f56aa6c004" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/facade/flare-client-php/zipball/db1e03426e7f9472c9ecd1092aff00f56aa6c004", - "reference": "db1e03426e7f9472c9ecd1092aff00f56aa6c004", - "shasum": "" - }, - "require": { - "facade/ignition-contracts": "~1.0", - "illuminate/pipeline": "^5.5|^6.0|^7.0", - "php": "^7.1", - "symfony/http-foundation": "^3.3|^4.1|^5.0", - "symfony/var-dumper": "^3.4|^4.0|^5.0" - }, - "require-dev": { - "larapack/dd": "^1.1", - "phpunit/phpunit": "^7.5.16", - "spatie/phpunit-snapshot-assertions": "^2.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev" - } - }, - "autoload": { - "psr-4": { - "Facade\\FlareClient\\": "src" - }, - "files": [ - "src/helpers.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Send PHP errors to Flare", - "homepage": "https://github.com/facade/flare-client-php", - "keywords": [ - "exception", - "facade", - "flare", - "reporting" - ], - "time": "2020-03-02T15:52:04+00:00" - }, - { - "name": "facade/ignition", - "version": "2.0.6", - "source": { - "type": "git", - "url": "https://github.com/facade/ignition.git", - "reference": "5261c488a1e8a7c3ebdf6a4037c34f5ddeb33922" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/facade/ignition/zipball/5261c488a1e8a7c3ebdf6a4037c34f5ddeb33922", - "reference": "5261c488a1e8a7c3ebdf6a4037c34f5ddeb33922", - "shasum": "" - }, - "require": { - "ext-json": "*", - "ext-mbstring": "*", - "facade/flare-client-php": "^1.0", - "facade/ignition-contracts": "^1.0", - "filp/whoops": "^2.4", - "illuminate/support": "^7.0|^8.0", - "monolog/monolog": "^2.0", - "php": "^7.2.5", - "scrivo/highlight.php": "^9.15", - "symfony/console": "^5.0", - "symfony/var-dumper": "^5.0" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "^2.14", - "mockery/mockery": "^1.3", - "orchestra/testbench": "5.0" - }, - "suggest": { - "laravel/telescope": "^3.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.x-dev" - }, - "laravel": { - "providers": [ - "Facade\\Ignition\\IgnitionServiceProvider" - ], - "aliases": { - "Flare": "Facade\\Ignition\\Facades\\Flare" - } - } - }, - "autoload": { - "psr-4": { - "Facade\\Ignition\\": "src" - }, - "files": [ - "src/helpers.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "A beautiful error page for Laravel applications.", - "homepage": "https://github.com/facade/ignition", - "keywords": [ - "error", - "flare", - "laravel", - "page" - ], - "time": "2020-06-01T09:04:48+00:00" - }, - { - "name": "facade/ignition-contracts", - "version": "1.0.0", - "source": { - "type": "git", - "url": "https://github.com/facade/ignition-contracts.git", - "reference": "f445db0fb86f48e205787b2592840dd9c80ded28" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/facade/ignition-contracts/zipball/f445db0fb86f48e205787b2592840dd9c80ded28", - "reference": "f445db0fb86f48e205787b2592840dd9c80ded28", - "shasum": "" - }, - "require": { - "php": "^7.1" - }, - "type": "library", - "autoload": { - "psr-4": { - "Facade\\IgnitionContracts\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Freek Van der Herten", - "email": "freek@spatie.be", - "homepage": "https://flareapp.io", - "role": "Developer" - } - ], - "description": "Solution contracts for Ignition", - "homepage": "https://github.com/facade/ignition-contracts", - "keywords": [ - "contracts", - "flare", - "ignition" - ], - "time": "2019-08-30T14:06:08+00:00" - }, - { - "name": "filp/whoops", - "version": "2.7.2", - "source": { - "type": "git", - "url": "https://github.com/filp/whoops.git", - "reference": "17d0d3f266c8f925ebd035cd36f83cf802b47d4a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/filp/whoops/zipball/17d0d3f266c8f925ebd035cd36f83cf802b47d4a", - "reference": "17d0d3f266c8f925ebd035cd36f83cf802b47d4a", - "shasum": "" - }, - "require": { - "php": "^5.5.9 || ^7.0", - "psr/log": "^1.0.1" - }, - "require-dev": { - "mockery/mockery": "^0.9 || ^1.0", - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0", - "symfony/var-dumper": "^2.6 || ^3.0 || ^4.0 || ^5.0" - }, - "suggest": { - "symfony/var-dumper": "Pretty print complex values better with var-dumper available", - "whoops/soap": "Formats errors as SOAP responses" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.6-dev" - } - }, - "autoload": { - "psr-4": { - "Whoops\\": "src/Whoops/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Filipe Dobreira", - "homepage": "https://github.com/filp", - "role": "Developer" - } - ], - "description": "php error handling for cool kids", - "homepage": "https://filp.github.io/whoops/", - "keywords": [ - "error", - "exception", - "handling", - "library", - "throwable", - "whoops" - ], - "time": "2020-05-05T12:28:07+00:00" - }, - { - "name": "fzaninotto/faker", - "version": "v1.9.1", - "source": { - "type": "git", - "url": "https://github.com/fzaninotto/Faker.git", - "reference": "fc10d778e4b84d5bd315dad194661e091d307c6f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/fzaninotto/Faker/zipball/fc10d778e4b84d5bd315dad194661e091d307c6f", - "reference": "fc10d778e4b84d5bd315dad194661e091d307c6f", - "shasum": "" - }, - "require": { - "php": "^5.3.3 || ^7.0" - }, - "require-dev": { - "ext-intl": "*", - "phpunit/phpunit": "^4.8.35 || ^5.7", - "squizlabs/php_codesniffer": "^2.9.2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.9-dev" - } - }, - "autoload": { - "psr-4": { - "Faker\\": "src/Faker/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "François Zaninotto" - } - ], - "description": "Faker is a PHP library that generates fake data for you.", - "keywords": [ - "data", - "faker", - "fixtures" - ], - "time": "2019-12-12T13:22:17+00:00" - }, - { - "name": "hamcrest/hamcrest-php", - "version": "v2.0.0", - "source": { - "type": "git", - "url": "https://github.com/hamcrest/hamcrest-php.git", - "reference": "776503d3a8e85d4f9a1148614f95b7a608b046ad" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/hamcrest/hamcrest-php/zipball/776503d3a8e85d4f9a1148614f95b7a608b046ad", - "reference": "776503d3a8e85d4f9a1148614f95b7a608b046ad", - "shasum": "" - }, - "require": { - "php": "^5.3|^7.0" - }, - "replace": { - "cordoval/hamcrest-php": "*", - "davedevelopment/hamcrest-php": "*", - "kodova/hamcrest-php": "*" - }, - "require-dev": { - "phpunit/php-file-iterator": "1.3.3", - "phpunit/phpunit": "~4.0", - "satooshi/php-coveralls": "^1.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0-dev" - } - }, - "autoload": { - "classmap": [ - "hamcrest" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD" - ], - "description": "This is the PHP port of Hamcrest Matchers", - "keywords": [ - "test" - ], - "time": "2016-01-20T08:20:44+00:00" - }, - { - "name": "justinrainbow/json-schema", - "version": "5.2.10", - "source": { - "type": "git", - "url": "https://github.com/justinrainbow/json-schema.git", - "reference": "2ba9c8c862ecd5510ed16c6340aa9f6eadb4f31b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/2ba9c8c862ecd5510ed16c6340aa9f6eadb4f31b", - "reference": "2ba9c8c862ecd5510ed16c6340aa9f6eadb4f31b", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "~2.2.20||~2.15.1", - "json-schema/json-schema-test-suite": "1.2.0", - "phpunit/phpunit": "^4.8.35" - }, - "bin": [ - "bin/validate-json" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "JsonSchema\\": "src/JsonSchema/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Bruno Prieto Reis", - "email": "bruno.p.reis@gmail.com" - }, - { - "name": "Justin Rainbow", - "email": "justin.rainbow@gmail.com" - }, - { - "name": "Igor Wiedler", - "email": "igor@wiedler.ch" - }, - { - "name": "Robert Schönthal", - "email": "seroscho@googlemail.com" - } - ], - "description": "A library to validate a json schema.", - "homepage": "https://github.com/justinrainbow/json-schema", - "keywords": [ - "json", - "schema" - ], - "time": "2020-05-27T16:41:55+00:00" - }, - { - "name": "laravel/tinker", - "version": "v2.4.0", - "source": { - "type": "git", - "url": "https://github.com/laravel/tinker.git", - "reference": "cde90a7335a2130a4488beb68f4b2141869241db" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/laravel/tinker/zipball/cde90a7335a2130a4488beb68f4b2141869241db", - "reference": "cde90a7335a2130a4488beb68f4b2141869241db", - "shasum": "" - }, - "require": { - "illuminate/console": "^6.0|^7.0|^8.0", - "illuminate/contracts": "^6.0|^7.0|^8.0", - "illuminate/support": "^6.0|^7.0|^8.0", - "php": "^7.2", - "psy/psysh": "^0.10.3", - "symfony/var-dumper": "^4.3|^5.0" - }, - "require-dev": { - "mockery/mockery": "^1.3.1", - "phpunit/phpunit": "^8.4|^9.0" - }, - "suggest": { - "illuminate/database": "The Illuminate Database package (^6.0|^7.0|^8.0)." - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.x-dev" - }, - "laravel": { - "providers": [ - "Laravel\\Tinker\\TinkerServiceProvider" - ] - } - }, - "autoload": { - "psr-4": { - "Laravel\\Tinker\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" - } - ], - "description": "Powerful REPL for the Laravel framework.", - "keywords": [ - "REPL", - "Tinker", - "laravel", - "psysh" - ], - "time": "2020-04-07T15:01:31+00:00" - }, - { - "name": "maximebf/debugbar", - "version": "v1.16.3", - "source": { - "type": "git", - "url": "https://github.com/maximebf/php-debugbar.git", - "reference": "1a1605b8e9bacb34cc0c6278206d699772e1d372" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/maximebf/php-debugbar/zipball/1a1605b8e9bacb34cc0c6278206d699772e1d372", - "reference": "1a1605b8e9bacb34cc0c6278206d699772e1d372", - "shasum": "" - }, - "require": { - "php": "^7.1", - "psr/log": "^1.0", - "symfony/var-dumper": "^2.6|^3|^4|^5" - }, - "require-dev": { - "phpunit/phpunit": "^5" - }, - "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.16-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" - ], - "time": "2020-05-06T07:06:27+00:00" - }, - { - "name": "mockery/mockery", - "version": "1.3.1", - "source": { - "type": "git", - "url": "https://github.com/mockery/mockery.git", - "reference": "f69bbde7d7a75d6b2862d9ca8fab1cd28014b4be" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/mockery/mockery/zipball/f69bbde7d7a75d6b2862d9ca8fab1cd28014b4be", - "reference": "f69bbde7d7a75d6b2862d9ca8fab1cd28014b4be", - "shasum": "" - }, - "require": { - "hamcrest/hamcrest-php": "~2.0", - "lib-pcre": ">=7.0", - "php": ">=5.6.0" - }, - "require-dev": { - "phpunit/phpunit": "~5.7.10|~6.5|~7.0|~8.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.3.x-dev" - } - }, - "autoload": { - "psr-0": { - "Mockery": "library/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Pádraic Brady", - "email": "padraic.brady@gmail.com", - "homepage": "http://blog.astrumfutura.com" - }, - { - "name": "Dave Marshall", - "email": "dave.marshall@atstsolutions.co.uk", - "homepage": "http://davedevelopment.co.uk" - } - ], - "description": "Mockery is a simple yet flexible PHP mock object framework", - "homepage": "https://github.com/mockery/mockery", - "keywords": [ - "BDD", - "TDD", - "library", - "mock", - "mock objects", - "mockery", - "stub", - "test", - "test double", - "testing" - ], - "time": "2019-12-26T09:49:15+00:00" - }, - { - "name": "myclabs/deep-copy", - "version": "1.9.5", - "source": { - "type": "git", - "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "b2c28789e80a97badd14145fda39b545d83ca3ef" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/b2c28789e80a97badd14145fda39b545d83ca3ef", - "reference": "b2c28789e80a97badd14145fda39b545d83ca3ef", - "shasum": "" - }, - "require": { - "php": "^7.1" - }, - "replace": { - "myclabs/deep-copy": "self.version" - }, - "require-dev": { - "doctrine/collections": "^1.0", - "doctrine/common": "^2.6", - "phpunit/phpunit": "^7.1" - }, - "type": "library", - "autoload": { - "psr-4": { - "DeepCopy\\": "src/DeepCopy/" - }, - "files": [ - "src/DeepCopy/deep_copy.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Create deep copies (clones) of your objects", - "keywords": [ - "clone", - "copy", - "duplicate", - "object", - "object graph" - ], - "time": "2020-01-17T21:11:47+00:00" - }, - { - "name": "nikic/php-parser", - "version": "v4.4.0", - "source": { - "type": "git", - "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "bd43ec7152eaaab3bd8c6d0aa95ceeb1df8ee120" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/bd43ec7152eaaab3bd8c6d0aa95ceeb1df8ee120", - "reference": "bd43ec7152eaaab3bd8c6d0aa95ceeb1df8ee120", - "shasum": "" - }, - "require": { - "ext-tokenizer": "*", - "php": ">=7.0" - }, - "require-dev": { - "ircmaxell/php-yacc": "0.0.5", - "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0" - }, - "bin": [ - "bin/php-parse" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.3-dev" - } - }, - "autoload": { - "psr-4": { - "PhpParser\\": "lib/PhpParser" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Nikita Popov" - } - ], - "description": "A PHP parser written in PHP", - "keywords": [ - "parser", - "php" - ], - "time": "2020-04-10T16:34:50+00:00" - }, - { - "name": "nunomaduro/collision", - "version": "v4.2.0", - "source": { - "type": "git", - "url": "https://github.com/nunomaduro/collision.git", - "reference": "d50490417eded97be300a92cd7df7badc37a9018" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nunomaduro/collision/zipball/d50490417eded97be300a92cd7df7badc37a9018", - "reference": "d50490417eded97be300a92cd7df7badc37a9018", - "shasum": "" - }, - "require": { - "facade/ignition-contracts": "^1.0", - "filp/whoops": "^2.4", - "php": "^7.2.5", - "symfony/console": "^5.0" - }, - "require-dev": { - "facade/ignition": "^2.0", - "fideloper/proxy": "^4.2", - "friendsofphp/php-cs-fixer": "^2.16", - "fruitcake/laravel-cors": "^1.0", - "laravel/framework": "^7.0", - "laravel/tinker": "^2.0", - "nunomaduro/larastan": "^0.5", - "orchestra/testbench": "^5.0", - "phpstan/phpstan": "^0.12.3", - "phpunit/phpunit": "^8.5.1 || ^9.0" - }, - "type": "library", - "extra": { - "laravel": { - "providers": [ - "NunoMaduro\\Collision\\Adapters\\Laravel\\CollisionServiceProvider" - ] - } - }, - "autoload": { - "psr-4": { - "NunoMaduro\\Collision\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nuno Maduro", - "email": "enunomaduro@gmail.com" - } - ], - "description": "Cli error handling for console/command-line PHP applications.", - "keywords": [ - "artisan", - "cli", - "command-line", - "console", - "error", - "handling", - "laravel", - "laravel-zero", - "php", - "symfony" - ], - "time": "2020-04-04T19:56:08+00:00" - }, - { - "name": "phar-io/manifest", - "version": "1.0.3", - "source": { - "type": "git", - "url": "https://github.com/phar-io/manifest.git", - "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phar-io/manifest/zipball/7761fcacf03b4d4f16e7ccb606d4879ca431fcf4", - "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-phar": "*", - "phar-io/version": "^2.0", - "php": "^5.6 || ^7.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - }, - { - "name": "Sebastian Heuer", - "email": "sebastian@phpeople.de", - "role": "Developer" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "Developer" - } - ], - "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", - "time": "2018-07-08T19:23:20+00:00" - }, - { - "name": "phar-io/version", - "version": "2.0.1", - "source": { - "type": "git", - "url": "https://github.com/phar-io/version.git", - "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phar-io/version/zipball/45a2ec53a73c70ce41d55cedef9063630abaf1b6", - "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6", - "shasum": "" - }, - "require": { - "php": "^5.6 || ^7.0" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - }, - { - "name": "Sebastian Heuer", - "email": "sebastian@phpeople.de", - "role": "Developer" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "Developer" - } - ], - "description": "Library for handling version information and constraints", - "time": "2018-07-08T19:19:57+00:00" - }, - { - "name": "phpdocumentor/reflection-common", - "version": "2.1.0", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionCommon.git", - "reference": "6568f4687e5b41b054365f9ae03fcb1ed5f2069b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/6568f4687e5b41b054365f9ae03fcb1ed5f2069b", - "reference": "6568f4687e5b41b054365f9ae03fcb1ed5f2069b", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jaap van Otterdijk", - "email": "opensource@ijaap.nl" - } - ], - "description": "Common reflection classes used by phpdocumentor to reflect the code structure", - "homepage": "http://www.phpdoc.org", - "keywords": [ - "FQSEN", - "phpDocumentor", - "phpdoc", - "reflection", - "static analysis" - ], - "time": "2020-04-27T09:25:28+00:00" - }, - { - "name": "phpdocumentor/reflection-docblock", - "version": "5.1.0", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "cd72d394ca794d3466a3b2fc09d5a6c1dc86b47e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/cd72d394ca794d3466a3b2fc09d5a6c1dc86b47e", - "reference": "cd72d394ca794d3466a3b2fc09d5a6c1dc86b47e", - "shasum": "" - }, - "require": { - "ext-filter": "^7.1", - "php": "^7.2", - "phpdocumentor/reflection-common": "^2.0", - "phpdocumentor/type-resolver": "^1.0", - "webmozart/assert": "^1" - }, - "require-dev": { - "doctrine/instantiator": "^1", - "mockery/mockery": "^1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" - }, - { - "name": "Jaap van Otterdijk", - "email": "account@ijaap.nl" - } - ], - "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", - "time": "2020-02-22T12:28:44+00:00" - }, - { - "name": "phpdocumentor/type-resolver", - "version": "1.1.0", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "7462d5f123dfc080dfdf26897032a6513644fc95" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/7462d5f123dfc080dfdf26897032a6513644fc95", - "reference": "7462d5f123dfc080dfdf26897032a6513644fc95", - "shasum": "" - }, - "require": { - "php": "^7.2", - "phpdocumentor/reflection-common": "^2.0" - }, - "require-dev": { - "ext-tokenizer": "^7.2", - "mockery/mockery": "~1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" - } - ], - "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", - "time": "2020-02-18T18:59:58+00:00" - }, - { - "name": "phpspec/prophecy", - "version": "v1.10.3", - "source": { - "type": "git", - "url": "https://github.com/phpspec/prophecy.git", - "reference": "451c3cd1418cf640de218914901e51b064abb093" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/451c3cd1418cf640de218914901e51b064abb093", - "reference": "451c3cd1418cf640de218914901e51b064abb093", - "shasum": "" - }, - "require": { - "doctrine/instantiator": "^1.0.2", - "php": "^5.3|^7.0", - "phpdocumentor/reflection-docblock": "^2.0|^3.0.2|^4.0|^5.0", - "sebastian/comparator": "^1.2.3|^2.0|^3.0|^4.0", - "sebastian/recursion-context": "^1.0|^2.0|^3.0|^4.0" - }, - "require-dev": { - "phpspec/phpspec": "^2.5 || ^3.2", - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5 || ^7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.10.x-dev" - } - }, - "autoload": { - "psr-4": { - "Prophecy\\": "src/Prophecy" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Konstantin Kudryashov", - "email": "ever.zet@gmail.com", - "homepage": "http://everzet.com" - }, - { - "name": "Marcello Duarte", - "email": "marcello.duarte@gmail.com" - } - ], - "description": "Highly opinionated mocking framework for PHP 5.3+", - "homepage": "https://github.com/phpspec/prophecy", - "keywords": [ - "Double", - "Dummy", - "fake", - "mock", - "spy", - "stub" - ], - "time": "2020-03-05T15:02:03+00:00" - }, - { - "name": "phpunit/php-code-coverage", - "version": "7.0.10", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "f1884187926fbb755a9aaf0b3836ad3165b478bf" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/f1884187926fbb755a9aaf0b3836ad3165b478bf", - "reference": "f1884187926fbb755a9aaf0b3836ad3165b478bf", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-xmlwriter": "*", - "php": "^7.2", - "phpunit/php-file-iterator": "^2.0.2", - "phpunit/php-text-template": "^1.2.1", - "phpunit/php-token-stream": "^3.1.1", - "sebastian/code-unit-reverse-lookup": "^1.0.1", - "sebastian/environment": "^4.2.2", - "sebastian/version": "^2.0.1", - "theseer/tokenizer": "^1.1.3" - }, - "require-dev": { - "phpunit/phpunit": "^8.2.2" - }, - "suggest": { - "ext-xdebug": "^2.7.2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "7.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", - "homepage": "https://github.com/sebastianbergmann/php-code-coverage", - "keywords": [ - "coverage", - "testing", - "xunit" - ], - "time": "2019-11-20T13:55:58+00:00" - }, - { - "name": "phpunit/php-file-iterator", - "version": "2.0.2", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "050bedf145a257b1ff02746c31894800e5122946" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/050bedf145a257b1ff02746c31894800e5122946", - "reference": "050bedf145a257b1ff02746c31894800e5122946", - "shasum": "" - }, - "require": { - "php": "^7.1" - }, - "require-dev": { - "phpunit/phpunit": "^7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "FilterIterator implementation that filters files based on a list of suffixes.", - "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", - "keywords": [ - "filesystem", - "iterator" - ], - "time": "2018-09-13T20:33:42+00:00" - }, - { - "name": "phpunit/php-text-template", - "version": "1.2.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-text-template.git", - "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686", - "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Simple template engine.", - "homepage": "https://github.com/sebastianbergmann/php-text-template/", - "keywords": [ - "template" - ], - "time": "2015-06-21T13:50:34+00:00" - }, - { - "name": "phpunit/php-timer", - "version": "2.1.2", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "1038454804406b0b5f5f520358e78c1c2f71501e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/1038454804406b0b5f5f520358e78c1c2f71501e", - "reference": "1038454804406b0b5f5f520358e78c1c2f71501e", - "shasum": "" - }, - "require": { - "php": "^7.1" - }, - "require-dev": { - "phpunit/phpunit": "^7.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.1-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Utility class for timing", - "homepage": "https://github.com/sebastianbergmann/php-timer/", - "keywords": [ - "timer" - ], - "time": "2019-06-07T04:22:29+00:00" - }, - { - "name": "phpunit/php-token-stream", - "version": "3.1.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-token-stream.git", - "reference": "995192df77f63a59e47f025390d2d1fdf8f425ff" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/995192df77f63a59e47f025390d2d1fdf8f425ff", - "reference": "995192df77f63a59e47f025390d2d1fdf8f425ff", - "shasum": "" - }, - "require": { - "ext-tokenizer": "*", - "php": "^7.1" - }, - "require-dev": { - "phpunit/phpunit": "^7.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.1-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Wrapper around PHP's tokenizer extension.", - "homepage": "https://github.com/sebastianbergmann/php-token-stream/", - "keywords": [ - "tokenizer" - ], - "time": "2019-09-17T06:23:10+00:00" - }, - { - "name": "phpunit/phpunit", - "version": "8.5.5", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "63dda3b212a0025d380a745f91bdb4d8c985adb7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/63dda3b212a0025d380a745f91bdb4d8c985adb7", - "reference": "63dda3b212a0025d380a745f91bdb4d8c985adb7", - "shasum": "" - }, - "require": { - "doctrine/instantiator": "^1.2.0", - "ext-dom": "*", - "ext-json": "*", - "ext-libxml": "*", - "ext-mbstring": "*", - "ext-xml": "*", - "ext-xmlwriter": "*", - "myclabs/deep-copy": "^1.9.1", - "phar-io/manifest": "^1.0.3", - "phar-io/version": "^2.0.1", - "php": "^7.2", - "phpspec/prophecy": "^1.8.1", - "phpunit/php-code-coverage": "^7.0.7", - "phpunit/php-file-iterator": "^2.0.2", - "phpunit/php-text-template": "^1.2.1", - "phpunit/php-timer": "^2.1.2", - "sebastian/comparator": "^3.0.2", - "sebastian/diff": "^3.0.2", - "sebastian/environment": "^4.2.2", - "sebastian/exporter": "^3.1.1", - "sebastian/global-state": "^3.0.0", - "sebastian/object-enumerator": "^3.0.3", - "sebastian/resource-operations": "^2.0.1", - "sebastian/type": "^1.1.3", - "sebastian/version": "^2.0.1" - }, - "require-dev": { - "ext-pdo": "*" - }, - "suggest": { - "ext-soap": "*", - "ext-xdebug": "*", - "phpunit/php-invoker": "^2.0.0" - }, - "bin": [ - "phpunit" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "8.5-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "The PHP Unit Testing framework.", - "homepage": "https://phpunit.de/", - "keywords": [ - "phpunit", - "testing", - "xunit" - ], - "time": "2020-05-22T13:51:52+00:00" - }, - { - "name": "psy/psysh", - "version": "v0.10.4", - "source": { - "type": "git", - "url": "https://github.com/bobthecow/psysh.git", - "reference": "a8aec1b2981ab66882a01cce36a49b6317dc3560" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/bobthecow/psysh/zipball/a8aec1b2981ab66882a01cce36a49b6317dc3560", - "reference": "a8aec1b2981ab66882a01cce36a49b6317dc3560", - "shasum": "" - }, - "require": { - "dnoegel/php-xdg-base-dir": "0.1.*", - "ext-json": "*", - "ext-tokenizer": "*", - "nikic/php-parser": "~4.0|~3.0|~2.0|~1.3", - "php": "^8.0 || ^7.0 || ^5.5.9", - "symfony/console": "~5.0|~4.0|~3.0|^2.4.2|~2.3.10", - "symfony/var-dumper": "~5.0|~4.0|~3.0|~2.7" - }, - "require-dev": { - "bamarni/composer-bin-plugin": "^1.2", - "hoa/console": "3.17.*" - }, - "suggest": { - "ext-pcntl": "Enabling the PCNTL extension makes PsySH a lot happier :)", - "ext-pdo-sqlite": "The doc command requires SQLite to work.", - "ext-posix": "If you have PCNTL, you'll want the POSIX extension as well.", - "ext-readline": "Enables support for arrow-key history navigation, and showing and manipulating command history.", - "hoa/console": "A pure PHP readline implementation. You'll want this if your PHP install doesn't already support readline or libedit." - }, - "bin": [ - "bin/psysh" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "0.10.x-dev" - } - }, - "autoload": { - "files": [ - "src/functions.php" - ], - "psr-4": { - "Psy\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Justin Hileman", - "email": "justin@justinhileman.info", - "homepage": "http://justinhileman.com" - } - ], - "description": "An interactive shell for modern PHP.", - "homepage": "http://psysh.org", - "keywords": [ - "REPL", - "console", - "interactive", - "shell" - ], - "time": "2020-05-03T19:32:03+00:00" - }, - { - "name": "roave/security-advisories", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/Roave/SecurityAdvisories.git", - "reference": "55922f51129488c246a776ff944463605d447da0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/55922f51129488c246a776ff944463605d447da0", - "reference": "55922f51129488c246a776ff944463605d447da0", - "shasum": "" - }, - "conflict": { - "3f/pygmentize": "<1.2", - "adodb/adodb-php": "<5.20.12", - "alterphp/easyadmin-extension-bundle": ">=1.2,<1.2.11|>=1.3,<1.3.1", - "amphp/artax": "<1.0.6|>=2,<2.0.6", - "amphp/http": "<1.0.1", - "api-platform/core": ">=2.2,<2.2.10|>=2.3,<2.3.6", - "asymmetricrypt/asymmetricrypt": ">=0,<9.9.99", - "aws/aws-sdk-php": ">=3,<3.2.1", - "bagisto/bagisto": "<0.1.5", - "barrelstrength/sprout-base-email": "<1.2.7", - "barrelstrength/sprout-forms": "<3.9", - "bolt/bolt": "<3.6.10", - "brightlocal/phpwhois": "<=4.2.5", - "buddypress/buddypress": "<5.1.2", - "bugsnag/bugsnag-laravel": ">=2,<2.0.2", - "cakephp/cakephp": ">=1.3,<1.3.18|>=2,<2.4.99|>=2.5,<2.5.99|>=2.6,<2.6.12|>=2.7,<2.7.6|>=3,<3.5.18|>=3.6,<3.6.15|>=3.7,<3.7.7", - "cart2quote/module-quotation": ">=4.1.6,<=4.4.5|>=5,<5.4.4", - "cartalyst/sentry": "<=2.1.6", - "centreon/centreon": "<18.10.8|>=19,<19.4.5", - "cesnet/simplesamlphp-module-proxystatistics": "<3.1", - "codeigniter/framework": "<=3.0.6", - "composer/composer": "<=1-alpha.11", - "contao-components/mediaelement": ">=2.14.2,<2.21.1", - "contao/core": ">=2,<3.5.39", - "contao/core-bundle": ">=4,<4.4.46|>=4.5,<4.8.6", - "contao/listing-bundle": ">=4,<4.4.8", - "datadog/dd-trace": ">=0.30,<0.30.2", - "david-garcia/phpwhois": "<=4.3.1", - "doctrine/annotations": ">=1,<1.2.7", - "doctrine/cache": ">=1,<1.3.2|>=1.4,<1.4.2", - "doctrine/common": ">=2,<2.4.3|>=2.5,<2.5.1", - "doctrine/dbal": ">=2,<2.0.8|>=2.1,<2.1.2", - "doctrine/doctrine-bundle": "<1.5.2", - "doctrine/doctrine-module": "<=0.7.1", - "doctrine/mongodb-odm": ">=1,<1.0.2", - "doctrine/mongodb-odm-bundle": ">=2,<3.0.1", - "doctrine/orm": ">=2,<2.4.8|>=2.5,<2.5.1", - "dolibarr/dolibarr": "<11.0.4", - "dompdf/dompdf": ">=0.6,<0.6.2", - "drupal/core": ">=7,<7.70|>=8,<8.7.14|>=8.8,<8.8.6", - "drupal/drupal": ">=7,<7.70|>=8,<8.7.14|>=8.8,<8.8.6", - "endroid/qr-code-bundle": "<3.4.2", - "enshrined/svg-sanitize": "<0.13.1", - "erusev/parsedown": "<1.7.2", - "ezsystems/demobundle": ">=5.4,<5.4.6.1", - "ezsystems/ezdemo-ls-extension": ">=5.4,<5.4.2.1", - "ezsystems/ezfind-ls": ">=5.3,<5.3.6.1|>=5.4,<5.4.11.1|>=2017.12,<2017.12.0.1", - "ezsystems/ezplatform": ">=1.7,<1.7.9.1|>=1.13,<1.13.5.1|>=2.5,<2.5.4", - "ezsystems/ezplatform-admin-ui": ">=1.3,<1.3.5|>=1.4,<1.4.6", - "ezsystems/ezplatform-admin-ui-assets": ">=4,<4.2", - "ezsystems/ezplatform-user": ">=1,<1.0.1", - "ezsystems/ezpublish-kernel": ">=5.3,<5.3.12.1|>=5.4,<5.4.14.1|>=6,<6.7.9.1|>=6.8,<6.13.6.2|>=7,<7.2.4.1|>=7.3,<7.3.2.1|>=7.5,<7.5.6.2", - "ezsystems/ezpublish-legacy": ">=5.3,<5.3.12.6|>=5.4,<5.4.14.1|>=2011,<2017.12.7.2|>=2018.6,<2018.6.1.4|>=2018.9,<2018.9.1.3|>=2019.3,<2019.3.4.2", - "ezsystems/repository-forms": ">=2.3,<2.3.2.1", - "ezyang/htmlpurifier": "<4.1.1", - "firebase/php-jwt": "<2", - "fooman/tcpdf": "<6.2.22", - "fossar/tcpdf-parser": "<6.2.22", - "friendsofsymfony/oauth2-php": "<1.3", - "friendsofsymfony/rest-bundle": ">=1.2,<1.2.2", - "friendsofsymfony/user-bundle": ">=1.2,<1.3.5", - "fuel/core": "<1.8.1", - "getgrav/grav": "<1.7-beta.8", - "gree/jose": "<=2.2", - "gregwar/rst": "<1.0.3", - "guzzlehttp/guzzle": ">=4-rc.2,<4.2.4|>=5,<5.3.1|>=6,<6.2.1", - "illuminate/auth": ">=4,<4.0.99|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.10", - "illuminate/cookie": ">=4,<=4.0.11|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.42|>=5.6,<5.6.30", - "illuminate/database": ">=4,<4.0.99|>=4.1,<4.1.29", - "illuminate/encryption": ">=4,<=4.0.11|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.40|>=5.6,<5.6.15", - "illuminate/view": ">=7,<7.1.2", - "ivankristianto/phpwhois": "<=4.3", - "james-heinrich/getid3": "<1.9.9", - "joomla/session": "<1.3.1", - "jsmitty12/phpwhois": "<5.1", - "kazist/phpwhois": "<=4.2.6", - "kreait/firebase-php": ">=3.2,<3.8.1", - "la-haute-societe/tcpdf": "<6.2.22", - "laravel/framework": ">=4,<4.0.99|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.42|>=5.6,<5.6.30|>=7,<7.1.2", - "laravel/socialite": ">=1,<1.0.99|>=2,<2.0.10", - "league/commonmark": "<0.18.3", - "librenms/librenms": "<1.53", - "magento/community-edition": ">=2,<2.2.10|>=2.3,<2.3.3", - "magento/magento1ce": "<1.9.4.3", - "magento/magento1ee": ">=1,<1.14.4.3", - "magento/product-community-edition": ">=2,<2.2.10|>=2.3,<2.3.2-p.2", - "monolog/monolog": ">=1.8,<1.12", - "namshi/jose": "<2.2", - "nzo/url-encryptor-bundle": ">=4,<4.3.2|>=5,<5.0.1", - "onelogin/php-saml": "<2.10.4", - "oneup/uploader-bundle": "<1.9.3|>=2,<2.1.5", - "openid/php-openid": "<2.3", - "oro/crm": ">=1.7,<1.7.4", - "oro/platform": ">=1.7,<1.7.4", - "padraic/humbug_get_contents": "<1.1.2", - "pagarme/pagarme-php": ">=0,<3", - "paragonie/random_compat": "<2", - "paypal/merchant-sdk-php": "<3.12", - "pear/archive_tar": "<1.4.4", - "phpfastcache/phpfastcache": ">=5,<5.0.13", - "phpmailer/phpmailer": "<6.1.6", - "phpmyadmin/phpmyadmin": "<4.9.2", - "phpoffice/phpexcel": "<1.8.2", - "phpoffice/phpspreadsheet": "<1.8", - "phpunit/phpunit": ">=4.8.19,<4.8.28|>=5.0.10,<5.6.3", - "phpwhois/phpwhois": "<=4.2.5", - "phpxmlrpc/extras": "<0.6.1", - "pimcore/pimcore": "<6.3", - "prestashop/autoupgrade": ">=4,<4.10.1", - "prestashop/gamification": "<2.3.2", - "prestashop/ps_facetedsearch": "<3.4.1", - "privatebin/privatebin": "<1.2.2|>=1.3,<1.3.2", - "propel/propel": ">=2-alpha.1,<=2-alpha.7", - "propel/propel1": ">=1,<=1.7.1", - "pusher/pusher-php-server": "<2.2.1", - "robrichards/xmlseclibs": "<3.0.4", - "sabre/dav": ">=1.6,<1.6.99|>=1.7,<1.7.11|>=1.8,<1.8.9", - "scheb/two-factor-bundle": ">=0,<3.26|>=4,<4.11", - "sensiolabs/connect": "<4.2.3", - "serluck/phpwhois": "<=4.2.6", - "shopware/shopware": "<5.3.7", - "silverstripe/admin": ">=1.0.3,<1.0.4|>=1.1,<1.1.1", - "silverstripe/assets": ">=1,<1.4.7|>=1.5,<1.5.2", - "silverstripe/cms": "<4.3.6|>=4.4,<4.4.4", - "silverstripe/comments": ">=1.3,<1.9.99|>=2,<2.9.99|>=3,<3.1.1", - "silverstripe/forum": "<=0.6.1|>=0.7,<=0.7.3", - "silverstripe/framework": "<4.4.5|>=4.5,<4.5.2", - "silverstripe/graphql": ">=2,<2.0.5|>=3,<3.1.2", - "silverstripe/registry": ">=2.1,<2.1.2|>=2.2,<2.2.1", - "silverstripe/restfulserver": ">=1,<1.0.9|>=2,<2.0.4", - "silverstripe/subsites": ">=2,<2.1.1", - "silverstripe/taxonomy": ">=1.3,<1.3.1|>=2,<2.0.1", - "silverstripe/userforms": "<3", - "simple-updates/phpwhois": "<=1", - "simplesamlphp/saml2": "<1.10.6|>=2,<2.3.8|>=3,<3.1.4", - "simplesamlphp/simplesamlphp": "<1.18.6", - "simplesamlphp/simplesamlphp-module-infocard": "<1.0.1", - "simplito/elliptic-php": "<1.0.6", - "slim/slim": "<2.6", - "smarty/smarty": "<3.1.33", - "socalnick/scn-social-auth": "<1.15.2", - "spoonity/tcpdf": "<6.2.22", - "squizlabs/php_codesniffer": ">=1,<2.8.1|>=3,<3.0.1", - "ssddanbrown/bookstack": "<0.29.2", - "stormpath/sdk": ">=0,<9.9.99", - "studio-42/elfinder": "<2.1.49", - "swiftmailer/swiftmailer": ">=4,<5.4.5", - "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,<1.1.19|>=1.2,<1.2.18|>=1.3,<1.3.13|>=1.4,<1.4.5|>=1.5,<1.5.1", - "sylius/resource-bundle": "<1.3.13|>=1.4,<1.4.6|>=1.5,<1.5.1|>=1.6,<1.6.3", - "sylius/sylius": "<1.3.16|>=1.4,<1.4.12|>=1.5,<1.5.9|>=1.6,<1.6.5", - "symbiote/silverstripe-multivaluefield": ">=3,<3.0.99", - "symbiote/silverstripe-versionedfiles": "<=2.0.3", - "symfony/cache": ">=3.1,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8", - "symfony/dependency-injection": ">=2,<2.0.17|>=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", - "symfony/error-handler": ">=4.4,<4.4.4|>=5,<5.0.4", - "symfony/form": ">=2.3,<2.3.35|>=2.4,<2.6.12|>=2.7,<2.7.50|>=2.8,<2.8.49|>=3,<3.4.20|>=4,<4.0.15|>=4.1,<4.1.9|>=4.2,<4.2.1", - "symfony/framework-bundle": ">=2,<2.3.18|>=2.4,<2.4.8|>=2.5,<2.5.2|>=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", - "symfony/http-foundation": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8|>=4.4,<4.4.7|>=5,<5.0.7", - "symfony/http-kernel": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8", - "symfony/intl": ">=2.7,<2.7.38|>=2.8,<2.8.31|>=3,<3.2.14|>=3.3,<3.3.13", - "symfony/mime": ">=4.3,<4.3.8", - "symfony/phpunit-bridge": ">=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", - "symfony/polyfill": ">=1,<1.10", - "symfony/polyfill-php55": ">=1,<1.10", - "symfony/proxy-manager-bridge": ">=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", - "symfony/routing": ">=2,<2.0.19", - "symfony/security": ">=2,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7|>=4.4,<4.4.7|>=5,<5.0.7", - "symfony/security-bundle": ">=2,<2.7.48|>=2.8,<2.8.41|>=3,<3.3.17|>=3.4,<3.4.11|>=4,<4.0.11", - "symfony/security-core": ">=2.4,<2.6.13|>=2.7,<2.7.9|>=2.7.30,<2.7.32|>=2.8,<2.8.37|>=3,<3.3.17|>=3.4,<3.4.7|>=4,<4.0.7", - "symfony/security-csrf": ">=2.4,<2.7.48|>=2.8,<2.8.41|>=3,<3.3.17|>=3.4,<3.4.11|>=4,<4.0.11", - "symfony/security-guard": ">=2.8,<2.8.41|>=3,<3.3.17|>=3.4,<3.4.11|>=4,<4.0.11", - "symfony/security-http": ">=2.3,<2.3.41|>=2.4,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.2.12|>=4.3,<4.3.8|>=4.4,<4.4.7|>=5,<5.0.7", - "symfony/serializer": ">=2,<2.0.11", - "symfony/symfony": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8|>=4.4,<4.4.7|>=5,<5.0.7", - "symfony/translation": ">=2,<2.0.17", - "symfony/validator": ">=2,<2.0.24|>=2.1,<2.1.12|>=2.2,<2.2.5|>=2.3,<2.3.3", - "symfony/var-exporter": ">=4.2,<4.2.12|>=4.3,<4.3.8", - "symfony/web-profiler-bundle": ">=2,<2.3.19|>=2.4,<2.4.9|>=2.5,<2.5.4", - "symfony/yaml": ">=2,<2.0.22|>=2.1,<2.1.7", - "t3g/svg-sanitizer": "<1.0.3", - "tecnickcom/tcpdf": "<6.2.22", - "thelia/backoffice-default-template": ">=2.1,<2.1.2", - "thelia/thelia": ">=2.1-beta.1,<2.1.3", - "theonedemon/phpwhois": "<=4.2.5", - "titon/framework": ">=0,<9.9.99", - "truckersmp/phpwhois": "<=4.3.1", - "twig/twig": "<1.38|>=2,<2.7", - "typo3/cms": ">=6.2,<6.2.30|>=7,<7.6.32|>=8,<8.7.30|>=9,<9.5.17|>=10,<10.4.2", - "typo3/cms-core": ">=8,<8.7.30|>=9,<9.5.17|>=10,<10.4.2", - "typo3/flow": ">=1,<1.0.4|>=1.1,<1.1.1|>=2,<2.0.1|>=2.3,<2.3.16|>=3,<3.0.10|>=3.1,<3.1.7|>=3.2,<3.2.7|>=3.3,<3.3.5", - "typo3/neos": ">=1.1,<1.1.3|>=1.2,<1.2.13|>=2,<2.0.4", - "typo3/phar-stream-wrapper": ">=1,<2.1.1|>=3,<3.1.1", - "ua-parser/uap-php": "<3.8", - "usmanhalalit/pixie": "<1.0.3|>=2,<2.0.2", - "verot/class.upload.php": "<=1.0.3|>=2,<=2.0.4", - "wallabag/tcpdf": "<6.2.22", - "willdurand/js-translation-bundle": "<2.1.1", - "yii2mod/yii2-cms": "<1.9.2", - "yiisoft/yii": ">=1.1.14,<1.1.15", - "yiisoft/yii2": "<2.0.15", - "yiisoft/yii2-bootstrap": "<2.0.4", - "yiisoft/yii2-dev": "<2.0.15", - "yiisoft/yii2-elasticsearch": "<2.0.5", - "yiisoft/yii2-gii": "<2.0.4", - "yiisoft/yii2-jui": "<2.0.4", - "yiisoft/yii2-redis": "<2.0.8", - "yourls/yourls": "<1.7.4", - "zendframework/zend-cache": ">=2.4,<2.4.8|>=2.5,<2.5.3", - "zendframework/zend-captcha": ">=2,<2.4.9|>=2.5,<2.5.2", - "zendframework/zend-crypt": ">=2,<2.4.9|>=2.5,<2.5.2", - "zendframework/zend-db": ">=2,<2.0.99|>=2.1,<2.1.99|>=2.2,<2.2.10|>=2.3,<2.3.5", - "zendframework/zend-developer-tools": ">=1.2.2,<1.2.3", - "zendframework/zend-diactoros": ">=1,<1.8.4", - "zendframework/zend-feed": ">=1,<2.10.3", - "zendframework/zend-form": ">=2,<2.2.7|>=2.3,<2.3.1", - "zendframework/zend-http": ">=1,<2.8.1", - "zendframework/zend-json": ">=2.1,<2.1.6|>=2.2,<2.2.6", - "zendframework/zend-ldap": ">=2,<2.0.99|>=2.1,<2.1.99|>=2.2,<2.2.8|>=2.3,<2.3.3", - "zendframework/zend-mail": ">=2,<2.4.11|>=2.5,<2.7.2", - "zendframework/zend-navigation": ">=2,<2.2.7|>=2.3,<2.3.1", - "zendframework/zend-session": ">=2,<2.0.99|>=2.1,<2.1.99|>=2.2,<2.2.9|>=2.3,<2.3.4", - "zendframework/zend-validator": ">=2.3,<2.3.6", - "zendframework/zend-view": ">=2,<2.2.7|>=2.3,<2.3.1", - "zendframework/zend-xmlrpc": ">=2.1,<2.1.6|>=2.2,<2.2.6", - "zendframework/zendframework": "<2.5.1", - "zendframework/zendframework1": "<1.12.20", - "zendframework/zendopenid": ">=2,<2.0.2", - "zendframework/zendxml": ">=1,<1.0.1", - "zetacomponents/mail": "<1.8.2", - "zf-commons/zfc-user": "<1.2.2", - "zfcampus/zf-apigility-doctrine": ">=1,<1.0.3", - "zfr/zfr-oauth2-server-module": "<0.1.2" - }, - "type": "metapackage", - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com", - "role": "maintainer" - }, - { - "name": "Ilya Tribusean", - "email": "slash3b@gmail.com", - "role": "maintainer" - } - ], - "description": "Prevents installation of composer packages with known security vulnerabilities: no API, simply require it", - "time": "2020-05-28T00:01:39+00:00" - }, - { - "name": "scrivo/highlight.php", - "version": "v9.18.1.1", - "source": { - "type": "git", - "url": "https://github.com/scrivo/highlight.php.git", - "reference": "52fc21c99fd888e33aed4879e55a3646f8d40558" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/scrivo/highlight.php/zipball/52fc21c99fd888e33aed4879e55a3646f8d40558", - "reference": "52fc21c99fd888e33aed4879e55a3646f8d40558", - "shasum": "" - }, - "require": { - "ext-json": "*", - "ext-mbstring": "*", - "php": ">=5.4" - }, - "require-dev": { - "phpunit/phpunit": "^4.8|^5.7", - "sabberworm/php-css-parser": "^8.3", - "symfony/finder": "^2.8|^3.4", - "symfony/var-dumper": "^2.8|^3.4" - }, - "suggest": { - "ext-dom": "Needed to make use of the features in the utilities namespace" - }, - "type": "library", - "autoload": { - "psr-0": { - "Highlight\\": "", - "HighlightUtilities\\": "" - }, - "files": [ - "HighlightUtilities/functions.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Geert Bergman", - "homepage": "http://www.scrivo.org/", - "role": "Project Author" - }, - { - "name": "Vladimir Jimenez", - "homepage": "https://allejo.io", - "role": "Maintainer" - }, - { - "name": "Martin Folkers", - "homepage": "https://twobrain.io", - "role": "Contributor" - } - ], - "description": "Server side syntax highlighter that supports 185 languages. It's a PHP port of highlight.js", - "keywords": [ - "code", - "highlight", - "highlight.js", - "highlight.php", - "syntax" - ], - "time": "2020-03-02T05:59:21+00:00" - }, - { - "name": "sebastian/code-unit-reverse-lookup", - "version": "1.0.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", - "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", - "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", - "shasum": "" - }, - "require": { - "php": "^5.6 || ^7.0" - }, - "require-dev": { - "phpunit/phpunit": "^5.7 || ^6.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Looks up which function or method a line of code belongs to", - "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", - "time": "2017-03-04T06:30:41+00:00" - }, - { - "name": "sebastian/comparator", - "version": "3.0.2", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "5de4fc177adf9bce8df98d8d141a7559d7ccf6da" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/5de4fc177adf9bce8df98d8d141a7559d7ccf6da", - "reference": "5de4fc177adf9bce8df98d8d141a7559d7ccf6da", - "shasum": "" - }, - "require": { - "php": "^7.1", - "sebastian/diff": "^3.0", - "sebastian/exporter": "^3.1" - }, - "require-dev": { - "phpunit/phpunit": "^7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Volker Dusch", - "email": "github@wallbash.com" - }, - { - "name": "Bernhard Schussek", - "email": "bschussek@2bepublished.at" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Provides the functionality to compare PHP values for equality", - "homepage": "https://github.com/sebastianbergmann/comparator", - "keywords": [ - "comparator", - "compare", - "equality" - ], - "time": "2018-07-12T15:12:46+00:00" - }, - { - "name": "sebastian/diff", - "version": "3.0.2", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "720fcc7e9b5cf384ea68d9d930d480907a0c1a29" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/720fcc7e9b5cf384ea68d9d930d480907a0c1a29", - "reference": "720fcc7e9b5cf384ea68d9d930d480907a0c1a29", - "shasum": "" - }, - "require": { - "php": "^7.1" - }, - "require-dev": { - "phpunit/phpunit": "^7.5 || ^8.0", - "symfony/process": "^2 || ^3.3 || ^4" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Kore Nordmann", - "email": "mail@kore-nordmann.de" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Diff implementation", - "homepage": "https://github.com/sebastianbergmann/diff", - "keywords": [ - "diff", - "udiff", - "unidiff", - "unified diff" - ], - "time": "2019-02-04T06:01:07+00:00" - }, - { - "name": "sebastian/environment", - "version": "4.2.3", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "464c90d7bdf5ad4e8a6aea15c091fec0603d4368" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/464c90d7bdf5ad4e8a6aea15c091fec0603d4368", - "reference": "464c90d7bdf5ad4e8a6aea15c091fec0603d4368", - "shasum": "" - }, - "require": { - "php": "^7.1" - }, - "require-dev": { - "phpunit/phpunit": "^7.5" - }, - "suggest": { - "ext-posix": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.2-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Provides functionality to handle HHVM/PHP environments", - "homepage": "http://www.github.com/sebastianbergmann/environment", - "keywords": [ - "Xdebug", - "environment", - "hhvm" - ], - "time": "2019-11-20T08:46:58+00:00" - }, - { - "name": "sebastian/exporter", - "version": "3.1.2", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "68609e1261d215ea5b21b7987539cbfbe156ec3e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/68609e1261d215ea5b21b7987539cbfbe156ec3e", - "reference": "68609e1261d215ea5b21b7987539cbfbe156ec3e", - "shasum": "" - }, - "require": { - "php": "^7.0", - "sebastian/recursion-context": "^3.0" - }, - "require-dev": { - "ext-mbstring": "*", - "phpunit/phpunit": "^6.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.1.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Volker Dusch", - "email": "github@wallbash.com" - }, - { - "name": "Adam Harvey", - "email": "aharvey@php.net" - }, - { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" - } - ], - "description": "Provides the functionality to export PHP variables for visualization", - "homepage": "http://www.github.com/sebastianbergmann/exporter", - "keywords": [ - "export", - "exporter" - ], - "time": "2019-09-14T09:02:43+00:00" - }, - { - "name": "sebastian/global-state", - "version": "3.0.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "edf8a461cf1d4005f19fb0b6b8b95a9f7fa0adc4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/edf8a461cf1d4005f19fb0b6b8b95a9f7fa0adc4", - "reference": "edf8a461cf1d4005f19fb0b6b8b95a9f7fa0adc4", - "shasum": "" - }, - "require": { - "php": "^7.2", - "sebastian/object-reflector": "^1.1.1", - "sebastian/recursion-context": "^3.0" - }, - "require-dev": { - "ext-dom": "*", - "phpunit/phpunit": "^8.0" - }, - "suggest": { - "ext-uopz": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Snapshotting of global state", - "homepage": "http://www.github.com/sebastianbergmann/global-state", - "keywords": [ - "global state" - ], - "time": "2019-02-01T05:30:01+00:00" - }, - { - "name": "sebastian/object-enumerator", - "version": "3.0.3", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/object-enumerator.git", - "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/7cfd9e65d11ffb5af41198476395774d4c8a84c5", - "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5", - "shasum": "" - }, - "require": { - "php": "^7.0", - "sebastian/object-reflector": "^1.1.1", - "sebastian/recursion-context": "^3.0" - }, - "require-dev": { - "phpunit/phpunit": "^6.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Traverses array structures and object graphs to enumerate all referenced objects", - "homepage": "https://github.com/sebastianbergmann/object-enumerator/", - "time": "2017-08-03T12:35:26+00:00" - }, - { - "name": "sebastian/object-reflector", - "version": "1.1.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/object-reflector.git", - "reference": "773f97c67f28de00d397be301821b06708fca0be" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/773f97c67f28de00d397be301821b06708fca0be", - "reference": "773f97c67f28de00d397be301821b06708fca0be", - "shasum": "" - }, - "require": { - "php": "^7.0" - }, - "require-dev": { - "phpunit/phpunit": "^6.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Allows reflection of object attributes, including inherited and non-public ones", - "homepage": "https://github.com/sebastianbergmann/object-reflector/", - "time": "2017-03-29T09:07:27+00:00" - }, - { - "name": "sebastian/recursion-context", - "version": "3.0.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8", - "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8", - "shasum": "" - }, - "require": { - "php": "^7.0" - }, - "require-dev": { - "phpunit/phpunit": "^6.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Adam Harvey", - "email": "aharvey@php.net" - } - ], - "description": "Provides functionality to recursively process PHP variables", - "homepage": "http://www.github.com/sebastianbergmann/recursion-context", - "time": "2017-03-03T06:23:57+00:00" - }, - { - "name": "sebastian/resource-operations", - "version": "2.0.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/resource-operations.git", - "reference": "4d7a795d35b889bf80a0cc04e08d77cedfa917a9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/4d7a795d35b889bf80a0cc04e08d77cedfa917a9", - "reference": "4d7a795d35b889bf80a0cc04e08d77cedfa917a9", - "shasum": "" - }, - "require": { - "php": "^7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Provides a list of PHP built-in functions that operate on resources", - "homepage": "https://www.github.com/sebastianbergmann/resource-operations", - "time": "2018-10-04T04:07:39+00:00" - }, - { - "name": "sebastian/type", - "version": "1.1.3", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/type.git", - "reference": "3aaaa15fa71d27650d62a948be022fe3b48541a3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/3aaaa15fa71d27650d62a948be022fe3b48541a3", - "reference": "3aaaa15fa71d27650d62a948be022fe3b48541a3", - "shasum": "" - }, - "require": { - "php": "^7.2" - }, - "require-dev": { - "phpunit/phpunit": "^8.2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Collection of value objects that represent the types of the PHP type system", - "homepage": "https://github.com/sebastianbergmann/type", - "time": "2019-07-02T08:10:15+00:00" - }, - { - "name": "sebastian/version", - "version": "2.0.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/version.git", - "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019", - "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019", - "shasum": "" - }, - "require": { - "php": ">=5.6" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library that helps with managing the version number of Git-hosted PHP projects", - "homepage": "https://github.com/sebastianbergmann/version", - "time": "2016-10-03T07:35:21+00:00" - }, - { - "name": "seld/jsonlint", - "version": "1.8.0", - "source": { - "type": "git", - "url": "https://github.com/Seldaek/jsonlint.git", - "reference": "ff2aa5420bfbc296cf6a0bc785fa5b35736de7c1" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/ff2aa5420bfbc296cf6a0bc785fa5b35736de7c1", - "reference": "ff2aa5420bfbc296cf6a0bc785fa5b35736de7c1", - "shasum": "" - }, - "require": { - "php": "^5.3 || ^7.0 || ^8.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" - }, - "bin": [ - "bin/jsonlint" - ], - "type": "library", - "autoload": { - "psr-4": { - "Seld\\JsonLint\\": "src/Seld/JsonLint/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - } - ], - "description": "JSON Linter", - "keywords": [ - "json", - "linter", - "parser", - "validator" - ], - "time": "2020-04-30T19:05:18+00:00" - }, - { - "name": "seld/phar-utils", - "version": "1.1.0", - "source": { - "type": "git", - "url": "https://github.com/Seldaek/phar-utils.git", - "reference": "8800503d56b9867d43d9c303b9cbcc26016e82f0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Seldaek/phar-utils/zipball/8800503d56b9867d43d9c303b9cbcc26016e82f0", - "reference": "8800503d56b9867d43d9c303b9cbcc26016e82f0", - "shasum": "" - }, - "require": { - "php": ">=5.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Seld\\PharUtils\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be" - } - ], - "description": "PHAR file format utilities, for when PHP phars you up", - "keywords": [ - "phar" - ], - "time": "2020-02-14T15:25:33+00:00" - }, - { - "name": "squizlabs/php_codesniffer", - "version": "3.5.5", - "source": { - "type": "git", - "url": "https://github.com/squizlabs/PHP_CodeSniffer.git", - "reference": "73e2e7f57d958e7228fce50dc0c61f58f017f9f6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/73e2e7f57d958e7228fce50dc0c61f58f017f9f6", - "reference": "73e2e7f57d958e7228fce50dc0c61f58f017f9f6", - "shasum": "" - }, - "require": { - "ext-simplexml": "*", - "ext-tokenizer": "*", - "ext-xmlwriter": "*", - "php": ">=5.4.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0" - }, - "bin": [ - "bin/phpcs", - "bin/phpcbf" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.x-dev" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Greg Sherwood", - "role": "lead" - } - ], - "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.", - "homepage": "https://github.com/squizlabs/PHP_CodeSniffer", - "keywords": [ - "phpcs", - "standards" - ], - "time": "2020-04-17T01:09:41+00:00" - }, - { - "name": "symfony/debug", - "version": "v4.4.9", - "source": { - "type": "git", - "url": "https://github.com/symfony/debug.git", - "reference": "28f92d08bb6d1fddf8158e02c194ad43870007e6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/debug/zipball/28f92d08bb6d1fddf8158e02c194ad43870007e6", - "reference": "28f92d08bb6d1fddf8158e02c194ad43870007e6", - "shasum": "" - }, - "require": { - "php": ">=7.1.3", - "psr/log": "~1.0", - "symfony/polyfill-php80": "^1.15" - }, - "conflict": { - "symfony/http-kernel": "<3.4" - }, - "require-dev": { - "symfony/http-kernel": "^3.4|^4.0|^5.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.4-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\Debug\\": "" - }, - "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": "Symfony Debug Component", - "homepage": "https://symfony.com", - "time": "2020-05-24T08:33:35+00:00" - }, - { - "name": "symfony/filesystem", - "version": "v5.1.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/filesystem.git", - "reference": "6e4320f06d5f2cce0d96530162491f4465179157" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/6e4320f06d5f2cce0d96530162491f4465179157", - "reference": "6e4320f06d5f2cce0d96530162491f4465179157", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/polyfill-ctype": "~1.8" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.1-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\Filesystem\\": "" - }, - "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": "Symfony Filesystem Component", - "homepage": "https://symfony.com", - "time": "2020-05-30T20:35:19+00:00" - }, - { - "name": "theseer/tokenizer", - "version": "1.1.3", - "source": { - "type": "git", - "url": "https://github.com/theseer/tokenizer.git", - "reference": "11336f6f84e16a720dae9d8e6ed5019efa85a0f9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/11336f6f84e16a720dae9d8e6ed5019efa85a0f9", - "reference": "11336f6f84e16a720dae9d8e6ed5019efa85a0f9", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-tokenizer": "*", - "ext-xmlwriter": "*", - "php": "^7.0" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - } - ], - "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", - "time": "2019-06-13T22:48:21+00:00" - }, - { - "name": "webmozart/assert", - "version": "1.8.0", - "source": { - "type": "git", - "url": "https://github.com/webmozart/assert.git", - "reference": "ab2cb0b3b559010b75981b1bdce728da3ee90ad6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/webmozart/assert/zipball/ab2cb0b3b559010b75981b1bdce728da3ee90ad6", - "reference": "ab2cb0b3b559010b75981b1bdce728da3ee90ad6", - "shasum": "" - }, - "require": { - "php": "^5.3.3 || ^7.0", - "symfony/polyfill-ctype": "^1.8" - }, - "conflict": { - "vimeo/psalm": "<3.9.1" - }, - "require-dev": { - "phpunit/phpunit": "^4.8.36 || ^7.5.13" - }, - "type": "library", - "autoload": { - "psr-4": { - "Webmozart\\Assert\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" - } - ], - "description": "Assertions to validate method input/output with nice error messages.", - "keywords": [ - "assert", - "check", - "validate" - ], - "time": "2020-04-18T12:12:48+00:00" - } - ], - "aliases": [], - "minimum-stability": "dev", - "stability-flags": { - "roave/security-advisories": 20 - }, - "prefer-stable": true, - "prefer-lowest": false, - "platform": { - "php": "^7.2.5" - }, - "platform-dev": [] + "platform-dev": [] } From e5b960ad0bd80962f0536609ac41d192650e1208 Mon Sep 17 00:00:00 2001 From: Kovah Date: Wed, 24 Jun 2020 21:02:47 +0200 Subject: [PATCH 26/44] Update of NPM dependencies --- package-lock.json | 36 ++++++++++++++++++------------------ package.json | 8 ++++---- 2 files changed, 22 insertions(+), 22 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9316d9cc..042dc002 100644 --- a/package-lock.json +++ b/package-lock.json @@ -920,32 +920,32 @@ } }, "@fortawesome/fontawesome-common-types": { - "version": "0.2.28", - "resolved": "https://npm.fontawesome.com/@fortawesome/fontawesome-common-types/-/0.2.28/fontawesome-common-types-0.2.28.tgz", - "integrity": "sha512-gtis2/5yLdfI6n0ia0jH7NJs5i/Z/8M/ZbQL6jXQhCthEOe5Cr5NcQPhgTvFxNOtURE03/ZqUcEskdn2M+QaBg==" + "version": "0.2.29", + "resolved": "https://npm.fontawesome.com/@fortawesome/fontawesome-common-types/-/0.2.29/fontawesome-common-types-0.2.29.tgz", + "integrity": "sha512-cY+QfDTbZ7XVxzx7jxbC98Oxr/zc7R2QpTLqTxqlfyXDrAJjzi/xUIqAUsygELB62JIrbsWxtSRhayKFkGI7MA==" }, "@fortawesome/fontawesome-svg-core": { - "version": "1.2.28", - "resolved": "https://npm.fontawesome.com/@fortawesome/fontawesome-svg-core/-/1.2.28/fontawesome-svg-core-1.2.28.tgz", - "integrity": "sha512-4LeaNHWvrneoU0i8b5RTOJHKx7E+y7jYejplR7uSVB34+mp3Veg7cbKk7NBCLiI4TyoWS1wh9ZdoyLJR8wSAdg==", + "version": "1.2.29", + "resolved": "https://npm.fontawesome.com/@fortawesome/fontawesome-svg-core/-/1.2.29/fontawesome-svg-core-1.2.29.tgz", + "integrity": "sha512-xmPmP2t8qrdo8RyKihTkGb09RnZoc+7HFBCnr0/6ZhStdGDSLeEd7ajV181+2W29NWIFfylO13rU+s3fpy3cnA==", "requires": { - "@fortawesome/fontawesome-common-types": "^0.2.28" + "@fortawesome/fontawesome-common-types": "^0.2.29" } }, "@fortawesome/free-brands-svg-icons": { - "version": "5.13.0", - "resolved": "https://npm.fontawesome.com/@fortawesome/free-brands-svg-icons/-/5.13.0/free-brands-svg-icons-5.13.0.tgz", - "integrity": "sha512-/6xXiJFCMEQxqxXbL0FPJpwq5Cv6MRrjsbJEmH/t5vOvB4dILDpnY0f7zZSlA8+TG7jwlt12miF/yZpZkykucA==", + "version": "5.13.1", + "resolved": "https://npm.fontawesome.com/@fortawesome/free-brands-svg-icons/-/5.13.1/free-brands-svg-icons-5.13.1.tgz", + "integrity": "sha512-dKwF+NpIV2LVCNBA7hibH53k+ChF4Wu59P2z35gu3zwRBZpmpLVhS9k1/RiSqUqkyXUQvA2rSv48GY6wp5axZQ==", "requires": { - "@fortawesome/fontawesome-common-types": "^0.2.28" + "@fortawesome/fontawesome-common-types": "^0.2.29" } }, "@fortawesome/free-solid-svg-icons": { - "version": "5.13.0", - "resolved": "https://npm.fontawesome.com/@fortawesome/free-solid-svg-icons/-/5.13.0/free-solid-svg-icons-5.13.0.tgz", - "integrity": "sha512-IHUgDJdomv6YtG4p3zl1B5wWf9ffinHIvebqQOmV3U+3SLw4fC+LUCCgwfETkbTtjy5/Qws2VoVf6z/ETQpFpg==", + "version": "5.13.1", + "resolved": "https://npm.fontawesome.com/@fortawesome/free-solid-svg-icons/-/5.13.1/free-solid-svg-icons-5.13.1.tgz", + "integrity": "sha512-LQH/0L1p4+rqtoSHa9qFYR84hpuRZKqaQ41cfBQx8b68p21zoWSekTAeA54I/2x9VlCHDLFlG74Nmdg4iTPQOg==", "requires": { - "@fortawesome/fontawesome-common-types": "^0.2.28" + "@fortawesome/fontawesome-common-types": "^0.2.29" } }, "@mrmlnc/readdir-enhanced": { @@ -8202,9 +8202,9 @@ "dev": true }, "sass": { - "version": "1.26.7", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.26.7.tgz", - "integrity": "sha512-xgNazdkr6yvgHEfNaOjKtZzhDZmKYMCmoRKMPrTDo7YvjaITIzU2DDYsIUuN/atAg7/JOxPeCQHH7TtCo5Tq2g==", + "version": "1.26.9", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.26.9.tgz", + "integrity": "sha512-t8AkRVi+xvba4yZiLWkJdgJHBFCB3Dh4johniQkPy9ywkgFHNasXFEFP+RG/F6LhQ+aoE4aX+IorIWQjS0esVw==", "dev": true, "requires": { "chokidar": ">=2.0.0 <4.0.0" diff --git a/package.json b/package.json index fd686903..6e5d1848 100755 --- a/package.json +++ b/package.json @@ -16,14 +16,14 @@ "cross-env": "^6.0.3", "laravel-mix": "^5.0.4", "resolve-url-loader": "^3.1.1", - "sass": "^1.26.7", + "sass": "^1.26.9", "sass-loader": "^8.0.2", "vue-template-compiler": "^2.6.11" }, "dependencies": { - "@fortawesome/fontawesome-svg-core": "^1.2.28", - "@fortawesome/free-brands-svg-icons": "^5.13.0", - "@fortawesome/free-solid-svg-icons": "^5.13.0", + "@fortawesome/fontawesome-svg-core": "^1.2.29", + "@fortawesome/free-brands-svg-icons": "^5.13.1", + "@fortawesome/free-solid-svg-icons": "^5.13.1", "bootstrap": "^4.5.0", "jquery": "^3.5.1", "popper.js": "^1.16.1", From 1717f32ed8a70a300005134bc7e940915ed196d3 Mon Sep 17 00:00:00 2001 From: Kovah Date: Wed, 24 Jun 2020 21:02:58 +0200 Subject: [PATCH 27/44] Large refactoring or code styling and documentation of the application controllers --- .gitignore | 1 + .../Controllers/API/LinkCheckController.php | 2 +- app/Http/Controllers/API/LinkController.php | 29 +++++----- .../Controllers/API/LinkNotesController.php | 2 +- app/Http/Controllers/API/ListController.php | 29 +++++----- .../Controllers/API/ListLinksController.php | 2 +- app/Http/Controllers/API/NoteController.php | 17 +++--- app/Http/Controllers/API/TagController.php | 29 +++++----- .../Controllers/API/TagLinksController.php | 2 +- .../Controllers/App/BookmarkletController.php | 44 +++++++-------- .../Controllers/App/DashboardController.php | 25 ++++----- app/Http/Controllers/App/ExportController.php | 15 +++--- app/Http/Controllers/App/ImportController.php | 14 ++--- app/Http/Controllers/App/SearchController.php | 18 +++---- .../App/SystemSettingsController.php | 16 +++--- app/Http/Controllers/App/TrashController.php | 22 ++++---- .../App/UserSettingsController.php | 38 ++++++------- .../Auth/ForgotPasswordController.php | 5 -- app/Http/Controllers/Auth/LoginController.php | 5 -- .../Controllers/Auth/RegisterController.php | 11 ++-- .../Auth/ResetPasswordController.php | 5 -- app/Http/Controllers/Controller.php | 4 +- app/Http/Controllers/CronController.php | 3 ++ app/Http/Controllers/FetchController.php | 31 +++++++++-- app/Http/Controllers/FrontController.php | 6 ++- app/Http/Controllers/Guest/LinkController.php | 13 ++--- app/Http/Controllers/Guest/ListController.php | 41 ++++++-------- app/Http/Controllers/Guest/TagController.php | 35 ++++-------- .../Controllers/Models/LinkController.php | 41 +++++++------- .../Controllers/Models/ListController.php | 45 ++++++++-------- .../Controllers/Models/NoteController.php | 18 +++---- app/Http/Controllers/Models/TagController.php | 53 ++++++++----------- .../Controllers/Setup/AccountController.php | 12 ++--- .../Controllers/Setup/DatabaseController.php | 24 ++++----- app/Http/Controllers/Setup/MetaController.php | 26 ++++++--- .../Setup/RequirementsController.php | 12 ++--- app/Http/Controllers/Traits/SearchesLinks.php | 10 +++- .../Requests/UserAccountUpdateRequest.php | 4 +- 38 files changed, 335 insertions(+), 374 deletions(-) diff --git a/.gitignore b/.gitignore index 5bb53058..604d1f4a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ /node_modules +/logs /public/hot /public/storage /public/mix-manifest.json diff --git a/app/Http/Controllers/API/LinkCheckController.php b/app/Http/Controllers/API/LinkCheckController.php index 8103a312..4385db95 100644 --- a/app/Http/Controllers/API/LinkCheckController.php +++ b/app/Http/Controllers/API/LinkCheckController.php @@ -10,7 +10,7 @@ class LinkCheckController extends Controller { /** - * Search for a link based on a given url + * Search for a link based on a given url. * * @param Request $request * @return JsonResponse diff --git a/app/Http/Controllers/API/LinkController.php b/app/Http/Controllers/API/LinkController.php index 8b434f31..68f0e0c3 100644 --- a/app/Http/Controllers/API/LinkController.php +++ b/app/Http/Controllers/API/LinkController.php @@ -8,6 +8,7 @@ use App\Http\Requests\Models\LinkUpdateRequest; use App\Models\Link; use App\Repositories\LinkRepository; +use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; use Illuminate\Http\Response; @@ -17,14 +18,14 @@ class LinkController extends Controller * Display a listing of the resource. * * @param Request $request - * @return Response + * @return JsonResponse */ - public function index(Request $request) + public function index(Request $request): JsonResponse { $links = Link::byUser(auth()->id()) ->orderBy( - $request->get('order_by', 'created_at'), - $request->get('order_dir', 'DESC') + $request->input('order_by', 'created_at'), + $request->input('order_dir', 'DESC') ) ->paginate(getPaginationLimit()); @@ -35,9 +36,9 @@ public function index(Request $request) * Store a newly created resource in storage. * * @param LinkStoreRequest $request - * @return Response + * @return JsonResponse */ - public function store(LinkStoreRequest $request) + public function store(LinkStoreRequest $request): JsonResponse { $link = LinkRepository::create($request->all()); @@ -48,9 +49,9 @@ public function store(LinkStoreRequest $request) * Display the specified resource. * * @param int $id - * @return Response + * @return JsonResponse */ - public function show($id) + public function show($id): JsonResponse { $link = Link::with(['lists', 'tags'])->findOrFail($id); @@ -62,9 +63,9 @@ public function show($id) * * @param LinkUpdateRequest $request * @param int $id - * @return Response + * @return JsonResponse */ - public function update(LinkUpdateRequest $request, $id) + public function update(LinkUpdateRequest $request, $id): JsonResponse { $link = Link::findOrFail($id); @@ -78,18 +79,18 @@ public function update(LinkUpdateRequest $request, $id) * * @param LinkDeleteRequest $request * @param int $id - * @return Response + * @return JsonResponse */ - public function destroy(LinkDeleteRequest $request, $id) + public function destroy(LinkDeleteRequest $request, $id): JsonResponse { $link = Link::findOrFail($id); $deletionSuccessfull = LinkRepository::delete($link); if ($deletionSuccessfull) { - return response(null, Response::HTTP_OK); + return response()->json(null, Response::HTTP_OK); } - return response(null, Response::HTTP_INTERNAL_SERVER_ERROR); + return response()->json(null, Response::HTTP_INTERNAL_SERVER_ERROR); } } diff --git a/app/Http/Controllers/API/LinkNotesController.php b/app/Http/Controllers/API/LinkNotesController.php index d2efb1e6..f8e6a627 100644 --- a/app/Http/Controllers/API/LinkNotesController.php +++ b/app/Http/Controllers/API/LinkNotesController.php @@ -9,7 +9,7 @@ class LinkNotesController extends Controller { /** - * Get the notes for a specific link + * Get the notes for a specific link. * * @param $linkID * @return JsonResponse diff --git a/app/Http/Controllers/API/ListController.php b/app/Http/Controllers/API/ListController.php index aaad4b7c..1f4283bf 100644 --- a/app/Http/Controllers/API/ListController.php +++ b/app/Http/Controllers/API/ListController.php @@ -8,6 +8,7 @@ use App\Http\Requests\Models\ListUpdateRequest; use App\Models\LinkList; use App\Repositories\ListRepository; +use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; use Illuminate\Http\Response; @@ -17,14 +18,14 @@ class ListController extends Controller * Display a listing of the resource. * * @param Request $request - * @return Response + * @return JsonResponse */ - public function index(Request $request) + public function index(Request $request): JsonResponse { $lists = LinkList::byUser(auth()->id()) ->orderBy( - $request->get('order_by', 'created_at'), - $request->get('order_dir', 'DESC') + $request->input('order_by', 'created_at'), + $request->input('order_dir', 'DESC') ) ->paginate(getPaginationLimit()); @@ -35,9 +36,9 @@ public function index(Request $request) * Store a newly created resource in storage. * * @param ListStoreRequest $request - * @return Response + * @return JsonResponse */ - public function store(ListStoreRequest $request) + public function store(ListStoreRequest $request): JsonResponse { $link = ListRepository::create($request->all()); @@ -48,9 +49,9 @@ public function store(ListStoreRequest $request) * Display the specified resource. * * @param int $id - * @return Response + * @return JsonResponse */ - public function show($id) + public function show($id): JsonResponse { $list = LinkList::findOrFail($id); @@ -64,9 +65,9 @@ public function show($id) * * @param ListUpdateRequest $request * @param int $id - * @return Response + * @return JsonResponse */ - public function update(ListUpdateRequest $request, $id) + public function update(ListUpdateRequest $request, $id): JsonResponse { $list = LinkList::findOrFail($id); @@ -80,18 +81,18 @@ public function update(ListUpdateRequest $request, $id) * * @param ListDeleteRequest $request * @param int $id - * @return Response + * @return JsonResponse */ - public function destroy(ListDeleteRequest $request, $id) + public function destroy(ListDeleteRequest $request, $id): JsonResponse { $list = LinkList::findOrFail($id); $deletionSuccessfull = ListRepository::delete($list); if ($deletionSuccessfull) { - return response(null, Response::HTTP_OK); + return response()->json(null, Response::HTTP_OK); } - return response(null, Response::HTTP_INTERNAL_SERVER_ERROR); + return response()->json(null, Response::HTTP_INTERNAL_SERVER_ERROR); } } diff --git a/app/Http/Controllers/API/ListLinksController.php b/app/Http/Controllers/API/ListLinksController.php index 7f324fb4..7c1cde82 100644 --- a/app/Http/Controllers/API/ListLinksController.php +++ b/app/Http/Controllers/API/ListLinksController.php @@ -9,7 +9,7 @@ class ListLinksController extends Controller { /** - * Get the links for a specific list + * Get the links for a specific list. * * @param $listID * @return JsonResponse diff --git a/app/Http/Controllers/API/NoteController.php b/app/Http/Controllers/API/NoteController.php index d95418e8..5f7cc498 100644 --- a/app/Http/Controllers/API/NoteController.php +++ b/app/Http/Controllers/API/NoteController.php @@ -8,6 +8,7 @@ use App\Http\Requests\Models\NoteUpdateRequest; use App\Models\Note; use App\Repositories\NoteRepository; +use Illuminate\Http\JsonResponse; use Illuminate\Http\Response; class NoteController extends Controller @@ -16,9 +17,9 @@ class NoteController extends Controller * Store a newly created resource in storage. * * @param NoteStoreRequest $request - * @return Response + * @return JsonResponse */ - public function store(NoteStoreRequest $request) + public function store(NoteStoreRequest $request): JsonResponse { $note = NoteRepository::create($request->all()); @@ -30,9 +31,9 @@ public function store(NoteStoreRequest $request) * * @param NoteUpdateRequest $request * @param int $id - * @return Response + * @return JsonResponse */ - public function update(NoteUpdateRequest $request, $id) + public function update(NoteUpdateRequest $request, $id): JsonResponse { $note = Note::findOrFail($id); @@ -46,18 +47,18 @@ public function update(NoteUpdateRequest $request, $id) * * @param NoteDeleteRequest $request * @param int $id - * @return Response + * @return JsonResponse */ - public function destroy(NoteDeleteRequest $request, $id) + public function destroy(NoteDeleteRequest $request, $id): JsonResponse { $note = Note::findOrFail($id); $deletionSuccessfull = NoteRepository::delete($note); if ($deletionSuccessfull) { - return response(null, Response::HTTP_OK); + return response()->json(null, Response::HTTP_OK); } - return response(null, Response::HTTP_INTERNAL_SERVER_ERROR); + return response()->json(null, Response::HTTP_INTERNAL_SERVER_ERROR); } } diff --git a/app/Http/Controllers/API/TagController.php b/app/Http/Controllers/API/TagController.php index 66d2e4c8..6f8020a9 100644 --- a/app/Http/Controllers/API/TagController.php +++ b/app/Http/Controllers/API/TagController.php @@ -8,6 +8,7 @@ use App\Http\Requests\Models\TagUpdateRequest; use App\Models\Tag; use App\Repositories\TagRepository; +use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; use Illuminate\Http\Response; @@ -17,14 +18,14 @@ class TagController extends Controller * Display a listing of the resource. * * @param Request $request - * @return Response + * @return JsonResponse */ - public function index(Request $request) + public function index(Request $request): JsonResponse { $tags = Tag::byUser(auth()->id()) ->orderBy( - $request->get('order_by', 'created_at'), - $request->get('order_dir', 'DESC') + $request->input('order_by', 'created_at'), + $request->input('order_dir', 'DESC') ) ->paginate(getPaginationLimit()); @@ -35,9 +36,9 @@ public function index(Request $request) * Store a newly created resource in storage. * * @param TagStoreRequest $request - * @return Response + * @return JsonResponse */ - public function store(TagStoreRequest $request) + public function store(TagStoreRequest $request): JsonResponse { $tag = TagRepository::create($request->all()); @@ -48,9 +49,9 @@ public function store(TagStoreRequest $request) * Display the specified resource. * * @param int $id - * @return Response + * @return JsonResponse */ - public function show($id) + public function show($id): JsonResponse { $tag = Tag::findOrFail($id); @@ -62,9 +63,9 @@ public function show($id) * * @param TagUpdateRequest $request * @param int $id - * @return Response + * @return JsonResponse */ - public function update(TagUpdateRequest $request, $id) + public function update(TagUpdateRequest $request, $id): JsonResponse { $tag = Tag::findOrFail($id); @@ -78,18 +79,18 @@ public function update(TagUpdateRequest $request, $id) * * @param TagDeleteRequest $request * @param int $id - * @return Response + * @return JsonResponse */ - public function destroy(TagDeleteRequest $request, $id) + public function destroy(TagDeleteRequest $request, $id): JsonResponse { $tag = Tag::findOrFail($id); $deletionSuccessfull = TagRepository::delete($tag); if ($deletionSuccessfull) { - return response(null, Response::HTTP_OK); + return response()->json(null, Response::HTTP_OK); } - return response(null, Response::HTTP_INTERNAL_SERVER_ERROR); + return response()->json(null, Response::HTTP_INTERNAL_SERVER_ERROR); } } diff --git a/app/Http/Controllers/API/TagLinksController.php b/app/Http/Controllers/API/TagLinksController.php index 8d9d663f..d8999268 100644 --- a/app/Http/Controllers/API/TagLinksController.php +++ b/app/Http/Controllers/API/TagLinksController.php @@ -9,7 +9,7 @@ class TagLinksController extends Controller { /** - * Get the links for a specific tag + * Get the links for a specific tag. * * @param $tagID * @return JsonResponse diff --git a/app/Http/Controllers/App/BookmarkletController.php b/app/Http/Controllers/App/BookmarkletController.php index 43caa155..2015652f 100644 --- a/app/Http/Controllers/App/BookmarkletController.php +++ b/app/Http/Controllers/App/BookmarkletController.php @@ -8,62 +8,58 @@ use Illuminate\Http\Request; use Illuminate\View\View; -/** - * Class BookmarkletController - * - * @package App\Http\Controllers\App - */ class BookmarkletController extends Controller { /** - * Show the application dashboard. + * Show the link creation form based on the information provided by the Bookmarklet. * * @param Request $request * @return Factory|RedirectResponse|View */ public function getLinkAddForm(Request $request) { - $new_url = $request->get('u'); - $new_title = $request->get('t'); + $newUrl = $request->input('u'); + $newTitle = $request->input('t'); - // Rredirect to the login if the user is not logged in + // Redirect to the login if the user is not logged in if (!auth()->check()) { // Save details for the link in the session - session(['bookmarklet.new_url' => $new_url]); - session(['bookmarklet.new_title' => $new_title]); + session(['bookmarklet.new_url' => $newUrl]); + session(['bookmarklet.new_title' => $newTitle]); session(['bookmarklet.login_redirect' => true]); return redirect()->route('bookmarklet-login'); } - if ($new_url === null) { - // Receive the link details from the session - $new_url = session('bookmarklet.new_url'); - $new_title = session('bookmarklet.new_title'); - - session()->remove('bookmarklet.new_url'); - session()->remove('bookmarklet.new_title'); + if ($newUrl === null) { + // Receive the link details from the session after the user logged in + $newUrl = session()->pull('bookmarklet.new_url'); + $newTitle = session()->pull('bookmarklet.new_title'); } session(['bookmarklet.create' => true]); return view('actions.bookmarklet.create') - ->with('bookmark_url', $new_url) - ->with('bookmark_title', $new_title); + ->with('bookmark_url', $newUrl) + ->with('bookmark_title', $newTitle); } /** - * @return Factory|View + * Display the confirmation screen after adding a new link. + * + * @return View */ - public function getCompleteView() + public function getCompleteView(): View { return view('actions.bookmarklet.complete'); } /** - * @return Factory|View + * Return a special version of the login form made for the Bookmarklet. + * + * @return View */ - public function getLoginForm() + public function getLoginForm(): View { return view('actions.bookmarklet.login'); } diff --git a/app/Http/Controllers/App/DashboardController.php b/app/Http/Controllers/App/DashboardController.php index b758a2e9..8d8b6d46 100644 --- a/app/Http/Controllers/App/DashboardController.php +++ b/app/Http/Controllers/App/DashboardController.php @@ -7,27 +7,23 @@ use App\Models\LinkList; use App\Models\Note; use App\Models\Tag; -use Illuminate\Contracts\View\Factory; use Illuminate\View\View; -/** - * Class DashboardController - * - * @package App\Http\Controllers\App - */ class DashboardController extends Controller { /** - * @return Factory|View + * Display the dashboard including all widgets. + * + * @return View */ - public function index() + public function index(): View { - $recent_links = Link::byUser(auth()->user()->id) + $recentLinks = Link::byUser(auth()->user()->id) ->orderBy('created_at', 'DESC') ->limit(5) ->get(); - $broken_links = Link::byUser(auth()->user()->id) + $brokenLinks = Link::byUser(auth()->user()->id) ->where('status', '>', 1) ->count(); @@ -36,11 +32,12 @@ public function index() 'total_lists' => LinkList::count(), 'total_tags' => Tag::count(), 'total_notes' => Note::count(), - 'total_broken_links' => $broken_links, + 'total_broken_links' => $brokenLinks, ]; - return view('dashboard') - ->with('recent_links', $recent_links) - ->with('stats', $stats); + return view('dashboard', [ + 'recent_links' => $recentLinks, + 'stats' => $stats, + ]); } } diff --git a/app/Http/Controllers/App/ExportController.php b/app/Http/Controllers/App/ExportController.php index 377fa619..fd8ff560 100644 --- a/app/Http/Controllers/App/ExportController.php +++ b/app/Http/Controllers/App/ExportController.php @@ -4,7 +4,7 @@ use App\Http\Controllers\Controller; use App\Models\Link; -use Illuminate\Contracts\View\Factory; +use Illuminate\Contracts\Container\BindingResolutionException; use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; use Illuminate\Support\Facades\Log; @@ -13,17 +13,14 @@ use League\Csv\Writer; use Symfony\Component\HttpFoundation\StreamedResponse; -/** - * Class ExportController - * - * @package App\Http\Controllers\App - */ class ExportController extends Controller { /** - * @return Factory|View + * Get the initial screen to start the export. + * + * @return View */ - public function getExport() + public function getExport(): View { return view('actions.export.export'); } @@ -36,6 +33,7 @@ public function getExport() * * @param Request $request * @return StreamedResponse + * @throws BindingResolutionException */ public function doHtmlExport(Request $request): StreamedResponse { @@ -74,6 +72,7 @@ public function doCsvExport(Request $request) } catch (CannotInsertRecord $e) { Log::error($e->getMessage()); flash(trans('export.export_csv_error')); + return redirect()->back(); } diff --git a/app/Http/Controllers/App/ImportController.php b/app/Http/Controllers/App/ImportController.php index 281c67fb..d26b6d38 100644 --- a/app/Http/Controllers/App/ImportController.php +++ b/app/Http/Controllers/App/ImportController.php @@ -16,20 +16,22 @@ use Illuminate\View\View; use Shaarli\NetscapeBookmarkParser\NetscapeBookmarkParser; -/** - * Class ImportController - * - * @package App\Http\Controllers\App - */ class ImportController extends Controller { + /** + * Display the initial screen to start the import. + * + * @return View + */ public function getImport(): View { return view('actions.import.import'); } /** - * Permanently delete entries for a model from the trash + * Load the provided HTML bookmarks file and save all parsed results as new + * links including tags. This method is called via an Ajax call to prevent + * timeouts during the link creation. * * @param DoImportRequest $request * @return JsonResponse diff --git a/app/Http/Controllers/App/SearchController.php b/app/Http/Controllers/App/SearchController.php index 7518e5cc..69f24bd9 100644 --- a/app/Http/Controllers/App/SearchController.php +++ b/app/Http/Controllers/App/SearchController.php @@ -5,22 +5,18 @@ use App\Http\Controllers\Controller; use App\Http\Controllers\Traits\SearchesLinks; use App\Http\Requests\SearchRequest; -use Illuminate\Contracts\View\Factory; use Illuminate\View\View; -/** - * Class SearchController - * - * @package App\Http\Controllers\App - */ class SearchController extends Controller { use SearchesLinks; /** - * @return Factory|View + * Display the initial search form. + * + * @return View */ - public function getSearch() + public function getSearch(): View { return view('actions.search.search') ->with('results', collect([])) @@ -38,10 +34,12 @@ public function getSearch() } /** + * Handle the search query and display the view with all results. + * * @param SearchRequest $request - * @return Factory|View + * @return View */ - public function doSearch(SearchRequest $request) + public function doSearch(SearchRequest $request): View { $search = $this->buildDatabaseQuery($request); $results = $search->paginate(getPaginationLimit()); diff --git a/app/Http/Controllers/App/SystemSettingsController.php b/app/Http/Controllers/App/SystemSettingsController.php index 004b8a69..ba589ee5 100644 --- a/app/Http/Controllers/App/SystemSettingsController.php +++ b/app/Http/Controllers/App/SystemSettingsController.php @@ -5,30 +5,26 @@ use App\Http\Controllers\Controller; use App\Http\Requests\SystemSettingsUpdateRequest; use App\Models\Setting; -use Illuminate\Contracts\View\Factory; use Illuminate\Http\JsonResponse; use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; use Illuminate\Support\Str; use Illuminate\View\View; -/** - * Class SystemSettingsController - * - * @package App\Http\Controllers\App - */ class SystemSettingsController extends Controller { /** - * @return Factory|View + * Display the system settings forms. + * + * @return View */ - public function getSystemSettings() + public function getSystemSettings(): View { return view('actions.settings.system'); } /** - * Save the new system settings to the database + * Save the updated system settings to the database. * * @param SystemSettingsUpdateRequest $request * @return RedirectResponse @@ -54,7 +50,7 @@ public function saveSystemSettings(SystemSettingsUpdateRequest $request): Redire } /** - * Generate a new API token for the current user + * Generate a new API token for the current user. * * @param Request $request * @return JsonResponse diff --git a/app/Http/Controllers/App/TrashController.php b/app/Http/Controllers/App/TrashController.php index 1b11f818..c5b2874c 100644 --- a/app/Http/Controllers/App/TrashController.php +++ b/app/Http/Controllers/App/TrashController.php @@ -7,22 +7,18 @@ use App\Models\LinkList; use App\Models\Note; use App\Models\Tag; -use Illuminate\Contracts\View\Factory; use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; use Illuminate\View\View; -/** - * Class TrashController - * - * @package App\Http\Controllers\App - */ class TrashController extends Controller { /** - * @return Factory|View + * Display the trash overview with all deleted entries for links, tags, etc. + * + * @return View */ - public function index() + public function index(): View { $links = Link::onlyTrashed() ->byUser(auth()->id()) @@ -49,13 +45,13 @@ public function index() } /** - * Permanently delete entries for a model from the trash + * Permanently delete entries for a model from the trash. * * @param Request $reques * @param string $model * @return RedirectResponse */ - public function clearTrash(Request $reques, $model) + public function clearTrash(Request $reques, $model): RedirectResponse { $entries = []; @@ -97,14 +93,14 @@ public function clearTrash(Request $reques, $model) } /** - * Restore an entry from the trash + * Restore an entry from the trash. * * @param Request $request * @param string $model * @param string $id - * @return Factory|View + * @return RedirectResponse */ - public function restoreEntry(Request $request, $model, $id) + public function restoreEntry(Request $request, $model, $id): RedirectResponse { $entry = null; diff --git a/app/Http/Controllers/App/UserSettingsController.php b/app/Http/Controllers/App/UserSettingsController.php index 92c87b0a..a267d9ef 100644 --- a/app/Http/Controllers/App/UserSettingsController.php +++ b/app/Http/Controllers/App/UserSettingsController.php @@ -8,27 +8,22 @@ use App\Http\Requests\UserPasswordUpdateRequest; use App\Http\Requests\UserSettingsUpdateRequest; use App\Models\Setting; -use Illuminate\Contracts\View\Factory; use Illuminate\Http\JsonResponse; use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Hash; -use Illuminate\Support\Facades\Validator; use Illuminate\Support\Str; use Illuminate\View\View; -/** - * Class UserSettingsController - * - * @package App\Http\Controllers\App - */ class UserSettingsController extends Controller { /** - * @return Factory|View + * Display the user settings forms. + * + * @return View */ - public function getUserSettings() + public function getUserSettings(): View { $bookmarkletCode = LinkAce::generateBookmarkletCode(); @@ -39,29 +34,32 @@ public function getUserSettings() } /** + * Handles changes of the user account itself. + * * @param UserAccountUpdateRequest $request * @return RedirectResponse */ public function saveAccountSettings(UserAccountUpdateRequest $request): RedirectResponse { - $user = auth()->user(); - - $user->update($request->only([ + $request->user()->update($request->only([ 'name', 'email', ])); flash(trans('settings.settings_saved'), 'success'); + return redirect()->back(); } /** + * Handle changes of generall application settings like share services. + * * @param UserSettingsUpdateRequest $request * @return RedirectResponse */ public function saveAppSettings(UserSettingsUpdateRequest $request): RedirectResponse { - $userId = auth()->id(); + $userId = $request->user()->id; // Save all user settings or update them $settings = $request->except(['_token', 'share']); @@ -90,16 +88,19 @@ public function saveAppSettings(UserSettingsUpdateRequest $request): RedirectRes } flash(trans('settings.settings_saved'), 'success'); + return redirect()->back(); } /** + * Handles the user password change. + * * @param UserPasswordUpdateRequest $request * @return RedirectResponse */ public function changeUserPassword(UserPasswordUpdateRequest $request): RedirectResponse { - $currentUser = auth()->user(); + $currentUser = $request->user(); $authorizationSuccessful = Auth::attempt([ 'email' => $currentUser->email, @@ -108,6 +109,7 @@ public function changeUserPassword(UserPasswordUpdateRequest $request): Redirect if (!$authorizationSuccessful) { flash(trans('settings.old_password_invalid')); + return redirect()->back()->withInput(); } @@ -115,11 +117,12 @@ public function changeUserPassword(UserPasswordUpdateRequest $request): Redirect $currentUser->save(); flash(trans('settings.password_updated'), 'success'); + return redirect()->back(); } /** - * Generate a new API token for the current user + * Generate a new API token for the current user. * * @param Request $request * @return JsonResponse @@ -128,9 +131,8 @@ public function generateApiToken(Request $request): JsonResponse { $new_token = Str::random(32); - $user = auth()->user(); - $user->api_token = $new_token; - $user->save(); + $request->user()->api_token = $new_token; + $request->user()->save(); return response()->json([ 'new_token' => $new_token, diff --git a/app/Http/Controllers/Auth/ForgotPasswordController.php b/app/Http/Controllers/Auth/ForgotPasswordController.php index e8ccf202..6a247fef 100644 --- a/app/Http/Controllers/Auth/ForgotPasswordController.php +++ b/app/Http/Controllers/Auth/ForgotPasswordController.php @@ -5,11 +5,6 @@ use App\Http\Controllers\Controller; use Illuminate\Foundation\Auth\SendsPasswordResetEmails; -/** - * Class ForgotPasswordController - * - * @package App\Http\Controllers\Auth - */ class ForgotPasswordController extends Controller { /* diff --git a/app/Http/Controllers/Auth/LoginController.php b/app/Http/Controllers/Auth/LoginController.php index ffedb69e..0d213f01 100644 --- a/app/Http/Controllers/Auth/LoginController.php +++ b/app/Http/Controllers/Auth/LoginController.php @@ -5,11 +5,6 @@ use App\Http\Controllers\Controller; use Illuminate\Foundation\Auth\AuthenticatesUsers; -/** - * Class LoginController - * - * @package App\Http\Controllers\Auth - */ class LoginController extends Controller { /* diff --git a/app/Http/Controllers/Auth/RegisterController.php b/app/Http/Controllers/Auth/RegisterController.php index 81bb9df9..cedeff8d 100644 --- a/app/Http/Controllers/Auth/RegisterController.php +++ b/app/Http/Controllers/Auth/RegisterController.php @@ -2,16 +2,11 @@ namespace App\Http\Controllers\Auth; -use App\Models\User; use App\Http\Controllers\Controller; +use App\Models\User; use Illuminate\Contracts\Validation\Validator; use Illuminate\Foundation\Auth\RegistersUsers; -/** - * Class RegisterController - * - * @package App\Http\Controllers\Auth - */ class RegisterController extends Controller { /* @@ -47,7 +42,7 @@ public function __construct() /** * Get a validator for an incoming registration request. * - * @param array $data + * @param array $data * @return Validator */ protected function validator(array $data): Validator @@ -58,7 +53,7 @@ protected function validator(array $data): Validator /** * Create a new user instance after a valid registration. * - * @param array $data + * @param array $data * @return User */ protected function create(array $data): User diff --git a/app/Http/Controllers/Auth/ResetPasswordController.php b/app/Http/Controllers/Auth/ResetPasswordController.php index 1edb362b..1d99752a 100644 --- a/app/Http/Controllers/Auth/ResetPasswordController.php +++ b/app/Http/Controllers/Auth/ResetPasswordController.php @@ -5,11 +5,6 @@ use App\Http\Controllers\Controller; use Illuminate\Foundation\Auth\ResetsPasswords; -/** - * Class ResetPasswordController - * - * @package App\Http\Controllers\Auth - */ class ResetPasswordController extends Controller { /* diff --git a/app/Http/Controllers/Controller.php b/app/Http/Controllers/Controller.php index 03e02a23..a0a2a8a3 100644 --- a/app/Http/Controllers/Controller.php +++ b/app/Http/Controllers/Controller.php @@ -2,10 +2,10 @@ namespace App\Http\Controllers; +use Illuminate\Foundation\Auth\Access\AuthorizesRequests; use Illuminate\Foundation\Bus\DispatchesJobs; -use Illuminate\Routing\Controller as BaseController; use Illuminate\Foundation\Validation\ValidatesRequests; -use Illuminate\Foundation\Auth\Access\AuthorizesRequests; +use Illuminate\Routing\Controller as BaseController; class Controller extends BaseController { diff --git a/app/Http/Controllers/CronController.php b/app/Http/Controllers/CronController.php index dcd9e7bb..580c5666 100644 --- a/app/Http/Controllers/CronController.php +++ b/app/Http/Controllers/CronController.php @@ -10,6 +10,9 @@ class CronController extends Controller { /** + * This endpoint allows the execution of the cron if a system-controlled + * cron is not available. + * * @param Request $request * @param string $cron_token * @return ResponseFactory|Response diff --git a/app/Http/Controllers/FetchController.php b/app/Http/Controllers/FetchController.php index f20f390a..41de380e 100644 --- a/app/Http/Controllers/FetchController.php +++ b/app/Http/Controllers/FetchController.php @@ -11,9 +11,15 @@ class FetchController extends Controller { + /** + * Returns all tags that match a given query, preformatted for Selectize. + * + * @param Request $request + * @return JsonResponse + */ public function getTags(Request $request): JsonResponse { - $query = $request->get('query', false); + $query = $request->input('query', false); if (!$query) { return response()->json([]); @@ -37,9 +43,15 @@ public function getTags(Request $request): JsonResponse return response()->json($tags); } + /** + * Returns all lists that match a given query, preformatted for Selectize. + * + * @param Request $request + * @return JsonResponse + */ public function getLists(Request $request): JsonResponse { - $query = $request->get('query', false); + $query = $request->input('query', false); if (!$query) { return response()->json([]); @@ -63,9 +75,16 @@ public function getLists(Request $request): JsonResponse return response()->json($tags); } + /** + * Returns a boolean flag which indicates that there already is a link + * present for the given URL. + * + * @param Request $request + * @return JsonResponse + */ public function searchExistingUrls(Request $request): JsonResponse { - $query = $request->get('query', false); + $query = $request->input('query', false); if (!$query) { return response()->json([]); @@ -78,6 +97,12 @@ public function searchExistingUrls(Request $request): JsonResponse return response()->json(['linkFound' => $linkCount > 0]); } + /** + * Simple endpoint for the system settings page which runs an update check + * and returns the result to the frontend. + * + * @return JsonResponse + */ public static function checkForUpdates(): JsonResponse { $updateCheck = UpdateHelper::checkForUpdates(); diff --git a/app/Http/Controllers/FrontController.php b/app/Http/Controllers/FrontController.php index 71548d94..b7ecb351 100644 --- a/app/Http/Controllers/FrontController.php +++ b/app/Http/Controllers/FrontController.php @@ -2,14 +2,16 @@ namespace App\Http\Controllers; -use Illuminate\Contracts\View\Factory; use Illuminate\Http\RedirectResponse; use Illuminate\View\View; class FrontController extends Controller { /** - * @return Factory|RedirectResponse|View + * The front controller checks if the user is authenticated and the guest + * access is enabled, and redirects the request accordingly. + * + * @return RedirectResponse|View */ public function __invoke() { diff --git a/app/Http/Controllers/Guest/LinkController.php b/app/Http/Controllers/Guest/LinkController.php index 3dd968b5..d7174423 100644 --- a/app/Http/Controllers/Guest/LinkController.php +++ b/app/Http/Controllers/Guest/LinkController.php @@ -4,21 +4,16 @@ use App\Http\Controllers\Controller; use App\Models\Link; -use Illuminate\Contracts\View\Factory; -use Illuminate\Http\Request; use Illuminate\View\View; -/** - * Class LinkController - * - * @package App\Http\Controllers\Guest - */ class LinkController extends Controller { /** - * @return Factory|View + * Display an overview of all links. + * + * @return View */ - public function index() + public function index(): View { $links = Link::privateOnly(false) ->paginate(getPaginationLimit()); diff --git a/app/Http/Controllers/Guest/ListController.php b/app/Http/Controllers/Guest/ListController.php index 953ff4a1..a994de69 100644 --- a/app/Http/Controllers/Guest/ListController.php +++ b/app/Http/Controllers/Guest/ListController.php @@ -4,21 +4,17 @@ use App\Http\Controllers\Controller; use App\Models\LinkList; -use Illuminate\Contracts\View\Factory; use Illuminate\Http\Request; use Illuminate\View\View; -/** - * Class ListController - * - * @package App\Http\Controllers\Guest - */ class ListController extends Controller { /** - * @return Factory|View + * Display an overview of all lists. + * + * @return View */ - public function index() + public function index(): View { $lists = LinkList::isPrivate(false) ->paginate(getPaginationLimit()); @@ -33,32 +29,25 @@ public function index() * * @param Request $request * @param int $id - * @return Factory|View + * @return View */ - public function show(Request $request, $id) + public function show(Request $request, $id): View { - $list = LinkList::isPrivate(false)->find($id); - - if (empty($list)) { - abort(404); - } - - $links = $list->links()->privateOnly(false); - - if ($request->has('orderBy') && $request->has('orderDir')) { - $links->orderBy($request->get('orderBy'), $request->get('orderDir')); - } else { - $links->latest(); - } + $list = LinkList::isPrivate(false)->findOrFail($id); - $links = $links->paginate(getPaginationLimit()); + $links = $list->links() + ->privateOnly(false) + ->orderBy( + $request->input('orderBy', 'name'), + $request->input('orderDir', 'ASC') + )->paginate(getPaginationLimit()); return view('guest.lists.show', [ 'list' => $list, 'list_links' => $links, 'route' => $request->getBaseUrl(), - 'order_by' => $request->get('orderBy'), - 'order_dir' => $request->get('orderDir'), + 'order_by' => $request->input('orderBy', 'name'), + 'order_dir' => $request->input('orderDir', 'ASC'), ]); } } diff --git a/app/Http/Controllers/Guest/TagController.php b/app/Http/Controllers/Guest/TagController.php index 055560f1..15ae397b 100644 --- a/app/Http/Controllers/Guest/TagController.php +++ b/app/Http/Controllers/Guest/TagController.php @@ -4,15 +4,9 @@ use App\Http\Controllers\Controller; use App\Models\Tag; -use Illuminate\Contracts\View\Factory; use Illuminate\Http\Request; use Illuminate\View\View; -/** - * Class TagController - * - * @package App\Http\Controllers\Guest - */ class TagController extends Controller { /** @@ -20,32 +14,25 @@ class TagController extends Controller * * @param Request $request * @param int $id - * @return Factory|View + * @return View */ - public function show(Request $request, $id) + public function show(Request $request, $id): View { - $tag = Tag::isPrivate(false)->find($id); + $tag = Tag::isPrivate(false)->findOrFail($id); - if (empty($tag)) { - abort(404); - } - - $links = $tag->links()->privateOnly(false); - - if ($request->has('orderBy') && $request->has('orderDir')) { - $links->orderBy($request->get('orderBy'), $request->get('orderDir')); - } else { - $links->orderBy('created_at', 'DESC'); - } - - $links = $links->paginate(getPaginationLimit()); + $links = $tag->links() + ->privateOnly(false) + ->orderBy( + $request->input('orderBy', 'name'), + $request->input('orderDir', 'ASC') + )->paginate(getPaginationLimit()); return view('guest.tags.show', [ 'tag' => $tag, 'tag_links' => $links, 'route' => $request->getBaseUrl(), - 'order_by' => $request->get('orderBy'), - 'order_dir' => $request->get('orderDir'), + 'order_by' => $request->input('orderBy', 'name'), + 'order_dir' => $request->input('orderDir', 'ASC'), ]); } } diff --git a/app/Http/Controllers/Models/LinkController.php b/app/Http/Controllers/Models/LinkController.php index 108435ee..3b8b85e9 100644 --- a/app/Http/Controllers/Models/LinkController.php +++ b/app/Http/Controllers/Models/LinkController.php @@ -10,47 +10,41 @@ use App\Models\Link; use App\Repositories\LinkRepository; use Exception; -use Illuminate\Contracts\View\Factory; use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; use Illuminate\View\View; -/** - * Class LinkController - * - * @package App\Http\Controllers\Models - */ class LinkController extends Controller { /** * Display a listing of the resource. * * @param Request $request - * @return Factory|View + * @return View */ - public function index(Request $request) + public function index(Request $request): View { $links = Link::byUser(auth()->id()) ->orderBy( - $request->get('orderBy', 'created_at'), - $request->get('orderDir', 'DESC') + $request->input('orderBy', 'created_at'), + $request->input('orderDir', 'DESC') ) ->paginate(getPaginationLimit()); return view('models.links.index', [ 'links' => $links, 'route' => $request->getBaseUrl(), - 'order_by' => $request->get('orderBy'), - 'order_dir' => $request->get('orderDir'), + 'order_by' => $request->input('orderBy', 'created_at'), + 'order_dir' => $request->input('orderDir', 'DESC'), ]); } /** * Show the form for creating a new resource. * - * @return Factory|View + * @return View */ - public function create() + public function create(): View { // Reset the bookmarklet session identifier to prevent issues on regular pages session()->forget('bookmarklet.create'); @@ -64,7 +58,7 @@ public function create() * @param LinkStoreRequest $request * @return RedirectResponse */ - public function store(LinkStoreRequest $request) + public function store(LinkStoreRequest $request): RedirectResponse { $link = LinkRepository::create($request->all(), true); @@ -87,7 +81,7 @@ public function store(LinkStoreRequest $request) $isBookmarklet = session('bookmarklet.create'); - if ($request->get('reload_view')) { + if ($request->input('reload_view')) { session()->flash('reload_view', true); return redirect()->route($isBookmarklet ? 'bookmarklet-add' : 'links.create'); @@ -102,9 +96,9 @@ public function store(LinkStoreRequest $request) * Display the specified resource. * * @param int $id - * @return Factory|View + * @return View */ - public function show($id) + public function show($id): View { $link = Link::findOrFail($id); @@ -118,9 +112,9 @@ public function show($id) * Show the form for editing the specified resource. * * @param int $id - * @return Factory|View + * @return View */ - public function edit($id) + public function edit($id): View { $link = Link::findOrFail($id); @@ -135,7 +129,7 @@ public function edit($id) * @param int $id * @return RedirectResponse */ - public function update(LinkUpdateRequest $request, $id) + public function update(LinkUpdateRequest $request, $id): RedirectResponse { $link = Link::findOrFail($id); @@ -154,7 +148,7 @@ public function update(LinkUpdateRequest $request, $id) * @return RedirectResponse * @throws Exception */ - public function destroy(LinkDeleteRequest $request, $id) + public function destroy(LinkDeleteRequest $request, $id): RedirectResponse { $link = Link::findOrFail($id); @@ -166,6 +160,7 @@ public function destroy(LinkDeleteRequest $request, $id) } flash(trans('link.deleted_successfully'), 'warning'); + return redirect()->route('links.index'); } @@ -176,7 +171,7 @@ public function destroy(LinkDeleteRequest $request, $id) * @param $id * @return RedirectResponse */ - public function updateCheckToggle(LinkToggleCheckRequest $request, $id) + public function updateCheckToggle(LinkToggleCheckRequest $request, $id): RedirectResponse { $link = Link::findOrFail($id); diff --git a/app/Http/Controllers/Models/ListController.php b/app/Http/Controllers/Models/ListController.php index 7f210b96..daba21e8 100644 --- a/app/Http/Controllers/Models/ListController.php +++ b/app/Http/Controllers/Models/ListController.php @@ -9,43 +9,41 @@ use App\Models\LinkList; use App\Repositories\ListRepository; use Exception; -use Illuminate\Contracts\View\Factory; use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; use Illuminate\View\View; -/** - * Class ListController - * - * @package App\Http\Controllers\Models - */ class ListController extends Controller { /** * Display a listing of the resource. * * @param Request $request - * @return Factory|View + * @return View */ - public function index(Request $request) + public function index(Request $request): View { $lists = LinkList::byUser(auth()->id()) + ->orderBy( + $request->input('orderBy', 'name'), + $request->input('orderDir', 'ASC') + ) ->paginate(getPaginationLimit()); return view('models.lists.index', [ 'lists' => $lists, 'route' => $request->getBaseUrl(), - 'order_by' => $request->get('orderBy'), - 'order_dir' => $request->get('orderDir'), + 'order_by' => $request->input('orderBy', 'name'), + 'order_dir' => $request->input('orderDir', 'ASC'), ]); } /** * Show the form for creating a new resource. * - * @return Factory|View + * @return View */ - public function create() + public function create(): View { return view('models.lists.create'); } @@ -56,7 +54,7 @@ public function create() * @param ListStoreRequest $request * @return RedirectResponse */ - public function store(ListStoreRequest $request) + public function store(ListStoreRequest $request): RedirectResponse { $data = $request->except(['reload_view']); @@ -64,8 +62,9 @@ public function store(ListStoreRequest $request) flash(trans('list.added_successfully'), 'success'); - if ($request->get('reload_view')) { + if ($request->input('reload_view')) { session()->flash('reload_view', true); + return redirect()->route('lists.create'); } @@ -77,16 +76,16 @@ public function store(ListStoreRequest $request) * * @param Request $request * @param int $id - * @return Factory|View + * @return View */ - public function show(Request $request, $id) + public function show(Request $request, $id): View { $list = LinkList::findOrFail($id); $links = $list->links()->byUser(auth()->id()); if ($request->has('orderBy') && $request->has('orderDir')) { - $links->orderBy($request->get('orderBy'), $request->get('orderDir')); + $links->orderBy($request->input('orderBy'), $request->input('orderDir')); } else { $links->orderBy('created_at', 'DESC'); } @@ -97,8 +96,8 @@ public function show(Request $request, $id) 'list' => $list, 'list_links' => $links, 'route' => $request->getBaseUrl(), - 'order_by' => $request->get('orderBy'), - 'order_dir' => $request->get('orderDir'), + 'order_by' => $request->input('orderBy'), + 'order_dir' => $request->input('orderDir'), ]); } @@ -106,9 +105,9 @@ public function show(Request $request, $id) * Show the form for editing the specified resource. * * @param int $id - * @return Factory|View + * @return View */ - public function edit($id) + public function edit($id): View { $list = LinkList::findOrFail($id); @@ -122,7 +121,7 @@ public function edit($id) * @param int $id * @return RedirectResponse */ - public function update(ListUpdateRequest $request, $id) + public function update(ListUpdateRequest $request, $id): RedirectResponse { $list = LinkList::findOrFail($id); @@ -141,7 +140,7 @@ public function update(ListUpdateRequest $request, $id) * @return RedirectResponse * @throws Exception */ - public function destroy(ListDeleteRequest $request, $id) + public function destroy(ListDeleteRequest $request, $id): RedirectResponse { $list = LinkList::findOrFail($id); diff --git a/app/Http/Controllers/Models/NoteController.php b/app/Http/Controllers/Models/NoteController.php index e3dc4572..0a20725d 100644 --- a/app/Http/Controllers/Models/NoteController.php +++ b/app/Http/Controllers/Models/NoteController.php @@ -10,15 +10,9 @@ use App\Models\Note; use App\Repositories\NoteRepository; use Exception; -use Illuminate\Contracts\View\Factory; use Illuminate\Http\RedirectResponse; use Illuminate\View\View; -/** - * Class NoteController - * - * @package App\Http\Controllers\Models - */ class NoteController extends Controller { /** @@ -27,9 +21,9 @@ class NoteController extends Controller * @param NoteStoreRequest $request * @return RedirectResponse */ - public function store(NoteStoreRequest $request) + public function store(NoteStoreRequest $request): RedirectResponse { - $link = Link::findOrFail($request->get('link_id')); + $link = Link::findOrFail($request->input('link_id')); if ($link->user_id !== auth()->id()) { abort(403); @@ -47,9 +41,9 @@ public function store(NoteStoreRequest $request) * Show the form for editing the specified resource. * * @param int $id - * @return Factory|View + * @return View */ - public function edit($id) + public function edit($id): View { $note = Note::findOrFail($id); @@ -67,7 +61,7 @@ public function edit($id) * @param int $id * @return RedirectResponse */ - public function update(NoteUpdateRequest $request, $id) + public function update(NoteUpdateRequest $request, $id): RedirectResponse { $note = Note::findOrFail($id); @@ -86,7 +80,7 @@ public function update(NoteUpdateRequest $request, $id) * @return RedirectResponse * @throws Exception */ - public function destroy(NoteDeleteRequest $request, $id) + public function destroy(NoteDeleteRequest $request, $id): RedirectResponse { $note = Note::findOrFail($id); diff --git a/app/Http/Controllers/Models/TagController.php b/app/Http/Controllers/Models/TagController.php index 27511513..1f7a0c35 100644 --- a/app/Http/Controllers/Models/TagController.php +++ b/app/Http/Controllers/Models/TagController.php @@ -9,50 +9,40 @@ use App\Models\Tag; use App\Repositories\TagRepository; use Exception; -use Illuminate\Contracts\View\Factory; use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; use Illuminate\View\View; -/** - * Class TagController - * - * @package App\Http\Controllers\Models - */ class TagController extends Controller { /** * Display a listing of the resource. * * @param Request $request - * @return Factory|View + * @return View */ - public function index(Request $request) + public function index(Request $request): View { - $tags = Tag::byUser(auth()->id()); - - if ($request->has('orderBy') && $request->has('orderDir')) { - $tags->orderBy($request->get('orderBy'), $request->get('orderDir')); - } else { - $tags->orderBy('name', 'ASC'); - } - - $tags = $tags->paginate(getPaginationLimit()); + $tags = Tag::byUser(auth()->id()) + ->orderBy( + $request->input('orderBy', 'name'), + $request->input('orderDir', 'ASC') + )->paginate(getPaginationLimit()); return view('models.tags.index', [ 'tags' => $tags, 'route' => $request->getBaseUrl(), - 'order_by' => $request->get('orderBy'), - 'order_dir' => $request->get('orderDir'), + 'order_by' => $request->input('orderBy', 'name'), + 'order_dir' => $request->input('orderDir', 'ASC'), ]); } /** * Show the form for creating a new resource. * - * @return Factory|View + * @return View */ - public function create() + public function create(): View { return view('models.tags.create'); } @@ -71,7 +61,7 @@ public function store(TagStoreRequest $request) flash(trans('tag.added_successfully'), 'success'); - if ($request->get('reload_view')) { + if ($request->input('reload_view')) { session()->flash('reload_view', true); return redirect()->route('tags.create'); } @@ -84,16 +74,16 @@ public function store(TagStoreRequest $request) * * @param Request $request * @param int $id - * @return Factory|View + * @return View */ - public function show(Request $request, $id) + public function show(Request $request, $id): View { $tag = Tag::findOrFail($id); $links = $tag->links()->byUser(auth()->id()); if ($request->has('orderBy') && $request->has('orderDir')) { - $links->orderBy($request->get('orderBy'), $request->get('orderDir')); + $links->orderBy($request->input('orderBy'), $request->input('orderDir')); } else { $links->orderBy('created_at', 'DESC'); } @@ -104,8 +94,8 @@ public function show(Request $request, $id) 'tag' => $tag, 'tag_links' => $links, 'route' => $request->getBaseUrl(), - 'order_by' => $request->get('orderBy'), - 'order_dir' => $request->get('orderDir'), + 'order_by' => $request->input('orderBy'), + 'order_dir' => $request->input('orderDir'), ]); } @@ -113,9 +103,9 @@ public function show(Request $request, $id) * Show the form for editing the specified resource. * * @param int $id - * @return Factory|View + * @return View */ - public function edit($id) + public function edit($id): View { $tag = Tag::findOrFail($id); @@ -129,7 +119,7 @@ public function edit($id) * @param int $id * @return RedirectResponse */ - public function update(TagUpdateRequest $request, $id) + public function update(TagUpdateRequest $request, $id): RedirectResponse { $tag = Tag::findOrFail($id); @@ -149,7 +139,7 @@ public function update(TagUpdateRequest $request, $id) * @return RedirectResponse * @throws Exception */ - public function destroy(TagDeleteRequest $request, $id) + public function destroy(TagDeleteRequest $request, $id): RedirectResponse { $tag = Tag::findOrFail($id); @@ -161,6 +151,7 @@ public function destroy(TagDeleteRequest $request, $id) } flash(trans('tag.deleted_successfully'), 'warning'); + return redirect()->route('tags.index'); } } diff --git a/app/Http/Controllers/Setup/AccountController.php b/app/Http/Controllers/Setup/AccountController.php index e3a3b391..05f3f9c8 100644 --- a/app/Http/Controllers/Setup/AccountController.php +++ b/app/Http/Controllers/Setup/AccountController.php @@ -5,15 +5,9 @@ use App\Http\Controllers\Controller; use App\Models\User; use Illuminate\Contracts\Validation\Validator; -use Illuminate\Contracts\View\Factory; use Illuminate\Foundation\Auth\RegistersUsers; use Illuminate\View\View; -/** - * Class AccountController - * - * @package App\Http\Controllers\Setup - */ class AccountController extends Controller { use RegistersUsers; @@ -24,9 +18,11 @@ protected function redirectTo(): string } /** - * @return Factory|View + * Display the registration form for the first user account. + * + * @return View */ - public function index() + public function index(): View { return view('setup.account'); } diff --git a/app/Http/Controllers/Setup/DatabaseController.php b/app/Http/Controllers/Setup/DatabaseController.php index 832ae9f8..c8afcd1c 100644 --- a/app/Http/Controllers/Setup/DatabaseController.php +++ b/app/Http/Controllers/Setup/DatabaseController.php @@ -6,7 +6,7 @@ use App\Http\Requests\SetupDatabaseRequest; use Exception; use Illuminate\Contracts\Filesystem\FileNotFoundException; -use Illuminate\Contracts\View\Factory; +use Illuminate\Http\RedirectResponse; use Illuminate\Support\Facades\Artisan; use Illuminate\Support\Facades\Config; use Illuminate\Support\Facades\DB; @@ -15,34 +15,34 @@ use Illuminate\View\View; use PDOException; -/** - * Class DatabaseController - * - * @package App\Http\Controllers\Setup - */ class DatabaseController extends Controller { protected $dbConfig; /** - * @return Factory|View + * Display the form for configuration of the database. + * + * @return View */ - public function index() + public function index(): View { return view('setup.database'); } /** + * Handle the test and configuration of a new database connection. + * * @param SetupDatabaseRequest $request - * @return Factory|View + * @return RedirectResponse * @throws FileNotFoundException */ - public function configure(SetupDatabaseRequest $request) + public function configure(SetupDatabaseRequest $request): RedirectResponse { $this->createTempDatabaseConnection($request->all()); if ($this->databaseHasData() && !$request->has('overwrite_data')) { flash(trans('setup.database.data_present'), 'danger'); + return redirect()->back()->with('data_present', true)->withInput(); } @@ -58,6 +58,8 @@ public function configure(SetupDatabaseRequest $request) } /** + * Accepts new credentials for a database and sets them accordingly. + * * @param array $credentials */ protected function createTempDatabaseConnection($credentials): void @@ -102,8 +104,6 @@ protected function migrateDatabase(): bool * At this point we write the database credentials to the .env file. * We can ignore the FileNotFoundException exception as we already checked * the presence and writability of the file in the previous setup step. - * - * @throws FileNotFoundException */ protected function storeConfigurationInEnv(): void { diff --git a/app/Http/Controllers/Setup/MetaController.php b/app/Http/Controllers/Setup/MetaController.php index 52cb91b4..6e8f6314 100644 --- a/app/Http/Controllers/Setup/MetaController.php +++ b/app/Http/Controllers/Setup/MetaController.php @@ -4,27 +4,37 @@ use App\Http\Controllers\Controller; use Illuminate\Support\Facades\File; +use Illuminate\View\View; -/** - * Class WelcomeController - * - * @package App\Http\Controllers\Setup - */ class MetaController extends Controller { - public function welcome() + /** + * Display a very simple welcome screen to start the setup process. + * + * @return View + */ + public function welcome(): View { return view('setup.welcome'); } - public function complete() + /** + * Display a final screen after the setup was successful. + * + * @return View + */ + public function complete(): View { $this->markSetupCompleted(); return view('setup.complete'); } - protected function markSetupCompleted() + /** + * After the setup is finished, we change the SETUP_COMPLETED variable + * from false to true to prevent the setup from being run again. + */ + protected function markSetupCompleted(): void { $envContent = File::get(base_path('.env')); diff --git a/app/Http/Controllers/Setup/RequirementsController.php b/app/Http/Controllers/Setup/RequirementsController.php index f7861486..3feb1119 100644 --- a/app/Http/Controllers/Setup/RequirementsController.php +++ b/app/Http/Controllers/Setup/RequirementsController.php @@ -3,21 +3,17 @@ namespace App\Http\Controllers\Setup; use App\Http\Controllers\Controller; -use Illuminate\Contracts\View\Factory; use Illuminate\Support\Facades\File; use Illuminate\View\View; -/** - * Class RequirementsController - * - * @package App\Http\Controllers\Setup - */ class RequirementsController extends Controller { /** - * @return Factory|View + * Display all requirements that must be fulfilled to run the setup. + * + * @return View */ - public function index() + public function index(): View { [$success, $results] = $this->checkRequirements(); diff --git a/app/Http/Controllers/Traits/SearchesLinks.php b/app/Http/Controllers/Traits/SearchesLinks.php index f5c0c49e..59a763d1 100644 --- a/app/Http/Controllers/Traits/SearchesLinks.php +++ b/app/Http/Controllers/Traits/SearchesLinks.php @@ -4,6 +4,7 @@ use App\Http\Requests\SearchRequest; use App\Models\Link; +use Illuminate\Database\Eloquent\Builder; trait SearchesLinks { @@ -26,7 +27,14 @@ trait SearchesLinks 'created_at:desc', ]; - public function buildDatabaseQuery(SearchRequest $request) + /** + * This method takes a HTTP request containing various search fields and + * create a database query builder for the Link model based on that fields. + * + * @param SearchRequest $request + * @return Builder + */ + protected function buildDatabaseQuery(SearchRequest $request) { // Start building the search $search = Link::byUser($request->user()->id); diff --git a/app/Http/Requests/UserAccountUpdateRequest.php b/app/Http/Requests/UserAccountUpdateRequest.php index a94d95b0..ed2f242e 100644 --- a/app/Http/Requests/UserAccountUpdateRequest.php +++ b/app/Http/Requests/UserAccountUpdateRequest.php @@ -26,12 +26,12 @@ class UserAccountUpdateRequest extends FormRequest public function authorize(Request $request) { // Validate the username if it was changed - if ($request->get('name') !== auth()->user()->name) { + if ($request->input('name') !== auth()->user()->name) { $this->validate_username = true; } // Validate the email address if it was changed - if ($request->get('email') !== auth()->user()->email) { + if ($request->input('email') !== auth()->user()->email) { $this->validate_email = true; } From 4979827b793fff7cb12463ba528f58ef4b56050b Mon Sep 17 00:00:00 2001 From: Kovah Date: Fri, 26 Jun 2020 12:36:49 +0200 Subject: [PATCH 28/44] Update the readme with updated support information --- README.md | 44 ++++++++++++++++++++------------------------ 1 file changed, 20 insertions(+), 24 deletions(-) diff --git a/README.md b/README.md index edbace04..e2e5ed33 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,7 @@ ### Contents * [About LinkAce](#about-linkace) -* [Support Disclaimer](#warning-support-for-linkace) +* [Support Disclaimer](#bulb-support-for-linkace) * [Setup](#gear-setup) * [Setup with Docker](#setup-with-docker) * [Setup without Docker](#setup-without-docker) @@ -40,17 +40,17 @@ actual needs which other bookmark managers couldn't solve, even if most features #### Features -* Bookmark links with automatic title and description generation -* Automated link checks to make sure your bookmarks stay available -* Automated “backups” of your bookmarks via the Waybackmachine -* Organize bookmarks in lists and tags -* A bookmarklet to quickly save links from any browser -* Private or public links, so friends or internet strangers can see your collection -* Add notes to links to add thoughts -* Advanced search including different filters and ordering -* Import existing bookmarks from HTML exports (other methods planned) -* Support for complete database and app backups to Amazon AWS S3 -* A built-in light and dark color scheme +* Save links with automatic title and description generation. +* Automated link checks to make sure your bookmarks stay available. +* Automated “backups” of your bookmarks via the Waybackmachine. +* Organize bookmarks in lists and tags. +* A bookmarklet to quickly save links from any browser. +* Private or public links, so friends or internet strangers can see your collection. +* Add notes to links to add thoughts or other information. +* Advanced search including different filters and ordering. +* Import existing bookmarks from HTML exports (other methods planned). +* Support for complete database and app backups to Amazon AWS S3. +* A built-in light and dark color scheme. More features are already planned. Take a look at the [project board](https://github.com/Kovah/LinkAce/projects/1) for more information. @@ -65,20 +65,13 @@ to share your ideas, talk with other users or find help for specific problems. --- -### :warning: Support for LinkAce +### :bulb: Support for LinkAce -LinkAce is my personal freetime project. I do not offer any sort of granted support for it. I do not offer any paid -support or customization. I do not assist with installing it on your server. If I answer your questions in the -community forum or on Github, it's my free time I spend on your issue. Be respectful. +I do not offer any free support for any of my tools, including LinkAce. If you need help please visit the +[community forum on Spectrum](https://spectrum.chat/linkace/) and post your issue there. Please notice that LinkAce +has specific requirements to run correctly. -If you need an app with extensive support please consider using a commercial solution. - -If you need help or want to report a bug within the application, please open a new [issue](https://github.com/Kovah/LinkAce/issues) -and describe: - -* which version you are using, -* what your exact problem is, -* and what you already did to solve the problem. +If you need prioritized support you can **become a [Patreon](https://www.patreon.com/Kovah)** or **[Github Sponsor](https://github.com/sponsors/Kovah)**. :star: --- @@ -86,6 +79,9 @@ and describe: ### :gear: Setup +Please check if your server supports the [requirements](https://www.linkace.org/docs/v1/setup/) before starting the +setup. + #### Setup with Docker Working with Docker is pretty straight forward. The image available on Docker Hub contains the application code, any From 5637046b6835cc1d8a3ae8e70e995b74f4db596c Mon Sep 17 00:00:00 2001 From: Kovah Date: Fri, 26 Jun 2020 12:42:37 +0200 Subject: [PATCH 29/44] Update the readme with updated support information --- README.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index e2e5ed33..8805189e 100644 --- a/README.md +++ b/README.md @@ -67,11 +67,13 @@ to share your ideas, talk with other users or find help for specific problems. ### :bulb: Support for LinkAce -I do not offer any free support for any of my tools, including LinkAce. If you need help please visit the -[community forum on Spectrum](https://spectrum.chat/linkace/) and post your issue there. Please notice that LinkAce -has specific requirements to run correctly. +Free support is highly limited for all my free tools, including LinkAce. If you need help please visit the +[community forum](https://spectrum.chat/linkace/) and post your issue there. I do not offer free personal +support via chat or email. +Please notice that LinkAce has specific requirements to run correctly. -If you need prioritized support you can **become a [Patreon](https://www.patreon.com/Kovah)** or **[Github Sponsor](https://github.com/sponsors/Kovah)**. :star: +If you need prioritized support you can **become a [Patreon](https://www.patreon.com/Kovah)** +or **[Github Sponsor](https://github.com/sponsors/Kovah)**. :star: --- From cd505ac1ecb294b93803b10968f7dbccbcf960bd Mon Sep 17 00:00:00 2001 From: Kovah Date: Fri, 26 Jun 2020 12:55:23 +0200 Subject: [PATCH 30/44] Update funding information --- .github/FUNDING.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index be83694f..bd910ba2 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -1,8 +1,8 @@ # These are supported funding model platforms github: kovah # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] -patreon: # Replace with a single Patreon username -open_collective: # Replace with a single Open Collective username +patreon: Kovah # Replace with a single Patreon username +open_collective: linkace # Replace with a single Open Collective username ko_fi: # Replace with a single Ko-fi username tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry From 59f537b9edbc02e49768c6a069b555141aa59512 Mon Sep 17 00:00:00 2001 From: Kovah Date: Mon, 29 Jun 2020 18:39:19 +0200 Subject: [PATCH 31/44] Add experimental testing for PHP 8 --- .github/workflows/test.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index fee31b39..5f98d6e1 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -36,11 +36,17 @@ jobs: test-php: runs-on: ${{ matrix.operating-system }} + continue-on-error: ${{ matrix.experimental }} needs: test-js strategy: matrix: operating-system: [ubuntu-latest] php-versions: ['7.2', '7.3', '7.4'] + experimental: [false] + include: + - node: '8.0' + os: ubuntu-latest + experimental: true name: PHP ${{ matrix.php-versions }} Test on ${{ matrix.operating-system }} From 44c9f548029fb9a8f89bcca296573117fd3d35df Mon Sep 17 00:00:00 2001 From: Kovah Date: Mon, 29 Jun 2020 18:41:39 +0200 Subject: [PATCH 32/44] Add experimental testing for PHP 8 --- .github/workflows/test.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 5f98d6e1..ca80476a 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -44,8 +44,8 @@ jobs: php-versions: ['7.2', '7.3', '7.4'] experimental: [false] include: - - node: '8.0' - os: ubuntu-latest + - php-versions: '8.0' + operating-system: ubuntu-latest experimental: true name: PHP ${{ matrix.php-versions }} Test on ${{ matrix.operating-system }} From 4a356fc5cf2d812d465ece17482672c4ce5da03d Mon Sep 17 00:00:00 2001 From: Kovah Date: Mon, 29 Jun 2020 18:44:28 +0200 Subject: [PATCH 33/44] Remove experimental testing for PHP 8 --- .github/workflows/test.yml | 6 ------ 1 file changed, 6 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index ca80476a..fee31b39 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -36,17 +36,11 @@ jobs: test-php: runs-on: ${{ matrix.operating-system }} - continue-on-error: ${{ matrix.experimental }} needs: test-js strategy: matrix: operating-system: [ubuntu-latest] php-versions: ['7.2', '7.3', '7.4'] - experimental: [false] - include: - - php-versions: '8.0' - operating-system: ubuntu-latest - experimental: true name: PHP ${{ matrix.php-versions }} Test on ${{ matrix.operating-system }} From bfec72de3733c43c7fd9c32f06e9b3fbb13c9941 Mon Sep 17 00:00:00 2001 From: Kovah Date: Tue, 30 Jun 2020 23:32:12 +0200 Subject: [PATCH 34/44] Implement a new trash repository and introduce form request for restoring entries --- app/Http/Controllers/App/TrashController.php | 75 ++--------------- app/Http/Requests/TrashRestoreRequest.php | 31 +++++++ app/Repositories/TrashRepository.php | 83 +++++++++++++++++++ .../trash/partials/link-table.blade.php | 12 ++- .../trash/partials/list-table.blade.php | 12 ++- .../trash/partials/note-table.blade.php | 12 ++- .../trash/partials/tag-table.blade.php | 12 ++- routes/web.php | 2 +- tests/Controller/App/TrashControllerTest.php | 58 +++++++------ 9 files changed, 188 insertions(+), 109 deletions(-) create mode 100644 app/Http/Requests/TrashRestoreRequest.php create mode 100644 app/Repositories/TrashRepository.php diff --git a/app/Http/Controllers/App/TrashController.php b/app/Http/Controllers/App/TrashController.php index c5b2874c..e8ce5537 100644 --- a/app/Http/Controllers/App/TrashController.php +++ b/app/Http/Controllers/App/TrashController.php @@ -3,10 +3,12 @@ namespace App\Http\Controllers\App; use App\Http\Controllers\Controller; +use App\Http\Requests\TrashRestoreRequest; use App\Models\Link; use App\Models\LinkList; use App\Models\Note; use App\Models\Tag; +use App\Repositories\TrashRepository; use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; use Illuminate\View\View; @@ -47,45 +49,13 @@ public function index(): View /** * Permanently delete entries for a model from the trash. * - * @param Request $reques + * @param Request $request * @param string $model * @return RedirectResponse */ - public function clearTrash(Request $reques, $model): RedirectResponse + public function clearTrash(Request $request, $model): RedirectResponse { - $entries = []; - - switch ($model) { - case 'links': - $entries = Link::onlyTrashed() - ->byUser(auth()->id()) - ->get(); - break; - case 'lists': - $entries = LinkList::onlyTrashed() - ->byUser(auth()->id()) - ->get(); - break; - case 'tags': - $entries = Tag::onlyTrashed() - ->byUser(auth()->id()) - ->get(); - break; - case 'notes': - $entries = Note::onlyTrashed() - ->byUser(auth()->id()) - ->get(); - break; - } - - if ($entries->isEmpty()) { - flash(trans('trash.delete_no_entries'), 'warning'); - return redirect()->back(); - } - - foreach ($entries as $entry) { - $entry->forceDelete(); - } + TrashRepository::delete($model); flash(trans('trash.delete_success.' . $model), 'success'); @@ -95,41 +65,14 @@ public function clearTrash(Request $reques, $model): RedirectResponse /** * Restore an entry from the trash. * - * @param Request $request - * @param string $model - * @param string $id + * @param TrashRestoreRequest $request * @return RedirectResponse */ - public function restoreEntry(Request $request, $model, $id): RedirectResponse + public function restoreEntry(TrashRestoreRequest $request): RedirectResponse { - $entry = null; - - switch ($model) { - case 'link': - $entry = Link::withTrashed()->find($id); - break; - case 'list': - $entry = LinkList::withTrashed()->find($id); - break; - case 'tag': - $entry = Tag::withTrashed()->find($id); - break; - case 'note': - $entry = Note::withTrashed()->find($id); - break; - } - - if (empty($entry)) { - abort(404, trans('trash.restore.not_found')); - } - - if ($entry->user_id !== auth()->id()) { - abort(403, trans('trash.restore.not_allowed')); - } - - $entry->restore(); + TrashRepository::restore($request->input('model'), $request->input('id')); - flash(trans('trash.restore.' . $model), 'success'); + flash(trans('trash.restore.' . $request->input('model')), 'success'); return redirect()->route('get-trash'); } diff --git a/app/Http/Requests/TrashRestoreRequest.php b/app/Http/Requests/TrashRestoreRequest.php new file mode 100644 index 00000000..7e93c09c --- /dev/null +++ b/app/Http/Requests/TrashRestoreRequest.php @@ -0,0 +1,31 @@ + 'required|in:link,list,tag,note', + 'id' => 'required|numeric', + ]; + } +} diff --git a/app/Repositories/TrashRepository.php b/app/Repositories/TrashRepository.php new file mode 100644 index 00000000..e29c6df1 --- /dev/null +++ b/app/Repositories/TrashRepository.php @@ -0,0 +1,83 @@ +byUser(auth()->id()) + ->get(); + break; + case 'lists': + $entries = LinkList::onlyTrashed() + ->byUser(auth()->id()) + ->get(); + break; + case 'tags': + $entries = Tag::onlyTrashed() + ->byUser(auth()->id()) + ->get(); + break; + case 'notes': + $entries = Note::onlyTrashed() + ->byUser(auth()->id()) + ->get(); + break; + } + + foreach ($entries as $entry) { + $entry->forceDelete(); + } + + return true; + } + + /** + * Restores a specific model based on the given type and model ID. + * + * @param string $model + * @param int $id + * @return bool + */ + public static function restore(string $model, int $id): bool + { + switch ($model) { + case 'link': + $entry = Link::withTrashed()->findOrFail($id); + break; + case 'list': + $entry = LinkList::withTrashed()->findOrFail($id); + break; + case 'tag': + $entry = Tag::withTrashed()->findOrFail($id); + break; + case 'note': + $entry = Note::withTrashed()->findOrFail($id); + break; + default: + $entry = null; + } + + $entry->restore(); + + return true; + } +} diff --git a/resources/views/actions/trash/partials/link-table.blade.php b/resources/views/actions/trash/partials/link-table.blade.php index 23586181..5757105f 100644 --- a/resources/views/actions/trash/partials/link-table.blade.php +++ b/resources/views/actions/trash/partials/link-table.blade.php @@ -18,10 +18,14 @@ {{ formatDateTime($link->created_at) }} - - - +
+ @csrf + + + +
@endforeach diff --git a/resources/views/actions/trash/partials/list-table.blade.php b/resources/views/actions/trash/partials/list-table.blade.php index 12fd212e..105c4b7a 100644 --- a/resources/views/actions/trash/partials/list-table.blade.php +++ b/resources/views/actions/trash/partials/list-table.blade.php @@ -18,10 +18,14 @@ {{ formatDateTime($list->created_at) }} - - - +
+ @csrf + + + +
@endforeach diff --git a/resources/views/actions/trash/partials/note-table.blade.php b/resources/views/actions/trash/partials/note-table.blade.php index ce303db7..69f6cb15 100644 --- a/resources/views/actions/trash/partials/note-table.blade.php +++ b/resources/views/actions/trash/partials/note-table.blade.php @@ -24,10 +24,14 @@ {{ formatDateTime($note->created_at) }} - - - +
+ @csrf + + + +
@endforeach diff --git a/resources/views/actions/trash/partials/tag-table.blade.php b/resources/views/actions/trash/partials/tag-table.blade.php index 99a73521..c3ac6473 100644 --- a/resources/views/actions/trash/partials/tag-table.blade.php +++ b/resources/views/actions/trash/partials/tag-table.blade.php @@ -18,10 +18,14 @@ {{ formatDateTime($tag->created_at) }} - - - +
+ @csrf + + + +
@endforeach diff --git a/routes/web.php b/routes/web.php index 027bcc5c..79615337 100644 --- a/routes/web.php +++ b/routes/web.php @@ -111,7 +111,7 @@ ->name('get-trash'); Route::get('trash/clear/{model}', [TrashController::class, 'clearTrash']) ->name('clear-trash'); - Route::get('trash/restore/{model}/{id}', [TrashController::class, 'restoreEntry']) + Route::post('trash/restore', [TrashController::class, 'restoreEntry']) ->name('trash-restore'); Route::get('settings', [UserSettingsController::class, 'getUserSettings']) diff --git a/tests/Controller/App/TrashControllerTest.php b/tests/Controller/App/TrashControllerTest.php index 6aa83406..aa69db44 100644 --- a/tests/Controller/App/TrashControllerTest.php +++ b/tests/Controller/App/TrashControllerTest.php @@ -83,16 +83,6 @@ public function testValidTrashClearNotesResponse(): void $this->assertEquals(0, DB::table('notes')->count()); } - public function testTrashClearWithoutEntriesResponse(): void - { - $response = $this->get('trash/clear/links'); - - $response->assertStatus(302); - - $flashMessage = session('flash_notification', collect())->first(); - $this->assertEquals('No entries to be deleted.', $flashMessage['message']); - } - /* * Tests for restoring items */ @@ -101,9 +91,12 @@ public function testValidRestoreLinkResponse(): void { $this->setupTestData(); - $response = $this->get('trash/restore/link/1'); + $response = $this->post('trash/restore', [ + 'model' => 'link', + 'id' => '1', + ]); - $response->assertStatus(302); + $response->assertRedirect('trash'); $this->assertEquals(null, Link::find(1)->deleted_at); } @@ -111,9 +104,12 @@ public function testValidRestoreTagResponse(): void { $this->setupTestData(); - $response = $this->get('trash/restore/tag/1'); + $response = $this->post('trash/restore', [ + 'model' => 'tag', + 'id' => '1', + ]); - $response->assertStatus(302); + $response->assertRedirect('trash'); $this->assertEquals(null, Tag::find(1)->deleted_at); } @@ -121,7 +117,10 @@ public function testValidRestoreListResponse(): void { $this->setupTestData(); - $response = $this->get('trash/restore/list/1'); + $response = $this->post('trash/restore', [ + 'model' => 'list', + 'id' => '1', + ]); $response->assertStatus(302); $this->assertEquals(null, LinkList::find(1)->deleted_at); @@ -131,7 +130,10 @@ public function testValidRestoreNoteResponse(): void { $this->setupTestData(); - $response = $this->get('trash/restore/note/1'); + $response = $this->post('trash/restore', [ + 'model' => 'note', + 'id' => '1', + ]); $response->assertStatus(302); $this->assertEquals(null, Note::find(1)->deleted_at); @@ -141,23 +143,27 @@ public function testInvalidRestoreResponse(): void { $this->setupTestData(); - $response = $this->get('trash/restore/link/1234'); + $response = $this->post('trash/restore', [ + //'model' => 'link', + //'id' => '1', + ]); - $response->assertStatus(404) - ->assertSee('The item to be restored could not be found.'); + $response->assertSessionHasErrors([ + 'model', + 'id', + ]); } - public function testUnauthorizedRestoreResponse(): void + public function testRestoreWithMissingModel(): void { $this->setupTestData(); - $newUser = factory(User::class)->create(); - $this->actingAs($newUser); - - $response = $this->get('trash/restore/link/1'); + $response = $this->post('trash/restore', [ + 'model' => 'link', + 'id' => '1345235', + ]); - $response->assertStatus(403) - ->assertSee('You are not allowed to restore this item.'); + $response->assertStatus(404); } protected function setupTestData(): void From aa9ea211403d58af2f3227408b2211a78e6be8ea Mon Sep 17 00:00:00 2001 From: Kovah Date: Tue, 30 Jun 2020 23:39:44 +0200 Subject: [PATCH 35/44] Implement a form request for clearing the trash for models --- app/Http/Controllers/App/TrashController.php | 10 ++++---- routes/api.php | 12 ++++++++++ routes/web.php | 2 +- tests/Controller/App/TrashControllerTest.php | 24 +++++++++++++------- 4 files changed, 34 insertions(+), 14 deletions(-) diff --git a/app/Http/Controllers/App/TrashController.php b/app/Http/Controllers/App/TrashController.php index e8ce5537..b3b0d2bf 100644 --- a/app/Http/Controllers/App/TrashController.php +++ b/app/Http/Controllers/App/TrashController.php @@ -3,6 +3,7 @@ namespace App\Http\Controllers\App; use App\Http\Controllers\Controller; +use App\Http\Requests\TrashClearRequest; use App\Http\Requests\TrashRestoreRequest; use App\Models\Link; use App\Models\LinkList; @@ -49,15 +50,14 @@ public function index(): View /** * Permanently delete entries for a model from the trash. * - * @param Request $request - * @param string $model + * @param TrashClearRequest $request * @return RedirectResponse */ - public function clearTrash(Request $request, $model): RedirectResponse + public function clearTrash(TrashClearRequest $request): RedirectResponse { - TrashRepository::delete($model); + TrashRepository::delete($request->input('model')); - flash(trans('trash.delete_success.' . $model), 'success'); + flash(trans('trash.delete_success.' . $request->input('model')), 'success'); return redirect()->route('get-trash'); } diff --git a/routes/api.php b/routes/api.php index d082b2b9..8f377603 100644 --- a/routes/api.php +++ b/routes/api.php @@ -9,6 +9,7 @@ use App\Http\Controllers\API\SearchController; use App\Http\Controllers\API\TagController; use App\Http\Controllers\API\TagLinksController; +use App\Http\Controllers\API\TrashController; /* |-------------------------------------------------------------------------- @@ -77,5 +78,16 @@ ->name('api.search.tags'); Route::get('search/lists', [SearchController::class, 'searchLists']) ->name('api.search.lists'); + + Route::get('trash/links', [TrashController::class, 'getLinks']) + ->name('api.trash.links'); + Route::get('trash/lists', [TrashController::class, 'getLists']) + ->name('api.trash.lists'); + Route::get('trash/tags', [TrashController::class, 'getTags']) + ->name('api.trash.tags'); + Route::get('trash/notes', [TrashController::class, 'getNotes']) + ->name('api.trash.notes'); + Route::post('trash/delete', [TrashController::class, 'getNotes']) + ->name('api.trash.notes'); }); }); diff --git a/routes/web.php b/routes/web.php index 79615337..1055a968 100644 --- a/routes/web.php +++ b/routes/web.php @@ -109,7 +109,7 @@ Route::get('trash', [TrashController::class, 'index']) ->name('get-trash'); - Route::get('trash/clear/{model}', [TrashController::class, 'clearTrash']) + Route::post('trash/clear', [TrashController::class, 'clearTrash']) ->name('clear-trash'); Route::post('trash/restore', [TrashController::class, 'restoreEntry']) ->name('trash-restore'); diff --git a/tests/Controller/App/TrashControllerTest.php b/tests/Controller/App/TrashControllerTest.php index aa69db44..9dd220e4 100644 --- a/tests/Controller/App/TrashControllerTest.php +++ b/tests/Controller/App/TrashControllerTest.php @@ -43,9 +43,11 @@ public function testValidTrashClearLinksResponse(): void { $this->setupTestData(); - $response = $this->get('trash/clear/links'); + $response = $this->post('trash/clear', [ + 'model' => 'links' + ]); - $response->assertStatus(302); + $response->assertRedirect('trash'); $this->assertEquals(0, DB::table('links')->count()); } @@ -54,9 +56,11 @@ public function testValidTrashClearTagsResponse(): void { $this->setupTestData(); - $response = $this->get('trash/clear/tags'); + $response = $this->post('trash/clear', [ + 'model' => 'tags' + ]); - $response->assertStatus(302); + $response->assertRedirect('trash'); $this->assertEquals(0, DB::table('tags')->count()); } @@ -65,9 +69,11 @@ public function testValidTrashClearListsResponse(): void { $this->setupTestData(); - $response = $this->get('trash/clear/lists'); + $response = $this->post('trash/clear', [ + 'model' => 'lists' + ]); - $response->assertStatus(302); + $response->assertRedirect('trash'); $this->assertEquals(0, DB::table('lists')->count()); } @@ -76,9 +82,11 @@ public function testValidTrashClearNotesResponse(): void { $this->setupTestData(); - $response = $this->get('trash/clear/notes'); + $response = $this->post('trash/clear', [ + 'model' => 'notes' + ]); - $response->assertStatus(302); + $response->assertRedirect('trash'); $this->assertEquals(0, DB::table('notes')->count()); } From b75c212b5f0c0152eecd66a5bf94d0cc3369ce6f Mon Sep 17 00:00:00 2001 From: Kovah Date: Wed, 1 Jul 2020 00:14:49 +0200 Subject: [PATCH 36/44] Add a new endpoint for handling the trash (#6) Also optimizes existing tests for the trash controller with a new trait --- app/Http/Controllers/API/TrashController.php | 80 ++++++ app/Http/Controllers/App/TrashController.php | 1 - app/Http/Requests/TrashClearRequest.php | 30 +++ routes/api.php | 7 +- tests/Controller/API/TrashApiTest.php | 241 +++++++++++++++++++ tests/Controller/App/TrashControllerTest.php | 74 ++---- tests/Controller/Traits/PreparesTrash.php | 57 +++++ 7 files changed, 427 insertions(+), 63 deletions(-) create mode 100644 app/Http/Controllers/API/TrashController.php create mode 100644 app/Http/Requests/TrashClearRequest.php create mode 100644 tests/Controller/API/TrashApiTest.php create mode 100644 tests/Controller/Traits/PreparesTrash.php diff --git a/app/Http/Controllers/API/TrashController.php b/app/Http/Controllers/API/TrashController.php new file mode 100644 index 00000000..b81ecfcc --- /dev/null +++ b/app/Http/Controllers/API/TrashController.php @@ -0,0 +1,80 @@ +byUser($request->user()->id) + ->get(); + + return response()->json($links->toArray()); + } + + public function getLists(Request $request) + { + $lists = LinkList::onlyTrashed() + ->byUser($request->user()->id) + ->get(); + + return response()->json($lists); + } + + public function getTags(Request $request) + { + $tags = Tag::onlyTrashed() + ->byUser($request->user()->id) + ->get(); + + return response()->json($tags); + } + + public function getNotes(Request $request) + { + $notes = Note::onlyTrashed() + ->byUser($request->user()->id) + ->get(); + + return response()->json($notes); + } + + /** + * Permanently delete entries for a model from the trash. + * + * @param TrashClearRequest $request + * @return JsonResponse + */ + public function clear(TrashClearRequest $request): JsonResponse + { + TrashRepository::delete($request->input('model')); + + return response()->json(null, Response::HTTP_OK); + } + + /** + * Restore an entry from the trash. + * + * @param TrashRestoreRequest $request + * @return JsonResponse + */ + public function restore(TrashRestoreRequest $request): JsonResponse + { + TrashRepository::restore($request->input('model'), $request->input('id')); + + return response()->json(null, Response::HTTP_OK); + } +} diff --git a/app/Http/Controllers/App/TrashController.php b/app/Http/Controllers/App/TrashController.php index b3b0d2bf..2be9ecd3 100644 --- a/app/Http/Controllers/App/TrashController.php +++ b/app/Http/Controllers/App/TrashController.php @@ -11,7 +11,6 @@ use App\Models\Tag; use App\Repositories\TrashRepository; use Illuminate\Http\RedirectResponse; -use Illuminate\Http\Request; use Illuminate\View\View; class TrashController extends Controller diff --git a/app/Http/Requests/TrashClearRequest.php b/app/Http/Requests/TrashClearRequest.php new file mode 100644 index 00000000..95931c9c --- /dev/null +++ b/app/Http/Requests/TrashClearRequest.php @@ -0,0 +1,30 @@ + 'required|in:links,lists,tags,notes', + ]; + } +} diff --git a/routes/api.php b/routes/api.php index 8f377603..01db6d58 100644 --- a/routes/api.php +++ b/routes/api.php @@ -87,7 +87,10 @@ ->name('api.trash.tags'); Route::get('trash/notes', [TrashController::class, 'getNotes']) ->name('api.trash.notes'); - Route::post('trash/delete', [TrashController::class, 'getNotes']) - ->name('api.trash.notes'); + + Route::post('trash/clear', [TrashController::class, 'clear']) + ->name('api.trash.clear'); + Route::post('trash/restore', [TrashController::class, 'restore']) + ->name('api.trash.restore'); }); }); diff --git a/tests/Controller/API/TrashApiTest.php b/tests/Controller/API/TrashApiTest.php new file mode 100644 index 00000000..a81fef7f --- /dev/null +++ b/tests/Controller/API/TrashApiTest.php @@ -0,0 +1,241 @@ +setupTrashTestData(); + } + + public function testUnauthorizedRequest(): void + { + $response = $this->getJson('api/v1/trash/links'); + + $response->assertUnauthorized(); + } + + public function testGetLinks(): void + { + $response = $this->getJson('api/v1/trash/links', $this->generateHeaders()); + + $response->assertStatus(200); + + $result = json_decode($response->content()); + $this->assertEquals('Very special site title', $result[0]->title); + } + + public function testGetLists(): void + { + $response = $this->getJson('api/v1/trash/lists', $this->generateHeaders()); + + $response->assertStatus(200); + + $result = json_decode($response->content()); + $this->assertEquals('A Tests List', $result[0]->name); + } + + public function testGetTags(): void + { + $response = $this->getJson('api/v1/trash/tags', $this->generateHeaders()); + + $response->assertStatus(200); + + $result = json_decode($response->content()); + $this->assertEquals('Examples', $result[0]->name); + } + + public function testGetNotes(): void + { + $response = $this->getJson('api/v1/trash/notes', $this->generateHeaders()); + + $response->assertStatus(200); + + $result = json_decode($response->content()); + $this->assertEquals('Quisque placerat facilisis egestas cillum dolore.', $result[0]->note); + } + + /* + * Tests for clearing the trash + */ + + public function testValidTrashClearLinksResponse(): void + { + $this->setupTrashTestData(); + + $response = $this->postJson('api/v1/trash/clear', [ + 'model' => 'links', + ], $this->generateHeaders()); + + $response->assertOk(); + + $this->assertEquals(0, DB::table('links')->count()); + } + + public function testValidTrashClearTagsResponse(): void + { + $this->setupTrashTestData(); + + $response = $this->postJson('api/v1/trash/clear', [ + 'model' => 'tags', + ], $this->generateHeaders()); + + $response->assertOk(); + + $this->assertEquals(0, DB::table('tags')->count()); + } + + public function testValidTrashClearListsResponse(): void + { + $this->setupTrashTestData(); + + $response = $this->postJson('api/v1/trash/clear', [ + 'model' => 'lists', + ], $this->generateHeaders()); + + $response->assertOk(); + + $this->assertEquals(0, DB::table('lists')->count()); + } + + public function testValidTrashClearNotesResponse(): void + { + $this->setupTrashTestData(); + + $response = $this->postJson('api/v1/trash/clear', [ + 'model' => 'notes', + ], $this->generateHeaders()); + + $response->assertOk(); + + $this->assertEquals(0, DB::table('notes')->count()); + } + + public function testInvalidTrashClearRequest(): void + { + $this->setupTrashTestData(); + + $response = $this->postJson('api/v1/trash/clear', [ + //'model' => 'links', + ], $this->generateHeaders()); + + $response->assertJsonValidationErrors([ + 'model' => 'The model field is required.', + ]); + } + + public function testClearRequestWithInvalidModel(): void + { + $this->setupTrashTestData(); + + $response = $this->postJson('api/v1/trash/clear', [ + 'model' => 'shoes', + ], $this->generateHeaders()); + + $response->assertJsonValidationErrors([ + 'model' => 'The selected model is invalid.', + ]); + } + + /* + * Tests for restoring items + */ + + public function testValidRestoreLinkResponse(): void + { + $this->setupTrashTestData(); + + $response = $this->postJson('api/v1/trash/restore', [ + 'model' => 'link', + 'id' => '1', + ], $this->generateHeaders()); + + $response->assertOk(); + + $this->assertEquals(null, Link::find(1)->deleted_at); + } + + public function testValidRestoreTagResponse(): void + { + $this->setupTrashTestData(); + + $response = $this->postJson('api/v1/trash/restore', [ + 'model' => 'tag', + 'id' => '1', + ], $this->generateHeaders()); + + $response->assertOk(); + + $this->assertEquals(null, Tag::find(1)->deleted_at); + } + + public function testValidRestoreListResponse(): void + { + $this->setupTrashTestData(); + + $response = $this->postJson('api/v1/trash/restore', [ + 'model' => 'list', + 'id' => '1', + ], $this->generateHeaders()); + + $response->assertOk(); + + $this->assertEquals(null, LinkList::find(1)->deleted_at); + } + + public function testValidRestoreNoteResponse(): void + { + $this->setupTrashTestData(); + + $response = $this->postJson('api/v1/trash/restore', [ + 'model' => 'note', + 'id' => '1', + ], $this->generateHeaders()); + + $response->assertOk(); + + $this->assertEquals(null, Note::find(1)->deleted_at); + } + + public function testInvalidRestoreResponse(): void + { + $this->setupTrashTestData(); + + $response = $this->postJson('api/v1/trash/restore', [ + //'model' => 'link', + //'id' => '1', + ], $this->generateHeaders()); + + $response->assertJsonValidationErrors([ + 'model', + 'id', + ]); + } + + public function testRestoreWithMissingModel(): void + { + $this->setupTrashTestData(); + + $response = $this->postJson('api/v1/trash/restore', [ + 'model' => 'link', + 'id' => '1345235', + ], $this->generateHeaders()); + + $response->assertStatus(404); + } +} diff --git a/tests/Controller/App/TrashControllerTest.php b/tests/Controller/App/TrashControllerTest.php index 9dd220e4..dc049923 100644 --- a/tests/Controller/App/TrashControllerTest.php +++ b/tests/Controller/App/TrashControllerTest.php @@ -10,21 +10,21 @@ use Illuminate\Foundation\Testing\DatabaseMigrations; use Illuminate\Foundation\Testing\DatabaseTransactions; use Illuminate\Support\Facades\DB; +use Tests\Controller\Traits\PreparesTrash; use Tests\TestCase; class TrashControllerTest extends TestCase { use DatabaseTransactions; use DatabaseMigrations; - - private $user; + use PreparesTrash; public function setUp(): void { parent::setUp(); - $this->user = factory(User::class)->create(); - $this->actingAs($this->user); + $user = factory(User::class)->create(); + $this->actingAs($user); } public function testValidTrashResponse(): void @@ -41,7 +41,7 @@ public function testValidTrashResponse(): void public function testValidTrashClearLinksResponse(): void { - $this->setupTestData(); + $this->setupTrashTestData(); $response = $this->post('trash/clear', [ 'model' => 'links' @@ -54,7 +54,7 @@ public function testValidTrashClearLinksResponse(): void public function testValidTrashClearTagsResponse(): void { - $this->setupTestData(); + $this->setupTrashTestData(); $response = $this->post('trash/clear', [ 'model' => 'tags' @@ -67,7 +67,7 @@ public function testValidTrashClearTagsResponse(): void public function testValidTrashClearListsResponse(): void { - $this->setupTestData(); + $this->setupTrashTestData(); $response = $this->post('trash/clear', [ 'model' => 'lists' @@ -80,7 +80,7 @@ public function testValidTrashClearListsResponse(): void public function testValidTrashClearNotesResponse(): void { - $this->setupTestData(); + $this->setupTrashTestData(); $response = $this->post('trash/clear', [ 'model' => 'notes' @@ -97,7 +97,7 @@ public function testValidTrashClearNotesResponse(): void public function testValidRestoreLinkResponse(): void { - $this->setupTestData(); + $this->setupTrashTestData(); $response = $this->post('trash/restore', [ 'model' => 'link', @@ -110,7 +110,7 @@ public function testValidRestoreLinkResponse(): void public function testValidRestoreTagResponse(): void { - $this->setupTestData(); + $this->setupTrashTestData(); $response = $this->post('trash/restore', [ 'model' => 'tag', @@ -123,7 +123,7 @@ public function testValidRestoreTagResponse(): void public function testValidRestoreListResponse(): void { - $this->setupTestData(); + $this->setupTrashTestData(); $response = $this->post('trash/restore', [ 'model' => 'list', @@ -136,7 +136,7 @@ public function testValidRestoreListResponse(): void public function testValidRestoreNoteResponse(): void { - $this->setupTestData(); + $this->setupTrashTestData(); $response = $this->post('trash/restore', [ 'model' => 'note', @@ -149,7 +149,7 @@ public function testValidRestoreNoteResponse(): void public function testInvalidRestoreResponse(): void { - $this->setupTestData(); + $this->setupTrashTestData(); $response = $this->post('trash/restore', [ //'model' => 'link', @@ -164,7 +164,7 @@ public function testInvalidRestoreResponse(): void public function testRestoreWithMissingModel(): void { - $this->setupTestData(); + $this->setupTrashTestData(); $response = $this->post('trash/restore', [ 'model' => 'link', @@ -173,50 +173,4 @@ public function testRestoreWithMissingModel(): void $response->assertStatus(404); } - - protected function setupTestData(): void - { - $tagExample = Tag::create([ - 'name' => 'Examples', - 'user_id' => $this->user->id, - ]); - - $listTest = LinkList::create([ - 'name' => 'A Tests List', - 'user_id' => $this->user->id, - ]); - - $linkExample = Link::create([ - 'user_id' => $this->user->id, - 'url' => 'https://example.com', - 'title' => 'Very special site title', - 'description' => 'Some description for this site', - 'is_private' => true, - ]); - - $linkExample->tags()->attach($tagExample->id); - - $linkExampleNote = Note::create([ - 'user_id' => $this->user->id, - 'link_id' => $linkExample->id, - 'note' => 'Quisque placerat facilisis egestas cillum dolore.', - 'is_private' => false, - ]); - - $linkTest = Link::create([ - 'user_id' => $this->user->id, - 'url' => 'https://test.com', - 'title' => 'Test Site', - 'description' => null, - 'is_private' => false, - ]); - - $linkTest->lists()->attach($listTest->id); - - $tagExample->delete(); - $listTest->delete(); - $linkExample->delete(); - $linkExampleNote->delete(); - $linkTest->delete(); - } } diff --git a/tests/Controller/Traits/PreparesTrash.php b/tests/Controller/Traits/PreparesTrash.php new file mode 100644 index 00000000..224713e5 --- /dev/null +++ b/tests/Controller/Traits/PreparesTrash.php @@ -0,0 +1,57 @@ + 'Examples', + 'user_id' => $this->user->id, + ]); + + $listTest = LinkList::create([ + 'name' => 'A Tests List', + 'user_id' => $this->user->id, + ]); + + $linkExample = Link::create([ + 'user_id' => $this->user->id, + 'url' => 'https://example.com', + 'title' => 'Very special site title', + 'description' => 'Some description for this site', + 'is_private' => true, + ]); + + $linkExample->tags()->attach($tagExample->id); + + $linkExampleNote = Note::create([ + 'user_id' => $this->user->id, + 'link_id' => $linkExample->id, + 'note' => 'Quisque placerat facilisis egestas cillum dolore.', + 'is_private' => false, + ]); + + $linkTest = Link::create([ + 'user_id' => $this->user->id, + 'url' => 'https://test.com', + 'title' => 'Test Site', + 'description' => null, + 'is_private' => false, + ]); + + $linkTest->lists()->attach($listTest->id); + + $tagExample->delete(); + $listTest->delete(); + $linkExample->delete(); + $linkExampleNote->delete(); + $linkTest->delete(); + } +} From 525a0b510dfe76f1bc3f8bf9d144cd2259688e13 Mon Sep 17 00:00:00 2001 From: Kovah Date: Wed, 1 Jul 2020 00:21:29 +0200 Subject: [PATCH 37/44] Correct missing property for trash controller test --- tests/Controller/App/TrashControllerTest.php | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/tests/Controller/App/TrashControllerTest.php b/tests/Controller/App/TrashControllerTest.php index dc049923..96b7d237 100644 --- a/tests/Controller/App/TrashControllerTest.php +++ b/tests/Controller/App/TrashControllerTest.php @@ -19,12 +19,15 @@ class TrashControllerTest extends TestCase use DatabaseMigrations; use PreparesTrash; + /** @var User */ + private $user; + public function setUp(): void { parent::setUp(); - $user = factory(User::class)->create(); - $this->actingAs($user); + $this->user = factory(User::class)->create(); + $this->actingAs($this->user); } public function testValidTrashResponse(): void From c5861348626a5564a34748e0d335857af878e50f Mon Sep 17 00:00:00 2001 From: Kovah Date: Wed, 1 Jul 2020 00:45:47 +0200 Subject: [PATCH 38/44] Move to specific delete and patch http methods for API calls (#6) --- routes/api.php | 4 ++-- tests/Controller/API/TrashApiTest.php | 34 +++++++++++++-------------- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/routes/api.php b/routes/api.php index 01db6d58..e27c0f32 100644 --- a/routes/api.php +++ b/routes/api.php @@ -88,9 +88,9 @@ Route::get('trash/notes', [TrashController::class, 'getNotes']) ->name('api.trash.notes'); - Route::post('trash/clear', [TrashController::class, 'clear']) + Route::delete('trash/clear', [TrashController::class, 'clear']) ->name('api.trash.clear'); - Route::post('trash/restore', [TrashController::class, 'restore']) + Route::patch('trash/restore', [TrashController::class, 'restore']) ->name('api.trash.restore'); }); }); diff --git a/tests/Controller/API/TrashApiTest.php b/tests/Controller/API/TrashApiTest.php index a81fef7f..2f93877b 100644 --- a/tests/Controller/API/TrashApiTest.php +++ b/tests/Controller/API/TrashApiTest.php @@ -34,7 +34,7 @@ public function testGetLinks(): void { $response = $this->getJson('api/v1/trash/links', $this->generateHeaders()); - $response->assertStatus(200); + $response->assertOk(); $result = json_decode($response->content()); $this->assertEquals('Very special site title', $result[0]->title); @@ -44,7 +44,7 @@ public function testGetLists(): void { $response = $this->getJson('api/v1/trash/lists', $this->generateHeaders()); - $response->assertStatus(200); + $response->assertOk(); $result = json_decode($response->content()); $this->assertEquals('A Tests List', $result[0]->name); @@ -54,7 +54,7 @@ public function testGetTags(): void { $response = $this->getJson('api/v1/trash/tags', $this->generateHeaders()); - $response->assertStatus(200); + $response->assertOk(); $result = json_decode($response->content()); $this->assertEquals('Examples', $result[0]->name); @@ -64,7 +64,7 @@ public function testGetNotes(): void { $response = $this->getJson('api/v1/trash/notes', $this->generateHeaders()); - $response->assertStatus(200); + $response->assertOk(); $result = json_decode($response->content()); $this->assertEquals('Quisque placerat facilisis egestas cillum dolore.', $result[0]->note); @@ -78,7 +78,7 @@ public function testValidTrashClearLinksResponse(): void { $this->setupTrashTestData(); - $response = $this->postJson('api/v1/trash/clear', [ + $response = $this->deleteJson('api/v1/trash/clear', [ 'model' => 'links', ], $this->generateHeaders()); @@ -91,7 +91,7 @@ public function testValidTrashClearTagsResponse(): void { $this->setupTrashTestData(); - $response = $this->postJson('api/v1/trash/clear', [ + $response = $this->deleteJson('api/v1/trash/clear', [ 'model' => 'tags', ], $this->generateHeaders()); @@ -104,7 +104,7 @@ public function testValidTrashClearListsResponse(): void { $this->setupTrashTestData(); - $response = $this->postJson('api/v1/trash/clear', [ + $response = $this->deleteJson('api/v1/trash/clear', [ 'model' => 'lists', ], $this->generateHeaders()); @@ -117,7 +117,7 @@ public function testValidTrashClearNotesResponse(): void { $this->setupTrashTestData(); - $response = $this->postJson('api/v1/trash/clear', [ + $response = $this->deleteJson('api/v1/trash/clear', [ 'model' => 'notes', ], $this->generateHeaders()); @@ -130,7 +130,7 @@ public function testInvalidTrashClearRequest(): void { $this->setupTrashTestData(); - $response = $this->postJson('api/v1/trash/clear', [ + $response = $this->deleteJson('api/v1/trash/clear', [ //'model' => 'links', ], $this->generateHeaders()); @@ -143,7 +143,7 @@ public function testClearRequestWithInvalidModel(): void { $this->setupTrashTestData(); - $response = $this->postJson('api/v1/trash/clear', [ + $response = $this->deleteJson('api/v1/trash/clear', [ 'model' => 'shoes', ], $this->generateHeaders()); @@ -160,7 +160,7 @@ public function testValidRestoreLinkResponse(): void { $this->setupTrashTestData(); - $response = $this->postJson('api/v1/trash/restore', [ + $response = $this->patchJson('api/v1/trash/restore', [ 'model' => 'link', 'id' => '1', ], $this->generateHeaders()); @@ -174,7 +174,7 @@ public function testValidRestoreTagResponse(): void { $this->setupTrashTestData(); - $response = $this->postJson('api/v1/trash/restore', [ + $response = $this->patchJson('api/v1/trash/restore', [ 'model' => 'tag', 'id' => '1', ], $this->generateHeaders()); @@ -188,7 +188,7 @@ public function testValidRestoreListResponse(): void { $this->setupTrashTestData(); - $response = $this->postJson('api/v1/trash/restore', [ + $response = $this->patchJson('api/v1/trash/restore', [ 'model' => 'list', 'id' => '1', ], $this->generateHeaders()); @@ -202,7 +202,7 @@ public function testValidRestoreNoteResponse(): void { $this->setupTrashTestData(); - $response = $this->postJson('api/v1/trash/restore', [ + $response = $this->patchJson('api/v1/trash/restore', [ 'model' => 'note', 'id' => '1', ], $this->generateHeaders()); @@ -216,7 +216,7 @@ public function testInvalidRestoreResponse(): void { $this->setupTrashTestData(); - $response = $this->postJson('api/v1/trash/restore', [ + $response = $this->patchJson('api/v1/trash/restore', [ //'model' => 'link', //'id' => '1', ], $this->generateHeaders()); @@ -231,11 +231,11 @@ public function testRestoreWithMissingModel(): void { $this->setupTrashTestData(); - $response = $this->postJson('api/v1/trash/restore', [ + $response = $this->patchJson('api/v1/trash/restore', [ 'model' => 'link', 'id' => '1345235', ], $this->generateHeaders()); - $response->assertStatus(404); + $response->assertNotFound(); } } From 6e95f98396aed82b80cd446b909b78f944d6bad2 Mon Sep 17 00:00:00 2001 From: Kovah Date: Wed, 1 Jul 2020 23:16:13 +0200 Subject: [PATCH 39/44] Refactor API tests with simplified request authentication (#6) Also fixes issues with the update requests checks for unique values --- .../Requests/Models/LinkUpdateRequest.php | 7 +- .../Requests/Models/ListUpdateRequest.php | 7 +- app/Http/Requests/Models/TagUpdateRequest.php | 7 +- tests/Controller/API/ApiTestCase.php | 59 ++++++++++- tests/Controller/API/LinkApiTest.php | 98 ++++++++++--------- tests/Controller/API/LinkCheckApiTest.php | 12 +-- tests/Controller/API/LinkNotesTest.php | 14 +-- tests/Controller/API/ListApiTest.php | 81 +++++++-------- tests/Controller/API/ListLinksTest.php | 14 +-- tests/Controller/API/NoteApiTest.php | 66 ++++++------- tests/Controller/API/SearchLinksTest.php | 46 ++++----- tests/Controller/API/SearchListsTest.php | 16 +-- tests/Controller/API/SearchTagsTest.php | 16 +-- tests/Controller/API/TagApiTest.php | 80 ++++++++------- tests/Controller/API/TagLinksTest.php | 14 +-- tests/Controller/API/TrashApiTest.php | 60 ++++++------ 16 files changed, 333 insertions(+), 264 deletions(-) diff --git a/app/Http/Requests/Models/LinkUpdateRequest.php b/app/Http/Requests/Models/LinkUpdateRequest.php index 2e83098b..ee5dce3e 100644 --- a/app/Http/Requests/Models/LinkUpdateRequest.php +++ b/app/Http/Requests/Models/LinkUpdateRequest.php @@ -30,7 +30,12 @@ public function authorize(Request $request) { $this->isApiRequest = $request->isJson(); - $this->requireUniqueUrl = Link::urlHasChanged($request->route('link'), $request->input('url', '')); + if ($request->input('url') !== null) { + $this->requireUniqueUrl = Link::urlHasChanged( + $request->route('link'), + $request->input('url') + ); + } return true; } diff --git a/app/Http/Requests/Models/ListUpdateRequest.php b/app/Http/Requests/Models/ListUpdateRequest.php index edc5f26c..af218379 100644 --- a/app/Http/Requests/Models/ListUpdateRequest.php +++ b/app/Http/Requests/Models/ListUpdateRequest.php @@ -25,7 +25,12 @@ class ListUpdateRequest extends FormRequest */ public function authorize(Request $request) { - $this->requireUniqueName = LinkList::nameHasChanged($request->route('list'), $request->input('name', '')); + if ($request->input('name') !== null) { + $this->requireUniqueName = LinkList::nameHasChanged( + $request->route('list'), + $request->input('name') + ); + } return true; } diff --git a/app/Http/Requests/Models/TagUpdateRequest.php b/app/Http/Requests/Models/TagUpdateRequest.php index f4d5532b..65a40815 100644 --- a/app/Http/Requests/Models/TagUpdateRequest.php +++ b/app/Http/Requests/Models/TagUpdateRequest.php @@ -25,7 +25,12 @@ class TagUpdateRequest extends FormRequest */ public function authorize(Request $request) { - $this->requireUniqueName = Tag::nameHasChanged($request->route('tag'), $request->input('name', '')); + if ($request->input('name') !== null) { + $this->requireUniqueName = Tag::nameHasChanged( + $request->route('tag'), + $request->input('name') + ); + } return true; } diff --git a/tests/Controller/API/ApiTestCase.php b/tests/Controller/API/ApiTestCase.php index e24ef894..d9c24d8c 100644 --- a/tests/Controller/API/ApiTestCase.php +++ b/tests/Controller/API/ApiTestCase.php @@ -4,7 +4,9 @@ use App\Models\User; use Illuminate\Support\Facades\Http; +use Illuminate\Support\Facades\Notification; use Illuminate\Support\Facades\Queue; +use Illuminate\Testing\TestResponse; use Tests\TestCase; abstract class ApiTestCase extends TestCase @@ -19,6 +21,7 @@ protected function setUp(): void $this->user = factory(User::class)->create(); Queue::fake(); + Notification::fake(); $testHtml = '' . 'Example Title' . @@ -30,10 +33,58 @@ protected function setUp(): void ]); } - protected function generateHeaders(): array + /** + * Send an authorized JSON request for the GET method. + * + * @param string $uri + * @param array $headers + * @return TestResponse + */ + public function getJsonAuthorized($uri, array $headers = []): TestResponse { - return [ - 'Authorization' => 'Bearer ' . $this->user->api_token, - ]; + $headers['Authorization'] = 'Bearer ' . $this->user->api_token; + return $this->getJson($uri, $headers); + } + + /** + * Send an authorized JSON request for the POST method. + * + * @param string $uri + * @param array $data + * @param array $headers + * @return TestResponse + */ + public function postJsonAuthorized($uri, array $data = [], array $headers = []): TestResponse + { + $headers['Authorization'] = 'Bearer ' . $this->user->api_token; + return $this->postJson($uri, $data, $headers); + } + + /** + * Send an authorized JSON request for the PATCH method. + * + * @param string $uri + * @param array $data + * @param array $headers + * @return TestResponse + */ + public function patchJsonAuthorized($uri, array $data = [], array $headers = []): TestResponse + { + $headers['Authorization'] = 'Bearer ' . $this->user->api_token; + return $this->patchJson($uri, $data, $headers); + } + + /** + * Send an authorized JSON request for the DELETE method. + * + * @param string $uri + * @param array $data + * @param array $headers + * @return TestResponse + */ + public function deleteJsonAuthorized($uri, array $data = [], array $headers = []): TestResponse + { + $headers['Authorization'] = 'Bearer ' . $this->user->api_token; + return $this->deleteJson($uri, $data, $headers); } } diff --git a/tests/Controller/API/LinkApiTest.php b/tests/Controller/API/LinkApiTest.php index 1dfe0c65..a0c8fb12 100644 --- a/tests/Controller/API/LinkApiTest.php +++ b/tests/Controller/API/LinkApiTest.php @@ -26,9 +26,9 @@ public function testIndexRequest(): void { $link = factory(Link::class)->create(); - $response = $this->getJson('api/v1/links', $this->generateHeaders()); + $response = $this->getJsonAuthorized('api/v1/links'); - $response->assertStatus(200) + $response->assertOk() ->assertJson([ 'data' => [ ['url' => $link->url], @@ -38,11 +38,11 @@ public function testIndexRequest(): void public function testMinimalCreateRequest(): void { - $response = $this->postJson('api/v1/links', [ + $response = $this->postJsonAuthorized('api/v1/links', [ 'url' => 'http://example.com', - ], $this->generateHeaders()); + ]); - $response->assertStatus(200) + $response->assertOk() ->assertJson([ 'url' => 'http://example.com', ]); @@ -57,7 +57,7 @@ public function testFullCreateRequest(): void $list = factory(LinkList::class)->create(); $tag = factory(Tag::class)->create(); - $response = $this->postJson('api/v1/links', [ + $response = $this->postJsonAuthorized('api/v1/links', [ 'url' => 'http://example.com', 'title' => 'Search the Web', 'description' => 'There could be a description here', @@ -65,9 +65,9 @@ public function testFullCreateRequest(): void 'tags' => [$tag->id], 'is_private' => false, 'check_disabled' => false, - ], $this->generateHeaders()); + ]); - $response->assertStatus(200) + $response->assertOk() ->assertJson([ 'url' => 'http://example.com', ]); @@ -81,31 +81,30 @@ public function testFullCreateRequest(): void public function testInvalidCreateRequest(): void { - $response = $this->postJson('api/v1/links', [ + $response = $this->postJsonAuthorized('api/v1/links', [ 'url' => null, 'lists' => 'no array', 'tags' => 123, 'is_private' => 'hello', 'check_disabled' => 'bla', - ], $this->generateHeaders()); - - $response->assertStatus(422) - ->assertJsonValidationErrors([ - 'url', - 'lists', - 'tags', - 'is_private', - 'check_disabled', - ]); + ]); + + $response->assertJsonValidationErrors([ + 'url' => 'The url field is required.', + 'lists' => 'The lists must be an array.', + 'tags' => 'The tags must be an array.', + 'is_private' => 'The is private field must be true or false.', + 'check_disabled' => 'The check disabled field must be true or false.', + ]); } public function testShowRequest(): void { $link = factory(Link::class)->create(); - $response = $this->getJson('api/v1/links/1', $this->generateHeaders()); + $response = $this->getJsonAuthorized('api/v1/links/1'); - $response->assertStatus(200) + $response->assertOk() ->assertJson([ 'url' => $link->url, ]); @@ -120,9 +119,9 @@ public function testShowRequestWithRelations(): void $link->lists()->sync([$list->id]); $link->tags()->sync([$tag->id]); - $response = $this->getJson('api/v1/links/1', $this->generateHeaders()); + $response = $this->getJsonAuthorized('api/v1/links/1'); - $response->assertStatus(200) + $response->assertOk() ->assertJson([ 'url' => $link->url, 'lists' => [ @@ -136,26 +135,26 @@ public function testShowRequestWithRelations(): void public function testShowRequestNotFound(): void { - $response = $this->getJson('api/v1/links/1', $this->generateHeaders()); + $response = $this->getJsonAuthorized('api/v1/links/1'); - $response->assertStatus(404); + $response->assertNotFound(); } public function testUpdateRequest(): void { - $link = factory(Link::class)->create(); + factory(Link::class)->create(); $list = factory(LinkList::class)->create(); - $response = $this->patchJson('api/v1/links/1', [ + $response = $this->patchJsonAuthorized('api/v1/links/1', [ 'url' => 'http://example.com', 'title' => 'Custom Title', 'description' => 'Custom Description', 'lists' => [$list->id], 'is_private' => false, 'check_disabled' => false, - ], $this->generateHeaders()); + ]); - $response->assertStatus(200) + $response->assertOk() ->assertJson([ 'url' => 'http://example.com', ]); @@ -167,21 +166,28 @@ public function testUpdateRequest(): void public function testInvalidUpdateRequest(): void { - $link = factory(Link::class)->create(); + factory(Link::class)->create(); - $response = $this->patchJson('api/v1/links/1', [ - // - ], $this->generateHeaders()); - - $response->assertStatus(422) - ->assertJsonValidationErrors([ - 'url', - ]); + $response = $this->patchJsonAuthorized('api/v1/links/1', [ + 'url' => null, + 'lists' => 'no array', + 'tags' => 123, + 'is_private' => 'hello', + 'check_disabled' => 'bla', + ]); + + $response->assertJsonValidationErrors([ + 'url' => 'The url field is required.', + 'lists' => 'The lists must be an array.', + 'tags' => 'The tags must be an array.', + 'is_private' => 'The is private field must be true or false.', + 'check_disabled' => 'The check disabled field must be true or false.', + ]); } public function testUpdateRequestNotFound(): void { - $response = $this->patchJson('api/v1/links/1', [ + $response = $this->patchJsonAuthorized('api/v1/links/1', [ 'url' => 'http://example.com', 'title' => 'Custom Title', 'description' => 'Custom Description', @@ -189,26 +195,26 @@ public function testUpdateRequestNotFound(): void 'tags' => [], 'is_private' => false, 'check_disabled' => false, - ], $this->generateHeaders()); + ]); - $response->assertStatus(404); + $response->assertNotFound(); } public function testDeleteRequest(): void { - $link = factory(Link::class)->create(); + factory(Link::class)->create(); - $response = $this->deleteJson('api/v1/links/1', [], $this->generateHeaders()); + $response = $this->deleteJsonAuthorized('api/v1/links/1'); - $response->assertStatus(200); + $response->assertOk(); $this->assertEquals(0, Link::count()); } public function testDeleteRequestNotFound(): void { - $response = $this->deleteJson('api/v1/links/1', [], $this->generateHeaders()); + $response = $this->deleteJsonAuthorized('api/v1/links/1'); - $response->assertStatus(404); + $response->assertNotFound(); } } diff --git a/tests/Controller/API/LinkCheckApiTest.php b/tests/Controller/API/LinkCheckApiTest.php index 1355b1ce..1ab40546 100644 --- a/tests/Controller/API/LinkCheckApiTest.php +++ b/tests/Controller/API/LinkCheckApiTest.php @@ -24,9 +24,9 @@ public function testSuccessfulLinkCheck(): void 'url' => 'https://example.com', ]); - $response = $this->getJson('api/v1/links/check?url=https://example.com', $this->generateHeaders()); + $response = $this->getJsonAuthorized('api/v1/links/check?url=https://example.com'); - $response->assertStatus(200) + $response->assertOk() ->assertJson([ 'linksFound' => true, ]); @@ -38,9 +38,9 @@ public function testNegativeLinkCheck(): void 'url' => 'https://test.com', ]); - $response = $this->getJson('api/v1/links/check?url=https://example.com', $this->generateHeaders()); + $response = $this->getJsonAuthorized('api/v1/links/check?url=https://example.com'); - $response->assertStatus(200) + $response->assertOk() ->assertJson([ 'linksFound' => false, ]); @@ -48,9 +48,9 @@ public function testNegativeLinkCheck(): void public function testCheckWithoutQuery(): void { - $response = $this->getJson('api/v1/links/check', $this->generateHeaders()); + $response = $this->getJsonAuthorized('api/v1/links/check'); - $response->assertStatus(200) + $response->assertOk() ->assertJson([ 'linksFound' => false, ]); diff --git a/tests/Controller/API/LinkNotesTest.php b/tests/Controller/API/LinkNotesTest.php index 46c9a933..4ccc1e3f 100644 --- a/tests/Controller/API/LinkNotesTest.php +++ b/tests/Controller/API/LinkNotesTest.php @@ -21,9 +21,9 @@ public function testLinksRequest(): void 'link_id' => $link->id, ]); - $response = $this->getJson('api/v1/links/1/notes', $this->generateHeaders()); + $response = $this->getJsonAuthorized('api/v1/links/1/notes'); - $response->assertStatus(200) + $response->assertOk() ->assertJson([ 'data' => [ ['note' => $note->note], @@ -33,11 +33,11 @@ public function testLinksRequest(): void public function testLinksRequestWithoutLinks(): void { - $link = factory(Link::class)->create(); + factory(Link::class)->create(); - $response = $this->getJson('api/v1/links/1/notes', $this->generateHeaders()); + $response = $this->getJsonAuthorized('api/v1/links/1/notes'); - $response->assertStatus(200) + $response->assertOk() ->assertJson([ 'data' => [], ]); @@ -49,8 +49,8 @@ public function testLinksRequestWithoutLinks(): void public function testShowRequestNotFound(): void { - $response = $this->getJson('api/v1/links/1/notes', $this->generateHeaders()); + $response = $this->getJsonAuthorized('api/v1/links/1/notes'); - $response->assertStatus(404); + $response->assertNotFound(); } } diff --git a/tests/Controller/API/ListApiTest.php b/tests/Controller/API/ListApiTest.php index d4282759..00b40d37 100644 --- a/tests/Controller/API/ListApiTest.php +++ b/tests/Controller/API/ListApiTest.php @@ -3,7 +3,6 @@ namespace Tests\Controller\API; use App\Models\LinkList; -use App\Models\User; use Illuminate\Foundation\Testing\DatabaseMigrations; use Illuminate\Foundation\Testing\DatabaseTransactions; @@ -23,9 +22,9 @@ public function testIndexRequest(): void { $list = factory(LinkList::class)->create(); - $response = $this->getJson('api/v1/lists', $this->generateHeaders()); + $response = $this->getJsonAuthorized('api/v1/lists'); - $response->assertStatus(200) + $response->assertOk() ->assertJson([ 'data' => [ ['name' => $list->name], @@ -35,11 +34,11 @@ public function testIndexRequest(): void public function testMinimalCreateRequest(): void { - $response = $this->postJson('api/v1/lists', [ + $response = $this->postJsonAuthorized('api/v1/lists', [ 'name' => 'Test List', - ], $this->generateHeaders()); + ]); - $response->assertStatus(200) + $response->assertOk() ->assertJson([ 'name' => 'Test List', ]); @@ -51,14 +50,14 @@ public function testMinimalCreateRequest(): void public function testFullCreateRequest(): void { - $response = $this->postJson('api/v1/lists', [ + $response = $this->postJsonAuthorized('api/v1/lists', [ 'name' => 'Test List', 'description' => 'There could be a description here', 'is_private' => false, 'check_disabled' => false, - ], $this->generateHeaders()); + ]); - $response->assertStatus(200) + $response->assertOk() ->assertJson([ 'name' => 'Test List', ]); @@ -70,27 +69,28 @@ public function testFullCreateRequest(): void public function testInvalidCreateRequest(): void { - $response = $this->postJson('api/v1/lists', [ + $response = $this->postJsonAuthorized('api/v1/lists', [ 'name' => null, + 'description' => ['bla'], 'is_private' => 'hello', - ], $this->generateHeaders()); + ]); - $response->assertStatus(422) - ->assertJsonValidationErrors([ - 'name', - 'is_private', - ]); + $response->assertJsonValidationErrors([ + 'name' => 'The name field is required.', + 'description' => 'The description must be a string.', + 'is_private' => 'The is private field must be true or false.', + ]); } public function testShowRequest(): void { $list = factory(LinkList::class)->create(); - $response = $this->getJson('api/v1/lists/1', $this->generateHeaders()); + $response = $this->getJsonAuthorized('api/v1/lists/1'); $expectedLinkApiUrl = 'http://localhost/api/v1/lists/1/links'; - $response->assertStatus(200) + $response->assertOk() ->assertJson([ 'name' => $list->name, 'links' => $expectedLinkApiUrl, @@ -99,22 +99,22 @@ public function testShowRequest(): void public function testShowRequestNotFound(): void { - $response = $this->getJson('api/v1/lists/1', $this->generateHeaders()); + $response = $this->getJsonAuthorized('api/v1/lists/1'); - $response->assertStatus(404); + $response->assertNotFound(); } public function testUpdateRequest(): void { - $list = factory(LinkList::class)->create(); + factory(LinkList::class)->create(); - $response = $this->patchJson('api/v1/lists/1', [ + $response = $this->patchJsonAuthorized('api/v1/lists/1', [ 'name' => 'Updated List Title', 'description' => 'Custom Description', 'is_private' => false, - ], $this->generateHeaders()); + ]); - $response->assertStatus(200) + $response->assertOk() ->assertJson([ 'name' => 'Updated List Title', ]); @@ -126,34 +126,37 @@ public function testUpdateRequest(): void public function testInvalidUpdateRequest(): void { - $list = factory(LinkList::class)->create(); + factory(LinkList::class)->create(); - $response = $this->patchJson('api/v1/lists/1', [ - // - ], $this->generateHeaders()); + $response = $this->patchJsonAuthorized('api/v1/lists/1', [ + 'name' => null, + 'description' => ['bla'], + 'is_private' => 'hello', + ]); - $response->assertStatus(422) - ->assertJsonValidationErrors([ - 'name', - ]); + $response->assertJsonValidationErrors([ + 'name' => 'The name field is required.', + 'description' => 'The description must be a string.', + 'is_private' => 'The is private field must be true or false.', + ]); } public function testUpdateRequestNotFound(): void { - $response = $this->patchJson('api/v1/lists/1', [ + $response = $this->patchJsonAuthorized('api/v1/lists/1', [ 'name' => 'Updated List Title', 'description' => 'Custom Description', 'is_private' => false, - ], $this->generateHeaders()); + ]); - $response->assertStatus(404); + $response->assertNotFound(); } public function testDeleteRequest(): void { - $list = factory(LinkList::class)->create(); + factory(LinkList::class)->create(); - $response = $this->deleteJson('api/v1/lists/1', [], $this->generateHeaders()); + $response = $this->deleteJsonAuthorized('api/v1/lists/1'); $response->assertStatus(200); @@ -162,8 +165,8 @@ public function testDeleteRequest(): void public function testDeleteRequestNotFound(): void { - $response = $this->deleteJson('api/v1/lists/1', [], $this->generateHeaders()); + $response = $this->deleteJsonAuthorized('api/v1/lists/1'); - $response->assertStatus(404); + $response->assertNotFound(); } } diff --git a/tests/Controller/API/ListLinksTest.php b/tests/Controller/API/ListLinksTest.php index 80cd98f9..a0d7b629 100644 --- a/tests/Controller/API/ListLinksTest.php +++ b/tests/Controller/API/ListLinksTest.php @@ -21,9 +21,9 @@ public function testLinksRequest(): void $link->lists()->sync([$list->id]); - $response = $this->getJson('api/v1/lists/1/links', $this->generateHeaders()); + $response = $this->getJsonAuthorized('api/v1/lists/1/links'); - $response->assertStatus(200) + $response->assertOk() ->assertJson([ 'data' => [ ['url' => $link->url] @@ -33,11 +33,11 @@ public function testLinksRequest(): void public function testLinksRequestWithoutLinks(): void { - $list = factory(LinkList::class)->create(); + factory(LinkList::class)->create(); - $response = $this->getJson('api/v1/lists/1/links', $this->generateHeaders()); + $response = $this->getJsonAuthorized('api/v1/lists/1/links'); - $response->assertStatus(200) + $response->assertOk() ->assertJson([ 'data' => [] ]); @@ -49,8 +49,8 @@ public function testLinksRequestWithoutLinks(): void public function testShowRequestNotFound(): void { - $response = $this->getJson('api/v1/lists/1/links', $this->generateHeaders()); + $response = $this->getJsonAuthorized('api/v1/lists/1/links'); - $response->assertStatus(404); + $response->assertNotFound(); } } diff --git a/tests/Controller/API/NoteApiTest.php b/tests/Controller/API/NoteApiTest.php index 662b537a..055cae75 100644 --- a/tests/Controller/API/NoteApiTest.php +++ b/tests/Controller/API/NoteApiTest.php @@ -4,10 +4,8 @@ use App\Models\Link; use App\Models\Note; -use App\Models\User; use Illuminate\Foundation\Testing\DatabaseMigrations; use Illuminate\Foundation\Testing\DatabaseTransactions; -use Tests\TestCase; class NoteApiTest extends ApiTestCase { @@ -18,12 +16,12 @@ public function testMinimalCreateRequest(): void { $link = factory(Link::class)->create(); - $response = $this->postJson('api/v1/notes', [ + $response = $this->postJsonAuthorized('api/v1/notes', [ 'link_id' => $link->id, 'note' => 'Quae vero auctorem tractata ab fiducia dicuntur.', - ], $this->generateHeaders()); + ]); - $response->assertStatus(200) + $response->assertOk() ->assertJson([ 'note' => 'Quae vero auctorem tractata ab fiducia dicuntur.', ]); @@ -37,13 +35,13 @@ public function testFullCreateRequest(): void { $link = factory(Link::class)->create(); - $response = $this->postJson('api/v1/notes', [ + $response = $this->postJsonAuthorized('api/v1/notes', [ 'link_id' => $link->id, 'note' => 'Quae vero auctorem tractata ab fiducia dicuntur.', 'is_private' => true, - ], $this->generateHeaders()); + ]); - $response->assertStatus(200) + $response->assertOk() ->assertJson([ 'note' => 'Quae vero auctorem tractata ab fiducia dicuntur.', 'is_private' => true, @@ -56,32 +54,31 @@ public function testFullCreateRequest(): void public function testInvalidCreateRequest(): void { - $response = $this->postJson('api/v1/notes', [ + $response = $this->postJsonAuthorized('api/v1/notes', [ 'link_id' => null, 'note' => null, - ], $this->generateHeaders()); + ]); - $response->assertStatus(422) - ->assertJsonValidationErrors([ - 'link_id', - 'note', - ]); + $response->assertJsonValidationErrors([ + 'link_id' => 'The link id field is required.', + 'note' => 'The note field is required.', + ]); } public function testUpdateRequest(): void { $link = factory(Link::class)->create(); - $note = factory(Note::class)->create([ + factory(Note::class)->create([ 'link_id' => $link->id, ]); - $response = $this->patchJson('api/v1/notes/1', [ + $response = $this->patchJsonAuthorized('api/v1/notes/1', [ 'link_id' => $link->id, 'note' => 'Gallia est omnis divisa in partes tres, quarum.', 'is_private' => false, - ], $this->generateHeaders()); + ]); - $response->assertStatus(200) + $response->assertOk() ->assertJson([ 'note' => 'Gallia est omnis divisa in partes tres, quarum.', ]); @@ -93,45 +90,44 @@ public function testUpdateRequest(): void public function testInvalidUpdateRequest(): void { - $note = factory(Note::class)->create(); + factory(Note::class)->create(); - $response = $this->patchJson('api/v1/notes/1', [ + $response = $this->patchJsonAuthorized('api/v1/notes/1', [ // - ], $this->generateHeaders()); + ]); - $response->assertStatus(422) - ->assertJsonValidationErrors([ - 'link_id', - 'note', - ]); + $response->assertJsonValidationErrors([ + 'link_id' => 'The link id field is required.', + 'note' => 'The note field is required.', + ]); } public function testUpdateRequestNotFound(): void { - $response = $this->patchJson('api/v1/notes/1', [ + $response = $this->patchJsonAuthorized('api/v1/notes/1', [ 'link_id' => 1, 'note' => 'Sed haec quis possit intrepidus aestimare tellus.', 'is_private' => false, - ], $this->generateHeaders()); + ]); - $response->assertStatus(404); + $response->assertNotFound(); } public function testDeleteRequest(): void { - $note = factory(Note::class)->create(); + factory(Note::class)->create(); - $response = $this->deleteJson('api/v1/notes/1', [], $this->generateHeaders()); + $response = $this->deleteJsonAuthorized('api/v1/notes/1', []); - $response->assertStatus(200); + $response->assertOk(); $this->assertEquals(0, Note::count()); } public function testDeleteRequestNotFound(): void { - $response = $this->deleteJson('api/v1/notes/1', [], $this->generateHeaders()); + $response = $this->deleteJsonAuthorized('api/v1/notes/1'); - $response->assertStatus(404); + $response->assertNotFound(); } } diff --git a/tests/Controller/API/SearchLinksTest.php b/tests/Controller/API/SearchLinksTest.php index 89022cb3..4c252a57 100644 --- a/tests/Controller/API/SearchLinksTest.php +++ b/tests/Controller/API/SearchLinksTest.php @@ -20,12 +20,12 @@ public function testUnauthorizedRequest(): void public function testWithoutQuery(): void { - $response = $this->getJson('api/v1/search/links', $this->generateHeaders()); + $response = $this->getJsonAuthorized('api/v1/search/links'); $response->assertJsonValidationErrors([ - 'query', - 'only_lists', - 'only_tags', + 'query' => 'A search query must be present if no lists or tags were provided.', + 'only_lists' => 'A list must be present if no query or some tags were provided.', + 'only_tags' => 'A tag must be present if no query or some lists were provided.', ]); } @@ -48,9 +48,9 @@ public function testRegularSearchResult(): void ]); $url = sprintf('api/v1/search/links?query=%s', 'example'); - $response = $this->getJson($url, $this->generateHeaders()); + $response = $this->getJsonAuthorized($url); - $response->assertStatus(200) + $response->assertOk() ->assertJsonFragment([ 'current_page' => 1, ]) @@ -79,9 +79,9 @@ public function testSearchByTitle(): void ]); $url = sprintf('api/v1/search/links?query=%s&search_title=1', 'Test'); - $response = $this->getJson($url, $this->generateHeaders()); + $response = $this->getJsonAuthorized($url); - $response->assertStatus(200) + $response->assertOk() ->assertJsonFragment([ 'url' => $link->url, ]) @@ -90,7 +90,7 @@ public function testSearchByTitle(): void ]); } - public function testSearchByDescription() + public function testSearchByDescription(): void { $link = factory(Link::class)->create([ 'user_id' => $this->user->id, @@ -106,9 +106,9 @@ public function testSearchByDescription() ]); $url = sprintf('api/v1/search/links?query=%s&search_description=1', 'Example'); - $response = $this->getJson($url, $this->generateHeaders()); + $response = $this->getJsonAuthorized($url); - $response->assertStatus(200) + $response->assertOk() ->assertJsonFragment([ 'url' => $link->url, ]) @@ -117,7 +117,7 @@ public function testSearchByDescription() ]); } - public function testSearchPrivateOnly() + public function testSearchPrivateOnly(): void { $link = factory(Link::class)->create([ 'user_id' => $this->user->id, @@ -133,9 +133,9 @@ public function testSearchPrivateOnly() ]); $url = sprintf('api/v1/search/links?query=%s&private_only=1', 'test'); - $response = $this->getJson($url, $this->generateHeaders()); + $response = $this->getJsonAuthorized($url); - $response->assertStatus(200) + $response->assertOk() ->assertJsonFragment([ 'url' => $link->url, ]) @@ -144,7 +144,7 @@ public function testSearchPrivateOnly() ]); } - public function testSearchBrokenOnly() + public function testSearchBrokenOnly(): void { $link = factory(Link::class)->create([ 'user_id' => $this->user->id, @@ -159,9 +159,9 @@ public function testSearchBrokenOnly() ]); $url = sprintf('api/v1/search/links?query=%s&broken_only=1', 'test'); - $response = $this->getJson($url, $this->generateHeaders()); + $response = $this->getJsonAuthorized($url); - $response->assertStatus(200) + $response->assertOk() ->assertJsonFragment([ 'url' => $link->url, ]) @@ -170,7 +170,7 @@ public function testSearchBrokenOnly() ]); } - public function testSearchWithLists() + public function testSearchWithLists(): void { $list = factory(LinkList::class)->create([ 'user_id' => $this->user->id, @@ -191,9 +191,9 @@ public function testSearchWithLists() ]); $url = sprintf('api/v1/search/links?only_lists=%s', $list->id); - $response = $this->getJson($url, $this->generateHeaders()); + $response = $this->getJsonAuthorized($url); - $response->assertStatus(200) + $response->assertOk() ->assertJsonFragment([ 'url' => $link->url, ]) @@ -202,7 +202,7 @@ public function testSearchWithLists() ]); } - public function testSearchWithTags() + public function testSearchWithTags(): void { $tag = factory(Tag::class)->create([ 'user_id' => $this->user->id, @@ -223,9 +223,9 @@ public function testSearchWithTags() ]); $url = sprintf('api/v1/search/links?only_tags=%s', $tag->id); - $response = $this->getJson($url, $this->generateHeaders()); + $response = $this->getJsonAuthorized($url); - $response->assertStatus(200) + $response->assertOk() ->assertJsonFragment([ 'url' => $link->url, ]) diff --git a/tests/Controller/API/SearchListsTest.php b/tests/Controller/API/SearchListsTest.php index aeeda45c..09e21572 100644 --- a/tests/Controller/API/SearchListsTest.php +++ b/tests/Controller/API/SearchListsTest.php @@ -20,9 +20,9 @@ public function testUnauthorizedRequest(): void public function testWithoutQuery(): void { - $response = $this->getJson('api/v1/search/lists', $this->generateHeaders()); + $response = $this->getJsonAuthorized('api/v1/search/lists'); - $response->assertStatus(200) + $response->assertOk() ->assertExactJson([]); } @@ -34,9 +34,9 @@ public function testWithEmptyQuery(): void 'name' => 'Scientific Articles', ]); - $response = $this->getJson('api/v1/search/lists?query=', $this->generateHeaders()); + $response = $this->getJsonAuthorized('api/v1/search/lists?query='); - $response->assertStatus(200) + $response->assertOk() ->assertExactJson([]); } @@ -59,9 +59,9 @@ public function testWithMultipleResults(): void ]); $url = sprintf('api/v1/search/lists?query=%s', 'articles'); - $response = $this->getJson($url, $this->generateHeaders()); + $response = $this->getJsonAuthorized($url); - $response->assertStatus(200) + $response->assertOk() ->assertExactJson([ $list->id => $list->name, $list2->id => $list2->name, @@ -87,9 +87,9 @@ public function testWithShortQuery(): void ]); $url = sprintf('api/v1/search/lists?query=%s', 'ar'); - $response = $this->getJson($url, $this->generateHeaders()); + $response = $this->getJsonAuthorized($url); - $response->assertStatus(200) + $response->assertOk() ->assertExactJson([ $list->id => $list->name, $list2->id => $list2->name, diff --git a/tests/Controller/API/SearchTagsTest.php b/tests/Controller/API/SearchTagsTest.php index 34d448be..97d6473c 100644 --- a/tests/Controller/API/SearchTagsTest.php +++ b/tests/Controller/API/SearchTagsTest.php @@ -20,9 +20,9 @@ public function testUnauthorizedRequest(): void public function testWithoutQuery(): void { - $response = $this->getJson('api/v1/search/tags', $this->generateHeaders()); + $response = $this->getJsonAuthorized('api/v1/search/tags'); - $response->assertStatus(200) + $response->assertOk() ->assertExactJson([]); } @@ -34,9 +34,9 @@ public function testWithEmptyQuery(): void 'name' => 'artificial-intelligence', ]); - $response = $this->getJson('api/v1/search/tags?query=', $this->generateHeaders()); + $response = $this->getJsonAuthorized('api/v1/search/tags?query='); - $response->assertStatus(200) + $response->assertOk() ->assertExactJson([]); } @@ -64,9 +64,9 @@ public function testWithMultipleResults(): void ]); $url = sprintf('api/v1/search/tags?query=%s', 'programming'); - $response = $this->getJson($url, $this->generateHeaders()); + $response = $this->getJsonAuthorized($url); - $response->assertStatus(200) + $response->assertOk() ->assertExactJson([ $tag->id => $tag->name, $tag2->id => $tag2->name, @@ -93,9 +93,9 @@ public function testWithShortQuery(): void ]); $url = sprintf('api/v1/search/tags?query=%s', 'p'); - $response = $this->getJson($url, $this->generateHeaders()); + $response = $this->getJsonAuthorized($url); - $response->assertStatus(200) + $response->assertOk() ->assertExactJson([ $tag->id => $tag->name, $tag2->id => $tag2->name, diff --git a/tests/Controller/API/TagApiTest.php b/tests/Controller/API/TagApiTest.php index ba2dc5d3..715c61f6 100644 --- a/tests/Controller/API/TagApiTest.php +++ b/tests/Controller/API/TagApiTest.php @@ -3,10 +3,8 @@ namespace Tests\Controller\API; use App\Models\Tag; -use App\Models\User; use Illuminate\Foundation\Testing\DatabaseMigrations; use Illuminate\Foundation\Testing\DatabaseTransactions; -use Tests\TestCase; class TagApiTest extends ApiTestCase { @@ -24,9 +22,9 @@ public function testIndexRequest(): void { $tag = factory(Tag::class)->create(); - $response = $this->getJson('api/v1/tags', $this->generateHeaders()); + $response = $this->getJsonAuthorized('api/v1/tags'); - $response->assertStatus(200) + $response->assertOk() ->assertJson([ 'data' => [ ['name' => $tag->name], @@ -36,11 +34,11 @@ public function testIndexRequest(): void public function testMinimalCreateRequest(): void { - $response = $this->postJson('api/v1/tags', [ + $response = $this->postJsonAuthorized('api/v1/tags', [ 'name' => 'Test Tag', - ], $this->generateHeaders()); + ]); - $response->assertStatus(200) + $response->assertOk() ->assertJson([ 'name' => 'Test Tag', ]); @@ -52,12 +50,12 @@ public function testMinimalCreateRequest(): void public function testFullCreateRequest(): void { - $response = $this->postJson('api/v1/tags', [ + $response = $this->postJsonAuthorized('api/v1/tags', [ 'name' => 'Test Tag', 'is_private' => false, - ], $this->generateHeaders()); + ]); - $response->assertStatus(200) + $response->assertOk() ->assertJson([ 'name' => 'Test Tag', ]); @@ -69,25 +67,24 @@ public function testFullCreateRequest(): void public function testInvalidCreateRequest(): void { - $response = $this->postJson('api/v1/tags', [ + $response = $this->postJsonAuthorized('api/v1/tags', [ 'name' => null, 'is_private' => 'hello', - ], $this->generateHeaders()); + ]); - $response->assertStatus(422) - ->assertJsonValidationErrors([ - 'name', - 'is_private', - ]); + $response->assertJsonValidationErrors([ + 'name' => 'The name field is required.', + 'is_private' => 'The is private field must be true or false.', + ]); } public function testShowRequest(): void { $tag = factory(Tag::class)->create(); - $response = $this->getJson('api/v1/tags/1', $this->generateHeaders()); + $response = $this->getJsonAuthorized('api/v1/tags/1'); - $response->assertStatus(200) + $response->assertOk() ->assertJson([ 'name' => $tag->name, ]); @@ -95,21 +92,21 @@ public function testShowRequest(): void public function testShowRequestNotFound(): void { - $response = $this->getJson('api/v1/tags/1', $this->generateHeaders()); + $response = $this->getJsonAuthorized('api/v1/tags/1'); - $response->assertStatus(404); + $response->assertNotFound(); } public function testUpdateRequest(): void { - $tag = factory(Tag::class)->create(); + factory(Tag::class)->create(); - $response = $this->patchJson('api/v1/tags/1', [ + $response = $this->patchJsonAuthorized('api/v1/tags/1', [ 'name' => 'Updated Tag Title', 'is_private' => false, - ], $this->generateHeaders()); + ]); - $response->assertStatus(200) + $response->assertOk() ->assertJson([ 'name' => 'Updated Tag Title', ]); @@ -121,43 +118,44 @@ public function testUpdateRequest(): void public function testInvalidUpdateRequest(): void { - $tag = factory(Tag::class)->create(); + factory(Tag::class)->create(); - $response = $this->patchJson('api/v1/tags/1', [ - // - ], $this->generateHeaders()); + $response = $this->patchJsonAuthorized('api/v1/tags/1', [ + 'name' => null, + 'is_private' => 'hello', + ]); - $response->assertStatus(422) - ->assertJsonValidationErrors([ - 'name', - ]); + $response->assertJsonValidationErrors([ + 'name' => 'The name field is required.', + 'is_private' => 'The is private field must be true or false.', + ]); } public function testUpdateRequestNotFound(): void { - $response = $this->patchJson('api/v1/tags/1', [ + $response = $this->patchJsonAuthorized('api/v1/tags/1', [ 'name' => 'Updated Tag Title', 'is_private' => false, - ], $this->generateHeaders()); + ]); - $response->assertStatus(404); + $response->assertNotFound(); } public function testDeleteRequest(): void { - $tag = factory(Tag::class)->create(); + factory(Tag::class)->create(); - $response = $this->deleteJson('api/v1/tags/1', [], $this->generateHeaders()); + $response = $this->deleteJsonAuthorized('api/v1/tags/1'); - $response->assertStatus(200); + $response->assertOk(); $this->assertEquals(0, Tag::count()); } public function testDeleteRequestNotFound(): void { - $response = $this->deleteJson('api/v1/tags/1', [], $this->generateHeaders()); + $response = $this->deleteJsonAuthorized('api/v1/tags/1'); - $response->assertStatus(404); + $response->assertNotFound(); } } diff --git a/tests/Controller/API/TagLinksTest.php b/tests/Controller/API/TagLinksTest.php index ae335205..0df25e47 100644 --- a/tests/Controller/API/TagLinksTest.php +++ b/tests/Controller/API/TagLinksTest.php @@ -21,9 +21,9 @@ public function testLinksRequest(): void $link->tags()->sync([$tag->id]); - $response = $this->getJson('api/v1/tags/1/links', $this->generateHeaders()); + $response = $this->getJsonAuthorized('api/v1/tags/1/links'); - $response->assertStatus(200) + $response->assertOk() ->assertJson([ 'data' => [ ['url' => $link->url], @@ -33,11 +33,11 @@ public function testLinksRequest(): void public function testLinksRequestWithoutLinks(): void { - $tag = factory(Tag::class)->create(); + factory(Tag::class)->create(); - $response = $this->getJson('api/v1/tags/1/links', $this->generateHeaders()); + $response = $this->getJsonAuthorized('api/v1/tags/1/links'); - $response->assertStatus(200) + $response->assertOk() ->assertJson([ 'data' => [], ]); @@ -49,8 +49,8 @@ public function testLinksRequestWithoutLinks(): void public function testShowRequestNotFound(): void { - $response = $this->getJson('api/v1/tags/1/links', $this->generateHeaders()); + $response = $this->getJsonAuthorized('api/v1/tags/1/links'); - $response->assertStatus(404); + $response->assertNotFound(); } } diff --git a/tests/Controller/API/TrashApiTest.php b/tests/Controller/API/TrashApiTest.php index 2f93877b..01d0aa11 100644 --- a/tests/Controller/API/TrashApiTest.php +++ b/tests/Controller/API/TrashApiTest.php @@ -32,7 +32,7 @@ public function testUnauthorizedRequest(): void public function testGetLinks(): void { - $response = $this->getJson('api/v1/trash/links', $this->generateHeaders()); + $response = $this->getJsonAuthorized('api/v1/trash/links'); $response->assertOk(); @@ -42,7 +42,7 @@ public function testGetLinks(): void public function testGetLists(): void { - $response = $this->getJson('api/v1/trash/lists', $this->generateHeaders()); + $response = $this->getJsonAuthorized('api/v1/trash/lists'); $response->assertOk(); @@ -52,7 +52,7 @@ public function testGetLists(): void public function testGetTags(): void { - $response = $this->getJson('api/v1/trash/tags', $this->generateHeaders()); + $response = $this->getJsonAuthorized('api/v1/trash/tags'); $response->assertOk(); @@ -62,7 +62,7 @@ public function testGetTags(): void public function testGetNotes(): void { - $response = $this->getJson('api/v1/trash/notes', $this->generateHeaders()); + $response = $this->getJsonAuthorized('api/v1/trash/notes'); $response->assertOk(); @@ -78,9 +78,9 @@ public function testValidTrashClearLinksResponse(): void { $this->setupTrashTestData(); - $response = $this->deleteJson('api/v1/trash/clear', [ + $response = $this->deleteJsonAuthorized('api/v1/trash/clear', [ 'model' => 'links', - ], $this->generateHeaders()); + ]); $response->assertOk(); @@ -91,9 +91,9 @@ public function testValidTrashClearTagsResponse(): void { $this->setupTrashTestData(); - $response = $this->deleteJson('api/v1/trash/clear', [ + $response = $this->deleteJsonAuthorized('api/v1/trash/clear', [ 'model' => 'tags', - ], $this->generateHeaders()); + ]); $response->assertOk(); @@ -104,9 +104,9 @@ public function testValidTrashClearListsResponse(): void { $this->setupTrashTestData(); - $response = $this->deleteJson('api/v1/trash/clear', [ + $response = $this->deleteJsonAuthorized('api/v1/trash/clear', [ 'model' => 'lists', - ], $this->generateHeaders()); + ]); $response->assertOk(); @@ -117,9 +117,9 @@ public function testValidTrashClearNotesResponse(): void { $this->setupTrashTestData(); - $response = $this->deleteJson('api/v1/trash/clear', [ + $response = $this->deleteJsonAuthorized('api/v1/trash/clear', [ 'model' => 'notes', - ], $this->generateHeaders()); + ]); $response->assertOk(); @@ -130,9 +130,9 @@ public function testInvalidTrashClearRequest(): void { $this->setupTrashTestData(); - $response = $this->deleteJson('api/v1/trash/clear', [ + $response = $this->deleteJsonAuthorized('api/v1/trash/clear', [ //'model' => 'links', - ], $this->generateHeaders()); + ]); $response->assertJsonValidationErrors([ 'model' => 'The model field is required.', @@ -143,9 +143,9 @@ public function testClearRequestWithInvalidModel(): void { $this->setupTrashTestData(); - $response = $this->deleteJson('api/v1/trash/clear', [ + $response = $this->deleteJsonAuthorized('api/v1/trash/clear', [ 'model' => 'shoes', - ], $this->generateHeaders()); + ]); $response->assertJsonValidationErrors([ 'model' => 'The selected model is invalid.', @@ -160,10 +160,10 @@ public function testValidRestoreLinkResponse(): void { $this->setupTrashTestData(); - $response = $this->patchJson('api/v1/trash/restore', [ + $response = $this->patchJsonAuthorized('api/v1/trash/restore', [ 'model' => 'link', 'id' => '1', - ], $this->generateHeaders()); + ]); $response->assertOk(); @@ -174,10 +174,10 @@ public function testValidRestoreTagResponse(): void { $this->setupTrashTestData(); - $response = $this->patchJson('api/v1/trash/restore', [ + $response = $this->patchJsonAuthorized('api/v1/trash/restore', [ 'model' => 'tag', 'id' => '1', - ], $this->generateHeaders()); + ]); $response->assertOk(); @@ -188,10 +188,10 @@ public function testValidRestoreListResponse(): void { $this->setupTrashTestData(); - $response = $this->patchJson('api/v1/trash/restore', [ + $response = $this->patchJsonAuthorized('api/v1/trash/restore', [ 'model' => 'list', 'id' => '1', - ], $this->generateHeaders()); + ]); $response->assertOk(); @@ -202,10 +202,10 @@ public function testValidRestoreNoteResponse(): void { $this->setupTrashTestData(); - $response = $this->patchJson('api/v1/trash/restore', [ + $response = $this->patchJsonAuthorized('api/v1/trash/restore', [ 'model' => 'note', 'id' => '1', - ], $this->generateHeaders()); + ]); $response->assertOk(); @@ -216,14 +216,14 @@ public function testInvalidRestoreResponse(): void { $this->setupTrashTestData(); - $response = $this->patchJson('api/v1/trash/restore', [ + $response = $this->patchJsonAuthorized('api/v1/trash/restore', [ //'model' => 'link', //'id' => '1', - ], $this->generateHeaders()); + ]); $response->assertJsonValidationErrors([ - 'model', - 'id', + 'model' => 'The model field is required.', + 'id' => 'The id field is required.', ]); } @@ -231,10 +231,10 @@ public function testRestoreWithMissingModel(): void { $this->setupTrashTestData(); - $response = $this->patchJson('api/v1/trash/restore', [ + $response = $this->patchJsonAuthorized('api/v1/trash/restore', [ 'model' => 'link', 'id' => '1345235', - ], $this->generateHeaders()); + ]); $response->assertNotFound(); } From c273e042c198873e9c570d97c0e83b5b739e1056 Mon Sep 17 00:00:00 2001 From: Kovah Date: Wed, 1 Jul 2020 23:22:48 +0200 Subject: [PATCH 40/44] Refactor some of the basic controller tests --- .../App/BookmarkletControllerTest.php | 5 ++--- tests/Controller/App/CronControllerTest.php | 6 +++--- .../App/DashboardControllerTest.php | 2 +- tests/Controller/App/ExportControllerTest.php | 6 +++--- tests/Controller/App/ImportControllerTest.php | 4 ++-- tests/Controller/App/SearchControllerTest.php | 20 +++++++++---------- .../App/SystemSettingsControllerTest.php | 11 +++++----- tests/Controller/App/TrashControllerTest.php | 20 +++++++++++-------- .../App/UserSettingsControllerTest.php | 8 ++++---- 9 files changed, 43 insertions(+), 39 deletions(-) diff --git a/tests/Controller/App/BookmarkletControllerTest.php b/tests/Controller/App/BookmarkletControllerTest.php index d96b7b89..7640f3a5 100644 --- a/tests/Controller/App/BookmarkletControllerTest.php +++ b/tests/Controller/App/BookmarkletControllerTest.php @@ -19,7 +19,7 @@ public function testValidBookmarkletResponse(): void $response = $this->get('bookmarklet/add?u=https://example.com&t=Example%20Title'); - $response->assertStatus(200) + $response->assertOk() ->assertSee('https://example.com') ->assertSee('Example Title'); } @@ -28,8 +28,7 @@ public function testLoginRedirectForBookmarklet(): void { $response = $this->get('bookmarklet/add?u=https://example.com&t=Example%20Title'); - $response->assertStatus(302) - ->assertRedirect('bookmarklet/login') + $response->assertRedirect('bookmarklet/login') ->assertSessionHas('bookmarklet.new_url', 'https://example.com') ->assertSessionHas('bookmarklet.new_title', 'Example Title'); } diff --git a/tests/Controller/App/CronControllerTest.php b/tests/Controller/App/CronControllerTest.php index 77e3ea4f..745e53b5 100644 --- a/tests/Controller/App/CronControllerTest.php +++ b/tests/Controller/App/CronControllerTest.php @@ -22,7 +22,7 @@ public function testValidCronTokenResponse(): void $response = $this->get('cron/' . $cronToken); - $response->assertStatus(200) + $response->assertOk() ->assertSee('Cron successfully executed'); } @@ -38,7 +38,7 @@ public function testInvalidCronTokenResponse(): void $response = $this->get('cron/' . $invalidCronToken); - $response->assertStatus(403) + $response->assertForbidden() ->assertSee('The provided cron token is invalid'); } @@ -46,6 +46,6 @@ public function testMissingCronTokenResponse(): void { $response = $this->get('cron'); - $response->assertStatus(404); + $response->assertNotFound(); } } diff --git a/tests/Controller/App/DashboardControllerTest.php b/tests/Controller/App/DashboardControllerTest.php index 9e9bb3d5..48cd9151 100644 --- a/tests/Controller/App/DashboardControllerTest.php +++ b/tests/Controller/App/DashboardControllerTest.php @@ -19,7 +19,7 @@ public function testValidDashboardResponse(): void $response = $this->get('dashboard'); - $response->assertStatus(200) + $response->assertOk() ->assertSee('Hello ' . $user->name . '!'); } } diff --git a/tests/Controller/App/ExportControllerTest.php b/tests/Controller/App/ExportControllerTest.php index bbece683..d5bea0b9 100644 --- a/tests/Controller/App/ExportControllerTest.php +++ b/tests/Controller/App/ExportControllerTest.php @@ -29,14 +29,14 @@ public function testValidExportResponse(): void { $response = $this->get('export'); - $response->assertStatus(200) + $response->assertOk() ->assertSee('Export'); } public function testValidHtmlExportGeneration(): void { $response = $this->post('export/html'); - $response->assertStatus(200); + $response->assertOk(); $content = $response->streamedContent(); @@ -52,7 +52,7 @@ public function testValidCsvExportGeneration(): void $link = Link::inRandomOrder()->first(); $response = $this->post('export/csv'); - $response->assertStatus(200); + $response->assertOk(); $content = $response->streamedContent(); diff --git a/tests/Controller/App/ImportControllerTest.php b/tests/Controller/App/ImportControllerTest.php index 61281cb6..0c6a1647 100644 --- a/tests/Controller/App/ImportControllerTest.php +++ b/tests/Controller/App/ImportControllerTest.php @@ -28,7 +28,7 @@ public function testValidImportResponse(): void { $response = $this->get('import'); - $response->assertStatus(200) + $response->assertOk() ->assertSee('Import'); } @@ -43,7 +43,7 @@ public function testValidImportActionResponse(): void 'Accept' => 'application/json', ]); - $response->assertStatus(200) + $response->assertOk() ->assertJson([ 'success' => true, ]); diff --git a/tests/Controller/App/SearchControllerTest.php b/tests/Controller/App/SearchControllerTest.php index 669b16dd..72e603f1 100644 --- a/tests/Controller/App/SearchControllerTest.php +++ b/tests/Controller/App/SearchControllerTest.php @@ -31,7 +31,7 @@ public function testValidSearchResponse(): void { $response = $this->get('search'); - $response->assertStatus(200) + $response->assertOk() ->assertSee('Search'); } @@ -41,7 +41,7 @@ public function testValidSearchResult(): void 'query' => 'example', ]); - $response->assertStatus(200) + $response->assertOk() ->assertSee('https://example.com') ->assertDontSee('https://test.com'); } @@ -52,7 +52,7 @@ public function testValidUrlSearchResult(): void 'query' => 'https://example.com', ]); - $response->assertStatus(200) + $response->assertOk() ->assertSee('https://example.com') ->assertDontSee('https://test.com'); } @@ -64,7 +64,7 @@ public function testValidTitleSearchResult(): void 'search_title' => 'on', ]); - $response->assertStatus(200) + $response->assertOk() ->assertSee('https://example.com') ->assertDontSee('https://test.com'); } @@ -76,7 +76,7 @@ public function testValidDescriptionSearchResult(): void 'search_description' => 'on', ]); - $response->assertStatus(200) + $response->assertOk() ->assertSee('https://example.com') ->assertDontSee('https://test.com'); } @@ -88,7 +88,7 @@ public function testValidPrivateSearchResult(): void 'private_only' => 'on', ]); - $response->assertStatus(200) + $response->assertOk() ->assertSee('https://example.com') ->assertDontSee('https://test.com'); } @@ -100,7 +100,7 @@ public function testValidBrokenSearchResult(): void 'broken_only' => 'on', ]); - $response->assertStatus(200) + $response->assertOk() ->assertSee('https://broken.com') ->assertDontSee('https://example.com') ->assertDontSee('https://test.com'); @@ -112,7 +112,7 @@ public function testValidTagSearchResult(): void 'only_tags' => 'Examples', ]); - $response->assertStatus(200) + $response->assertOk() ->assertSee('https://example.com') ->assertDontSee('https://test.com'); } @@ -123,7 +123,7 @@ public function testValidListSearchResult(): void 'only_lists' => 'A Tests List', ]); - $response->assertStatus(200) + $response->assertOk() ->assertSee('https://test.com') ->assertDontSee('https://example.com'); } @@ -160,7 +160,7 @@ protected function setupTestData(): void $linkTest->lists()->attach($listTest->id); - $linkBroken = Link::create([ + Link::create([ 'user_id' => $this->user->id, 'url' => 'https://broken.com', 'title' => 'Broken Site', diff --git a/tests/Controller/App/SystemSettingsControllerTest.php b/tests/Controller/App/SystemSettingsControllerTest.php index 5fb961c8..bdbb3d91 100644 --- a/tests/Controller/App/SystemSettingsControllerTest.php +++ b/tests/Controller/App/SystemSettingsControllerTest.php @@ -24,7 +24,7 @@ public function testValidSettingsResponse(): void { $response = $this->get('settings/system'); - $response->assertStatus(200) + $response->assertOk() ->assertSee('Cron Token') ->assertSee('System Settings'); } @@ -36,7 +36,7 @@ public function testValidSettingsUpdateResponse(): void 'system_guest_access' => '1', ]); - $response->assertStatus(302); + $response->assertRedirect('settings/system'); $this->assertDatabaseHas('settings', [ 'user_id' => null, @@ -55,8 +55,9 @@ public function testValidCronGeneratonResponse(): void { $response = $this->post('settings/generate-cron-token'); - $response->assertStatus(200)->assertJsonStructure([ - 'new_token', - ]); + $response->assertOk() + ->assertJsonStructure([ + 'new_token', + ]); } } diff --git a/tests/Controller/App/TrashControllerTest.php b/tests/Controller/App/TrashControllerTest.php index 96b7d237..6eea4e2b 100644 --- a/tests/Controller/App/TrashControllerTest.php +++ b/tests/Controller/App/TrashControllerTest.php @@ -34,7 +34,7 @@ public function testValidTrashResponse(): void { $response = $this->get('trash'); - $response->assertStatus(200) + $response->assertOk() ->assertSee('Search'); } @@ -47,7 +47,7 @@ public function testValidTrashClearLinksResponse(): void $this->setupTrashTestData(); $response = $this->post('trash/clear', [ - 'model' => 'links' + 'model' => 'links', ]); $response->assertRedirect('trash'); @@ -60,7 +60,7 @@ public function testValidTrashClearTagsResponse(): void $this->setupTrashTestData(); $response = $this->post('trash/clear', [ - 'model' => 'tags' + 'model' => 'tags', ]); $response->assertRedirect('trash'); @@ -73,7 +73,7 @@ public function testValidTrashClearListsResponse(): void $this->setupTrashTestData(); $response = $this->post('trash/clear', [ - 'model' => 'lists' + 'model' => 'lists', ]); $response->assertRedirect('trash'); @@ -86,7 +86,7 @@ public function testValidTrashClearNotesResponse(): void $this->setupTrashTestData(); $response = $this->post('trash/clear', [ - 'model' => 'notes' + 'model' => 'notes', ]); $response->assertRedirect('trash'); @@ -108,6 +108,7 @@ public function testValidRestoreLinkResponse(): void ]); $response->assertRedirect('trash'); + $this->assertEquals(null, Link::find(1)->deleted_at); } @@ -121,6 +122,7 @@ public function testValidRestoreTagResponse(): void ]); $response->assertRedirect('trash'); + $this->assertEquals(null, Tag::find(1)->deleted_at); } @@ -133,7 +135,8 @@ public function testValidRestoreListResponse(): void 'id' => '1', ]); - $response->assertStatus(302); + $response->assertRedirect('trash'); + $this->assertEquals(null, LinkList::find(1)->deleted_at); } @@ -146,7 +149,8 @@ public function testValidRestoreNoteResponse(): void 'id' => '1', ]); - $response->assertStatus(302); + $response->assertRedirect('trash'); + $this->assertEquals(null, Note::find(1)->deleted_at); } @@ -174,6 +178,6 @@ public function testRestoreWithMissingModel(): void 'id' => '1345235', ]); - $response->assertStatus(404); + $response->assertNotFound(); } } diff --git a/tests/Controller/App/UserSettingsControllerTest.php b/tests/Controller/App/UserSettingsControllerTest.php index c486a2dc..808a214c 100644 --- a/tests/Controller/App/UserSettingsControllerTest.php +++ b/tests/Controller/App/UserSettingsControllerTest.php @@ -25,7 +25,7 @@ public function testValidSettingsResponse(): void { $response = $this->get('settings'); - $response->assertStatus(200) + $response->assertOk() ->assertSee('Bookmarklet') ->assertSee('API Token') ->assertSee('Account Settings') @@ -40,7 +40,7 @@ public function testValidUpdateAccountSettingsResponse(): void 'email' => 'test@linkace.org', ]); - $response->assertStatus(302); + $response->assertRedirect('/'); $updatedUser = User::first(); @@ -63,7 +63,7 @@ public function testValidUpdateApplicationSettingsResponse(): void 'darkmode_setting' => '0', ]); - $response->assertStatus(302); + $response->assertRedirect('/'); $this->user->load('rawSettings'); // Reload cached settings from other tests @@ -87,7 +87,7 @@ public function testValidUpdatePasswordResponse(): void 'new_password_confirmation' => 'newuserpassword', ]); - $response->assertStatus(302); + $response->assertRedirect('/'); $flashMessage = session('flash_notification', collect())->first(); $this->assertEquals('Password changed successfully!', $flashMessage['message']); From 83dc0b5e54d3670c198d20787deaf50503b6472f Mon Sep 17 00:00:00 2001 From: Kovah Date: Wed, 1 Jul 2020 23:24:43 +0200 Subject: [PATCH 41/44] Refactor auth and guest controller tests --- tests/Controller/Auth/LoginControllerTest.php | 11 ++++------- tests/Controller/Guest/GuestControllerTest.php | 2 +- tests/Controller/Guest/LinkControllerTest.php | 2 +- tests/Controller/Guest/ListControllerTest.php | 6 +++--- tests/Controller/Guest/TagControllerTest.php | 4 ++-- 5 files changed, 11 insertions(+), 14 deletions(-) diff --git a/tests/Controller/Auth/LoginControllerTest.php b/tests/Controller/Auth/LoginControllerTest.php index cda07868..3efa0782 100644 --- a/tests/Controller/Auth/LoginControllerTest.php +++ b/tests/Controller/Auth/LoginControllerTest.php @@ -16,7 +16,7 @@ public function testValidLoginResponse(): void { $response = $this->get('login'); - $response->assertStatus(200) + $response->assertOk() ->assertSee('Login'); } @@ -27,8 +27,7 @@ public function testValidLoginRedirect(): void $response = $this->get('login'); - $response->assertStatus(302) - ->assertRedirect('dashboard'); + $response->assertRedirect('dashboard'); } public function testValidLoginSubmit(): void @@ -40,8 +39,7 @@ public function testValidLoginSubmit(): void 'password' => 'secretpassword', ]); - $response->assertStatus(302) - ->assertRedirect('dashboard'); + $response->assertRedirect('dashboard'); } public function testInvalidLoginSubmit(): void @@ -53,7 +51,6 @@ public function testInvalidLoginSubmit(): void 'password' => 'wrongpassword', ]); - $response->assertStatus(302) - ->assertSessionHasErrors(['email']); + $response->assertSessionHasErrors(['email']); } } diff --git a/tests/Controller/Guest/GuestControllerTest.php b/tests/Controller/Guest/GuestControllerTest.php index 3d6b9e75..777b0120 100644 --- a/tests/Controller/Guest/GuestControllerTest.php +++ b/tests/Controller/Guest/GuestControllerTest.php @@ -28,7 +28,7 @@ public function testGuestModeDisabledWithSplashpage(): void { $response = $this->get('/'); - $response->assertStatus(200) + $response->assertOk() ->assertSee('Login'); } diff --git a/tests/Controller/Guest/LinkControllerTest.php b/tests/Controller/Guest/LinkControllerTest.php index 724ef62b..6414316d 100644 --- a/tests/Controller/Guest/LinkControllerTest.php +++ b/tests/Controller/Guest/LinkControllerTest.php @@ -28,7 +28,7 @@ public function testValidLinkOverviewResponse(): void $response = $this->get('guest/links'); - $response->assertStatus(200) + $response->assertOk() ->assertSee($linkPublic->url) ->assertDontSee($linkPrivate->url); } diff --git a/tests/Controller/Guest/ListControllerTest.php b/tests/Controller/Guest/ListControllerTest.php index dcc4c1c5..e8caef6e 100644 --- a/tests/Controller/Guest/ListControllerTest.php +++ b/tests/Controller/Guest/ListControllerTest.php @@ -33,7 +33,7 @@ public function testValidListOverviewResponse(): void $response = $this->get('guest/lists'); - $response->assertStatus(200) + $response->assertOk() ->assertSee($listPublic->name) ->assertDontSee($listPrivate->name); } @@ -46,7 +46,7 @@ public function testValidListDetailResponse(): void $response = $this->get('guest/lists/1'); - $response->assertStatus(200) + $response->assertOk() ->assertSee($listPublic->name); } @@ -58,6 +58,6 @@ public function testInvalidListDetailResponse(): void $response = $this->get('guest/lists/1'); - $response->assertStatus(404); + $response->assertNotFound(); } } diff --git a/tests/Controller/Guest/TagControllerTest.php b/tests/Controller/Guest/TagControllerTest.php index 39ce097a..a1b43fca 100644 --- a/tests/Controller/Guest/TagControllerTest.php +++ b/tests/Controller/Guest/TagControllerTest.php @@ -32,7 +32,7 @@ public function testValidTagDetailResponse(): void $response = $this->get('guest/tags/1'); - $response->assertStatus(200) + $response->assertOk() ->assertSee($tag->name); } @@ -44,6 +44,6 @@ public function testInvalidTagDetailResponse(): void $response = $this->get('guest/tags/1'); - $response->assertStatus(404); + $response->assertNotFound(); } } From 79a6c34a091096c5d1a03ef30f45a03ee3c3469f Mon Sep 17 00:00:00 2001 From: Kovah Date: Wed, 1 Jul 2020 23:33:43 +0200 Subject: [PATCH 42/44] Refactor model controller tests --- .gitignore | 1 + .../Controller/Models/LinkControllerTest.php | 50 +++++----------- .../Controller/Models/ListControllerTest.php | 58 +++++++------------ .../Controller/Models/NoteControllerTest.php | 45 +++++--------- tests/Controller/Models/TagControllerTest.php | 55 +++++++----------- 5 files changed, 72 insertions(+), 137 deletions(-) diff --git a/.gitignore b/.gitignore index 604d1f4a..2ff61052 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,7 @@ /public/mix-manifest.json /resources/lang/vendor /storage/*.key +/tests/Controller/logs /vendor /.idea /.tmp diff --git a/tests/Controller/Models/LinkControllerTest.php b/tests/Controller/Models/LinkControllerTest.php index 42e27512..ea87a84d 100644 --- a/tests/Controller/Models/LinkControllerTest.php +++ b/tests/Controller/Models/LinkControllerTest.php @@ -35,6 +35,8 @@ protected function setUp(): void Http::fake([ 'example.com' => Http::response($testHtml, 200), ]); + + Queue::fake(); } public function testIndexView(): void @@ -43,7 +45,7 @@ public function testIndexView(): void $response = $this->get('links'); - $response->assertStatus(200) + $response->assertOk() ->assertSee($link->url); } @@ -51,14 +53,12 @@ public function testCreateView(): void { $response = $this->get('links/create'); - $response->assertStatus(200) + $response->assertOk() ->assertSee('Add Link'); } public function testMinimalStoreRequest(): void { - Queue::fake(); - $response = $this->post('links', [ 'url' => 'https://example.com', ]); @@ -75,8 +75,6 @@ public function testMinimalStoreRequest(): void public function testFullStoreRequest(): void { - Queue::fake(); - $tag = factory(Tag::class)->create(); $list = factory(LinkList::class)->create(); @@ -102,8 +100,6 @@ public function testFullStoreRequest(): void public function testStoreRequestWithPrivateDefault(): void { - Queue::fake(); - Setting::create([ 'user_id' => 1, 'key' => 'links_private_default', @@ -128,8 +124,6 @@ public function testStoreRequestWithPrivateDefault(): void public function testStoreRequestWithDuplicate(): void { - Queue::fake(); - factory(Link::class)->create([ 'url' => 'https://example.com/', ]); @@ -151,8 +145,6 @@ public function testStoreRequestWithDuplicate(): void public function testStoreRequestWithBrokenUrl(): void { - Queue::fake(); - Http::fake([ 'example.com' => Http::response('', 500), ]); @@ -177,8 +169,6 @@ public function testStoreRequestWithBrokenUrl(): void public function testStoreRequestWithContinue(): void { - Queue::fake(); - $response = $this->post('links', [ 'url' => 'https://example.com', 'reload_view' => '1', @@ -193,8 +183,6 @@ public function testStoreRequestWithContinue(): void public function testStoreRequestWithoutArchiveBackup(): void { - Queue::fake(); - Setting::create([ 'user_id' => 1, 'key' => 'archive_backups_enabled', @@ -215,8 +203,6 @@ public function testStoreRequestWithoutArchiveBackup(): void public function testStoreRequestWithoutPrivateArchiveBackup(): void { - Queue::fake(); - Setting::create([ 'user_id' => 1, 'key' => 'archive_backups_enabled', @@ -258,7 +244,7 @@ public function testDetailView(): void $response = $this->get('links/1'); - $response->assertStatus(200) + $response->assertOk() ->assertSee($link->url); } @@ -268,7 +254,7 @@ public function testEditView(): void $response = $this->get('links/1/edit'); - $response->assertStatus(200) + $response->assertOk() ->assertSee('Edit Link'); } @@ -276,8 +262,7 @@ public function testUpdateResponse(): void { $baseLink = factory(Link::class)->create(); - $response = $this->post('links/1', [ - '_method' => 'patch', + $response = $this->patch('links/1', [ 'url' => 'https://new-example.com', 'title' => 'New Title', 'description' => 'New Description', @@ -304,8 +289,7 @@ public function testUpdateResponse(): void public function testMissingModelErrorForUpdate(): void { - $response = $this->post('links/1', [ - '_method' => 'patch', + $response = $this->patch('links/1', [ 'link_id' => '1', 'url' => 'https://new-example.com', 'title' => 'New Title', @@ -315,7 +299,7 @@ public function testMissingModelErrorForUpdate(): void 'is_private' => '0', ]); - $response->assertStatus(404); + $response->assertNotFound(); } public function testUniquePropertyValidation(): void @@ -323,8 +307,7 @@ public function testUniquePropertyValidation(): void factory(Link::class)->create(['url' => 'https://old-example.com']); $baseLink = factory(Link::class)->create(); - $response = $this->post('links/2', [ - '_method' => 'patch', + $response = $this->patch('links/2', [ 'link_id' => $baseLink->id, 'url' => 'https://old-example.com', 'title' => 'New Title', @@ -343,8 +326,7 @@ public function testValidationErrorForUpdate(): void { $baseLink = factory(Link::class)->create(); - $response = $this->post('links/1', [ - '_method' => 'patch', + $response = $this->patch('links/1', [ 'link_id' => $baseLink->id, //'url' => 'https://new-example.com', 'title' => 'New Title', @@ -363,9 +345,7 @@ public function testDeleteResponse(): void { factory(Link::class)->create(); - $response = $this->post('links/1', [ - '_method' => 'delete', - ]); + $response = $this->delete('links/1'); $response->assertRedirect('links'); @@ -376,11 +356,9 @@ public function testDeleteResponse(): void public function testMissingModelErrorForDelete(): void { - $response = $this->post('links/1', [ - '_method' => 'delete', - ]); + $response = $this->delete('links/1'); - $response->assertStatus(404); + $response->assertNotFound(); } public function testCheckToggleRequest(): void diff --git a/tests/Controller/Models/ListControllerTest.php b/tests/Controller/Models/ListControllerTest.php index 727441b5..f5402a21 100644 --- a/tests/Controller/Models/ListControllerTest.php +++ b/tests/Controller/Models/ListControllerTest.php @@ -5,14 +5,12 @@ use App\Models\LinkList; use App\Models\Setting; use App\Models\User; -use Illuminate\Foundation\Testing\DatabaseMigrations; -use Illuminate\Foundation\Testing\DatabaseTransactions; +use Illuminate\Foundation\Testing\RefreshDatabase; use Tests\TestCase; class ListControllerTest extends TestCase { - use DatabaseTransactions; - use DatabaseMigrations; + use RefreshDatabase; private $user; @@ -33,7 +31,7 @@ public function testIndexView(): void $response = $this->get('lists'); - $response->assertStatus(200) + $response->assertOk() ->assertSee($list->name); } @@ -41,7 +39,7 @@ public function testCreateView(): void { $response = $this->get('lists/create'); - $response->assertStatus(200) + $response->assertOk() ->assertSee('Add List'); } @@ -52,8 +50,7 @@ public function testMinimalStoreRequest(): void 'is_private' => '0', ]); - $response->assertStatus(302) - ->assertRedirect('lists/1'); + $response->assertRedirect('lists/1'); $databaseList = LinkList::first(); @@ -68,8 +65,7 @@ public function testFullStoreRequest(): void 'is_private' => '1', ]); - $response->assertStatus(302) - ->assertRedirect('lists/1'); + $response->assertRedirect('lists/1'); $databaseList = LinkList::first(); @@ -90,8 +86,7 @@ public function testStoreRequestWithPrivateDefault(): void 'is_private' => usersettings('lists_private_default'), ]); - $response->assertStatus(302) - ->assertRedirect('lists/1'); + $response->assertRedirect('lists/1'); $databaseList = LinkList::first(); @@ -106,8 +101,7 @@ public function testStoreRequestWithContinue(): void 'reload_view' => '1', ]); - $response->assertStatus(302) - ->assertRedirect('lists/create'); + $response->assertRedirect('lists/create'); $databaseList = LinkList::first(); @@ -134,7 +128,7 @@ public function testDetailView(): void $response = $this->get('lists/1'); - $response->assertStatus(200) + $response->assertOk() ->assertSee($list->name); } @@ -146,7 +140,7 @@ public function testEditView(): void $response = $this->get('lists/1/edit'); - $response->assertStatus(200) + $response->assertOk() ->assertSee('Edit List') ->assertSee('Update List'); } @@ -155,7 +149,7 @@ public function testInvalidEditRequest(): void { $response = $this->get('lists/1/edit'); - $response->assertStatus(404); + $response->assertNotFound(); } public function testUpdateResponse(): void @@ -164,15 +158,13 @@ public function testUpdateResponse(): void 'user_id' => $this->user->id, ]); - $response = $this->post('lists/1', [ - '_method' => 'patch', + $response = $this->patch('lists/1', [ 'list_id' => $baseList->id, 'name' => 'New Test List', 'is_private' => '0', ]); - $response->assertStatus(302) - ->assertRedirect('lists/1'); + $response->assertRedirect('lists/1'); $updatedLink = $baseList->fresh(); @@ -181,14 +173,13 @@ public function testUpdateResponse(): void public function testMissingModelErrorForUpdate(): void { - $response = $this->post('lists/1', [ - '_method' => 'patch', + $response = $this->patch('lists/1', [ 'list_id' => '1', 'name' => 'New Test List', 'is_private' => '0', ]); - $response->assertStatus(404); + $response->assertNotFound(); } public function testUniquePropertyValidation(): void @@ -202,8 +193,7 @@ public function testUniquePropertyValidation(): void 'user_id' => $this->user->id, ]); - $response = $this->post('lists/2', [ - '_method' => 'patch', + $response = $this->patch('lists/2', [ 'list_id' => $baseList->id, 'name' => 'Taken List Name', 'is_private' => '0', @@ -220,8 +210,7 @@ public function testValidationErrorForUpdate(): void 'user_id' => $this->user->id, ]); - $response = $this->post('lists/1', [ - '_method' => 'patch', + $response = $this->patch('lists/1', [ 'list_id' => $baseList->id, //'name' => 'New Test List', 'is_private' => '0', @@ -238,12 +227,9 @@ public function testDeleteResponse(): void 'user_id' => $this->user->id, ]); - $response = $this->post('lists/1', [ - '_method' => 'delete', - ]); + $response = $this->deleteJson('lists/1'); - $response->assertStatus(302) - ->assertRedirect('lists'); + $response->assertRedirect('lists'); $databaseList = LinkList::withTrashed()->first(); @@ -253,10 +239,8 @@ public function testDeleteResponse(): void public function testMissingModelErrorForDelete(): void { - $response = $this->post('lists/1', [ - '_method' => 'delete', - ]); + $response = $this->delete('lists/1'); - $response->assertStatus(404); + $response->assertNotFound(); } } diff --git a/tests/Controller/Models/NoteControllerTest.php b/tests/Controller/Models/NoteControllerTest.php index 01cef699..e782f528 100644 --- a/tests/Controller/Models/NoteControllerTest.php +++ b/tests/Controller/Models/NoteControllerTest.php @@ -6,14 +6,12 @@ use App\Models\Note; use App\Models\Setting; use App\Models\User; -use Illuminate\Foundation\Testing\DatabaseMigrations; -use Illuminate\Foundation\Testing\DatabaseTransactions; +use Illuminate\Foundation\Testing\RefreshDatabase; use Tests\TestCase; class NoteControllerTest extends TestCase { - use DatabaseTransactions; - use DatabaseMigrations; + use RefreshDatabase; private $user; @@ -36,8 +34,7 @@ public function testMinimalStoreRequest(): void 'is_private' => '0', ]); - $response->assertStatus(302) - ->assertRedirect('links/1'); + $response->assertRedirect('links/1'); $this->assertEquals('Lorem ipsum dolor', $link->notes()->first()->note); } @@ -58,8 +55,7 @@ public function testStoreRequestWithPrivateDefault(): void 'is_private' => usersettings('notes_private_default'), ]); - $response->assertStatus(302) - ->assertRedirect('links/1'); + $response->assertRedirect('links/1'); $this->assertTrue($link->notes()->first()->is_private); } @@ -87,7 +83,7 @@ public function testStoreRequestForMissingLink(): void 'is_private' => '0', ]); - $response->assertStatus(404); + $response->assertNotFound(); } public function testEditView(): void @@ -96,7 +92,7 @@ public function testEditView(): void $response = $this->get('notes/1/edit'); - $response->assertStatus(200) + $response->assertOk() ->assertSee('Edit Note'); } @@ -104,22 +100,20 @@ public function testInvalidEditRequest(): void { $response = $this->get('notes/1/edit'); - $response->assertStatus(404); + $response->assertNotFound(); } public function testUpdateResponse(): void { $baseNote = factory(Note::class)->create(); - $response = $this->post('notes/1', [ - '_method' => 'patch', + $response = $this->patch('notes/1', [ 'link_id' => $baseNote->link_id, 'note' => 'Lorem ipsum dolor est updated', 'is_private' => '0', ]); - $response->assertStatus(302) - ->assertRedirect('links/' . $baseNote->link_id); + $response->assertRedirect('links/' . $baseNote->link_id); $updatedLink = $baseNote->fresh(); @@ -128,22 +122,20 @@ public function testUpdateResponse(): void public function testMissingModelErrorForUpdate(): void { - $response = $this->post('notes/1', [ - '_method' => 'patch', + $response = $this->patch('notes/1', [ 'link_id' => '1', 'note' => 'Lorem ipsum dolor est updated', 'is_private' => '0', ]); - $response->assertStatus(404); + $response->assertNotFound(); } public function testValidationErrorForUpdate(): void { $baseNote = factory(Note::class)->create(); - $response = $this->post('notes/1', [ - '_method' => 'patch', + $response = $this->patch('notes/1', [ 'note_id' => $baseNote->id, //'note' => 'Lorem ipsum dolor est updated', 'is_private' => '0', @@ -164,12 +156,9 @@ public function testDeleteResponse(): void 'link_id' => $link->id, ]); - $response = $this->post('notes/1', [ - '_method' => 'delete', - ]); + $response = $this->deleteJson('notes/1'); - $response->assertStatus(302) - ->assertRedirect('links/' . $note->link_id); + $response->assertRedirect('links/' . $note->link_id); $databaseNote = Note::withTrashed()->first(); @@ -178,10 +167,8 @@ public function testDeleteResponse(): void public function testMissingModelErrorForDelete(): void { - $response = $this->post('notes/1', [ - '_method' => 'delete', - ]); + $response = $this->deleteJson('notes/1'); - $response->assertStatus(404); + $response->assertNotFound(); } } diff --git a/tests/Controller/Models/TagControllerTest.php b/tests/Controller/Models/TagControllerTest.php index be8f301f..3f5707ec 100644 --- a/tests/Controller/Models/TagControllerTest.php +++ b/tests/Controller/Models/TagControllerTest.php @@ -5,14 +5,12 @@ use App\Models\Setting; use App\Models\Tag; use App\Models\User; -use Illuminate\Foundation\Testing\DatabaseMigrations; -use Illuminate\Foundation\Testing\DatabaseTransactions; +use Illuminate\Foundation\Testing\RefreshDatabase; use Tests\TestCase; class TagControllerTest extends TestCase { - use DatabaseTransactions; - use DatabaseMigrations; + use RefreshDatabase; private $user; @@ -33,7 +31,7 @@ public function testIndexView(): void $response = $this->get('tags'); - $response->assertStatus(200) + $response->assertOk() ->assertSee($tag->name); } @@ -41,7 +39,7 @@ public function testCreateView(): void { $response = $this->get('tags/create'); - $response->assertStatus(200) + $response->assertOk() ->assertSee('Add Tag'); } @@ -52,8 +50,7 @@ public function testMinimalStoreRequest(): void 'is_private' => '0', ]); - $response->assertStatus(302) - ->assertRedirect('tags/1'); + $response->assertRedirect('tags/1'); $databaseList = Tag::first(); @@ -73,8 +70,7 @@ public function testStoreRequestWithPrivateDefault(): void 'is_private' => usersettings('tags_private_default'), ]); - $response->assertStatus(302) - ->assertRedirect('tags/1'); + $response->assertRedirect('tags/1'); $databaseList = Tag::first(); @@ -89,8 +85,7 @@ public function testStoreRequestWithContinue(): void 'reload_view' => '1', ]); - $response->assertStatus(302) - ->assertRedirect('tags/create'); + $response->assertRedirect('tags/create'); $databaseList = Tag::first(); @@ -117,7 +112,7 @@ public function testDetailView(): void $response = $this->get('tags/1'); - $response->assertStatus(200) + $response->assertOk() ->assertSee($tag->name); } @@ -129,7 +124,7 @@ public function testEditView(): void $response = $this->get('tags/1/edit'); - $response->assertStatus(200) + $response->assertOk() ->assertSee('Edit Tag') ->assertSee('Update Tag'); } @@ -138,7 +133,7 @@ public function testInvalidEditRequest(): void { $response = $this->get('tags/1/edit'); - $response->assertStatus(404); + $response->assertNotFound(); } public function testUpdateResponse(): void @@ -147,15 +142,13 @@ public function testUpdateResponse(): void 'user_id' => $this->user->id, ]); - $response = $this->post('tags/1', [ - '_method' => 'patch', + $response = $this->patch('tags/1', [ 'tag_id' => $baseTag->id, 'name' => 'New Test Tag', 'is_private' => '0', ]); - $response->assertStatus(302) - ->assertRedirect('tags/1'); + $response->assertRedirect('tags/1'); $updatedLink = $baseTag->fresh(); @@ -164,14 +157,13 @@ public function testUpdateResponse(): void public function testMissingModelErrorForUpdate(): void { - $response = $this->post('tags/1', [ - '_method' => 'patch', + $response = $this->patch('tags/1', [ 'tag_id' => '1', 'name' => 'New Test Tag', 'is_private' => '0', ]); - $response->assertStatus(404); + $response->assertNotFound(); } public function testUniquePropertyValidation(): void @@ -185,8 +177,7 @@ public function testUniquePropertyValidation(): void 'user_id' => $this->user->id, ]); - $response = $this->post('tags/2', [ - '_method' => 'patch', + $response = $this->patch('tags/2', [ 'tag_id' => $baseTag->id, 'name' => 'taken-tag-name', 'is_private' => '0', @@ -203,8 +194,7 @@ public function testValidationErrorForUpdate(): void 'user_id' => $this->user->id, ]); - $response = $this->post('tags/1', [ - '_method' => 'patch', + $response = $this->patch('tags/1', [ 'tag_id' => $baseTag->id, //'name' => 'New Test Tag', 'is_private' => '0', @@ -221,12 +211,9 @@ public function testDeleteResponse(): void 'user_id' => $this->user->id, ]); - $response = $this->post('tags/1', [ - '_method' => 'delete', - ]); + $response = $this->delete('tags/1'); - $response->assertStatus(302) - ->assertRedirect('tags'); + $response->assertRedirect('tags'); $databaseTag = Tag::withTrashed()->first(); @@ -236,10 +223,8 @@ public function testDeleteResponse(): void public function testMissingModelErrorForDelete(): void { - $response = $this->post('tags/1', [ - '_method' => 'delete', - ]); + $response = $this->delete('tags/1'); - $response->assertStatus(404); + $response->assertNotFound(); } } From 4798d2762b7cc772ef69c2b7bba9996d4968a21b Mon Sep 17 00:00:00 2001 From: Kovah Date: Wed, 1 Jul 2020 23:38:34 +0200 Subject: [PATCH 43/44] Refactor all controller tests to use RefreshDatabase trait --- tests/Controller/API/LinkApiTest.php | 6 ++---- tests/Controller/API/LinkCheckApiTest.php | 6 ++---- tests/Controller/API/LinkNotesTest.php | 8 ++------ tests/Controller/API/ListApiTest.php | 6 ++---- tests/Controller/API/ListLinksTest.php | 14 +++++--------- tests/Controller/API/NoteApiTest.php | 6 ++---- tests/Controller/API/SearchListsTest.php | 6 ++---- tests/Controller/API/SearchTagsTest.php | 6 ++---- tests/Controller/API/TagApiTest.php | 6 ++---- tests/Controller/API/TagLinksTest.php | 8 ++------ tests/Controller/API/TrashApiTest.php | 6 ++---- tests/Controller/App/BookmarkletControllerTest.php | 6 ++---- tests/Controller/App/DashboardControllerTest.php | 6 ++---- tests/Controller/App/ExportControllerTest.php | 6 ++---- tests/Controller/App/ImportControllerTest.php | 6 ++---- tests/Controller/App/SearchControllerTest.php | 6 ++---- .../App/SystemSettingsControllerTest.php | 1 + tests/Controller/App/TrashControllerTest.php | 6 ++---- .../Controller/App/UserSettingsControllerTest.php | 1 + tests/Controller/Auth/LoginControllerTest.php | 6 ++---- tests/Controller/Guest/GuestControllerTest.php | 6 ++---- tests/Controller/Guest/LinkControllerTest.php | 6 ++---- tests/Controller/Guest/ListControllerTest.php | 6 ++---- tests/Controller/Guest/TagControllerTest.php | 6 ++---- tests/Controller/Setup/MetaControllerTest.php | 10 ++++------ 25 files changed, 53 insertions(+), 103 deletions(-) diff --git a/tests/Controller/API/LinkApiTest.php b/tests/Controller/API/LinkApiTest.php index a0c8fb12..448d95ae 100644 --- a/tests/Controller/API/LinkApiTest.php +++ b/tests/Controller/API/LinkApiTest.php @@ -6,14 +6,12 @@ use App\Models\Link; use App\Models\LinkList; use App\Models\Tag; -use Illuminate\Foundation\Testing\DatabaseMigrations; -use Illuminate\Foundation\Testing\DatabaseTransactions; +use Illuminate\Foundation\Testing\RefreshDatabase; use Illuminate\Support\Facades\Queue; class LinkApiTest extends ApiTestCase { - use DatabaseTransactions; - use DatabaseMigrations; + use RefreshDatabase; public function testUnauthorizedRequest(): void { diff --git a/tests/Controller/API/LinkCheckApiTest.php b/tests/Controller/API/LinkCheckApiTest.php index 1ab40546..e891c1ea 100644 --- a/tests/Controller/API/LinkCheckApiTest.php +++ b/tests/Controller/API/LinkCheckApiTest.php @@ -3,13 +3,11 @@ namespace Tests\Controller\API; use App\Models\Link; -use Illuminate\Foundation\Testing\DatabaseMigrations; -use Illuminate\Foundation\Testing\DatabaseTransactions; +use Illuminate\Foundation\Testing\RefreshDatabase; class LinkCheckApiTest extends ApiTestCase { - use DatabaseTransactions; - use DatabaseMigrations; + use RefreshDatabase; public function testUnauthorizedRequest(): void { diff --git a/tests/Controller/API/LinkNotesTest.php b/tests/Controller/API/LinkNotesTest.php index 4ccc1e3f..54fb4643 100644 --- a/tests/Controller/API/LinkNotesTest.php +++ b/tests/Controller/API/LinkNotesTest.php @@ -4,15 +4,11 @@ use App\Models\Link; use App\Models\Note; -use App\Models\User; -use Illuminate\Foundation\Testing\DatabaseMigrations; -use Illuminate\Foundation\Testing\DatabaseTransactions; -use Tests\TestCase; +use Illuminate\Foundation\Testing\RefreshDatabase; class LinkNotesTest extends ApiTestCase { - use DatabaseTransactions; - use DatabaseMigrations; + use RefreshDatabase; public function testLinksRequest(): void { diff --git a/tests/Controller/API/ListApiTest.php b/tests/Controller/API/ListApiTest.php index 00b40d37..099fcaf6 100644 --- a/tests/Controller/API/ListApiTest.php +++ b/tests/Controller/API/ListApiTest.php @@ -3,13 +3,11 @@ namespace Tests\Controller\API; use App\Models\LinkList; -use Illuminate\Foundation\Testing\DatabaseMigrations; -use Illuminate\Foundation\Testing\DatabaseTransactions; +use Illuminate\Foundation\Testing\RefreshDatabase; class ListApiTest extends ApiTestCase { - use DatabaseTransactions; - use DatabaseMigrations; + use RefreshDatabase; public function testUnauthorizedRequest(): void { diff --git a/tests/Controller/API/ListLinksTest.php b/tests/Controller/API/ListLinksTest.php index a0d7b629..81598ad2 100644 --- a/tests/Controller/API/ListLinksTest.php +++ b/tests/Controller/API/ListLinksTest.php @@ -4,15 +4,11 @@ use App\Models\Link; use App\Models\LinkList; -use App\Models\User; -use Illuminate\Foundation\Testing\DatabaseMigrations; -use Illuminate\Foundation\Testing\DatabaseTransactions; -use Tests\TestCase; +use Illuminate\Foundation\Testing\RefreshDatabase; class ListLinksTest extends ApiTestCase { - use DatabaseTransactions; - use DatabaseMigrations; + use RefreshDatabase; public function testLinksRequest(): void { @@ -26,8 +22,8 @@ public function testLinksRequest(): void $response->assertOk() ->assertJson([ 'data' => [ - ['url' => $link->url] - ] + ['url' => $link->url], + ], ]); } @@ -39,7 +35,7 @@ public function testLinksRequestWithoutLinks(): void $response->assertOk() ->assertJson([ - 'data' => [] + 'data' => [], ]); $responseBody = json_decode($response->content()); diff --git a/tests/Controller/API/NoteApiTest.php b/tests/Controller/API/NoteApiTest.php index 055cae75..37c58456 100644 --- a/tests/Controller/API/NoteApiTest.php +++ b/tests/Controller/API/NoteApiTest.php @@ -4,13 +4,11 @@ use App\Models\Link; use App\Models\Note; -use Illuminate\Foundation\Testing\DatabaseMigrations; -use Illuminate\Foundation\Testing\DatabaseTransactions; +use Illuminate\Foundation\Testing\RefreshDatabase; class NoteApiTest extends ApiTestCase { - use DatabaseTransactions; - use DatabaseMigrations; + use RefreshDatabase; public function testMinimalCreateRequest(): void { diff --git a/tests/Controller/API/SearchListsTest.php b/tests/Controller/API/SearchListsTest.php index 09e21572..77fda18d 100644 --- a/tests/Controller/API/SearchListsTest.php +++ b/tests/Controller/API/SearchListsTest.php @@ -3,13 +3,11 @@ namespace Tests\Controller\API; use App\Models\LinkList; -use Illuminate\Foundation\Testing\DatabaseMigrations; -use Illuminate\Foundation\Testing\DatabaseTransactions; +use Illuminate\Foundation\Testing\RefreshDatabase; class SearchListsTest extends ApiTestCase { - use DatabaseTransactions; - use DatabaseMigrations; + use RefreshDatabase; public function testUnauthorizedRequest(): void { diff --git a/tests/Controller/API/SearchTagsTest.php b/tests/Controller/API/SearchTagsTest.php index 97d6473c..e64a6daf 100644 --- a/tests/Controller/API/SearchTagsTest.php +++ b/tests/Controller/API/SearchTagsTest.php @@ -3,13 +3,11 @@ namespace Tests\Controller\API; use App\Models\Tag; -use Illuminate\Foundation\Testing\DatabaseMigrations; -use Illuminate\Foundation\Testing\DatabaseTransactions; +use Illuminate\Foundation\Testing\RefreshDatabase; class SearchTagsTest extends ApiTestCase { - use DatabaseTransactions; - use DatabaseMigrations; + use RefreshDatabase; public function testUnauthorizedRequest(): void { diff --git a/tests/Controller/API/TagApiTest.php b/tests/Controller/API/TagApiTest.php index 715c61f6..61a48b54 100644 --- a/tests/Controller/API/TagApiTest.php +++ b/tests/Controller/API/TagApiTest.php @@ -3,13 +3,11 @@ namespace Tests\Controller\API; use App\Models\Tag; -use Illuminate\Foundation\Testing\DatabaseMigrations; -use Illuminate\Foundation\Testing\DatabaseTransactions; +use Illuminate\Foundation\Testing\RefreshDatabase; class TagApiTest extends ApiTestCase { - use DatabaseTransactions; - use DatabaseMigrations; + use RefreshDatabase; public function testUnauthorizedRequest(): void { diff --git a/tests/Controller/API/TagLinksTest.php b/tests/Controller/API/TagLinksTest.php index 0df25e47..2984ce6f 100644 --- a/tests/Controller/API/TagLinksTest.php +++ b/tests/Controller/API/TagLinksTest.php @@ -4,15 +4,11 @@ use App\Models\Link; use App\Models\Tag; -use App\Models\User; -use Illuminate\Foundation\Testing\DatabaseMigrations; -use Illuminate\Foundation\Testing\DatabaseTransactions; -use Tests\TestCase; +use Illuminate\Foundation\Testing\RefreshDatabase; class TagLinksTest extends ApiTestCase { - use DatabaseTransactions; - use DatabaseMigrations; + use RefreshDatabase; public function testLinksRequest(): void { diff --git a/tests/Controller/API/TrashApiTest.php b/tests/Controller/API/TrashApiTest.php index 01d0aa11..a6ee5605 100644 --- a/tests/Controller/API/TrashApiTest.php +++ b/tests/Controller/API/TrashApiTest.php @@ -6,15 +6,13 @@ use App\Models\LinkList; use App\Models\Note; use App\Models\Tag; -use Illuminate\Foundation\Testing\DatabaseMigrations; -use Illuminate\Foundation\Testing\DatabaseTransactions; +use Illuminate\Foundation\Testing\RefreshDatabase; use Illuminate\Support\Facades\DB; use Tests\Controller\Traits\PreparesTrash; class TrashApiTest extends ApiTestCase { - use DatabaseTransactions; - use DatabaseMigrations; + use RefreshDatabase; use PreparesTrash; protected function setUp(): void diff --git a/tests/Controller/App/BookmarkletControllerTest.php b/tests/Controller/App/BookmarkletControllerTest.php index 7640f3a5..38bc0426 100644 --- a/tests/Controller/App/BookmarkletControllerTest.php +++ b/tests/Controller/App/BookmarkletControllerTest.php @@ -3,14 +3,12 @@ namespace Tests\Controller\App; use App\Models\User; -use Illuminate\Foundation\Testing\DatabaseMigrations; -use Illuminate\Foundation\Testing\DatabaseTransactions; +use Illuminate\Foundation\Testing\RefreshDatabase; use Tests\TestCase; class BookmarkletControllerTest extends TestCase { - use DatabaseTransactions; - use DatabaseMigrations; + use RefreshDatabase; public function testValidBookmarkletResponse(): void { diff --git a/tests/Controller/App/DashboardControllerTest.php b/tests/Controller/App/DashboardControllerTest.php index 48cd9151..fa650bf7 100644 --- a/tests/Controller/App/DashboardControllerTest.php +++ b/tests/Controller/App/DashboardControllerTest.php @@ -3,14 +3,12 @@ namespace Tests\Controller\App; use App\Models\User; -use Illuminate\Foundation\Testing\DatabaseMigrations; -use Illuminate\Foundation\Testing\DatabaseTransactions; +use Illuminate\Foundation\Testing\RefreshDatabase; use Tests\TestCase; class DashboardControllerTest extends TestCase { - use DatabaseTransactions; - use DatabaseMigrations; + use RefreshDatabase; public function testValidDashboardResponse(): void { diff --git a/tests/Controller/App/ExportControllerTest.php b/tests/Controller/App/ExportControllerTest.php index d5bea0b9..a65d50ea 100644 --- a/tests/Controller/App/ExportControllerTest.php +++ b/tests/Controller/App/ExportControllerTest.php @@ -4,14 +4,12 @@ use App\Models\Link; use App\Models\User; -use Illuminate\Foundation\Testing\DatabaseMigrations; -use Illuminate\Foundation\Testing\DatabaseTransactions; +use Illuminate\Foundation\Testing\RefreshDatabase; use Tests\TestCase; class ExportControllerTest extends TestCase { - use DatabaseTransactions; - use DatabaseMigrations; + use RefreshDatabase; private $user; diff --git a/tests/Controller/App/ImportControllerTest.php b/tests/Controller/App/ImportControllerTest.php index 0c6a1647..60c2f248 100644 --- a/tests/Controller/App/ImportControllerTest.php +++ b/tests/Controller/App/ImportControllerTest.php @@ -4,15 +4,13 @@ use App\Models\Link; use App\Models\User; -use Illuminate\Foundation\Testing\DatabaseMigrations; -use Illuminate\Foundation\Testing\DatabaseTransactions; +use Illuminate\Foundation\Testing\RefreshDatabase; use Illuminate\Http\UploadedFile; use Tests\TestCase; class ImportControllerTest extends TestCase { - use DatabaseTransactions; - use DatabaseMigrations; + use RefreshDatabase; private $user; diff --git a/tests/Controller/App/SearchControllerTest.php b/tests/Controller/App/SearchControllerTest.php index 72e603f1..172586ae 100644 --- a/tests/Controller/App/SearchControllerTest.php +++ b/tests/Controller/App/SearchControllerTest.php @@ -6,14 +6,12 @@ use App\Models\LinkList; use App\Models\Tag; use App\Models\User; -use Illuminate\Foundation\Testing\DatabaseMigrations; -use Illuminate\Foundation\Testing\DatabaseTransactions; +use Illuminate\Foundation\Testing\RefreshDatabase; use Tests\TestCase; class SearchControllerTest extends TestCase { - use DatabaseTransactions; - use DatabaseMigrations; + use RefreshDatabase; private $user; diff --git a/tests/Controller/App/SystemSettingsControllerTest.php b/tests/Controller/App/SystemSettingsControllerTest.php index bdbb3d91..d2afb882 100644 --- a/tests/Controller/App/SystemSettingsControllerTest.php +++ b/tests/Controller/App/SystemSettingsControllerTest.php @@ -10,6 +10,7 @@ class SystemSettingsControllerTest extends TestCase { use RefreshDatabase; + /** @var User */ private $user; public function setUp(): void diff --git a/tests/Controller/App/TrashControllerTest.php b/tests/Controller/App/TrashControllerTest.php index 6eea4e2b..884729e3 100644 --- a/tests/Controller/App/TrashControllerTest.php +++ b/tests/Controller/App/TrashControllerTest.php @@ -7,16 +7,14 @@ use App\Models\Note; use App\Models\Tag; use App\Models\User; -use Illuminate\Foundation\Testing\DatabaseMigrations; -use Illuminate\Foundation\Testing\DatabaseTransactions; +use Illuminate\Foundation\Testing\RefreshDatabase; use Illuminate\Support\Facades\DB; use Tests\Controller\Traits\PreparesTrash; use Tests\TestCase; class TrashControllerTest extends TestCase { - use DatabaseTransactions; - use DatabaseMigrations; + use RefreshDatabase; use PreparesTrash; /** @var User */ diff --git a/tests/Controller/App/UserSettingsControllerTest.php b/tests/Controller/App/UserSettingsControllerTest.php index 808a214c..ec2c0ec4 100644 --- a/tests/Controller/App/UserSettingsControllerTest.php +++ b/tests/Controller/App/UserSettingsControllerTest.php @@ -11,6 +11,7 @@ class UserSettingsControllerTest extends TestCase { use RefreshDatabase; + /** @var User */ private $user; public function setUp(): void diff --git a/tests/Controller/Auth/LoginControllerTest.php b/tests/Controller/Auth/LoginControllerTest.php index 3efa0782..8fdf78a6 100644 --- a/tests/Controller/Auth/LoginControllerTest.php +++ b/tests/Controller/Auth/LoginControllerTest.php @@ -3,14 +3,12 @@ namespace Tests\Controller\Auth; use App\Models\User; -use Illuminate\Foundation\Testing\DatabaseMigrations; -use Illuminate\Foundation\Testing\DatabaseTransactions; +use Illuminate\Foundation\Testing\RefreshDatabase; use Tests\TestCase; class LoginControllerTest extends TestCase { - use DatabaseTransactions; - use DatabaseMigrations; + use RefreshDatabase; public function testValidLoginResponse(): void { diff --git a/tests/Controller/Guest/GuestControllerTest.php b/tests/Controller/Guest/GuestControllerTest.php index 777b0120..2de19abf 100644 --- a/tests/Controller/Guest/GuestControllerTest.php +++ b/tests/Controller/Guest/GuestControllerTest.php @@ -3,14 +3,12 @@ namespace Tests\Controller\Guest; use App\Models\Setting; -use Illuminate\Foundation\Testing\DatabaseMigrations; -use Illuminate\Foundation\Testing\DatabaseTransactions; +use Illuminate\Foundation\Testing\RefreshDatabase; use Tests\TestCase; class GuestControllerTest extends TestCase { - use DatabaseTransactions; - use DatabaseMigrations; + use RefreshDatabase; public function testGuestModeEnabled(): void { diff --git a/tests/Controller/Guest/LinkControllerTest.php b/tests/Controller/Guest/LinkControllerTest.php index 6414316d..a3b300f8 100644 --- a/tests/Controller/Guest/LinkControllerTest.php +++ b/tests/Controller/Guest/LinkControllerTest.php @@ -5,14 +5,12 @@ use App\Models\Link; use App\Models\Setting; use App\Models\User; -use Illuminate\Foundation\Testing\DatabaseMigrations; -use Illuminate\Foundation\Testing\DatabaseTransactions; +use Illuminate\Foundation\Testing\RefreshDatabase; use Tests\TestCase; class LinkControllerTest extends TestCase { - use DatabaseTransactions; - use DatabaseMigrations; + use RefreshDatabase; public function testValidLinkOverviewResponse(): void { diff --git a/tests/Controller/Guest/ListControllerTest.php b/tests/Controller/Guest/ListControllerTest.php index e8caef6e..a4f687ae 100644 --- a/tests/Controller/Guest/ListControllerTest.php +++ b/tests/Controller/Guest/ListControllerTest.php @@ -5,14 +5,12 @@ use App\Models\LinkList; use App\Models\Setting; use App\Models\User; -use Illuminate\Foundation\Testing\DatabaseMigrations; -use Illuminate\Foundation\Testing\DatabaseTransactions; +use Illuminate\Foundation\Testing\RefreshDatabase; use Tests\TestCase; class ListControllerTest extends TestCase { - use DatabaseTransactions; - use DatabaseMigrations; + use RefreshDatabase; protected function setUp(): void { diff --git a/tests/Controller/Guest/TagControllerTest.php b/tests/Controller/Guest/TagControllerTest.php index a1b43fca..03b6cd74 100644 --- a/tests/Controller/Guest/TagControllerTest.php +++ b/tests/Controller/Guest/TagControllerTest.php @@ -5,14 +5,12 @@ use App\Models\Setting; use App\Models\Tag; use App\Models\User; -use Illuminate\Foundation\Testing\DatabaseMigrations; -use Illuminate\Foundation\Testing\DatabaseTransactions; +use Illuminate\Foundation\Testing\RefreshDatabase; use Tests\TestCase; class TagControllerTest extends TestCase { - use DatabaseTransactions; - use DatabaseMigrations; + use RefreshDatabase; protected function setUp(): void { diff --git a/tests/Controller/Setup/MetaControllerTest.php b/tests/Controller/Setup/MetaControllerTest.php index fb92ad19..0c179cc0 100644 --- a/tests/Controller/Setup/MetaControllerTest.php +++ b/tests/Controller/Setup/MetaControllerTest.php @@ -2,14 +2,12 @@ namespace Tests\Controller\Setup; -use Illuminate\Foundation\Testing\DatabaseMigrations; -use Illuminate\Foundation\Testing\DatabaseTransactions; +use Illuminate\Foundation\Testing\RefreshDatabase; use Tests\TestCase; class MetaControllerTest extends TestCase { - use DatabaseTransactions; - use DatabaseMigrations; + use RefreshDatabase; protected function setUp(): void { @@ -31,7 +29,7 @@ public function testSetupCheckWithoutRedirect(): void $response = $this->get('/'); - $response->assertStatus(200); + $response->assertOk(); } public function testRedirectIfSetupCompleted(): void @@ -47,7 +45,7 @@ public function testSetupWelcomeView(): void { $response = $this->get('setup/start'); - $response->assertStatus(200) + $response->assertOk() ->assertSee('Welcome to the LinkAce setup'); } } From 4eab088a74eb34faa4963cd5e86e29c8b63b9cb4 Mon Sep 17 00:00:00 2001 From: Kovah Date: Wed, 1 Jul 2020 23:43:24 +0200 Subject: [PATCH 44/44] 0.0.39 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 042dc002..5e7f9067 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "linkace", - "version": "0.0.38", + "version": "0.0.39", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 6e5d1848..6c7d4751 100755 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "linkace", - "version": "0.0.38", + "version": "0.0.39", "description": "A small, selfhosted bookmark manager with advanced features, built with Laravel and Docker", "homepage": "https://github.com/Kovah/LinkAce", "repository": {