mirror of
https://github.com/usetrmnl/byos_laravel.git
synced 2026-03-15 21:03:34 +00:00
Compare commits
No commits in common. "c59f3deed9d144ec9b227e24b52615d300db02b0" and "31ca919ba9c773e6724bcd7c495f9a4d664cdc2c" have entirely different histories.
c59f3deed9
...
31ca919ba9
20 changed files with 610 additions and 700 deletions
2
.github/FUNDING.yml
vendored
2
.github/FUNDING.yml
vendored
|
|
@ -1 +1 @@
|
||||||
custom: ["https://trmnl.com/?ref=laravel-trmnl"]
|
custom: ["https://usetrmnl.com/?ref=laravel-trmnl"]
|
||||||
|
|
|
||||||
2
.gitignore
vendored
2
.gitignore
vendored
|
|
@ -37,5 +37,3 @@ yarn-error.log
|
||||||
/.claude
|
/.claude
|
||||||
/AGENTS.md
|
/AGENTS.md
|
||||||
/opencode.json
|
/opencode.json
|
||||||
/.cursor
|
|
||||||
/.opencode
|
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@
|
||||||
[](https://github.com/usetrmnl/byos_laravel/actions/workflows/test.yml)
|
[](https://github.com/usetrmnl/byos_laravel/actions/workflows/test.yml)
|
||||||
|
|
||||||
TRMNL BYOS Laravel is a self-hostable implementation of a TRMNL server, built with Laravel.
|
TRMNL BYOS Laravel is a self-hostable implementation of a TRMNL server, built with Laravel.
|
||||||
It allows you to manage TRMNL devices, generate screens using **native plugins** (Screens API, Markup), **recipes** (120+ from the [OSS community catalog](https://bnussbau.github.io/trmnl-recipe-catalog/), 600+ from the [TRMNL catalog](https://trmnl.com/recipes), or your own), or the **API**, and can also act as a **proxy** for the native cloud service (Core). With over 40k downloads and 160+ stars, it’s the most popular community-driven BYOS.
|
It allows you to manage TRMNL devices, generate screens using **native plugins** (Screens API, Markup), **recipes** (120+ from the [OSS community catalog](https://bnussbau.github.io/trmnl-recipe-catalog/), 600+ from the [TRMNL catalog](https://usetrmnl.com/recipes), or your own), or the **API**, and can also act as a **proxy** for the native cloud service (Core). With over 40k downloads and 160+ stars, it’s the most popular community-driven BYOS.
|
||||||
|
|
||||||

|

|
||||||

|

|
||||||
|
|
@ -15,9 +15,9 @@ It allows you to manage TRMNL devices, generate screens using **native plugins**
|
||||||
* 📡 Device Information – Display battery status, WiFi strength, firmware version, and more.
|
* 📡 Device Information – Display battery status, WiFi strength, firmware version, and more.
|
||||||
* 🔍 Auto-Join – Automatically detects and adds devices from your local network.
|
* 🔍 Auto-Join – Automatically detects and adds devices from your local network.
|
||||||
* 🖥️ Screen Generation – Supports Plugins (including Mashups), Recipes, API, Markup, or updates via Code.
|
* 🖥️ Screen Generation – Supports Plugins (including Mashups), Recipes, API, Markup, or updates via Code.
|
||||||
* Support for TRMNL [Design Framework](https://trmnl.com/framework)
|
* Support for TRMNL [Design Framework](https://usetrmnl.com/framework)
|
||||||
* Compatible open-source recipes are available in the [community catalog](https://bnussbau.github.io/trmnl-recipe-catalog/)
|
* Compatible open-source recipes are available in the [community catalog](https://bnussbau.github.io/trmnl-recipe-catalog/)
|
||||||
* Import from the [TRMNL community recipe catalog](https://trmnl.com/recipes)
|
* Import from the [TRMNL community recipe catalog](https://usetrmnl.com/recipes)
|
||||||
* Supported Devices
|
* Supported Devices
|
||||||
* TRMNL OG (1-bit & 2-bit)
|
* TRMNL OG (1-bit & 2-bit)
|
||||||
* SeeedStudio TRMNL 7,5" (OG) DIY Kit
|
* SeeedStudio TRMNL 7,5" (OG) DIY Kit
|
||||||
|
|
@ -43,7 +43,7 @@ It allows you to manage TRMNL devices, generate screens using **native plugins**
|
||||||
### Support ❤️
|
### Support ❤️
|
||||||
This repo is maintained voluntarily by [@bnussbau](https://github.com/bnussbau).
|
This repo is maintained voluntarily by [@bnussbau](https://github.com/bnussbau).
|
||||||
|
|
||||||
Support the development of this package by purchasing a TRMNL device through the referral link: https://trmnl.com/?ref=laravel-trmnl. At checkout, use the code `laravel-trmnl` to receive a $15 discount on your purchase.
|
Support the development of this package by purchasing a TRMNL device through the referral link: https://usetrmnl.com/?ref=laravel-trmnl. At checkout, use the code `laravel-trmnl` to receive a $15 discount on your purchase.
|
||||||
|
|
||||||
or
|
or
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -19,7 +19,7 @@ final class FetchDeviceModelsJob implements ShouldQueue
|
||||||
{
|
{
|
||||||
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
|
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
|
||||||
|
|
||||||
private const API_URL = '/api/models';
|
private const API_URL = 'https://usetrmnl.com/api/models';
|
||||||
|
|
||||||
private const PALETTES_API_URL = 'http://usetrmnl.com/api/palettes';
|
private const PALETTES_API_URL = 'http://usetrmnl.com/api/palettes';
|
||||||
|
|
||||||
|
|
@ -39,7 +39,7 @@ final class FetchDeviceModelsJob implements ShouldQueue
|
||||||
try {
|
try {
|
||||||
$this->processPalettes();
|
$this->processPalettes();
|
||||||
|
|
||||||
$response = Http::timeout(30)->get(config('services.trmnl.base_url').self::API_URL);
|
$response = Http::timeout(30)->get(self::API_URL);
|
||||||
|
|
||||||
if (! $response->successful()) {
|
if (! $response->successful()) {
|
||||||
Log::error('Failed to fetch device models from API', [
|
Log::error('Failed to fetch device models from API', [
|
||||||
|
|
|
||||||
|
|
@ -22,9 +22,7 @@ class FirmwarePollJob implements ShouldQueue
|
||||||
public function handle(): void
|
public function handle(): void
|
||||||
{
|
{
|
||||||
try {
|
try {
|
||||||
$firmwareEndpoint = config('services.trmnl.base_url').'/api/firmware/latest';
|
$response = Http::get('https://usetrmnl.com/api/firmware/latest')->json();
|
||||||
|
|
||||||
$response = Http::get($firmwareEndpoint)->json();
|
|
||||||
|
|
||||||
if (! is_array($response) || ! isset($response['version']) || ! isset($response['url'])) {
|
if (! is_array($response) || ! isset($response['version']) || ! isset($response['url'])) {
|
||||||
Log::error('Invalid firmware response format received');
|
Log::error('Invalid firmware response format received');
|
||||||
|
|
|
||||||
|
|
@ -35,7 +35,7 @@
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"fakerphp/faker": "^1.23",
|
"fakerphp/faker": "^1.23",
|
||||||
"larastan/larastan": "^3.0",
|
"larastan/larastan": "^3.0",
|
||||||
"laravel/boost": "^2.0",
|
"laravel/boost": "^1.0",
|
||||||
"laravel/pail": "^1.2.2",
|
"laravel/pail": "^1.2.2",
|
||||||
"laravel/pint": "^1.18",
|
"laravel/pint": "^1.18",
|
||||||
"laravel/sail": "^1.41",
|
"laravel/sail": "^1.41",
|
||||||
|
|
|
||||||
360
composer.lock
generated
360
composer.lock
generated
|
|
@ -4,7 +4,7 @@
|
||||||
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
||||||
"This file is @generated automatically"
|
"This file is @generated automatically"
|
||||||
],
|
],
|
||||||
"content-hash": "324bc90c0d60675c736e4001ba845a5a",
|
"content-hash": "23163ec9d3efca34357cab8ee5219529",
|
||||||
"packages": [
|
"packages": [
|
||||||
{
|
{
|
||||||
"name": "aws/aws-crt-php",
|
"name": "aws/aws-crt-php",
|
||||||
|
|
@ -62,16 +62,16 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "aws/aws-sdk-php",
|
"name": "aws/aws-sdk-php",
|
||||||
"version": "3.369.21",
|
"version": "3.369.18",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/aws/aws-sdk-php.git",
|
"url": "https://github.com/aws/aws-sdk-php.git",
|
||||||
"reference": "7076af00534135cbbf6cc19eb2521124a3549f0d"
|
"reference": "48d809eda94dd528ef539cff827e7542ac01cce6"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/7076af00534135cbbf6cc19eb2521124a3549f0d",
|
"url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/48d809eda94dd528ef539cff827e7542ac01cce6",
|
||||||
"reference": "7076af00534135cbbf6cc19eb2521124a3549f0d",
|
"reference": "48d809eda94dd528ef539cff827e7542ac01cce6",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
|
|
@ -153,9 +153,9 @@
|
||||||
"support": {
|
"support": {
|
||||||
"forum": "https://github.com/aws/aws-sdk-php/discussions",
|
"forum": "https://github.com/aws/aws-sdk-php/discussions",
|
||||||
"issues": "https://github.com/aws/aws-sdk-php/issues",
|
"issues": "https://github.com/aws/aws-sdk-php/issues",
|
||||||
"source": "https://github.com/aws/aws-sdk-php/tree/3.369.21"
|
"source": "https://github.com/aws/aws-sdk-php/tree/3.369.18"
|
||||||
},
|
},
|
||||||
"time": "2026-01-27T19:14:48+00:00"
|
"time": "2026-01-22T19:05:57+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "bacon/bacon-qr-code",
|
"name": "bacon/bacon-qr-code",
|
||||||
|
|
@ -1831,16 +1831,16 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "laravel/fortify",
|
"name": "laravel/fortify",
|
||||||
"version": "v1.34.0",
|
"version": "v1.33.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/laravel/fortify.git",
|
"url": "https://github.com/laravel/fortify.git",
|
||||||
"reference": "c322715f2786210a722ed56966f7c9877b653b25"
|
"reference": "e0666dabeec0b6428678af1d51f436dcfb24e3a9"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/laravel/fortify/zipball/c322715f2786210a722ed56966f7c9877b653b25",
|
"url": "https://api.github.com/repos/laravel/fortify/zipball/e0666dabeec0b6428678af1d51f436dcfb24e3a9",
|
||||||
"reference": "c322715f2786210a722ed56966f7c9877b653b25",
|
"reference": "e0666dabeec0b6428678af1d51f436dcfb24e3a9",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
|
|
@ -1890,20 +1890,20 @@
|
||||||
"issues": "https://github.com/laravel/fortify/issues",
|
"issues": "https://github.com/laravel/fortify/issues",
|
||||||
"source": "https://github.com/laravel/fortify"
|
"source": "https://github.com/laravel/fortify"
|
||||||
},
|
},
|
||||||
"time": "2026-01-26T10:23:19+00:00"
|
"time": "2025-12-15T14:48:33+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "laravel/framework",
|
"name": "laravel/framework",
|
||||||
"version": "v12.49.0",
|
"version": "v12.48.1",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/laravel/framework.git",
|
"url": "https://github.com/laravel/framework.git",
|
||||||
"reference": "4bde4530545111d8bdd1de6f545fa8824039fcb5"
|
"reference": "0f0974a9769378ccd9c9935c09b9927f3a606830"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/laravel/framework/zipball/4bde4530545111d8bdd1de6f545fa8824039fcb5",
|
"url": "https://api.github.com/repos/laravel/framework/zipball/0f0974a9769378ccd9c9935c09b9927f3a606830",
|
||||||
"reference": "4bde4530545111d8bdd1de6f545fa8824039fcb5",
|
"reference": "0f0974a9769378ccd9c9935c09b9927f3a606830",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
|
|
@ -2112,20 +2112,20 @@
|
||||||
"issues": "https://github.com/laravel/framework/issues",
|
"issues": "https://github.com/laravel/framework/issues",
|
||||||
"source": "https://github.com/laravel/framework"
|
"source": "https://github.com/laravel/framework"
|
||||||
},
|
},
|
||||||
"time": "2026-01-28T03:40:49+00:00"
|
"time": "2026-01-20T16:12:36+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "laravel/prompts",
|
"name": "laravel/prompts",
|
||||||
"version": "v0.3.11",
|
"version": "v0.3.10",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/laravel/prompts.git",
|
"url": "https://github.com/laravel/prompts.git",
|
||||||
"reference": "dd2a2ed95acacbcccd32fd98dee4c946ae7a7217"
|
"reference": "360ba095ef9f51017473505191fbd4ab73e1cab3"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/laravel/prompts/zipball/dd2a2ed95acacbcccd32fd98dee4c946ae7a7217",
|
"url": "https://api.github.com/repos/laravel/prompts/zipball/360ba095ef9f51017473505191fbd4ab73e1cab3",
|
||||||
"reference": "dd2a2ed95acacbcccd32fd98dee4c946ae7a7217",
|
"reference": "360ba095ef9f51017473505191fbd4ab73e1cab3",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
|
|
@ -2169,22 +2169,22 @@
|
||||||
"description": "Add beautiful and user-friendly forms to your command-line applications.",
|
"description": "Add beautiful and user-friendly forms to your command-line applications.",
|
||||||
"support": {
|
"support": {
|
||||||
"issues": "https://github.com/laravel/prompts/issues",
|
"issues": "https://github.com/laravel/prompts/issues",
|
||||||
"source": "https://github.com/laravel/prompts/tree/v0.3.11"
|
"source": "https://github.com/laravel/prompts/tree/v0.3.10"
|
||||||
},
|
},
|
||||||
"time": "2026-01-27T02:55:06+00:00"
|
"time": "2026-01-13T20:29:29+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "laravel/sanctum",
|
"name": "laravel/sanctum",
|
||||||
"version": "v4.3.0",
|
"version": "v4.2.4",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/laravel/sanctum.git",
|
"url": "https://github.com/laravel/sanctum.git",
|
||||||
"reference": "c978c82b2b8ab685468a7ca35224497d541b775a"
|
"reference": "dadd2277ff0f05cdb435c8b6a0bcedcf3b5519a9"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/laravel/sanctum/zipball/c978c82b2b8ab685468a7ca35224497d541b775a",
|
"url": "https://api.github.com/repos/laravel/sanctum/zipball/dadd2277ff0f05cdb435c8b6a0bcedcf3b5519a9",
|
||||||
"reference": "c978c82b2b8ab685468a7ca35224497d541b775a",
|
"reference": "dadd2277ff0f05cdb435c8b6a0bcedcf3b5519a9",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
|
|
@ -2234,7 +2234,7 @@
|
||||||
"issues": "https://github.com/laravel/sanctum/issues",
|
"issues": "https://github.com/laravel/sanctum/issues",
|
||||||
"source": "https://github.com/laravel/sanctum"
|
"source": "https://github.com/laravel/sanctum"
|
||||||
},
|
},
|
||||||
"time": "2026-01-22T22:27:01+00:00"
|
"time": "2026-01-15T14:37:16+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "laravel/serializable-closure",
|
"name": "laravel/serializable-closure",
|
||||||
|
|
@ -3194,16 +3194,16 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "livewire/livewire",
|
"name": "livewire/livewire",
|
||||||
"version": "v4.1.0",
|
"version": "v4.0.3",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/livewire/livewire.git",
|
"url": "https://github.com/livewire/livewire.git",
|
||||||
"reference": "4ae4ee18448f8e9d97b68c8c091b2b597f852a6f"
|
"reference": "11afe7b36dbb1d98e073551c217f87b2b6911f81"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/livewire/livewire/zipball/4ae4ee18448f8e9d97b68c8c091b2b597f852a6f",
|
"url": "https://api.github.com/repos/livewire/livewire/zipball/11afe7b36dbb1d98e073551c217f87b2b6911f81",
|
||||||
"reference": "4ae4ee18448f8e9d97b68c8c091b2b597f852a6f",
|
"reference": "11afe7b36dbb1d98e073551c217f87b2b6911f81",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
|
|
@ -3258,7 +3258,7 @@
|
||||||
"description": "A front-end framework for Laravel.",
|
"description": "A front-end framework for Laravel.",
|
||||||
"support": {
|
"support": {
|
||||||
"issues": "https://github.com/livewire/livewire/issues",
|
"issues": "https://github.com/livewire/livewire/issues",
|
||||||
"source": "https://github.com/livewire/livewire/tree/v4.1.0"
|
"source": "https://github.com/livewire/livewire/tree/v4.0.3"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
|
|
@ -3266,7 +3266,7 @@
|
||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2026-01-27T02:21:37+00:00"
|
"time": "2026-01-23T06:13:46+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "maennchen/zipstream-php",
|
"name": "maennchen/zipstream-php",
|
||||||
|
|
@ -4277,16 +4277,16 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "phpseclib/phpseclib",
|
"name": "phpseclib/phpseclib",
|
||||||
"version": "3.0.49",
|
"version": "3.0.48",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/phpseclib/phpseclib.git",
|
"url": "https://github.com/phpseclib/phpseclib.git",
|
||||||
"reference": "6233a1e12584754e6b5daa69fe1289b47775c1b9"
|
"reference": "64065a5679c50acb886e82c07aa139b0f757bb89"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/6233a1e12584754e6b5daa69fe1289b47775c1b9",
|
"url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/64065a5679c50acb886e82c07aa139b0f757bb89",
|
||||||
"reference": "6233a1e12584754e6b5daa69fe1289b47775c1b9",
|
"reference": "64065a5679c50acb886e82c07aa139b0f757bb89",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
|
|
@ -4367,7 +4367,7 @@
|
||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"issues": "https://github.com/phpseclib/phpseclib/issues",
|
"issues": "https://github.com/phpseclib/phpseclib/issues",
|
||||||
"source": "https://github.com/phpseclib/phpseclib/tree/3.0.49"
|
"source": "https://github.com/phpseclib/phpseclib/tree/3.0.48"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
|
|
@ -4383,20 +4383,20 @@
|
||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2026-01-27T09:17:28+00:00"
|
"time": "2025-12-15T11:51:42+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "phpstan/phpdoc-parser",
|
"name": "phpstan/phpdoc-parser",
|
||||||
"version": "2.3.2",
|
"version": "2.3.1",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/phpstan/phpdoc-parser.git",
|
"url": "https://github.com/phpstan/phpdoc-parser.git",
|
||||||
"reference": "a004701b11273a26cd7955a61d67a7f1e525a45a"
|
"reference": "16dbf9937da8d4528ceb2145c9c7c0bd29e26374"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/a004701b11273a26cd7955a61d67a7f1e525a45a",
|
"url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/16dbf9937da8d4528ceb2145c9c7c0bd29e26374",
|
||||||
"reference": "a004701b11273a26cd7955a61d67a7f1e525a45a",
|
"reference": "16dbf9937da8d4528ceb2145c9c7c0bd29e26374",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
|
|
@ -4428,9 +4428,9 @@
|
||||||
"description": "PHPDoc parser with support for nullable, intersection and generic types",
|
"description": "PHPDoc parser with support for nullable, intersection and generic types",
|
||||||
"support": {
|
"support": {
|
||||||
"issues": "https://github.com/phpstan/phpdoc-parser/issues",
|
"issues": "https://github.com/phpstan/phpdoc-parser/issues",
|
||||||
"source": "https://github.com/phpstan/phpdoc-parser/tree/2.3.2"
|
"source": "https://github.com/phpstan/phpdoc-parser/tree/2.3.1"
|
||||||
},
|
},
|
||||||
"time": "2026-01-25T14:56:51+00:00"
|
"time": "2026-01-12T11:33:04+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "pragmarx/google2fa",
|
"name": "pragmarx/google2fa",
|
||||||
|
|
@ -5593,16 +5593,16 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/console",
|
"name": "symfony/console",
|
||||||
"version": "v7.4.4",
|
"version": "v7.4.3",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/console.git",
|
"url": "https://github.com/symfony/console.git",
|
||||||
"reference": "41e38717ac1dd7a46b6bda7d6a82af2d98a78894"
|
"reference": "732a9ca6cd9dfd940c639062d5edbde2f6727fb6"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/console/zipball/41e38717ac1dd7a46b6bda7d6a82af2d98a78894",
|
"url": "https://api.github.com/repos/symfony/console/zipball/732a9ca6cd9dfd940c639062d5edbde2f6727fb6",
|
||||||
"reference": "41e38717ac1dd7a46b6bda7d6a82af2d98a78894",
|
"reference": "732a9ca6cd9dfd940c639062d5edbde2f6727fb6",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
|
|
@ -5667,7 +5667,7 @@
|
||||||
"terminal"
|
"terminal"
|
||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/symfony/console/tree/v7.4.4"
|
"source": "https://github.com/symfony/console/tree/v7.4.3"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
|
|
@ -5687,7 +5687,7 @@
|
||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2026-01-13T11:36:38+00:00"
|
"time": "2025-12-23T14:50:43+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/css-selector",
|
"name": "symfony/css-selector",
|
||||||
|
|
@ -5827,16 +5827,16 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/error-handler",
|
"name": "symfony/error-handler",
|
||||||
"version": "v7.4.4",
|
"version": "v7.4.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/error-handler.git",
|
"url": "https://github.com/symfony/error-handler.git",
|
||||||
"reference": "8da531f364ddfee53e36092a7eebbbd0b775f6b8"
|
"reference": "48be2b0653594eea32dcef130cca1c811dcf25c2"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/error-handler/zipball/8da531f364ddfee53e36092a7eebbbd0b775f6b8",
|
"url": "https://api.github.com/repos/symfony/error-handler/zipball/48be2b0653594eea32dcef130cca1c811dcf25c2",
|
||||||
"reference": "8da531f364ddfee53e36092a7eebbbd0b775f6b8",
|
"reference": "48be2b0653594eea32dcef130cca1c811dcf25c2",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
|
|
@ -5885,7 +5885,7 @@
|
||||||
"description": "Provides tools to manage errors and ease debugging PHP code",
|
"description": "Provides tools to manage errors and ease debugging PHP code",
|
||||||
"homepage": "https://symfony.com",
|
"homepage": "https://symfony.com",
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/symfony/error-handler/tree/v7.4.4"
|
"source": "https://github.com/symfony/error-handler/tree/v7.4.0"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
|
|
@ -5905,20 +5905,20 @@
|
||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2026-01-20T16:42:42+00:00"
|
"time": "2025-11-05T14:29:59+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/event-dispatcher",
|
"name": "symfony/event-dispatcher",
|
||||||
"version": "v8.0.4",
|
"version": "v8.0.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/event-dispatcher.git",
|
"url": "https://github.com/symfony/event-dispatcher.git",
|
||||||
"reference": "99301401da182b6cfaa4700dbe9987bb75474b47"
|
"reference": "573f95783a2ec6e38752979db139f09fec033f03"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/99301401da182b6cfaa4700dbe9987bb75474b47",
|
"url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/573f95783a2ec6e38752979db139f09fec033f03",
|
||||||
"reference": "99301401da182b6cfaa4700dbe9987bb75474b47",
|
"reference": "573f95783a2ec6e38752979db139f09fec033f03",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
|
|
@ -5970,7 +5970,7 @@
|
||||||
"description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them",
|
"description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them",
|
||||||
"homepage": "https://symfony.com",
|
"homepage": "https://symfony.com",
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/symfony/event-dispatcher/tree/v8.0.4"
|
"source": "https://github.com/symfony/event-dispatcher/tree/v8.0.0"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
|
|
@ -5990,7 +5990,7 @@
|
||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2026-01-05T11:45:55+00:00"
|
"time": "2025-10-30T14:17:19+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/event-dispatcher-contracts",
|
"name": "symfony/event-dispatcher-contracts",
|
||||||
|
|
@ -6140,16 +6140,16 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/finder",
|
"name": "symfony/finder",
|
||||||
"version": "v7.4.5",
|
"version": "v7.4.3",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/finder.git",
|
"url": "https://github.com/symfony/finder.git",
|
||||||
"reference": "ad4daa7c38668dcb031e63bc99ea9bd42196a2cb"
|
"reference": "fffe05569336549b20a1be64250b40516d6e8d06"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/finder/zipball/ad4daa7c38668dcb031e63bc99ea9bd42196a2cb",
|
"url": "https://api.github.com/repos/symfony/finder/zipball/fffe05569336549b20a1be64250b40516d6e8d06",
|
||||||
"reference": "ad4daa7c38668dcb031e63bc99ea9bd42196a2cb",
|
"reference": "fffe05569336549b20a1be64250b40516d6e8d06",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
|
|
@ -6184,7 +6184,7 @@
|
||||||
"description": "Finds files and directories via an intuitive fluent interface",
|
"description": "Finds files and directories via an intuitive fluent interface",
|
||||||
"homepage": "https://symfony.com",
|
"homepage": "https://symfony.com",
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/symfony/finder/tree/v7.4.5"
|
"source": "https://github.com/symfony/finder/tree/v7.4.3"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
|
|
@ -6204,20 +6204,20 @@
|
||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2026-01-26T15:07:59+00:00"
|
"time": "2025-12-23T14:50:43+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/http-foundation",
|
"name": "symfony/http-foundation",
|
||||||
"version": "v7.4.5",
|
"version": "v7.4.3",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/http-foundation.git",
|
"url": "https://github.com/symfony/http-foundation.git",
|
||||||
"reference": "446d0db2b1f21575f1284b74533e425096abdfb6"
|
"reference": "a70c745d4cea48dbd609f4075e5f5cbce453bd52"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/http-foundation/zipball/446d0db2b1f21575f1284b74533e425096abdfb6",
|
"url": "https://api.github.com/repos/symfony/http-foundation/zipball/a70c745d4cea48dbd609f4075e5f5cbce453bd52",
|
||||||
"reference": "446d0db2b1f21575f1284b74533e425096abdfb6",
|
"reference": "a70c745d4cea48dbd609f4075e5f5cbce453bd52",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
|
|
@ -6266,7 +6266,7 @@
|
||||||
"description": "Defines an object-oriented layer for the HTTP specification",
|
"description": "Defines an object-oriented layer for the HTTP specification",
|
||||||
"homepage": "https://symfony.com",
|
"homepage": "https://symfony.com",
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/symfony/http-foundation/tree/v7.4.5"
|
"source": "https://github.com/symfony/http-foundation/tree/v7.4.3"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
|
|
@ -6286,20 +6286,20 @@
|
||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2026-01-27T16:16:02+00:00"
|
"time": "2025-12-23T14:23:49+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/http-kernel",
|
"name": "symfony/http-kernel",
|
||||||
"version": "v7.4.5",
|
"version": "v7.4.3",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/http-kernel.git",
|
"url": "https://github.com/symfony/http-kernel.git",
|
||||||
"reference": "229eda477017f92bd2ce7615d06222ec0c19e82a"
|
"reference": "885211d4bed3f857b8c964011923528a55702aa5"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/http-kernel/zipball/229eda477017f92bd2ce7615d06222ec0c19e82a",
|
"url": "https://api.github.com/repos/symfony/http-kernel/zipball/885211d4bed3f857b8c964011923528a55702aa5",
|
||||||
"reference": "229eda477017f92bd2ce7615d06222ec0c19e82a",
|
"reference": "885211d4bed3f857b8c964011923528a55702aa5",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
|
|
@ -6385,7 +6385,7 @@
|
||||||
"description": "Provides a structured process for converting a Request into a Response",
|
"description": "Provides a structured process for converting a Request into a Response",
|
||||||
"homepage": "https://symfony.com",
|
"homepage": "https://symfony.com",
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/symfony/http-kernel/tree/v7.4.5"
|
"source": "https://github.com/symfony/http-kernel/tree/v7.4.3"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
|
|
@ -6405,20 +6405,20 @@
|
||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2026-01-28T10:33:42+00:00"
|
"time": "2025-12-31T08:43:57+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/mailer",
|
"name": "symfony/mailer",
|
||||||
"version": "v7.4.4",
|
"version": "v7.4.3",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/mailer.git",
|
"url": "https://github.com/symfony/mailer.git",
|
||||||
"reference": "7b750074c40c694ceb34cb926d6dffee231c5cd6"
|
"reference": "e472d35e230108231ccb7f51eb6b2100cac02ee4"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/mailer/zipball/7b750074c40c694ceb34cb926d6dffee231c5cd6",
|
"url": "https://api.github.com/repos/symfony/mailer/zipball/e472d35e230108231ccb7f51eb6b2100cac02ee4",
|
||||||
"reference": "7b750074c40c694ceb34cb926d6dffee231c5cd6",
|
"reference": "e472d35e230108231ccb7f51eb6b2100cac02ee4",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
|
|
@ -6469,7 +6469,7 @@
|
||||||
"description": "Helps sending emails",
|
"description": "Helps sending emails",
|
||||||
"homepage": "https://symfony.com",
|
"homepage": "https://symfony.com",
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/symfony/mailer/tree/v7.4.4"
|
"source": "https://github.com/symfony/mailer/tree/v7.4.3"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
|
|
@ -6489,20 +6489,20 @@
|
||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2026-01-08T08:25:11+00:00"
|
"time": "2025-12-16T08:02:06+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/mime",
|
"name": "symfony/mime",
|
||||||
"version": "v7.4.5",
|
"version": "v7.4.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/mime.git",
|
"url": "https://github.com/symfony/mime.git",
|
||||||
"reference": "b18c7e6e9eee1e19958138df10412f3c4c316148"
|
"reference": "bdb02729471be5d047a3ac4a69068748f1a6be7a"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/mime/zipball/b18c7e6e9eee1e19958138df10412f3c4c316148",
|
"url": "https://api.github.com/repos/symfony/mime/zipball/bdb02729471be5d047a3ac4a69068748f1a6be7a",
|
||||||
"reference": "b18c7e6e9eee1e19958138df10412f3c4c316148",
|
"reference": "bdb02729471be5d047a3ac4a69068748f1a6be7a",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
|
|
@ -6513,15 +6513,15 @@
|
||||||
},
|
},
|
||||||
"conflict": {
|
"conflict": {
|
||||||
"egulias/email-validator": "~3.0.0",
|
"egulias/email-validator": "~3.0.0",
|
||||||
"phpdocumentor/reflection-docblock": "<5.2|>=6",
|
"phpdocumentor/reflection-docblock": "<3.2.2",
|
||||||
"phpdocumentor/type-resolver": "<1.5.1",
|
"phpdocumentor/type-resolver": "<1.4.0",
|
||||||
"symfony/mailer": "<6.4",
|
"symfony/mailer": "<6.4",
|
||||||
"symfony/serializer": "<6.4.3|>7.0,<7.0.3"
|
"symfony/serializer": "<6.4.3|>7.0,<7.0.3"
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"egulias/email-validator": "^2.1.10|^3.1|^4",
|
"egulias/email-validator": "^2.1.10|^3.1|^4",
|
||||||
"league/html-to-markdown": "^5.0",
|
"league/html-to-markdown": "^5.0",
|
||||||
"phpdocumentor/reflection-docblock": "^5.2",
|
"phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0",
|
||||||
"symfony/dependency-injection": "^6.4|^7.0|^8.0",
|
"symfony/dependency-injection": "^6.4|^7.0|^8.0",
|
||||||
"symfony/process": "^6.4|^7.0|^8.0",
|
"symfony/process": "^6.4|^7.0|^8.0",
|
||||||
"symfony/property-access": "^6.4|^7.0|^8.0",
|
"symfony/property-access": "^6.4|^7.0|^8.0",
|
||||||
|
|
@ -6558,7 +6558,7 @@
|
||||||
"mime-type"
|
"mime-type"
|
||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/symfony/mime/tree/v7.4.5"
|
"source": "https://github.com/symfony/mime/tree/v7.4.0"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
|
|
@ -6578,7 +6578,7 @@
|
||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2026-01-27T08:59:58+00:00"
|
"time": "2025-11-16T10:14:42+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/polyfill-ctype",
|
"name": "symfony/polyfill-ctype",
|
||||||
|
|
@ -7411,16 +7411,16 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/process",
|
"name": "symfony/process",
|
||||||
"version": "v7.4.5",
|
"version": "v7.4.3",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/process.git",
|
"url": "https://github.com/symfony/process.git",
|
||||||
"reference": "608476f4604102976d687c483ac63a79ba18cc97"
|
"reference": "2f8e1a6cdf590ca63715da4d3a7a3327404a523f"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/process/zipball/608476f4604102976d687c483ac63a79ba18cc97",
|
"url": "https://api.github.com/repos/symfony/process/zipball/2f8e1a6cdf590ca63715da4d3a7a3327404a523f",
|
||||||
"reference": "608476f4604102976d687c483ac63a79ba18cc97",
|
"reference": "2f8e1a6cdf590ca63715da4d3a7a3327404a523f",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
|
|
@ -7452,7 +7452,7 @@
|
||||||
"description": "Executes commands in sub-processes",
|
"description": "Executes commands in sub-processes",
|
||||||
"homepage": "https://symfony.com",
|
"homepage": "https://symfony.com",
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/symfony/process/tree/v7.4.5"
|
"source": "https://github.com/symfony/process/tree/v7.4.3"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
|
|
@ -7472,20 +7472,20 @@
|
||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2026-01-26T15:07:59+00:00"
|
"time": "2025-12-19T10:00:43+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/routing",
|
"name": "symfony/routing",
|
||||||
"version": "v7.4.4",
|
"version": "v7.4.3",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/routing.git",
|
"url": "https://github.com/symfony/routing.git",
|
||||||
"reference": "0798827fe2c79caeed41d70b680c2c3507d10147"
|
"reference": "5d3fd7adf8896c2fdb54e2f0f35b1bcbd9e45090"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/routing/zipball/0798827fe2c79caeed41d70b680c2c3507d10147",
|
"url": "https://api.github.com/repos/symfony/routing/zipball/5d3fd7adf8896c2fdb54e2f0f35b1bcbd9e45090",
|
||||||
"reference": "0798827fe2c79caeed41d70b680c2c3507d10147",
|
"reference": "5d3fd7adf8896c2fdb54e2f0f35b1bcbd9e45090",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
|
|
@ -7537,7 +7537,7 @@
|
||||||
"url"
|
"url"
|
||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/symfony/routing/tree/v7.4.4"
|
"source": "https://github.com/symfony/routing/tree/v7.4.3"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
|
|
@ -7557,7 +7557,7 @@
|
||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2026-01-12T12:19:02+00:00"
|
"time": "2025-12-19T10:00:43+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/service-contracts",
|
"name": "symfony/service-contracts",
|
||||||
|
|
@ -7648,16 +7648,16 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/string",
|
"name": "symfony/string",
|
||||||
"version": "v8.0.4",
|
"version": "v8.0.1",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/string.git",
|
"url": "https://github.com/symfony/string.git",
|
||||||
"reference": "758b372d6882506821ed666032e43020c4f57194"
|
"reference": "ba65a969ac918ce0cc3edfac6cdde847eba231dc"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/string/zipball/758b372d6882506821ed666032e43020c4f57194",
|
"url": "https://api.github.com/repos/symfony/string/zipball/ba65a969ac918ce0cc3edfac6cdde847eba231dc",
|
||||||
"reference": "758b372d6882506821ed666032e43020c4f57194",
|
"reference": "ba65a969ac918ce0cc3edfac6cdde847eba231dc",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
|
|
@ -7714,7 +7714,7 @@
|
||||||
"utf8"
|
"utf8"
|
||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/symfony/string/tree/v8.0.4"
|
"source": "https://github.com/symfony/string/tree/v8.0.1"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
|
|
@ -7734,20 +7734,20 @@
|
||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2026-01-12T12:37:40+00:00"
|
"time": "2025-12-01T09:13:36+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/translation",
|
"name": "symfony/translation",
|
||||||
"version": "v8.0.4",
|
"version": "v8.0.3",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/translation.git",
|
"url": "https://github.com/symfony/translation.git",
|
||||||
"reference": "db70c8ce7db74fd2da7b1d268db46b2a8ce32c10"
|
"reference": "60a8f11f0e15c48f2cc47c4da53873bb5b62135d"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/translation/zipball/db70c8ce7db74fd2da7b1d268db46b2a8ce32c10",
|
"url": "https://api.github.com/repos/symfony/translation/zipball/60a8f11f0e15c48f2cc47c4da53873bb5b62135d",
|
||||||
"reference": "db70c8ce7db74fd2da7b1d268db46b2a8ce32c10",
|
"reference": "60a8f11f0e15c48f2cc47c4da53873bb5b62135d",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
|
|
@ -7807,7 +7807,7 @@
|
||||||
"description": "Provides tools to internationalize your application",
|
"description": "Provides tools to internationalize your application",
|
||||||
"homepage": "https://symfony.com",
|
"homepage": "https://symfony.com",
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/symfony/translation/tree/v8.0.4"
|
"source": "https://github.com/symfony/translation/tree/v8.0.3"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
|
|
@ -7827,7 +7827,7 @@
|
||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2026-01-13T13:06:50+00:00"
|
"time": "2025-12-21T10:59:45+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/translation-contracts",
|
"name": "symfony/translation-contracts",
|
||||||
|
|
@ -7913,16 +7913,16 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/uid",
|
"name": "symfony/uid",
|
||||||
"version": "v7.4.4",
|
"version": "v7.4.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/uid.git",
|
"url": "https://github.com/symfony/uid.git",
|
||||||
"reference": "7719ce8aba76be93dfe249192f1fbfa52c588e36"
|
"reference": "2498e9f81b7baa206f44de583f2f48350b90142c"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/uid/zipball/7719ce8aba76be93dfe249192f1fbfa52c588e36",
|
"url": "https://api.github.com/repos/symfony/uid/zipball/2498e9f81b7baa206f44de583f2f48350b90142c",
|
||||||
"reference": "7719ce8aba76be93dfe249192f1fbfa52c588e36",
|
"reference": "2498e9f81b7baa206f44de583f2f48350b90142c",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
|
|
@ -7967,7 +7967,7 @@
|
||||||
"uuid"
|
"uuid"
|
||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/symfony/uid/tree/v7.4.4"
|
"source": "https://github.com/symfony/uid/tree/v7.4.0"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
|
|
@ -7987,20 +7987,20 @@
|
||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2026-01-03T23:30:35+00:00"
|
"time": "2025-09-25T11:02:55+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/var-dumper",
|
"name": "symfony/var-dumper",
|
||||||
"version": "v7.4.4",
|
"version": "v7.4.3",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/var-dumper.git",
|
"url": "https://github.com/symfony/var-dumper.git",
|
||||||
"reference": "0e4769b46a0c3c62390d124635ce59f66874b282"
|
"reference": "7e99bebcb3f90d8721890f2963463280848cba92"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/var-dumper/zipball/0e4769b46a0c3c62390d124635ce59f66874b282",
|
"url": "https://api.github.com/repos/symfony/var-dumper/zipball/7e99bebcb3f90d8721890f2963463280848cba92",
|
||||||
"reference": "0e4769b46a0c3c62390d124635ce59f66874b282",
|
"reference": "7e99bebcb3f90d8721890f2963463280848cba92",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
|
|
@ -8054,7 +8054,7 @@
|
||||||
"dump"
|
"dump"
|
||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/symfony/var-dumper/tree/v7.4.4"
|
"source": "https://github.com/symfony/var-dumper/tree/v7.4.3"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
|
|
@ -8074,7 +8074,7 @@
|
||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2026-01-01T22:13:48+00:00"
|
"time": "2025-12-18T07:04:31+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/var-exporter",
|
"name": "symfony/var-exporter",
|
||||||
|
|
@ -9066,33 +9066,33 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "laravel/boost",
|
"name": "laravel/boost",
|
||||||
"version": "v2.0.3",
|
"version": "v1.8.10",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/laravel/boost.git",
|
"url": "https://github.com/laravel/boost.git",
|
||||||
"reference": "e9cd3e8219c49459b2e3f2783292e3db42e9b4d2"
|
"reference": "aad8b2a423b0a886c2ce7ee92abbfde69992ff32"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/laravel/boost/zipball/e9cd3e8219c49459b2e3f2783292e3db42e9b4d2",
|
"url": "https://api.github.com/repos/laravel/boost/zipball/aad8b2a423b0a886c2ce7ee92abbfde69992ff32",
|
||||||
"reference": "e9cd3e8219c49459b2e3f2783292e3db42e9b4d2",
|
"reference": "aad8b2a423b0a886c2ce7ee92abbfde69992ff32",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
"guzzlehttp/guzzle": "^7.9",
|
"guzzlehttp/guzzle": "^7.9",
|
||||||
"illuminate/console": "^11.45.3|^12.41.1",
|
"illuminate/console": "^10.49.0|^11.45.3|^12.41.1",
|
||||||
"illuminate/contracts": "^11.45.3|^12.41.1",
|
"illuminate/contracts": "^10.49.0|^11.45.3|^12.41.1",
|
||||||
"illuminate/routing": "^11.45.3|^12.41.1",
|
"illuminate/routing": "^10.49.0|^11.45.3|^12.41.1",
|
||||||
"illuminate/support": "^11.45.3|^12.41.1",
|
"illuminate/support": "^10.49.0|^11.45.3|^12.41.1",
|
||||||
"laravel/mcp": "^0.5.1",
|
"laravel/mcp": "^0.5.1",
|
||||||
"laravel/prompts": "^0.3.10",
|
"laravel/prompts": "0.1.25|^0.3.6",
|
||||||
"laravel/roster": "^0.2.9",
|
"laravel/roster": "^0.2.9",
|
||||||
"php": "^8.2"
|
"php": "^8.1"
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"laravel/pint": "^1.27.0",
|
"laravel/pint": "^1.20.0",
|
||||||
"mockery/mockery": "^1.6.12",
|
"mockery/mockery": "^1.6.12",
|
||||||
"orchestra/testbench": "^9.15.0|^10.6",
|
"orchestra/testbench": "^8.36.0|^9.15.0|^10.6",
|
||||||
"pestphp/pest": "^2.36.0|^3.8.4|^4.1.5",
|
"pestphp/pest": "^2.36.0|^3.8.4|^4.1.5",
|
||||||
"phpstan/phpstan": "^2.1.27",
|
"phpstan/phpstan": "^2.1.27",
|
||||||
"rector/rector": "^2.1"
|
"rector/rector": "^2.1"
|
||||||
|
|
@ -9128,20 +9128,20 @@
|
||||||
"issues": "https://github.com/laravel/boost/issues",
|
"issues": "https://github.com/laravel/boost/issues",
|
||||||
"source": "https://github.com/laravel/boost"
|
"source": "https://github.com/laravel/boost"
|
||||||
},
|
},
|
||||||
"time": "2026-01-28T08:41:55+00:00"
|
"time": "2026-01-14T14:51:16+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "laravel/mcp",
|
"name": "laravel/mcp",
|
||||||
"version": "v0.5.3",
|
"version": "v0.5.2",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/laravel/mcp.git",
|
"url": "https://github.com/laravel/mcp.git",
|
||||||
"reference": "39b9791b989927642137dd5b55dde0529f1614f9"
|
"reference": "b9bdd8d6f8b547c8733fe6826b1819341597ba3c"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/laravel/mcp/zipball/39b9791b989927642137dd5b55dde0529f1614f9",
|
"url": "https://api.github.com/repos/laravel/mcp/zipball/b9bdd8d6f8b547c8733fe6826b1819341597ba3c",
|
||||||
"reference": "39b9791b989927642137dd5b55dde0529f1614f9",
|
"reference": "b9bdd8d6f8b547c8733fe6826b1819341597ba3c",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
|
|
@ -9201,7 +9201,7 @@
|
||||||
"issues": "https://github.com/laravel/mcp/issues",
|
"issues": "https://github.com/laravel/mcp/issues",
|
||||||
"source": "https://github.com/laravel/mcp"
|
"source": "https://github.com/laravel/mcp"
|
||||||
},
|
},
|
||||||
"time": "2026-01-26T10:25:21+00:00"
|
"time": "2025-12-19T19:32:34+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "laravel/pail",
|
"name": "laravel/pail",
|
||||||
|
|
@ -9717,20 +9717,20 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "pestphp/pest",
|
"name": "pestphp/pest",
|
||||||
"version": "v4.3.2",
|
"version": "v4.3.1",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/pestphp/pest.git",
|
"url": "https://github.com/pestphp/pest.git",
|
||||||
"reference": "3a4329ddc7a2b67c19fca8342a668b39be3ae398"
|
"reference": "bc57a84e77afd4544ff9643a6858f68d05aeab96"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/pestphp/pest/zipball/3a4329ddc7a2b67c19fca8342a668b39be3ae398",
|
"url": "https://api.github.com/repos/pestphp/pest/zipball/bc57a84e77afd4544ff9643a6858f68d05aeab96",
|
||||||
"reference": "3a4329ddc7a2b67c19fca8342a668b39be3ae398",
|
"reference": "bc57a84e77afd4544ff9643a6858f68d05aeab96",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
"brianium/paratest": "^7.16.1",
|
"brianium/paratest": "^7.16.0",
|
||||||
"nunomaduro/collision": "^8.8.3",
|
"nunomaduro/collision": "^8.8.3",
|
||||||
"nunomaduro/termwind": "^2.3.3",
|
"nunomaduro/termwind": "^2.3.3",
|
||||||
"pestphp/pest-plugin": "^4.0.0",
|
"pestphp/pest-plugin": "^4.0.0",
|
||||||
|
|
@ -9738,18 +9738,18 @@
|
||||||
"pestphp/pest-plugin-mutate": "^4.0.1",
|
"pestphp/pest-plugin-mutate": "^4.0.1",
|
||||||
"pestphp/pest-plugin-profanity": "^4.2.1",
|
"pestphp/pest-plugin-profanity": "^4.2.1",
|
||||||
"php": "^8.3.0",
|
"php": "^8.3.0",
|
||||||
"phpunit/phpunit": "^12.5.8",
|
"phpunit/phpunit": "^12.5.4",
|
||||||
"symfony/process": "^7.4.4|^8.0.0"
|
"symfony/process": "^7.4.3|^8.0.0"
|
||||||
},
|
},
|
||||||
"conflict": {
|
"conflict": {
|
||||||
"filp/whoops": "<2.18.3",
|
"filp/whoops": "<2.18.3",
|
||||||
"phpunit/phpunit": ">12.5.8",
|
"phpunit/phpunit": ">12.5.4",
|
||||||
"sebastian/exporter": "<7.0.0",
|
"sebastian/exporter": "<7.0.0",
|
||||||
"webmozart/assert": "<1.11.0"
|
"webmozart/assert": "<1.11.0"
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"pestphp/pest-dev-tools": "^4.0.0",
|
"pestphp/pest-dev-tools": "^4.0.0",
|
||||||
"pestphp/pest-plugin-browser": "^4.2.1",
|
"pestphp/pest-plugin-browser": "^4.1.1",
|
||||||
"pestphp/pest-plugin-type-coverage": "^4.0.3",
|
"pestphp/pest-plugin-type-coverage": "^4.0.3",
|
||||||
"psy/psysh": "^0.12.18"
|
"psy/psysh": "^0.12.18"
|
||||||
},
|
},
|
||||||
|
|
@ -9817,7 +9817,7 @@
|
||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"issues": "https://github.com/pestphp/pest/issues",
|
"issues": "https://github.com/pestphp/pest/issues",
|
||||||
"source": "https://github.com/pestphp/pest/tree/v4.3.2"
|
"source": "https://github.com/pestphp/pest/tree/v4.3.1"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
|
|
@ -9829,7 +9829,7 @@
|
||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2026-01-28T01:01:19+00:00"
|
"time": "2026-01-04T16:29:59+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "pestphp/pest-plugin",
|
"name": "pestphp/pest-plugin",
|
||||||
|
|
@ -10430,11 +10430,11 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "phpstan/phpstan",
|
"name": "phpstan/phpstan",
|
||||||
"version": "2.1.37",
|
"version": "2.1.36",
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/phpstan/phpstan/zipball/28cd424c5ea984128c95cfa7ea658808e8954e49",
|
"url": "https://api.github.com/repos/phpstan/phpstan/zipball/2132e5e2361d11d40af4c17faa16f043269a4cf3",
|
||||||
"reference": "28cd424c5ea984128c95cfa7ea658808e8954e49",
|
"reference": "2132e5e2361d11d40af4c17faa16f043269a4cf3",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
|
|
@ -10479,7 +10479,7 @@
|
||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2026-01-24T08:21:55+00:00"
|
"time": "2026-01-21T13:58:26+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "phpunit/php-code-coverage",
|
"name": "phpunit/php-code-coverage",
|
||||||
|
|
@ -10817,16 +10817,16 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "phpunit/phpunit",
|
"name": "phpunit/phpunit",
|
||||||
"version": "12.5.8",
|
"version": "12.5.4",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/sebastianbergmann/phpunit.git",
|
"url": "https://github.com/sebastianbergmann/phpunit.git",
|
||||||
"reference": "37ddb96c14bfee10304825edbb7e66d341ec6889"
|
"reference": "4ba0e923f9d3fc655de22f9547c01d15a41fc93a"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/37ddb96c14bfee10304825edbb7e66d341ec6889",
|
"url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/4ba0e923f9d3fc655de22f9547c01d15a41fc93a",
|
||||||
"reference": "37ddb96c14bfee10304825edbb7e66d341ec6889",
|
"reference": "4ba0e923f9d3fc655de22f9547c01d15a41fc93a",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
|
|
@ -10840,13 +10840,13 @@
|
||||||
"phar-io/manifest": "^2.0.4",
|
"phar-io/manifest": "^2.0.4",
|
||||||
"phar-io/version": "^3.2.1",
|
"phar-io/version": "^3.2.1",
|
||||||
"php": ">=8.3",
|
"php": ">=8.3",
|
||||||
"phpunit/php-code-coverage": "^12.5.2",
|
"phpunit/php-code-coverage": "^12.5.1",
|
||||||
"phpunit/php-file-iterator": "^6.0.0",
|
"phpunit/php-file-iterator": "^6.0.0",
|
||||||
"phpunit/php-invoker": "^6.0.0",
|
"phpunit/php-invoker": "^6.0.0",
|
||||||
"phpunit/php-text-template": "^5.0.0",
|
"phpunit/php-text-template": "^5.0.0",
|
||||||
"phpunit/php-timer": "^8.0.0",
|
"phpunit/php-timer": "^8.0.0",
|
||||||
"sebastian/cli-parser": "^4.2.0",
|
"sebastian/cli-parser": "^4.2.0",
|
||||||
"sebastian/comparator": "^7.1.4",
|
"sebastian/comparator": "^7.1.3",
|
||||||
"sebastian/diff": "^7.0.0",
|
"sebastian/diff": "^7.0.0",
|
||||||
"sebastian/environment": "^8.0.3",
|
"sebastian/environment": "^8.0.3",
|
||||||
"sebastian/exporter": "^7.0.2",
|
"sebastian/exporter": "^7.0.2",
|
||||||
|
|
@ -10894,7 +10894,7 @@
|
||||||
"support": {
|
"support": {
|
||||||
"issues": "https://github.com/sebastianbergmann/phpunit/issues",
|
"issues": "https://github.com/sebastianbergmann/phpunit/issues",
|
||||||
"security": "https://github.com/sebastianbergmann/phpunit/security/policy",
|
"security": "https://github.com/sebastianbergmann/phpunit/security/policy",
|
||||||
"source": "https://github.com/sebastianbergmann/phpunit/tree/12.5.8"
|
"source": "https://github.com/sebastianbergmann/phpunit/tree/12.5.4"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
|
|
@ -10918,7 +10918,7 @@
|
||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2026-01-27T06:12:29+00:00"
|
"time": "2025-12-15T06:05:34+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "rector/rector",
|
"name": "rector/rector",
|
||||||
|
|
@ -11051,16 +11051,16 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "sebastian/comparator",
|
"name": "sebastian/comparator",
|
||||||
"version": "7.1.4",
|
"version": "7.1.3",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/sebastianbergmann/comparator.git",
|
"url": "https://github.com/sebastianbergmann/comparator.git",
|
||||||
"reference": "6a7de5df2e094f9a80b40a522391a7e6022df5f6"
|
"reference": "dc904b4bb3ab070865fa4068cd84f3da8b945148"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/6a7de5df2e094f9a80b40a522391a7e6022df5f6",
|
"url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/dc904b4bb3ab070865fa4068cd84f3da8b945148",
|
||||||
"reference": "6a7de5df2e094f9a80b40a522391a7e6022df5f6",
|
"reference": "dc904b4bb3ab070865fa4068cd84f3da8b945148",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
|
|
@ -11119,7 +11119,7 @@
|
||||||
"support": {
|
"support": {
|
||||||
"issues": "https://github.com/sebastianbergmann/comparator/issues",
|
"issues": "https://github.com/sebastianbergmann/comparator/issues",
|
||||||
"security": "https://github.com/sebastianbergmann/comparator/security/policy",
|
"security": "https://github.com/sebastianbergmann/comparator/security/policy",
|
||||||
"source": "https://github.com/sebastianbergmann/comparator/tree/7.1.4"
|
"source": "https://github.com/sebastianbergmann/comparator/tree/7.1.3"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
|
|
@ -11139,7 +11139,7 @@
|
||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2026-01-24T09:28:48+00:00"
|
"time": "2025-08-20T11:27:00+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "sebastian/complexity",
|
"name": "sebastian/complexity",
|
||||||
|
|
|
||||||
|
|
@ -36,7 +36,6 @@ return [
|
||||||
],
|
],
|
||||||
|
|
||||||
'trmnl' => [
|
'trmnl' => [
|
||||||
'base_url' => 'https://trmnl.com',
|
|
||||||
'proxy_base_url' => env('TRMNL_PROXY_BASE_URL', 'https://trmnl.app'),
|
'proxy_base_url' => env('TRMNL_PROXY_BASE_URL', 'https://trmnl.app'),
|
||||||
'proxy_refresh_minutes' => env('TRMNL_PROXY_REFRESH_MINUTES', 15),
|
'proxy_refresh_minutes' => env('TRMNL_PROXY_REFRESH_MINUTES', 15),
|
||||||
'proxy_refresh_cron' => env('TRMNL_PROXY_REFRESH_CRON'),
|
'proxy_refresh_cron' => env('TRMNL_PROXY_REFRESH_CRON'),
|
||||||
|
|
|
||||||
764
package-lock.json
generated
764
package-lock.json
generated
File diff suppressed because it is too large
Load diff
|
|
@ -49,13 +49,10 @@ class extends Component
|
||||||
try {
|
try {
|
||||||
$cacheKey = 'trmnl_recipes_newest_page_'.$this->page;
|
$cacheKey = 'trmnl_recipes_newest_page_'.$this->page;
|
||||||
$response = Cache::remember($cacheKey, 43200, function () {
|
$response = Cache::remember($cacheKey, 43200, function () {
|
||||||
$response = Http::timeout(10)->get(
|
$response = Http::timeout(10)->get('https://usetrmnl.com/recipes.json', [
|
||||||
config('services.trmnl.base_url').'/recipes.json',
|
|
||||||
[
|
|
||||||
'sort-by' => 'newest',
|
'sort-by' => 'newest',
|
||||||
'page' => $this->page,
|
'page' => $this->page,
|
||||||
]
|
]);
|
||||||
);
|
|
||||||
|
|
||||||
if (! $response->successful()) {
|
if (! $response->successful()) {
|
||||||
throw new RuntimeException('Failed to fetch TRMNL recipes');
|
throw new RuntimeException('Failed to fetch TRMNL recipes');
|
||||||
|
|
@ -89,14 +86,11 @@ class extends Component
|
||||||
try {
|
try {
|
||||||
$cacheKey = 'trmnl_recipes_search_'.md5($term).'_page_'.$this->page;
|
$cacheKey = 'trmnl_recipes_search_'.md5($term).'_page_'.$this->page;
|
||||||
$response = Cache::remember($cacheKey, 300, function () use ($term) {
|
$response = Cache::remember($cacheKey, 300, function () use ($term) {
|
||||||
$response = Http::get(
|
$response = Http::get('https://usetrmnl.com/recipes.json', [
|
||||||
config('services.trmnl.base_url').'/recipes.json',
|
|
||||||
[
|
|
||||||
'search' => $term,
|
'search' => $term,
|
||||||
'sort-by' => 'newest',
|
'sort-by' => 'newest',
|
||||||
'page' => $this->page,
|
'page' => $this->page,
|
||||||
]
|
]);
|
||||||
);
|
|
||||||
|
|
||||||
if (! $response->successful()) {
|
if (! $response->successful()) {
|
||||||
throw new RuntimeException('Failed to search TRMNL recipes');
|
throw new RuntimeException('Failed to search TRMNL recipes');
|
||||||
|
|
@ -161,7 +155,7 @@ class extends Component
|
||||||
abort_unless(auth()->user() !== null, 403);
|
abort_unless(auth()->user() !== null, 403);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
$zipUrl = config('services.trmnl.base_url')."/api/plugin_settings/{$recipeId}/archive";
|
$zipUrl = "https://usetrmnl.com/api/plugin_settings/{$recipeId}/archive";
|
||||||
|
|
||||||
$recipe = collect($this->recipes)->firstWhere('id', $recipeId);
|
$recipe = collect($this->recipes)->firstWhere('id', $recipeId);
|
||||||
|
|
||||||
|
|
@ -189,21 +183,16 @@ class extends Component
|
||||||
$this->previewData = [];
|
$this->previewData = [];
|
||||||
|
|
||||||
try {
|
try {
|
||||||
$response = Http::timeout(10)->get(
|
$response = Http::timeout(10)->get("https://usetrmnl.com/recipes/{$recipeId}.json");
|
||||||
config('services.trmnl.base_url')."/recipes/{$recipeId}.json"
|
|
||||||
);
|
|
||||||
|
|
||||||
if ($response->successful()) {
|
if ($response->successful()) {
|
||||||
$item = $response->json()['data'] ?? [];
|
$item = $response->json()['data'] ?? [];
|
||||||
$this->previewData = $this->mapRecipe($item);
|
$this->previewData = $this->mapRecipe($item);
|
||||||
} else {
|
} else {
|
||||||
// Fallback to searching for the specific recipe if single endpoint doesn't exist
|
// Fallback to searching for the specific recipe if single endpoint doesn't exist
|
||||||
$response = Http::timeout(10)->get(
|
$response = Http::timeout(10)->get('https://usetrmnl.com/recipes.json', [
|
||||||
config('services.trmnl.base_url').'/recipes.json',
|
|
||||||
[
|
|
||||||
'search' => $recipeId,
|
'search' => $recipeId,
|
||||||
]
|
]);
|
||||||
);
|
|
||||||
|
|
||||||
if ($response->successful()) {
|
if ($response->successful()) {
|
||||||
$data = $response->json()['data'] ?? [];
|
$data = $response->json()['data'] ?? [];
|
||||||
|
|
@ -251,9 +240,7 @@ class extends Component
|
||||||
'installs' => data_get($item, 'stats.installs'),
|
'installs' => data_get($item, 'stats.installs'),
|
||||||
'forks' => data_get($item, 'stats.forks'),
|
'forks' => data_get($item, 'stats.forks'),
|
||||||
],
|
],
|
||||||
'detail_url' => isset($item['id'])
|
'detail_url' => isset($item['id']) ? ('https://usetrmnl.com/recipes/'.$item['id']) : null,
|
||||||
? config('services.trmnl.base_url').'/recipes/'.$item['id']
|
|
||||||
: null,
|
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
}; ?>
|
}; ?>
|
||||||
|
|
|
||||||
|
|
@ -29,7 +29,7 @@ new class extends Component {}
|
||||||
<div class="mt-3 flex items-center justify-start gap-2">
|
<div class="mt-3 flex items-center justify-start gap-2">
|
||||||
<flux:input value="laravel-trmnl" readonly copyable class="max-w-42"/>
|
<flux:input value="laravel-trmnl" readonly copyable class="max-w-42"/>
|
||||||
<flux:button class="w-42"
|
<flux:button class="w-42"
|
||||||
href="{{ config('services.trmnl.base_url') }}?ref=laravel-trmnl"
|
href="https://usetrmnl.com/?ref=laravel-trmnl"
|
||||||
target="_blank"
|
target="_blank"
|
||||||
icon:trailing="arrow-up-right">{{ __('Referral link') }}</flux:button>
|
icon:trailing="arrow-up-right">{{ __('Referral link') }}</flux:button>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,7 @@
|
||||||
<div class="grid" style="gap: 9px;">
|
<div class="grid" style="gap: 9px;">
|
||||||
<div class="row row--center col--span-3 col--end">
|
<div class="row row--center col--span-3 col--end">
|
||||||
<img class="weather-image" style="max-height: 150px; margin:auto;"
|
<img class="weather-image" style="max-height: 150px; margin:auto;"
|
||||||
src="{{ config('services.trmnl.base_url') }}/images/plugins/weather/wi-thermometer.svg">
|
src="https://usetrmnl.com/images/plugins/weather/wi-thermometer.svg">
|
||||||
</div>
|
</div>
|
||||||
<div class="col col--span-3 col--end">
|
<div class="col col--span-3 col--end">
|
||||||
<div class="item h--full">
|
<div class="item h--full">
|
||||||
|
|
@ -28,7 +28,7 @@
|
||||||
<div class="item">
|
<div class="item">
|
||||||
<div class="meta"></div>
|
<div class="meta"></div>
|
||||||
<div class="icon">
|
<div class="icon">
|
||||||
{{-- <img class="weather-icon" src="{{ config('services.trmnl.base_url') }}/images/plugins/weather/wi-thermometer.svg"> --}}
|
{{-- <img class="weather-icon" src="https://usetrmnl.com/images/plugins/weather/wi-thermometer.svg"> --}}
|
||||||
</div>
|
</div>
|
||||||
<div class="content">
|
<div class="content">
|
||||||
<span class="value value--small">{{ $weatherEntity['attributes']['wind_speed'] }} {{ $weatherEntity['attributes']['wind_speed_unit'] }}</span>
|
<span class="value value--small">{{ $weatherEntity['attributes']['wind_speed'] }} {{ $weatherEntity['attributes']['wind_speed_unit'] }}</span>
|
||||||
|
|
@ -39,7 +39,7 @@
|
||||||
<div class="item">
|
<div class="item">
|
||||||
<div class="meta"></div>
|
<div class="meta"></div>
|
||||||
<div class="icon">
|
<div class="icon">
|
||||||
{{-- <img class="weather-icon" src="{{ config('services.trmnl.base_url') }}/images/weather/wi-raindrops.svg"> --}}
|
{{-- <img class="weather-icon" src="https://usetrmnl.com/images/weather/wi-raindrops.svg"> --}}
|
||||||
</div>
|
</div>
|
||||||
<div class="content">
|
<div class="content">
|
||||||
<span class="value value--small">{{ $weatherEntity['attributes']['humidity'] }}%</span>
|
<span class="value value--small">{{ $weatherEntity['attributes']['humidity'] }}%</span>
|
||||||
|
|
@ -50,7 +50,7 @@
|
||||||
<div class="item">
|
<div class="item">
|
||||||
<div class="meta"></div>
|
<div class="meta"></div>
|
||||||
<div class="icon">
|
<div class="icon">
|
||||||
{{-- <img class="weather-icon" src="{{ config('services.trmnl.base_url') }}/images/weather/wi-day-sunny.svg"> --}}
|
{{-- <img class="weather-icon" src="https://usetrmnl.com/images/weather/wi-day-sunny.svg"> --}}
|
||||||
</div>
|
</div>
|
||||||
<div class="content">
|
<div class="content">
|
||||||
<span class="value value--xsmall">{{ Str::title($weatherEntity['state']) }}</span>
|
<span class="value value--xsmall">{{ Str::title($weatherEntity['state']) }}</span>
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
<script src="{{ config('services.trmnl.base_url') }}/js/highcharts/12.3.0/highcharts.js"></script>
|
<script src="https://usetrmnl.com/js/highcharts/12.3.0/highcharts.js"></script>
|
||||||
<script src="{{ config('services.trmnl.base_url') }}/js/chartkick/5.0.1/chartkick.min.js"></script>
|
<script src="https://usetrmnl.com/js/chartkick/5.0.1/chartkick.min.js"></script>
|
||||||
|
|
||||||
<div class="view view--{{ size }}">
|
<div class="view view--{{ size }}">
|
||||||
<div class="layout layout--col gap--space-between">
|
<div class="layout layout--col gap--space-between">
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@
|
||||||
<div class="grid" style="gap: 9px;">
|
<div class="grid" style="gap: 9px;">
|
||||||
<div class="row row--center col--span-3 col--end">
|
<div class="row row--center col--span-3 col--end">
|
||||||
<img class="weather-image" style="max-height: 150px; margin:auto;"
|
<img class="weather-image" style="max-height: 150px; margin:auto;"
|
||||||
src="{{ config('services.trmnl.base_url') }}/images/plugins/weather/wi-thermometer.svg">
|
src="https://usetrmnl.com/images/plugins/weather/wi-thermometer.svg">
|
||||||
</div>
|
</div>
|
||||||
<div class="col col--span-3 col--center">
|
<div class="col col--span-3 col--center">
|
||||||
<div class="item">
|
<div class="item">
|
||||||
|
|
@ -21,7 +21,7 @@
|
||||||
<div class="item">
|
<div class="item">
|
||||||
<div class="meta"></div>
|
<div class="meta"></div>
|
||||||
<div class="icon">
|
<div class="icon">
|
||||||
{{-- <img class="weather-icon" src="{{ config('services.trmnl.base_url') }}/images/weather/wi-thermometer.svg">--}}
|
{{-- <img class="weather-icon" src="https://usetrmnl.com/images/weather/wi-thermometer.svg">--}}
|
||||||
</div>
|
</div>
|
||||||
<div class="content">
|
<div class="content">
|
||||||
<span
|
<span
|
||||||
|
|
@ -33,7 +33,7 @@
|
||||||
<div class="item">
|
<div class="item">
|
||||||
<div class="meta"></div>
|
<div class="meta"></div>
|
||||||
<div class="icon">
|
<div class="icon">
|
||||||
{{-- <img class="weather-icon" src="{{ config('services.trmnl.base_url') }}/images/weather/wi-raindrops.svg">--}}
|
{{-- <img class="weather-icon" src="https://usetrmnl.com/images/weather/wi-raindrops.svg">--}}
|
||||||
</div>
|
</div>
|
||||||
<div class="content">
|
<div class="content">
|
||||||
<span class="value value--small">{{Arr::get($data, 'properties.timeseries.0.data.instant.details.relative_humidity', 'N/A')}}%</span>
|
<span class="value value--small">{{Arr::get($data, 'properties.timeseries.0.data.instant.details.relative_humidity', 'N/A')}}%</span>
|
||||||
|
|
@ -44,7 +44,7 @@
|
||||||
<div class="item">
|
<div class="item">
|
||||||
<div class="meta"></div>
|
<div class="meta"></div>
|
||||||
<div class="icon">
|
<div class="icon">
|
||||||
{{-- <img class="weather-icon" src="{{ config('services.trmnl.base_url') }}/images/weather/wi-day-sunny.svg">--}}
|
{{-- <img class="weather-icon" src="https://usetrmnl.com/images/weather/wi-day-sunny.svg">--}}
|
||||||
</div>
|
</div>
|
||||||
<div class="content">
|
<div class="content">
|
||||||
<span
|
<span
|
||||||
|
|
|
||||||
|
|
@ -18,12 +18,12 @@
|
||||||
href="{{ config('trmnl-blade.framework_css_url') }}">
|
href="{{ config('trmnl-blade.framework_css_url') }}">
|
||||||
@else
|
@else
|
||||||
<link rel="stylesheet"
|
<link rel="stylesheet"
|
||||||
href="{{ config('services.trmnl.base_url') }}/css/{{ config('trmnl-blade.framework_version', '1.2.0') }}/plugins.css">
|
href="https://usetrmnl.com/css/{{ config('trmnl-blade.framework_version', '1.2.0') }}/plugins.css">
|
||||||
@endif
|
@endif
|
||||||
@if (config('trmnl-blade.framework_js_url'))
|
@if (config('trmnl-blade.framework_js_url'))
|
||||||
<script src="{{ config('trmnl-blade.framework_js_url') }}"></script>
|
<script src="{{ config('trmnl-blade.framework_js_url') }}"></script>
|
||||||
@else
|
@else
|
||||||
<script src="{{ config('services.trmnl.base_url') }}/js/{{ config('trmnl-blade.framework_version', '1.2.0') }}/plugins.js"></script>
|
<script src="https://usetrmnl.com/js/{{ config('trmnl-blade.framework_version', '1.2.0') }}/plugins.js"></script>
|
||||||
@endif
|
@endif
|
||||||
<title>{{ $title ?? config('app.name') }}</title>
|
<title>{{ $title ?? config('app.name') }}</title>
|
||||||
</head>
|
</head>
|
||||||
|
|
|
||||||
|
|
@ -17,10 +17,8 @@ test('firmware check command has correct signature', function (): void {
|
||||||
|
|
||||||
test('firmware check command runs without errors', function (): void {
|
test('firmware check command runs without errors', function (): void {
|
||||||
// Mock the firmware API response
|
// Mock the firmware API response
|
||||||
$baseUrl = config('services.trmnl.base_url');
|
|
||||||
|
|
||||||
Http::fake([
|
Http::fake([
|
||||||
$baseUrl.'/api/firmware/latest' => Http::response([
|
'https://usetrmnl.com/api/firmware/latest' => Http::response([
|
||||||
'version' => '1.0.0',
|
'version' => '1.0.0',
|
||||||
'url' => 'https://example.com/firmware.bin',
|
'url' => 'https://example.com/firmware.bin',
|
||||||
], 200),
|
], 200),
|
||||||
|
|
@ -35,10 +33,8 @@ test('firmware check command runs without errors', function (): void {
|
||||||
|
|
||||||
test('firmware check command runs with download flag', function (): void {
|
test('firmware check command runs with download flag', function (): void {
|
||||||
// Mock the firmware API response
|
// Mock the firmware API response
|
||||||
$baseUrl = config('services.trmnl.base_url');
|
|
||||||
|
|
||||||
Http::fake([
|
Http::fake([
|
||||||
$baseUrl.'/api/firmware/latest' => Http::response([
|
'https://usetrmnl.com/api/firmware/latest' => Http::response([
|
||||||
'version' => '1.0.0',
|
'version' => '1.0.0',
|
||||||
'url' => 'https://example.com/firmware.bin',
|
'url' => 'https://example.com/firmware.bin',
|
||||||
], 200),
|
], 200),
|
||||||
|
|
@ -61,10 +57,8 @@ test('firmware check command runs with download flag', function (): void {
|
||||||
|
|
||||||
test('firmware check command can run successfully', function (): void {
|
test('firmware check command can run successfully', function (): void {
|
||||||
// Mock the firmware API response
|
// Mock the firmware API response
|
||||||
$baseUrl = config('services.trmnl.base_url');
|
|
||||||
|
|
||||||
Http::fake([
|
Http::fake([
|
||||||
$baseUrl.'/api/firmware/latest' => Http::response([
|
'https://usetrmnl.com/api/firmware/latest' => Http::response([
|
||||||
'version' => '1.0.0',
|
'version' => '1.0.0',
|
||||||
'url' => 'https://example.com/firmware.bin',
|
'url' => 'https://example.com/firmware.bin',
|
||||||
], 200),
|
], 200),
|
||||||
|
|
|
||||||
|
|
@ -29,7 +29,7 @@ test('fetch device models job can be dispatched', function (): void {
|
||||||
test('fetch device models job handles successful api response', function (): void {
|
test('fetch device models job handles successful api response', function (): void {
|
||||||
Http::fake([
|
Http::fake([
|
||||||
'usetrmnl.com/api/palettes' => Http::response(['data' => []], 200),
|
'usetrmnl.com/api/palettes' => Http::response(['data' => []], 200),
|
||||||
config('services.trmnl.base_url').'/api/models' => Http::response([
|
'usetrmnl.com/api/models' => Http::response([
|
||||||
'data' => [
|
'data' => [
|
||||||
[
|
[
|
||||||
'name' => 'test-model',
|
'name' => 'test-model',
|
||||||
|
|
@ -82,7 +82,7 @@ test('fetch device models job handles successful api response', function (): voi
|
||||||
test('fetch device models job handles multiple device models', function (): void {
|
test('fetch device models job handles multiple device models', function (): void {
|
||||||
Http::fake([
|
Http::fake([
|
||||||
'usetrmnl.com/api/palettes' => Http::response(['data' => []], 200),
|
'usetrmnl.com/api/palettes' => Http::response(['data' => []], 200),
|
||||||
config('services.trmnl.base_url').'/api/models' => Http::response([
|
'usetrmnl.com/api/models' => Http::response([
|
||||||
'data' => [
|
'data' => [
|
||||||
[
|
[
|
||||||
'name' => 'model-1',
|
'name' => 'model-1',
|
||||||
|
|
@ -136,7 +136,7 @@ test('fetch device models job handles multiple device models', function (): void
|
||||||
test('fetch device models job handles empty data array', function (): void {
|
test('fetch device models job handles empty data array', function (): void {
|
||||||
Http::fake([
|
Http::fake([
|
||||||
'usetrmnl.com/api/palettes' => Http::response(['data' => []], 200),
|
'usetrmnl.com/api/palettes' => Http::response(['data' => []], 200),
|
||||||
config('services.trmnl.base_url').'/api/models' => Http::response([
|
'usetrmnl.com/api/models' => Http::response([
|
||||||
'data' => [],
|
'data' => [],
|
||||||
], 200),
|
], 200),
|
||||||
]);
|
]);
|
||||||
|
|
@ -158,7 +158,7 @@ test('fetch device models job handles empty data array', function (): void {
|
||||||
test('fetch device models job handles missing data field', function (): void {
|
test('fetch device models job handles missing data field', function (): void {
|
||||||
Http::fake([
|
Http::fake([
|
||||||
'usetrmnl.com/api/palettes' => Http::response(['data' => []], 200),
|
'usetrmnl.com/api/palettes' => Http::response(['data' => []], 200),
|
||||||
config('services.trmnl.base_url').'/api/models' => Http::response([
|
'usetrmnl.com/api/models' => Http::response([
|
||||||
'message' => 'No data available',
|
'message' => 'No data available',
|
||||||
], 200),
|
], 200),
|
||||||
]);
|
]);
|
||||||
|
|
@ -180,7 +180,7 @@ test('fetch device models job handles missing data field', function (): void {
|
||||||
test('fetch device models job handles non-array data', function (): void {
|
test('fetch device models job handles non-array data', function (): void {
|
||||||
Http::fake([
|
Http::fake([
|
||||||
'usetrmnl.com/api/palettes' => Http::response(['data' => []], 200),
|
'usetrmnl.com/api/palettes' => Http::response(['data' => []], 200),
|
||||||
config('services.trmnl.base_url').'/api/models' => Http::response([
|
'usetrmnl.com/api/models' => Http::response([
|
||||||
'data' => 'invalid-data',
|
'data' => 'invalid-data',
|
||||||
], 200),
|
], 200),
|
||||||
]);
|
]);
|
||||||
|
|
@ -202,7 +202,7 @@ test('fetch device models job handles non-array data', function (): void {
|
||||||
test('fetch device models job handles api failure', function (): void {
|
test('fetch device models job handles api failure', function (): void {
|
||||||
Http::fake([
|
Http::fake([
|
||||||
'usetrmnl.com/api/palettes' => Http::response(['data' => []], 200),
|
'usetrmnl.com/api/palettes' => Http::response(['data' => []], 200),
|
||||||
config('services.trmnl.base_url').'/api/models' => Http::response([
|
'usetrmnl.com/api/models' => Http::response([
|
||||||
'error' => 'Internal Server Error',
|
'error' => 'Internal Server Error',
|
||||||
], 500),
|
], 500),
|
||||||
]);
|
]);
|
||||||
|
|
@ -227,7 +227,7 @@ test('fetch device models job handles api failure', function (): void {
|
||||||
test('fetch device models job handles network exception', function (): void {
|
test('fetch device models job handles network exception', function (): void {
|
||||||
Http::fake([
|
Http::fake([
|
||||||
'usetrmnl.com/api/palettes' => Http::response(['data' => []], 200),
|
'usetrmnl.com/api/palettes' => Http::response(['data' => []], 200),
|
||||||
config('services.trmnl.base_url').'/api/models' => function (): void {
|
'usetrmnl.com/api/models' => function (): void {
|
||||||
throw new Exception('Network connection failed');
|
throw new Exception('Network connection failed');
|
||||||
},
|
},
|
||||||
]);
|
]);
|
||||||
|
|
@ -249,7 +249,7 @@ test('fetch device models job handles network exception', function (): void {
|
||||||
test('fetch device models job handles device model with missing name', function (): void {
|
test('fetch device models job handles device model with missing name', function (): void {
|
||||||
Http::fake([
|
Http::fake([
|
||||||
'usetrmnl.com/api/palettes' => Http::response(['data' => []], 200),
|
'usetrmnl.com/api/palettes' => Http::response(['data' => []], 200),
|
||||||
config('services.trmnl.base_url').'/api/models' => Http::response([
|
'usetrmnl.com/api/models' => Http::response([
|
||||||
'data' => [
|
'data' => [
|
||||||
[
|
[
|
||||||
'label' => 'Model without name',
|
'label' => 'Model without name',
|
||||||
|
|
@ -280,7 +280,7 @@ test('fetch device models job handles device model with missing name', function
|
||||||
test('fetch device models job handles device model with partial data', function (): void {
|
test('fetch device models job handles device model with partial data', function (): void {
|
||||||
Http::fake([
|
Http::fake([
|
||||||
'usetrmnl.com/api/palettes' => Http::response(['data' => []], 200),
|
'usetrmnl.com/api/palettes' => Http::response(['data' => []], 200),
|
||||||
config('services.trmnl.base_url').'/api/models' => Http::response([
|
'usetrmnl.com/api/models' => Http::response([
|
||||||
'data' => [
|
'data' => [
|
||||||
[
|
[
|
||||||
'name' => 'minimal-model',
|
'name' => 'minimal-model',
|
||||||
|
|
@ -329,7 +329,7 @@ test('fetch device models job updates existing device model', function (): void
|
||||||
|
|
||||||
Http::fake([
|
Http::fake([
|
||||||
'usetrmnl.com/api/palettes' => Http::response(['data' => []], 200),
|
'usetrmnl.com/api/palettes' => Http::response(['data' => []], 200),
|
||||||
config('services.trmnl.base_url').'/api/models' => Http::response([
|
'usetrmnl.com/api/models' => Http::response([
|
||||||
'data' => [
|
'data' => [
|
||||||
[
|
[
|
||||||
'name' => 'existing-model',
|
'name' => 'existing-model',
|
||||||
|
|
@ -372,7 +372,7 @@ test('fetch device models job updates existing device model', function (): void
|
||||||
test('fetch device models job handles processing exception for individual model', function (): void {
|
test('fetch device models job handles processing exception for individual model', function (): void {
|
||||||
Http::fake([
|
Http::fake([
|
||||||
'usetrmnl.com/api/palettes' => Http::response(['data' => []], 200),
|
'usetrmnl.com/api/palettes' => Http::response(['data' => []], 200),
|
||||||
config('services.trmnl.base_url').'/api/models' => Http::response([
|
'usetrmnl.com/api/models' => Http::response([
|
||||||
'data' => [
|
'data' => [
|
||||||
[
|
[
|
||||||
'name' => 'valid-model',
|
'name' => 'valid-model',
|
||||||
|
|
|
||||||
|
|
@ -10,10 +10,8 @@ beforeEach(function (): void {
|
||||||
});
|
});
|
||||||
|
|
||||||
test('it creates new firmware record when polling', function (): void {
|
test('it creates new firmware record when polling', function (): void {
|
||||||
$baseUrl = config('services.trmnl.base_url');
|
|
||||||
|
|
||||||
Http::fake([
|
Http::fake([
|
||||||
$baseUrl.'/api/firmware/latest' => Http::response([
|
'https://usetrmnl.com/api/firmware/latest' => Http::response([
|
||||||
'version' => '1.0.0',
|
'version' => '1.0.0',
|
||||||
'url' => 'https://example.com/firmware.bin',
|
'url' => 'https://example.com/firmware.bin',
|
||||||
], 200),
|
], 200),
|
||||||
|
|
@ -34,10 +32,8 @@ test('it updates existing firmware record when polling', function (): void {
|
||||||
'latest' => true,
|
'latest' => true,
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$baseUrl = config('services.trmnl.base_url');
|
|
||||||
|
|
||||||
Http::fake([
|
Http::fake([
|
||||||
$baseUrl.'/api/firmware/latest' => Http::response([
|
'https://usetrmnl.com/api/firmware/latest' => Http::response([
|
||||||
'version' => '1.0.0',
|
'version' => '1.0.0',
|
||||||
'url' => 'https://new-url.com/firmware.bin',
|
'url' => 'https://new-url.com/firmware.bin',
|
||||||
], 200),
|
], 200),
|
||||||
|
|
@ -56,10 +52,8 @@ test('it marks previous firmware as not latest when new version is found', funct
|
||||||
'latest' => true,
|
'latest' => true,
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$baseUrl = config('services.trmnl.base_url');
|
|
||||||
|
|
||||||
Http::fake([
|
Http::fake([
|
||||||
$baseUrl.'/api/firmware/latest' => Http::response([
|
'https://usetrmnl.com/api/firmware/latest' => Http::response([
|
||||||
'version' => '1.1.0',
|
'version' => '1.1.0',
|
||||||
'url' => 'https://example.com/firmware.bin',
|
'url' => 'https://example.com/firmware.bin',
|
||||||
], 200),
|
], 200),
|
||||||
|
|
@ -72,10 +66,8 @@ test('it marks previous firmware as not latest when new version is found', funct
|
||||||
});
|
});
|
||||||
|
|
||||||
test('it handles connection exception gracefully', function (): void {
|
test('it handles connection exception gracefully', function (): void {
|
||||||
$baseUrl = config('services.trmnl.base_url');
|
|
||||||
|
|
||||||
Http::fake([
|
Http::fake([
|
||||||
$baseUrl.'/api/firmware/latest' => function (): void {
|
'https://usetrmnl.com/api/firmware/latest' => function (): void {
|
||||||
throw new ConnectionException('Connection failed');
|
throw new ConnectionException('Connection failed');
|
||||||
},
|
},
|
||||||
]);
|
]);
|
||||||
|
|
@ -87,10 +79,8 @@ test('it handles connection exception gracefully', function (): void {
|
||||||
});
|
});
|
||||||
|
|
||||||
test('it handles invalid response gracefully', function (): void {
|
test('it handles invalid response gracefully', function (): void {
|
||||||
$baseUrl = config('services.trmnl.base_url');
|
|
||||||
|
|
||||||
Http::fake([
|
Http::fake([
|
||||||
$baseUrl.'/api/firmware/latest' => Http::response(null, 200),
|
'https://usetrmnl.com/api/firmware/latest' => Http::response(null, 200),
|
||||||
]);
|
]);
|
||||||
|
|
||||||
(new FirmwarePollJob)->handle();
|
(new FirmwarePollJob)->handle();
|
||||||
|
|
@ -100,10 +90,8 @@ test('it handles invalid response gracefully', function (): void {
|
||||||
});
|
});
|
||||||
|
|
||||||
test('it handles missing version in response gracefully', function (): void {
|
test('it handles missing version in response gracefully', function (): void {
|
||||||
$baseUrl = config('services.trmnl.base_url');
|
|
||||||
|
|
||||||
Http::fake([
|
Http::fake([
|
||||||
$baseUrl.'/api/firmware/latest' => Http::response([
|
'https://usetrmnl.com/api/firmware/latest' => Http::response([
|
||||||
'url' => 'https://example.com/firmware.bin',
|
'url' => 'https://example.com/firmware.bin',
|
||||||
], 200),
|
], 200),
|
||||||
]);
|
]);
|
||||||
|
|
@ -115,10 +103,8 @@ test('it handles missing version in response gracefully', function (): void {
|
||||||
});
|
});
|
||||||
|
|
||||||
test('it handles missing url in response gracefully', function (): void {
|
test('it handles missing url in response gracefully', function (): void {
|
||||||
$baseUrl = config('services.trmnl.base_url');
|
|
||||||
|
|
||||||
Http::fake([
|
Http::fake([
|
||||||
$baseUrl.'/api/firmware/latest' => Http::response([
|
'https://usetrmnl.com/api/firmware/latest' => Http::response([
|
||||||
'version' => '1.0.0',
|
'version' => '1.0.0',
|
||||||
], 200),
|
], 200),
|
||||||
]);
|
]);
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,7 @@ use Livewire\Livewire;
|
||||||
|
|
||||||
it('loads newest TRMNL recipes on mount', function (): void {
|
it('loads newest TRMNL recipes on mount', function (): void {
|
||||||
Http::fake([
|
Http::fake([
|
||||||
config('services.trmnl.base_url').'/recipes.json*' => Http::response([
|
'usetrmnl.com/recipes.json*' => Http::response([
|
||||||
'data' => [
|
'data' => [
|
||||||
[
|
[
|
||||||
'id' => 123,
|
'id' => 123,
|
||||||
|
|
@ -33,7 +33,7 @@ it('loads newest TRMNL recipes on mount', function (): void {
|
||||||
|
|
||||||
it('shows preview button when screenshot_url is provided', function (): void {
|
it('shows preview button when screenshot_url is provided', function (): void {
|
||||||
Http::fake([
|
Http::fake([
|
||||||
config('services.trmnl.base_url').'/recipes.json*' => Http::response([
|
'usetrmnl.com/recipes.json*' => Http::response([
|
||||||
'data' => [
|
'data' => [
|
||||||
[
|
[
|
||||||
'id' => 123,
|
'id' => 123,
|
||||||
|
|
@ -57,7 +57,7 @@ it('shows preview button when screenshot_url is provided', function (): void {
|
||||||
it('searches TRMNL recipes when search term is provided', function (): void {
|
it('searches TRMNL recipes when search term is provided', function (): void {
|
||||||
Http::fake([
|
Http::fake([
|
||||||
// First call (mount -> newest)
|
// First call (mount -> newest)
|
||||||
config('services.trmnl.base_url').'/recipes.json?*' => Http::sequence()
|
'usetrmnl.com/recipes.json?*' => Http::sequence()
|
||||||
->push([
|
->push([
|
||||||
'data' => [
|
'data' => [
|
||||||
[
|
[
|
||||||
|
|
@ -98,7 +98,7 @@ it('installs plugin successfully when user is authenticated', function (): void
|
||||||
$user = User::factory()->create();
|
$user = User::factory()->create();
|
||||||
|
|
||||||
Http::fake([
|
Http::fake([
|
||||||
config('services.trmnl.base_url').'/recipes.json*' => Http::response([
|
'usetrmnl.com/recipes.json*' => Http::response([
|
||||||
'data' => [
|
'data' => [
|
||||||
[
|
[
|
||||||
'id' => 123,
|
'id' => 123,
|
||||||
|
|
@ -110,7 +110,7 @@ it('installs plugin successfully when user is authenticated', function (): void
|
||||||
],
|
],
|
||||||
],
|
],
|
||||||
], 200),
|
], 200),
|
||||||
config('services.trmnl.base_url').'/api/plugin_settings/123/archive*' => Http::response('fake zip content', 200),
|
'usetrmnl.com/api/plugin_settings/123/archive*' => Http::response('fake zip content', 200),
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$this->actingAs($user);
|
$this->actingAs($user);
|
||||||
|
|
@ -125,7 +125,7 @@ it('installs plugin successfully when user is authenticated', function (): void
|
||||||
|
|
||||||
it('shows error when user is not authenticated', function (): void {
|
it('shows error when user is not authenticated', function (): void {
|
||||||
Http::fake([
|
Http::fake([
|
||||||
config('services.trmnl.base_url').'/recipes.json*' => Http::response([
|
'usetrmnl.com/recipes.json*' => Http::response([
|
||||||
'data' => [
|
'data' => [
|
||||||
[
|
[
|
||||||
'id' => 123,
|
'id' => 123,
|
||||||
|
|
@ -151,7 +151,7 @@ it('shows error when plugin installation fails', function (): void {
|
||||||
$user = User::factory()->create();
|
$user = User::factory()->create();
|
||||||
|
|
||||||
Http::fake([
|
Http::fake([
|
||||||
config('services.trmnl.base_url').'/recipes.json*' => Http::response([
|
'usetrmnl.com/recipes.json*' => Http::response([
|
||||||
'data' => [
|
'data' => [
|
||||||
[
|
[
|
||||||
'id' => 123,
|
'id' => 123,
|
||||||
|
|
@ -163,7 +163,7 @@ it('shows error when plugin installation fails', function (): void {
|
||||||
],
|
],
|
||||||
],
|
],
|
||||||
], 200),
|
], 200),
|
||||||
config('services.trmnl.base_url').'/api/plugin_settings/123/archive*' => Http::response('invalid zip content', 200),
|
'usetrmnl.com/api/plugin_settings/123/archive*' => Http::response('invalid zip content', 200),
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$this->actingAs($user);
|
$this->actingAs($user);
|
||||||
|
|
@ -178,7 +178,7 @@ it('shows error when plugin installation fails', function (): void {
|
||||||
|
|
||||||
it('previews a recipe with async fetch', function (): void {
|
it('previews a recipe with async fetch', function (): void {
|
||||||
Http::fake([
|
Http::fake([
|
||||||
config('services.trmnl.base_url').'/recipes.json*' => Http::response([
|
'usetrmnl.com/recipes.json*' => Http::response([
|
||||||
'data' => [
|
'data' => [
|
||||||
[
|
[
|
||||||
'id' => 123,
|
'id' => 123,
|
||||||
|
|
@ -190,7 +190,7 @@ it('previews a recipe with async fetch', function (): void {
|
||||||
],
|
],
|
||||||
],
|
],
|
||||||
], 200),
|
], 200),
|
||||||
config('services.trmnl.base_url').'/recipes/123.json' => Http::response([
|
'usetrmnl.com/recipes/123.json' => Http::response([
|
||||||
'data' => [
|
'data' => [
|
||||||
'id' => 123,
|
'id' => 123,
|
||||||
'name' => 'Weather Chum Updated',
|
'name' => 'Weather Chum Updated',
|
||||||
|
|
@ -216,7 +216,7 @@ it('previews a recipe with async fetch', function (): void {
|
||||||
|
|
||||||
it('supports pagination and loading more recipes', function (): void {
|
it('supports pagination and loading more recipes', function (): void {
|
||||||
Http::fake([
|
Http::fake([
|
||||||
config('services.trmnl.base_url').'/recipes.json?sort-by=newest&page=1' => Http::response([
|
'usetrmnl.com/recipes.json?sort-by=newest&page=1' => Http::response([
|
||||||
'data' => [
|
'data' => [
|
||||||
[
|
[
|
||||||
'id' => 1,
|
'id' => 1,
|
||||||
|
|
@ -229,7 +229,7 @@ it('supports pagination and loading more recipes', function (): void {
|
||||||
],
|
],
|
||||||
'next_page_url' => '/recipes.json?page=2',
|
'next_page_url' => '/recipes.json?page=2',
|
||||||
], 200),
|
], 200),
|
||||||
config('services.trmnl.base_url').'/recipes.json?sort-by=newest&page=2' => Http::response([
|
'usetrmnl.com/recipes.json?sort-by=newest&page=2' => Http::response([
|
||||||
'data' => [
|
'data' => [
|
||||||
[
|
[
|
||||||
'id' => 2,
|
'id' => 2,
|
||||||
|
|
@ -258,7 +258,7 @@ it('supports pagination and loading more recipes', function (): void {
|
||||||
|
|
||||||
it('resets pagination when search term changes', function (): void {
|
it('resets pagination when search term changes', function (): void {
|
||||||
Http::fake([
|
Http::fake([
|
||||||
config('services.trmnl.base_url').'/recipes.json?sort-by=newest&page=1' => Http::sequence()
|
'usetrmnl.com/recipes.json?sort-by=newest&page=1' => Http::sequence()
|
||||||
->push([
|
->push([
|
||||||
'data' => [['id' => 1, 'name' => 'Initial 1']],
|
'data' => [['id' => 1, 'name' => 'Initial 1']],
|
||||||
'next_page_url' => '/recipes.json?page=2',
|
'next_page_url' => '/recipes.json?page=2',
|
||||||
|
|
@ -267,7 +267,7 @@ it('resets pagination when search term changes', function (): void {
|
||||||
'data' => [['id' => 3, 'name' => 'Initial 1 Again']],
|
'data' => [['id' => 3, 'name' => 'Initial 1 Again']],
|
||||||
'next_page_url' => null,
|
'next_page_url' => null,
|
||||||
]),
|
]),
|
||||||
config('services.trmnl.base_url').'/recipes.json?search=weather&sort-by=newest&page=1' => Http::response([
|
'usetrmnl.com/recipes.json?search=weather&sort-by=newest&page=1' => Http::response([
|
||||||
'data' => [['id' => 2, 'name' => 'Weather Result']],
|
'data' => [['id' => 2, 'name' => 'Weather Result']],
|
||||||
'next_page_url' => null,
|
'next_page_url' => null,
|
||||||
]),
|
]),
|
||||||
|
|
|
||||||
|
|
@ -227,7 +227,7 @@ test('hasMissingRequiredConfigurationFields returns true when required xhrSelect
|
||||||
'field_type' => 'xhrSelect',
|
'field_type' => 'xhrSelect',
|
||||||
'name' => 'Baseball Team',
|
'name' => 'Baseball Team',
|
||||||
'description' => 'Select your team',
|
'description' => 'Select your team',
|
||||||
'endpoint' => config('services.trmnl.base_url').'/custom_plugin_example_xhr_select.json',
|
'endpoint' => 'https://usetrmnl.com/custom_plugin_example_xhr_select.json',
|
||||||
// Not marked as optional, so it's required
|
// Not marked as optional, so it's required
|
||||||
],
|
],
|
||||||
],
|
],
|
||||||
|
|
@ -252,7 +252,7 @@ test('hasMissingRequiredConfigurationFields returns false when required xhrSelec
|
||||||
'field_type' => 'xhrSelect',
|
'field_type' => 'xhrSelect',
|
||||||
'name' => 'Baseball Team',
|
'name' => 'Baseball Team',
|
||||||
'description' => 'Select your team',
|
'description' => 'Select your team',
|
||||||
'endpoint' => config('services.trmnl.base_url').'/custom_plugin_example_xhr_select.json',
|
'endpoint' => 'https://usetrmnl.com/custom_plugin_example_xhr_select.json',
|
||||||
// Not marked as optional, so it's required
|
// Not marked as optional, so it's required
|
||||||
],
|
],
|
||||||
],
|
],
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue