From fb145f2bf92b0908c9ac5ecdd3c47141c53cde17 Mon Sep 17 00:00:00 2001 From: Alexander Volz Date: Sat, 18 Nov 2023 04:07:42 +0100 Subject: [PATCH 01/15] update dev example env --- .env.example | 2 +- docs/source/admin/games/basic.rst | 128 ++++++++++++++----- docs/source/images/games_add_template_01.png | Bin 0 -> 6590 bytes docs/source/images/games_add_template_02.png | Bin 0 -> 44354 bytes docs/source/images/games_add_template_03.png | Bin 0 -> 28534 bytes 5 files changed, 95 insertions(+), 35 deletions(-) create mode 100644 docs/source/images/games_add_template_01.png create mode 100644 docs/source/images/games_add_template_02.png create mode 100644 docs/source/images/games_add_template_03.png diff --git a/.env.example b/.env.example index bb2f5ba83..775d5bb5c 100644 --- a/.env.example +++ b/.env.example @@ -66,7 +66,7 @@ APPEAR_DISABLE_ADMIN_APPEARANCE_CSS_SETTINGS=false ################## # mail driver, usualy smtp -MAIL_DRIVER=smtp +MAIL_DRIVER=log # mail server host MAIL_HOST= # mail server port diff --git a/docs/source/admin/games/basic.rst b/docs/source/admin/games/basic.rst index 8c3817a3c..45740ae17 100644 --- a/docs/source/admin/games/basic.rst +++ b/docs/source/admin/games/basic.rst @@ -2,13 +2,58 @@ Games ================================================== -Basic ------ +Introduction +--------------- You can create games which will be available in your event, your tournaments and your matchmaking. You are then able to add gameservers for each game and for a few games you can show serverstats / remote control the servers from eventula or even automate your matchmaking or tournament. -Add Game -......... + .. note:: + If you are planning to use the full featureset for the supported games, we recommend to use the :ref:`admin/games/basic:Add Game from Template` feature to add the game. + +Add Game from Template +......................... + +Lets create a game from a template, which depending on the game comes with preconfigured settings for it. + +Go to your Admin Panel to the ``Games`` Section. + +Over the right you can find the ``Add Game from Template`` Button. Kick it. + +.. image:: ../../images/games_add_template_01.png + :scale: 50 % + :alt: eventula game addition from template first step + :align: center + + +You will now get a list of all supported games with their :ref:`admin/games/basic:Game Commandhandler` and :ref:`admin/games/basic:Game Match Api handler` (and a few parameters), where you can click ``Deploy`` on the one you want to deploy: + +.. image:: ../../images/games_add_template_02.png + :scale: 50 % + :alt: eventula game addition from template second step + :align: center + + +You will get a success message / error message on the bottom of the page. + + .. note:: + The Game Templates are designed to not overwrite your already existing games. + If you removed or renamed some of the :ref:`admin/games/basic:GameCommands` or :ref:`admin/games/basic:GameCommandParameters` inside the game, they will be added to your existing game, if deployed again. + If you want to deploy an additional copy of the game, change the name of your existing game to something else than in the template and deploy it again. + + +Your Game should now appear in the ``Games`` Section of your admin menu, where you can edit the settings and :ref:`add gameservers` to it which you have to do, to fully use the available features. + + .. note:: + By default it is intended that the games public visibillity is disabled, but this is currently not working (https://github.com/Lan2Play/eventula-manager/issues/620) + +.. image:: ../../images/games_add_template_03.png + :scale: 50 % + :alt: eventula game addition from template second step + :align: center + + +Add Game Manually +.................. Lets create a game! go to your Admin Panel to the ``Games`` Section and you can add your game in the ``Add Game`` area. To use the basic features like manual tournaments you have to fill in a name and you can add a description, a version if you want to. Its recommended to add a ``Thumbnail Image`` and a ``Header Image``, they will be shown on the tournaments / matches. @@ -16,39 +61,32 @@ Its recommended to add a ``Thumbnail Image`` and a ``Header Image``, they will b .. image:: ../../images/games_add_01.png :scale: 50 % - :alt: eventula event deletion + :alt: eventula game addition first step :align: center -If you want to enable the possibilities to show the status of the later created gameservers on either the events page or the public page or you want to remotly control the gamservers via eventula you have to select a ``Game Commandhandler`` +If you want to enable the possibilities to show the status of the later created gameservers on either the events page or the public page or you want to remotly control the gamservers via eventula you have to select a :ref:`admin/games/basic:Game Commandhandler` -The currently available Commandhandlers are: - -- SourceQuery GoldSource (supported games: full support for all HL1/HL2 games and mods ) -- SourceQuery Source (supported games: CS:GO, Minecraft only commands | no status support) -- Maniaplanet XRPC (supported games: Trackmania nations, and all new maniaplanet games ) +You can find the available ones :ref:`here` .. image:: ../../images/games_add_02.png :scale: 50 % - :alt: eventula event deletion + :alt: eventula game addition second step :align: center -If you want to enable the possibilities to manage fully automated tournaments or fully automated matchmaking you have to set ``Game Match Api handler`` as well as the corresponding ``Game Commandhandler``. +If you want to enable the possibilities to manage fully automated tournaments or fully automated matchmaking you have to set :ref:`admin/games/basic:Game Match Api handler` as well as the corresponding :ref:`admin/games/basic:Game Commandhandler`. -The currently available APIhandlers are: - -- Get5 (supported games: CS:GO with the `Get5 Plugin from Splewis `_ and the `get5_eventula_apistats plugin `_) +You can find the available Game Match Api handlers ones :ref:`here` .. image:: ../../images/games_add_03.png :scale: 50 % - :alt: eventula event deletion + :alt: eventula game addition third step :align: center -For an explanation of the fields ``Connect Game URL``, ``Connect Game Command`` and ``Connect Stream URL`` take a look on the ``Frontend Gameserver Features`` section of the documentation. - -For a fully working example of the automated Tournament / Matchmaking take a look on the ``Tutorials`` section of the documentation. - +For an explanation of the fields ``Connect Game URL``, ``Connect Game Command`` and ``Connect Stream URL`` take a look on the :ref:`admin/games/basic:Frontend Gameserver Features` section of the documentation. + .. note:: + For fully configured examples of the automated Tournament / Matchmaking take a look on the :ref:`admin/games/basic:Add Game from Template` section. Press ``Submit`` to add the Category. @@ -62,18 +100,18 @@ To edit a game, go to your Admin Panel to the ``Games`` Section and klick on ``E .. image:: ../../images/games_edit_01.png :scale: 50 % - :alt: eventula event deletion + :alt: eventula game editing first step :align: center You will then be redirected to the detailed / editing /upload view of the game. -You can edit the games parameters in the ``Edit Game`` Section. Additionally to the parameters you had available in the Add Game step, you can set the public visibillity of a game (Currently not working!) and a ``Match start command`` that is needed for the automatic tournament / matchmaking (see the ``Add Game`` section of the documentation or for a fully working example of the automated Tournament / Matchmaking take a look on the ``Tutorials`` section of the documentation.) +You can edit the games parameters in the ``Edit Game`` Section. Additionally to the parameters you had available in the Add Game step, you can set the public visibillity of a game (Currently not working!) and a ``Match start command`` that is needed for the automatic tournament / matchmaking (see the :ref:`admin/games/basic:Add Game Manually` section of the documentation or for a fully working example of the automated Tournament / Matchmaking take a look on the :ref:`admin/games/basic:Add Game from Template` section of the documentation.) -For an explanation of the fields ``Connect Game URL``, ``Connect Game Command`` and ``Connect Stream URL`` take a look on the ``Frontend Gameserver Features`` section of the documentation. +For an explanation of the fields ``Connect Game URL``, ``Connect Game Command`` and ``Connect Stream URL`` take a look on the :ref:`admin/games/basic:Frontend Gameserver Features` section of the documentation. The changes can be saved with a click on the ``Submit`` Button in the ``Edit Game`` Section. -In the bottom you can now add Game Servers to the game. Please look into the following ``Gameservers`` section of the documentation. +In the bottom you can now add Game Servers to the game. Please look into the following :ref:`admin/games/basic:Gameservers` section of the documentation. Gameservers ----------- @@ -86,7 +124,7 @@ In the bottom you can now add Game Servers to the game in the ``Add Game Server` .. image:: ../../images/games_gameserver_add_01.png :scale: 50 % - :alt: eventula event deletion + :alt: eventula gameserver addition first step :align: center - You have to specify at least the ``Name``, the ``Adress`` (or ip), the ``Type`` and the ``Game Port``. @@ -95,7 +133,7 @@ In the bottom you can now add Game Servers to the game in the ``Add Game Server` - If you select the ``Type`` ``Match`` and ``Server is Enabled`` the Server will be used for Matchmaking and tournaments if you enable it on the game itself. - If your Server needs a connection password, you can specify it in ``Game Password``. - Some games support streaming (like CS:GO). To enable your users to stream the game, you can enter the streaming port (eg. Sourcetv) in the ``Stream Port`` field. -- If you use a game with a supported Commandhandlers (See the ``Add Game`` section in the documentation), you should add the ``RCON Port`` (mostly same as the game port) and the ``RCON Password`` to enable status checking or (automatic) remote controlling of the Gameserver. +- If you use a game with a supported Commandhandlers (See the :ref:`admin/games/basic:Add Game Manually` section in the documentation), you should add the ``RCON Port`` (mostly same as the game port) and the ``RCON Password`` to enable status checking or (automatic) remote controlling of the Gameserver. Edit Gameserver .................. @@ -108,14 +146,14 @@ The basic view of a Gameserver with no Commandhandler selected looks like this o .. image:: ../../images/games_gameserver_01.png :scale: 50 % - :alt: eventula event deletion + :alt: eventula gameserver view in the event live page :align: center and like this on the Homepage: .. image:: ../../images/games_gameserver_02.png :scale: 50 % - :alt: eventula event deletion + :alt: eventula gameserver view in the event Homepage :align: center @@ -148,31 +186,31 @@ If you set everything, your Server looks like this in the event live view: .. image:: ../../images/games_gameserver_03.png :scale: 50 % - :alt: eventula event deletion + :alt: eventula gameserver view in the event live page :align: center And like this on your Homepage: .. image:: ../../images/games_gameserver_04.png :scale: 50 % - :alt: eventula event deletion + :alt: eventula gameserver view in the homepage :align: center if you set the ``Commandhandler`` and the ``RCON password`` and the ``RCON Port`` on your game the status of your Server is shown in both views and in the Admin Area: .. image:: ../../images/games_gameserver_06.png :scale: 50 % - :alt: eventula event deletion + :alt: eventula gameserver statistics :align: center .. image:: ../../images/games_gameserver_05.png :scale: 50 % - :alt: eventula event deletion + :alt: eventula gameserver statistics :align: center .. image:: ../../images/games_gameserver_07.png :scale: 50 % - :alt: eventula event deletion + :alt: eventula gameserver statistics :align: center @@ -184,3 +222,25 @@ GameCommands GameCommandParameters --------------------- + + +Details +--------------------- + +Game Commandhandler +.................................... + +The currently available Commandhandlers are: + +- SourceQuery GoldSource (supported games: full support for all HL1/HL2 games and mods ) +- SourceQuery Source (supported games: CS:GO, Minecraft only commands | no status support) +- Maniaplanet XRPC (supported games: Trackmania nations, and all new maniaplanet games ) + + +Game Match Api handler +.................................... + +The currently available APIhandlers are: + +- Get5 (supported games: CS:GO with the `Get5 Plugin from Splewis `_ and the `get5_eventula_apistats plugin `_) +- PugSharp (supported games: CS2 with the `PugSharp Plugin `_) \ No newline at end of file diff --git a/docs/source/images/games_add_template_01.png b/docs/source/images/games_add_template_01.png new file mode 100644 index 0000000000000000000000000000000000000000..aedb73c417a5fe878749a37c18b28a0ab6ee375f GIT binary patch literal 6590 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 literal 0 HcmV?d00001 diff --git a/docs/source/images/games_add_template_02.png b/docs/source/images/games_add_template_02.png new file mode 100644 index 0000000000000000000000000000000000000000..4efa8a688d72fc33ab0f28f3b3bc8801b8092e74 GIT binary patch literal 44354 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 Date: Sun, 19 Nov 2023 02:28:19 +0100 Subject: [PATCH 02/15] fixed demo deltion manually and withhin tournament/matchmaking --- Makefile | 8 + src/app/EventTournament.php | 23 +- .../Admin/MatchMakingController.php | 14 +- .../Admin/MatchReplayController.php | 17 +- .../Controllers/MatchMakingController.php | 329 +++++++----------- src/app/MatchReplay.php | 26 ++ .../seeders/TestCs2MatchMakingSeeder.php | 114 ++++++ .../seeders/TestTournamentDemoSeeder.php | 57 +++ src/lang/de/matchmaking.php | 2 + src/lang/en/matchmaking.php | 2 + .../_partials/_tournaments/brackets.blade.php | 1 + 11 files changed, 374 insertions(+), 219 deletions(-) create mode 100644 src/database/seeders/TestCs2MatchMakingSeeder.php create mode 100644 src/database/seeders/TestTournamentDemoSeeder.php diff --git a/Makefile b/Makefile index fae6ecd57..1e769b042 100755 --- a/Makefile +++ b/Makefile @@ -178,6 +178,14 @@ generate-testuser: generate-event: docker exec eventula_manager_app php artisan db:seed --class=EventsSeeder +# Generate test cs2 matchmaking match with a demo - This will generate a sample cs2 matchmaking match with a demo (needs the generate-games command before running)! example: make generate-cs2mm playeroneid=useridhere playertwoid=useridhere democount=democounthere status=statushere +generate-cs2mm: + docker exec -e playeroneid=$(playeroneid) -e playertwoid=$(playertwoid) -e democount=$(democount) -e status=$(status) eventula_manager_app php artisan db:seed --class=TestCs2MatchMakingSeeder + +# Generate demo(s) into existing challonge matches (needs the generate-games command before running)! example: make generate-demos-tournament democount=democounthere challongematchid=challongematchidhere +generate-demos-tournament: + docker exec -e democount=$(democount) -e challongematchid=$(challongematchid) eventula_manager_app php artisan db:seed --class=TestTournamentDemoSeeder + # Generate event - This will generate a sample event! generate-games: docker exec eventula_manager_app php artisan db:seed --class=GamesTableSeeder diff --git a/src/app/EventTournament.php b/src/app/EventTournament.php index 40a05775b..a43080b2d 100644 --- a/src/app/EventTournament.php +++ b/src/app/EventTournament.php @@ -253,6 +253,14 @@ public static function boot() } } + foreach ($matches as $key => $match) { + $replays = MatchReplay::where('challonge_match_id', $match->id)->get(); + foreach ($replays as $matchReplay) { + $matchReplay->deleteReplayFile($model->game); + $matchReplay->delete(); + } + } + $response = retry(5, function () use ($challonge, $model) { return $challonge->fetchTournament($model->challonge_tournament_id); }, 100); @@ -514,7 +522,7 @@ public function getMatch(int $challongeMatchId, $obj = false) * @return Array|Object */ public function getMatchReplays(int $challongeMatchId, $obj = false) - { + { return MatchReplay::where('challonge_match_id', $challongeMatchId)->get(); } @@ -644,8 +652,7 @@ public function getNextMatches($limit = 0, $obj = false) */ public function updateMatch($matchId, $player1Score, $player2Score, $playerWinnerVerify = null) { - if ($player1Score == 0 && $player2Score == 0) - { + if ($player1Score == 0 && $player2Score == 0) { return false; } @@ -685,16 +692,12 @@ public function updateMatch($matchId, $player1Score, $player2Score, $playerWinne $this->getStandings(); # queue next matches - if (isset($this->game) && $this->match_autostart) - { - + if (isset($this->game) && $this->match_autostart) { $nextmatches = $this->getNextMatches(); - - foreach ($nextmatches as $nextmatch) - { + foreach ($nextmatches as $nextmatch) { $matchserver = EventTournamentMatchServer::getTournamentMatchServer($nextmatch->id); if (!isset($matchserver)) { - GameServerAsign::dispatch(null,$this,$nextmatch->id)->onQueue('gameserver'); + GameServerAsign::dispatch(null, $this, $nextmatch->id)->onQueue('gameserver'); } } } diff --git a/src/app/Http/Controllers/Admin/MatchMakingController.php b/src/app/Http/Controllers/Admin/MatchMakingController.php index 41259c05d..2d9445545 100644 --- a/src/app/Http/Controllers/Admin/MatchMakingController.php +++ b/src/app/Http/Controllers/Admin/MatchMakingController.php @@ -607,7 +607,19 @@ public function deleteuserfrommatch(MatchMaking $match, MatchMakingTeam $team, M */ public function destroy(MatchMaking $match) { - + foreach ($match->matchReplays as $matchReplay) + { + if(!$matchReplay->deleteReplayFile()) + { + Session::flash('alert-danger', 'Cannot delete Replay files!'); + return Redirect::back(); + } + if(!$matchReplay->delete()) + { + Session::flash('alert-danger', 'Cannot delete Replays!'); + return Redirect::back(); + } + } if (!$match->players()->delete()) { Session::flash('alert-danger', 'Cannot delete Players!'); return Redirect::back(); diff --git a/src/app/Http/Controllers/Admin/MatchReplayController.php b/src/app/Http/Controllers/Admin/MatchReplayController.php index e3e2205a4..07db1b69b 100644 --- a/src/app/Http/Controllers/Admin/MatchReplayController.php +++ b/src/app/Http/Controllers/Admin/MatchReplayController.php @@ -2,6 +2,7 @@ namespace App\Http\Controllers\Admin; +use App\Game; use DB; use Auth; use Session; @@ -24,8 +25,22 @@ class MatchReplayController extends Controller * @param MatchReplay $matchReplay * @return Redirect */ - public function destroy(MatchReplay $matchReplay) + public function destroy(Request $request, MatchReplay $matchReplay) { + if (isset($request->game) && intval($request->game) > 0) + { + if (!$matchReplay->deleteReplayFile(Game::where('id', intval($request->game))->first())) { + Session::flash('alert-danger', 'Cannot delete matchReplay file!'); + return Redirect::back(); + } + } + else + { + if (!$matchReplay->deleteReplayFile()) { + Session::flash('alert-danger', 'Cannot delete matchReplay file!'); + return Redirect::back(); + } + } if (!$matchReplay->delete()) { Session::flash('alert-danger', 'Cannot delete matchReplay!'); return Redirect::back(); diff --git a/src/app/Http/Controllers/MatchMakingController.php b/src/app/Http/Controllers/MatchMakingController.php index 34171e45a..3a538e72a 100644 --- a/src/app/Http/Controllers/MatchMakingController.php +++ b/src/app/Http/Controllers/MatchMakingController.php @@ -48,10 +48,8 @@ public function index() $memberedteams = Auth::user()->matchMakingTeams()->orderByDesc('created_at')->paginate(4, ['*'], 'memberedmatches')->fragment('memberedmatches'); $currentuseropenlivependingdraftmatches = array(); - foreach (MatchMaking::where(['status' => 'OPEN'])->orWhere(['status' => 'LIVE'])->orWhere(['status' => 'DRAFT'])->orWhere(['status' => 'PENDING'])->get() as $match) - { - if ($match->getMatchTeamPlayer(Auth::id())) - { + foreach (MatchMaking::where(['status' => 'OPEN'])->orWhere(['status' => 'LIVE'])->orWhere(['status' => 'DRAFT'])->orWhere(['status' => 'PENDING'])->get() as $match) { + if ($match->getMatchTeamPlayer(Auth::id())) { $currentuseropenlivependingdraftmatches[$match->id] = $match->id; } } @@ -65,7 +63,7 @@ public function index() ->withisMatchMakingEnabled(Settings::isMatchMakingEnabled()); } - /** + /** * Show Matchmaking * @param MatchMaking $match * @param Request $request @@ -74,24 +72,18 @@ public function index() public function show(MatchMaking $match, Request $request) { $teamjoin = null; - if (isset($request)) - { - if (isset($request->teamjoin)) - { - if($match->teams->where("id",$request->teamjoin)->count() > 0) - { - $teamjoin = $match->teams->where("id",$request->teamjoin)->first(); + if (isset($request)) { + if (isset($request->teamjoin)) { + if ($match->teams->where("id", $request->teamjoin)->count() > 0) { + $teamjoin = $match->teams->where("id", $request->teamjoin)->first(); } } } $invite = null; - if (isset($request)) - { - if (isset($request->invite)) - { - if(MatchMaking::where("invite_tag", $request->invite)->count() > 0) - { + if (isset($request)) { + if (isset($request->invite)) { + if (MatchMaking::where("invite_tag", $request->invite)->count() > 0) { $invite = MatchMaking::where("invite_tag", $request->invite)->first(); } } @@ -103,7 +95,7 @@ public function show(MatchMaking $match, Request $request) - foreach($allusers as $user) { + foreach ($allusers as $user) { $selectallusers[$user->id] = $user->username; } @@ -111,19 +103,18 @@ public function show(MatchMaking $match, Request $request) - foreach($allusers as $user) { + foreach ($allusers as $user) { $alreadyjoined = false; - foreach ($match->teams as $team) - { - if (Arr::first($team->players, function($value, $key)use($user){return $value->user_id == $user->id;},false)) - { + foreach ($match->teams as $team) { + if (Arr::first($team->players, function ($value, $key) use ($user) { + return $value->user_id == $user->id; + }, false)) { $alreadyjoined = true; } } - if (!$alreadyjoined) - { + if (!$alreadyjoined) { $availableusers[$user->id] = $user->username; } } @@ -139,7 +130,6 @@ public function show(MatchMaking $match, Request $request) ->withUsers($selectallusers) ->withTeamJoin($teamjoin) ->withInvite($invite); - } /** @@ -163,21 +153,16 @@ public function store(Request $request) ]; $this->validate($request, $rules, $messages); - - $currentuseropenlivependingdraftmatches = array(); - foreach (MatchMaking::where(['status' => 'OPEN'])->orWhere(['status' => 'LIVE'])->orWhere(['status' => 'DRAFT'])->orWhere(['status' => 'PENDING'])->get() as $match) - { - if ($match->getMatchTeamPlayer(Auth::id())) - { + foreach (MatchMaking::where(['status' => 'OPEN'])->orWhere(['status' => 'LIVE'])->orWhere(['status' => 'DRAFT'])->orWhere(['status' => 'PENDING'])->get() as $match) { + if ($match->getMatchTeamPlayer(Auth::id())) { $currentuseropenlivependingdraftmatches[$match->id] = $match->id; } } - if (Settings::getSystemsMatchMakingMaxopenperuser() != 0 && count($currentuseropenlivependingdraftmatches) >= Settings::getSystemsMatchMakingMaxopenperuser()) - { + if (Settings::getSystemsMatchMakingMaxopenperuser() != 0 && count($currentuseropenlivependingdraftmatches) >= Settings::getSystemsMatchMakingMaxopenperuser()) { Session::flash('alert-danger', __('matchmaking.maxopened')); return Redirect::back(); } @@ -189,33 +174,25 @@ public function store(Request $request) if (Game::where('id', $request->game_id)->first()) { $tempgame = Game::where('id', $request->game_id)->first(); - if ($tempgame->gamematchapihandler != 0 && $tempgame->matchmaking_autoapi) - { - if (!Helpers::checkUserFields(User::where('id', '=', Auth::id())->first(),(new GameMatchApiHandler())->getGameMatchApiHandler($tempgame->gamematchapihandler)->getuserthirdpartyrequirements())) - { + if ($tempgame->gamematchapihandler != 0 && $tempgame->matchmaking_autoapi) { + if (!Helpers::checkUserFields(User::where('id', '=', Auth::id())->first(), (new GameMatchApiHandler())->getGameMatchApiHandler($tempgame->gamematchapihandler)->getuserthirdpartyrequirements())) { Session::flash('alert-danger', __('matchmaking.cannotcreatethirdparty')); return Redirect::back(); } - } $game_id = $request->game_id; - if ($tempgame->min_team_count > 0 && $tempgame->max_team_count > 0) - { + if ($tempgame->min_team_count > 0 && $tempgame->max_team_count > 0) { - if ($request->team_count < $tempgame->min_team_count) - { - Session::flash('alert-danger', __('matchmaking.teamcount_smallerthangamesmin').$tempgame->min_team_count); + if ($request->team_count < $tempgame->min_team_count) { + Session::flash('alert-danger', __('matchmaking.teamcount_smallerthangamesmin') . $tempgame->min_team_count); return Redirect::back(); } - if ($request->team_count > $tempgame->max_team_count) - { - Session::flash('alert-danger', __('matchmaking.teamcount_biggerthangamesmax').$tempgame->max_team_count); + if ($request->team_count > $tempgame->max_team_count) { + Session::flash('alert-danger', __('matchmaking.teamcount_biggerthangamesmax') . $tempgame->max_team_count); return Redirect::back(); } - - } } } @@ -239,18 +216,16 @@ public function store(Request $request) $team1->name = $request->team1name; $team1->team_owner_id = Auth::id(); $team1->team_invite_tag = "team_" . Str::random(); - $team1->match_id =$match->id; + $team1->match_id = $match->id; if (!$team1->save()) { if (!$match->delete()) { Session::flash('alert-danger', __('matchmaking.cannotcreatteambutcannotdeletematch')); return Redirect::back(); - } - else { + } else { Session::flash('alert-danger', __('matchmaking.cannotcreateteam1')); return Redirect::back(); } - } $teamplayerone = new MatchMakingTeamPlayer(); @@ -264,14 +239,12 @@ public function store(Request $request) if (!$team1->delete()) { Session::flash('alert-danger', __('matchmaking.cannotcreateteamplayer1butcannotdeleteteam')); return Redirect::back(); - } - else { + } else { if (!$match->delete()) { - Session::flash('alert-danger',__('matchmaking.cannotcreateteamplayer1butcannotdeletematch')); + Session::flash('alert-danger', __('matchmaking.cannotcreateteamplayer1butcannotdeletematch')); return Redirect::back(); - } - else { + } else { Session::flash('alert-danger', __('matchmaking.cannotcreateteamplayer1')); return Redirect::back(); } @@ -282,7 +255,7 @@ public function store(Request $request) return Redirect::back(); } - /** + /** * Store Match to Database * @param MatchMaking $match * @param Request $request @@ -293,8 +266,7 @@ public function update(MatchMaking $match, Request $request) $currentuser = Auth::id(); - if ($match->owner_id != $currentuser) - { + if ($match->owner_id != $currentuser) { Session::flash('alert-danger', __('matchmaking.cannotupdatematchnotowner')); return Redirect::back(); } @@ -313,8 +285,7 @@ public function update(MatchMaking $match, Request $request) $this->validate($request, $rules, $messages); - if ($match->status == "LIVE" || $match->status == "COMPLETE" || $match->status == 'WAITFORPLAYERS'|| $match->status == 'PENDING') - { + if ($match->status == "LIVE" || $match->status == "COMPLETE" || $match->status == 'WAITFORPLAYERS' || $match->status == 'PENDING') { Session::flash('alert-danger', __('matchmaking.cannotupdatematchstatus')); return Redirect::back(); } @@ -324,31 +295,24 @@ public function update(MatchMaking $match, Request $request) if (Game::where('id', $request->game_id)->first()) { $tempgame = Game::where('id', $request->game_id)->first(); $game_id = $request->game_id; - if ($tempgame->min_team_count > 0 && $tempgame->max_team_count > 0) - { + if ($tempgame->min_team_count > 0 && $tempgame->max_team_count > 0) { - if ($request->team_count < $tempgame->min_team_count) - { - Session::flash('alert-danger', __('matchmaking.teamcount_smallerthangamesmin').$tempgame->min_team_count); + if ($request->team_count < $tempgame->min_team_count) { + Session::flash('alert-danger', __('matchmaking.teamcount_smallerthangamesmin') . $tempgame->min_team_count); return Redirect::back(); } - if ($request->team_count > $tempgame->max_team_count) - { - Session::flash('alert-danger', __('matchmaking.teamcount_biggerthangamesmax').$tempgame->max_team_count); + if ($request->team_count > $tempgame->max_team_count) { + Session::flash('alert-danger', __('matchmaking.teamcount_biggerthangamesmax') . $tempgame->max_team_count); return Redirect::back(); } - - } } } - foreach ($match->teams as $team) - { - if ($team->players->count() > $request->team_size[0]) - { + foreach ($match->teams as $team) { + if ($team->players->count() > $request->team_size[0]) { Session::flash('alert-danger', __('matchmaking.tomanyplayersforteamsize')); return Redirect::back(); } @@ -367,7 +331,6 @@ public function update(MatchMaking $match, Request $request) Session::flash('alert-success', __('matchmaking.successfullyupdatedmatch')); return Redirect::back(); - } /** @@ -378,7 +341,7 @@ public function update(MatchMaking $match, Request $request) */ public function addteam(MatchMaking $match, Request $request) { - $rules = [ + $rules = [ 'teamname' => 'required', ]; $messages = [ @@ -387,34 +350,29 @@ public function addteam(MatchMaking $match, Request $request) ]; $this->validate($request, $rules, $messages); - if ($match->game->gamematchapihandler != 0 && $match->game->matchmaking_autoapi) - { - if (!Helpers::checkUserFields(User::where('id', '=', Auth::id())->first(),(new GameMatchApiHandler())->getGameMatchApiHandler($match->game->gamematchapihandler)->getuserthirdpartyrequirements())) - { + if ($match->game->gamematchapihandler != 0 && $match->game->matchmaking_autoapi) { + if (!Helpers::checkUserFields(User::where('id', '=', Auth::id())->first(), (new GameMatchApiHandler())->getGameMatchApiHandler($match->game->gamematchapihandler)->getuserthirdpartyrequirements())) { Session::flash('alert-danger', __('matchmaking.cannotjointhirdparty')); return Redirect::back(); } - } - if ($match->status == "LIVE" || $match->status == "COMPLETE" || $match->status == 'WAITFORPLAYERS'|| $match->status == 'PENDING') - { + if ($match->status == "LIVE" || $match->status == "COMPLETE" || $match->status == 'WAITFORPLAYERS' || $match->status == 'PENDING') { Session::flash('alert-danger', __('matchmaking.cannotaddteamstatus')); return Redirect::back(); } - if ($match->team_count != 0 && $match->team_count == $match->teams->count()) - { + if ($match->team_count != 0 && $match->team_count == $match->teams->count()) { Session::flash('alert-danger', __('matchmaking.cannotaddteamcount')); return Redirect::back(); } - foreach($match->teams as $team) - { - if (Arr::first($team->players, function($value, $key)use($request){return $value->user_id == Auth::id();},false)) - { + foreach ($match->teams as $team) { + if (Arr::first($team->players, function ($value, $key) use ($request) { + return $value->user_id == Auth::id(); + }, false)) { Session::flash('alert-danger', __('matchmaking.youalreadyareinateam')); return Redirect::back(); } @@ -454,7 +412,7 @@ public function addteam(MatchMaking $match, Request $request) */ public function updateteam(MatchMaking $match, MatchMakingTeam $team, Request $request) { - $rules = [ + $rules = [ 'editteamname' => 'required', ]; $messages = [ @@ -463,14 +421,12 @@ public function updateteam(MatchMaking $match, MatchMakingTeam $team, Request $ ]; $this->validate($request, $rules, $messages); - if ($team->team_owner_id != Auth::id() && $match->owner_id != Auth::id()) - { + if ($team->team_owner_id != Auth::id() && $match->owner_id != Auth::id()) { Session::flash('alert-danger', __('matchmaking.cannotupdateteamnotowner')); return Redirect::back(); } - if ($match->status == "LIVE" || $match->status == "COMPLETE" || $match->status == 'WAITFORPLAYERS'|| $match->status == 'PENDING') - { + if ($match->status == "LIVE" || $match->status == "COMPLETE" || $match->status == 'WAITFORPLAYERS' || $match->status == 'PENDING') { Session::flash('alert-danger', __('matchmaking.cannotupdateteamstatus')); return Redirect::back(); } @@ -499,13 +455,11 @@ public function updateteam(MatchMaking $match, MatchMakingTeam $team, Request $ */ public function deleteteam(MatchMaking $match, MatchMakingTeam $team, Request $request) { - if ($match->status == "LIVE" || $match->status == "COMPLETE" || $match->status == 'WAITFORPLAYERS'|| $match->status == 'PENDING') - { + if ($match->status == "LIVE" || $match->status == "COMPLETE" || $match->status == 'WAITFORPLAYERS' || $match->status == 'PENDING') { Session::flash('alert-danger', __('matchmaking.cannotdeleteteamstatus')); return Redirect::back(); } - if ($team-> id == $match->oldestTeam->id) - { + if ($team->id == $match->oldestTeam->id) { Session::flash('alert-danger', __('matchmaking.cannotdeleteinitialteam')); return Redirect::back(); } @@ -516,12 +470,10 @@ public function deleteteam(MatchMaking $match, MatchMakingTeam $team, Request $ if (!$team->delete()) { Session::flash('alert-danger', __('matchmaking.cannotdeleteteam')); return Redirect::back(); - } Session::flash('alert-success', __('matchmaking.deletedteam')); return Redirect::back(); - } /** @@ -533,27 +485,22 @@ public function deleteteam(MatchMaking $match, MatchMakingTeam $team, Request $ */ public function addusertomatch(MatchMaking $match, MatchMakingTeam $team, Request $request) { - if ($match->status == "LIVE" || $match->status == "COMPLETE" || $match->status == 'WAITFORPLAYERS'|| $match->status == 'PENDING') - { + if ($match->status == "LIVE" || $match->status == "COMPLETE" || $match->status == 'WAITFORPLAYERS' || $match->status == 'PENDING') { Session::flash('alert-danger', __('matchmaking.cannnotjoinstatus')); return Redirect::back(); } - if ($team->players->count() >= $match->team_size) - { + if ($team->players->count() >= $match->team_size) { Session::flash('alert-danger', __('matchmaking.cannotjoinalreadyfull')); return Redirect::back(); } - if ($match->game->gamematchapihandler != 0 && $match->game->matchmaking_autoapi) - { - if (!Helpers::checkUserFields(User::where('id', '=', Auth::id())->first(),(new GameMatchApiHandler())->getGameMatchApiHandler($match->game->gamematchapihandler)->getuserthirdpartyrequirements())) - { + if ($match->game->gamematchapihandler != 0 && $match->game->matchmaking_autoapi) { + if (!Helpers::checkUserFields(User::where('id', '=', Auth::id())->first(), (new GameMatchApiHandler())->getGameMatchApiHandler($match->game->gamematchapihandler)->getuserthirdpartyrequirements())) { Session::flash('alert-danger', __('matchmaking.cannotjointhirdparty')); return Redirect::back(); } - } @@ -566,7 +513,7 @@ public function addusertomatch(MatchMaking $match, MatchMakingTeam $team, Reques } Session::flash('alert-success', __('matchmaking.successfiullyaddedteamplayer')); - return Redirect::to('/matchmaking/'. $match->id); + return Redirect::to('/matchmaking/' . $match->id); } /** @@ -578,8 +525,7 @@ public function addusertomatch(MatchMaking $match, MatchMakingTeam $team, Reques public function deleteuserfrommatch(MatchMaking $match, MatchMakingTeam $team, MatchMakingTeamPlayer $teamplayer, Request $request) { - if ($match->status == "LIVE" || $match->status == "COMPLETE" || $match->status == 'WAITFORPLAYERS'|| $match->status == 'PENDING') - { + if ($match->status == "LIVE" || $match->status == "COMPLETE" || $match->status == 'WAITFORPLAYERS' || $match->status == 'PENDING') { Session::flash('alert-danger', __('matchmaking.cannotleavestatus')); return Redirect::back(); } @@ -593,12 +539,8 @@ public function deleteuserfrommatch(MatchMaking $match, MatchMakingTeam $team, M - Session::flash('alert-success', __('matchmaking.successfullydeletedteamplayer')); - return Redirect::back(); - - - - + Session::flash('alert-success', __('matchmaking.successfullydeletedteamplayer')); + return Redirect::back(); } @@ -611,8 +553,7 @@ public function deleteuserfrommatch(MatchMaking $match, MatchMakingTeam $team, M public function changeuserteam(MatchMaking $match, MatchMakingTeam $team, MatchMakingTeamPlayer $teamplayer, Request $request) { - if ($match->status == "LIVE" || $match->status == "COMPLETE" || $match->status == 'WAITFORPLAYERS'|| $match->status == 'PENDING') - { + if ($match->status == "LIVE" || $match->status == "COMPLETE" || $match->status == 'WAITFORPLAYERS' || $match->status == 'PENDING') { Session::flash('alert-danger', __('matchmaking.cannotleavestatus')); return Redirect::back(); } @@ -633,10 +574,8 @@ public function changeuserteam(MatchMaking $match, MatchMakingTeam $team, MatchM return Redirect::back(); } - Session::flash('alert-success', __('matchmaking.successfullychangedteamplayer')); - return Redirect::back(); - - + Session::flash('alert-success', __('matchmaking.successfullychangedteamplayer')); + return Redirect::back(); } @@ -650,8 +589,7 @@ public function destroy(MatchMaking $match) { $currentuser = Auth::id(); - if ($match->owner_id != $currentuser) - { + if ($match->owner_id != $currentuser) { Session::flash('alert-danger', __('matchmaking.cannotdeletematchnotowner')); return Redirect::back(); } @@ -666,6 +604,18 @@ public function destroy(MatchMaking $match) Session::flash('alert-danger', __('matchmaking.cannotdeleteteams')); return Redirect::back(); } + + foreach ($match->matchReplays as $matchReplay) { + if (!$matchReplay->deleteReplayFile()) { + Session::flash('alert-danger', __('matchmaking.cannotdeletereplayfiles')); + return Redirect::back(); + } + if (!$matchReplay->delete()) { + Session::flash('alert-danger', __('matchmaking.cannotdeletereplays')); + return Redirect::back(); + } + } + if (!$match->delete()) { Session::flash('alert-danger', __('matchmaking.cannotdeletematch')); return Redirect::back(); @@ -684,67 +634,57 @@ public function start(MatchMaking $match) { $currentuser = Auth::id(); - if ($match->owner_id != $currentuser) - { + if ($match->owner_id != $currentuser) { Session::flash('alert-danger', __('matchmaking.cannotstartmatchnotowner')); return Redirect::back(); } - if ($match->status == 'LIVE' || $match->status == 'COMPLETED' || $match->status == 'WAITFORPLAYERS'|| $match->status == 'PENDING') { + if ($match->status == 'LIVE' || $match->status == 'COMPLETED' || $match->status == 'WAITFORPLAYERS' || $match->status == 'PENDING') { Session::flash('alert-danger', __('matchmaking.matchalreadystartedorcompleted')); return Redirect::back(); } - if ($match->teams->count() < $match->team_count) - { + if ($match->teams->count() < $match->team_count) { Session::flash('alert-danger', __('matchmaking.notallrequiredteamsarethere')); return Redirect::back(); } - foreach ($match->teams as $team) - { - if ($team->players->count() != $match->team_size) - { + foreach ($match->teams as $team) { + if ($team->players->count() != $match->team_size) { Session::flash('alert-danger', __('matchmaking.notenoughplayerstostart')); return Redirect::back(); } } - if(isset($match->game) && $match->game->matchmaking_autostart) - { - GameServerAsign::dispatch($match,null,null)->onQueue('gameserver'); - + if (isset($match->game) && $match->game->matchmaking_autostart) { + GameServerAsign::dispatch($match, null, null)->onQueue('gameserver'); - if (isset($match->game) && $match->game->matchmaking_autoapi) - { - if (!$match->setStatus('WAITFORPLAYERS')) { - Session::flash('alert-danger', __('matchmaking.cannotstartmatch')); - return Redirect::back(); - } - Session::flash('alert-success', __('matchmaking.matchstarted')); + if (isset($match->game) && $match->game->matchmaking_autoapi) { + if (!$match->setStatus('WAITFORPLAYERS')) { + Session::flash('alert-danger', __('matchmaking.cannotstartmatch')); return Redirect::back(); } - else - { - if (!$match->setStatus('LIVE')) { - Session::flash('alert-danger', __('matchmaking.cannotstartmatch')); - return Redirect::back(); - } - Session::flash('alert-success', __('matchmaking.matchstarted')); + Session::flash('alert-success', __('matchmaking.matchstarted')); + return Redirect::back(); + } else { + if (!$match->setStatus('LIVE')) { + Session::flash('alert-danger', __('matchmaking.cannotstartmatch')); return Redirect::back(); } + Session::flash('alert-success', __('matchmaking.matchstarted')); + return Redirect::back(); + } + if (!$match->setStatus('LIVE')) { Session::flash('alert-danger', __('matchmaking.cannotstartmatch')); return Redirect::back(); } Session::flash('alert-success', __('matchmaking.matchstarted')); return Redirect::back(); - } - else - { + } else { if (!$match->setStatus('PENDING')) { Session::flash('alert-danger', __('matchmaking.cannotstartmatch')); return Redirect::back(); @@ -764,10 +704,10 @@ public function scramble(MatchMaking $match) $players = $match->players; $players = $players->shuffle(); - $teamSize = intval ($match->team_size); + $teamSize = intval($match->team_size); $teams = $players->chunk($teamSize); - foreach($teams as $key=>$team) { + foreach ($teams as $key => $team) { $teamToUpdate = $match->teams[$key]; // After scrambling there is no team owner available. $teamToUpdate->team_owner_id = null; @@ -776,7 +716,7 @@ public function scramble(MatchMaking $match) return Redirect::back(); } - foreach($team as $teamPlayer) { + foreach ($team as $teamPlayer) { $teamPlayer->matchmaking_team_id = $teamToUpdate->id; if (!$teamPlayer->save()) { Session::flash('alert-danger', "Couldn´t add a player to Team " . ($key + 1)); @@ -797,13 +737,12 @@ public function open(MatchMaking $match) { $currentuser = Auth::id(); - if ($match->owner_id != $currentuser) - { + if ($match->owner_id != $currentuser) { Session::flash('alert-danger', __('matchmaking.cannotopenmatchnotowner')); return Redirect::back(); } - if ($match->status == 'OPEN' || $match->status == 'LIVE' || $match->status == 'COMPLETED' || $match->status == 'WAITFORPLAYERS'|| $match->status == 'PENDING') { + if ($match->status == 'OPEN' || $match->status == 'LIVE' || $match->status == 'COMPLETED' || $match->status == 'WAITFORPLAYERS' || $match->status == 'PENDING') { Session::flash('alert-danger', __('matchmaking.matchalreadyopenliveorcompleted')); return Redirect::back(); } @@ -828,64 +767,49 @@ public function finalize(MatchMaking $match, Request $request) { $currentuser = Auth::id(); - if ($match->owner_id != $currentuser) - { + if ($match->owner_id != $currentuser) { Session::flash('alert-danger', __('matchmaking.cannotfinalizenotowner')); return Redirect::back(); } - foreach ($match->teams as $team) - { + foreach ($match->teams as $team) { $teamvalue = null; - foreach($request->all() as $key => $value) { + foreach ($request->all() as $key => $value) { - if(Str::startsWith($key, 'teamscore_') && Str::of($key)->endsWith($team->id)) - { + if (Str::startsWith($key, 'teamscore_') && Str::of($key)->endsWith($team->id)) { - if (is_numeric($value)) - { + if (is_numeric($value)) { $teamvalue = $value; } - } - } - if ($teamvalue == null) - { + if ($teamvalue == null) { Session::flash('alert-danger', __('matchmaking.missingscoreforteam')); return Redirect::back(); } } - foreach ($match->teams as $team) - { - foreach($request->all() as $key => $value) { + foreach ($match->teams as $team) { + foreach ($request->all() as $key => $value) { - if(Str::startsWith($key, 'teamscore_') && Str::of($key)->endsWith($team->id)) - { + if (Str::startsWith($key, 'teamscore_') && Str::of($key)->endsWith($team->id)) { $team->team_score = $value; if (!$team->save()) { Session::flash('alert-danger', __('matchmaking.scorecouldnotbesetted')); return Redirect::back(); } - - } - } - - } if (!$match->setStatus('COMPLETE')) { Session::flash('alert-danger', __('matchmaking.cannotfinalize')); return Redirect::back(); - } - - if(isset($match->matchMakingServer)) - { + } + + if (isset($match->matchMakingServer)) { if (!$match->matchMakingServer->delete()) { Session::flash('alert-danger', __('matchmaking.cannotdeletemmserver')); return Redirect::back(); @@ -911,27 +835,18 @@ public function showInvite(Request $request) $teaminvite = MatchMakingTeam::where("team_invite_tag", $request->url)->first(); $matchinvite = MatchMaking::where("invite_tag", $request->url)->first(); - if (isset ($teaminvite) && $teaminvite->count() > 0) - { - return Redirect::to('/matchmaking/'. $teaminvite->match->id . "/?teamjoin=" . $teaminvite->id); + if (isset($teaminvite) && $teaminvite->count() > 0) { + return Redirect::to('/matchmaking/' . $teaminvite->match->id . "/?teamjoin=" . $teaminvite->id); } - if (isset ($matchinvite) && $matchinvite->count() > 0) - { - return Redirect::to('/matchmaking/'. $matchinvite->id . "/?invite=" . $matchinvite->invite_tag); + if (isset($matchinvite) && $matchinvite->count() > 0) { + return Redirect::to('/matchmaking/' . $matchinvite->id . "/?invite=" . $matchinvite->invite_tag); } - if (!isset ($matchinvite) || isset ($teaminvite) || ($teaminvite->count() == 0 && $matchinvite->count() == 0) ) - { + if (!isset($matchinvite) || isset($teaminvite) || ($teaminvite->count() == 0 && $matchinvite->count() == 0)) { $request->session()->flash('alert-danger', __('matchmaking.invitationnotfound')); return Redirect::to('/'); } - - - } $request->session()->flash('alert-danger', __('matchmaking.pleaselogin')); return Redirect::to('login'); } - - - } diff --git a/src/app/MatchReplay.php b/src/app/MatchReplay.php index 21047dbf9..b3ca3e771 100644 --- a/src/app/MatchReplay.php +++ b/src/app/MatchReplay.php @@ -90,4 +90,30 @@ public static function getReplaySize(Game $game,$demoname) return Helpers::bytesToHuman(Storage::disk('public')->size(MatchReplay::getReplayPath($game, $demoname))); } + public function deleteReplayFile(?Game $game = null) + { + if(isset($this->matchMakingMatch)) + { + if(!Storage::disk('public')->delete(MatchReplay::getReplayPath($this->matchMakingMatch->game, $this->name))) + { + return false; + } + return true; + } + else + { + if (!isset($game)) + { + return false; + } + if(!Storage::disk('public')->delete(MatchReplay::getReplayPath($game, $this->name))) + { + return false; + } + return true; + } + + } + + } diff --git a/src/database/seeders/TestCs2MatchMakingSeeder.php b/src/database/seeders/TestCs2MatchMakingSeeder.php new file mode 100644 index 000000000..a3eaafbb5 --- /dev/null +++ b/src/database/seeders/TestCs2MatchMakingSeeder.php @@ -0,0 +1,114 @@ + Game::where('name', 'Counter-Strike 2')->first()->id, + 'team_size' => 1, + 'team_count' => 2, + 'status' => $status, + 'owner_id' => $playeroneid, + 'invite_tag' => "match_" . Str::random(), + 'ispublic' => true, + ] + ); + if (!$mm->save()) { + throw new \Exception("could not save matchmaking"); + } + + $team1 = new MatchMakingTeam(); + $team1->name = "team1"; + $team1->team_owner_id = $playeroneid; + $team1->team_invite_tag = "team_" . Str::random(); + $team1->match_id = $mm->id; + if (!$team1->save()) { + + throw new \Exception("could not save team1"); + } + + $teamplayerone = new MatchMakingTeamPlayer(); + $teamplayerone->matchmaking_team_id = $team1->id; + $teamplayerone->user_id = $playeroneid; + if (!$teamplayerone->save()) { + + throw new \Exception("could not save teamplayerone"); + } + + + $team2 = new MatchMakingTeam(); + $team2->name = "team2"; + $team2->team_owner_id = $playertwoid; + $team2->team_invite_tag = "team_" . Str::random(); + $team2->match_id = $mm->id; + if (!$team2->save()) { + + throw new \Exception("could not save team2"); + } + + $teamplayertwo = new MatchMakingTeamPlayer(); + $teamplayertwo->matchmaking_team_id = $team2->id; + $teamplayertwo->user_id = $playertwoid; + if (!$teamplayertwo->save()) { + + throw new \Exception("could not save teamplayertwo"); + } + + + for ($i = 1; $i <= $democount; $i++) { + + $demoname = "demo_" . strval($mm->id) . "_" . strval($i) . ".demo"; + + $destinationPathDemo = MatchReplay::createReplayPath(Game::where('name', 'Counter-Strike 2')->first(), $demoname); + + if (Storage::disk('public')->put($destinationPathDemo, random_bytes(2048)) == false) { + throw new \Exception("could not save demo file"); + } + + $replay = new MatchReplay(); + $replay->name = $demoname; + $replay->matchmaking_id = $mm->id; + if (!$replay->save()) { + throw new \Exception("could not save demo"); + } + } + } +} diff --git a/src/database/seeders/TestTournamentDemoSeeder.php b/src/database/seeders/TestTournamentDemoSeeder.php new file mode 100644 index 000000000..2a80105c1 --- /dev/null +++ b/src/database/seeders/TestTournamentDemoSeeder.php @@ -0,0 +1,57 @@ +first(), $demoname); + + if (Storage::disk('public')->put($destinationPathDemo, random_bytes(2048)) == false) { + throw new \Exception("could not save demo file"); + } + + $replay = new MatchReplay(); + $replay->name = $demoname; + $replay->challonge_match_id = $challongematchid; + if (!$replay->save()) { + throw new \Exception("could not save demo"); + } + } + } +} diff --git a/src/lang/de/matchmaking.php b/src/lang/de/matchmaking.php index 2aa4c945d..707e3f852 100644 --- a/src/lang/de/matchmaking.php +++ b/src/lang/de/matchmaking.php @@ -109,6 +109,8 @@ 'cannotdeletematchnotowner' => 'Du kannst das Match nicht löschen da du nicht der Eigentümer bist!', 'cannotdeleteplayers' => 'Teamplayer konnten nicht gelöscht werden!', 'cannotdeleteteams' => 'Teams konnten nicht gelöscht werden!', + 'cannotdeletereplays' => 'Repalys konnten nicht gelöscht werden!', + 'cannotdeletereplayfiles' => 'Repaly Dateien konnten nicht gelöscht werden!', 'cannotdeletematch' => 'Match konnte nicht gelöscht werden!', 'successfullydeletedmatch' => 'Das Match wurde erfolgreich gelöscht!', 'cannotstartmatchnotowner' => 'Du kannst das Match nicht starten da du nicht der Eigentümer bist!', diff --git a/src/lang/en/matchmaking.php b/src/lang/en/matchmaking.php index 64b984e58..2726d6248 100644 --- a/src/lang/en/matchmaking.php +++ b/src/lang/en/matchmaking.php @@ -113,6 +113,8 @@ 'cannotdeletematchnotowner' => 'Cannot delete Match because you are not the owner!', 'cannotdeleteplayers' => 'Cannot delete Players!', 'cannotdeleteteams' => 'Cannot delete Teams!', + 'cannotdeletereplays' => 'Cannot delete Replays!', + 'cannotdeletereplayfiles' => 'Cannot delete Replay files!', 'cannotdeletematch' => 'Cannot delete Match!', 'successfullydeletedmatch' => 'Successfully deleted Match!', 'cannotstartmatchnotowner' => 'Cannot start Match because you are not the owner!', diff --git a/src/resources/views/layouts/_partials/_tournaments/brackets.blade.php b/src/resources/views/layouts/_partials/_tournaments/brackets.blade.php index 19ba5090b..aeb07e0df 100644 --- a/src/resources/views/layouts/_partials/_tournaments/brackets.blade.php +++ b/src/resources/views/layouts/_partials/_tournaments/brackets.blade.php @@ -348,6 +348,7 @@ class="btn btn-sm @if (isset($tournament->match_autoapi) && $tournament->match_a {{ Form::open(array('url'=>'/admin/replays/'. $matchReplay->id , 'onsubmit' => 'return ConfirmDelete()')) }} {{ Form::hidden('_method', 'DELETE') }} + {{ Form::hidden('game', $tournament->game->id) }} {{ Form::close() }} From 62613ec06c44bd407cf36549837c171d4078131c Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 19 Nov 2023 09:54:58 +0000 Subject: [PATCH 03/15] Update dependency doctrine/dbal to v3.7.2 --- src/composer.json | 2 +- src/composer.lock | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/composer.json b/src/composer.json index 404febef9..0b1d82d4b 100644 --- a/src/composer.json +++ b/src/composer.json @@ -30,7 +30,7 @@ "invisnik/laravel-steam-auth": "dev-l10-compatibility", "laravel/socialite": "5.10.0", "ignited/laravel-omnipay": "3.5.0", - "doctrine/dbal": "3.7.1", + "doctrine/dbal": "3.7.2", "simplesoftwareio/simple-qrcode": "4.2.0", "guzzlehttp/guzzle": "7.8.0", "php-http/guzzle7-adapter": "1.0.0", diff --git a/src/composer.lock b/src/composer.lock index 3e2a26fc2..1d9599238 100644 --- a/src/composer.lock +++ b/src/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "682ad2190358912b9fa7c79136c92785", + "content-hash": "359cada305165302b52bbdf05bb88dc9", "packages": [ { "name": "artesaos/seotools", @@ -703,16 +703,16 @@ }, { "name": "doctrine/dbal", - "version": "3.7.1", + "version": "3.7.2", "source": { "type": "git", "url": "https://github.com/doctrine/dbal.git", - "reference": "5b7bd66c9ff58c04c5474ab85edce442f8081cb2" + "reference": "0ac3c270590e54910715e9a1a044cc368df282b2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/5b7bd66c9ff58c04c5474ab85edce442f8081cb2", - "reference": "5b7bd66c9ff58c04c5474ab85edce442f8081cb2", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/0ac3c270590e54910715e9a1a044cc368df282b2", + "reference": "0ac3c270590e54910715e9a1a044cc368df282b2", "shasum": "" }, "require": { @@ -728,7 +728,7 @@ "doctrine/coding-standard": "12.0.0", "fig/log-test": "^1", "jetbrains/phpstorm-stubs": "2023.1", - "phpstan/phpstan": "1.10.35", + "phpstan/phpstan": "1.10.42", "phpstan/phpstan-strict-rules": "^1.5", "phpunit/phpunit": "9.6.13", "psalm/plugin-phpunit": "0.18.4", @@ -796,7 +796,7 @@ ], "support": { "issues": "https://github.com/doctrine/dbal/issues", - "source": "https://github.com/doctrine/dbal/tree/3.7.1" + "source": "https://github.com/doctrine/dbal/tree/3.7.2" }, "funding": [ { @@ -812,7 +812,7 @@ "type": "tidelift" } ], - "time": "2023-10-06T05:06:20+00:00" + "time": "2023-11-19T08:06:58+00:00" }, { "name": "doctrine/deprecations", From e40ec31f5abce0a599b8b00c7012c1891e648d44 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 21 Nov 2023 16:35:11 +0000 Subject: [PATCH 04/15] Update dependency laravel/framework to v10.33.0 --- src/composer.json | 2 +- src/composer.lock | 80 +++++++++++++++++++++++------------------------ 2 files changed, 41 insertions(+), 41 deletions(-) diff --git a/src/composer.json b/src/composer.json index 0b1d82d4b..fded2eacd 100644 --- a/src/composer.json +++ b/src/composer.json @@ -23,7 +23,7 @@ "type": "project", "require": { "php": "8.2.*", - "laravel/framework": "10.32.1", + "laravel/framework": "10.33.0", "laravelcollective/html": "6.4.1", "laravel/legacy-factories": "1.3.2", "webonyx/graphql-php": "15.8.0", diff --git a/src/composer.lock b/src/composer.lock index 1d9599238..8796d2afa 100644 --- a/src/composer.lock +++ b/src/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "359cada305165302b52bbdf05bb88dc9", + "content-hash": "9ed536dc627dc76f47ce75c85d0c0a3f", "packages": [ { "name": "artesaos/seotools", @@ -2226,16 +2226,16 @@ }, { "name": "laravel/framework", - "version": "v10.32.1", + "version": "v10.33.0", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "b30e44f20d244f7ba125283e14a8bbac167f4e5b" + "reference": "4536872e3e5b6be51b1f655dafd12c9a4fa0cfe8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/b30e44f20d244f7ba125283e14a8bbac167f4e5b", - "reference": "b30e44f20d244f7ba125283e14a8bbac167f4e5b", + "url": "https://api.github.com/repos/laravel/framework/zipball/4536872e3e5b6be51b1f655dafd12c9a4fa0cfe8", + "reference": "4536872e3e5b6be51b1f655dafd12c9a4fa0cfe8", "shasum": "" }, "require": { @@ -2424,7 +2424,7 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2023-11-14T22:57:08+00:00" + "time": "2023-11-21T14:49:31+00:00" }, { "name": "laravel/legacy-factories", @@ -3129,16 +3129,16 @@ }, { "name": "league/flysystem", - "version": "3.19.0", + "version": "3.21.0", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem.git", - "reference": "1b2aa10f2326e0351399b8ce68e287d8e9209a83" + "reference": "a326d8a2d007e4ca327a57470846e34363789258" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/1b2aa10f2326e0351399b8ce68e287d8e9209a83", - "reference": "1b2aa10f2326e0351399b8ce68e287d8e9209a83", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/a326d8a2d007e4ca327a57470846e34363789258", + "reference": "a326d8a2d007e4ca327a57470846e34363789258", "shasum": "" }, "require": { @@ -3203,7 +3203,7 @@ ], "support": { "issues": "https://github.com/thephpleague/flysystem/issues", - "source": "https://github.com/thephpleague/flysystem/tree/3.19.0" + "source": "https://github.com/thephpleague/flysystem/tree/3.21.0" }, "funding": [ { @@ -3215,20 +3215,20 @@ "type": "github" } ], - "time": "2023-11-07T09:04:28+00:00" + "time": "2023-11-18T13:59:15+00:00" }, { "name": "league/flysystem-local", - "version": "3.19.0", + "version": "3.21.0", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem-local.git", - "reference": "8d868217f9eeb4e9a7320db5ccad825e9a7a4076" + "reference": "470eb1c09eaabd49ebd908ae06f23983ba3ecfe7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/8d868217f9eeb4e9a7320db5ccad825e9a7a4076", - "reference": "8d868217f9eeb4e9a7320db5ccad825e9a7a4076", + "url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/470eb1c09eaabd49ebd908ae06f23983ba3ecfe7", + "reference": "470eb1c09eaabd49ebd908ae06f23983ba3ecfe7", "shasum": "" }, "require": { @@ -3263,7 +3263,7 @@ ], "support": { "issues": "https://github.com/thephpleague/flysystem-local/issues", - "source": "https://github.com/thephpleague/flysystem-local/tree/3.19.0" + "source": "https://github.com/thephpleague/flysystem-local/tree/3.21.0" }, "funding": [ { @@ -3275,7 +3275,7 @@ "type": "github" } ], - "time": "2023-11-06T20:35:28+00:00" + "time": "2023-11-18T13:41:42+00:00" }, { "name": "league/mime-type-detection", @@ -6648,7 +6648,7 @@ }, { "name": "symfony/deprecation-contracts", - "version": "v3.3.0", + "version": "v3.4.0", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", @@ -6695,7 +6695,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v3.3.0" + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.4.0" }, "funding": [ { @@ -6869,7 +6869,7 @@ }, { "name": "symfony/event-dispatcher-contracts", - "version": "v3.3.0", + "version": "v3.4.0", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher-contracts.git", @@ -6925,7 +6925,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.3.0" + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.4.0" }, "funding": [ { @@ -7101,16 +7101,16 @@ }, { "name": "symfony/http-client-contracts", - "version": "v3.3.0", + "version": "v3.4.0", "source": { "type": "git", "url": "https://github.com/symfony/http-client-contracts.git", - "reference": "3b66325d0176b4ec826bffab57c9037d759c31fb" + "reference": "1ee70e699b41909c209a0c930f11034b93578654" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/3b66325d0176b4ec826bffab57c9037d759c31fb", - "reference": "3b66325d0176b4ec826bffab57c9037d759c31fb", + "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/1ee70e699b41909c209a0c930f11034b93578654", + "reference": "1ee70e699b41909c209a0c930f11034b93578654", "shasum": "" }, "require": { @@ -7159,7 +7159,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/http-client-contracts/tree/v3.3.0" + "source": "https://github.com/symfony/http-client-contracts/tree/v3.4.0" }, "funding": [ { @@ -7175,7 +7175,7 @@ "type": "tidelift" } ], - "time": "2023-05-23T14:45:45+00:00" + "time": "2023-07-30T20:28:31+00:00" }, { "name": "symfony/http-foundation", @@ -8484,16 +8484,16 @@ }, { "name": "symfony/service-contracts", - "version": "v3.3.0", + "version": "v3.4.0", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "40da9cc13ec349d9e4966ce18b5fbcd724ab10a4" + "reference": "b3313c2dbffaf71c8de2934e2ea56ed2291a3838" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/40da9cc13ec349d9e4966ce18b5fbcd724ab10a4", - "reference": "40da9cc13ec349d9e4966ce18b5fbcd724ab10a4", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/b3313c2dbffaf71c8de2934e2ea56ed2291a3838", + "reference": "b3313c2dbffaf71c8de2934e2ea56ed2291a3838", "shasum": "" }, "require": { @@ -8546,7 +8546,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v3.3.0" + "source": "https://github.com/symfony/service-contracts/tree/v3.4.0" }, "funding": [ { @@ -8562,7 +8562,7 @@ "type": "tidelift" } ], - "time": "2023-05-23T14:45:45+00:00" + "time": "2023-07-30T20:28:31+00:00" }, { "name": "symfony/string", @@ -8747,16 +8747,16 @@ }, { "name": "symfony/translation-contracts", - "version": "v3.3.0", + "version": "v3.4.0", "source": { "type": "git", "url": "https://github.com/symfony/translation-contracts.git", - "reference": "02c24deb352fb0d79db5486c0c79905a85e37e86" + "reference": "dee0c6e5b4c07ce851b462530088e64b255ac9c5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/02c24deb352fb0d79db5486c0c79905a85e37e86", - "reference": "02c24deb352fb0d79db5486c0c79905a85e37e86", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/dee0c6e5b4c07ce851b462530088e64b255ac9c5", + "reference": "dee0c6e5b4c07ce851b462530088e64b255ac9c5", "shasum": "" }, "require": { @@ -8805,7 +8805,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/translation-contracts/tree/v3.3.0" + "source": "https://github.com/symfony/translation-contracts/tree/v3.4.0" }, "funding": [ { @@ -8821,7 +8821,7 @@ "type": "tidelift" } ], - "time": "2023-05-30T17:17:10+00:00" + "time": "2023-07-25T15:08:44+00:00" }, { "name": "symfony/uid", From 068a328c03fad69b68be41ba361208ef4eefacfe Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 23 Nov 2023 11:20:58 +0000 Subject: [PATCH 05/15] Update Node.js to v20.10 --- resources/ci/.drone.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/resources/ci/.drone.yml b/resources/ci/.drone.yml index 52e224a84..a580d2394 100755 --- a/resources/ci/.drone.yml +++ b/resources/ci/.drone.yml @@ -19,7 +19,7 @@ steps: - composer install --ignore-platform-reqs --no-scripts - name: build-npm - image: node:20.9 + image: node:20.10 commands: - cd src/ - npm install && npm run production @@ -109,7 +109,7 @@ steps: - push - name: build-npm - image: node:20.9 + image: node:20.10 commands: - cd src/ - npm install && npm run production @@ -288,7 +288,7 @@ steps: - tag - name: build-npm - image: node:20.9 + image: node:20.10 commands: - cd src/ - npm install && npm run production From 48412a5918faa8c4d64bdafe289ad6bac62d736b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 24 Nov 2023 06:22:20 +0000 Subject: [PATCH 06/15] Update dependency sirprize/postal-code-validator to v1.5.0 --- src/composer.json | 2 +- src/composer.lock | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/composer.json b/src/composer.json index fded2eacd..340e9bfc9 100644 --- a/src/composer.json +++ b/src/composer.json @@ -43,7 +43,7 @@ "barryvdh/laravel-debugbar": "3.9.2", "omnipay/stripe": "3.2.0", "symfony/routing": "6.3.5", - "sirprize/postal-code-validator": "1.4.1", + "sirprize/postal-code-validator": "1.5.0", "artesaos/seotools": "1.2.0", "spatie/laravel-cookie-consent": "3.2.4", "xpaw/php-source-query-class": "2.1.0", diff --git a/src/composer.lock b/src/composer.lock index 8796d2afa..528a464a6 100644 --- a/src/composer.lock +++ b/src/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "9ed536dc627dc76f47ce75c85d0c0a3f", + "content-hash": "60c2f6b5b75caac4cdca99ec725caaf9", "packages": [ { "name": "artesaos/seotools", @@ -6107,28 +6107,28 @@ }, { "name": "sirprize/postal-code-validator", - "version": "1.4.1", + "version": "1.5.0", "source": { "type": "git", "url": "https://github.com/sirprize/postal-code-validator.git", - "reference": "a48928a52745e896abb601735e1f9d72d70947d5" + "reference": "64b471d88e4533922c0cf242087292352dd24de2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sirprize/postal-code-validator/zipball/a48928a52745e896abb601735e1f9d72d70947d5", - "reference": "a48928a52745e896abb601735e1f9d72d70947d5", + "url": "https://api.github.com/repos/sirprize/postal-code-validator/zipball/64b471d88e4533922c0cf242087292352dd24de2", + "reference": "64b471d88e4533922c0cf242087292352dd24de2", "shasum": "" }, "require": { "php": "^7.2 || ^8.0" }, "require-dev": { - "phpunit/phpunit": "^8.0" + "phpunit/phpunit": "^8.0 || ^9.0 || ^10.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.5.x-dev" + "dev-master": "1.6.x-dev" } }, "autoload": { @@ -6155,9 +6155,9 @@ ], "support": { "issues": "https://github.com/sirprize/postal-code-validator/issues", - "source": "https://github.com/sirprize/postal-code-validator/tree/1.4.1" + "source": "https://github.com/sirprize/postal-code-validator/tree/1.5.0" }, - "time": "2023-06-29T20:46:26+00:00" + "time": "2023-11-24T06:06:38+00:00" }, { "name": "spatie/backtrace", From 7c20d570bde5f4f3f55a7b05ccfec7218731d1c7 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 28 Nov 2023 21:40:15 +0000 Subject: [PATCH 07/15] Update dependency laravel/ui to v4.2.3 --- src/composer.json | 2 +- src/composer.lock | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/composer.json b/src/composer.json index 340e9bfc9..29f2ff1fd 100644 --- a/src/composer.json +++ b/src/composer.json @@ -48,7 +48,7 @@ "spatie/laravel-cookie-consent": "3.2.4", "xpaw/php-source-query-class": "2.1.0", "maniaplanet/dedicated-server-api": "dev-master", - "laravel/ui": "4.2.2", + "laravel/ui": "4.2.3", "spatie/laravel-database-mail-templates": "3.5.1", "laravel/sanctum": "3.3.2", "propaganistas/laravel-phone": "5.0.3", diff --git a/src/composer.lock b/src/composer.lock index 528a464a6..c6f73d78a 100644 --- a/src/composer.lock +++ b/src/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "60c2f6b5b75caac4cdca99ec725caaf9", + "content-hash": "bbc956a86161f1b102c8271e79beca9c", "packages": [ { "name": "artesaos/seotools", @@ -2806,16 +2806,16 @@ }, { "name": "laravel/ui", - "version": "v4.2.2", + "version": "v4.2.3", "source": { "type": "git", "url": "https://github.com/laravel/ui.git", - "reference": "a58ec468db4a340b33f3426c778784717a2c144b" + "reference": "eb532ea096ca1c0298c87c19233daf011fda743a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/ui/zipball/a58ec468db4a340b33f3426c778784717a2c144b", - "reference": "a58ec468db4a340b33f3426c778784717a2c144b", + "url": "https://api.github.com/repos/laravel/ui/zipball/eb532ea096ca1c0298c87c19233daf011fda743a", + "reference": "eb532ea096ca1c0298c87c19233daf011fda743a", "shasum": "" }, "require": { @@ -2862,9 +2862,9 @@ "ui" ], "support": { - "source": "https://github.com/laravel/ui/tree/v4.2.2" + "source": "https://github.com/laravel/ui/tree/v4.2.3" }, - "time": "2023-05-09T19:47:28+00:00" + "time": "2023-11-23T14:44:22+00:00" }, { "name": "laravelcollective/html", From 0b255228b7e1a15a2f0961ca514b296e1f5d0389 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 29 Nov 2023 05:14:57 +0000 Subject: [PATCH 08/15] Update dependency @fortawesome/fontawesome-free to v6.5.0 --- src/package-lock.json | 10 +++++----- src/package.json | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/package-lock.json b/src/package-lock.json index 6bc1d119a..90f846d25 100644 --- a/src/package-lock.json +++ b/src/package-lock.json @@ -1,11 +1,11 @@ { - "name": "app", + "name": "src", "lockfileVersion": 3, "requires": true, "packages": { "": { "dependencies": { - "@fortawesome/fontawesome-free": "6.4.2", + "@fortawesome/fontawesome-free": "6.5.0", "@popperjs/core": "2.11.8", "bootstrap": "5.3.2", "jquery": "3.7.1", @@ -1914,9 +1914,9 @@ } }, "node_modules/@fortawesome/fontawesome-free": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-6.4.2.tgz", - "integrity": "sha512-m5cPn3e2+FDCOgi1mz0RexTUvvQibBebOUlUlW0+YrMjDTPkiJ6VTKukA1GRsvRw+12KyJndNjj0O4AgTxm2Pg==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-6.5.0.tgz", + "integrity": "sha512-npV8sIYN4tQmLkzkWU6Q2Ot8L3XqBzLpS+rGTl96nFM7qbMWIoFqcdp0YrcWlfRDQx5G+gA2sn8uSFNRAYTrrA==", "hasInstallScript": true, "engines": { "node": ">=6" diff --git a/src/package.json b/src/package.json index eb3c5b3ca..68cfcedc3 100644 --- a/src/package.json +++ b/src/package.json @@ -18,7 +18,7 @@ "vue-template-compiler": "2.7.15" }, "dependencies": { - "@fortawesome/fontawesome-free": "6.4.2", + "@fortawesome/fontawesome-free": "6.5.0", "bootstrap": "5.3.2", "jquery": "3.7.1", "jquery-ui-dist": "1.13.2", From fdde93cb8c440bfe558342f573829fa3ffcdf6cc Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 29 Nov 2023 13:14:33 +0000 Subject: [PATCH 09/15] Update dependency laravel/framework to v10.34.2 --- src/composer.json | 2 +- src/composer.lock | 330 +++++++++++++++++++++++----------------------- 2 files changed, 169 insertions(+), 163 deletions(-) diff --git a/src/composer.json b/src/composer.json index 29f2ff1fd..58d58ef0a 100644 --- a/src/composer.json +++ b/src/composer.json @@ -23,7 +23,7 @@ "type": "project", "require": { "php": "8.2.*", - "laravel/framework": "10.33.0", + "laravel/framework": "10.34.2", "laravelcollective/html": "6.4.1", "laravel/legacy-factories": "1.3.2", "webonyx/graphql-php": "15.8.0", diff --git a/src/composer.lock b/src/composer.lock index c6f73d78a..9b5f613d6 100644 --- a/src/composer.lock +++ b/src/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "bbc956a86161f1b102c8271e79beca9c", + "content-hash": "21115eb5b6a55d48ae7e4e7fe6a74d8a", "packages": [ { "name": "artesaos/seotools", @@ -2226,16 +2226,16 @@ }, { "name": "laravel/framework", - "version": "v10.33.0", + "version": "v10.34.2", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "4536872e3e5b6be51b1f655dafd12c9a4fa0cfe8" + "reference": "c581caa233e380610b34cc491490bfa147a3b62b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/4536872e3e5b6be51b1f655dafd12c9a4fa0cfe8", - "reference": "4536872e3e5b6be51b1f655dafd12c9a4fa0cfe8", + "url": "https://api.github.com/repos/laravel/framework/zipball/c581caa233e380610b34cc491490bfa147a3b62b", + "reference": "c581caa233e380610b34cc491490bfa147a3b62b", "shasum": "" }, "require": { @@ -2424,7 +2424,7 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2023-11-21T14:49:31+00:00" + "time": "2023-11-28T19:06:27+00:00" }, { "name": "laravel/legacy-factories", @@ -6493,16 +6493,16 @@ }, { "name": "symfony/console", - "version": "v6.3.8", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "0d14a9f6d04d4ac38a8cea1171f4554e325dae92" + "reference": "cd9864b47c367450e14ab32f78fdbf98c44c26b6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/0d14a9f6d04d4ac38a8cea1171f4554e325dae92", - "reference": "0d14a9f6d04d4ac38a8cea1171f4554e325dae92", + "url": "https://api.github.com/repos/symfony/console/zipball/cd9864b47c367450e14ab32f78fdbf98c44c26b6", + "reference": "cd9864b47c367450e14ab32f78fdbf98c44c26b6", "shasum": "" }, "require": { @@ -6510,7 +6510,7 @@ "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-mbstring": "~1.0", "symfony/service-contracts": "^2.5|^3", - "symfony/string": "^5.4|^6.0" + "symfony/string": "^5.4|^6.0|^7.0" }, "conflict": { "symfony/dependency-injection": "<5.4", @@ -6524,12 +6524,16 @@ }, "require-dev": { "psr/log": "^1|^2|^3", - "symfony/config": "^5.4|^6.0", - "symfony/dependency-injection": "^5.4|^6.0", - "symfony/event-dispatcher": "^5.4|^6.0", - "symfony/lock": "^5.4|^6.0", - "symfony/process": "^5.4|^6.0", - "symfony/var-dumper": "^5.4|^6.0" + "symfony/config": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/event-dispatcher": "^5.4|^6.0|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/lock": "^5.4|^6.0|^7.0", + "symfony/messenger": "^5.4|^6.0|^7.0", + "symfony/process": "^5.4|^6.0|^7.0", + "symfony/stopwatch": "^5.4|^6.0|^7.0", + "symfony/var-dumper": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -6563,7 +6567,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v6.3.8" + "source": "https://github.com/symfony/console/tree/v6.4.0" }, "funding": [ { @@ -6579,7 +6583,7 @@ "type": "tidelift" } ], - "time": "2023-10-31T08:09:35+00:00" + "time": "2023-11-20T16:41:16+00:00" }, { "name": "symfony/css-selector", @@ -6715,30 +6719,31 @@ }, { "name": "symfony/error-handler", - "version": "v6.3.5", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "1f69476b64fb47105c06beef757766c376b548c4" + "reference": "c873490a1c97b3a0a4838afc36ff36c112d02788" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/1f69476b64fb47105c06beef757766c376b548c4", - "reference": "1f69476b64fb47105c06beef757766c376b548c4", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/c873490a1c97b3a0a4838afc36ff36c112d02788", + "reference": "c873490a1c97b3a0a4838afc36ff36c112d02788", "shasum": "" }, "require": { "php": ">=8.1", "psr/log": "^1|^2|^3", - "symfony/var-dumper": "^5.4|^6.0" + "symfony/var-dumper": "^5.4|^6.0|^7.0" }, "conflict": { - "symfony/deprecation-contracts": "<2.5" + "symfony/deprecation-contracts": "<2.5", + "symfony/http-kernel": "<6.4" }, "require-dev": { "symfony/deprecation-contracts": "^2.5|^3", - "symfony/http-kernel": "^5.4|^6.0", - "symfony/serializer": "^5.4|^6.0" + "symfony/http-kernel": "^6.4|^7.0", + "symfony/serializer": "^5.4|^6.0|^7.0" }, "bin": [ "Resources/bin/patch-type-declarations" @@ -6769,7 +6774,7 @@ "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/error-handler/tree/v6.3.5" + "source": "https://github.com/symfony/error-handler/tree/v6.4.0" }, "funding": [ { @@ -6785,28 +6790,28 @@ "type": "tidelift" } ], - "time": "2023-09-12T06:57:20+00:00" + "time": "2023-10-18T09:43:34+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v6.3.2", + "version": "v7.0.0", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "adb01fe097a4ee930db9258a3cc906b5beb5cf2e" + "reference": "c459b40ffe67c49af6fd392aac374c9edf8a027e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/adb01fe097a4ee930db9258a3cc906b5beb5cf2e", - "reference": "adb01fe097a4ee930db9258a3cc906b5beb5cf2e", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/c459b40ffe67c49af6fd392aac374c9edf8a027e", + "reference": "c459b40ffe67c49af6fd392aac374c9edf8a027e", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "symfony/event-dispatcher-contracts": "^2.5|^3" }, "conflict": { - "symfony/dependency-injection": "<5.4", + "symfony/dependency-injection": "<6.4", "symfony/service-contracts": "<2.5" }, "provide": { @@ -6815,13 +6820,13 @@ }, "require-dev": { "psr/log": "^1|^2|^3", - "symfony/config": "^5.4|^6.0", - "symfony/dependency-injection": "^5.4|^6.0", - "symfony/error-handler": "^5.4|^6.0", - "symfony/expression-language": "^5.4|^6.0", - "symfony/http-foundation": "^5.4|^6.0", + "symfony/config": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/error-handler": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", "symfony/service-contracts": "^2.5|^3", - "symfony/stopwatch": "^5.4|^6.0" + "symfony/stopwatch": "^6.4|^7.0" }, "type": "library", "autoload": { @@ -6849,7 +6854,7 @@ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v6.3.2" + "source": "https://github.com/symfony/event-dispatcher/tree/v7.0.0" }, "funding": [ { @@ -6865,7 +6870,7 @@ "type": "tidelift" } ], - "time": "2023-07-06T06:56:43+00:00" + "time": "2023-07-27T16:29:09+00:00" }, { "name": "symfony/event-dispatcher-contracts", @@ -6945,23 +6950,23 @@ }, { "name": "symfony/finder", - "version": "v6.3.5", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "a1b31d88c0e998168ca7792f222cbecee47428c4" + "reference": "11d736e97f116ac375a81f96e662911a34cd50ce" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/a1b31d88c0e998168ca7792f222cbecee47428c4", - "reference": "a1b31d88c0e998168ca7792f222cbecee47428c4", + "url": "https://api.github.com/repos/symfony/finder/zipball/11d736e97f116ac375a81f96e662911a34cd50ce", + "reference": "11d736e97f116ac375a81f96e662911a34cd50ce", "shasum": "" }, "require": { "php": ">=8.1" }, "require-dev": { - "symfony/filesystem": "^6.0" + "symfony/filesystem": "^6.0|^7.0" }, "type": "library", "autoload": { @@ -6989,7 +6994,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v6.3.5" + "source": "https://github.com/symfony/finder/tree/v6.4.0" }, "funding": [ { @@ -7005,7 +7010,7 @@ "type": "tidelift" } ], - "time": "2023-09-26T12:56:25+00:00" + "time": "2023-10-31T17:30:12+00:00" }, { "name": "symfony/http-client", @@ -7179,16 +7184,16 @@ }, { "name": "symfony/http-foundation", - "version": "v6.3.8", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "ce332676de1912c4389222987193c3ef38033df6" + "reference": "44a6d39a9cc11e154547d882d5aac1e014440771" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/ce332676de1912c4389222987193c3ef38033df6", - "reference": "ce332676de1912c4389222987193c3ef38033df6", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/44a6d39a9cc11e154547d882d5aac1e014440771", + "reference": "44a6d39a9cc11e154547d882d5aac1e014440771", "shasum": "" }, "require": { @@ -7203,12 +7208,12 @@ "require-dev": { "doctrine/dbal": "^2.13.1|^3|^4", "predis/predis": "^1.1|^2.0", - "symfony/cache": "^6.3", - "symfony/dependency-injection": "^5.4|^6.0", - "symfony/expression-language": "^5.4|^6.0", - "symfony/http-kernel": "^5.4.12|^6.0.12|^6.1.4", - "symfony/mime": "^5.4|^6.0", - "symfony/rate-limiter": "^5.2|^6.0" + "symfony/cache": "^6.3|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/http-kernel": "^5.4.12|^6.0.12|^6.1.4|^7.0", + "symfony/mime": "^5.4|^6.0|^7.0", + "symfony/rate-limiter": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -7236,7 +7241,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v6.3.8" + "source": "https://github.com/symfony/http-foundation/tree/v6.4.0" }, "funding": [ { @@ -7252,29 +7257,29 @@ "type": "tidelift" } ], - "time": "2023-11-07T10:17:15+00:00" + "time": "2023-11-20T16:41:16+00:00" }, { "name": "symfony/http-kernel", - "version": "v6.3.8", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "929202375ccf44a309c34aeca8305408442ebcc1" + "reference": "16a29c453966f29466ad34444ce97970a336f3c8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/929202375ccf44a309c34aeca8305408442ebcc1", - "reference": "929202375ccf44a309c34aeca8305408442ebcc1", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/16a29c453966f29466ad34444ce97970a336f3c8", + "reference": "16a29c453966f29466ad34444ce97970a336f3c8", "shasum": "" }, "require": { "php": ">=8.1", "psr/log": "^1|^2|^3", "symfony/deprecation-contracts": "^2.5|^3", - "symfony/error-handler": "^6.3", - "symfony/event-dispatcher": "^5.4|^6.0", - "symfony/http-foundation": "^6.3.4", + "symfony/error-handler": "^6.4|^7.0", + "symfony/event-dispatcher": "^5.4|^6.0|^7.0", + "symfony/http-foundation": "^6.4|^7.0", "symfony/polyfill-ctype": "^1.8" }, "conflict": { @@ -7282,7 +7287,7 @@ "symfony/cache": "<5.4", "symfony/config": "<6.1", "symfony/console": "<5.4", - "symfony/dependency-injection": "<6.3.4", + "symfony/dependency-injection": "<6.4", "symfony/doctrine-bridge": "<5.4", "symfony/form": "<5.4", "symfony/http-client": "<5.4", @@ -7292,7 +7297,7 @@ "symfony/translation": "<5.4", "symfony/translation-contracts": "<2.5", "symfony/twig-bridge": "<5.4", - "symfony/validator": "<5.4", + "symfony/validator": "<6.4", "symfony/var-dumper": "<6.3", "twig/twig": "<2.13" }, @@ -7301,26 +7306,26 @@ }, "require-dev": { "psr/cache": "^1.0|^2.0|^3.0", - "symfony/browser-kit": "^5.4|^6.0", - "symfony/clock": "^6.2", - "symfony/config": "^6.1", - "symfony/console": "^5.4|^6.0", - "symfony/css-selector": "^5.4|^6.0", - "symfony/dependency-injection": "^6.3.4", - "symfony/dom-crawler": "^5.4|^6.0", - "symfony/expression-language": "^5.4|^6.0", - "symfony/finder": "^5.4|^6.0", + "symfony/browser-kit": "^5.4|^6.0|^7.0", + "symfony/clock": "^6.2|^7.0", + "symfony/config": "^6.1|^7.0", + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/css-selector": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/dom-crawler": "^5.4|^6.0|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/finder": "^5.4|^6.0|^7.0", "symfony/http-client-contracts": "^2.5|^3", - "symfony/process": "^5.4|^6.0", - "symfony/property-access": "^5.4.5|^6.0.5", - "symfony/routing": "^5.4|^6.0", - "symfony/serializer": "^6.3", - "symfony/stopwatch": "^5.4|^6.0", - "symfony/translation": "^5.4|^6.0", + "symfony/process": "^5.4|^6.0|^7.0", + "symfony/property-access": "^5.4.5|^6.0.5|^7.0", + "symfony/routing": "^5.4|^6.0|^7.0", + "symfony/serializer": "^6.3|^7.0", + "symfony/stopwatch": "^5.4|^6.0|^7.0", + "symfony/translation": "^5.4|^6.0|^7.0", "symfony/translation-contracts": "^2.5|^3", - "symfony/uid": "^5.4|^6.0", - "symfony/validator": "^6.3", - "symfony/var-exporter": "^6.2", + "symfony/uid": "^5.4|^6.0|^7.0", + "symfony/validator": "^6.4|^7.0", + "symfony/var-exporter": "^6.2|^7.0", "twig/twig": "^2.13|^3.0.4" }, "type": "library", @@ -7349,7 +7354,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v6.3.8" + "source": "https://github.com/symfony/http-kernel/tree/v6.4.0" }, "funding": [ { @@ -7365,20 +7370,20 @@ "type": "tidelift" } ], - "time": "2023-11-10T13:47:32+00:00" + "time": "2023-11-29T10:40:15+00:00" }, { "name": "symfony/mailer", - "version": "v6.3.5", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/mailer.git", - "reference": "d89611a7830d51b5e118bca38e390dea92f9ea06" + "reference": "ca8dcf8892cdc5b4358ecf2528429bb5e706f7ba" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mailer/zipball/d89611a7830d51b5e118bca38e390dea92f9ea06", - "reference": "d89611a7830d51b5e118bca38e390dea92f9ea06", + "url": "https://api.github.com/repos/symfony/mailer/zipball/ca8dcf8892cdc5b4358ecf2528429bb5e706f7ba", + "reference": "ca8dcf8892cdc5b4358ecf2528429bb5e706f7ba", "shasum": "" }, "require": { @@ -7386,8 +7391,8 @@ "php": ">=8.1", "psr/event-dispatcher": "^1", "psr/log": "^1|^2|^3", - "symfony/event-dispatcher": "^5.4|^6.0", - "symfony/mime": "^6.2", + "symfony/event-dispatcher": "^5.4|^6.0|^7.0", + "symfony/mime": "^6.2|^7.0", "symfony/service-contracts": "^2.5|^3" }, "conflict": { @@ -7398,10 +7403,10 @@ "symfony/twig-bridge": "<6.2.1" }, "require-dev": { - "symfony/console": "^5.4|^6.0", - "symfony/http-client": "^5.4|^6.0", - "symfony/messenger": "^6.2", - "symfony/twig-bridge": "^6.2" + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/http-client": "^5.4|^6.0|^7.0", + "symfony/messenger": "^6.2|^7.0", + "symfony/twig-bridge": "^6.2|^7.0" }, "type": "library", "autoload": { @@ -7429,7 +7434,7 @@ "description": "Helps sending emails", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/mailer/tree/v6.3.5" + "source": "https://github.com/symfony/mailer/tree/v6.4.0" }, "funding": [ { @@ -7445,7 +7450,7 @@ "type": "tidelift" } ], - "time": "2023-09-06T09:47:15+00:00" + "time": "2023-11-12T18:02:22+00:00" }, { "name": "symfony/mailgun-mailer", @@ -7518,16 +7523,16 @@ }, { "name": "symfony/mime", - "version": "v6.3.5", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "d5179eedf1cb2946dbd760475ebf05c251ef6a6e" + "reference": "ca4f58b2ef4baa8f6cecbeca2573f88cd577d205" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/d5179eedf1cb2946dbd760475ebf05c251ef6a6e", - "reference": "d5179eedf1cb2946dbd760475ebf05c251ef6a6e", + "url": "https://api.github.com/repos/symfony/mime/zipball/ca4f58b2ef4baa8f6cecbeca2573f88cd577d205", + "reference": "ca4f58b2ef4baa8f6cecbeca2573f88cd577d205", "shasum": "" }, "require": { @@ -7541,16 +7546,16 @@ "phpdocumentor/reflection-docblock": "<3.2.2", "phpdocumentor/type-resolver": "<1.4.0", "symfony/mailer": "<5.4", - "symfony/serializer": "<6.2.13|>=6.3,<6.3.2" + "symfony/serializer": "<6.3.2" }, "require-dev": { "egulias/email-validator": "^2.1.10|^3.1|^4", "league/html-to-markdown": "^5.0", "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", - "symfony/dependency-injection": "^5.4|^6.0", - "symfony/property-access": "^5.4|^6.0", - "symfony/property-info": "^5.4|^6.0", - "symfony/serializer": "~6.2.13|^6.3.2" + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/property-access": "^5.4|^6.0|^7.0", + "symfony/property-info": "^5.4|^6.0|^7.0", + "symfony/serializer": "^6.3.2|^7.0" }, "type": "library", "autoload": { @@ -7582,7 +7587,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v6.3.5" + "source": "https://github.com/symfony/mime/tree/v6.4.0" }, "funding": [ { @@ -7598,7 +7603,7 @@ "type": "tidelift" } ], - "time": "2023-09-29T06:59:36+00:00" + "time": "2023-10-17T11:49:05+00:00" }, { "name": "symfony/polyfill-ctype", @@ -8340,16 +8345,16 @@ }, { "name": "symfony/process", - "version": "v6.3.4", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "0b5c29118f2e980d455d2e34a5659f4579847c54" + "reference": "191703b1566d97a5425dc969e4350d32b8ef17aa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/0b5c29118f2e980d455d2e34a5659f4579847c54", - "reference": "0b5c29118f2e980d455d2e34a5659f4579847c54", + "url": "https://api.github.com/repos/symfony/process/zipball/191703b1566d97a5425dc969e4350d32b8ef17aa", + "reference": "191703b1566d97a5425dc969e4350d32b8ef17aa", "shasum": "" }, "require": { @@ -8381,7 +8386,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v6.3.4" + "source": "https://github.com/symfony/process/tree/v6.4.0" }, "funding": [ { @@ -8397,7 +8402,7 @@ "type": "tidelift" } ], - "time": "2023-08-07T10:39:22+00:00" + "time": "2023-11-17T21:06:49+00:00" }, { "name": "symfony/routing", @@ -8566,20 +8571,20 @@ }, { "name": "symfony/string", - "version": "v6.3.8", + "version": "v7.0.0", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "13880a87790c76ef994c91e87efb96134522577a" + "reference": "92bd2bfbba476d4a1838e5e12168bef2fd1e6620" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/13880a87790c76ef994c91e87efb96134522577a", - "reference": "13880a87790c76ef994c91e87efb96134522577a", + "url": "https://api.github.com/repos/symfony/string/zipball/92bd2bfbba476d4a1838e5e12168bef2fd1e6620", + "reference": "92bd2bfbba476d4a1838e5e12168bef2fd1e6620", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-intl-grapheme": "~1.0", "symfony/polyfill-intl-normalizer": "~1.0", @@ -8589,11 +8594,11 @@ "symfony/translation-contracts": "<2.5" }, "require-dev": { - "symfony/error-handler": "^5.4|^6.0", - "symfony/http-client": "^5.4|^6.0", - "symfony/intl": "^6.2", + "symfony/error-handler": "^6.4|^7.0", + "symfony/http-client": "^6.4|^7.0", + "symfony/intl": "^6.4|^7.0", "symfony/translation-contracts": "^2.5|^3.0", - "symfony/var-exporter": "^5.4|^6.0" + "symfony/var-exporter": "^6.4|^7.0" }, "type": "library", "autoload": { @@ -8632,7 +8637,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v6.3.8" + "source": "https://github.com/symfony/string/tree/v7.0.0" }, "funding": [ { @@ -8648,20 +8653,20 @@ "type": "tidelift" } ], - "time": "2023-11-09T08:28:21+00:00" + "time": "2023-11-29T08:40:23+00:00" }, { "name": "symfony/translation", - "version": "v6.3.7", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "30212e7c87dcb79c83f6362b00bde0e0b1213499" + "reference": "b1035dbc2a344b21f8fa8ac451c7ecec4ea45f37" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/30212e7c87dcb79c83f6362b00bde0e0b1213499", - "reference": "30212e7c87dcb79c83f6362b00bde0e0b1213499", + "url": "https://api.github.com/repos/symfony/translation/zipball/b1035dbc2a344b21f8fa8ac451c7ecec4ea45f37", + "reference": "b1035dbc2a344b21f8fa8ac451c7ecec4ea45f37", "shasum": "" }, "require": { @@ -8686,17 +8691,17 @@ "require-dev": { "nikic/php-parser": "^4.13", "psr/log": "^1|^2|^3", - "symfony/config": "^5.4|^6.0", - "symfony/console": "^5.4|^6.0", - "symfony/dependency-injection": "^5.4|^6.0", - "symfony/finder": "^5.4|^6.0", + "symfony/config": "^5.4|^6.0|^7.0", + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/finder": "^5.4|^6.0|^7.0", "symfony/http-client-contracts": "^2.5|^3.0", - "symfony/http-kernel": "^5.4|^6.0", - "symfony/intl": "^5.4|^6.0", + "symfony/http-kernel": "^5.4|^6.0|^7.0", + "symfony/intl": "^5.4|^6.0|^7.0", "symfony/polyfill-intl-icu": "^1.21", - "symfony/routing": "^5.4|^6.0", + "symfony/routing": "^5.4|^6.0|^7.0", "symfony/service-contracts": "^2.5|^3", - "symfony/yaml": "^5.4|^6.0" + "symfony/yaml": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -8727,7 +8732,7 @@ "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/translation/tree/v6.3.7" + "source": "https://github.com/symfony/translation/tree/v6.4.0" }, "funding": [ { @@ -8743,7 +8748,7 @@ "type": "tidelift" } ], - "time": "2023-10-28T23:11:45+00:00" + "time": "2023-11-29T08:14:36+00:00" }, { "name": "symfony/translation-contracts", @@ -8825,16 +8830,16 @@ }, { "name": "symfony/uid", - "version": "v6.3.8", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/uid.git", - "reference": "819fa5ac210fb7ddda4752b91a82f50be7493dd9" + "reference": "8092dd1b1a41372110d06374f99ee62f7f0b9a92" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/uid/zipball/819fa5ac210fb7ddda4752b91a82f50be7493dd9", - "reference": "819fa5ac210fb7ddda4752b91a82f50be7493dd9", + "url": "https://api.github.com/repos/symfony/uid/zipball/8092dd1b1a41372110d06374f99ee62f7f0b9a92", + "reference": "8092dd1b1a41372110d06374f99ee62f7f0b9a92", "shasum": "" }, "require": { @@ -8842,7 +8847,7 @@ "symfony/polyfill-uuid": "^1.15" }, "require-dev": { - "symfony/console": "^5.4|^6.0" + "symfony/console": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -8879,7 +8884,7 @@ "uuid" ], "support": { - "source": "https://github.com/symfony/uid/tree/v6.3.8" + "source": "https://github.com/symfony/uid/tree/v6.4.0" }, "funding": [ { @@ -8895,20 +8900,20 @@ "type": "tidelift" } ], - "time": "2023-10-31T08:07:48+00:00" + "time": "2023-10-31T08:18:17+00:00" }, { "name": "symfony/var-dumper", - "version": "v6.3.8", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "81acabba9046550e89634876ca64bfcd3c06aa0a" + "reference": "c40f7d17e91d8b407582ed51a2bbf83c52c367f6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/81acabba9046550e89634876ca64bfcd3c06aa0a", - "reference": "81acabba9046550e89634876ca64bfcd3c06aa0a", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/c40f7d17e91d8b407582ed51a2bbf83c52c367f6", + "reference": "c40f7d17e91d8b407582ed51a2bbf83c52c367f6", "shasum": "" }, "require": { @@ -8921,10 +8926,11 @@ }, "require-dev": { "ext-iconv": "*", - "symfony/console": "^5.4|^6.0", - "symfony/http-kernel": "^5.4|^6.0", - "symfony/process": "^5.4|^6.0", - "symfony/uid": "^5.4|^6.0", + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/error-handler": "^6.3|^7.0", + "symfony/http-kernel": "^5.4|^6.0|^7.0", + "symfony/process": "^5.4|^6.0|^7.0", + "symfony/uid": "^5.4|^6.0|^7.0", "twig/twig": "^2.13|^3.0.4" }, "bin": [ @@ -8963,7 +8969,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v6.3.8" + "source": "https://github.com/symfony/var-dumper/tree/v6.4.0" }, "funding": [ { @@ -8979,7 +8985,7 @@ "type": "tidelift" } ], - "time": "2023-11-08T10:42:36+00:00" + "time": "2023-11-09T08:28:32+00:00" }, { "name": "team-reflex/challonge-php", From 59475a3defd345ea302919b749540e5788a2bb10 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 29 Nov 2023 15:56:40 +0000 Subject: [PATCH 10/15] Update symfony packages to v6.4.0 --- src/composer.json | 10 +++--- src/composer.lock | 89 ++++++++++++++++++++++++----------------------- 2 files changed, 50 insertions(+), 49 deletions(-) diff --git a/src/composer.json b/src/composer.json index 58d58ef0a..fa0663174 100644 --- a/src/composer.json +++ b/src/composer.json @@ -42,7 +42,7 @@ "cviebrock/eloquent-sluggable": "10.0.0", "barryvdh/laravel-debugbar": "3.9.2", "omnipay/stripe": "3.2.0", - "symfony/routing": "6.3.5", + "symfony/routing": "6.4.0", "sirprize/postal-code-validator": "1.5.0", "artesaos/seotools": "1.2.0", "spatie/laravel-cookie-consent": "3.2.4", @@ -52,8 +52,8 @@ "spatie/laravel-database-mail-templates": "3.5.1", "laravel/sanctum": "3.3.2", "propaganistas/laravel-phone": "5.0.3", - "symfony/mailgun-mailer": "6.3.6", - "symfony/http-client": "6.3.8", + "symfony/mailgun-mailer": "6.4.0", + "symfony/http-client": "6.4.0", "spatie/backtrace": "1.5.3", "haydenpierce/class-finder": "^0.5.3", "dompdf/dompdf": "^2.0" @@ -63,8 +63,8 @@ "fakerphp/faker": "1.23.0", "phpunit/phpunit": "10.4.2", "kitloong/laravel-migrations-generator": "6.11.0", - "symfony/css-selector": "6.3.2", - "symfony/dom-crawler": "6.3.4", + "symfony/css-selector": "6.4.0", + "symfony/dom-crawler": "6.4.0", "orangehill/iseed": "3.0.3", "squizlabs/php_codesniffer": "3.7.2", "filp/whoops": "2.15.4" diff --git a/src/composer.lock b/src/composer.lock index 9b5f613d6..86a29e6bd 100644 --- a/src/composer.lock +++ b/src/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "21115eb5b6a55d48ae7e4e7fe6a74d8a", + "content-hash": "fe0c47bf0d500b2e12e37ce7ce09e2b2", "packages": [ { "name": "artesaos/seotools", @@ -6587,16 +6587,16 @@ }, { "name": "symfony/css-selector", - "version": "v6.3.2", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "883d961421ab1709877c10ac99451632a3d6fa57" + "reference": "d036c6c0d0b09e24a14a35f8292146a658f986e4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/883d961421ab1709877c10ac99451632a3d6fa57", - "reference": "883d961421ab1709877c10ac99451632a3d6fa57", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/d036c6c0d0b09e24a14a35f8292146a658f986e4", + "reference": "d036c6c0d0b09e24a14a35f8292146a658f986e4", "shasum": "" }, "require": { @@ -6632,7 +6632,7 @@ "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/css-selector/tree/v6.3.2" + "source": "https://github.com/symfony/css-selector/tree/v6.4.0" }, "funding": [ { @@ -6648,7 +6648,7 @@ "type": "tidelift" } ], - "time": "2023-07-12T16:00:22+00:00" + "time": "2023-10-31T08:40:20+00:00" }, { "name": "symfony/deprecation-contracts", @@ -7014,16 +7014,16 @@ }, { "name": "symfony/http-client", - "version": "v6.3.8", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/http-client.git", - "reference": "0314e2d49939a9831929d6fc81c01c6df137fd0a" + "reference": "5c584530b77aa10ae216989ffc48b4bedc9c0b29" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client/zipball/0314e2d49939a9831929d6fc81c01c6df137fd0a", - "reference": "0314e2d49939a9831929d6fc81c01c6df137fd0a", + "url": "https://api.github.com/repos/symfony/http-client/zipball/5c584530b77aa10ae216989ffc48b4bedc9c0b29", + "reference": "5c584530b77aa10ae216989ffc48b4bedc9c0b29", "shasum": "" }, "require": { @@ -7052,10 +7052,11 @@ "nyholm/psr7": "^1.0", "php-http/httplug": "^1.0|^2.0", "psr/http-client": "^1.0", - "symfony/dependency-injection": "^5.4|^6.0", - "symfony/http-kernel": "^5.4|^6.0", - "symfony/process": "^5.4|^6.0", - "symfony/stopwatch": "^5.4|^6.0" + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/http-kernel": "^5.4|^6.0|^7.0", + "symfony/messenger": "^5.4|^6.0|^7.0", + "symfony/process": "^5.4|^6.0|^7.0", + "symfony/stopwatch": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -7086,7 +7087,7 @@ "http" ], "support": { - "source": "https://github.com/symfony/http-client/tree/v6.3.8" + "source": "https://github.com/symfony/http-client/tree/v6.4.0" }, "funding": [ { @@ -7102,7 +7103,7 @@ "type": "tidelift" } ], - "time": "2023-11-06T18:31:59+00:00" + "time": "2023-11-28T20:55:58+00:00" }, { "name": "symfony/http-client-contracts", @@ -7454,28 +7455,28 @@ }, { "name": "symfony/mailgun-mailer", - "version": "v6.3.6", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/mailgun-mailer.git", - "reference": "8d9741467c53750dc8ccda23a1cdb91cda732571" + "reference": "72d2f72f2016e559d0152188bef5a5dc9ebf5ec7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mailgun-mailer/zipball/8d9741467c53750dc8ccda23a1cdb91cda732571", - "reference": "8d9741467c53750dc8ccda23a1cdb91cda732571", + "url": "https://api.github.com/repos/symfony/mailgun-mailer/zipball/72d2f72f2016e559d0152188bef5a5dc9ebf5ec7", + "reference": "72d2f72f2016e559d0152188bef5a5dc9ebf5ec7", "shasum": "" }, "require": { "php": ">=8.1", - "symfony/mailer": "^5.4.21|^6.2.7" + "symfony/mailer": "^5.4.21|^6.2.7|^7.0" }, "conflict": { "symfony/http-foundation": "<6.2" }, "require-dev": { - "symfony/http-client": "^5.4|^6.0", - "symfony/webhook": "^6.3" + "symfony/http-client": "^6.3|^7.0", + "symfony/webhook": "^6.3|^7.0" }, "type": "symfony-mailer-bridge", "autoload": { @@ -7503,7 +7504,7 @@ "description": "Symfony Mailgun Mailer Bridge", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/mailgun-mailer/tree/v6.3.6" + "source": "https://github.com/symfony/mailgun-mailer/tree/v6.4.0" }, "funding": [ { @@ -7519,7 +7520,7 @@ "type": "tidelift" } ], - "time": "2023-10-12T13:32:47+00:00" + "time": "2023-11-06T17:20:05+00:00" }, { "name": "symfony/mime", @@ -8406,16 +8407,16 @@ }, { "name": "symfony/routing", - "version": "v6.3.5", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "82616e59acd3e3d9c916bba798326cb7796d7d31" + "reference": "ae014d60d7c8e80be5c3b644a286e91249a3e8f4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/82616e59acd3e3d9c916bba798326cb7796d7d31", - "reference": "82616e59acd3e3d9c916bba798326cb7796d7d31", + "url": "https://api.github.com/repos/symfony/routing/zipball/ae014d60d7c8e80be5c3b644a286e91249a3e8f4", + "reference": "ae014d60d7c8e80be5c3b644a286e91249a3e8f4", "shasum": "" }, "require": { @@ -8431,11 +8432,11 @@ "require-dev": { "doctrine/annotations": "^1.12|^2", "psr/log": "^1|^2|^3", - "symfony/config": "^6.2", - "symfony/dependency-injection": "^5.4|^6.0", - "symfony/expression-language": "^5.4|^6.0", - "symfony/http-foundation": "^5.4|^6.0", - "symfony/yaml": "^5.4|^6.0" + "symfony/config": "^6.2|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/http-foundation": "^5.4|^6.0|^7.0", + "symfony/yaml": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -8469,7 +8470,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v6.3.5" + "source": "https://github.com/symfony/routing/tree/v6.4.0" }, "funding": [ { @@ -8485,7 +8486,7 @@ "type": "tidelift" } ], - "time": "2023-09-20T16:05:51+00:00" + "time": "2023-11-29T08:04:54+00:00" }, { "name": "symfony/service-contracts", @@ -11481,16 +11482,16 @@ }, { "name": "symfony/dom-crawler", - "version": "v6.3.4", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/symfony/dom-crawler.git", - "reference": "3fdd2a3d5fdc363b2e8dbf817f9726a4d013cbd1" + "reference": "14ff4fd2a5c8969d6158dbe7ef5b17d6a9c6ba33" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/3fdd2a3d5fdc363b2e8dbf817f9726a4d013cbd1", - "reference": "3fdd2a3d5fdc363b2e8dbf817f9726a4d013cbd1", + "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/14ff4fd2a5c8969d6158dbe7ef5b17d6a9c6ba33", + "reference": "14ff4fd2a5c8969d6158dbe7ef5b17d6a9c6ba33", "shasum": "" }, "require": { @@ -11500,7 +11501,7 @@ "symfony/polyfill-mbstring": "~1.0" }, "require-dev": { - "symfony/css-selector": "^5.4|^6.0" + "symfony/css-selector": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -11528,7 +11529,7 @@ "description": "Eases DOM navigation for HTML and XML documents", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dom-crawler/tree/v6.3.4" + "source": "https://github.com/symfony/dom-crawler/tree/v6.4.0" }, "funding": [ { @@ -11544,7 +11545,7 @@ "type": "tidelift" } ], - "time": "2023-08-01T07:43:40+00:00" + "time": "2023-11-20T16:41:16+00:00" }, { "name": "theseer/tokenizer", From 8e8aafe0deb3cf2abb51db1ab85b59f10048d229 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 3 Dec 2023 12:35:57 +0000 Subject: [PATCH 11/15] Update dependency @fortawesome/fontawesome-free to v6.5.1 --- src/package-lock.json | 8 ++++---- src/package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/package-lock.json b/src/package-lock.json index 90f846d25..7e5e2b30e 100644 --- a/src/package-lock.json +++ b/src/package-lock.json @@ -5,7 +5,7 @@ "packages": { "": { "dependencies": { - "@fortawesome/fontawesome-free": "6.5.0", + "@fortawesome/fontawesome-free": "6.5.1", "@popperjs/core": "2.11.8", "bootstrap": "5.3.2", "jquery": "3.7.1", @@ -1914,9 +1914,9 @@ } }, "node_modules/@fortawesome/fontawesome-free": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-6.5.0.tgz", - "integrity": "sha512-npV8sIYN4tQmLkzkWU6Q2Ot8L3XqBzLpS+rGTl96nFM7qbMWIoFqcdp0YrcWlfRDQx5G+gA2sn8uSFNRAYTrrA==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-6.5.1.tgz", + "integrity": "sha512-CNy5vSwN3fsUStPRLX7fUYojyuzoEMSXPl7zSLJ8TgtRfjv24LOnOWKT2zYwaHZCJGkdyRnTmstR0P+Ah503Gw==", "hasInstallScript": true, "engines": { "node": ">=6" diff --git a/src/package.json b/src/package.json index 68cfcedc3..130bab7ff 100644 --- a/src/package.json +++ b/src/package.json @@ -18,7 +18,7 @@ "vue-template-compiler": "2.7.15" }, "dependencies": { - "@fortawesome/fontawesome-free": "6.5.0", + "@fortawesome/fontawesome-free": "6.5.1", "bootstrap": "5.3.2", "jquery": "3.7.1", "jquery-ui-dist": "1.13.2", From 1e76266bb1329c153fa3966d1339f773a3bc9ec8 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 3 Dec 2023 16:54:13 +0000 Subject: [PATCH 12/15] Update dependency postcss to v8.4.32 --- src/package-lock.json | 16 ++++++++-------- src/package.json | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/package-lock.json b/src/package-lock.json index 7e5e2b30e..07933b1f1 100644 --- a/src/package-lock.json +++ b/src/package-lock.json @@ -18,7 +18,7 @@ "dns-packet": "5.6.1", "laravel-mix": "6.0.49", "laravel-mix-purgecss": "6.0.0", - "postcss": "8.4.31", + "postcss": "8.4.32", "resolve-url-loader": "5.0.0", "sass": "1.69.5", "sass-loader": "13.3.2", @@ -6276,9 +6276,9 @@ } }, "node_modules/nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", "dev": true, "funding": [ { @@ -6782,9 +6782,9 @@ } }, "node_modules/postcss": { - "version": "8.4.31", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", - "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "version": "8.4.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.32.tgz", + "integrity": "sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==", "dev": true, "funding": [ { @@ -6801,7 +6801,7 @@ } ], "dependencies": { - "nanoid": "^3.3.6", + "nanoid": "^3.3.7", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" }, diff --git a/src/package.json b/src/package.json index 130bab7ff..ed7b1d4a5 100644 --- a/src/package.json +++ b/src/package.json @@ -11,7 +11,7 @@ "dns-packet": "5.6.1", "laravel-mix": "6.0.49", "laravel-mix-purgecss": "6.0.0", - "postcss": "8.4.31", + "postcss": "8.4.32", "resolve-url-loader": "5.0.0", "sass": "1.69.5", "sass-loader": "13.3.2", From 49018e37e10728c8f3f4e7d91d7e5f63becf318d Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 3 Dec 2023 18:25:15 +0000 Subject: [PATCH 13/15] Update dependency symfony/routing to v6.4.1 --- src/composer.json | 2 +- src/composer.lock | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/composer.json b/src/composer.json index fa0663174..75476a0b6 100644 --- a/src/composer.json +++ b/src/composer.json @@ -42,7 +42,7 @@ "cviebrock/eloquent-sluggable": "10.0.0", "barryvdh/laravel-debugbar": "3.9.2", "omnipay/stripe": "3.2.0", - "symfony/routing": "6.4.0", + "symfony/routing": "6.4.1", "sirprize/postal-code-validator": "1.5.0", "artesaos/seotools": "1.2.0", "spatie/laravel-cookie-consent": "3.2.4", diff --git a/src/composer.lock b/src/composer.lock index 86a29e6bd..c7f702cb8 100644 --- a/src/composer.lock +++ b/src/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "fe0c47bf0d500b2e12e37ce7ce09e2b2", + "content-hash": "9ad92aa68acee73be2f115f6f59ec0f0", "packages": [ { "name": "artesaos/seotools", @@ -8407,16 +8407,16 @@ }, { "name": "symfony/routing", - "version": "v6.4.0", + "version": "v6.4.1", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "ae014d60d7c8e80be5c3b644a286e91249a3e8f4" + "reference": "0c95c164fdba18b12523b75e64199ca3503e6d40" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/ae014d60d7c8e80be5c3b644a286e91249a3e8f4", - "reference": "ae014d60d7c8e80be5c3b644a286e91249a3e8f4", + "url": "https://api.github.com/repos/symfony/routing/zipball/0c95c164fdba18b12523b75e64199ca3503e6d40", + "reference": "0c95c164fdba18b12523b75e64199ca3503e6d40", "shasum": "" }, "require": { @@ -8470,7 +8470,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v6.4.0" + "source": "https://github.com/symfony/routing/tree/v6.4.1" }, "funding": [ { @@ -8486,7 +8486,7 @@ "type": "tidelift" } ], - "time": "2023-11-29T08:04:54+00:00" + "time": "2023-12-01T14:54:37+00:00" }, { "name": "symfony/service-contracts", From bf1623f8215685bf1e9afecd6e8c077d965f06fb Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 3 Dec 2023 22:23:56 +0000 Subject: [PATCH 14/15] Update dependency guzzlehttp/guzzle to v7.8.1 --- src/composer.json | 2 +- src/composer.lock | 50 +++++++++++++++++++++++------------------------ 2 files changed, 26 insertions(+), 26 deletions(-) diff --git a/src/composer.json b/src/composer.json index 75476a0b6..bf2de9584 100644 --- a/src/composer.json +++ b/src/composer.json @@ -32,7 +32,7 @@ "ignited/laravel-omnipay": "3.5.0", "doctrine/dbal": "3.7.2", "simplesoftwareio/simple-qrcode": "4.2.0", - "guzzlehttp/guzzle": "7.8.0", + "guzzlehttp/guzzle": "7.8.1", "php-http/guzzle7-adapter": "1.0.0", "team-reflex/challonge-php": "5.0", "intervention/image": "2.7.2", diff --git a/src/composer.lock b/src/composer.lock index c7f702cb8..debfe848b 100644 --- a/src/composer.lock +++ b/src/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "9ad92aa68acee73be2f115f6f59ec0f0", + "content-hash": "a73156087e789086ba16e9a1c31366bc", "packages": [ { "name": "artesaos/seotools", @@ -1571,16 +1571,16 @@ }, { "name": "guzzlehttp/guzzle", - "version": "7.8.0", + "version": "7.8.1", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "1110f66a6530a40fe7aea0378fe608ee2b2248f9" + "reference": "41042bc7ab002487b876a0683fc8dce04ddce104" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/1110f66a6530a40fe7aea0378fe608ee2b2248f9", - "reference": "1110f66a6530a40fe7aea0378fe608ee2b2248f9", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/41042bc7ab002487b876a0683fc8dce04ddce104", + "reference": "41042bc7ab002487b876a0683fc8dce04ddce104", "shasum": "" }, "require": { @@ -1595,11 +1595,11 @@ "psr/http-client-implementation": "1.0" }, "require-dev": { - "bamarni/composer-bin-plugin": "^1.8.1", + "bamarni/composer-bin-plugin": "^1.8.2", "ext-curl": "*", "php-http/client-integration-tests": "dev-master#2c025848417c1135031fdf9c728ee53d0a7ceaee as 3.0.999", "php-http/message-factory": "^1.1", - "phpunit/phpunit": "^8.5.29 || ^9.5.23", + "phpunit/phpunit": "^8.5.36 || ^9.6.15", "psr/log": "^1.1 || ^2.0 || ^3.0" }, "suggest": { @@ -1677,7 +1677,7 @@ ], "support": { "issues": "https://github.com/guzzle/guzzle/issues", - "source": "https://github.com/guzzle/guzzle/tree/7.8.0" + "source": "https://github.com/guzzle/guzzle/tree/7.8.1" }, "funding": [ { @@ -1693,28 +1693,28 @@ "type": "tidelift" } ], - "time": "2023-08-27T10:20:53+00:00" + "time": "2023-12-03T20:35:24+00:00" }, { "name": "guzzlehttp/promises", - "version": "2.0.1", + "version": "2.0.2", "source": { "type": "git", "url": "https://github.com/guzzle/promises.git", - "reference": "111166291a0f8130081195ac4556a5587d7f1b5d" + "reference": "bbff78d96034045e58e13dedd6ad91b5d1253223" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/111166291a0f8130081195ac4556a5587d7f1b5d", - "reference": "111166291a0f8130081195ac4556a5587d7f1b5d", + "url": "https://api.github.com/repos/guzzle/promises/zipball/bbff78d96034045e58e13dedd6ad91b5d1253223", + "reference": "bbff78d96034045e58e13dedd6ad91b5d1253223", "shasum": "" }, "require": { "php": "^7.2.5 || ^8.0" }, "require-dev": { - "bamarni/composer-bin-plugin": "^1.8.1", - "phpunit/phpunit": "^8.5.29 || ^9.5.23" + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.36 || ^9.6.15" }, "type": "library", "extra": { @@ -1760,7 +1760,7 @@ ], "support": { "issues": "https://github.com/guzzle/promises/issues", - "source": "https://github.com/guzzle/promises/tree/2.0.1" + "source": "https://github.com/guzzle/promises/tree/2.0.2" }, "funding": [ { @@ -1776,20 +1776,20 @@ "type": "tidelift" } ], - "time": "2023-08-03T15:11:55+00:00" + "time": "2023-12-03T20:19:20+00:00" }, { "name": "guzzlehttp/psr7", - "version": "2.6.1", + "version": "2.6.2", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "be45764272e8873c72dbe3d2edcfdfcc3bc9f727" + "reference": "45b30f99ac27b5ca93cb4831afe16285f57b8221" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/be45764272e8873c72dbe3d2edcfdfcc3bc9f727", - "reference": "be45764272e8873c72dbe3d2edcfdfcc3bc9f727", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/45b30f99ac27b5ca93cb4831afe16285f57b8221", + "reference": "45b30f99ac27b5ca93cb4831afe16285f57b8221", "shasum": "" }, "require": { @@ -1803,9 +1803,9 @@ "psr/http-message-implementation": "1.0" }, "require-dev": { - "bamarni/composer-bin-plugin": "^1.8.1", + "bamarni/composer-bin-plugin": "^1.8.2", "http-interop/http-factory-tests": "^0.9", - "phpunit/phpunit": "^8.5.29 || ^9.5.23" + "phpunit/phpunit": "^8.5.36 || ^9.6.15" }, "suggest": { "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" @@ -1876,7 +1876,7 @@ ], "support": { "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/2.6.1" + "source": "https://github.com/guzzle/psr7/tree/2.6.2" }, "funding": [ { @@ -1892,7 +1892,7 @@ "type": "tidelift" } ], - "time": "2023-08-27T10:13:57+00:00" + "time": "2023-12-03T20:05:35+00:00" }, { "name": "guzzlehttp/uri-template", From 4841f19945bcd0813d2abf6ba8181ef5a02f9391 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 4 Dec 2023 00:09:03 +0000 Subject: [PATCH 15/15] Update dependency phpunit/phpunit to v10.5.1 --- src/composer.json | 2 +- src/composer.lock | 40 ++++++++++++++++++++-------------------- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/src/composer.json b/src/composer.json index bf2de9584..1054f1db9 100644 --- a/src/composer.json +++ b/src/composer.json @@ -61,7 +61,7 @@ "require-dev": { "mockery/mockery": "1.6.6", "fakerphp/faker": "1.23.0", - "phpunit/phpunit": "10.4.2", + "phpunit/phpunit": "10.5.1", "kitloong/laravel-migrations-generator": "6.11.0", "symfony/css-selector": "6.4.0", "symfony/dom-crawler": "6.4.0", diff --git a/src/composer.lock b/src/composer.lock index debfe848b..0ec3d438f 100644 --- a/src/composer.lock +++ b/src/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "a73156087e789086ba16e9a1c31366bc", + "content-hash": "d5d72717864b95e4f765125b3079216f", "packages": [ { "name": "artesaos/seotools", @@ -10088,16 +10088,16 @@ }, { "name": "phpunit/php-code-coverage", - "version": "10.1.7", + "version": "10.1.9", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "355324ca4980b8916c18b9db29f3ef484078f26e" + "reference": "a56a9ab2f680246adcf3db43f38ddf1765774735" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/355324ca4980b8916c18b9db29f3ef484078f26e", - "reference": "355324ca4980b8916c18b9db29f3ef484078f26e", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/a56a9ab2f680246adcf3db43f38ddf1765774735", + "reference": "a56a9ab2f680246adcf3db43f38ddf1765774735", "shasum": "" }, "require": { @@ -10154,7 +10154,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.7" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.9" }, "funding": [ { @@ -10162,7 +10162,7 @@ "type": "github" } ], - "time": "2023-10-04T15:34:17+00:00" + "time": "2023-11-23T12:23:20+00:00" }, { "name": "phpunit/php-file-iterator", @@ -10409,16 +10409,16 @@ }, { "name": "phpunit/phpunit", - "version": "10.4.2", + "version": "10.5.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "cacd8b9dd224efa8eb28beb69004126c7ca1a1a1" + "reference": "d5d9dca6a902d05b34c4bcbc7c1636ce1dc25408" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/cacd8b9dd224efa8eb28beb69004126c7ca1a1a1", - "reference": "cacd8b9dd224efa8eb28beb69004126c7ca1a1a1", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/d5d9dca6a902d05b34c4bcbc7c1636ce1dc25408", + "reference": "d5d9dca6a902d05b34c4bcbc7c1636ce1dc25408", "shasum": "" }, "require": { @@ -10458,7 +10458,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "10.4-dev" + "dev-main": "10.5-dev" } }, "autoload": { @@ -10490,7 +10490,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/10.4.2" + "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.1" }, "funding": [ { @@ -10506,7 +10506,7 @@ "type": "tidelift" } ], - "time": "2023-10-26T07:21:45+00:00" + "time": "2023-12-01T16:57:05+00:00" }, { "name": "sebastian/cli-parser", @@ -11549,16 +11549,16 @@ }, { "name": "theseer/tokenizer", - "version": "1.2.1", + "version": "1.2.2", "source": { "type": "git", "url": "https://github.com/theseer/tokenizer.git", - "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e" + "reference": "b2ad5003ca10d4ee50a12da31de12a5774ba6b96" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/34a41e998c2183e22995f158c581e7b5e755ab9e", - "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/b2ad5003ca10d4ee50a12da31de12a5774ba6b96", + "reference": "b2ad5003ca10d4ee50a12da31de12a5774ba6b96", "shasum": "" }, "require": { @@ -11587,7 +11587,7 @@ "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", "support": { "issues": "https://github.com/theseer/tokenizer/issues", - "source": "https://github.com/theseer/tokenizer/tree/1.2.1" + "source": "https://github.com/theseer/tokenizer/tree/1.2.2" }, "funding": [ { @@ -11595,7 +11595,7 @@ "type": "github" } ], - "time": "2021-07-28T10:34:58+00:00" + "time": "2023-11-20T00:12:19+00:00" } ], "aliases": [],