From 2368ac2d2ce2fe20bd3ff9e49e3a7ffc58e3df73 Mon Sep 17 00:00:00 2001 From: Alan Neves Date: Mon, 31 Aug 2026 12:02:31 -0300 Subject: [PATCH 1/6] =?UTF-8?q?Implementa=20modelos=20de=20switch,=20reord?= =?UTF-8?q?ena=C3=A7=C3=A3o=20de=20rack=20e=20refatora=20equipamentos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Cria CRUD de Modelos de Switch (tabela, controller, request, seeder) - Refatora Equipamento: usa modelo_switch_id (FK) em vez de campos soltos - Adiciona campos tipo, ordem e comentario aos equipamentos - Implementa reordenação drag-and-drop de equipamentos e patch panels no rack - Ordena salas e racks alfabeticamente na tela do prédio - Simplifica Sala: remove vinculação de patch panel pela view de salas - Atualiza menu do tema para incluir Modelos de Switch --- .../Controllers/Api/EquipamentoController.php | 12 +- .../Controllers/EquipamentoController.php | 36 +- .../Controllers/ModeloSwitchController.php | 66 ++ app/Http/Controllers/PredioController.php | 4 +- app/Http/Controllers/RackController.php | 28 +- app/Http/Controllers/SalaController.php | 126 --- app/Http/Requests/EquipamentoRequest.php | 19 +- app/Http/Requests/ModeloSwitchRequest.php | 41 + app/Models/Equipamento.php | 54 +- app/Models/ModeloSwitch.php | 26 + app/Models/Rack.php | 49 +- app/Models/User.php | 1 - composer.lock | 969 +++++++++--------- config/laravel-usp-theme.php | 5 + ...20_085010_create_modelo_switches_table.php | 32 + ..._alter_equipamentos_nova_estrutura.php.php | 33 + ...08_20_085400_add_ordem_to_patch_panels.php | 28 + database/seeders/DatabaseSeeder.php | 1 + database/seeders/ModeloSwitchSeeder.php | 25 + routes/web.php | 23 +- 20 files changed, 904 insertions(+), 674 deletions(-) create mode 100644 app/Http/Controllers/ModeloSwitchController.php create mode 100644 app/Http/Requests/ModeloSwitchRequest.php create mode 100644 app/Models/ModeloSwitch.php create mode 100644 database/migrations/2026_08_20_085010_create_modelo_switches_table.php create mode 100644 database/migrations/2026_08_20_085226_alter_equipamentos_nova_estrutura.php.php create mode 100644 database/migrations/2026_08_20_085400_add_ordem_to_patch_panels.php create mode 100644 database/seeders/ModeloSwitchSeeder.php diff --git a/app/Http/Controllers/Api/EquipamentoController.php b/app/Http/Controllers/Api/EquipamentoController.php index e234119..a1f49af 100644 --- a/app/Http/Controllers/Api/EquipamentoController.php +++ b/app/Http/Controllers/Api/EquipamentoController.php @@ -17,15 +17,17 @@ public function store(Request $request) // Validação dos campos $validated = $request->validate([ - 'hostname' => 'required', - 'model' => 'required', + 'hostname' => 'required|string|max:255', 'ip' => 'required|ip', - 'qtde_portas' => 'required|integer|min:1|max:48', 'rack_id' => 'required|exists:racks,id', + 'modelo_switch_id' => 'required|exists:modelo_switches,id', + 'tipo' => 'required|in:A,W,C,V', + 'comentario' => 'nullable|string', 'user_id' => 'required|exists:users,id', - 'poe_type' => 'boolean' ]); + $validated['ordem'] = Equipamento::where('rack_id', $validated['rack_id'])->max('ordem') + 1; + $equipamento = Equipamento::updateOrCreate( ['hostname' => $validated['hostname']], $validated @@ -33,7 +35,7 @@ public function store(Request $request) return response()->json([ 'message' => 'Equipamento criado/atualizado com sucesso', - 'equipamento' => $equipamento + 'equipamento' => $equipamento->load('modeloSwitch') ], 201); } } diff --git a/app/Http/Controllers/EquipamentoController.php b/app/Http/Controllers/EquipamentoController.php index c6f6b2e..cba8eb3 100644 --- a/app/Http/Controllers/EquipamentoController.php +++ b/app/Http/Controllers/EquipamentoController.php @@ -3,6 +3,7 @@ namespace App\Http\Controllers; use App\Models\Equipamento; +use App\Models\ModeloSwitch; use App\Models\Predio; use App\Models\Rack; use App\Http\Requests\EquipamentoRequest; @@ -14,20 +15,24 @@ class EquipamentoController extends Controller public function create(Request $request) { Gate::authorize('admin'); - + return view('equipamentos.create', [ 'racks' => Rack::all(), - 'predios' => Predio::all(), + 'modelos' => ModeloSwitch::orderBy('fabricante')->orderBy('nome')->get(), 'rack_selecionado' => $request->input('rack_id') ]); } public function store(EquipamentoRequest $request) - { + { Gate::authorize('admin'); - - $equipamento = Equipamento::create($request->validated() + ['user_id' => auth()->id()]); - + + $data = $request->validated(); + $data['user_id'] = auth()->id(); + $data['ordem'] = Equipamento::where('rack_id', $request->rack_id)->max('ordem') + 1; + + $equipamento = Equipamento::create($data); + session()->flash('alert-success', 'Equipamento criado com sucesso!'); return redirect("/racks/{$equipamento->rack_id}"); } @@ -35,29 +40,26 @@ public function store(EquipamentoRequest $request) public function show(Equipamento $equipamento) { Gate::authorize('admin'); - - return view('equipamentos.show', [ - 'equipamento' => $equipamento - ]); + return view('equipamentos.show', ['equipamento' => $equipamento]); } public function edit(Equipamento $equipamento) { Gate::authorize('admin'); - + return view('equipamentos.edit', [ 'equipamento' => $equipamento, - 'predios' => Predio::all(), - 'racks' => Rack::all() + 'racks' => Rack::all(), + 'modelos' => ModeloSwitch::orderBy('fabricante')->orderBy('nome')->get(), ]); } public function update(EquipamentoRequest $request, Equipamento $equipamento) { Gate::authorize('admin'); - + $equipamento->update($request->validated() + ['user_id' => auth()->id()]); - + session()->flash('alert-success', 'Equipamento atualizado com sucesso!'); return redirect("/equipamentos/{$equipamento->id}"); } @@ -65,10 +67,10 @@ public function update(EquipamentoRequest $request, Equipamento $equipamento) public function destroy(Equipamento $equipamento) { Gate::authorize('admin'); - + $rack_id = $equipamento->rack_id; $equipamento->delete(); - + session()->flash('alert-success', 'Equipamento removido com sucesso!'); return redirect("/racks/{$rack_id}"); } diff --git a/app/Http/Controllers/ModeloSwitchController.php b/app/Http/Controllers/ModeloSwitchController.php new file mode 100644 index 0000000..adf1c0e --- /dev/null +++ b/app/Http/Controllers/ModeloSwitchController.php @@ -0,0 +1,66 @@ + ModeloSwitch::orderBy('fabricante')->orderBy('nome')->get(), + ]); + } + + public function create() + { + Gate::authorize('admin'); + return view('modelo-switches.create'); + } + + public function store(ModeloSwitchRequest $request) + { + Gate::authorize('admin'); + ModeloSwitch::create($request->validated() + ['user_id' => auth()->id()]); + session()->flash('alert-success', 'Modelo cadastrado com sucesso!'); + return redirect('/modelo-switches'); + } + + public function show(ModeloSwitch $modeloSwitch) + { + Gate::authorize('admin'); + return view('modelo-switches.show', ['modelo' => $modeloSwitch]); + } + + public function edit(ModeloSwitch $modeloSwitch) + { + Gate::authorize('admin'); + return view('modelo-switches.edit', ['modelo' => $modeloSwitch]); + } + + public function update(ModeloSwitchRequest $request, ModeloSwitch $modeloSwitch) + { + Gate::authorize('admin'); + $modeloSwitch->update($request->validated() + ['user_id' => auth()->id()]); + session()->flash('alert-success', 'Modelo atualizado com sucesso!'); + return redirect('/modelo-switches'); + } + + public function destroy(ModeloSwitch $modeloSwitch) + { + Gate::authorize('admin'); + + if ($modeloSwitch->equipamentos()->count() > 0) { + session()->flash('alert-danger', 'Não é possível remover: existem equipamentos usando este modelo.'); + return back(); + } + + $modeloSwitch->delete(); + session()->flash('alert-success', 'Modelo removido com sucesso!'); + return redirect('/modelo-switches'); + } +} \ No newline at end of file diff --git a/app/Http/Controllers/PredioController.php b/app/Http/Controllers/PredioController.php index 8960f7e..dceb46b 100644 --- a/app/Http/Controllers/PredioController.php +++ b/app/Http/Controllers/PredioController.php @@ -35,8 +35,8 @@ public function show(Predio $predio) Gate::authorize('admin'); return view('predios.show', [ 'predio' => $predio, - 'racks' => $predio->racks, - 'salas' => $predio->salas, + 'racks' => $predio->racks()->orderBy('nome')->get(), + 'salas' => $predio->salas()->orderBy('nome')->get(), ]); } diff --git a/app/Http/Controllers/RackController.php b/app/Http/Controllers/RackController.php index 7626a0c..b206bac 100644 --- a/app/Http/Controllers/RackController.php +++ b/app/Http/Controllers/RackController.php @@ -5,6 +5,8 @@ use Illuminate\Http\Request; use App\Models\Rack; use App\Models\Predio; +use App\Models\PatchPanel; +use App\Models\Equipamento; use App\Http\Requests\RackRequest; use Illuminate\Support\Facades\Gate; @@ -64,7 +66,7 @@ public function destroy(Rack $rack) { Gate::authorize('admin'); - if ($rack->patchPanels->isEmpty()) { + if ($rack->patchPanels->isEmpty() && $rack->equipamentos->isEmpty()){ $rack->delete(); session()->flash('alert-success', 'Rack deletado com sucesso'); } else { @@ -72,4 +74,28 @@ public function destroy(Rack $rack) } return redirect()->back(); } + + public function reordenar(Rack $rack, Request $request) + { + Gate::authorize('admin'); + + $request->validate([ + 'itens' => 'required|array', + 'itens.*.tipo' => 'required|in:equipamento,patchpanel', + 'itens.*.id' => 'required|integer', + 'itens.*.ordem' => 'required|integer', + ]); + + foreach ($request->itens as $item) { + if ($item['tipo'] === 'equipamento') { + Equipamento::where('id', $item['id'])->where('rack_id', $rack->id) + ->update(['ordem' => $item['ordem']]); + } else { + PatchPanel::where('id', $item['id'])->where('rack_id', $rack->id) + ->update(['ordem' => $item['ordem']]); + } + } + + return response()->json(['success' => true]); + } } diff --git a/app/Http/Controllers/SalaController.php b/app/Http/Controllers/SalaController.php index 4a75aae..6d73a12 100644 --- a/app/Http/Controllers/SalaController.php +++ b/app/Http/Controllers/SalaController.php @@ -73,132 +73,6 @@ public function update(SalaRequest $request, Sala $sala) return redirect("/salas/{$sala->id}"); } - public function selecionarRack(Sala $sala) - { - Gate::authorize('admin'); - $racks = $sala->predio->racks; - - return view('salas.selecionar-rack', [ - 'sala' => $sala, - 'racks' => $racks - ]); - } - - public function selecionarPatchPanel(Sala $sala, Rack $rack, Request $request) - { - Gate::authorize('admin'); - $patchPanelsDisponiveis = $rack->patchPanels() - ->withCount(['salasVinculadas as portas_ocupadas' => function($query) { - $query->select(\DB::raw('count(distinct porta)')); - }]) - ->get(); - - return view('salas.selecionar-patchpanel', [ - 'sala' => $sala, - 'rack' => $rack, - 'patchPanels' => $patchPanelsDisponiveis, - 'selectedPatchPanelId' => $request->patch_panel_id - ]); - } - - public function vincularPatchPanel(VincularPortaSalaRequest $request, Sala $sala) - { - Gate::authorize('admin'); - - $patchPanel = PatchPanel::findOrFail($request->patch_panel_id); - $portas = array_map('intval', $request->portas ?? []); - $tiposPorta = $request->tipos_porta ?? []; - - $portasOcupadas = $patchPanel->salasVinculadas() - ->whereIn('porta', $portas) - ->pluck('porta') - ->toArray(); - - $portasDisponiveis = array_diff($portas, $portasOcupadas); - - foreach ($portasDisponiveis as $porta) { - $dadosVinculo = [ - 'porta' => $porta, - 'user_id' => auth()->id(), - 'created_at' => now(), - 'updated_at' => now() - ]; - - // Só adiciona tipo_porta_id se foi selecionado para esta porta - if (!empty($tiposPorta[$porta])) { - $dadosVinculo['tipo_porta_id'] = $tiposPorta[$porta]; - } - - $sala->patchPanels()->attach($patchPanel->id, $dadosVinculo); - } - - session()->flash('alert-success', 'Portas vinculadas com sucesso!'); - return redirect("/salas/{$sala->id}"); - } - - public function desvincularPatchPanel(Sala $sala, PatchPanel $patchPanel, Request $request) - { - Gate::authorize('admin'); - $porta = $request->query('porta'); - - $sala->patchPanels() - ->wherePivot('porta', $porta) - ->where('patch_panel_id', $patchPanel->id) - ->detach($patchPanel->id); - - session()->flash('alert-success', 'Porta desvinculada com sucesso!'); - - return redirect("/salas/{$sala->id}"); - } - - public function editarTipoPorta(Sala $sala, PatchPanel $patchPanel, Request $request) - { - Gate::authorize('admin'); - $porta = $request->query('porta'); - - // Verificar se existe o vínculo - $vinculo = $sala->patchPanels() - ->wherePivot('porta', $porta) - ->where('patch_panel_id', $patchPanel->id) - ->first(); - - if (!$vinculo) { - session()->flash('alert-danger', 'Vínculo não encontrado!'); - return redirect("/salas/{$sala->id}"); - } - - return view('salas.editar-tipo-porta', [ - 'sala' => $sala, - 'patchPanel' => $patchPanel, - 'porta' => $porta, - 'tipoPortaAtual' => $vinculo->pivot->tipo_porta_id, - 'tipoPortas' => \App\Models\TipoPorta::all() - ]); - } - - public function atualizarTipoPorta(Request $request, Sala $sala, PatchPanel $patchPanel) - { - Gate::authorize('admin'); - $porta = $request->porta; - - // Validar a requisição - $request->validate([ - 'tipo_porta_id' => 'nullable|exists:tipo_portas,id' - ]); - - // Atualizar o tipo de porta no vínculo - $sala->patchPanels() - ->wherePivot('porta', $porta) - ->where('patch_panel_id', $patchPanel->id) - ->updateExistingPivot($patchPanel->id, [ - 'tipo_porta_id' => $request->tipo_porta_id, - 'updated_at' => now() - ]); - - session()->flash('alert-success', 'Tipo de porta atualizado com sucesso!'); - return redirect("/salas/{$sala->id}"); - } - public function destroy(Sala $sala) { Gate::authorize('admin'); diff --git a/app/Http/Requests/EquipamentoRequest.php b/app/Http/Requests/EquipamentoRequest.php index 32f75e5..3279dbe 100644 --- a/app/Http/Requests/EquipamentoRequest.php +++ b/app/Http/Requests/EquipamentoRequest.php @@ -25,11 +25,12 @@ public function rules(): array $rules = [ 'hostname' => 'required|string|max:255|unique:equipamentos,hostname,' . $equipamentoId, - 'model' => 'required|string|max:255', 'ip' => 'required|ip', - 'qtde_portas' => 'required|integer|min:1|max:48', 'rack_id' => 'required|exists:racks,id', - 'poe_type' => 'boolean' + 'modelo_switch_id' => 'required|exists:modelo_switches,id', + 'tipo' => 'required|in:A,W,C,V', + 'ordem' => 'nullable|integer|min:0', + 'comentario' => 'nullable|string', ]; return $rules; @@ -39,19 +40,13 @@ public function messages(): array { return [ 'hostname.required' => 'O hostname é obrigatório', - 'hostname.max' => 'O hostname não pode ter mais que 255 caracteres', 'hostname.unique' => 'Já existe um equipamento com este hostname', - 'model.required' => 'O modelo é obrigatório', - 'model.max' => 'O modelo não pode ter mais que 255 caracteres', 'ip.required' => 'O IP é obrigatório', 'ip.ip' => 'Informe um IP válido', - 'qtde_portas.required' => 'A quantidade de portas é obrigatória', - 'qtde_portas.integer' => 'A quantidade de portas deve ser um número inteiro', - 'qtde_portas.min' => 'A quantidade de portas deve ser pelo menos 1', - 'qtde_portas.max' => 'A quantidade de portas não pode ser maior que 48', 'rack_id.required' => 'Selecione um rack', - 'rack_id.exists' => 'Rack selecionado é inválido', - 'poe_type.boolean' => 'O campo PoE deve ser verdadeiro ou falso' + 'modelo_switch_id.required' => 'Selecione um modelo de switch', + 'tipo.required' => 'Selecione o tipo do equipamento', + 'tipo.in' => 'Tipo inválido', ]; } } diff --git a/app/Http/Requests/ModeloSwitchRequest.php b/app/Http/Requests/ModeloSwitchRequest.php new file mode 100644 index 0000000..61c4eda --- /dev/null +++ b/app/Http/Requests/ModeloSwitchRequest.php @@ -0,0 +1,41 @@ +|string> + */ + public function rules(): array + { + return [ + 'nome' => 'required|string|max:255', + 'fabricante' => 'required|string|max:255', + 'qtde_portas' => 'required|integer|min:1|max:96', + 'qtde_portas_poe' => 'nullable|integer|min:0|max:96', + ]; + } + + public function messages(): array + { + return [ + 'nome.required' => 'O nome do modelo é obrigatório', + 'fabricante.required' => 'O fabricante é obrigatório', + 'qtde_portas.required' => 'A quantidade de portas é obrigatória', + ]; + } +} diff --git a/app/Models/Equipamento.php b/app/Models/Equipamento.php index 1669e97..379266d 100644 --- a/app/Models/Equipamento.php +++ b/app/Models/Equipamento.php @@ -4,7 +4,6 @@ use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; -use App\Models\Porta; class Equipamento extends Model { @@ -12,16 +11,13 @@ class Equipamento extends Model protected $fillable = [ 'hostname', - 'model', 'ip', - 'qtde_portas', 'rack_id', + 'modelo_switch_id', 'user_id', - 'poe_type' - ]; - - protected $casts = [ - 'poe_type' => 'boolean' + 'tipo', + 'ordem', + 'comentario', ]; public function portas() @@ -34,8 +30,50 @@ public function rack() return $this->belongsTo(Rack::class); } + public function modeloSwitch() + { + return $this->belongsTo(ModeloSwitch::class); + } + public function user() { return $this->belongsTo(User::class); } + + public function getQtdePortasAttribute() + { + return $this->modeloSwitch?->qtde_portas ?? 0; + } + + public function getQtdePortasPoeAttribute() + { + return $this->modeloSwitch?->qtde_portas_poe ?? 0; + } + + public function getPoeTypeAttribute() + { + return ($this->modeloSwitch?->qtde_portas_poe ?? 0) > 0; + } + + public function getTipoLabelAttribute(): string + { + return match($this->tipo) { + 'A' => 'Acesso', + 'W' => 'Wireless', + 'C' => 'Câmera', + 'V' => 'VoIP', + default => 'Desconhecido', + }; + } + + public function getCorTipoAttribute(): string + { + return match($this->tipo) { + 'A' => 'primary', + 'W' => 'info', + 'C' => 'danger', + 'V' => 'success', + default => 'secondary', + }; + } } \ No newline at end of file diff --git a/app/Models/ModeloSwitch.php b/app/Models/ModeloSwitch.php new file mode 100644 index 0000000..d3946cc --- /dev/null +++ b/app/Models/ModeloSwitch.php @@ -0,0 +1,26 @@ +hasMany(Equipamento::class); + } + + public function user() + { + return $this->belongsTo(User::class); + } +} diff --git a/app/Models/Rack.php b/app/Models/Rack.php index 6e43243..6eafc72 100644 --- a/app/Models/Rack.php +++ b/app/Models/Rack.php @@ -6,11 +6,7 @@ class Rack extends Model { - protected $fillable = [ - 'nome', - 'predio_id', - 'user_id', - ]; + protected $fillable = ['nome', 'predio_id', 'user_id']; public function predio() { @@ -19,11 +15,48 @@ public function predio() public function patchPanels() { - return $this->hasMany(PatchPanel::class); + return $this->hasMany(PatchPanel::class)->orderBy('ordem'); } public function equipamentos() { - return $this->hasMany(Equipamento::class); + return $this->hasMany(Equipamento::class)->orderBy('ordem'); } -} + + public function itensVisualizacao(): array + { + $itens = []; + + foreach ($this->equipamentos()->with('modeloSwitch')->orderBy('ordem')->get() as $eq) { + $itens[] = [ + 'id' => $eq->id, + 'tipo_item' => 'equipamento', + 'nome' => $eq->hostname, + 'subtitulo' => $eq->modeloSwitch?->nome ?? 'Sem modelo', + 'ordem' => $eq->ordem, + 'cor' => $eq->cor_tipo, + 'tipo' => $eq->tipo, + 'url' => "/equipamentos/{$eq->id}", + 'icone' => 'fa-network-wired', + ]; + } + + foreach ($this->patchPanels()->orderBy('ordem')->get() as $pp) { + $itens[] = [ + 'id' => $pp->id, + 'tipo_item' => 'patchpanel', + 'nome' => $pp->nome, + 'subtitulo' => "{$pp->qtde_portas} portas", + 'ordem' => $pp->ordem, + 'cor' => 'warning', + 'tipo' => null, + 'url' => "/patch-panels/{$pp->id}", + 'icone' => 'fa-th', + ]; + } + + usort($itens, fn($a, $b) => $a['ordem'] <=> $b['ordem']); + + return $itens; + } +} \ No newline at end of file diff --git a/app/Models/User.php b/app/Models/User.php index 125ede6..0260745 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -13,7 +13,6 @@ class User extends Authenticatable { use \Spatie\Permission\Traits\HasRoles; use HasFactory, Notifiable, HasRoles, HasSenhaunica; - /** * The attributes that are mass assignable. * diff --git a/composer.lock b/composer.lock index ab68788..3241973 100644 --- a/composer.lock +++ b/composer.lock @@ -289,16 +289,16 @@ }, { "name": "doctrine/dbal", - "version": "4.4.3", + "version": "4.4.4", "source": { "type": "git", "url": "https://github.com/doctrine/dbal.git", - "reference": "61e730f1658814821a85f2402c945f3883407dec" + "reference": "fb9e0ffe15e1590e24dc61c0c0a23f9a33ee42ce" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/61e730f1658814821a85f2402c945f3883407dec", - "reference": "61e730f1658814821a85f2402c945f3883407dec", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/fb9e0ffe15e1590e24dc61c0c0a23f9a33ee42ce", + "reference": "fb9e0ffe15e1590e24dc61c0c0a23f9a33ee42ce", "shasum": "" }, "require": { @@ -375,7 +375,7 @@ ], "support": { "issues": "https://github.com/doctrine/dbal/issues", - "source": "https://github.com/doctrine/dbal/tree/4.4.3" + "source": "https://github.com/doctrine/dbal/tree/4.4.4" }, "funding": [ { @@ -391,7 +391,7 @@ "type": "tidelift" } ], - "time": "2026-03-20T08:52:12+00:00" + "time": "2026-07-21T14:34:40+00:00" }, { "name": "doctrine/deprecations", @@ -896,16 +896,16 @@ }, { "name": "firebase/php-jwt", - "version": "v7.0.5", + "version": "v7.1.0", "source": { "type": "git", - "url": "https://github.com/firebase/php-jwt.git", - "reference": "47ad26bab5e7c70ae8a6f08ed25ff83631121380" + "url": "https://github.com/googleapis/php-jwt.git", + "reference": "b374a5d1a4f1f67fadc2165cdb284645945e2fc0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/firebase/php-jwt/zipball/47ad26bab5e7c70ae8a6f08ed25ff83631121380", - "reference": "47ad26bab5e7c70ae8a6f08ed25ff83631121380", + "url": "https://api.github.com/repos/googleapis/php-jwt/zipball/b374a5d1a4f1f67fadc2165cdb284645945e2fc0", + "reference": "b374a5d1a4f1f67fadc2165cdb284645945e2fc0", "shasum": "" }, "require": { @@ -914,6 +914,7 @@ "require-dev": { "guzzlehttp/guzzle": "^7.4", "phpfastcache/phpfastcache": "^9.2", + "phpseclib/phpseclib": "~3.0", "phpspec/prophecy-phpunit": "^2.0", "phpunit/phpunit": "^9.5", "psr/cache": "^2.0||^3.0", @@ -922,7 +923,8 @@ }, "suggest": { "ext-sodium": "Support EdDSA (Ed25519) signatures", - "paragonie/sodium_compat": "Support EdDSA (Ed25519) signatures when libsodium is not present" + "paragonie/sodium_compat": "Support EdDSA (Ed25519) signatures when libsodium is not present", + "phpseclib/phpseclib": "Support PS256 (RSASSA-PSS) signatures" }, "type": "library", "autoload": { @@ -947,16 +949,16 @@ } ], "description": "A simple library to encode and decode JSON Web Tokens (JWT) in PHP. Should conform to the current spec.", - "homepage": "https://github.com/firebase/php-jwt", + "homepage": "https://github.com/googleapis/php-jwt", "keywords": [ "jwt", "php" ], "support": { - "issues": "https://github.com/firebase/php-jwt/issues", - "source": "https://github.com/firebase/php-jwt/tree/v7.0.5" + "issues": "https://github.com/googleapis/php-jwt/issues", + "source": "https://github.com/googleapis/php-jwt/tree/v7.1.0" }, - "time": "2026-04-01T20:38:03+00:00" + "time": "2026-06-11T17:54:14+00:00" }, { "name": "fruitcake/php-cors", @@ -1031,24 +1033,24 @@ }, { "name": "graham-campbell/result-type", - "version": "v1.1.4", + "version": "v1.2.0", "source": { "type": "git", "url": "https://github.com/GrahamCampbell/Result-Type.git", - "reference": "e01f4a821471308ba86aa202fed6698b6b695e3b" + "reference": "adccca3324eece92ca35463648c12b9e6293c05b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/e01f4a821471308ba86aa202fed6698b6b695e3b", - "reference": "e01f4a821471308ba86aa202fed6698b6b695e3b", + "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/adccca3324eece92ca35463648c12b9e6293c05b", + "reference": "adccca3324eece92ca35463648c12b9e6293c05b", "shasum": "" }, "require": { "php": "^7.2.5 || ^8.0", - "phpoption/phpoption": "^1.9.5" + "phpoption/phpoption": "^1.10" }, "require-dev": { - "phpunit/phpunit": "^8.5.41 || ^9.6.22 || ^10.5.45 || ^11.5.7" + "phpunit/phpunit": "^8.5.52 || ^9.6.34 || ^10.5.63 || ^11.5.55 || ^12.5.14" }, "type": "library", "autoload": { @@ -1077,7 +1079,7 @@ ], "support": { "issues": "https://github.com/GrahamCampbell/Result-Type/issues", - "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.1.4" + "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.2.0" }, "funding": [ { @@ -1089,29 +1091,30 @@ "type": "tidelift" } ], - "time": "2025-12-27T19:43:20+00:00" + "time": "2026-08-24T09:06:52+00:00" }, { "name": "guzzlehttp/guzzle", - "version": "7.10.0", + "version": "7.15.5", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "b51ac707cfa420b7bfd4e4d5e510ba8008e822b4" + "reference": "ee80339fd9177ba44c49cdb653ff02a4d1106b9a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/b51ac707cfa420b7bfd4e4d5e510ba8008e822b4", - "reference": "b51ac707cfa420b7bfd4e4d5e510ba8008e822b4", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/ee80339fd9177ba44c49cdb653ff02a4d1106b9a", + "reference": "ee80339fd9177ba44c49cdb653ff02a4d1106b9a", "shasum": "" }, "require": { "ext-json": "*", - "guzzlehttp/promises": "^2.3", - "guzzlehttp/psr7": "^2.8", + "guzzlehttp/promises": "^2.5.3", + "guzzlehttp/psr7": "^2.13.1", "php": "^7.2.5 || ^8.0", "psr/http-client": "^1.0", - "symfony/deprecation-contracts": "^2.2 || ^3.0" + "symfony/deprecation-contracts": "^2.5 || ^3.0", + "symfony/polyfill-php80": "^1.25" }, "provide": { "psr/http-client-implementation": "1.0" @@ -1119,9 +1122,10 @@ "require-dev": { "bamarni/composer-bin-plugin": "^1.8.2", "ext-curl": "*", - "guzzle/client-integration-tests": "3.0.2", + "guzzle/client-integration-tests": "3.0.3", + "guzzlehttp/test-server": "^0.7", "php-http/message-factory": "^1.1", - "phpunit/phpunit": "^8.5.39 || ^9.6.20", + "phpunit/phpunit": "^8.5.52 || ^9.6.34", "psr/log": "^1.1 || ^2.0 || ^3.0" }, "suggest": { @@ -1199,7 +1203,7 @@ ], "support": { "issues": "https://github.com/guzzle/guzzle/issues", - "source": "https://github.com/guzzle/guzzle/tree/7.10.0" + "source": "https://github.com/guzzle/guzzle/tree/7.15.5" }, "funding": [ { @@ -1215,28 +1219,29 @@ "type": "tidelift" } ], - "time": "2025-08-23T22:36:01+00:00" + "time": "2026-08-24T09:21:06+00:00" }, { "name": "guzzlehttp/promises", - "version": "2.3.0", + "version": "2.5.3", "source": { "type": "git", "url": "https://github.com/guzzle/promises.git", - "reference": "481557b130ef3790cf82b713667b43030dc9c957" + "reference": "cde49999552d185d64715fe9c1f77a2aadd2f9f1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/481557b130ef3790cf82b713667b43030dc9c957", - "reference": "481557b130ef3790cf82b713667b43030dc9c957", + "url": "https://api.github.com/repos/guzzle/promises/zipball/cde49999552d185d64715fe9c1f77a2aadd2f9f1", + "reference": "cde49999552d185d64715fe9c1f77a2aadd2f9f1", "shasum": "" }, "require": { - "php": "^7.2.5 || ^8.0" + "php": "^7.2.5 || ^8.0", + "symfony/deprecation-contracts": "^2.5 || ^3.0" }, "require-dev": { "bamarni/composer-bin-plugin": "^1.8.2", - "phpunit/phpunit": "^8.5.44 || ^9.6.25" + "phpunit/phpunit": "^8.5.52 || ^9.6.34" }, "type": "library", "extra": { @@ -1282,7 +1287,7 @@ ], "support": { "issues": "https://github.com/guzzle/promises/issues", - "source": "https://github.com/guzzle/promises/tree/2.3.0" + "source": "https://github.com/guzzle/promises/tree/2.5.3" }, "funding": [ { @@ -1298,27 +1303,29 @@ "type": "tidelift" } ], - "time": "2025-08-22T14:34:08+00:00" + "time": "2026-08-24T09:11:28+00:00" }, { "name": "guzzlehttp/psr7", - "version": "2.9.0", + "version": "2.13.1", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "7d0ed42f28e42d61352a7a79de682e5e67fec884" + "reference": "95e7828100de18b4e269fb1703be530082d5166d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/7d0ed42f28e42d61352a7a79de682e5e67fec884", - "reference": "7d0ed42f28e42d61352a7a79de682e5e67fec884", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/95e7828100de18b4e269fb1703be530082d5166d", + "reference": "95e7828100de18b4e269fb1703be530082d5166d", "shasum": "" }, "require": { "php": "^7.2.5 || ^8.0", "psr/http-factory": "^1.0", "psr/http-message": "^1.1 || ^2.0", - "ralouphie/getallheaders": "^3.0" + "ralouphie/getallheaders": "^3.0", + "symfony/deprecation-contracts": "^2.5 || ^3.0", + "symfony/polyfill-php80": "^1.25" }, "provide": { "psr/http-factory-implementation": "1.0", @@ -1326,9 +1333,9 @@ }, "require-dev": { "bamarni/composer-bin-plugin": "^1.8.2", - "http-interop/http-factory-tests": "0.9.0", + "http-interop/http-factory-tests": "1.1.0", "jshttp/mime-db": "1.54.0.1", - "phpunit/phpunit": "^8.5.44 || ^9.6.25" + "phpunit/phpunit": "^8.5.52 || ^9.6.34" }, "suggest": { "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" @@ -1399,7 +1406,7 @@ ], "support": { "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/2.9.0" + "source": "https://github.com/guzzle/psr7/tree/2.13.1" }, "funding": [ { @@ -1415,29 +1422,29 @@ "type": "tidelift" } ], - "time": "2026-03-10T16:41:02+00:00" + "time": "2026-08-24T09:13:11+00:00" }, { "name": "guzzlehttp/uri-template", - "version": "v1.0.5", + "version": "v1.0.11", "source": { "type": "git", "url": "https://github.com/guzzle/uri-template.git", - "reference": "4f4bbd4e7172148801e76e3decc1e559bdee34e1" + "reference": "d0058dccf4299d70c3d9da3378b8908b32780368" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/uri-template/zipball/4f4bbd4e7172148801e76e3decc1e559bdee34e1", - "reference": "4f4bbd4e7172148801e76e3decc1e559bdee34e1", + "url": "https://api.github.com/repos/guzzle/uri-template/zipball/d0058dccf4299d70c3d9da3378b8908b32780368", + "reference": "d0058dccf4299d70c3d9da3378b8908b32780368", "shasum": "" }, "require": { "php": "^7.2.5 || ^8.0", - "symfony/polyfill-php80": "^1.24" + "symfony/polyfill-php80": "^1.25" }, "require-dev": { "bamarni/composer-bin-plugin": "^1.8.2", - "phpunit/phpunit": "^8.5.44 || ^9.6.25", + "phpunit/phpunit": "^8.5.52 || ^9.6.34", "uri-template/tests": "1.0.0" }, "type": "library", @@ -1485,7 +1492,7 @@ ], "support": { "issues": "https://github.com/guzzle/uri-template/issues", - "source": "https://github.com/guzzle/uri-template/tree/v1.0.5" + "source": "https://github.com/guzzle/uri-template/tree/v1.0.11" }, "funding": [ { @@ -1501,7 +1508,7 @@ "type": "tidelift" } ], - "time": "2025-08-22T14:27:06+00:00" + "time": "2026-08-24T09:15:32+00:00" }, { "name": "kyslik/column-sortable", @@ -1566,16 +1573,16 @@ }, { "name": "laravel/framework", - "version": "v12.56.0", + "version": "v12.67.0", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "dac16d424b59debb2273910dde88eb7050a2a709" + "reference": "fe2cdaba052cbb9f350761ccefc7ac221cbdf0b5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/dac16d424b59debb2273910dde88eb7050a2a709", - "reference": "dac16d424b59debb2273910dde88eb7050a2a709", + "url": "https://api.github.com/repos/laravel/framework/zipball/fe2cdaba052cbb9f350761ccefc7ac221cbdf0b5", + "reference": "fe2cdaba052cbb9f350761ccefc7ac221cbdf0b5", "shasum": "" }, "require": { @@ -1616,8 +1623,8 @@ "symfony/mailer": "^7.2.0", "symfony/mime": "^7.2.0", "symfony/polyfill-php83": "^1.33", - "symfony/polyfill-php84": "^1.33", - "symfony/polyfill-php85": "^1.33", + "symfony/polyfill-php84": "^1.34", + "symfony/polyfill-php85": "^1.34", "symfony/process": "^7.2.0", "symfony/routing": "^7.2.0", "symfony/uid": "^7.2.0", @@ -1784,20 +1791,20 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2026-03-26T14:51:54+00:00" + "time": "2026-08-18T13:37:47+00:00" }, { "name": "laravel/prompts", - "version": "v0.3.16", + "version": "v0.3.23", "source": { "type": "git", "url": "https://github.com/laravel/prompts.git", - "reference": "11e7d5f93803a2190b00e145142cb00a33d17ad2" + "reference": "b7b4c35e5bc47450f6b6238c6cc9c47ba19b2221" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/prompts/zipball/11e7d5f93803a2190b00e145142cb00a33d17ad2", - "reference": "11e7d5f93803a2190b00e145142cb00a33d17ad2", + "url": "https://api.github.com/repos/laravel/prompts/zipball/b7b4c35e5bc47450f6b6238c6cc9c47ba19b2221", + "reference": "b7b4c35e5bc47450f6b6238c6cc9c47ba19b2221", "shasum": "" }, "require": { @@ -1841,22 +1848,22 @@ "description": "Add beautiful and user-friendly forms to your command-line applications.", "support": { "issues": "https://github.com/laravel/prompts/issues", - "source": "https://github.com/laravel/prompts/tree/v0.3.16" + "source": "https://github.com/laravel/prompts/tree/v0.3.23" }, - "time": "2026-03-23T14:35:33+00:00" + "time": "2026-08-11T18:58:24+00:00" }, { "name": "laravel/serializable-closure", - "version": "v2.0.10", + "version": "v2.0.15", "source": { "type": "git", "url": "https://github.com/laravel/serializable-closure.git", - "reference": "870fc81d2f879903dfc5b60bf8a0f94a1609e669" + "reference": "dccd8bcb851bb03fcc005df650b708b57cc52661" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/870fc81d2f879903dfc5b60bf8a0f94a1609e669", - "reference": "870fc81d2f879903dfc5b60bf8a0f94a1609e669", + "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/dccd8bcb851bb03fcc005df650b708b57cc52661", + "reference": "dccd8bcb851bb03fcc005df650b708b57cc52661", "shasum": "" }, "require": { @@ -1904,20 +1911,20 @@ "issues": "https://github.com/laravel/serializable-closure/issues", "source": "https://github.com/laravel/serializable-closure" }, - "time": "2026-02-20T19:59:49+00:00" + "time": "2026-07-21T16:49:22+00:00" }, { "name": "laravel/socialite", - "version": "v5.26.1", + "version": "v5.30.0", "source": { "type": "git", "url": "https://github.com/laravel/socialite.git", - "reference": "db6ec2ee967b7f06412c3a0cf1daaf072f4752a4" + "reference": "caf714f55d51ab0d914b40033d8b0f489d6219cc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/socialite/zipball/db6ec2ee967b7f06412c3a0cf1daaf072f4752a4", - "reference": "db6ec2ee967b7f06412c3a0cf1daaf072f4752a4", + "url": "https://api.github.com/repos/laravel/socialite/zipball/caf714f55d51ab0d914b40033d8b0f489d6219cc", + "reference": "caf714f55d51ab0d914b40033d8b0f489d6219cc", "shasum": "" }, "require": { @@ -1976,7 +1983,7 @@ "issues": "https://github.com/laravel/socialite/issues", "source": "https://github.com/laravel/socialite" }, - "time": "2026-03-29T14:50:53+00:00" + "time": "2026-08-13T23:01:33+00:00" }, { "name": "laravel/tinker", @@ -2046,16 +2053,16 @@ }, { "name": "league/commonmark", - "version": "2.8.2", + "version": "2.10.0", "source": { "type": "git", "url": "https://github.com/thephpleague/commonmark.git", - "reference": "59fb075d2101740c337c7216e3f32b36c204218b" + "reference": "d2d1aa8b35e072966c89bc0c66cf926e56767dc4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/59fb075d2101740c337c7216e3f32b36c204218b", - "reference": "59fb075d2101740c337c7216e3f32b36c204218b", + "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/d2d1aa8b35e072966c89bc0c66cf926e56767dc4", + "reference": "d2d1aa8b35e072966c89bc0c66cf926e56767dc4", "shasum": "" }, "require": { @@ -2077,8 +2084,8 @@ "github/gfm": "0.29.0", "michelf/php-markdown": "^1.4 || ^2.0", "nyholm/psr7": "^1.5", - "phpstan/phpstan": "^1.8.2", - "phpunit/phpunit": "^9.5.21 || ^10.5.9 || ^11.0.0", + "phpstan/phpstan": "^2.0.0", + "phpunit/phpunit": "^9.5.21 || ^10.5.9 || ^11.0.0 || ^12.0.0 || ^13.0.0", "scrutinizer/ocular": "^1.8.1", "symfony/finder": "^5.3 | ^6.0 | ^7.0 || ^8.0", "symfony/process": "^5.4 | ^6.0 | ^7.0 || ^8.0", @@ -2092,7 +2099,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "2.9-dev" + "dev-main": "2.11-dev" } }, "autoload": { @@ -2149,7 +2156,7 @@ "type": "tidelift" } ], - "time": "2026-03-19T13:16:38+00:00" + "time": "2026-08-11T16:06:25+00:00" }, { "name": "league/config", @@ -2235,16 +2242,16 @@ }, { "name": "league/flysystem", - "version": "3.33.0", + "version": "3.35.3", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem.git", - "reference": "570b8871e0ce693764434b29154c54b434905350" + "reference": "5fc8404762179ae514678487b23494fd69b2309c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/570b8871e0ce693764434b29154c54b434905350", - "reference": "570b8871e0ce693764434b29154c54b434905350", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/5fc8404762179ae514678487b23494fd69b2309c", + "reference": "5fc8404762179ae514678487b23494fd69b2309c", "shasum": "" }, "require": { @@ -2312,22 +2319,22 @@ ], "support": { "issues": "https://github.com/thephpleague/flysystem/issues", - "source": "https://github.com/thephpleague/flysystem/tree/3.33.0" + "source": "https://github.com/thephpleague/flysystem/tree/3.35.3" }, - "time": "2026-03-25T07:59:30+00:00" + "time": "2026-08-22T12:55:54+00:00" }, { "name": "league/flysystem-local", - "version": "3.31.0", + "version": "3.35.3", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem-local.git", - "reference": "2f669db18a4c20c755c2bb7d3a7b0b2340488079" + "reference": "a099b24dce160f3b2239043d13d47c4a1a214ea4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/2f669db18a4c20c755c2bb7d3a7b0b2340488079", - "reference": "2f669db18a4c20c755c2bb7d3a7b0b2340488079", + "url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/a099b24dce160f3b2239043d13d47c4a1a214ea4", + "reference": "a099b24dce160f3b2239043d13d47c4a1a214ea4", "shasum": "" }, "require": { @@ -2361,22 +2368,22 @@ "local" ], "support": { - "source": "https://github.com/thephpleague/flysystem-local/tree/3.31.0" + "source": "https://github.com/thephpleague/flysystem-local/tree/3.35.3" }, - "time": "2026-01-23T15:30:45+00:00" + "time": "2026-08-12T13:29:21+00:00" }, { "name": "league/mime-type-detection", - "version": "1.16.0", + "version": "1.17.0", "source": { "type": "git", "url": "https://github.com/thephpleague/mime-type-detection.git", - "reference": "2d6702ff215bf922936ccc1ad31007edc76451b9" + "reference": "f5f47eff7c48ed1003069a2ca67f316fb4021c76" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/2d6702ff215bf922936ccc1ad31007edc76451b9", - "reference": "2d6702ff215bf922936ccc1ad31007edc76451b9", + "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/f5f47eff7c48ed1003069a2ca67f316fb4021c76", + "reference": "f5f47eff7c48ed1003069a2ca67f316fb4021c76", "shasum": "" }, "require": { @@ -2386,7 +2393,7 @@ "require-dev": { "friendsofphp/php-cs-fixer": "^3.2", "phpstan/phpstan": "^0.12.68", - "phpunit/phpunit": "^8.5.8 || ^9.3 || ^10.0" + "phpunit/phpunit": "^8.5.8 || ^9.3 || ^10.0 || ^11.0 || ^12.0" }, "type": "library", "autoload": { @@ -2407,7 +2414,7 @@ "description": "Mime-type detection for Flysystem", "support": { "issues": "https://github.com/thephpleague/mime-type-detection/issues", - "source": "https://github.com/thephpleague/mime-type-detection/tree/1.16.0" + "source": "https://github.com/thephpleague/mime-type-detection/tree/1.17.0" }, "funding": [ { @@ -2419,7 +2426,7 @@ "type": "tidelift" } ], - "time": "2024-09-21T08:32:55+00:00" + "time": "2026-07-09T11:49:27+00:00" }, { "name": "league/oauth1-client", @@ -2851,16 +2858,16 @@ }, { "name": "nesbot/carbon", - "version": "3.11.3", + "version": "3.13.2", "source": { "type": "git", "url": "https://github.com/CarbonPHP/carbon.git", - "reference": "6a7e652845bb018c668220c2a545aded8594fbbf" + "reference": "a1c54919f5fff9800cd03c32bd01defd5a4061cb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/6a7e652845bb018c668220c2a545aded8594fbbf", - "reference": "6a7e652845bb018c668220c2a545aded8594fbbf", + "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/a1c54919f5fff9800cd03c32bd01defd5a4061cb", + "reference": "a1c54919f5fff9800cd03c32bd01defd5a4061cb", "shasum": "" }, "require": { @@ -2952,20 +2959,20 @@ "type": "tidelift" } ], - "time": "2026-03-11T17:23:39+00:00" + "time": "2026-08-08T11:40:35+00:00" }, { "name": "nette/schema", - "version": "v1.3.5", + "version": "v1.3.6", "source": { "type": "git", "url": "https://github.com/nette/schema.git", - "reference": "f0ab1a3cda782dbc5da270d28545236aa80c4002" + "reference": "c54350438cd6914616f790a49cb424605f421562" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nette/schema/zipball/f0ab1a3cda782dbc5da270d28545236aa80c4002", - "reference": "f0ab1a3cda782dbc5da270d28545236aa80c4002", + "url": "https://api.github.com/repos/nette/schema/zipball/c54350438cd6914616f790a49cb424605f421562", + "reference": "c54350438cd6914616f790a49cb424605f421562", "shasum": "" }, "require": { @@ -3017,22 +3024,22 @@ ], "support": { "issues": "https://github.com/nette/schema/issues", - "source": "https://github.com/nette/schema/tree/v1.3.5" + "source": "https://github.com/nette/schema/tree/v1.3.6" }, - "time": "2026-02-23T03:47:12+00:00" + "time": "2026-08-16T21:58:41+00:00" }, { "name": "nette/utils", - "version": "v4.1.3", + "version": "v4.1.5", "source": { "type": "git", "url": "https://github.com/nette/utils.git", - "reference": "bb3ea637e3d131d72acc033cfc2746ee893349fe" + "reference": "b043439dbdf954e6c28b5ea7e34b0100f83165e0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nette/utils/zipball/bb3ea637e3d131d72acc033cfc2746ee893349fe", - "reference": "bb3ea637e3d131d72acc033cfc2746ee893349fe", + "url": "https://api.github.com/repos/nette/utils/zipball/b043439dbdf954e6c28b5ea7e34b0100f83165e0", + "reference": "b043439dbdf954e6c28b5ea7e34b0100f83165e0", "shasum": "" }, "require": { @@ -3052,7 +3059,7 @@ }, "suggest": { "ext-gd": "to use Image", - "ext-iconv": "to use Strings::webalize(), toAscii(), chr() and reverse()", + "ext-iconv": "to use Strings::chr(), ord() and reverse()", "ext-intl": "to use Strings::webalize(), toAscii(), normalize() and compare()", "ext-json": "to use Nette\\Utils\\Json", "ext-mbstring": "to use Strings::lower() etc...", @@ -3108,26 +3115,25 @@ ], "support": { "issues": "https://github.com/nette/utils/issues", - "source": "https://github.com/nette/utils/tree/v4.1.3" + "source": "https://github.com/nette/utils/tree/v4.1.5" }, - "time": "2026-02-13T03:05:33+00:00" + "time": "2026-07-17T23:02:45+00:00" }, { "name": "nikic/php-parser", - "version": "v5.7.0", + "version": "v5.8.0", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "dca41cd15c2ac9d055ad70dbfd011130757d1f82" + "reference": "044a6a392ff8ad0d61f14370a5fbbd0a0107152f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/dca41cd15c2ac9d055ad70dbfd011130757d1f82", - "reference": "dca41cd15c2ac9d055ad70dbfd011130757d1f82", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/044a6a392ff8ad0d61f14370a5fbbd0a0107152f", + "reference": "044a6a392ff8ad0d61f14370a5fbbd0a0107152f", "shasum": "" }, "require": { - "ext-ctype": "*", "ext-json": "*", "ext-tokenizer": "*", "php": ">=7.4" @@ -3166,9 +3172,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v5.7.0" + "source": "https://github.com/nikic/PHP-Parser/tree/v5.8.0" }, - "time": "2025-12-06T11:56:16+00:00" + "time": "2026-07-04T14:30:18+00:00" }, { "name": "nunomaduro/termwind", @@ -3378,16 +3384,16 @@ }, { "name": "phpoption/phpoption", - "version": "1.9.5", + "version": "1.10.0", "source": { "type": "git", "url": "https://github.com/schmittjoh/php-option.git", - "reference": "75365b91986c2405cf5e1e012c5595cd487a98be" + "reference": "67b192b6a42ec03944b972d6e633ddec78ad2c6d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/75365b91986c2405cf5e1e012c5595cd487a98be", - "reference": "75365b91986c2405cf5e1e012c5595cd487a98be", + "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/67b192b6a42ec03944b972d6e633ddec78ad2c6d", + "reference": "67b192b6a42ec03944b972d6e633ddec78ad2c6d", "shasum": "" }, "require": { @@ -3395,7 +3401,7 @@ }, "require-dev": { "bamarni/composer-bin-plugin": "^1.8.2", - "phpunit/phpunit": "^8.5.44 || ^9.6.25 || ^10.5.53 || ^11.5.34" + "phpunit/phpunit": "^8.5.54 || ^9.6.36 || ^10.5.64 || ^11.5.56 || ^12.5.33" }, "type": "library", "extra": { @@ -3437,7 +3443,7 @@ ], "support": { "issues": "https://github.com/schmittjoh/php-option/issues", - "source": "https://github.com/schmittjoh/php-option/tree/1.9.5" + "source": "https://github.com/schmittjoh/php-option/tree/1.10.0" }, "funding": [ { @@ -3449,20 +3455,20 @@ "type": "tidelift" } ], - "time": "2025-12-27T19:41:33+00:00" + "time": "2026-08-24T00:54:40+00:00" }, { "name": "phpseclib/phpseclib", - "version": "3.0.50", + "version": "3.0.56", "source": { "type": "git", "url": "https://github.com/phpseclib/phpseclib.git", - "reference": "aa6ad8321ed103dc3624fb600a25b66ebf78ec7b" + "reference": "7adbbe38cde25e2df2116dbf2673c407e24fa305" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/aa6ad8321ed103dc3624fb600a25b66ebf78ec7b", - "reference": "aa6ad8321ed103dc3624fb600a25b66ebf78ec7b", + "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/7adbbe38cde25e2df2116dbf2673c407e24fa305", + "reference": "7adbbe38cde25e2df2116dbf2673c407e24fa305", "shasum": "" }, "require": { @@ -3543,7 +3549,7 @@ ], "support": { "issues": "https://github.com/phpseclib/phpseclib/issues", - "source": "https://github.com/phpseclib/phpseclib/tree/3.0.50" + "source": "https://github.com/phpseclib/phpseclib/tree/3.0.56" }, "funding": [ { @@ -3559,7 +3565,7 @@ "type": "tidelift" } ], - "time": "2026-03-19T02:57:58+00:00" + "time": "2026-08-03T04:36:50+00:00" }, { "name": "psr/cache", @@ -4024,16 +4030,16 @@ }, { "name": "psy/psysh", - "version": "v0.12.22", + "version": "v0.12.24", "source": { "type": "git", "url": "https://github.com/bobthecow/psysh.git", - "reference": "3be75d5b9244936dd4ac62ade2bfb004d13acf0f" + "reference": "ca0fdcf8a7617afa3adfdf1b5fef573dffb69ca1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/bobthecow/psysh/zipball/3be75d5b9244936dd4ac62ade2bfb004d13acf0f", - "reference": "3be75d5b9244936dd4ac62ade2bfb004d13acf0f", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/ca0fdcf8a7617afa3adfdf1b5fef573dffb69ca1", + "reference": "ca0fdcf8a7617afa3adfdf1b5fef573dffb69ca1", "shasum": "" }, "require": { @@ -4097,9 +4103,9 @@ ], "support": { "issues": "https://github.com/bobthecow/psysh/issues", - "source": "https://github.com/bobthecow/psysh/tree/v0.12.22" + "source": "https://github.com/bobthecow/psysh/tree/v0.12.24" }, - "time": "2026-03-22T23:03:24+00:00" + "time": "2026-06-29T15:41:09+00:00" }, { "name": "ralouphie/getallheaders", @@ -4223,20 +4229,20 @@ }, { "name": "ramsey/uuid", - "version": "4.9.2", + "version": "4.9.3", "source": { "type": "git", "url": "https://github.com/ramsey/uuid.git", - "reference": "8429c78ca35a09f27565311b98101e2826affde0" + "reference": "1df15849d00943a67d677dc9cfd80795f038c9f8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ramsey/uuid/zipball/8429c78ca35a09f27565311b98101e2826affde0", - "reference": "8429c78ca35a09f27565311b98101e2826affde0", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/1df15849d00943a67d677dc9cfd80795f038c9f8", + "reference": "1df15849d00943a67d677dc9cfd80795f038c9f8", "shasum": "" }, "require": { - "brick/math": "^0.8.16 || ^0.9 || ^0.10 || ^0.11 || ^0.12 || ^0.13 || ^0.14", + "brick/math": ">=0.8.16 <=0.18", "php": "^8.0", "ramsey/collection": "^1.2 || ^2.0" }, @@ -4295,9 +4301,9 @@ ], "support": { "issues": "https://github.com/ramsey/uuid/issues", - "source": "https://github.com/ramsey/uuid/tree/4.9.2" + "source": "https://github.com/ramsey/uuid/tree/4.9.3" }, - "time": "2025-12-14T04:43:48+00:00" + "time": "2026-06-18T03:57:49+00:00" }, { "name": "sabberworm/php-css-parser", @@ -4381,26 +4387,26 @@ }, { "name": "socialiteproviders/manager", - "version": "4.9.2", + "version": "4.10.0", "source": { "type": "git", "url": "https://github.com/SocialiteProviders/Manager.git", - "reference": "35372dc62787e61e91cfec73f45fd5d5ae0f8891" + "reference": "65ad770276875682e246e5435566146bf0baebf2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/SocialiteProviders/Manager/zipball/35372dc62787e61e91cfec73f45fd5d5ae0f8891", - "reference": "35372dc62787e61e91cfec73f45fd5d5ae0f8891", + "url": "https://api.github.com/repos/SocialiteProviders/Manager/zipball/65ad770276875682e246e5435566146bf0baebf2", + "reference": "65ad770276875682e246e5435566146bf0baebf2", "shasum": "" }, "require": { - "illuminate/support": "^11.0 || ^12.0 || ^13.0", - "laravel/socialite": "^5.5", - "php": "^8.2" + "illuminate/support": "^12.0 || ^13.0", + "laravel/socialite": "^5.29", + "php": "^8.3" }, "require-dev": { - "mockery/mockery": "^1.2", - "phpunit/phpunit": "^9.0" + "mockery/mockery": "^1.6", + "phpunit/phpunit": "^12.5" }, "type": "library", "extra": { @@ -4451,20 +4457,20 @@ "issues": "https://github.com/socialiteproviders/manager/issues", "source": "https://github.com/socialiteproviders/manager" }, - "time": "2026-03-18T22:13:24+00:00" + "time": "2026-08-16T00:16:22+00:00" }, { "name": "spatie/laravel-package-tools", - "version": "1.93.0", + "version": "1.93.1", "source": { "type": "git", "url": "https://github.com/spatie/laravel-package-tools.git", - "reference": "0d097bce95b2bf6802fb1d83e1e753b0f5a948e7" + "reference": "d5552849801f2642aea710557463234b59ef65eb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-package-tools/zipball/0d097bce95b2bf6802fb1d83e1e753b0f5a948e7", - "reference": "0d097bce95b2bf6802fb1d83e1e753b0f5a948e7", + "url": "https://api.github.com/repos/spatie/laravel-package-tools/zipball/d5552849801f2642aea710557463234b59ef65eb", + "reference": "d5552849801f2642aea710557463234b59ef65eb", "shasum": "" }, "require": { @@ -4504,7 +4510,7 @@ ], "support": { "issues": "https://github.com/spatie/laravel-package-tools/issues", - "source": "https://github.com/spatie/laravel-package-tools/tree/1.93.0" + "source": "https://github.com/spatie/laravel-package-tools/tree/1.93.1" }, "funding": [ { @@ -4512,20 +4518,20 @@ "type": "github" } ], - "time": "2026-02-21T12:49:54+00:00" + "time": "2026-05-19T14:06:37+00:00" }, { "name": "spatie/laravel-permission", - "version": "7.2.4", + "version": "7.4.2", "source": { "type": "git", "url": "https://github.com/spatie/laravel-permission.git", - "reference": "0a8ab4b84dc5efe23be9ddcd77951e10030c452d" + "reference": "15a9daf02ba02d3ae77aaa6da582708231ef999b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-permission/zipball/0a8ab4b84dc5efe23be9ddcd77951e10030c452d", - "reference": "0a8ab4b84dc5efe23be9ddcd77951e10030c452d", + "url": "https://api.github.com/repos/spatie/laravel-permission/zipball/15a9daf02ba02d3ae77aaa6da582708231ef999b", + "reference": "15a9daf02ba02d3ae77aaa6da582708231ef999b", "shasum": "" }, "require": { @@ -4533,7 +4539,7 @@ "illuminate/container": "^12.0|^13.0", "illuminate/contracts": "^12.0|^13.0", "illuminate/database": "^12.0|^13.0", - "php": "^8.4", + "php": "^8.3", "spatie/laravel-package-tools": "^1.0" }, "require-dev": { @@ -4591,7 +4597,7 @@ ], "support": { "issues": "https://github.com/spatie/laravel-permission/issues", - "source": "https://github.com/spatie/laravel-permission/tree/7.2.4" + "source": "https://github.com/spatie/laravel-permission/tree/7.4.2" }, "funding": [ { @@ -4599,24 +4605,24 @@ "type": "github" } ], - "time": "2026-03-17T22:57:08+00:00" + "time": "2026-05-30T19:21:26+00:00" }, { "name": "symfony/clock", - "version": "v8.0.8", + "version": "v8.1.0", "source": { "type": "git", "url": "https://github.com/symfony/clock.git", - "reference": "b55a638b189a6faa875e0ccdb00908fb87af95b3" + "reference": "701ef4de9705d6c32292ebee5e8044094a09fbf6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/clock/zipball/b55a638b189a6faa875e0ccdb00908fb87af95b3", - "reference": "b55a638b189a6faa875e0ccdb00908fb87af95b3", + "url": "https://api.github.com/repos/symfony/clock/zipball/701ef4de9705d6c32292ebee5e8044094a09fbf6", + "reference": "701ef4de9705d6c32292ebee5e8044094a09fbf6", "shasum": "" }, "require": { - "php": ">=8.4", + "php": ">=8.4.1", "psr/clock": "^1.0" }, "provide": { @@ -4656,7 +4662,7 @@ "time" ], "support": { - "source": "https://github.com/symfony/clock/tree/v8.0.8" + "source": "https://github.com/symfony/clock/tree/v8.1.0" }, "funding": [ { @@ -4676,20 +4682,20 @@ "type": "tidelift" } ], - "time": "2026-03-30T15:14:47+00:00" + "time": "2026-05-29T05:06:50+00:00" }, { "name": "symfony/console", - "version": "v7.4.8", + "version": "v7.4.17", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "1e92e39c51f95b88e3d66fa2d9f06d1fb45dd707" + "reference": "962e18f09ebe68a49039b4c82fc0ea4871824fca" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/1e92e39c51f95b88e3d66fa2d9f06d1fb45dd707", - "reference": "1e92e39c51f95b88e3d66fa2d9f06d1fb45dd707", + "url": "https://api.github.com/repos/symfony/console/zipball/962e18f09ebe68a49039b4c82fc0ea4871824fca", + "reference": "962e18f09ebe68a49039b4c82fc0ea4871824fca", "shasum": "" }, "require": { @@ -4754,7 +4760,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v7.4.8" + "source": "https://github.com/symfony/console/tree/v7.4.17" }, "funding": [ { @@ -4774,24 +4780,24 @@ "type": "tidelift" } ], - "time": "2026-03-30T13:54:39+00:00" + "time": "2026-08-21T12:09:28+00:00" }, { "name": "symfony/css-selector", - "version": "v8.0.8", + "version": "v8.1.5", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "8db1c00226a94d8ab6aa89d9224eeee91e2ea2ed" + "reference": "a291fb5adb65f52a4bb315db2d803698315dc64d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/8db1c00226a94d8ab6aa89d9224eeee91e2ea2ed", - "reference": "8db1c00226a94d8ab6aa89d9224eeee91e2ea2ed", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/a291fb5adb65f52a4bb315db2d803698315dc64d", + "reference": "a291fb5adb65f52a4bb315db2d803698315dc64d", "shasum": "" }, "require": { - "php": ">=8.4" + "php": ">=8.4.1" }, "type": "library", "autoload": { @@ -4823,7 +4829,7 @@ "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/css-selector/tree/v8.0.8" + "source": "https://github.com/symfony/css-selector/tree/v8.1.5" }, "funding": [ { @@ -4843,20 +4849,20 @@ "type": "tidelift" } ], - "time": "2026-03-30T15:14:47+00:00" + "time": "2026-08-21T17:47:34+00:00" }, { "name": "symfony/deprecation-contracts", - "version": "v3.6.0", + "version": "v3.7.1", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62" + "reference": "f3202fa1b5097b0af062dc978b32ecf63404e31d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/63afe740e99a13ba87ec199bb07bbdee937a5b62", - "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/f3202fa1b5097b0af062dc978b32ecf63404e31d", + "reference": "f3202fa1b5097b0af062dc978b32ecf63404e31d", "shasum": "" }, "require": { @@ -4869,7 +4875,7 @@ "name": "symfony/contracts" }, "branch-alias": { - "dev-main": "3.6-dev" + "dev-main": "3.7-dev" } }, "autoload": { @@ -4894,7 +4900,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v3.6.0" + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.7.1" }, "funding": [ { @@ -4905,25 +4911,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-09-25T14:21:43+00:00" + "time": "2026-06-05T06:23:12+00:00" }, { "name": "symfony/error-handler", - "version": "v7.4.8", + "version": "v7.4.17", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "8dd79d8af777ee6cba2fd4d98da6ffb839f3c0fa" + "reference": "8373921e231e190a88e2ad526951bbaa791576fa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/8dd79d8af777ee6cba2fd4d98da6ffb839f3c0fa", - "reference": "8dd79d8af777ee6cba2fd4d98da6ffb839f3c0fa", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/8373921e231e190a88e2ad526951bbaa791576fa", + "reference": "8373921e231e190a88e2ad526951bbaa791576fa", "shasum": "" }, "require": { @@ -4972,7 +4982,7 @@ "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/error-handler/tree/v7.4.8" + "source": "https://github.com/symfony/error-handler/tree/v7.4.17" }, "funding": [ { @@ -4992,24 +5002,25 @@ "type": "tidelift" } ], - "time": "2026-03-24T13:12:05+00:00" + "time": "2026-08-21T17:40:08+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v8.0.8", + "version": "v8.1.5", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "f662acc6ab22a3d6d716dcb44c381c6002940df6" + "reference": "7458da64220376b2e0dc2d8451bf43382c1ad297" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/f662acc6ab22a3d6d716dcb44c381c6002940df6", - "reference": "f662acc6ab22a3d6d716dcb44c381c6002940df6", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/7458da64220376b2e0dc2d8451bf43382c1ad297", + "reference": "7458da64220376b2e0dc2d8451bf43382c1ad297", "shasum": "" }, "require": { - "php": ">=8.4", + "php": ">=8.4.1", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/event-dispatcher-contracts": "^2.5|^3" }, "conflict": { @@ -5057,7 +5068,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/v8.0.8" + "source": "https://github.com/symfony/event-dispatcher/tree/v8.1.5" }, "funding": [ { @@ -5077,20 +5088,20 @@ "type": "tidelift" } ], - "time": "2026-03-30T15:14:47+00:00" + "time": "2026-08-21T17:47:34+00:00" }, { "name": "symfony/event-dispatcher-contracts", - "version": "v3.6.0", + "version": "v3.7.1", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "59eb412e93815df44f05f342958efa9f46b1e586" + "reference": "c7de7a00ffb67842132da02ea92988a39ccd9f4e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/59eb412e93815df44f05f342958efa9f46b1e586", - "reference": "59eb412e93815df44f05f342958efa9f46b1e586", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/c7de7a00ffb67842132da02ea92988a39ccd9f4e", + "reference": "c7de7a00ffb67842132da02ea92988a39ccd9f4e", "shasum": "" }, "require": { @@ -5104,7 +5115,7 @@ "name": "symfony/contracts" }, "branch-alias": { - "dev-main": "3.6-dev" + "dev-main": "3.7-dev" } }, "autoload": { @@ -5137,7 +5148,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.6.0" + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.7.1" }, "funding": [ { @@ -5148,25 +5159,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-09-25T14:21:43+00:00" + "time": "2026-06-05T06:23:12+00:00" }, { "name": "symfony/finder", - "version": "v7.4.8", + "version": "v7.4.17", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "e0be088d22278583a82da281886e8c3592fbf149" + "reference": "5ce28827081f6d1f0c32eaf3882750f19cb5bbe6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/e0be088d22278583a82da281886e8c3592fbf149", - "reference": "e0be088d22278583a82da281886e8c3592fbf149", + "url": "https://api.github.com/repos/symfony/finder/zipball/5ce28827081f6d1f0c32eaf3882750f19cb5bbe6", + "reference": "5ce28827081f6d1f0c32eaf3882750f19cb5bbe6", "shasum": "" }, "require": { @@ -5201,7 +5216,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v7.4.8" + "source": "https://github.com/symfony/finder/tree/v7.4.17" }, "funding": [ { @@ -5221,20 +5236,20 @@ "type": "tidelift" } ], - "time": "2026-03-24T13:12:05+00:00" + "time": "2026-08-21T12:09:28+00:00" }, { "name": "symfony/http-foundation", - "version": "v7.4.8", + "version": "v7.4.17", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "9381209597ec66c25be154cbf2289076e64d1eab" + "reference": "2ebe78c083501dfb9509b31a7aedcae4d60a391f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/9381209597ec66c25be154cbf2289076e64d1eab", - "reference": "9381209597ec66c25be154cbf2289076e64d1eab", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/2ebe78c083501dfb9509b31a7aedcae4d60a391f", + "reference": "2ebe78c083501dfb9509b31a7aedcae4d60a391f", "shasum": "" }, "require": { @@ -5283,7 +5298,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v7.4.8" + "source": "https://github.com/symfony/http-foundation/tree/v7.4.17" }, "funding": [ { @@ -5303,20 +5318,20 @@ "type": "tidelift" } ], - "time": "2026-03-24T13:12:05+00:00" + "time": "2026-08-20T09:55:18+00:00" }, { "name": "symfony/http-kernel", - "version": "v7.4.8", + "version": "v7.4.17", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "017e76ad089bac281553389269e259e155935e1a" + "reference": "aa160388d444210e3d01bbb4c5c53af4cd763df4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/017e76ad089bac281553389269e259e155935e1a", - "reference": "017e76ad089bac281553389269e259e155935e1a", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/aa160388d444210e3d01bbb4c5c53af4cd763df4", + "reference": "aa160388d444210e3d01bbb4c5c53af4cd763df4", "shasum": "" }, "require": { @@ -5374,7 +5389,7 @@ "symfony/validator": "^6.4|^7.0|^8.0", "symfony/var-dumper": "^6.4|^7.0|^8.0", "symfony/var-exporter": "^6.4|^7.0|^8.0", - "twig/twig": "^3.12" + "twig/twig": "^3.12|^4.0" }, "type": "library", "autoload": { @@ -5402,7 +5417,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v7.4.8" + "source": "https://github.com/symfony/http-kernel/tree/v7.4.17" }, "funding": [ { @@ -5422,20 +5437,20 @@ "type": "tidelift" } ], - "time": "2026-03-31T20:57:01+00:00" + "time": "2026-08-22T13:41:33+00:00" }, { "name": "symfony/mailer", - "version": "v7.4.8", + "version": "v7.4.17", "source": { "type": "git", "url": "https://github.com/symfony/mailer.git", - "reference": "f6ea532250b476bfc1b56699b388a1bdbf168f62" + "reference": "b17c9bf3a551d5f635638a3b6c05f06c4dc87584" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mailer/zipball/f6ea532250b476bfc1b56699b388a1bdbf168f62", - "reference": "f6ea532250b476bfc1b56699b388a1bdbf168f62", + "url": "https://api.github.com/repos/symfony/mailer/zipball/b17c9bf3a551d5f635638a3b6c05f06c4dc87584", + "reference": "b17c9bf3a551d5f635638a3b6c05f06c4dc87584", "shasum": "" }, "require": { @@ -5486,7 +5501,7 @@ "description": "Helps sending emails", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/mailer/tree/v7.4.8" + "source": "https://github.com/symfony/mailer/tree/v7.4.17" }, "funding": [ { @@ -5506,20 +5521,20 @@ "type": "tidelift" } ], - "time": "2026-03-24T13:12:05+00:00" + "time": "2026-08-21T17:40:08+00:00" }, { "name": "symfony/mime", - "version": "v7.4.8", + "version": "v7.4.17", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "6df02f99998081032da3407a8d6c4e1dcb5d4379" + "reference": "bf328d82105831db3e409195db0540ff57f27c80" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/6df02f99998081032da3407a8d6c4e1dcb5d4379", - "reference": "6df02f99998081032da3407a8d6c4e1dcb5d4379", + "url": "https://api.github.com/repos/symfony/mime/zipball/bf328d82105831db3e409195db0540ff57f27c80", + "reference": "bf328d82105831db3e409195db0540ff57f27c80", "shasum": "" }, "require": { @@ -5543,7 +5558,7 @@ "symfony/process": "^6.4|^7.0|^8.0", "symfony/property-access": "^6.4|^7.0|^8.0", "symfony/property-info": "^6.4|^7.0|^8.0", - "symfony/serializer": "^6.4.3|^7.0.3|^8.0" + "symfony/serializer": "^6.4.44|^7.4.17|^8.1.5" }, "type": "library", "autoload": { @@ -5575,7 +5590,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v7.4.8" + "source": "https://github.com/symfony/mime/tree/v7.4.17" }, "funding": [ { @@ -5595,20 +5610,20 @@ "type": "tidelift" } ], - "time": "2026-03-30T14:11:46+00:00" + "time": "2026-08-22T09:04:42+00:00" }, { "name": "symfony/polyfill-ctype", - "version": "v1.33.0", + "version": "v1.37.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638" + "reference": "141046a8f9477948ff284fa65be2095baafb94f2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/a3cc8b044a6ea513310cbd48ef7333b384945638", - "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/141046a8f9477948ff284fa65be2095baafb94f2", + "reference": "141046a8f9477948ff284fa65be2095baafb94f2", "shasum": "" }, "require": { @@ -5658,7 +5673,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.37.0" }, "funding": [ { @@ -5678,20 +5693,20 @@ "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2026-04-10T16:19:22+00:00" }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.33.0", + "version": "v1.41.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "380872130d3a5dd3ace2f4010d95125fde5d5c70" + "reference": "bb899c1db0aa8127dc3afe8cda4a67eb24915f8d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/380872130d3a5dd3ace2f4010d95125fde5d5c70", - "reference": "380872130d3a5dd3ace2f4010d95125fde5d5c70", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/bb899c1db0aa8127dc3afe8cda4a67eb24915f8d", + "reference": "bb899c1db0aa8127dc3afe8cda4a67eb24915f8d", "shasum": "" }, "require": { @@ -5740,7 +5755,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.41.0" }, "funding": [ { @@ -5760,20 +5775,20 @@ "type": "tidelift" } ], - "time": "2025-06-27T09:58:17+00:00" + "time": "2026-07-28T08:25:59+00:00" }, { "name": "symfony/polyfill-intl-idn", - "version": "v1.33.0", + "version": "v1.38.1", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "9614ac4d8061dc257ecc64cba1b140873dce8ad3" + "reference": "dc21118016c039a66235cf93d96b435ffb282412" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/9614ac4d8061dc257ecc64cba1b140873dce8ad3", - "reference": "9614ac4d8061dc257ecc64cba1b140873dce8ad3", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/dc21118016c039a66235cf93d96b435ffb282412", + "reference": "dc21118016c039a66235cf93d96b435ffb282412", "shasum": "" }, "require": { @@ -5827,7 +5842,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.38.1" }, "funding": [ { @@ -5847,20 +5862,20 @@ "type": "tidelift" } ], - "time": "2024-09-10T14:38:51+00:00" + "time": "2026-05-25T15:22:23+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.33.0", + "version": "v1.38.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "3833d7255cc303546435cb650316bff708a1c75c" + "reference": "2d446c214bdbe5b71bde5011b060a05fece3ae6b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c", - "reference": "3833d7255cc303546435cb650316bff708a1c75c", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/2d446c214bdbe5b71bde5011b060a05fece3ae6b", + "reference": "2d446c214bdbe5b71bde5011b060a05fece3ae6b", "shasum": "" }, "require": { @@ -5912,7 +5927,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.38.0" }, "funding": [ { @@ -5932,20 +5947,20 @@ "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2026-05-25T13:48:31+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.33.0", + "version": "v1.38.2", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493" + "reference": "d3d318bad5e7a1bfbd026009c8bfb8d8f99ae6b6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/6d857f4d76bd4b343eac26d6b539585d2bc56493", - "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/d3d318bad5e7a1bfbd026009c8bfb8d8f99ae6b6", + "reference": "d3d318bad5e7a1bfbd026009c8bfb8d8f99ae6b6", "shasum": "" }, "require": { @@ -5997,7 +6012,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.38.2" }, "funding": [ { @@ -6017,20 +6032,20 @@ "type": "tidelift" } ], - "time": "2024-12-23T08:48:59+00:00" + "time": "2026-05-27T06:59:30+00:00" }, { "name": "symfony/polyfill-php80", - "version": "v1.33.0", + "version": "v1.37.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608" + "reference": "dfb55726c3a76ea3b6459fcfda1ec2d80a682411" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/0cc9dd0f17f61d8131e7df6b84bd344899fe2608", - "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/dfb55726c3a76ea3b6459fcfda1ec2d80a682411", + "reference": "dfb55726c3a76ea3b6459fcfda1ec2d80a682411", "shasum": "" }, "require": { @@ -6081,7 +6096,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.37.0" }, "funding": [ { @@ -6101,20 +6116,20 @@ "type": "tidelift" } ], - "time": "2025-01-02T08:10:11+00:00" + "time": "2026-04-10T16:19:22+00:00" }, { "name": "symfony/polyfill-php83", - "version": "v1.33.0", + "version": "v1.41.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php83.git", - "reference": "17f6f9a6b1735c0f163024d959f700cfbc5155e5" + "reference": "5ea99087fb99c273a9b9236ed4c31e78b16103c6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/17f6f9a6b1735c0f163024d959f700cfbc5155e5", - "reference": "17f6f9a6b1735c0f163024d959f700cfbc5155e5", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/5ea99087fb99c273a9b9236ed4c31e78b16103c6", + "reference": "5ea99087fb99c273a9b9236ed4c31e78b16103c6", "shasum": "" }, "require": { @@ -6161,7 +6176,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php83/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-php83/tree/v1.41.0" }, "funding": [ { @@ -6181,20 +6196,20 @@ "type": "tidelift" } ], - "time": "2025-07-08T02:45:35+00:00" + "time": "2026-07-01T12:47:55+00:00" }, { "name": "symfony/polyfill-php84", - "version": "v1.33.0", + "version": "v1.38.1", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php84.git", - "reference": "d8ced4d875142b6a7426000426b8abc631d6b191" + "reference": "f4e1dfaee5b74aba5964fe1fd4dfc7ba5e3085fa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/d8ced4d875142b6a7426000426b8abc631d6b191", - "reference": "d8ced4d875142b6a7426000426b8abc631d6b191", + "url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/f4e1dfaee5b74aba5964fe1fd4dfc7ba5e3085fa", + "reference": "f4e1dfaee5b74aba5964fe1fd4dfc7ba5e3085fa", "shasum": "" }, "require": { @@ -6241,7 +6256,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php84/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-php84/tree/v1.38.1" }, "funding": [ { @@ -6261,20 +6276,20 @@ "type": "tidelift" } ], - "time": "2025-06-24T13:30:11+00:00" + "time": "2026-05-26T12:51:13+00:00" }, { "name": "symfony/polyfill-php85", - "version": "v1.33.0", + "version": "v1.41.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php85.git", - "reference": "d4e5fcd4ab3d998ab16c0db48e6cbb9a01993f91" + "reference": "255fab485aaa1006ed411040c42aecd7b5302d7a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php85/zipball/d4e5fcd4ab3d998ab16c0db48e6cbb9a01993f91", - "reference": "d4e5fcd4ab3d998ab16c0db48e6cbb9a01993f91", + "url": "https://api.github.com/repos/symfony/polyfill-php85/zipball/255fab485aaa1006ed411040c42aecd7b5302d7a", + "reference": "255fab485aaa1006ed411040c42aecd7b5302d7a", "shasum": "" }, "require": { @@ -6321,7 +6336,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php85/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-php85/tree/v1.41.0" }, "funding": [ { @@ -6341,20 +6356,20 @@ "type": "tidelift" } ], - "time": "2025-06-23T16:12:55+00:00" + "time": "2026-07-01T12:47:55+00:00" }, { "name": "symfony/polyfill-uuid", - "version": "v1.33.0", + "version": "v1.37.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-uuid.git", - "reference": "21533be36c24be3f4b1669c4725c7d1d2bab4ae2" + "reference": "26dfec253c4cf3e51b541b52ddf7e42cb0908e94" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/21533be36c24be3f4b1669c4725c7d1d2bab4ae2", - "reference": "21533be36c24be3f4b1669c4725c7d1d2bab4ae2", + "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/26dfec253c4cf3e51b541b52ddf7e42cb0908e94", + "reference": "26dfec253c4cf3e51b541b52ddf7e42cb0908e94", "shasum": "" }, "require": { @@ -6404,7 +6419,7 @@ "uuid" ], "support": { - "source": "https://github.com/symfony/polyfill-uuid/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-uuid/tree/v1.37.0" }, "funding": [ { @@ -6424,20 +6439,20 @@ "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2026-04-10T16:19:22+00:00" }, { "name": "symfony/process", - "version": "v7.4.8", + "version": "v7.4.17", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "60f19cd3badc8de688421e21e4305eba50f8089a" + "reference": "058d17fc284cce14efb2385783b55014a461b176" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/60f19cd3badc8de688421e21e4305eba50f8089a", - "reference": "60f19cd3badc8de688421e21e4305eba50f8089a", + "url": "https://api.github.com/repos/symfony/process/zipball/058d17fc284cce14efb2385783b55014a461b176", + "reference": "058d17fc284cce14efb2385783b55014a461b176", "shasum": "" }, "require": { @@ -6469,7 +6484,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v7.4.8" + "source": "https://github.com/symfony/process/tree/v7.4.17" }, "funding": [ { @@ -6489,20 +6504,20 @@ "type": "tidelift" } ], - "time": "2026-03-24T13:12:05+00:00" + "time": "2026-08-21T17:40:08+00:00" }, { "name": "symfony/routing", - "version": "v7.4.8", + "version": "v7.4.17", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "9608de9873ec86e754fb6c0a0fa7e5f1a960eb6b" + "reference": "ddd558991e98f693ae6bf5063cc1b0362c6bbec3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/9608de9873ec86e754fb6c0a0fa7e5f1a960eb6b", - "reference": "9608de9873ec86e754fb6c0a0fa7e5f1a960eb6b", + "url": "https://api.github.com/repos/symfony/routing/zipball/ddd558991e98f693ae6bf5063cc1b0362c6bbec3", + "reference": "ddd558991e98f693ae6bf5063cc1b0362c6bbec3", "shasum": "" }, "require": { @@ -6554,7 +6569,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v7.4.8" + "source": "https://github.com/symfony/routing/tree/v7.4.17" }, "funding": [ { @@ -6574,20 +6589,20 @@ "type": "tidelift" } ], - "time": "2026-03-24T13:12:05+00:00" + "time": "2026-08-17T13:12:36+00:00" }, { "name": "symfony/service-contracts", - "version": "v3.6.1", + "version": "v3.7.1", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "45112560a3ba2d715666a509a0bc9521d10b6c43" + "reference": "c0a284bab1ed8aa0417e3d69250ab437739563a0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/45112560a3ba2d715666a509a0bc9521d10b6c43", - "reference": "45112560a3ba2d715666a509a0bc9521d10b6c43", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/c0a284bab1ed8aa0417e3d69250ab437739563a0", + "reference": "c0a284bab1ed8aa0417e3d69250ab437739563a0", "shasum": "" }, "require": { @@ -6605,7 +6620,7 @@ "name": "symfony/contracts" }, "branch-alias": { - "dev-main": "3.6-dev" + "dev-main": "3.7-dev" } }, "autoload": { @@ -6641,7 +6656,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v3.6.1" + "source": "https://github.com/symfony/service-contracts/tree/v3.7.1" }, "funding": [ { @@ -6661,24 +6676,24 @@ "type": "tidelift" } ], - "time": "2025-07-15T11:30:57+00:00" + "time": "2026-06-16T09:55:08+00:00" }, { "name": "symfony/string", - "version": "v8.0.8", + "version": "v8.1.2", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "ae9488f874d7603f9d2dfbf120203882b645d963" + "reference": "286a76b7255e5cc4bf0101a0bc5388ecf1c38ccc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/ae9488f874d7603f9d2dfbf120203882b645d963", - "reference": "ae9488f874d7603f9d2dfbf120203882b645d963", + "url": "https://api.github.com/repos/symfony/string/zipball/286a76b7255e5cc4bf0101a0bc5388ecf1c38ccc", + "reference": "286a76b7255e5cc4bf0101a0bc5388ecf1c38ccc", "shasum": "" }, "require": { - "php": ">=8.4", + "php": ">=8.4.1", "symfony/polyfill-ctype": "^1.8", "symfony/polyfill-intl-grapheme": "^1.33", "symfony/polyfill-intl-normalizer": "^1.0", @@ -6731,7 +6746,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v8.0.8" + "source": "https://github.com/symfony/string/tree/v8.1.2" }, "funding": [ { @@ -6751,24 +6766,24 @@ "type": "tidelift" } ], - "time": "2026-03-30T15:14:47+00:00" + "time": "2026-07-28T07:35:25+00:00" }, { "name": "symfony/translation", - "version": "v8.0.8", + "version": "v8.1.5", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "27c03ae3940de24ba2f71cfdbac824f2aa1fdf2f" + "reference": "d9e1caba0d6b6f9a26710af8a2f88d37f001215a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/27c03ae3940de24ba2f71cfdbac824f2aa1fdf2f", - "reference": "27c03ae3940de24ba2f71cfdbac824f2aa1fdf2f", + "url": "https://api.github.com/repos/symfony/translation/zipball/d9e1caba0d6b6f9a26710af8a2f88d37f001215a", + "reference": "d9e1caba0d6b6f9a26710af8a2f88d37f001215a", "shasum": "" }, "require": { - "php": ">=8.4", + "php": ">=8.4.1", "symfony/polyfill-mbstring": "^1.0", "symfony/translation-contracts": "^3.6.1" }, @@ -6824,7 +6839,7 @@ "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/translation/tree/v8.0.8" + "source": "https://github.com/symfony/translation/tree/v8.1.5" }, "funding": [ { @@ -6844,20 +6859,20 @@ "type": "tidelift" } ], - "time": "2026-03-30T15:14:47+00:00" + "time": "2026-08-21T17:47:34+00:00" }, { "name": "symfony/translation-contracts", - "version": "v3.6.1", + "version": "v3.7.1", "source": { "type": "git", "url": "https://github.com/symfony/translation-contracts.git", - "reference": "65a8bc82080447fae78373aa10f8d13b38338977" + "reference": "ccb206b98faccc511ebae8e5fad50f2dc0b30621" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/65a8bc82080447fae78373aa10f8d13b38338977", - "reference": "65a8bc82080447fae78373aa10f8d13b38338977", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/ccb206b98faccc511ebae8e5fad50f2dc0b30621", + "reference": "ccb206b98faccc511ebae8e5fad50f2dc0b30621", "shasum": "" }, "require": { @@ -6870,7 +6885,7 @@ "name": "symfony/contracts" }, "branch-alias": { - "dev-main": "3.6-dev" + "dev-main": "3.7-dev" } }, "autoload": { @@ -6906,7 +6921,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/translation-contracts/tree/v3.6.1" + "source": "https://github.com/symfony/translation-contracts/tree/v3.7.1" }, "funding": [ { @@ -6926,20 +6941,20 @@ "type": "tidelift" } ], - "time": "2025-07-15T13:41:35+00:00" + "time": "2026-06-05T06:23:12+00:00" }, { "name": "symfony/uid", - "version": "v7.4.8", + "version": "v7.4.17", "source": { "type": "git", "url": "https://github.com/symfony/uid.git", - "reference": "6883ebdf7bf6a12b37519dbc0df62b0222401b56" + "reference": "69d732355a139c6f8881337d28515aa01f12b8be" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/uid/zipball/6883ebdf7bf6a12b37519dbc0df62b0222401b56", - "reference": "6883ebdf7bf6a12b37519dbc0df62b0222401b56", + "url": "https://api.github.com/repos/symfony/uid/zipball/69d732355a139c6f8881337d28515aa01f12b8be", + "reference": "69d732355a139c6f8881337d28515aa01f12b8be", "shasum": "" }, "require": { @@ -6984,7 +6999,7 @@ "uuid" ], "support": { - "source": "https://github.com/symfony/uid/tree/v7.4.8" + "source": "https://github.com/symfony/uid/tree/v7.4.17" }, "funding": [ { @@ -7004,20 +7019,20 @@ "type": "tidelift" } ], - "time": "2026-03-24T13:12:05+00:00" + "time": "2026-08-11T07:38:58+00:00" }, { "name": "symfony/var-dumper", - "version": "v7.4.8", + "version": "v7.4.17", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "9510c3966f749a1d1ff0059e1eabef6cc621e7fd" + "reference": "53712df8727da1744490202eeb9cb50d4b95419d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/9510c3966f749a1d1ff0059e1eabef6cc621e7fd", - "reference": "9510c3966f749a1d1ff0059e1eabef6cc621e7fd", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/53712df8727da1744490202eeb9cb50d4b95419d", + "reference": "53712df8727da1744490202eeb9cb50d4b95419d", "shasum": "" }, "require": { @@ -7033,7 +7048,7 @@ "symfony/http-kernel": "^6.4|^7.0|^8.0", "symfony/process": "^6.4|^7.0|^8.0", "symfony/uid": "^6.4|^7.0|^8.0", - "twig/twig": "^3.12" + "twig/twig": "^3.12|^4.0" }, "bin": [ "Resources/bin/var-dump-server" @@ -7071,7 +7086,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v7.4.8" + "source": "https://github.com/symfony/var-dumper/tree/v7.4.17" }, "funding": [ { @@ -7091,7 +7106,7 @@ "type": "tidelift" } ], - "time": "2026-03-30T13:44:50+00:00" + "time": "2026-08-21T12:09:28+00:00" }, { "name": "thecodingmachine/safe", @@ -7378,16 +7393,16 @@ }, { "name": "uspdev/laravel-usp-theme", - "version": "2.8.27", + "version": "2.8.34", "source": { "type": "git", "url": "https://github.com/uspdev/laravel-usp-theme.git", - "reference": "75f09e02929d5588bd26f9ccad8f7b5300cb7162" + "reference": "71c9188d04c956049563a30b254ca1b52865cf0d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/uspdev/laravel-usp-theme/zipball/75f09e02929d5588bd26f9ccad8f7b5300cb7162", - "reference": "75f09e02929d5588bd26f9ccad8f7b5300cb7162", + "url": "https://api.github.com/repos/uspdev/laravel-usp-theme/zipball/71c9188d04c956049563a30b254ca1b52865cf0d", + "reference": "71c9188d04c956049563a30b254ca1b52865cf0d", "shasum": "" }, "require": { @@ -7425,22 +7440,22 @@ "description": "usp theme for laravel", "support": { "issues": "https://github.com/uspdev/laravel-usp-theme/issues", - "source": "https://github.com/uspdev/laravel-usp-theme/tree/2.8.27" + "source": "https://github.com/uspdev/laravel-usp-theme/tree/2.8.34" }, - "time": "2026-03-27T14:35:42+00:00" + "time": "2026-08-12T11:25:10+00:00" }, { "name": "uspdev/replicado", - "version": "1.27.8", + "version": "1.28.3", "source": { "type": "git", "url": "https://github.com/uspdev/replicado.git", - "reference": "2ea81b6b0dca92e2fc9d3ea3f49812df90abcfae" + "reference": "18d85d4963a94c10f41c48854e6ae2ed0837fcb6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/uspdev/replicado/zipball/2ea81b6b0dca92e2fc9d3ea3f49812df90abcfae", - "reference": "2ea81b6b0dca92e2fc9d3ea3f49812df90abcfae", + "url": "https://api.github.com/repos/uspdev/replicado/zipball/18d85d4963a94c10f41c48854e6ae2ed0837fcb6", + "reference": "18d85d4963a94c10f41c48854e6ae2ed0837fcb6", "shasum": "" }, "require": { @@ -7474,9 +7489,9 @@ "homepage": "https://github.com/uspdev/replicado", "support": { "issues": "https://github.com/uspdev/replicado/issues", - "source": "https://github.com/uspdev/replicado/tree/1.27.8" + "source": "https://github.com/uspdev/replicado/tree/1.28.3" }, - "time": "2026-04-02T15:00:09+00:00" + "time": "2026-08-20T22:39:26+00:00" }, { "name": "uspdev/senhaunica-socialite", @@ -7633,16 +7648,16 @@ }, { "name": "vlucas/phpdotenv", - "version": "v5.6.3", + "version": "v5.6.4", "source": { "type": "git", "url": "https://github.com/vlucas/phpdotenv.git", - "reference": "955e7815d677a3eaa7075231212f2110983adecc" + "reference": "416df702837983f8d5ff48c9c3fee4f5f57b980b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/955e7815d677a3eaa7075231212f2110983adecc", - "reference": "955e7815d677a3eaa7075231212f2110983adecc", + "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/416df702837983f8d5ff48c9c3fee4f5f57b980b", + "reference": "416df702837983f8d5ff48c9c3fee4f5f57b980b", "shasum": "" }, "require": { @@ -7701,7 +7716,7 @@ ], "support": { "issues": "https://github.com/vlucas/phpdotenv/issues", - "source": "https://github.com/vlucas/phpdotenv/tree/v5.6.3" + "source": "https://github.com/vlucas/phpdotenv/tree/v5.6.4" }, "funding": [ { @@ -7713,27 +7728,27 @@ "type": "tidelift" } ], - "time": "2025-12-27T19:49:13+00:00" + "time": "2026-07-06T19:11:50+00:00" }, { "name": "voku/portable-ascii", - "version": "2.0.3", + "version": "2.1.1", "source": { "type": "git", "url": "https://github.com/voku/portable-ascii.git", - "reference": "b1d923f88091c6bf09699efcd7c8a1b1bfd7351d" + "reference": "8e1051fe39379367aecf014f41744ce7539a856f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/voku/portable-ascii/zipball/b1d923f88091c6bf09699efcd7c8a1b1bfd7351d", - "reference": "b1d923f88091c6bf09699efcd7c8a1b1bfd7351d", + "url": "https://api.github.com/repos/voku/portable-ascii/zipball/8e1051fe39379367aecf014f41744ce7539a856f", + "reference": "8e1051fe39379367aecf014f41744ce7539a856f", "shasum": "" }, "require": { - "php": ">=7.0.0" + "php": ">=7.1.0" }, "require-dev": { - "phpunit/phpunit": "~6.0 || ~7.0 || ~9.0" + "phpunit/phpunit": "~8.5 || ~9.6 || ~10.5 || ~11.5" }, "suggest": { "ext-intl": "Use Intl for transliterator_transliterate() support" @@ -7763,7 +7778,7 @@ ], "support": { "issues": "https://github.com/voku/portable-ascii/issues", - "source": "https://github.com/voku/portable-ascii/tree/2.0.3" + "source": "https://github.com/voku/portable-ascii/tree/2.1.1" }, "funding": [ { @@ -7787,7 +7802,7 @@ "type": "tidelift" } ], - "time": "2024-11-21T01:49:47+00:00" + "time": "2026-04-26T05:33:54+00:00" } ], "packages-dev": [ @@ -7927,19 +7942,21 @@ }, { "name": "hamcrest/hamcrest-php", - "version": "v2.1.1", + "version": "v3.0.0", "source": { "type": "git", "url": "https://github.com/hamcrest/hamcrest-php.git", - "reference": "f8b1c0173b22fa6ec77a81fe63e5b01eba7e6487" + "reference": "b61cd040da1a4925bc90a51c074f5297e7c0fa52" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/hamcrest/hamcrest-php/zipball/f8b1c0173b22fa6ec77a81fe63e5b01eba7e6487", - "reference": "f8b1c0173b22fa6ec77a81fe63e5b01eba7e6487", + "url": "https://api.github.com/repos/hamcrest/hamcrest-php/zipball/b61cd040da1a4925bc90a51c074f5297e7c0fa52", + "reference": "b61cd040da1a4925bc90a51c074f5297e7c0fa52", "shasum": "" }, "require": { + "ext-ctype": "*", + "ext-dom": "*", "php": "^7.4|^8.0" }, "replace": { @@ -7948,13 +7965,15 @@ "kodova/hamcrest-php": "*" }, "require-dev": { + "phpstan/phpstan": "^2.1", + "phpstan/phpstan-phpunit": "^2.0", "phpunit/php-file-iterator": "^1.4 || ^2.0 || ^3.0", "phpunit/phpunit": "^4.8.36 || ^5.7 || ^6.5 || ^7.0 || ^8.0 || ^9.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.1-dev" + "dev-master": "3.0-dev" } }, "autoload": { @@ -7972,9 +7991,9 @@ ], "support": { "issues": "https://github.com/hamcrest/hamcrest-php/issues", - "source": "https://github.com/hamcrest/hamcrest-php/tree/v2.1.1" + "source": "https://github.com/hamcrest/hamcrest-php/tree/v3.0.0" }, - "time": "2025-04-30T06:54:44+00:00" + "time": "2026-03-17T11:56:53+00:00" }, { "name": "laravel/dusk", @@ -8052,16 +8071,16 @@ }, { "name": "laravel/sail", - "version": "v1.56.0", + "version": "v1.67.0", "source": { "type": "git", "url": "https://github.com/laravel/sail.git", - "reference": "f43426bb42a1cb7a51a3861d9138063e54766d28" + "reference": "639e03ac12cf23def171770bcab05758045b2642" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/sail/zipball/f43426bb42a1cb7a51a3861d9138063e54766d28", - "reference": "f43426bb42a1cb7a51a3861d9138063e54766d28", + "url": "https://api.github.com/repos/laravel/sail/zipball/639e03ac12cf23def171770bcab05758045b2642", + "reference": "639e03ac12cf23def171770bcab05758045b2642", "shasum": "" }, "require": { @@ -8111,33 +8130,32 @@ "issues": "https://github.com/laravel/sail/issues", "source": "https://github.com/laravel/sail" }, - "time": "2026-04-01T15:17:32+00:00" + "time": "2026-08-12T13:55:56+00:00" }, { "name": "mockery/mockery", - "version": "1.6.12", + "version": "1.6.15", "source": { "type": "git", "url": "https://github.com/mockery/mockery.git", - "reference": "1f4efdd7d3beafe9807b08156dfcb176d18f1699" + "reference": "967a801bd188989a5669bd280f252d51c0fdc9ee" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/mockery/mockery/zipball/1f4efdd7d3beafe9807b08156dfcb176d18f1699", - "reference": "1f4efdd7d3beafe9807b08156dfcb176d18f1699", + "url": "https://api.github.com/repos/mockery/mockery/zipball/967a801bd188989a5669bd280f252d51c0fdc9ee", + "reference": "967a801bd188989a5669bd280f252d51c0fdc9ee", "shasum": "" }, "require": { - "hamcrest/hamcrest-php": "^2.0.1", - "lib-pcre": ">=7.0", + "hamcrest/hamcrest-php": "^2.0 || ^3.0", "php": ">=7.3" }, "conflict": { "phpunit/phpunit": "<8.0" }, "require-dev": { - "phpunit/phpunit": "^8.5 || ^9.6.17", - "symplify/easy-coding-standard": "^12.1.14" + "phpunit/phpunit": "^9.6.36", + "symplify/easy-coding-standard": "^13.2.17" }, "type": "library", "autoload": { @@ -8194,24 +8212,24 @@ "security": "https://github.com/mockery/mockery/security/advisories", "source": "https://github.com/mockery/mockery" }, - "time": "2024-05-16T03:13:13+00:00" + "time": "2026-08-19T19:37:52+00:00" }, { "name": "myclabs/deep-copy", - "version": "1.13.4", + "version": "1.14.0", "source": { "type": "git", "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a" + "reference": "8680aa248f8e07bc8fb43f56f0f5fc77a0c96aae" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/07d290f0c47959fd5eed98c95ee5602db07e0b6a", - "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/8680aa248f8e07bc8fb43f56f0f5fc77a0c96aae", + "reference": "8680aa248f8e07bc8fb43f56f0f5fc77a0c96aae", "shasum": "" }, "require": { - "php": "^7.1 || ^8.0" + "php": "^8.0" }, "conflict": { "doctrine/collections": "<1.6.8", @@ -8246,35 +8264,35 @@ ], "support": { "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.13.4" + "source": "https://github.com/myclabs/DeepCopy/tree/1.14.0" }, "funding": [ { - "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", - "type": "tidelift" + "url": "https://github.com/mnapoli", + "type": "github" } ], - "time": "2025-08-01T08:46:24+00:00" + "time": "2026-08-11T10:17:44+00:00" }, { "name": "nunomaduro/collision", - "version": "v8.9.2", + "version": "v8.9.5", "source": { "type": "git", "url": "https://github.com/nunomaduro/collision.git", - "reference": "6eb16883e74fd725ac64dbe81544c961ab448ba5" + "reference": "fb53eacd509a1d303858e2d20cfebf2d630254ec" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nunomaduro/collision/zipball/6eb16883e74fd725ac64dbe81544c961ab448ba5", - "reference": "6eb16883e74fd725ac64dbe81544c961ab448ba5", + "url": "https://api.github.com/repos/nunomaduro/collision/zipball/fb53eacd509a1d303858e2d20cfebf2d630254ec", + "reference": "fb53eacd509a1d303858e2d20cfebf2d630254ec", "shasum": "" }, "require": { "filp/whoops": "^2.18.4", "nunomaduro/termwind": "^2.4.0", "php": "^8.2.0", - "symfony/console": "^7.4.8 || ^8.0.4" + "symfony/console": "^7.4.14 || ^8.1.1" }, "conflict": { "laravel/framework": "<11.48.0 || >=14.0.0", @@ -8282,12 +8300,12 @@ }, "require-dev": { "brianium/paratest": "^7.8.5", - "larastan/larastan": "^3.9.3", - "laravel/framework": "^11.48.0 || ^12.56.0 || ^13.2.0", - "laravel/pint": "^1.29.0", - "orchestra/testbench-core": "^9.12.0 || ^10.12.1 || ^11.0.0", - "pestphp/pest": "^3.8.5 || ^4.4.3 || ^5.0.0", - "sebastian/environment": "^7.2.1 || ^8.0.4 || ^9.0.0" + "larastan/larastan": "^3.10.0", + "laravel/framework": "^11.48.0 || ^12.56.0 || ^13.20.0", + "laravel/pint": "^1.29.3", + "orchestra/testbench-core": "^9.12.0 || ^10.12.1 || ^11.3.5", + "pestphp/pest": "^3.8.5 || ^4.7.5 || ^5.0.0", + "sebastian/environment": "^7.2.1 || ^8.1.2 || ^9.3.2" }, "type": "library", "extra": { @@ -8350,7 +8368,7 @@ "type": "patreon" } ], - "time": "2026-03-31T21:51:27+00:00" + "time": "2026-07-15T19:09:14+00:00" }, { "name": "phar-io/manifest", @@ -8885,24 +8903,24 @@ }, { "name": "phpunit/phpunit", - "version": "11.5.55", + "version": "11.5.56", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "adc7262fccc12de2b30f12a8aa0b33775d814f00" + "reference": "5f83edffa6967c3db468d48a695ec7bcb02e9256" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/adc7262fccc12de2b30f12a8aa0b33775d814f00", - "reference": "adc7262fccc12de2b30f12a8aa0b33775d814f00", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/5f83edffa6967c3db468d48a695ec7bcb02e9256", + "reference": "5f83edffa6967c3db468d48a695ec7bcb02e9256", "shasum": "" }, "require": { "ext-dom": "*", + "ext-filter": "*", "ext-json": "*", "ext-libxml": "*", "ext-mbstring": "*", - "ext-xml": "*", "ext-xmlwriter": "*", "myclabs/deep-copy": "^1.13.4", "phar-io/manifest": "^2.0.4", @@ -8967,31 +8985,15 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/11.5.55" + "source": "https://github.com/sebastianbergmann/phpunit/tree/11.5.56" }, "funding": [ { - "url": "https://phpunit.de/sponsors.html", - "type": "custom" - }, - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - }, - { - "url": "https://liberapay.com/sebastianbergmann", - "type": "liberapay" - }, - { - "url": "https://thanks.dev/u/gh/sebastianbergmann", - "type": "thanks_dev" - }, - { - "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", - "type": "tidelift" + "url": "https://phpunit.de/sponsoring.html", + "type": "other" } ], - "time": "2026-02-18T12:37:06+00:00" + "time": "2026-07-06T14:52:39+00:00" }, { "name": "sebastian/cli-parser", @@ -10119,16 +10121,16 @@ }, { "name": "spatie/flare-client-php", - "version": "1.11.0", + "version": "1.11.1", "source": { "type": "git", "url": "https://github.com/spatie/flare-client-php.git", - "reference": "fb3ffb946675dba811fbde9122224db2f84daca9" + "reference": "53f41b08a27cc039e1a8ed2be9a202e924f31bad" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/flare-client-php/zipball/fb3ffb946675dba811fbde9122224db2f84daca9", - "reference": "fb3ffb946675dba811fbde9122224db2f84daca9", + "url": "https://api.github.com/repos/spatie/flare-client-php/zipball/53f41b08a27cc039e1a8ed2be9a202e924f31bad", + "reference": "53f41b08a27cc039e1a8ed2be9a202e924f31bad", "shasum": "" }, "require": { @@ -10176,7 +10178,7 @@ ], "support": { "issues": "https://github.com/spatie/flare-client-php/issues", - "source": "https://github.com/spatie/flare-client-php/tree/1.11.0" + "source": "https://github.com/spatie/flare-client-php/tree/1.11.1" }, "funding": [ { @@ -10184,7 +10186,7 @@ "type": "github" } ], - "time": "2026-03-17T08:06:16+00:00" + "time": "2026-05-15T09:31:32+00:00" }, { "name": "spatie/ignition", @@ -10418,27 +10420,28 @@ }, { "name": "symfony/yaml", - "version": "v8.0.8", + "version": "v8.1.5", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "54174ab48c0c0f9e21512b304be17f8150ccf8f1" + "reference": "b3fc9e8888eeb9daddc33bfbd15d282a61f543cd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/54174ab48c0c0f9e21512b304be17f8150ccf8f1", - "reference": "54174ab48c0c0f9e21512b304be17f8150ccf8f1", + "url": "https://api.github.com/repos/symfony/yaml/zipball/b3fc9e8888eeb9daddc33bfbd15d282a61f543cd", + "reference": "b3fc9e8888eeb9daddc33bfbd15d282a61f543cd", "shasum": "" }, "require": { - "php": ">=8.4", + "php": ">=8.4.1", "symfony/polyfill-ctype": "^1.8" }, "conflict": { "symfony/console": "<7.4" }, "require-dev": { - "symfony/console": "^7.4|^8.0" + "symfony/console": "^7.4|^8.0", + "yaml/yaml-test-suite": "*" }, "bin": [ "Resources/bin/yaml-lint" @@ -10469,7 +10472,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v8.0.8" + "source": "https://github.com/symfony/yaml/tree/v8.1.5" }, "funding": [ { @@ -10489,7 +10492,7 @@ "type": "tidelift" } ], - "time": "2026-03-30T15:14:47+00:00" + "time": "2026-08-21T12:16:08+00:00" }, { "name": "theseer/tokenizer", diff --git a/config/laravel-usp-theme.php b/config/laravel-usp-theme.php index 310228b..f11504d 100644 --- a/config/laravel-usp-theme.php +++ b/config/laravel-usp-theme.php @@ -12,6 +12,11 @@ 'url' => config('app.url') . '/tipo-portas', 'can' => 'admin', ], + [ + 'text' => ' Modelos de Switches', + 'url' => config('app.url') . '/modelo-switches', + 'can' => 'admin', + ], ]; $right_menu = [ diff --git a/database/migrations/2026_08_20_085010_create_modelo_switches_table.php b/database/migrations/2026_08_20_085010_create_modelo_switches_table.php new file mode 100644 index 0000000..156a0bc --- /dev/null +++ b/database/migrations/2026_08_20_085010_create_modelo_switches_table.php @@ -0,0 +1,32 @@ +id(); + $table->string('nome'); + $table->string('fabricante'); + $table->integer('qtde_portas'); + $table->integer('qtde_portas_poe')->default(0); + $table->foreignId('user_id')->constrained(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('modelo_switches'); + } +}; diff --git a/database/migrations/2026_08_20_085226_alter_equipamentos_nova_estrutura.php.php b/database/migrations/2026_08_20_085226_alter_equipamentos_nova_estrutura.php.php new file mode 100644 index 0000000..d9497fd --- /dev/null +++ b/database/migrations/2026_08_20_085226_alter_equipamentos_nova_estrutura.php.php @@ -0,0 +1,33 @@ +foreignId('modelo_switch_id')->after('rack_id')->constrained('modelo_switches'); + $table->enum('tipo', ['A', 'W', 'C', 'V'])->after('modelo_switch_id')->default('A'); + $table->integer('ordem')->after('tipo')->default(0); + $table->text('comentario')->nullable()->after('ordem'); + + $table->dropColumn(['model', 'qtde_portas', 'poe_type']); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('equipamentos', function (Blueprint $table) { + // + }); + } +}; \ No newline at end of file diff --git a/database/migrations/2026_08_20_085400_add_ordem_to_patch_panels.php b/database/migrations/2026_08_20_085400_add_ordem_to_patch_panels.php new file mode 100644 index 0000000..60f0bf4 --- /dev/null +++ b/database/migrations/2026_08_20_085400_add_ordem_to_patch_panels.php @@ -0,0 +1,28 @@ +integer('ordem')->default(0)->after('rack_id'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('patch_panels', function (Blueprint $table) { + // + }); + } +}; diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php index 60c5ad3..4e44a97 100644 --- a/database/seeders/DatabaseSeeder.php +++ b/database/seeders/DatabaseSeeder.php @@ -18,6 +18,7 @@ public function run() PortaSeeder::class, SnapshotSeeder::class, MacSeeder::class, + ModeloSwitchSeeder::class, ]); } } diff --git a/database/seeders/ModeloSwitchSeeder.php b/database/seeders/ModeloSwitchSeeder.php new file mode 100644 index 0000000..d36cda0 --- /dev/null +++ b/database/seeders/ModeloSwitchSeeder.php @@ -0,0 +1,25 @@ + '1920S 24G', 'fabricante' => 'HP', 'qtde_portas' => 24, 'qtde_portas_poe' => 12], + ['nome' => '1920S 48G', 'fabricante' => 'HP', 'qtde_portas' => 48, 'qtde_portas_poe' => 24], + ['nome' => 'Catalyst 2960', 'fabricante' => 'Cisco', 'qtde_portas' => 24, 'qtde_portas_poe' => 24], + ['nome' => 'Catalyst 3750', 'fabricante' => 'Cisco', 'qtde_portas' => 48, 'qtde_portas_poe' => 48], + ['nome' => '2530-24G', 'fabricante' => 'Aruba', 'qtde_portas' => 24, 'qtde_portas_poe' => 0], + ['nome' => '2930F 48G', 'fabricante' => 'Aruba', 'qtde_portas' => 48, 'qtde_portas_poe' => 48], + ]; + + foreach ($modelos as $m) { + ModeloSwitch::create($m + ['user_id' => 1]); + } + } +} \ No newline at end of file diff --git a/routes/web.php b/routes/web.php index fd22731..42caf11 100644 --- a/routes/web.php +++ b/routes/web.php @@ -9,9 +9,19 @@ use App\Http\Controllers\PatchPanelController; use App\Http\Controllers\TipoPortaController; use App\Http\Controllers\PlantaController; +use App\Http\Controllers\ModeloSwitchController; Route::get('/',[IndexController::class,'index']); +// Modelos de Switch (novo) +Route::get('/modelo-switches', [ModeloSwitchController::class, 'index']); +Route::get('/modelo-switches/create', [ModeloSwitchController::class, 'create']); +Route::post('/modelo-switches', [ModeloSwitchController::class, 'store']); +Route::get('/modelo-switches/{modeloSwitch}', [ModeloSwitchController::class, 'show']); +Route::get('/modelo-switches/{modeloSwitch}/edit', [ModeloSwitchController::class, 'edit']); +Route::put('/modelo-switches/{modeloSwitch}', [ModeloSwitchController::class, 'update']); +Route::delete('/modelo-switches/{modeloSwitch}', [ModeloSwitchController::class, 'destroy']); + // Prédios Route::get('/predios', [PredioController::class, 'index']); Route::get('/predios/create', [PredioController::class, 'create']); @@ -43,6 +53,7 @@ Route::get('/racks/{rack}/edit', [RackController::class, 'edit']); Route::put('/racks/{rack}', [RackController::class, 'update']); Route::delete('/racks/{rack}', [RackController::class, 'destroy']); +Route::post('/racks/{rack}/reordenar', [RackController::class, 'reordenar']); // Patch Panels Route::get('/patch-panels/create', [PatchPanelController::class, 'create']); @@ -90,14 +101,4 @@ // Editar tipo de porta patch panels Route::get('/patch-panels/{patchPanel}/editar-tipo-porta/{sala}', [PatchPanelController::class, 'editarTipoPorta']); -Route::put('/patch-panels/{patchPanel}/atualizar-tipo-porta/{sala}', [PatchPanelController::class, 'atualizarTipoPorta']); - -// Vincular salas a patch panels -Route::get('/salas/{sala}/selecionar-rack', [SalaController::class, 'selecionarRack']); -Route::get('/salas/{sala}/selecionar-patchpanel/{rack}', [SalaController::class, 'selecionarPatchPanel']); -Route::post('/salas/{sala}/vincular-patchpanel', [SalaController::class, 'vincularPatchPanel']); -Route::delete('/salas/{sala}/desvincular-patchpanel/{patchPanel}', [SalaController::class, 'desvincularPatchPanel']); - -// Editar tipo de porta sakas -Route::get('/salas/{sala}/editar-tipo-porta/{patchPanel}', [SalaController::class, 'editarTipoPorta']); -Route::put('/salas/{sala}/atualizar-tipo-porta/{patchPanel}', [SalaController::class, 'atualizarTipoPorta']); \ No newline at end of file +Route::put('/patch-panels/{patchPanel}/atualizar-tipo-porta/{sala}', [PatchPanelController::class, 'atualizarTipoPorta']); \ No newline at end of file From 03c0fadbc731bd60858c8b110876dc931d62ec67 Mon Sep 17 00:00:00 2001 From: Alan Neves Date: Mon, 31 Aug 2026 12:03:28 -0300 Subject: [PATCH 2/6] Adiciona e atualiza views para nova estrutura MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Cria views CRUD de modelos de switch - Atualiza formulários de equipamento com modelo_switch_id e tipo - Atualiza show de equipamento com dados do modelo vinculado - Redesenha show do rack com layout lado a lado e diagramas visuais - Remove views obsoletas de vinculação de patch panels às salas --- resources/views/equipamentos/create.blade.php | 131 ++++++++++-------- resources/views/equipamentos/edit.blade.php | 123 ++++++++-------- resources/views/equipamentos/show.blade.php | 81 ++++------- .../views/modelo-switches/create.blade.php | 42 ++++++ .../views/modelo-switches/edit.blade.php | 43 ++++++ .../views/modelo-switches/index.blade.php | 45 ++++++ .../views/racks/partials/equipment.blade.php | 34 ++--- .../racks/partials/patch_panel.blade.php | 30 ++-- resources/views/racks/show.blade.php | 74 +++++++++- .../views/salas/editar-tipo-porta.blade.php | 36 ----- .../salas/selecionar-patchpanel.blade.php | 114 --------------- .../views/salas/selecionar-rack.blade.php | 26 ---- resources/views/salas/show.blade.php | 25 +--- 13 files changed, 398 insertions(+), 406 deletions(-) create mode 100644 resources/views/modelo-switches/create.blade.php create mode 100644 resources/views/modelo-switches/edit.blade.php create mode 100644 resources/views/modelo-switches/index.blade.php delete mode 100644 resources/views/salas/editar-tipo-porta.blade.php delete mode 100644 resources/views/salas/selecionar-patchpanel.blade.php delete mode 100644 resources/views/salas/selecionar-rack.blade.php diff --git a/resources/views/equipamentos/create.blade.php b/resources/views/equipamentos/create.blade.php index 84f8adc..7e17e52 100644 --- a/resources/views/equipamentos/create.blade.php +++ b/resources/views/equipamentos/create.blade.php @@ -3,76 +3,89 @@ @section('content')
-
- - Cadastrar Novo Equipamento - -
+ Cadastrar Novo Equipamento
@csrf - -
- - -
- -
- - -
- -
- - -
- -
- - +
+
+ + + @error('rack_id')
{{ $message }}
@enderror +
+
+ + + @error('modelo_switch_id')
{{ $message }}
@enderror +
+
- -
- - +
+
+ + + @error('hostname')
{{ $message }}
@enderror +
+
+ + + @error('ip')
{{ $message }}
@enderror +
+
+ + + @error('tipo')
{{ $message }}
@enderror +
-
-
- - -
+ +
- +
- - - Cancelar - + + Cancelar
+@endsection + +@section('javascripts_bottom') + @endsection \ No newline at end of file diff --git a/resources/views/equipamentos/edit.blade.php b/resources/views/equipamentos/edit.blade.php index 028d7e3..bfc4f47 100644 --- a/resources/views/equipamentos/edit.blade.php +++ b/resources/views/equipamentos/edit.blade.php @@ -3,73 +3,86 @@ @section('content')
-
- - Editar Equipamento: {{ $equipamento->hostname }} - -
+ Editar Equipamento: {{ $equipamento->hostname }}
@csrf @method('PUT') - -
- - -
- -
- - -
- -
- - -
- -
- - +
+
+ + + @error('rack_id')
{{ $message }}
@enderror +
+
+ + + @error('modelo_switch_id')
{{ $message }}
@enderror +
+
- -
- - +
+
+ + + @error('hostname')
{{ $message }}
@enderror +
+
+ + + @error('ip')
{{ $message }}
@enderror +
+
+ + + @error('tipo')
{{ $message }}
@enderror +
-
-
- poe_type) ? 'checked' : '' }}> - -
+ +
-
- - - Cancelar - + + Cancelar
+@endsection + +@section('javascripts_bottom') + @endsection \ No newline at end of file diff --git a/resources/views/equipamentos/show.blade.php b/resources/views/equipamentos/show.blade.php index 0e828a5..fb86cab 100644 --- a/resources/views/equipamentos/show.blade.php +++ b/resources/views/equipamentos/show.blade.php @@ -1,77 +1,49 @@ @extends('main') @section('content') -
-
-
- - Equipamento: {{ $equipamento->hostname }} - - Rack: {{ $equipamento->rack->nome }} | Prédio: {{ $equipamento->rack->predio->nome }} - - - -
+
+ + {{ $equipamento->hostname }} + {{ $equipamento->tipo_label }} + + Voltar
-
-
+
-
-
-
Informações do Equipamento
-
-
-
    -
  • Hostname: {{ $equipamento->hostname }}
  • -
  • Modelo: {{ $equipamento->model }}
  • -
  • IP: {{ $equipamento->ip }}
  • -
  • Quantidade de Portas: {{ $equipamento->qtde_portas }}
  • -
  • - PoE: - @if($equipamento->poe_type) - Sim - @else - Não - @endif -
  • -
  • Prédio: {{ $equipamento->rack->predio->nome }}
  • -
  • Rack: {{ $equipamento->rack->nome }}
  • -
-
-
+
    +
  • Hostname: {{ $equipamento->hostname }}
  • +
  • IP: {{ $equipamento->ip }}
  • +
  • Modelo: {{ $equipamento->modeloSwitch?->nome ?? '-' }}
  • +
  • Fabricante: {{ $equipamento->modeloSwitch?->fabricante ?? '-' }}
  • +
  • Portas: {{ $equipamento->qtde_portas }}
  • +
  • Portas PoE: {{ $equipamento->qtde_portas_poe > 0 ? $equipamento->qtde_portas_poe : 'Não' }}
  • +
  • Tipo: {{ $equipamento->tipo_label }}
  • +
  • Rack: {{ $equipamento->rack->nome }} ({{ $equipamento->rack->predio->nome }})
  • + @if($equipamento->comentario) +
  • Comentário: {{ $equipamento->comentario }}
  • + @endif +
-
+
-
Portas do Equipamento ({{ $equipamento->qtde_portas }})
+
Portas ({{ $equipamento->qtde_portas }})
- - - - - + @for($i = 1; $i <= $equipamento->qtde_portas; $i++) - - + + @endfor @@ -81,5 +53,4 @@ - -@endsection +@endsection \ No newline at end of file diff --git a/resources/views/modelo-switches/create.blade.php b/resources/views/modelo-switches/create.blade.php new file mode 100644 index 0000000..bf533e1 --- /dev/null +++ b/resources/views/modelo-switches/create.blade.php @@ -0,0 +1,42 @@ +@extends('main') + +@section('content') +
+
+ Cadastrar Modelo de Switch +
+
+
+ @csrf +
+
+ + + @error('fabricante')
{{ $message }}
@enderror +
+
+ + + @error('nome')
{{ $message }}
@enderror +
+
+
+
+ + + @error('qtde_portas')
{{ $message }}
@enderror +
+
+ + + @error('qtde_portas_poe')
{{ $message }}
@enderror +
+
+
+ + Cancelar +
+ +
+
+@endsection \ No newline at end of file diff --git a/resources/views/modelo-switches/edit.blade.php b/resources/views/modelo-switches/edit.blade.php new file mode 100644 index 0000000..3d34842 --- /dev/null +++ b/resources/views/modelo-switches/edit.blade.php @@ -0,0 +1,43 @@ +@extends('main') + +@section('content') +
+
+ Editar Modelo: {{ $modelo->nome }} +
+
+
+ @csrf + @method('PUT') +
+
+ + + @error('fabricante')
{{ $message }}
@enderror +
+
+ + + @error('nome')
{{ $message }}
@enderror +
+
+
+
+ + + @error('qtde_portas')
{{ $message }}
@enderror +
+
+ + + @error('qtde_portas_poe')
{{ $message }}
@enderror +
+
+
+ + Cancelar +
+ +
+
+@endsection \ No newline at end of file diff --git a/resources/views/modelo-switches/index.blade.php b/resources/views/modelo-switches/index.blade.php new file mode 100644 index 0000000..f8fa180 --- /dev/null +++ b/resources/views/modelo-switches/index.blade.php @@ -0,0 +1,45 @@ +@extends('main') + +@section('content') +
+
+ Modelos de Switch + Novo Modelo +
+
+
+
PortaStatusAções
PortaStatusAções
{{ $i }} - Livre - - Botão vinculo - Livre
+ + + + + + + + + + + @foreach($modelos as $modelo) + + + + + + + + @endforeach + +
FabricanteModeloPortasPoEAções
{{ $modelo->fabricante }}{{ $modelo->nome }}{{ $modelo->qtde_portas }}{{ $modelo->qtde_portas_poe > 0 ? $modelo->qtde_portas_poe : '-' }} + Editar +
+ @csrf + @method('DELETE') + +
+
+
+
+
+@endsection \ No newline at end of file diff --git a/resources/views/racks/partials/equipment.blade.php b/resources/views/racks/partials/equipment.blade.php index 0d13404..d22de62 100644 --- a/resources/views/racks/partials/equipment.blade.php +++ b/resources/views/racks/partials/equipment.blade.php @@ -24,14 +24,14 @@
- + + \ No newline at end of file diff --git a/resources/views/racks/show.blade.php b/resources/views/racks/show.blade.php index 3eb57d8..98d9ac2 100644 --- a/resources/views/racks/show.blade.php +++ b/resources/views/racks/show.blade.php @@ -37,16 +37,21 @@ + - + @foreach($rack->equipamentos as $equipamento) - + +
Hostname / Modelo Ações
+ + {{ $equipamento->hostname }}
- {{ $equipamento->model }} + {{ $equipamento->modeloSwitch?->nome ?? 'Sem modelo' }}
+ {{ $equipamento->tipo_label }}
@@ -93,13 +98,17 @@ + - + @foreach($rack->patchPanels as $patchPanel) - + + - @@ -61,23 +55,6 @@ - @endif - @endforeach From 149738661b3cc6767578ecbf6f1ccba2f284909b Mon Sep 17 00:00:00 2001 From: Alan Neves Date: Mon, 31 Aug 2026 12:04:01 -0300 Subject: [PATCH 3/6] Adiciona testes de browser (Dusk) para principais funcionalidades - Testes: Index, Login, CriarPredio, CriarSala, CriarRack, CriarPatchPanel, CriarTipoPorta, CriarModeloSwitch, CriarEquipamento - Configura phpunit.dusk.xml com suite de testes --- phpunit.dusk.xml | 23 ++++++++++++ tests/Browser/CriarEquipamentoTest.php | 50 +++++++++++++++++++++++++ tests/Browser/CriarModeloSwitchTest.php | 46 +++++++++++++++++++++++ tests/Browser/CriarPatchPanelTest.php | 42 +++++++++++++++++++++ tests/Browser/CriarPredioTest.php | 44 ++++++++++++++++++++++ tests/Browser/CriarRackTest.php | 41 ++++++++++++++++++++ tests/Browser/CriarSalaTest.php | 40 ++++++++++++++++++++ tests/Browser/CriarTipoPortaTest.php | 41 ++++++++++++++++++++ tests/Browser/IndexTest.php | 21 +++++++++++ 9 files changed, 348 insertions(+) create mode 100644 phpunit.dusk.xml create mode 100644 tests/Browser/CriarEquipamentoTest.php create mode 100644 tests/Browser/CriarModeloSwitchTest.php create mode 100644 tests/Browser/CriarPatchPanelTest.php create mode 100644 tests/Browser/CriarPredioTest.php create mode 100644 tests/Browser/CriarRackTest.php create mode 100644 tests/Browser/CriarSalaTest.php create mode 100644 tests/Browser/CriarTipoPortaTest.php create mode 100644 tests/Browser/IndexTest.php diff --git a/phpunit.dusk.xml b/phpunit.dusk.xml new file mode 100644 index 0000000..e5c2ef3 --- /dev/null +++ b/phpunit.dusk.xml @@ -0,0 +1,23 @@ + + + + + ./tests/Browser/IndexTest.php + ./tests/Browser/LoginTest.php + ./tests/Browser/CriarPredioTest.php + ./tests/Browser/CriarSalaTest.php + ./tests/Browser/CriarRackTest.php + ./tests/Browser/CriarPatchPanelTest.php + ./tests/Browser/CriarTipoPortaTest.php + ./tests/Browser/CriarModeloSwitchTest.php + ./tests/Browser/CriarEquipamentoTest.php + + + \ No newline at end of file diff --git a/tests/Browser/CriarEquipamentoTest.php b/tests/Browser/CriarEquipamentoTest.php new file mode 100644 index 0000000..a7eff29 --- /dev/null +++ b/tests/Browser/CriarEquipamentoTest.php @@ -0,0 +1,50 @@ +browse(function (Browser $browser) { + // Login como admin + $browser->visit('/login') + ->type('#callback', 'http://rede/callback') + ->type('#loginUsuario', '1111') + ->press('Login') + ->pause('100'); + + // Vai para lista de prédios + $browser->clickLink('Prédios') + ->assertPathIs('/predios') + ->clickLink('Ver'); + + // Entra no primeiro rack + $browser->click('a[href="/racks/1"]') + ->assertPathIs('/racks/1'); + + // Clica no botão "Novo" dos equipamentos (seletor CSS pelo href) + $browser->click('a[href="/equipamentos/create?rack_id=1"]') + ->assertPathIs('/equipamentos/create'); + + // Preenche formulário + $browser->select('modelo_switch_id', '1') + ->type('hostname', 'SW-TESTE-01') + ->type('ip', '192.168.1.100') + ->select('tipo', 'A') + ->press('Salvar') + ->pause('100'); + + // Verifica se o equipamento foi criado + $browser->assertSee('Equipamento criado com sucesso!') + ->assertSee('SW-TESTE-01'); + }); + } +} \ No newline at end of file diff --git a/tests/Browser/CriarModeloSwitchTest.php b/tests/Browser/CriarModeloSwitchTest.php new file mode 100644 index 0000000..222853e --- /dev/null +++ b/tests/Browser/CriarModeloSwitchTest.php @@ -0,0 +1,46 @@ +browse(function (Browser $browser) { + // Login como admin + $browser->visit('/login') + ->type('#callback', 'http://rede/callback') + ->type('#loginUsuario', '1111') + ->press('Login') + ->pause('100'); + + // Vai para lista de modelos de switch + $browser->clickLink('Modelos de Switch') + ->assertPathIs('/modelo-switches'); + + // Cria novo modelo + $browser->clickLink('Novo Modelo') + ->assertPathIs('/modelo-switches/create'); + + // Preenche formulário + $browser->type('nome', 'Switch Teste 24G') + ->type('fabricante', 'HP') + ->type('qtde_portas', '24') + ->type('qtde_portas_poe', '12') + ->press('Salvar') + ->pause('100'); + + // Verifica se o modelo foi criado + $browser->assertPathIs('/modelo-switches') + ->assertSee('Modelo cadastrado com sucesso!') + ->assertSee('Switch Teste 24G'); + }); + } +} diff --git a/tests/Browser/CriarPatchPanelTest.php b/tests/Browser/CriarPatchPanelTest.php new file mode 100644 index 0000000..05d23b5 --- /dev/null +++ b/tests/Browser/CriarPatchPanelTest.php @@ -0,0 +1,42 @@ +browse(function (Browser $browser) { + // Login como admin + $browser->visit('/login') + ->type('#callback', 'http://rede/callback') + ->type('#loginUsuario', '1111') + ->press('Login'); + // Vai diretamente para a lista de prédios + $browser->clickLink('Prédios') + ->assertPathIs('/predios') + ->clickLink('Ver'); + // Vai para lista de patch panel + $browser->click('a[href="/racks/1"]') + ->assertPathIs('/racks/1'); + // Clica no link para criar novo patch panel + $browser->click('a[href="/patch-panels/create?rack_id=1"]') + ->assertPathIs('/patch-panels/create'); + + // Preenche formulário + $browser->type('nome', '1.0') + ->type('qtde_portas', '24') + ->press('Salvar'); + // Verifica se o patch panel foi criada + $browser->assertSee('Patch panel criado com sucesso!') + ->assertSee('1.0'); + }); + } +} diff --git a/tests/Browser/CriarPredioTest.php b/tests/Browser/CriarPredioTest.php new file mode 100644 index 0000000..50a8c6b --- /dev/null +++ b/tests/Browser/CriarPredioTest.php @@ -0,0 +1,44 @@ +browse(function (Browser $browser) { + // Login como admin + $browser->visit('/login') + ->type('#callback', 'http://rede/callback') + ->type('#loginUsuario', '1111') + ->press('Login') + ->pause('100'); + // Vai diretamente para a lista de prédios + $browser->clickLink('Prédios') + ->assertPathIs('/predios'); + // Cria novo prédio + $browser->clickLink('Adicionar Novo Prédio') + ->assertPathIs('/predios/create'); + + // Preenche formulário + $browser->type('nome', 'Prédio Teste Dusk') + ->type('descricao', 'Descrição do prédio') + ->press('Salvar') + ->pause('100'); + + // Verifica se o prédio foi criado + $browser->assertPathIs('/predios') + ->assertSee('Prédio criado com sucesso!') + ->assertSee('Prédio Teste Dusk'); + }); + } +} diff --git a/tests/Browser/CriarRackTest.php b/tests/Browser/CriarRackTest.php new file mode 100644 index 0000000..4b50c1b --- /dev/null +++ b/tests/Browser/CriarRackTest.php @@ -0,0 +1,41 @@ +browse(function (Browser $browser) { + // Login como admin + $browser->visit('/login') + ->type('#callback', 'http://rede/callback') + ->type('#loginUsuario', '1111') + ->press('Login') + ->pause('100'); + // Vai diretamente para a lista de prédios + $browser->clickLink('Prédios') + ->assertPathIs('/predios') + ->clickLink('Ver'); + + // Clica no link para criar novo rack + $browser->clickLink('Novo Rack') + ->assertPathIs('/racks/create'); + + // Preenche formulário + $browser->type('nome', 'Rack A') + ->press('Salvar') + ->pause('100'); + // Verifica se o rack foi criado + $browser->assertSee('Rack criado com sucesso!') + ->assertSee('Rack A'); + }); + } +} diff --git a/tests/Browser/CriarSalaTest.php b/tests/Browser/CriarSalaTest.php new file mode 100644 index 0000000..5ae9088 --- /dev/null +++ b/tests/Browser/CriarSalaTest.php @@ -0,0 +1,40 @@ +browse(function (Browser $browser) { + // Login como admin + $browser->visit('/login') + ->type('#callback', 'http://rede/callback') + ->type('#loginUsuario', '1111') + ->press('Login') + ->pause('100'); + // Vai diretamente para a lista de prédios + $browser->clickLink('Prédios') + ->assertPathIs('/predios') + ->clickLink('Ver'); + + // Clica no link para criar nova sala + $browser->clickLink('Novo Local/Sala') + ->assertPathIs('/salas/create'); + // Preenche formulário + $browser->type('nome', 'Sala Teste 101') + ->press('Salvar') + ->pause('100'); + // Verifica se a sala foi criada + $browser->assertSee('Sala criada com sucesso!') + ->assertSee('Sala Teste 101'); + }); + } +} diff --git a/tests/Browser/CriarTipoPortaTest.php b/tests/Browser/CriarTipoPortaTest.php new file mode 100644 index 0000000..63e7bbc --- /dev/null +++ b/tests/Browser/CriarTipoPortaTest.php @@ -0,0 +1,41 @@ +browse(function (Browser $browser) { + // Login como admin + $browser->visit('/login') + ->type('#callback', 'http://rede/callback') + ->type('#loginUsuario', '1111') + ->press('Login') + ->pause('100'); + // Vai diretamente para a lista de tipo de portas + $browser->clickLink('Tipos de Porta') + ->assertPathIs('/tipo-portas'); + // Cria novo tipo de porta + $browser->clickLink('Novo Tipo') + ->assertPathIs('/tipo-portas/create'); + + // Preenche formulário + $browser->type('nome', 'Voip') + ->press('Salvar') + ->pause('100'); + + // Verifica se o tipo de porta foi criado + $browser->assertPathIs('/tipo-portas') + ->assertSee('Tipo de porta criado com sucesso!') + ->assertSee('Voip'); + }); + } +} diff --git a/tests/Browser/IndexTest.php b/tests/Browser/IndexTest.php new file mode 100644 index 0000000..1d159d5 --- /dev/null +++ b/tests/Browser/IndexTest.php @@ -0,0 +1,21 @@ +browse(function (Browser $browser) { + $browser->visit('/') + ->assertSee('Sistema rede'); + }); + } +} From 933ec306046a02b5ed198ac87080073b4c5b1239 Mon Sep 17 00:00:00 2001 From: Alan Neves Date: Mon, 31 Aug 2026 12:05:44 -0300 Subject: [PATCH 4/6] =?UTF-8?q?Remove=20request=20obsoleto=20de=20vincula?= =?UTF-8?q?=C3=A7=C3=A3o=20de=20porta=20=C3=A0=20sala?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Requests/VincularPortaSalaRequest.php | 43 ------------------- 1 file changed, 43 deletions(-) delete mode 100644 app/Http/Requests/VincularPortaSalaRequest.php diff --git a/app/Http/Requests/VincularPortaSalaRequest.php b/app/Http/Requests/VincularPortaSalaRequest.php deleted file mode 100644 index 54962e4..0000000 --- a/app/Http/Requests/VincularPortaSalaRequest.php +++ /dev/null @@ -1,43 +0,0 @@ - 'required|exists:racks,id', - 'patch_panel_id' => 'required|exists:patch_panels,id', - 'portas' => 'required|array|min:1', - 'portas.*' => 'integer|min:1', - 'tipos_porta' => 'required|array', - 'tipos_porta.*' => 'nullable|exists:tipo_portas,id' - ]; - } - - public function messages(): array - { - return [ - 'rack_id.required' => 'O rack é obrigatório', - 'rack_id.exists' => 'O rack selecionado é inválido', - 'patch_panel_id.required' => 'O patch panel é obrigatório', - 'patch_panel_id.exists' => 'O patch panel selecionado é inválido', - 'portas.required' => 'Selecione pelo menos uma porta', - 'portas.array' => 'O formato das portas é inválido', - 'portas.min' => 'Selecione pelo menos uma porta', - 'portas.*.integer' => 'O número da porta deve ser um número inteiro', - 'portas.*.min' => 'O número da porta deve ser pelo menos 1', - 'tipos_porta.required' => 'Os tipos de porta são obrigatórios', - 'tipos_porta.array' => 'O formato dos tipos de porta é inválido', - 'tipos_porta.*.exists' => 'Tipo de porta inválido' - ]; - } -} \ No newline at end of file From c7ea978fa947b37c2ebafdd5442bfd078bdf8601 Mon Sep 17 00:00:00 2001 From: Alan Neves Date: Mon, 31 Aug 2026 12:14:58 -0300 Subject: [PATCH 5/6] atualizando .env.example --- .env.example | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/.env.example b/.env.example index dbdbdf6..46b7230 100644 --- a/.env.example +++ b/.env.example @@ -61,14 +61,6 @@ REPLICADO_CODUNDCLG= REPLICADO_SYBASE= REPLICADO_FAKE=1 -# SENHAUNICA-SOCIALITE ###################################### -# https://github.com/uspdev/senhaunica-socialite -SENHAUNICA_KEY=faker -SENHAUNICA_SECRET=faker -SENHAUNICA_CALLBACK_ID=1 -SENHAUNICA_ADMINS=110011 -SENHAUNICA_DEV="http://auth.local:3141/wsusuario/oauth" - # URL do servidor oauth no ambiente de dev (default: no) #SENHAUNICA_DEV="https://dev.uspdigital.usp.br/wsusuario/oauth" @@ -94,4 +86,12 @@ DUSK_DRIVER_URL='http://selenium:4444/wd/hub' DUSK_START_MAXIMIZED=true DUSK_HEADLESS_DISABLED=true -USP_THEME_SKIN=uspdev +# SENHAUNICA-SOCIALITE ###################################### +# https://github.com/uspdev/senhaunica-socialite +SENHAUNICA_KEY=faker +SENHAUNICA_SECRET=faker +SENHAUNICA_CALLBACK_ID=1 +SENHAUNICA_ADMINS=1111 +SENHAUNICA_DEV="http://auth.local:3141/wsusuario/oauth" + +USP_THEME_SKIN=uspdev From 1f283a2766dbfc3eb9e72518af536f8e174c8063 Mon Sep 17 00:00:00 2001 From: Alan Neves Date: Mon, 31 Aug 2026 13:06:52 -0300 Subject: [PATCH 6/6] Ajusta testes dusk para workflow do github --- tests/Browser/CriarEquipamentoTest.php | 19 ++++++++-------- tests/Browser/CriarModeloSwitchTest.php | 13 +++++------ tests/Browser/CriarPatchPanelTest.php | 29 +++++++++++++++---------- tests/Browser/CriarPredioTest.php | 11 +++++----- tests/Browser/CriarRackTest.php | 12 +++++----- tests/Browser/CriarSalaTest.php | 12 +++++----- tests/Browser/CriarTipoPortaTest.php | 13 +++++------ 7 files changed, 58 insertions(+), 51 deletions(-) diff --git a/tests/Browser/CriarEquipamentoTest.php b/tests/Browser/CriarEquipamentoTest.php index a7eff29..2feb174 100644 --- a/tests/Browser/CriarEquipamentoTest.php +++ b/tests/Browser/CriarEquipamentoTest.php @@ -19,31 +19,32 @@ public function test_criar_equipamento(): void ->type('#callback', 'http://rede/callback') ->type('#loginUsuario', '1111') ->press('Login') - ->pause('100'); + ->waitForText('Sistema rede', 5); // Vai para lista de prédios $browser->clickLink('Prédios') - ->assertPathIs('/predios') + ->waitForLocation('/predios', 5) ->clickLink('Ver'); // Entra no primeiro rack - $browser->click('a[href="/racks/1"]') - ->assertPathIs('/racks/1'); + $browser->waitFor('a[href="/racks/1"]', 5) + ->click('a[href="/racks/1"]') + ->waitForLocation('/racks/1', 5); - // Clica no botão "Novo" dos equipamentos (seletor CSS pelo href) + // Clica no botão "Novo" dos equipamentos $browser->click('a[href="/equipamentos/create?rack_id=1"]') - ->assertPathIs('/equipamentos/create'); + ->waitForLocation('/equipamentos/create', 5); // Preenche formulário $browser->select('modelo_switch_id', '1') ->type('hostname', 'SW-TESTE-01') ->type('ip', '192.168.1.100') ->select('tipo', 'A') - ->press('Salvar') - ->pause('100'); + ->waitFor('button[type="submit"]', 5) + ->press('Salvar'); // Verifica se o equipamento foi criado - $browser->assertSee('Equipamento criado com sucesso!') + $browser->waitForText('Equipamento criado com sucesso!', 5) ->assertSee('SW-TESTE-01'); }); } diff --git a/tests/Browser/CriarModeloSwitchTest.php b/tests/Browser/CriarModeloSwitchTest.php index 222853e..5b0f454 100644 --- a/tests/Browser/CriarModeloSwitchTest.php +++ b/tests/Browser/CriarModeloSwitchTest.php @@ -19,27 +19,26 @@ public function test_criar_modelo_siwtch(): void ->type('#callback', 'http://rede/callback') ->type('#loginUsuario', '1111') ->press('Login') - ->pause('100'); + ->waitForText('Sistema rede', 5); // Vai para lista de modelos de switch $browser->clickLink('Modelos de Switch') - ->assertPathIs('/modelo-switches'); + ->waitForLocation('/modelo-switches', 5); // Cria novo modelo $browser->clickLink('Novo Modelo') - ->assertPathIs('/modelo-switches/create'); + ->waitForLocation('/modelo-switches/create', 5); // Preenche formulário $browser->type('nome', 'Switch Teste 24G') ->type('fabricante', 'HP') ->type('qtde_portas', '24') ->type('qtde_portas_poe', '12') - ->press('Salvar') - ->pause('100'); + ->waitFor('button[type="submit"]', 5) + ->press('Salvar'); // Verifica se o modelo foi criado - $browser->assertPathIs('/modelo-switches') - ->assertSee('Modelo cadastrado com sucesso!') + $browser->waitForText('Modelo cadastrado com sucesso!', 5) ->assertSee('Switch Teste 24G'); }); } diff --git a/tests/Browser/CriarPatchPanelTest.php b/tests/Browser/CriarPatchPanelTest.php index 05d23b5..a8aa16e 100644 --- a/tests/Browser/CriarPatchPanelTest.php +++ b/tests/Browser/CriarPatchPanelTest.php @@ -18,24 +18,29 @@ public function test_criar_patch_panel(): void $browser->visit('/login') ->type('#callback', 'http://rede/callback') ->type('#loginUsuario', '1111') - ->press('Login'); - // Vai diretamente para a lista de prédios + ->press('Login') + ->waitForText('Sistema rede', 5); + + // Navega até o rack $browser->clickLink('Prédios') - ->assertPathIs('/predios') - ->clickLink('Ver'); - // Vai para lista de patch panel - $browser->click('a[href="/racks/1"]') - ->assertPathIs('/racks/1'); - // Clica no link para criar novo patch panel + ->waitForLocation('/predios', 5) + ->clickLink('Ver') + ->waitFor('a[href="/racks/1"]', 5) + ->click('a[href="/racks/1"]') + ->waitForLocation('/racks/1', 5); + + // Clica em novo patch panel $browser->click('a[href="/patch-panels/create?rack_id=1"]') - ->assertPathIs('/patch-panels/create'); + ->waitForLocation('/patch-panels/create', 5); - // Preenche formulário + // Preenche e salva $browser->type('nome', '1.0') ->type('qtde_portas', '24') + ->waitFor('button[type="submit"]', 5) ->press('Salvar'); - // Verifica se o patch panel foi criada - $browser->assertSee('Patch panel criado com sucesso!') + + // Aguarda redirect e mensagem de sucesso + $browser->waitForText('Patch panel criado com sucesso!', 5) ->assertSee('1.0'); }); } diff --git a/tests/Browser/CriarPredioTest.php b/tests/Browser/CriarPredioTest.php index 50a8c6b..e0d6ce3 100644 --- a/tests/Browser/CriarPredioTest.php +++ b/tests/Browser/CriarPredioTest.php @@ -21,23 +21,22 @@ public function test_criar_predio(): void ->type('#callback', 'http://rede/callback') ->type('#loginUsuario', '1111') ->press('Login') - ->pause('100'); + ->waitForText('Sistema rede', 5); // Vai diretamente para a lista de prédios $browser->clickLink('Prédios') ->assertPathIs('/predios'); // Cria novo prédio $browser->clickLink('Adicionar Novo Prédio') - ->assertPathIs('/predios/create'); + ->waitForLocation('/predios/create', 5); // Preenche formulário $browser->type('nome', 'Prédio Teste Dusk') ->type('descricao', 'Descrição do prédio') - ->press('Salvar') - ->pause('100'); + ->waitFor('button[type="submit"]', 5) + ->press('Salvar'); // Verifica se o prédio foi criado - $browser->assertPathIs('/predios') - ->assertSee('Prédio criado com sucesso!') + $browser->waitForText('Prédio criado com sucesso!', 5) ->assertSee('Prédio Teste Dusk'); }); } diff --git a/tests/Browser/CriarRackTest.php b/tests/Browser/CriarRackTest.php index 4b50c1b..269c908 100644 --- a/tests/Browser/CriarRackTest.php +++ b/tests/Browser/CriarRackTest.php @@ -19,22 +19,24 @@ public function test__criar_rack(): void ->type('#callback', 'http://rede/callback') ->type('#loginUsuario', '1111') ->press('Login') - ->pause('100'); + ->waitForText('Sistema rede', 5); // Vai diretamente para a lista de prédios $browser->clickLink('Prédios') - ->assertPathIs('/predios') - ->clickLink('Ver'); + ->waitForLocation('/predios', 5) + ->clickLink('Ver') + ->waitFor('a[href="/racks/create?predio_id=1"]', 5); // Clica no link para criar novo rack $browser->clickLink('Novo Rack') - ->assertPathIs('/racks/create'); + ->waitForLocation('/racks/create', 5); // Preenche formulário $browser->type('nome', 'Rack A') + ->waitFor('button[type="submit"]', 5) ->press('Salvar') ->pause('100'); // Verifica se o rack foi criado - $browser->assertSee('Rack criado com sucesso!') + $browser->waitForText('Rack criado com sucesso!', 5) ->assertSee('Rack A'); }); } diff --git a/tests/Browser/CriarSalaTest.php b/tests/Browser/CriarSalaTest.php index 5ae9088..4c2393f 100644 --- a/tests/Browser/CriarSalaTest.php +++ b/tests/Browser/CriarSalaTest.php @@ -19,21 +19,23 @@ public function test_criar_sala(): void ->type('#callback', 'http://rede/callback') ->type('#loginUsuario', '1111') ->press('Login') - ->pause('100'); + ->waitForText('Sistema rede', 5); // Vai diretamente para a lista de prédios $browser->clickLink('Prédios') - ->assertPathIs('/predios') - ->clickLink('Ver'); + ->waitForLocation('/predios', 5) + ->clickLink('Ver') + ->waitFor('a[href="/salas/create?predio_id=1"]', 5); // Clica no link para criar nova sala $browser->clickLink('Novo Local/Sala') - ->assertPathIs('/salas/create'); + ->waitForLocation('/salas/create', 5); // Preenche formulário $browser->type('nome', 'Sala Teste 101') + ->waitFor('button[type="submit"]', 5) ->press('Salvar') ->pause('100'); // Verifica se a sala foi criada - $browser->assertSee('Sala criada com sucesso!') + $browser->waitForText('Sala criada com sucesso!', 5) ->assertSee('Sala Teste 101'); }); } diff --git a/tests/Browser/CriarTipoPortaTest.php b/tests/Browser/CriarTipoPortaTest.php index 63e7bbc..d0280bb 100644 --- a/tests/Browser/CriarTipoPortaTest.php +++ b/tests/Browser/CriarTipoPortaTest.php @@ -19,22 +19,21 @@ public function test_criar_tipo_porta(): void ->type('#callback', 'http://rede/callback') ->type('#loginUsuario', '1111') ->press('Login') - ->pause('100'); + ->waitForText('Sistema rede', 5); // Vai diretamente para a lista de tipo de portas $browser->clickLink('Tipos de Porta') - ->assertPathIs('/tipo-portas'); + ->waitForLocation('/tipo-portas', 5); // Cria novo tipo de porta $browser->clickLink('Novo Tipo') - ->assertPathIs('/tipo-portas/create'); + ->waitForLocation('/tipo-portas/create', 5); // Preenche formulário $browser->type('nome', 'Voip') - ->press('Salvar') - ->pause('100'); + ->waitFor('button[type="submit"]', 5) + ->press('Salvar'); // Verifica se o tipo de porta foi criado - $browser->assertPathIs('/tipo-portas') - ->assertSee('Tipo de porta criado com sucesso!') + $browser->waitForText('Tipo de porta criado com sucesso!', 5) ->assertSee('Voip'); }); }
Identificação / Portas Ações
+ + {{ $patchPanel->nome }}
{{ $patchPanel->qtde_portas }} portas @@ -158,4 +167,59 @@ +@endsection + +@section('javascripts_bottom') + + @endsection \ No newline at end of file diff --git a/resources/views/salas/editar-tipo-porta.blade.php b/resources/views/salas/editar-tipo-porta.blade.php deleted file mode 100644 index 063833f..0000000 --- a/resources/views/salas/editar-tipo-porta.blade.php +++ /dev/null @@ -1,36 +0,0 @@ -@extends('main') - -@section('content') -
-
-

- Editar Tipo de Porta - Porta {{ $porta }} - Sala: {{ $sala->nome }} | Patch Panel: {{ $patchPanel->nome }} -

-
-
-
- @csrf - @method('PUT') - - -
- - -
- -
- - Cancelar -
-
-
-
-@endsection \ No newline at end of file diff --git a/resources/views/salas/selecionar-patchpanel.blade.php b/resources/views/salas/selecionar-patchpanel.blade.php deleted file mode 100644 index 55e8fac..0000000 --- a/resources/views/salas/selecionar-patchpanel.blade.php +++ /dev/null @@ -1,114 +0,0 @@ -@extends('main') - -@section('content') -
-
-

- Vincular Porta de {{ $sala->nome }} - Rack: {{ $rack->nome }} - Prédio: {{ $sala->predio->nome }} -

-
-
- @if($patchPanels->isEmpty()) -
Nenhum patch panel disponível neste rack.
- @else -
-
-
-
-
Selecione um Patch Panel
-
-
-
- @foreach($patchPanels as $pp) - - {{ $pp->nome }} - - @endforeach -
-
-
-
- - @if(request('patch_panel_id')) - @php - $selectedPP = $patchPanels->firstWhere('id', request('patch_panel_id')); - $portasOcupadas = $selectedPP->salasVinculadas->pluck('pivot.porta')->toArray(); - $tipoPortas = \App\Models\TipoPorta::all(); - @endphp -
-
- @csrf - - - -
-
-
Portas do Patch Panel: {{ $selectedPP->nome }}
- Marque as portas que deseja vincular -
-
- @if(count($portasOcupadas) >= $selectedPP->qtde_portas) -
- Todas as portas deste patch panel estão ocupadas. -
- @else -
- @foreach(range(1, $selectedPP->qtde_portas) as $i) - @if(!in_array($i, $portasOcupadas)) -
-
-
-
- - -
- -
- - -
-
-
-
- @endif - @endforeach -
- @endif -
- -
-
-
- @else -
-
- Selecione um Patch Panel à esquerda para visualizar suas portas. -
-
- @endif -
- @endif -
-
-@endsection \ No newline at end of file diff --git a/resources/views/salas/selecionar-rack.blade.php b/resources/views/salas/selecionar-rack.blade.php deleted file mode 100644 index f07a31e..0000000 --- a/resources/views/salas/selecionar-rack.blade.php +++ /dev/null @@ -1,26 +0,0 @@ -@extends('main') - -@section('content') -
-
-

- Selecionar Rack para Vincular Porta - Local: {{ $sala->nome }} - Prédio: {{ $sala->predio->nome }} -

-
-
- - -
- Voltar -
-
-
-@endsection \ No newline at end of file diff --git a/resources/views/salas/show.blade.php b/resources/views/salas/show.blade.php index c3556ad..ebc6132 100644 --- a/resources/views/salas/show.blade.php +++ b/resources/views/salas/show.blade.php @@ -21,12 +21,7 @@
-

Portas Vinculadas

- @can('user') - - Vincular a uma Porta - - @endcan +

Portas Vinculadas Neste Local/Sala

@if($patchPanels->isEmpty()) @@ -41,7 +36,6 @@
Prédio Porta Tipo de PortaAções
- @can('user') -
- - Editar tipo de porta - -
- @csrf - @method('DELETE') - -
-
- @endcan -