diff --git a/.git-blame-ignore-revs b/.git-blame-ignore-revs
index 1489ded..72dd63d 100644
--- a/.git-blame-ignore-revs
+++ b/.git-blame-ignore-revs
@@ -68,3 +68,6 @@ d0097bd14bf964bf4c283d07432ca52bfefa6391
843702b4b18a3f73efeaefb9e019ccb21f12f042
641723ac49f06a16f68e49f35cacf1eecd94e1e4
fb55e55b716537b83b79c20a1822493ce775e36a
+ddb46f8c01605d0301bc27d5f5b0eae037f3e185
+ac6e8d053f11c58db96af2d264b0840c937617b2
+417c0b034ffd5adf1efdf507c0427bf898cea9e7
diff --git a/.idea/copyright/Encore_Digital_Group.xml b/.idea/copyright/Encore_Digital_Group.xml
deleted file mode 100644
index e61d004..0000000
--- a/.idea/copyright/Encore_Digital_Group.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/composer.json b/composer.json
index 93380a1..8888255 100644
--- a/composer.json
+++ b/composer.json
@@ -15,8 +15,8 @@
"require": {
"php": "^8.3",
"composer/composer": "^2.8",
- "illuminate/collections": "^10|^11|^12",
- "illuminate/support": "^10|^11|^12",
+ "illuminate/collections": "^10|^11|^12|^13",
+ "illuminate/support": "^10|^11|^12|^13",
"ramsey/uuid": "^4.7",
"symfony/property-access": "^7.2",
"symfony/serializer": "^7.2"
diff --git a/composer.lock b/composer.lock
index aef6d16..93c289d 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,20 +4,20 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
- "content-hash": "5e755e57c6d94b86a69152b6f4fe6939",
+ "content-hash": "e232d175aceeb9770dfd2659b55f9bfb",
"packages": [
{
"name": "brick/math",
- "version": "0.14.1",
+ "version": "0.14.8",
"source": {
"type": "git",
"url": "https://github.com/brick/math.git",
- "reference": "f05858549e5f9d7bb45875a75583240a38a281d0"
+ "reference": "63422359a44b7f06cae63c3b429b59e8efcc0629"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/brick/math/zipball/f05858549e5f9d7bb45875a75583240a38a281d0",
- "reference": "f05858549e5f9d7bb45875a75583240a38a281d0",
+ "url": "https://api.github.com/repos/brick/math/zipball/63422359a44b7f06cae63c3b429b59e8efcc0629",
+ "reference": "63422359a44b7f06cae63c3b429b59e8efcc0629",
"shasum": ""
},
"require": {
@@ -56,7 +56,7 @@
],
"support": {
"issues": "https://github.com/brick/math/issues",
- "source": "https://github.com/brick/math/tree/0.14.1"
+ "source": "https://github.com/brick/math/tree/0.14.8"
},
"funding": [
{
@@ -64,7 +64,7 @@
"type": "github"
}
],
- "time": "2025-11-24T14:40:29+00:00"
+ "time": "2026-02-10T14:33:43+00:00"
},
{
"name": "carbonphp/carbon-doctrine-types",
@@ -852,16 +852,16 @@
},
{
"name": "illuminate/collections",
- "version": "v12.51.0",
+ "version": "v12.52.0",
"source": {
"type": "git",
"url": "https://github.com/illuminate/collections.git",
- "reference": "1fd7db2203ce5a935fffd2ad40955248fb9f581c"
+ "reference": "f35c084f0d9bc57895515cb4d0665797c66285fd"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/illuminate/collections/zipball/1fd7db2203ce5a935fffd2ad40955248fb9f581c",
- "reference": "1fd7db2203ce5a935fffd2ad40955248fb9f581c",
+ "url": "https://api.github.com/repos/illuminate/collections/zipball/f35c084f0d9bc57895515cb4d0665797c66285fd",
+ "reference": "f35c084f0d9bc57895515cb4d0665797c66285fd",
"shasum": ""
},
"require": {
@@ -908,7 +908,7 @@
"issues": "https://github.com/laravel/framework/issues",
"source": "https://github.com/laravel/framework"
},
- "time": "2026-02-09T13:43:38+00:00"
+ "time": "2026-02-16T14:10:38+00:00"
},
{
"name": "illuminate/conditionable",
@@ -1050,18 +1050,69 @@
},
"time": "2024-07-23T16:31:01+00:00"
},
+ {
+ "name": "illuminate/reflection",
+ "version": "v12.52.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/illuminate/reflection.git",
+ "reference": "6188e97a587371b9951c2a7e337cd760308c17d7"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/illuminate/reflection/zipball/6188e97a587371b9951c2a7e337cd760308c17d7",
+ "reference": "6188e97a587371b9951c2a7e337cd760308c17d7",
+ "shasum": ""
+ },
+ "require": {
+ "illuminate/collections": "^12.0",
+ "illuminate/contracts": "^12.0",
+ "php": "^8.2"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "12.x-dev"
+ }
+ },
+ "autoload": {
+ "files": [
+ "helpers.php"
+ ],
+ "psr-4": {
+ "Illuminate\\Support\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Taylor Otwell",
+ "email": "taylor@laravel.com"
+ }
+ ],
+ "description": "The Illuminate Reflection package.",
+ "homepage": "https://laravel.com",
+ "support": {
+ "issues": "https://github.com/laravel/framework/issues",
+ "source": "https://github.com/laravel/framework"
+ },
+ "time": "2026-02-04T15:21:22+00:00"
+ },
{
"name": "illuminate/support",
- "version": "v12.39.0",
+ "version": "v12.52.0",
"source": {
"type": "git",
"url": "https://github.com/illuminate/support.git",
- "reference": "d9780f626aa79d6b7b9c18f0d886340a29c66659"
+ "reference": "6e9de455bcb232372db11531b72a01d4eca83ef2"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/illuminate/support/zipball/d9780f626aa79d6b7b9c18f0d886340a29c66659",
- "reference": "d9780f626aa79d6b7b9c18f0d886340a29c66659",
+ "url": "https://api.github.com/repos/illuminate/support/zipball/6e9de455bcb232372db11531b72a01d4eca83ef2",
+ "reference": "6e9de455bcb232372db11531b72a01d4eca83ef2",
"shasum": ""
},
"require": {
@@ -1073,6 +1124,7 @@
"illuminate/conditionable": "^12.0",
"illuminate/contracts": "^12.0",
"illuminate/macroable": "^12.0",
+ "illuminate/reflection": "^12.0",
"nesbot/carbon": "^3.8.4",
"php": "^8.2",
"symfony/polyfill-php83": "^1.33",
@@ -1127,20 +1179,20 @@
"issues": "https://github.com/laravel/framework/issues",
"source": "https://github.com/laravel/framework"
},
- "time": "2025-11-16T14:43:22+00:00"
+ "time": "2026-02-14T23:03:41+00:00"
},
{
"name": "justinrainbow/json-schema",
- "version": "6.6.4",
+ "version": "v6.7.2",
"source": {
"type": "git",
"url": "https://github.com/jsonrainbow/json-schema.git",
- "reference": "2eeb75d21cf73211335888e7f5e6fd7440723ec7"
+ "reference": "6fea66c7204683af437864e7c4e7abf383d14bc0"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/jsonrainbow/json-schema/zipball/2eeb75d21cf73211335888e7f5e6fd7440723ec7",
- "reference": "2eeb75d21cf73211335888e7f5e6fd7440723ec7",
+ "url": "https://api.github.com/repos/jsonrainbow/json-schema/zipball/6fea66c7204683af437864e7c4e7abf383d14bc0",
+ "reference": "6fea66c7204683af437864e7c4e7abf383d14bc0",
"shasum": ""
},
"require": {
@@ -1200,9 +1252,9 @@
],
"support": {
"issues": "https://github.com/jsonrainbow/json-schema/issues",
- "source": "https://github.com/jsonrainbow/json-schema/tree/6.6.4"
+ "source": "https://github.com/jsonrainbow/json-schema/tree/v6.7.2"
},
- "time": "2025-12-19T15:01:32+00:00"
+ "time": "2026-02-15T15:06:22+00:00"
},
{
"name": "marc-mabe/php-enum",
@@ -1279,16 +1331,16 @@
},
{
"name": "nesbot/carbon",
- "version": "3.10.3",
+ "version": "3.11.1",
"source": {
"type": "git",
"url": "https://github.com/CarbonPHP/carbon.git",
- "reference": "8e3643dcd149ae0fe1d2ff4f2c8e4bbfad7c165f"
+ "reference": "f438fcc98f92babee98381d399c65336f3a3827f"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/8e3643dcd149ae0fe1d2ff4f2c8e4bbfad7c165f",
- "reference": "8e3643dcd149ae0fe1d2ff4f2c8e4bbfad7c165f",
+ "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/f438fcc98f92babee98381d399c65336f3a3827f",
+ "reference": "f438fcc98f92babee98381d399c65336f3a3827f",
"shasum": ""
},
"require": {
@@ -1296,9 +1348,9 @@
"ext-json": "*",
"php": "^8.1",
"psr/clock": "^1.0",
- "symfony/clock": "^6.3.12 || ^7.0",
+ "symfony/clock": "^6.3.12 || ^7.0 || ^8.0",
"symfony/polyfill-mbstring": "^1.0",
- "symfony/translation": "^4.4.18 || ^5.2.1 || ^6.0 || ^7.0"
+ "symfony/translation": "^4.4.18 || ^5.2.1 || ^6.0 || ^7.0 || ^8.0"
},
"provide": {
"psr/clock-implementation": "1.0"
@@ -1312,7 +1364,7 @@
"phpstan/extension-installer": "^1.4.3",
"phpstan/phpstan": "^2.1.22",
"phpunit/phpunit": "^10.5.53",
- "squizlabs/php_codesniffer": "^3.13.4"
+ "squizlabs/php_codesniffer": "^3.13.4 || ^4.0.0"
},
"bin": [
"bin/carbon"
@@ -1355,14 +1407,14 @@
}
],
"description": "An API extension for DateTime that supports 281 different languages.",
- "homepage": "https://carbon.nesbot.com",
+ "homepage": "https://carbonphp.github.io/carbon/",
"keywords": [
"date",
"datetime",
"time"
],
"support": {
- "docs": "https://carbon.nesbot.com/docs",
+ "docs": "https://carbonphp.github.io/carbon/guide/getting-started/introduction.html",
"issues": "https://github.com/CarbonPHP/carbon/issues",
"source": "https://github.com/CarbonPHP/carbon"
},
@@ -1380,7 +1432,7 @@
"type": "tidelift"
}
],
- "time": "2025-09-06T13:39:36+00:00"
+ "time": "2026-01-29T09:26:29+00:00"
},
{
"name": "psr/clock",
@@ -1986,22 +2038,21 @@
},
{
"name": "symfony/clock",
- "version": "v7.3.0",
+ "version": "v8.0.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/clock.git",
- "reference": "b81435fbd6648ea425d1ee96a2d8e68f4ceacd24"
+ "reference": "832119f9b8dbc6c8e6f65f30c5969eca1e88764f"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/clock/zipball/b81435fbd6648ea425d1ee96a2d8e68f4ceacd24",
- "reference": "b81435fbd6648ea425d1ee96a2d8e68f4ceacd24",
+ "url": "https://api.github.com/repos/symfony/clock/zipball/832119f9b8dbc6c8e6f65f30c5969eca1e88764f",
+ "reference": "832119f9b8dbc6c8e6f65f30c5969eca1e88764f",
"shasum": ""
},
"require": {
- "php": ">=8.2",
- "psr/clock": "^1.0",
- "symfony/polyfill-php83": "^1.28"
+ "php": ">=8.4",
+ "psr/clock": "^1.0"
},
"provide": {
"psr/clock-implementation": "1.0"
@@ -2040,7 +2091,7 @@
"time"
],
"support": {
- "source": "https://github.com/symfony/clock/tree/v7.3.0"
+ "source": "https://github.com/symfony/clock/tree/v8.0.0"
},
"funding": [
{
@@ -2051,56 +2102,52 @@
"url": "https://github.com/fabpot",
"type": "github"
},
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
- "time": "2024-09-25T14:21:43+00:00"
+ "time": "2025-11-12T15:46:48+00:00"
},
{
"name": "symfony/console",
- "version": "v7.4.4",
+ "version": "v8.0.4",
"source": {
"type": "git",
"url": "https://github.com/symfony/console.git",
- "reference": "41e38717ac1dd7a46b6bda7d6a82af2d98a78894"
+ "reference": "ace03c4cf9805080ff40cbeec69fca180c339a3b"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/console/zipball/41e38717ac1dd7a46b6bda7d6a82af2d98a78894",
- "reference": "41e38717ac1dd7a46b6bda7d6a82af2d98a78894",
+ "url": "https://api.github.com/repos/symfony/console/zipball/ace03c4cf9805080ff40cbeec69fca180c339a3b",
+ "reference": "ace03c4cf9805080ff40cbeec69fca180c339a3b",
"shasum": ""
},
"require": {
- "php": ">=8.2",
- "symfony/deprecation-contracts": "^2.5|^3",
- "symfony/polyfill-mbstring": "~1.0",
+ "php": ">=8.4",
+ "symfony/polyfill-mbstring": "^1.0",
"symfony/service-contracts": "^2.5|^3",
- "symfony/string": "^7.2|^8.0"
- },
- "conflict": {
- "symfony/dependency-injection": "<6.4",
- "symfony/dotenv": "<6.4",
- "symfony/event-dispatcher": "<6.4",
- "symfony/lock": "<6.4",
- "symfony/process": "<6.4"
+ "symfony/string": "^7.4|^8.0"
},
"provide": {
"psr/log-implementation": "1.0|2.0|3.0"
},
"require-dev": {
"psr/log": "^1|^2|^3",
- "symfony/config": "^6.4|^7.0|^8.0",
- "symfony/dependency-injection": "^6.4|^7.0|^8.0",
- "symfony/event-dispatcher": "^6.4|^7.0|^8.0",
- "symfony/http-foundation": "^6.4|^7.0|^8.0",
- "symfony/http-kernel": "^6.4|^7.0|^8.0",
- "symfony/lock": "^6.4|^7.0|^8.0",
- "symfony/messenger": "^6.4|^7.0|^8.0",
- "symfony/process": "^6.4|^7.0|^8.0",
- "symfony/stopwatch": "^6.4|^7.0|^8.0",
- "symfony/var-dumper": "^6.4|^7.0|^8.0"
+ "symfony/config": "^7.4|^8.0",
+ "symfony/dependency-injection": "^7.4|^8.0",
+ "symfony/event-dispatcher": "^7.4|^8.0",
+ "symfony/http-foundation": "^7.4|^8.0",
+ "symfony/http-kernel": "^7.4|^8.0",
+ "symfony/lock": "^7.4|^8.0",
+ "symfony/messenger": "^7.4|^8.0",
+ "symfony/process": "^7.4|^8.0",
+ "symfony/stopwatch": "^7.4|^8.0",
+ "symfony/var-dumper": "^7.4|^8.0"
},
"type": "library",
"autoload": {
@@ -2134,7 +2181,7 @@
"terminal"
],
"support": {
- "source": "https://github.com/symfony/console/tree/v7.4.4"
+ "source": "https://github.com/symfony/console/tree/v8.0.4"
},
"funding": [
{
@@ -2154,7 +2201,7 @@
"type": "tidelift"
}
],
- "time": "2026-01-13T11:36:38+00:00"
+ "time": "2026-01-13T13:06:50+00:00"
},
{
"name": "symfony/deprecation-contracts",
@@ -2225,25 +2272,25 @@
},
{
"name": "symfony/filesystem",
- "version": "v7.4.0",
+ "version": "v8.0.1",
"source": {
"type": "git",
"url": "https://github.com/symfony/filesystem.git",
- "reference": "d551b38811096d0be9c4691d406991b47c0c630a"
+ "reference": "d937d400b980523dc9ee946bb69972b5e619058d"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/filesystem/zipball/d551b38811096d0be9c4691d406991b47c0c630a",
- "reference": "d551b38811096d0be9c4691d406991b47c0c630a",
+ "url": "https://api.github.com/repos/symfony/filesystem/zipball/d937d400b980523dc9ee946bb69972b5e619058d",
+ "reference": "d937d400b980523dc9ee946bb69972b5e619058d",
"shasum": ""
},
"require": {
- "php": ">=8.2",
+ "php": ">=8.4",
"symfony/polyfill-ctype": "~1.8",
"symfony/polyfill-mbstring": "~1.8"
},
"require-dev": {
- "symfony/process": "^6.4|^7.0|^8.0"
+ "symfony/process": "^7.4|^8.0"
},
"type": "library",
"autoload": {
@@ -2271,7 +2318,7 @@
"description": "Provides basic utilities for the filesystem",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/filesystem/tree/v7.4.0"
+ "source": "https://github.com/symfony/filesystem/tree/v8.0.1"
},
"funding": [
{
@@ -2291,27 +2338,27 @@
"type": "tidelift"
}
],
- "time": "2025-11-27T13:27:24+00:00"
+ "time": "2025-12-01T09:13:36+00:00"
},
{
"name": "symfony/finder",
- "version": "v7.4.5",
+ "version": "v8.0.5",
"source": {
"type": "git",
"url": "https://github.com/symfony/finder.git",
- "reference": "ad4daa7c38668dcb031e63bc99ea9bd42196a2cb"
+ "reference": "8bd576e97c67d45941365bf824e18dc8538e6eb0"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/finder/zipball/ad4daa7c38668dcb031e63bc99ea9bd42196a2cb",
- "reference": "ad4daa7c38668dcb031e63bc99ea9bd42196a2cb",
+ "url": "https://api.github.com/repos/symfony/finder/zipball/8bd576e97c67d45941365bf824e18dc8538e6eb0",
+ "reference": "8bd576e97c67d45941365bf824e18dc8538e6eb0",
"shasum": ""
},
"require": {
- "php": ">=8.2"
+ "php": ">=8.4"
},
"require-dev": {
- "symfony/filesystem": "^6.4|^7.0|^8.0"
+ "symfony/filesystem": "^7.4|^8.0"
},
"type": "library",
"autoload": {
@@ -2339,7 +2386,7 @@
"description": "Finds files and directories via an intuitive fluent interface",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/finder/tree/v7.4.5"
+ "source": "https://github.com/symfony/finder/tree/v8.0.5"
},
"funding": [
{
@@ -2359,7 +2406,7 @@
"type": "tidelift"
}
],
- "time": "2026-01-26T15:07:59+00:00"
+ "time": "2026-01-26T15:08:38+00:00"
},
{
"name": "symfony/polyfill-ctype",
@@ -3182,20 +3229,20 @@
},
{
"name": "symfony/process",
- "version": "v7.4.5",
+ "version": "v8.0.5",
"source": {
"type": "git",
"url": "https://github.com/symfony/process.git",
- "reference": "608476f4604102976d687c483ac63a79ba18cc97"
+ "reference": "b5f3aa6762e33fd95efbaa2ec4f4bc9fdd16d674"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/process/zipball/608476f4604102976d687c483ac63a79ba18cc97",
- "reference": "608476f4604102976d687c483ac63a79ba18cc97",
+ "url": "https://api.github.com/repos/symfony/process/zipball/b5f3aa6762e33fd95efbaa2ec4f4bc9fdd16d674",
+ "reference": "b5f3aa6762e33fd95efbaa2ec4f4bc9fdd16d674",
"shasum": ""
},
"require": {
- "php": ">=8.2"
+ "php": ">=8.4"
},
"type": "library",
"autoload": {
@@ -3223,7 +3270,7 @@
"description": "Executes commands in sub-processes",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/process/tree/v7.4.5"
+ "source": "https://github.com/symfony/process/tree/v8.0.5"
},
"funding": [
{
@@ -3243,28 +3290,29 @@
"type": "tidelift"
}
],
- "time": "2026-01-26T15:07:59+00:00"
+ "time": "2026-01-26T15:08:38+00:00"
},
{
"name": "symfony/property-access",
- "version": "v7.3.3",
+ "version": "v7.4.4",
"source": {
"type": "git",
"url": "https://github.com/symfony/property-access.git",
- "reference": "4a4389e5c8bd1d0320d80a23caa6a1ac71cb81a7"
+ "reference": "fa49bf1ca8fce1ba0e2dba4e4658554cfb9364b1"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/property-access/zipball/4a4389e5c8bd1d0320d80a23caa6a1ac71cb81a7",
- "reference": "4a4389e5c8bd1d0320d80a23caa6a1ac71cb81a7",
+ "url": "https://api.github.com/repos/symfony/property-access/zipball/fa49bf1ca8fce1ba0e2dba4e4658554cfb9364b1",
+ "reference": "fa49bf1ca8fce1ba0e2dba4e4658554cfb9364b1",
"shasum": ""
},
"require": {
"php": ">=8.2",
- "symfony/property-info": "^6.4|^7.0"
+ "symfony/property-info": "^6.4.32|~7.3.10|^7.4.4|^8.0.4"
},
"require-dev": {
- "symfony/cache": "^6.4|^7.0"
+ "symfony/cache": "^6.4|^7.0|^8.0",
+ "symfony/var-exporter": "^6.4.1|^7.0.1|^8.0"
},
"type": "library",
"autoload": {
@@ -3303,7 +3351,7 @@
"reflection"
],
"support": {
- "source": "https://github.com/symfony/property-access/tree/v7.3.3"
+ "source": "https://github.com/symfony/property-access/tree/v7.4.4"
},
"funding": [
{
@@ -3323,41 +3371,37 @@
"type": "tidelift"
}
],
- "time": "2025-08-04T15:15:28+00:00"
+ "time": "2026-01-05T08:47:25+00:00"
},
{
"name": "symfony/property-info",
- "version": "v7.3.5",
+ "version": "v8.0.5",
"source": {
"type": "git",
"url": "https://github.com/symfony/property-info.git",
- "reference": "0b346ed259dc5da43535caf243005fe7d4b0f051"
+ "reference": "9d987224b54758240e80a062c5e414431bbf84de"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/property-info/zipball/0b346ed259dc5da43535caf243005fe7d4b0f051",
- "reference": "0b346ed259dc5da43535caf243005fe7d4b0f051",
+ "url": "https://api.github.com/repos/symfony/property-info/zipball/9d987224b54758240e80a062c5e414431bbf84de",
+ "reference": "9d987224b54758240e80a062c5e414431bbf84de",
"shasum": ""
},
"require": {
- "php": ">=8.2",
- "symfony/deprecation-contracts": "^2.5|^3",
- "symfony/string": "^6.4|^7.0",
- "symfony/type-info": "^7.3.5"
+ "php": ">=8.4",
+ "symfony/string": "^7.4|^8.0",
+ "symfony/type-info": "^7.4.4|^8.0.4"
},
"conflict": {
- "phpdocumentor/reflection-docblock": "<5.2",
- "phpdocumentor/type-resolver": "<1.5.1",
- "symfony/cache": "<6.4",
- "symfony/dependency-injection": "<6.4",
- "symfony/serializer": "<6.4"
+ "phpdocumentor/reflection-docblock": "<5.2|>=6",
+ "phpdocumentor/type-resolver": "<1.5.1"
},
"require-dev": {
"phpdocumentor/reflection-docblock": "^5.2",
"phpstan/phpdoc-parser": "^1.0|^2.0",
- "symfony/cache": "^6.4|^7.0",
- "symfony/dependency-injection": "^6.4|^7.0",
- "symfony/serializer": "^6.4|^7.0"
+ "symfony/cache": "^7.4|^8.0",
+ "symfony/dependency-injection": "^7.4|^8.0",
+ "symfony/serializer": "^7.4|^8.0"
},
"type": "library",
"autoload": {
@@ -3393,7 +3437,7 @@
"validator"
],
"support": {
- "source": "https://github.com/symfony/property-info/tree/v7.3.5"
+ "source": "https://github.com/symfony/property-info/tree/v8.0.5"
},
"funding": [
{
@@ -3413,20 +3457,20 @@
"type": "tidelift"
}
],
- "time": "2025-10-05T22:12:41+00:00"
+ "time": "2026-01-27T16:18:07+00:00"
},
{
"name": "symfony/serializer",
- "version": "v7.3.5",
+ "version": "v7.4.5",
"source": {
"type": "git",
"url": "https://github.com/symfony/serializer.git",
- "reference": "ba2e50a5f2870c93f0f47ca1a4e56e4bbe274035"
+ "reference": "480cd1237c98ab1219c20945b92c9d4480a44f47"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/serializer/zipball/ba2e50a5f2870c93f0f47ca1a4e56e4bbe274035",
- "reference": "ba2e50a5f2870c93f0f47ca1a4e56e4bbe274035",
+ "url": "https://api.github.com/repos/symfony/serializer/zipball/480cd1237c98ab1219c20945b92c9d4480a44f47",
+ "reference": "480cd1237c98ab1219c20945b92c9d4480a44f47",
"shasum": ""
},
"require": {
@@ -3436,8 +3480,8 @@
"symfony/polyfill-php84": "^1.30"
},
"conflict": {
- "phpdocumentor/reflection-docblock": "<3.2.2",
- "phpdocumentor/type-resolver": "<1.4.0",
+ "phpdocumentor/reflection-docblock": "<5.2|>=6",
+ "phpdocumentor/type-resolver": "<1.5.1",
"symfony/dependency-injection": "<6.4",
"symfony/property-access": "<6.4",
"symfony/property-info": "<6.4",
@@ -3446,29 +3490,29 @@
"symfony/yaml": "<6.4"
},
"require-dev": {
- "phpdocumentor/reflection-docblock": "^3.2|^4.0|^5.0",
+ "phpdocumentor/reflection-docblock": "^5.2",
"phpstan/phpdoc-parser": "^1.0|^2.0",
"seld/jsonlint": "^1.10",
- "symfony/cache": "^6.4|^7.0",
- "symfony/config": "^6.4|^7.0",
- "symfony/console": "^6.4|^7.0",
- "symfony/dependency-injection": "^7.2",
- "symfony/error-handler": "^6.4|^7.0",
- "symfony/filesystem": "^6.4|^7.0",
- "symfony/form": "^6.4|^7.0",
- "symfony/http-foundation": "^6.4|^7.0",
- "symfony/http-kernel": "^6.4|^7.0",
- "symfony/messenger": "^6.4|^7.0",
- "symfony/mime": "^6.4|^7.0",
- "symfony/property-access": "^6.4|^7.0",
- "symfony/property-info": "^6.4|^7.0",
+ "symfony/cache": "^6.4|^7.0|^8.0",
+ "symfony/config": "^6.4|^7.0|^8.0",
+ "symfony/console": "^6.4|^7.0|^8.0",
+ "symfony/dependency-injection": "^7.2|^8.0",
+ "symfony/error-handler": "^6.4|^7.0|^8.0",
+ "symfony/filesystem": "^6.4|^7.0|^8.0",
+ "symfony/form": "^6.4|^7.0|^8.0",
+ "symfony/http-foundation": "^6.4|^7.0|^8.0",
+ "symfony/http-kernel": "^6.4|^7.0|^8.0",
+ "symfony/messenger": "^6.4|^7.0|^8.0",
+ "symfony/mime": "^6.4|^7.0|^8.0",
+ "symfony/property-access": "^6.4|^7.0|^8.0",
+ "symfony/property-info": "^6.4|^7.0|^8.0",
"symfony/translation-contracts": "^2.5|^3",
- "symfony/type-info": "^7.1.8",
- "symfony/uid": "^6.4|^7.0",
- "symfony/validator": "^6.4|^7.0",
- "symfony/var-dumper": "^6.4|^7.0",
- "symfony/var-exporter": "^6.4|^7.0",
- "symfony/yaml": "^6.4|^7.0"
+ "symfony/type-info": "^7.1.8|^8.0",
+ "symfony/uid": "^6.4|^7.0|^8.0",
+ "symfony/validator": "^6.4|^7.0|^8.0",
+ "symfony/var-dumper": "^6.4|^7.0|^8.0",
+ "symfony/var-exporter": "^6.4|^7.0|^8.0",
+ "symfony/yaml": "^6.4|^7.0|^8.0"
},
"type": "library",
"autoload": {
@@ -3496,7 +3540,7 @@
"description": "Handles serializing and deserializing data structures, including object graphs, into array structures or other formats like XML and JSON.",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/serializer/tree/v7.3.5"
+ "source": "https://github.com/symfony/serializer/tree/v7.4.5"
},
"funding": [
{
@@ -3516,7 +3560,7 @@
"type": "tidelift"
}
],
- "time": "2025-10-08T11:26:21+00:00"
+ "time": "2026-01-27T08:59:58+00:00"
},
{
"name": "symfony/service-contracts",
@@ -3607,35 +3651,34 @@
},
{
"name": "symfony/string",
- "version": "v7.4.4",
+ "version": "v8.0.4",
"source": {
"type": "git",
"url": "https://github.com/symfony/string.git",
- "reference": "1c4b10461bf2ec27537b5f36105337262f5f5d6f"
+ "reference": "758b372d6882506821ed666032e43020c4f57194"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/string/zipball/1c4b10461bf2ec27537b5f36105337262f5f5d6f",
- "reference": "1c4b10461bf2ec27537b5f36105337262f5f5d6f",
+ "url": "https://api.github.com/repos/symfony/string/zipball/758b372d6882506821ed666032e43020c4f57194",
+ "reference": "758b372d6882506821ed666032e43020c4f57194",
"shasum": ""
},
"require": {
- "php": ">=8.2",
- "symfony/deprecation-contracts": "^2.5|^3.0",
- "symfony/polyfill-ctype": "~1.8",
- "symfony/polyfill-intl-grapheme": "~1.33",
- "symfony/polyfill-intl-normalizer": "~1.0",
- "symfony/polyfill-mbstring": "~1.0"
+ "php": ">=8.4",
+ "symfony/polyfill-ctype": "^1.8",
+ "symfony/polyfill-intl-grapheme": "^1.33",
+ "symfony/polyfill-intl-normalizer": "^1.0",
+ "symfony/polyfill-mbstring": "^1.0"
},
"conflict": {
"symfony/translation-contracts": "<2.5"
},
"require-dev": {
- "symfony/emoji": "^7.1|^8.0",
- "symfony/http-client": "^6.4|^7.0|^8.0",
- "symfony/intl": "^6.4|^7.0|^8.0",
+ "symfony/emoji": "^7.4|^8.0",
+ "symfony/http-client": "^7.4|^8.0",
+ "symfony/intl": "^7.4|^8.0",
"symfony/translation-contracts": "^2.5|^3.0",
- "symfony/var-exporter": "^6.4|^7.0|^8.0"
+ "symfony/var-exporter": "^7.4|^8.0"
},
"type": "library",
"autoload": {
@@ -3674,7 +3717,7 @@
"utf8"
],
"support": {
- "source": "https://github.com/symfony/string/tree/v7.4.4"
+ "source": "https://github.com/symfony/string/tree/v8.0.4"
},
"funding": [
{
@@ -3694,38 +3737,31 @@
"type": "tidelift"
}
],
- "time": "2026-01-12T10:54:30+00:00"
+ "time": "2026-01-12T12:37:40+00:00"
},
{
"name": "symfony/translation",
- "version": "v7.3.4",
+ "version": "v8.0.4",
"source": {
"type": "git",
"url": "https://github.com/symfony/translation.git",
- "reference": "ec25870502d0c7072d086e8ffba1420c85965174"
+ "reference": "db70c8ce7db74fd2da7b1d268db46b2a8ce32c10"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/translation/zipball/ec25870502d0c7072d086e8ffba1420c85965174",
- "reference": "ec25870502d0c7072d086e8ffba1420c85965174",
+ "url": "https://api.github.com/repos/symfony/translation/zipball/db70c8ce7db74fd2da7b1d268db46b2a8ce32c10",
+ "reference": "db70c8ce7db74fd2da7b1d268db46b2a8ce32c10",
"shasum": ""
},
"require": {
- "php": ">=8.2",
- "symfony/deprecation-contracts": "^2.5|^3",
- "symfony/polyfill-mbstring": "~1.0",
- "symfony/translation-contracts": "^2.5|^3.0"
+ "php": ">=8.4",
+ "symfony/polyfill-mbstring": "^1.0",
+ "symfony/translation-contracts": "^3.6.1"
},
"conflict": {
"nikic/php-parser": "<5.0",
- "symfony/config": "<6.4",
- "symfony/console": "<6.4",
- "symfony/dependency-injection": "<6.4",
"symfony/http-client-contracts": "<2.5",
- "symfony/http-kernel": "<6.4",
- "symfony/service-contracts": "<2.5",
- "symfony/twig-bundle": "<6.4",
- "symfony/yaml": "<6.4"
+ "symfony/service-contracts": "<2.5"
},
"provide": {
"symfony/translation-implementation": "2.3|3.0"
@@ -3733,17 +3769,17 @@
"require-dev": {
"nikic/php-parser": "^5.0",
"psr/log": "^1|^2|^3",
- "symfony/config": "^6.4|^7.0",
- "symfony/console": "^6.4|^7.0",
- "symfony/dependency-injection": "^6.4|^7.0",
- "symfony/finder": "^6.4|^7.0",
+ "symfony/config": "^7.4|^8.0",
+ "symfony/console": "^7.4|^8.0",
+ "symfony/dependency-injection": "^7.4|^8.0",
+ "symfony/finder": "^7.4|^8.0",
"symfony/http-client-contracts": "^2.5|^3.0",
- "symfony/http-kernel": "^6.4|^7.0",
- "symfony/intl": "^6.4|^7.0",
+ "symfony/http-kernel": "^7.4|^8.0",
+ "symfony/intl": "^7.4|^8.0",
"symfony/polyfill-intl-icu": "^1.21",
- "symfony/routing": "^6.4|^7.0",
+ "symfony/routing": "^7.4|^8.0",
"symfony/service-contracts": "^2.5|^3",
- "symfony/yaml": "^6.4|^7.0"
+ "symfony/yaml": "^7.4|^8.0"
},
"type": "library",
"autoload": {
@@ -3774,7 +3810,7 @@
"description": "Provides tools to internationalize your application",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/translation/tree/v7.3.4"
+ "source": "https://github.com/symfony/translation/tree/v8.0.4"
},
"funding": [
{
@@ -3794,7 +3830,7 @@
"type": "tidelift"
}
],
- "time": "2025-09-07T11:39:36+00:00"
+ "time": "2026-01-13T13:06:50+00:00"
},
{
"name": "symfony/translation-contracts",
@@ -3880,22 +3916,21 @@
},
{
"name": "symfony/type-info",
- "version": "v7.3.5",
+ "version": "v8.0.4",
"source": {
"type": "git",
"url": "https://github.com/symfony/type-info.git",
- "reference": "8b36f41421160db56914f897b57eaa6a830758b3"
+ "reference": "106a2d3bbf0d4576b2f70e6ca866fa420956ed0d"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/type-info/zipball/8b36f41421160db56914f897b57eaa6a830758b3",
- "reference": "8b36f41421160db56914f897b57eaa6a830758b3",
+ "url": "https://api.github.com/repos/symfony/type-info/zipball/106a2d3bbf0d4576b2f70e6ca866fa420956ed0d",
+ "reference": "106a2d3bbf0d4576b2f70e6ca866fa420956ed0d",
"shasum": ""
},
"require": {
- "php": ">=8.2",
- "psr/container": "^1.1|^2.0",
- "symfony/deprecation-contracts": "^2.5|^3"
+ "php": ">=8.4",
+ "psr/container": "^1.1|^2.0"
},
"conflict": {
"phpstan/phpdoc-parser": "<1.30"
@@ -3939,7 +3974,7 @@
"type"
],
"support": {
- "source": "https://github.com/symfony/type-info/tree/v7.3.5"
+ "source": "https://github.com/symfony/type-info/tree/v8.0.4"
},
"funding": [
{
@@ -3959,7 +3994,7 @@
"type": "tidelift"
}
],
- "time": "2025-10-16T12:30:12+00:00"
+ "time": "2026-01-09T12:15:10+00:00"
},
{
"name": "voku/portable-ascii",
@@ -4039,16 +4074,16 @@
"packages-dev": [
{
"name": "brianium/paratest",
- "version": "v7.17.0",
+ "version": "v7.19.0",
"source": {
"type": "git",
"url": "https://github.com/paratestphp/paratest.git",
- "reference": "53cb90a6aa3ef3840458781600628ade058a18b9"
+ "reference": "7c6c29af7c4b406b49ce0c6b0a3a81d3684474e6"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/paratestphp/paratest/zipball/53cb90a6aa3ef3840458781600628ade058a18b9",
- "reference": "53cb90a6aa3ef3840458781600628ade058a18b9",
+ "url": "https://api.github.com/repos/paratestphp/paratest/zipball/7c6c29af7c4b406b49ce0c6b0a3a81d3684474e6",
+ "reference": "7c6c29af7c4b406b49ce0c6b0a3a81d3684474e6",
"shasum": ""
},
"require": {
@@ -4059,13 +4094,13 @@
"fidry/cpu-core-counter": "^1.3.0",
"jean85/pretty-package-versions": "^2.1.1",
"php": "~8.3.0 || ~8.4.0 || ~8.5.0",
- "phpunit/php-code-coverage": "^12.5.2",
- "phpunit/php-file-iterator": "^6",
- "phpunit/php-timer": "^8",
- "phpunit/phpunit": "^12.5.8",
- "sebastian/environment": "^8.0.3",
- "symfony/console": "^7.3.4 || ^8.0.0",
- "symfony/process": "^7.3.4 || ^8.0.0"
+ "phpunit/php-code-coverage": "^12.5.3 || ^13.0.1",
+ "phpunit/php-file-iterator": "^6.0.1 || ^7",
+ "phpunit/php-timer": "^8 || ^9",
+ "phpunit/phpunit": "^12.5.9 || ^13",
+ "sebastian/environment": "^8.0.3 || ^9",
+ "symfony/console": "^7.4.4 || ^8.0.4",
+ "symfony/process": "^7.4.5 || ^8.0.5"
},
"require-dev": {
"doctrine/coding-standard": "^14.0.0",
@@ -4076,7 +4111,7 @@
"phpstan/phpstan-deprecation-rules": "^2.0.3",
"phpstan/phpstan-phpunit": "^2.0.12",
"phpstan/phpstan-strict-rules": "^2.0.8",
- "symfony/filesystem": "^7.3.2 || ^8.0.0"
+ "symfony/filesystem": "^7.4.0 || ^8.0.1"
},
"bin": [
"bin/paratest",
@@ -4116,7 +4151,7 @@
],
"support": {
"issues": "https://github.com/paratestphp/paratest/issues",
- "source": "https://github.com/paratestphp/paratest/tree/v7.17.0"
+ "source": "https://github.com/paratestphp/paratest/tree/v7.19.0"
},
"funding": [
{
@@ -4128,7 +4163,7 @@
"type": "paypal"
}
],
- "time": "2026-02-05T09:14:44+00:00"
+ "time": "2026-02-06T10:53:26+00:00"
},
{
"name": "doctrine/deprecations",
@@ -4624,39 +4659,36 @@
},
{
"name": "nunomaduro/collision",
- "version": "v8.8.3",
+ "version": "v8.9.1",
"source": {
"type": "git",
"url": "https://github.com/nunomaduro/collision.git",
- "reference": "1dc9e88d105699d0fee8bb18890f41b274f6b4c4"
+ "reference": "a1ed3fa530fd60bc515f9303e8520fcb7d4bd935"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/nunomaduro/collision/zipball/1dc9e88d105699d0fee8bb18890f41b274f6b4c4",
- "reference": "1dc9e88d105699d0fee8bb18890f41b274f6b4c4",
+ "url": "https://api.github.com/repos/nunomaduro/collision/zipball/a1ed3fa530fd60bc515f9303e8520fcb7d4bd935",
+ "reference": "a1ed3fa530fd60bc515f9303e8520fcb7d4bd935",
"shasum": ""
},
"require": {
- "filp/whoops": "^2.18.1",
- "nunomaduro/termwind": "^2.3.1",
+ "filp/whoops": "^2.18.4",
+ "nunomaduro/termwind": "^2.4.0",
"php": "^8.2.0",
- "symfony/console": "^7.3.0"
+ "symfony/console": "^7.4.4 || ^8.0.4"
},
"conflict": {
- "laravel/framework": "<11.44.2 || >=13.0.0",
- "phpunit/phpunit": "<11.5.15 || >=13.0.0"
+ "laravel/framework": "<11.48.0 || >=14.0.0",
+ "phpunit/phpunit": "<11.5.50 || >=14.0.0"
},
"require-dev": {
- "brianium/paratest": "^7.8.3",
- "larastan/larastan": "^3.4.2",
- "laravel/framework": "^11.44.2 || ^12.18",
- "laravel/pint": "^1.22.1",
- "laravel/sail": "^1.43.1",
- "laravel/sanctum": "^4.1.1",
- "laravel/tinker": "^2.10.1",
- "orchestra/testbench-core": "^9.12.0 || ^10.4",
- "pestphp/pest": "^3.8.2 || ^4.0.0",
- "sebastian/environment": "^7.2.1 || ^8.0"
+ "brianium/paratest": "^7.8.5",
+ "larastan/larastan": "^3.9.2",
+ "laravel/framework": "^11.48.0 || ^12.52.0",
+ "laravel/pint": "^1.27.1",
+ "orchestra/testbench-core": "^9.12.0 || ^10.9.0",
+ "pestphp/pest": "^3.8.5 || ^4.4.1 || ^5.0.0",
+ "sebastian/environment": "^7.2.1 || ^8.0.3 || ^9.0.0"
},
"type": "library",
"extra": {
@@ -4719,35 +4751,35 @@
"type": "patreon"
}
],
- "time": "2025-11-20T02:55:25+00:00"
+ "time": "2026-02-17T17:33:08+00:00"
},
{
"name": "nunomaduro/termwind",
- "version": "v2.3.3",
+ "version": "v2.4.0",
"source": {
"type": "git",
"url": "https://github.com/nunomaduro/termwind.git",
- "reference": "6fb2a640ff502caace8e05fd7be3b503a7e1c017"
+ "reference": "712a31b768f5daea284c2169a7d227031001b9a8"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/nunomaduro/termwind/zipball/6fb2a640ff502caace8e05fd7be3b503a7e1c017",
- "reference": "6fb2a640ff502caace8e05fd7be3b503a7e1c017",
+ "url": "https://api.github.com/repos/nunomaduro/termwind/zipball/712a31b768f5daea284c2169a7d227031001b9a8",
+ "reference": "712a31b768f5daea284c2169a7d227031001b9a8",
"shasum": ""
},
"require": {
"ext-mbstring": "*",
"php": "^8.2",
- "symfony/console": "^7.3.6"
+ "symfony/console": "^7.4.4 || ^8.0.4"
},
"require-dev": {
- "illuminate/console": "^11.46.1",
- "laravel/pint": "^1.25.1",
+ "illuminate/console": "^11.47.0",
+ "laravel/pint": "^1.27.1",
"mockery/mockery": "^1.6.12",
- "pestphp/pest": "^2.36.0 || ^3.8.4 || ^4.1.3",
+ "pestphp/pest": "^2.36.0 || ^3.8.4 || ^4.3.2",
"phpstan/phpstan": "^1.12.32",
"phpstan/phpstan-strict-rules": "^1.6.2",
- "symfony/var-dumper": "^7.3.5",
+ "symfony/var-dumper": "^7.3.5 || ^8.0.4",
"thecodingmachine/phpstan-strict-rules": "^1.0.0"
},
"type": "library",
@@ -4779,7 +4811,7 @@
"email": "enunomaduro@gmail.com"
}
],
- "description": "Its like Tailwind CSS, but for the console.",
+ "description": "It's like Tailwind CSS, but for the console.",
"keywords": [
"cli",
"console",
@@ -4790,7 +4822,7 @@
],
"support": {
"issues": "https://github.com/nunomaduro/termwind/issues",
- "source": "https://github.com/nunomaduro/termwind/tree/v2.3.3"
+ "source": "https://github.com/nunomaduro/termwind/tree/v2.4.0"
},
"funding": [
{
@@ -4806,45 +4838,45 @@
"type": "github"
}
],
- "time": "2025-11-20T02:34:59+00:00"
+ "time": "2026-02-16T23:10:27+00:00"
},
{
"name": "pestphp/pest",
- "version": "v4.3.2",
+ "version": "v4.4.1",
"source": {
"type": "git",
"url": "https://github.com/pestphp/pest.git",
- "reference": "3a4329ddc7a2b67c19fca8342a668b39be3ae398"
+ "reference": "f96a1b27864b585b0b29b0ee7331176726f7e54a"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/pestphp/pest/zipball/3a4329ddc7a2b67c19fca8342a668b39be3ae398",
- "reference": "3a4329ddc7a2b67c19fca8342a668b39be3ae398",
+ "url": "https://api.github.com/repos/pestphp/pest/zipball/f96a1b27864b585b0b29b0ee7331176726f7e54a",
+ "reference": "f96a1b27864b585b0b29b0ee7331176726f7e54a",
"shasum": ""
},
"require": {
- "brianium/paratest": "^7.16.1",
- "nunomaduro/collision": "^8.8.3",
- "nunomaduro/termwind": "^2.3.3",
+ "brianium/paratest": "^7.19.0",
+ "nunomaduro/collision": "^8.9.0",
+ "nunomaduro/termwind": "^2.4.0",
"pestphp/pest-plugin": "^4.0.0",
"pestphp/pest-plugin-arch": "^4.0.0",
"pestphp/pest-plugin-mutate": "^4.0.1",
"pestphp/pest-plugin-profanity": "^4.2.1",
"php": "^8.3.0",
- "phpunit/phpunit": "^12.5.8",
- "symfony/process": "^7.4.4|^8.0.0"
+ "phpunit/phpunit": "^12.5.12",
+ "symfony/process": "^7.4.5|^8.0.5"
},
"conflict": {
"filp/whoops": "<2.18.3",
- "phpunit/phpunit": ">12.5.8",
+ "phpunit/phpunit": ">12.5.12",
"sebastian/exporter": "<7.0.0",
"webmozart/assert": "<1.11.0"
},
"require-dev": {
- "pestphp/pest-dev-tools": "^4.0.0",
- "pestphp/pest-plugin-browser": "^4.2.1",
+ "pestphp/pest-dev-tools": "^4.1.0",
+ "pestphp/pest-plugin-browser": "^4.3.0",
"pestphp/pest-plugin-type-coverage": "^4.0.3",
- "psy/psysh": "^0.12.18"
+ "psy/psysh": "^0.12.20"
},
"bin": [
"bin/pest"
@@ -4910,7 +4942,7 @@
],
"support": {
"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.4.1"
},
"funding": [
{
@@ -4922,7 +4954,7 @@
"type": "github"
}
],
- "time": "2026-01-28T01:01:19+00:00"
+ "time": "2026-02-17T15:27:18+00:00"
},
{
"name": "pestphp/pest-plugin",
@@ -5369,16 +5401,16 @@
},
{
"name": "phpdocumentor/reflection-docblock",
- "version": "6.0.1",
+ "version": "5.6.6",
"source": {
"type": "git",
"url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
- "reference": "2f5cbed597cb261d1ea458f3da3a9ad32e670b1e"
+ "reference": "5cee1d3dfc2d2aa6599834520911d246f656bcb8"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/2f5cbed597cb261d1ea458f3da3a9ad32e670b1e",
- "reference": "2f5cbed597cb261d1ea458f3da3a9ad32e670b1e",
+ "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/5cee1d3dfc2d2aa6599834520911d246f656bcb8",
+ "reference": "5cee1d3dfc2d2aa6599834520911d246f656bcb8",
"shasum": ""
},
"require": {
@@ -5386,8 +5418,8 @@
"ext-filter": "*",
"php": "^7.4 || ^8.0",
"phpdocumentor/reflection-common": "^2.2",
- "phpdocumentor/type-resolver": "^2.0",
- "phpstan/phpdoc-parser": "^2.0",
+ "phpdocumentor/type-resolver": "^1.7",
+ "phpstan/phpdoc-parser": "^1.7|^2.0",
"webmozart/assert": "^1.9.1 || ^2"
},
"require-dev": {
@@ -5397,8 +5429,7 @@
"phpstan/phpstan-mockery": "^1.1",
"phpstan/phpstan-webmozart-assert": "^1.2",
"phpunit/phpunit": "^9.5",
- "psalm/phar": "^5.26",
- "shipmonk/dead-code-detector": "^0.5.1"
+ "psalm/phar": "^5.26"
},
"type": "library",
"extra": {
@@ -5428,44 +5459,44 @@
"description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.",
"support": {
"issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues",
- "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/6.0.1"
+ "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.6.6"
},
- "time": "2026-01-20T15:30:42+00:00"
+ "time": "2025-12-22T21:13:58+00:00"
},
{
"name": "phpdocumentor/type-resolver",
- "version": "2.0.0",
+ "version": "1.12.0",
"source": {
"type": "git",
"url": "https://github.com/phpDocumentor/TypeResolver.git",
- "reference": "327a05bbee54120d4786a0dc67aad30226ad4cf9"
+ "reference": "92a98ada2b93d9b201a613cb5a33584dde25f195"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/327a05bbee54120d4786a0dc67aad30226ad4cf9",
- "reference": "327a05bbee54120d4786a0dc67aad30226ad4cf9",
+ "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/92a98ada2b93d9b201a613cb5a33584dde25f195",
+ "reference": "92a98ada2b93d9b201a613cb5a33584dde25f195",
"shasum": ""
},
"require": {
"doctrine/deprecations": "^1.0",
- "php": "^7.4 || ^8.0",
+ "php": "^7.3 || ^8.0",
"phpdocumentor/reflection-common": "^2.0",
- "phpstan/phpdoc-parser": "^2.0"
+ "phpstan/phpdoc-parser": "^1.18|^2.0"
},
"require-dev": {
"ext-tokenizer": "*",
"phpbench/phpbench": "^1.2",
- "phpstan/extension-installer": "^1.4",
- "phpstan/phpstan": "^2.1",
- "phpstan/phpstan-phpunit": "^2.0",
+ "phpstan/extension-installer": "^1.1",
+ "phpstan/phpstan": "^1.8",
+ "phpstan/phpstan-phpunit": "^1.1",
"phpunit/phpunit": "^9.5",
- "psalm/phar": "^4"
+ "rector/rector": "^0.13.9",
+ "vimeo/psalm": "^4.25"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-1.x": "1.x-dev",
- "dev-2.x": "2.x-dev"
+ "dev-1.x": "1.x-dev"
}
},
"autoload": {
@@ -5486,9 +5517,9 @@
"description": "A PSR-5 based resolver of Class names, Types and Structural Element Names",
"support": {
"issues": "https://github.com/phpDocumentor/TypeResolver/issues",
- "source": "https://github.com/phpDocumentor/TypeResolver/tree/2.0.0"
+ "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.12.0"
},
- "time": "2026-01-06T21:53:42+00:00"
+ "time": "2025-11-21T15:09:14+00:00"
},
{
"name": "phpstan/extension-installer",
@@ -5986,16 +6017,16 @@
},
{
"name": "phpunit/phpunit",
- "version": "12.5.8",
+ "version": "12.5.12",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/phpunit.git",
- "reference": "37ddb96c14bfee10304825edbb7e66d341ec6889"
+ "reference": "418e06b3b46b0d54bad749ff4907fc7dfb530199"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/37ddb96c14bfee10304825edbb7e66d341ec6889",
- "reference": "37ddb96c14bfee10304825edbb7e66d341ec6889",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/418e06b3b46b0d54bad749ff4907fc7dfb530199",
+ "reference": "418e06b3b46b0d54bad749ff4907fc7dfb530199",
"shasum": ""
},
"require": {
@@ -6009,8 +6040,8 @@
"phar-io/manifest": "^2.0.4",
"phar-io/version": "^3.2.1",
"php": ">=8.3",
- "phpunit/php-code-coverage": "^12.5.2",
- "phpunit/php-file-iterator": "^6.0.0",
+ "phpunit/php-code-coverage": "^12.5.3",
+ "phpunit/php-file-iterator": "^6.0.1",
"phpunit/php-invoker": "^6.0.0",
"phpunit/php-text-template": "^5.0.0",
"phpunit/php-timer": "^8.0.0",
@@ -6021,6 +6052,7 @@
"sebastian/exporter": "^7.0.2",
"sebastian/global-state": "^8.0.2",
"sebastian/object-enumerator": "^7.0.0",
+ "sebastian/recursion-context": "^7.0.1",
"sebastian/type": "^6.0.3",
"sebastian/version": "^6.0.0",
"staabm/side-effects-detector": "^1.0.5"
@@ -6063,7 +6095,7 @@
"support": {
"issues": "https://github.com/sebastianbergmann/phpunit/issues",
"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.12"
},
"funding": [
{
@@ -6087,20 +6119,20 @@
"type": "tidelift"
}
],
- "time": "2026-01-27T06:12:29+00:00"
+ "time": "2026-02-16T08:34:36+00:00"
},
{
"name": "rector/rector",
- "version": "2.3.6",
+ "version": "2.3.7",
"source": {
"type": "git",
"url": "https://github.com/rectorphp/rector.git",
- "reference": "ca9ebb81d280cd362ea39474dabd42679e32ca6b"
+ "reference": "9c46ad17f57963932c9788fd1b0f1d07ff450370"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/rectorphp/rector/zipball/ca9ebb81d280cd362ea39474dabd42679e32ca6b",
- "reference": "ca9ebb81d280cd362ea39474dabd42679e32ca6b",
+ "url": "https://api.github.com/repos/rectorphp/rector/zipball/9c46ad17f57963932c9788fd1b0f1d07ff450370",
+ "reference": "9c46ad17f57963932c9788fd1b0f1d07ff450370",
"shasum": ""
},
"require": {
@@ -6139,7 +6171,7 @@
],
"support": {
"issues": "https://github.com/rectorphp/rector/issues",
- "source": "https://github.com/rectorphp/rector/tree/2.3.6"
+ "source": "https://github.com/rectorphp/rector/tree/2.3.7"
},
"funding": [
{
@@ -6147,7 +6179,7 @@
"type": "github"
}
],
- "time": "2026-02-06T14:25:06+00:00"
+ "time": "2026-02-19T14:44:16+00:00"
},
{
"name": "sebastian/cli-parser",
@@ -7100,23 +7132,23 @@
},
{
"name": "ta-tikoma/phpunit-architecture-test",
- "version": "0.8.6",
+ "version": "0.8.7",
"source": {
"type": "git",
"url": "https://github.com/ta-tikoma/phpunit-architecture-test.git",
- "reference": "ad48430b92901fd7d003fdaf2d7b139f96c0906e"
+ "reference": "1248f3f506ca9641d4f68cebcd538fa489754db8"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/ta-tikoma/phpunit-architecture-test/zipball/ad48430b92901fd7d003fdaf2d7b139f96c0906e",
- "reference": "ad48430b92901fd7d003fdaf2d7b139f96c0906e",
+ "url": "https://api.github.com/repos/ta-tikoma/phpunit-architecture-test/zipball/1248f3f506ca9641d4f68cebcd538fa489754db8",
+ "reference": "1248f3f506ca9641d4f68cebcd538fa489754db8",
"shasum": ""
},
"require": {
"nikic/php-parser": "^4.18.0 || ^5.0.0",
"php": "^8.1.0",
"phpdocumentor/reflection-docblock": "^5.3.0 || ^6.0.0",
- "phpunit/phpunit": "^10.5.5 || ^11.0.0 || ^12.0.0",
+ "phpunit/phpunit": "^10.5.5 || ^11.0.0 || ^12.0.0 || ^13.0.0",
"symfony/finder": "^6.4.0 || ^7.0.0 || ^8.0.0"
},
"require-dev": {
@@ -7153,9 +7185,9 @@
],
"support": {
"issues": "https://github.com/ta-tikoma/phpunit-architecture-test/issues",
- "source": "https://github.com/ta-tikoma/phpunit-architecture-test/tree/0.8.6"
+ "source": "https://github.com/ta-tikoma/phpunit-architecture-test/tree/0.8.7"
},
- "time": "2026-01-30T07:16:00+00:00"
+ "time": "2026-02-17T17:25:14+00:00"
},
{
"name": "theseer/tokenizer",
@@ -7329,16 +7361,16 @@
},
{
"name": "webmozart/assert",
- "version": "2.1.2",
+ "version": "2.1.5",
"source": {
"type": "git",
"url": "https://github.com/webmozarts/assert.git",
- "reference": "ce6a2f100c404b2d32a1dd1270f9b59ad4f57649"
+ "reference": "79155f94852fa27e2f73b459f6503f5e87e2c188"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/webmozarts/assert/zipball/ce6a2f100c404b2d32a1dd1270f9b59ad4f57649",
- "reference": "ce6a2f100c404b2d32a1dd1270f9b59ad4f57649",
+ "url": "https://api.github.com/repos/webmozarts/assert/zipball/79155f94852fa27e2f73b459f6503f5e87e2c188",
+ "reference": "79155f94852fa27e2f73b459f6503f5e87e2c188",
"shasum": ""
},
"require": {
@@ -7385,9 +7417,9 @@
],
"support": {
"issues": "https://github.com/webmozarts/assert/issues",
- "source": "https://github.com/webmozarts/assert/tree/2.1.2"
+ "source": "https://github.com/webmozarts/assert/tree/2.1.5"
},
- "time": "2026-01-13T14:02:24+00:00"
+ "time": "2026-02-18T14:09:36+00:00"
}
],
"aliases": [],
diff --git a/phpstan-baseline.neon b/phpstan-baseline.neon
new file mode 100644
index 0000000..5ec6bed
--- /dev/null
+++ b/phpstan-baseline.neon
@@ -0,0 +1,55 @@
+parameters:
+ ignoreErrors:
+ -
+ message: '#^Call to function is_string\(\) with ''friday''\|''monday''\|''saturday''\|''sunday''\|''thursday''\|''tuesday''\|''wednesday'' will always evaluate to true\.$#'
+ identifier: function.alreadyNarrowedType
+ count: 1
+ path: src/Objects/Calendar/DayOfWeek.php
+
+ -
+ message: '#^Call to function is_string\(\) with ''april''\|''august''\|''december''\|''february''\|''january''\|''july''\|''june''\|''march''\|''may''\|''november''\|''october''\|''september'' will always evaluate to true\.$#'
+ identifier: function.alreadyNarrowedType
+ count: 1
+ path: src/Objects/Calendar/Month.php
+
+ -
+ message: '#^Call to function is_string\(\) with ''afghanistan''\|''albania''\|''algeria''\|''andorra''\|''angola''\|''antigua_and_barbuda''\|''argentina''\|''armenia''\|''australia''\|''austria''\|''azerbaijan''\|''bahamas''\|''bahrain''\|''bangladesh''\|''barbados''\|''belarus''\|''belgium''\|''belize''\|''benin''\|''bhutan''\|''bolivia''\|''bosnia_and…''\|''botswana''\|''brazil''\|''brunei''\|''bulgaria''\|''burkina_faso''\|''burundi''\|''cabo_verde''\|''cambodia''\|''cameroon''\|''canada''\|''central_african…''\|''chad''\|''chile''\|''china''\|''colombia''\|''comoros''\|''congo''\|''costa_rica''\|''croatia''\|''cuba''\|''cyprus''\|''czechia''\|''democratic_republic…''\|''denmark''\|''djibouti''\|''dominica''\|''dominican_republic''\|''ecuador''\|''egypt''\|''el_salvador''\|''equatorial_guinea''\|''eritrea''\|''estonia''\|''eswatini''\|''ethiopia''\|''fiji''\|''finland''\|''france''\|''gabon''\|''gambia''\|''georgia''\|''germany''\|''ghana''\|''greece''\|''grenada''\|''guatemala''\|''guinea''\|''guinea_bissau''\|''guyana''\|''haiti''\|''honduras''\|''hungary''\|''iceland''\|''india''\|''indonesia''\|''iran''\|''iraq''\|''ireland''\|''israel''\|''italy''\|''jamaica''\|''japan''\|''jordan''\|''kazakhstan''\|''kenya''\|''kiribati''\|''kosovo''\|''kuwait''\|''kyrgyzstan''\|''laos''\|''latvia''\|''lebanon''\|''lesotho''\|''liberia''\|''libya''\|''liechtenstein''\|''lithuania''\|''luxembourg''\|''madagascar''\|''malawi''\|''malaysia''\|''maldives''\|''mali''\|''malta''\|''marshall_islands''\|''mauritania''\|''mauritius''\|''mexico''\|''micronesia''\|''moldova''\|''monaco''\|''mongolia''\|''montenegro''\|''morocco''\|''mozambique''\|''myanmar''\|''namibia''\|''nauru''\|''nepal''\|''netherlands''\|''new_zealand''\|''nicaragua''\|''niger''\|''nigeria''\|''north_korea''\|''north_macedonia''\|''norway''\|''oman''\|''pakistan''\|''palau''\|''palestine''\|''panama''\|''papua_new_guinea''\|''paraguay''\|''peru''\|''philippines''\|''poland''\|''portugal''\|''qatar''\|''romania''\|''russia''\|''rwanda''\|''saint_kitts_and…''\|''saint_lucia''\|''saint_vincent_and…''\|''samoa''\|''san_marino''\|''sao_tome_and…''\|''saudi_arabia''\|''senegal''\|''serbia''\|''seychelles''\|''sierra_leone''\|''singapore''\|''slovakia''\|''slovenia''\|''solomon_islands''\|''somalia''\|''south_africa''\|''south_korea''\|''south_sudan''\|''spain''\|''sri_lanka''\|''sudan''\|''suriname''\|''sweden''\|''switzerland''\|''syria''\|''taiwan''\|''tajikistan''\|''tanzania''\|''thailand''\|''timor_leste''\|''togo''\|''tonga''\|''trinidad_and_tobago''\|''tunisia''\|''turkey''\|''turkmenistan''\|''tuvalu''\|''uganda''\|''ukraine''\|''united_arab_emirates''\|''united_kingdom''\|''united_states''\|''uruguay''\|''uzbekistan''\|''vanuatu''\|''vatican_city''\|''venezuela''\|''vietnam''\|''yemen''\|''zambia''\|''zimbabwe'' will always evaluate to true\.$#'
+ identifier: function.alreadyNarrowedType
+ count: 1
+ path: src/Objects/Geography/Country.php
+
+ -
+ message: '#^Call to function is_string\(\) with ''alberta''\|''british_columbia''\|''manitoba''\|''new_brunswick''\|''newfoundland_and…''\|''northwest…''\|''nova_scotia''\|''nunavut''\|''ontario''\|''prince_edward_island''\|''quebec''\|''saskatchewan''\|''yukon'' will always evaluate to true\.$#'
+ identifier: function.alreadyNarrowedType
+ count: 1
+ path: src/Objects/Geography/Country/Canada.php
+
+ -
+ message: '#^Call to function is_string\(\) with ''alabama''\|''alaska''\|''arizona''\|''arkansas''\|''california''\|''colorado''\|''connecticut''\|''delaware''\|''florida''\|''georgia''\|''hawaii''\|''idaho''\|''illinois''\|''indiana''\|''iowa''\|''kansas''\|''kentucky''\|''louisiana''\|''maine''\|''maryland''\|''massachusetts''\|''michigan''\|''minnesota''\|''mississippi''\|''missouri''\|''montana''\|''nebraska''\|''nevada''\|''new_hampshire''\|''new_jersey''\|''new_mexico''\|''new_york''\|''north_carolina''\|''north_dakota''\|''ohio''\|''oklahoma''\|''oregon''\|''pennsylvania''\|''rhode_island''\|''south_carolina''\|''south_dakota''\|''tennessee''\|''texas''\|''utah''\|''vermont''\|''virginia''\|''washington''\|''west_virginia''\|''wisconsin''\|''wyoming'' will always evaluate to true\.$#'
+ identifier: function.alreadyNarrowedType
+ count: 1
+ path: src/Objects/Geography/Country/UnitedStates.php
+
+ -
+ message: '#^Call to function is_string\(\) with ''afghan_afghani''\|''albanian_lek''\|''angolan_kwanza''\|''argentine_peso''\|''armenian_dram''\|''australian_dollar''\|''azerbaijani_manat''\|''bahamian_dollar''\|''bahraini_dinar''\|''bangladeshi_taka''\|''barbadian_dollar''\|''belarusian_ruble''\|''belize_dollar''\|''beninese_franc''\|''bermudian_dollar''\|''bolivian_boliviano''\|''bosnian_convertible…''\|''botswana_pula''\|''brazilian_real''\|''british_pound…''\|''brunei_dollar''\|''bulgarian_lev''\|''burkinabe_franc''\|''burundian_franc''\|''cambodian_riel''\|''canadian_dollar''\|''cape_verdean_escudo''\|''cayman_islands…''\|''central_african_cfa…''\|''cfp_franc''\|''chadian_franc''\|''chilean_peso''\|''chinese_yuan''\|''colombian_peso''\|''comorian_franc''\|''congolese_franc''\|''costa_rican_colon''\|''croatian_kuna''\|''cuban_peso''\|''czech_koruna''\|''danish_krone''\|''djiboutian_franc''\|''dominican_peso''\|''east_caribbean…''\|''ecuadorian_sucre''\|''egyptian_pound''\|''equatorial_guinean…''\|''eritrean_nakfa''\|''estonian_kroon''\|''ethiopian_birr''\|''euro''\|''fijian_dollar''\|''gabonese_franc''\|''gambian_dalasi''\|''georgian_lari''\|''ghanaian_cedi''\|''guatemalan_quetzal''\|''guinean_franc''\|''guyanese_dollar''\|''haitian_gourde''\|''honduran_lempira''\|''hong_kong_dollar''\|''hungarian_forint''\|''icelandic_krona''\|''indian_rupee''\|''indonesian_rupiah''\|''iranian_rial''\|''iraqi_dinar''\|''israeli_new_shekel''\|''ivorian_franc''\|''jamaican_dollar''\|''japanese_yen''\|''jordanian_dinar''\|''kazakhstani_tenge''\|''kenyan_shilling''\|''kuwaiti_dinar''\|''kyrgyzstani_som''\|''laotian_kip''\|''latvian_lats''\|''lebanese_pound''\|''lesotho_loti''\|''liberian_dollar''\|''libyan_dinar''\|''lithuanian_litas''\|''macanese_pataca''\|''macedonian_denar''\|''malagasy_ariary''\|''malawian_kwacha''\|''malaysian_ringgit''\|''maldivian_rufiyaa''\|''malian_franc''\|''mauritanian_ouguiya''\|''mauritian_rupee''\|''mexican_peso''\|''moldovan_leu''\|''mongolian_tugrik''\|''moroccan_dirham''\|''mozambican_metical''\|''myanmar_kyat''\|''namibian_dollar''\|''nepalese_rupee''\|''new_zealand_dollar''\|''nicaraguan_cordoba''\|''nigerian_franc''\|''nigerian_naira''\|''north_korean_won''\|''norwegian_krone''\|''omani_rial''\|''pakistani_rupee''\|''panamanian_balboa''\|''papua_new_guinean…''\|''paraguayan_guarani''\|''peruvian_sol''\|''philippine_peso''\|''polish_zloty''\|''qatari_riyal''\|''romanian_leu''\|''russian_ruble''\|''rwandan_franc''\|''salvadoran_colon''\|''sao_tomean_dobra''\|''saudi_riyal''\|''senegalese_franc''\|''serbian_dinar''\|''seychellois_rupee''\|''sierra_leonean_leone''\|''singapore_dollar''\|''solomon_islands…''\|''somali_shilling''\|''south_african_rand''\|''south_korean_won''\|''sri_lankan_rupee''\|''sudanese_pound''\|''surinamese_dollar''\|''swazi_lilangeni''\|''swedish_krona''\|''swiss_franc''\|''syrian_pound''\|''tajikistani_somoni''\|''tanzanian_shilling''\|''thai_baht''\|''togolese_franc''\|''tongan_paanga''\|''trinidad_and_tobago…''\|''tunisian_dinar''\|''turkish_lira''\|''turkmenistani_manat''\|''ugandan_shilling''\|''ukrainian_hryvnia''\|''united_arab…''\|''united_states_dollar''\|''uruguayan_peso''\|''uzbekistani_som''\|''vanuatu_vatu''\|''venezuelan_bolivar''\|''vietnamese_dong''\|''west_african_cfa…''\|''yemeni_rial''\|''zambian_kwacha''\|''zimbabwean_dollar'' will always evaluate to true\.$#'
+ identifier: function.alreadyNarrowedType
+ count: 1
+ path: src/Objects/Geography/Currency.php
+
+ -
+ message: '#^Call to function is_string\(\) with ''province''\|''region''\|''state'' will always evaluate to true\.$#'
+ identifier: function.alreadyNarrowedType
+ count: 1
+ path: src/Objects/Geography/DivisionType.php
+
+ -
+ message: '#^Call to function is_string\(\) with ''no''\|''yes'' will always evaluate to true\.$#'
+ identifier: function.alreadyNarrowedType
+ count: 1
+ path: src/Objects/Support/Enums/YesNo.php
+
+ -
+ message: '#^Call to function is_string\(\) with string will always evaluate to true\.$#'
+ identifier: function.alreadyNarrowedType
+ count: 1
+ path: src/Objects/Support/Types/Str.php
diff --git a/phpstan.neon b/phpstan.neon
index c8da40c..45ea14f 100644
--- a/phpstan.neon
+++ b/phpstan.neon
@@ -1,3 +1,6 @@
+includes:
+ - phpstan-baseline.neon
+
parameters:
level: 8
paths:
diff --git a/rector.php b/rector.php
index 8db2a49..09c7ced 100644
--- a/rector.php
+++ b/rector.php
@@ -3,7 +3,6 @@
declare(strict_types=1);
use EncoreDigitalGroup\StdLib\Support\Internal\Rector\Rector;
-use Rector\Config\RectorConfig;
use Rector\TypeDeclaration\Rector\ClassMethod\AddMethodCallBasedStrictParamTypeRector;
use Rector\TypeDeclaration\Rector\ClassMethod\ParamTypeByMethodCallTypeRector;
use Rector\TypeDeclaration\Rector\ClassMethod\ParamTypeByParentCallTypeRector;
@@ -21,9 +20,8 @@ function skipTypeHintsForMagicMethods(): array
]);
}
-return RectorConfig::configure()
+return Rector::configure()
->withPaths([
__DIR__ . "/src",
])
- ->withRules(Rector::rules())
- ->withSkip(skipTypeHintsForMagicMethods());
+ ->withSkip(skipTypeHintsForMagicMethods());
\ No newline at end of file
diff --git a/src/Objects/Filesystem/Directory.php b/src/Objects/Filesystem/Directory.php
index 04bf488..55385eb 100644
--- a/src/Objects/Filesystem/Directory.php
+++ b/src/Objects/Filesystem/Directory.php
@@ -25,9 +25,7 @@ public static function current(): string
return $cwd;
}
- /**
- * Get the MD5 hash of a directory
- */
+ /** Get the MD5 hash of a directory */
public static function hash(string $dir): string
{
if (!is_dir($dir)) {
@@ -51,9 +49,7 @@ public static function hash(string $dir): string
}
- /**
- * @codeCoverageIgnore
- */
+ /** @codeCoverageIgnore */
public static function scan(string $dir, array &$results = []): array
{
$files = scandir($dir);
diff --git a/src/Objects/Serializers/JsonSerializer.php b/src/Objects/Serializers/JsonSerializer.php
index 6df8300..16dd1e5 100644
--- a/src/Objects/Serializers/JsonSerializer.php
+++ b/src/Objects/Serializers/JsonSerializer.php
@@ -49,9 +49,7 @@ protected static function encoders(): array
return [(new JsonEncoder)];
}
- /**
- * @param class-string|object $classOrObject
- */
+ /** @param class-string|object $classOrObject */
private static function hasMapNameAttributes(string|object $classOrObject): bool
{
$reflection = new ReflectionClass($classOrObject);
@@ -95,9 +93,7 @@ private static function serializeWithMapName(object $object): string
return $json;
}
- /**
- * @param class-string $class
- */
+ /** @param class-string $class */
private static function deserializeWithMapName(string $class, string $jsonData): mixed
{
$data = json_decode($jsonData, true);
diff --git a/src/Objects/Support/Assert.php b/src/Objects/Support/Assert.php
index 5a2aa57..fc3c041 100644
--- a/src/Objects/Support/Assert.php
+++ b/src/Objects/Support/Assert.php
@@ -6,9 +6,7 @@
class Assert
{
- /**
- * @phpstan-assert true $value
- */
+ /** @phpstan-assert true $value */
public static function true(mixed $value): void
{
if (!is_bool($value)) {
@@ -20,9 +18,7 @@ public static function true(mixed $value): void
}
}
- /**
- * @phpstan-assert false $value
- */
+ /** @phpstan-assert false $value */
public static function false(mixed $value): void
{
if (!is_bool($value)) {
@@ -34,9 +30,7 @@ public static function false(mixed $value): void
}
}
- /**
- * @phpstan-assert !null $value
- */
+ /** @phpstan-assert !null $value */
public static function notNull(mixed $value): void
{
if (is_null($value)) {
@@ -44,9 +38,7 @@ public static function notNull(mixed $value): void
}
}
- /**
- * @phpstan-assert string $value
- */
+ /** @phpstan-assert string $value */
public static function string(mixed $value): void
{
if (!is_string($value)) {
diff --git a/src/Objects/Support/Traits/Assertable.php b/src/Objects/Support/Traits/Assertable.php
index d6aa099..8110169 100644
--- a/src/Objects/Support/Traits/Assertable.php
+++ b/src/Objects/Support/Traits/Assertable.php
@@ -6,25 +6,19 @@
trait Assertable
{
- /**
- * @phpstan-assert true $value
- */
+ /** @phpstan-assert true $value */
protected function assertTrue(mixed $value): void
{
Assert::true($value);
}
- /**
- * @phpstan-assert false $value
- */
+ /** @phpstan-assert false $value */
protected function assertFalse(mixed $value): void
{
Assert::false($value);
}
- /**
- * @phpstan-assert !null $value
- */
+ /** @phpstan-assert !null $value */
protected function assertNotNull(mixed $value): void
{
Assert::notNull($value);
diff --git a/src/Objects/Support/Traits/HasEnumValue.php b/src/Objects/Support/Traits/HasEnumValue.php
index 8bed9fc..c64c3cd 100644
--- a/src/Objects/Support/Traits/HasEnumValue.php
+++ b/src/Objects/Support/Traits/HasEnumValue.php
@@ -26,9 +26,8 @@ public static function values(): array
static::enforceEnum();
$cases = [];
- /** @var BackedEnum $case */
- foreach (static::cases() as $case) {
- $cases[] = $case->value;
+ foreach (static::cases() as $backedEnum) {
+ $cases[] = $backedEnum->value;
}
return $cases;
@@ -39,10 +38,9 @@ public static function titleCasedValues(): array
static::enforceEnum();
$cases = [];
- /** @var BackedEnum $case */
- foreach (static::cases() as $case) {
- if (is_string($case->value)) {
- $cases[$case->value] = Str::formattedTitleCase($case->value);
+ foreach (static::cases() as $backedEnum) {
+ if (is_string($backedEnum->value)) {
+ $cases[$backedEnum->value] = Str::formattedTitleCase($backedEnum->value);
}
}
@@ -53,9 +51,9 @@ public static function from(int|string $value): ?static
{
static::enforceEnum();
- foreach (static::cases() as $case) {
- if ($case->value === $value) {
- return $case;
+ foreach (static::cases() as $backedEnum) {
+ if ($backedEnum->value === $value) {
+ return $backedEnum;
}
}
@@ -74,8 +72,8 @@ public static function options(array $include = [], array $exclude = []): array
$options = [];
- foreach (self::cases() as $case) {
- $options[$case->value] = self::name($case);
+ foreach (self::cases() as $backedEnum) {
+ $options[$backedEnum->value] = self::name($backedEnum);
}
return $options;
@@ -107,9 +105,9 @@ private static function optionsIncluding(array $include): array
{
$options = [];
- foreach (self::cases() as $case) {
- if (in_array($case, $include)) {
- $options[$case->value] = self::name($case);
+ foreach (self::cases() as $backedEnum) {
+ if (in_array($backedEnum, $include)) {
+ $options[$backedEnum->value] = self::name($backedEnum);
}
}
@@ -120,9 +118,9 @@ private static function optionsExcluding(array $exclude): array
{
$options = [];
- foreach (self::cases() as $case) {
- if (!in_array($case, $exclude)) {
- $options[$case->value] = self::name($case);
+ foreach (self::cases() as $backedEnum) {
+ if (!in_array($backedEnum, $exclude)) {
+ $options[$backedEnum->value] = self::name($backedEnum);
}
}
diff --git a/src/Objects/Support/Traits/Macroable.php b/src/Objects/Support/Traits/Macroable.php
index 36754fd..c233da9 100644
--- a/src/Objects/Support/Traits/Macroable.php
+++ b/src/Objects/Support/Traits/Macroable.php
@@ -66,9 +66,7 @@ protected static function deferToLaravel(string $method, array $parameters, bool
throw new BadMethodCallException(sprintf("Method %s::%s does not exist.", static::class, $method));
}
- /**
- * Defer instance method call to the parent class's __call for Eloquent models.
- */
+ /** Defer instance method call to the parent class's __call for Eloquent models. */
protected function deferToEloquentInstance(string $method, array $parameters): mixed
{
if (static::canDeferToLaravel()) {
diff --git a/src/Support/Internal/Rector/Rector.php b/src/Support/Internal/Rector/Rector.php
index 6310c77..0af4f74 100644
--- a/src/Support/Internal/Rector/Rector.php
+++ b/src/Support/Internal/Rector/Rector.php
@@ -2,6 +2,8 @@
namespace EncoreDigitalGroup\StdLib\Support\Internal\Rector;
+use EncoreDigitalGroup\StdLib\Support\Internal\Rector\Rules\ApplySingleItemDocBlockStyleRector;
+use EncoreDigitalGroup\StdLib\Support\Internal\Rector\Rules\ExpandSeeAnnotationClassNameRector;
use EncoreDigitalGroup\StdLib\Support\Internal\Rector\Rules\ReplaceSingleQuotesWithDoubleRector;
use Rector\CodeQuality\Rector\Assign\CombinedAssignRector;
use Rector\CodeQuality\Rector\BooleanAnd\RemoveUselessIsObjectCheckRector;
@@ -10,6 +12,7 @@
use Rector\CodeQuality\Rector\BooleanNot\SimplifyDeMorganBinaryRector;
use Rector\CodeQuality\Rector\Catch_\ThrowWithPreviousExceptionRector;
use Rector\CodeQuality\Rector\Class_\CompleteDynamicPropertiesRector;
+use Rector\CodeQuality\Rector\Class_\ConvertStaticToSelfRector;
use Rector\CodeQuality\Rector\Class_\InlineConstructorDefaultToPropertyRector;
use Rector\CodeQuality\Rector\ClassMethod\ExplicitReturnNullRector;
use Rector\CodeQuality\Rector\ClassMethod\InlineArrayReturnAssignRector;
@@ -89,10 +92,11 @@
use Rector\CodingStyle\Rector\Property\SplitGroupedPropertiesRector;
use Rector\CodingStyle\Rector\Stmt\NewlineAfterStatementRector;
use Rector\CodingStyle\Rector\Stmt\RemoveUselessAliasInUseStatementRector;
-use Rector\CodingStyle\Rector\String_\SymplifyQuoteEscapeRector;
use Rector\CodingStyle\Rector\String_\UseClassKeywordForClassNameResolutionRector;
use Rector\CodingStyle\Rector\Ternary\TernaryConditionVariableAssignmentRector;
use Rector\CodingStyle\Rector\Use_\SeparateMultiUseImportsRector;
+use Rector\Config\RectorConfig;
+use Rector\Configuration\RectorConfigBuilder;
use Rector\DeadCode\Rector\Array_\RemoveDuplicatedArrayKeyRector;
use Rector\DeadCode\Rector\Assign\RemoveDoubleAssignRector;
use Rector\DeadCode\Rector\Assign\RemoveUnusedVariableAssignRector;
@@ -157,7 +161,6 @@
use Rector\Privatization\Rector\MethodCall\PrivatizeLocalGetterToPropertyRector;
use Rector\Privatization\Rector\Property\PrivatizeFinalClassPropertyRector;
use Rector\Renaming\Rector\FuncCall\RenameFunctionRector;
-use Rector\Strict\Rector\Empty_\DisallowedEmptyRuleFixerRector;
use Rector\Symfony\CodeQuality\Rector\ClassMethod\ResponseReturnTypeControllerActionRector;
use Rector\Transform\Rector\FuncCall\FuncCallToConstFetchRector;
use Rector\TypeDeclaration\Rector\ArrowFunction\AddArrowFunctionReturnTypeRector;
@@ -211,20 +214,31 @@
use Rector\TypeDeclaration\Rector\While_\WhileNullableToInstanceofRector;
use Rector\Visibility\Rector\ClassMethod\ExplicitPublicClassMethodRector;
-/** @codeCoverageIgnore */
class Rector
{
- public static function rules(array $rules = []): array
+ public static function configure(): RectorConfigBuilder
{
- return array_merge([
+ return RectorConfig::configure()
+ ->withRules(Rector::rules())
+ ->withImportNames()
+ ->withParallel(600);
+ }
+
+ public static function rules(array $rules = [], array $except = []): array
+ {
+ $allRules = array_merge([
AddVoidReturnTypeWhereNoReturnRector::class,
ReplaceSingleQuotesWithDoubleRector::class,
+ ApplySingleItemDocBlockStyleRector::class,
+ SeparateMultiUseImportsRector::class,
+ ExpandSeeAnnotationClassNameRector::class,
CombinedAssignRector::class,
RemoveUselessIsObjectCheckRector::class,
SimplifyEmptyArrayCheckRector::class,
ReplaceMultipleBooleanNotRector::class,
SimplifyDeMorganBinaryRector::class,
ThrowWithPreviousExceptionRector::class,
+ ConvertStaticToSelfRector::class,
ExplicitReturnNullRector::class,
InlineArrayReturnAssignRector::class,
LocallyCalledStaticMethodToNonStaticRector::class,
@@ -299,7 +313,6 @@ public static function rules(array $rules = []): array
NullableCompareToNullRector::class,
SplitGroupedPropertiesRector::class,
RemoveUselessAliasInUseStatementRector::class,
- SymplifyQuoteEscapeRector::class,
UseClassKeywordForClassNameResolutionRector::class,
TernaryConditionVariableAssignmentRector::class,
RemoveDuplicatedArrayKeyRector::class,
@@ -363,7 +376,6 @@ public static function rules(array $rules = []): array
PrivatizeLocalGetterToPropertyRector::class,
PrivatizeFinalClassPropertyRector::class,
RenameFunctionRector::class,
- DisallowedEmptyRuleFixerRector::class,
ResponseReturnTypeControllerActionRector::class,
FuncCallToConstFetchRector::class,
AddArrowFunctionReturnTypeRector::class,
@@ -416,6 +428,10 @@ public static function rules(array $rules = []): array
WhileNullableToInstanceofRector::class,
ExplicitPublicClassMethodRector::class,
], $rules);
+
+ $filteredRules = array_diff($allRules, $except);
+
+ return array_filter($filteredRules, fn (string $class): bool => class_exists($class));
}
public static function skip(array $rules = []): array
@@ -433,4 +449,4 @@ public static function skip(array $rules = []): array
NewlineAfterStatementRector::class,
], $rules);
}
-}
+}
\ No newline at end of file
diff --git a/src/Support/Internal/Rector/Rules/ApplySingleItemDocBlockStyleRector.php b/src/Support/Internal/Rector/Rules/ApplySingleItemDocBlockStyleRector.php
new file mode 100644
index 0000000..3fe3cf2
--- /dev/null
+++ b/src/Support/Internal/Rector/Rules/ApplySingleItemDocBlockStyleRector.php
@@ -0,0 +1,124 @@
+getDocComment();
+
+ if (!$docComment instanceof Doc) {
+ return null;
+ }
+
+ $originalText = $docComment->getText();
+ $collapsedText = $this->collapseDocBlock($originalText);
+
+ if ($collapsedText === null || $collapsedText === $originalText) {
+ return null;
+ }
+
+ // Create new doc comment with collapsed text
+ $node->setDocComment(new Doc($collapsedText));
+
+ return $node;
+ }
+
+ public function getRuleDefinition(): RuleDefinition
+ {
+ return new RuleDefinition("Collapse multi-line docblocks into single line format", [
+ new CodeSample(
+ <<<'CODE_SAMPLE'
+class SomeClass
+{
+ /**
+ * @var string
+ */
+ private string $name;
+
+ /**
+ * @return void
+ */
+ public function someMethod(): void
+ {
+ }
+}
+CODE_SAMPLE
+ ,
+ <<<'CODE_SAMPLE'
+class SomeClass
+{
+ /** @var string */
+ private string $name;
+
+ /** @return void */
+ public function someMethod(): void
+ {
+ }
+}
+CODE_SAMPLE
+ ),
+ ]);
+ }
+
+ private function collapseDocBlock(string $docBlock): ?string
+ {
+ // Remove the opening /** and closing */
+ $lines = explode("\n", $docBlock);
+
+ if (count($lines) <= 1) {
+ return null; // Already single line or invalid
+ }
+
+ $contentLines = [];
+
+ foreach ($lines as $line) {
+ $trimmedLine = trim($line);
+ // Skip opening /** and closing */
+ if ($trimmedLine === "/**") {
+ continue;
+ }
+ if ($trimmedLine === "*/") {
+ continue;
+ }
+
+ // Remove leading * and whitespace
+ $trimmedLine = preg_replace('/^\*\s?/', "", $trimmedLine);
+
+ if ($trimmedLine !== "") {
+ $contentLines[] = $trimmedLine;
+ }
+ }
+
+ // Don't collapse if there are multiple content lines (e.g., description + tags)
+ // or if there are no content lines
+ if (count($contentLines) !== 1) {
+ return null;
+ }
+
+ // Create single-line docblock
+ return "/** " . $contentLines[0] . " */";
+ }
+}
\ No newline at end of file
diff --git a/src/Support/Internal/Rector/Rules/ExpandSeeAnnotationClassNameRector.php b/src/Support/Internal/Rector/Rules/ExpandSeeAnnotationClassNameRector.php
new file mode 100644
index 0000000..694bc4c
--- /dev/null
+++ b/src/Support/Internal/Rector/Rules/ExpandSeeAnnotationClassNameRector.php
@@ -0,0 +1,221 @@
+getDocComment();
+
+ if (!$docComment instanceof Doc) {
+ return null;
+ }
+
+ $originalText = $docComment->getText();
+ $newText = $this->expandSeeAnnotations($originalText, $node);
+
+ if ($newText === $originalText) {
+ return null;
+ }
+
+ $node->setDocComment(new Doc($newText));
+
+ return $node;
+ }
+
+ public function getRuleDefinition(): RuleDefinition
+ {
+ return new RuleDefinition("Expand short class names in @see annotations to fully qualified class names", [
+ new CodeSample(
+ <<<'CODE_SAMPLE'
+use App\Services\UserService;
+
+/**
+ * @see UserService
+ */
+class UserController
+{
+}
+CODE_SAMPLE
+ ,
+ <<<'CODE_SAMPLE'
+use App\Services\UserService;
+
+/**
+ * @see \App\Services\UserService
+ */
+class UserController
+{
+}
+CODE_SAMPLE
+ ),
+ ]);
+ }
+
+ private function expandSeeAnnotations(string $docBlock, Class_ $classNode): string
+ {
+ // Find all @see annotations
+ $pattern = '/@see\s+([^\s\*]+)/';
+
+ $result = preg_replace_callback($pattern, fn (array $matches): string => $this->processSeeMatch($matches, $classNode), $docBlock);
+
+ return is_string($result) ? $result : $docBlock;
+ }
+
+ /** @param array $matches */
+ private function processSeeMatch(array $matches, Class_ $classNode): string
+ {
+ if (!isset($matches[1])) {
+ return $this->getMatchValue($matches);
+ }
+
+ $reference = $matches[1];
+
+ if ($this->shouldSkipReference($reference)) {
+ return $this->getMatchValue($matches);
+ }
+
+ $expandedClassName = $this->resolveClassName($reference, $classNode);
+
+ if ($expandedClassName !== null) {
+ return "@see " . $expandedClassName;
+ }
+
+ return $this->getMatchValue($matches);
+ }
+
+ /** @param array $matches */
+ private function getMatchValue(array $matches): string
+ {
+ return $matches[0];
+ }
+
+ private function shouldSkipReference(string $reference): bool
+ {
+ // Skip if already fully qualified
+ if (str_starts_with($reference, "\\")) {
+ return true;
+ }
+
+ // Skip URLs and method references
+ return str_contains($reference, "://") || str_contains($reference, "()");
+ }
+
+ private function resolveClassName(string $shortName, Class_ $classNode): ?string
+ {
+ $namespaceNode = $this->findParentNamespace($classNode);
+
+ if (!$namespaceNode instanceof Namespace_) {
+ return null;
+ }
+
+ // Look for use statements
+ $resolvedName = $this->findInUseStatements($shortName, $namespaceNode);
+
+ if ($resolvedName !== null) {
+ return $resolvedName;
+ }
+
+ // Check current namespace
+ return $this->checkCurrentNamespace($shortName, $namespaceNode);
+ }
+
+ private function findParentNamespace(Class_ $classNode): ?Namespace_
+ {
+ /** @var Node|null $parent */
+ $parent = $classNode->getAttribute("parent");
+
+ while ($parent !== null) {
+ if ($parent instanceof Namespace_) {
+ return $parent;
+ }
+
+ /** @var Node|null $parent */
+ $parent = $parent->getAttribute("parent");
+ }
+
+ return null;
+ }
+
+ private function findInUseStatements(string $shortName, Namespace_ $namespaceNode): ?string
+ {
+ foreach ($namespaceNode->stmts as $stmt) {
+ if ($stmt instanceof Use_) {
+ $result = $this->checkUseStatement($shortName, $stmt);
+ if ($result !== null) {
+ return $result;
+ }
+ } elseif ($stmt instanceof GroupUse) {
+ $result = $this->checkGroupUseStatement($shortName, $stmt);
+ if ($result !== null) {
+ return $result;
+ }
+ }
+ }
+
+ return null;
+ }
+
+ private function checkUseStatement(string $shortName, Use_ $useStmt): ?string
+ {
+ foreach ($useStmt->uses as $use) {
+ $alias = $use->alias instanceof Identifier ? $use->alias->toString() : $use->name->getLast();
+
+ if ($alias === $shortName) {
+ return "\\" . $use->name->toString();
+ }
+ }
+
+ return null;
+ }
+
+ private function checkGroupUseStatement(string $shortName, GroupUse $groupUse): ?string
+ {
+ $prefix = $groupUse->prefix->toString();
+
+ foreach ($groupUse->uses as $use) {
+ $alias = $use->alias instanceof Identifier ? $use->alias->toString() : $use->name->getLast();
+
+ if ($alias === $shortName) {
+ return "\\" . $prefix . "\\" . $use->name->toString();
+ }
+ }
+
+ return null;
+ }
+
+ private function checkCurrentNamespace(string $shortName, Namespace_ $namespaceNode): ?string
+ {
+ if (!$namespaceNode->name instanceof Name) {
+ return null;
+ }
+
+ $currentNamespace = $namespaceNode->name->toString();
+ $namespacedName = $currentNamespace . "\\" . $shortName;
+
+ if (class_exists($namespacedName) || interface_exists($namespacedName) || trait_exists($namespacedName)) {
+ return "\\" . $namespacedName;
+ }
+
+ return null;
+ }
+}
\ No newline at end of file
diff --git a/src/Support/Internal/Rector/Rules/ReplaceSingleQuotesWithDoubleRector.php b/src/Support/Internal/Rector/Rules/ReplaceSingleQuotesWithDoubleRector.php
index cfb1495..8d8624d 100644
--- a/src/Support/Internal/Rector/Rules/ReplaceSingleQuotesWithDoubleRector.php
+++ b/src/Support/Internal/Rector/Rules/ReplaceSingleQuotesWithDoubleRector.php
@@ -8,11 +8,6 @@
use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample;
use Symplify\RuleDocGenerator\ValueObject\RuleDefinition;
-/**
- * @internal
- *
- * @codeCoverageIgnore
- */
final class ReplaceSingleQuotesWithDoubleRector extends AbstractRector
{
private const EXCLUDED_SYMBOLS = ['$', "'", '\\', "\n", "\r", "\t", "\v", "\e", "\f", "\0", "\x"];
@@ -22,9 +17,7 @@ public function getNodeTypes(): array
return [String_::class];
}
- /**
- * @param String_ $node
- */
+ /** @param String_ $node */
public function refactor(Node $node): ?Node
{
if ($node->getAttribute("kind") === String_::KIND_SINGLE_QUOTED) {