diff --git a/.github/workflows/ci-code.yml b/.github/workflows/ci-code.yml
index 619aaaedc..ce114192b 100644
--- a/.github/workflows/ci-code.yml
+++ b/.github/workflows/ci-code.yml
@@ -27,6 +27,7 @@ jobs:
- run: composer phpunit
- run: composer pest
+ - run: composer inference
code-coverage:
name: Code Coverage
diff --git a/composer.json b/composer.json
index c07cb11b5..2b560439c 100644
--- a/composer.json
+++ b/composer.json
@@ -5,6 +5,8 @@
"type": "library",
"homepage": "http://respect.github.io/",
"license": "MIT",
+ "minimum-stability": "dev",
+ "prefer-stable": true,
"authors": [
{
"name": "Respect/Validation Contributors",
@@ -23,7 +25,7 @@
"php": ">=8.5",
"psr/container": "^2.0",
"respect/config": "^3.0",
- "respect/fluent": "^2.0",
+ "respect/fluent": "^3.0",
"respect/parameter": "^3.0",
"respect/string-formatter": "^1.7",
"respect/stringifier": "^3.0",
@@ -45,7 +47,7 @@
"psr/http-message": "^1.0 || ^2.0",
"ramsey/uuid": "^4",
"respect/coding-standard": "^5.0",
- "respect/fluentgen": "^2.0",
+ "respect/fluentgen": "^2.1",
"sebastian/diff": "^7.0",
"sokil/php-isocodes": "^4.2.1",
"sokil/php-isocodes-db-only": "^4.0",
@@ -87,6 +89,7 @@
"phpcs": "vendor/bin/phpcs",
"phpstan": "vendor/bin/phpstan analyze",
"phpunit": "vendor/bin/phpunit --testsuite=unit",
+ "inference": "vendor/bin/phpunit --testsuite=inference",
"smoke-complete": "bin/console smoke-tests:check-complete",
"spdx-lint": "bin/console lint:spdx",
"qa": [
@@ -95,6 +98,7 @@
"@phpstan",
"@phpunit",
"@pest",
+ "@inference",
"@docs",
"@smoke-complete"
]
diff --git a/composer.lock b/composer.lock
index fdd98da9d..ca7e5875c 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
- "content-hash": "683a4f0e3e7054eddcef31faf9cc9b1c",
+ "content-hash": "d57824f9167d942373052be175b0c72f",
"packages": [
{
"name": "psr/container",
@@ -122,16 +122,16 @@
},
{
"name": "respect/fluent",
- "version": "2.0.1",
+ "version": "3.0.0",
"source": {
"type": "git",
"url": "https://github.com/Respect/Fluent.git",
- "reference": "f32c76e37a82a9e63d6fe700a27201534f72da60"
+ "reference": "a77c71d05c59f082459c29503c0190e6e26c68f9"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/Respect/Fluent/zipball/f32c76e37a82a9e63d6fe700a27201534f72da60",
- "reference": "f32c76e37a82a9e63d6fe700a27201534f72da60",
+ "url": "https://api.github.com/repos/Respect/Fluent/zipball/a77c71d05c59f082459c29503c0190e6e26c68f9",
+ "reference": "a77c71d05c59f082459c29503c0190e6e26c68f9",
"shasum": ""
},
"require": {
@@ -142,7 +142,7 @@
"phpstan/phpstan-deprecation-rules": "^2.0",
"phpstan/phpstan-phpunit": "^2.0",
"phpstan/phpstan-strict-rules": "^2.0",
- "phpunit/phpunit": "^12.5",
+ "phpunit/phpunit": "^12.5 || ^13.0",
"respect/coding-standard": "^5.0"
},
"type": "library",
@@ -169,9 +169,9 @@
],
"support": {
"issues": "https://github.com/Respect/Fluent/issues",
- "source": "https://github.com/Respect/Fluent/tree/2.0.1"
+ "source": "https://github.com/Respect/Fluent/tree/3.0.0"
},
- "time": "2026-03-26T04:24:51+00:00"
+ "time": "2026-09-05T17:11:56+00:00"
},
{
"name": "respect/parameter",
@@ -1535,16 +1535,16 @@
},
{
"name": "giggsey/libphonenumber-for-php-lite",
- "version": "9.0.37",
+ "version": "9.0.38",
"source": {
"type": "git",
"url": "https://github.com/giggsey/libphonenumber-for-php-lite.git",
- "reference": "8e2514898587995033a4425683e32674f2073e1d"
+ "reference": "a165edb4765b39abc4f4af3bde9ed3b5f9690384"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/giggsey/libphonenumber-for-php-lite/zipball/8e2514898587995033a4425683e32674f2073e1d",
- "reference": "8e2514898587995033a4425683e32674f2073e1d",
+ "url": "https://api.github.com/repos/giggsey/libphonenumber-for-php-lite/zipball/a165edb4765b39abc4f4af3bde9ed3b5f9690384",
+ "reference": "a165edb4765b39abc4f4af3bde9ed3b5f9690384",
"shasum": ""
},
"require": {
@@ -1609,7 +1609,7 @@
"issues": "https://github.com/giggsey/libphonenumber-for-php-lite/issues",
"source": "https://github.com/giggsey/libphonenumber-for-php-lite"
},
- "time": "2026-08-15T20:02:37+00:00"
+ "time": "2026-09-01T10:41:38+00:00"
},
{
"name": "jean85/pretty-package-versions",
@@ -1725,20 +1725,20 @@
},
{
"name": "myclabs/deep-copy",
- "version": "1.13.4",
+ "version": "1.14.0",
"source": {
"type": "git",
"url": "https://github.com/myclabs/DeepCopy.git",
- "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a"
+ "reference": "8680aa248f8e07bc8fb43f56f0f5fc77a0c96aae"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/07d290f0c47959fd5eed98c95ee5602db07e0b6a",
- "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a",
+ "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/8680aa248f8e07bc8fb43f56f0f5fc77a0c96aae",
+ "reference": "8680aa248f8e07bc8fb43f56f0f5fc77a0c96aae",
"shasum": ""
},
"require": {
- "php": "^7.1 || ^8.0"
+ "php": "^8.0"
},
"conflict": {
"doctrine/collections": "<1.6.8",
@@ -1773,15 +1773,15 @@
],
"support": {
"issues": "https://github.com/myclabs/DeepCopy/issues",
- "source": "https://github.com/myclabs/DeepCopy/tree/1.13.4"
+ "source": "https://github.com/myclabs/DeepCopy/tree/1.14.0"
},
"funding": [
{
- "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy",
- "type": "tidelift"
+ "url": "https://github.com/mnapoli",
+ "type": "github"
}
],
- "time": "2025-08-01T08:46:24+00:00"
+ "time": "2026-08-11T10:17:44+00:00"
},
{
"name": "nette/php-generator",
@@ -1859,16 +1859,16 @@
},
{
"name": "nette/utils",
- "version": "v4.1.4",
+ "version": "v4.1.5",
"source": {
"type": "git",
"url": "https://github.com/nette/utils.git",
- "reference": "7da6c396d7ebe142bc857c20479d5e70a5e1aac7"
+ "reference": "b043439dbdf954e6c28b5ea7e34b0100f83165e0"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/nette/utils/zipball/7da6c396d7ebe142bc857c20479d5e70a5e1aac7",
- "reference": "7da6c396d7ebe142bc857c20479d5e70a5e1aac7",
+ "url": "https://api.github.com/repos/nette/utils/zipball/b043439dbdf954e6c28b5ea7e34b0100f83165e0",
+ "reference": "b043439dbdf954e6c28b5ea7e34b0100f83165e0",
"shasum": ""
},
"require": {
@@ -1888,7 +1888,7 @@
},
"suggest": {
"ext-gd": "to use Image",
- "ext-iconv": "to use Strings::webalize(), toAscii(), chr() and reverse()",
+ "ext-iconv": "to use Strings::chr(), ord() and reverse()",
"ext-intl": "to use Strings::webalize(), toAscii(), normalize() and compare()",
"ext-json": "to use Nette\\Utils\\Json",
"ext-mbstring": "to use Strings::lower() etc...",
@@ -1944,9 +1944,9 @@
],
"support": {
"issues": "https://github.com/nette/utils/issues",
- "source": "https://github.com/nette/utils/tree/v4.1.4"
+ "source": "https://github.com/nette/utils/tree/v4.1.5"
},
- "time": "2026-05-11T20:49:54+00:00"
+ "time": "2026-07-17T23:02:45+00:00"
},
{
"name": "nikic/php-parser",
@@ -2007,23 +2007,23 @@
},
{
"name": "nunomaduro/collision",
- "version": "v8.9.4",
+ "version": "v8.9.5",
"source": {
"type": "git",
"url": "https://github.com/nunomaduro/collision.git",
- "reference": "716af8f95a470e9094cfca09ed897b023be191a5"
+ "reference": "fb53eacd509a1d303858e2d20cfebf2d630254ec"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/nunomaduro/collision/zipball/716af8f95a470e9094cfca09ed897b023be191a5",
- "reference": "716af8f95a470e9094cfca09ed897b023be191a5",
+ "url": "https://api.github.com/repos/nunomaduro/collision/zipball/fb53eacd509a1d303858e2d20cfebf2d630254ec",
+ "reference": "fb53eacd509a1d303858e2d20cfebf2d630254ec",
"shasum": ""
},
"require": {
"filp/whoops": "^2.18.4",
"nunomaduro/termwind": "^2.4.0",
"php": "^8.2.0",
- "symfony/console": "^7.4.8 || ^8.0.8"
+ "symfony/console": "^7.4.14 || ^8.1.1"
},
"conflict": {
"laravel/framework": "<11.48.0 || >=14.0.0",
@@ -2031,12 +2031,12 @@
},
"require-dev": {
"brianium/paratest": "^7.8.5",
- "larastan/larastan": "^3.9.6",
- "laravel/framework": "^11.48.0 || ^12.56.0 || ^13.5.0",
- "laravel/pint": "^1.29.1",
- "orchestra/testbench-core": "^9.12.0 || ^10.12.1 || ^11.2.1",
- "pestphp/pest": "^3.8.5 || ^4.4.3 || ^5.0.0",
- "sebastian/environment": "^7.2.1 || ^8.0.4 || ^9.3.0"
+ "larastan/larastan": "^3.10.0",
+ "laravel/framework": "^11.48.0 || ^12.56.0 || ^13.20.0",
+ "laravel/pint": "^1.29.3",
+ "orchestra/testbench-core": "^9.12.0 || ^10.12.1 || ^11.3.5",
+ "pestphp/pest": "^3.8.5 || ^4.7.5 || ^5.0.0",
+ "sebastian/environment": "^7.2.1 || ^8.1.2 || ^9.3.2"
},
"type": "library",
"extra": {
@@ -2099,7 +2099,7 @@
"type": "patreon"
}
],
- "time": "2026-04-21T14:04:20+00:00"
+ "time": "2026-07-15T19:09:14+00:00"
},
{
"name": "nunomaduro/termwind",
@@ -2190,39 +2190,39 @@
},
{
"name": "pestphp/pest",
- "version": "v4.7.5",
+ "version": "v4.7.8",
"source": {
"type": "git",
"url": "https://github.com/pestphp/pest.git",
- "reference": "5dc49a71d63602a9b98fed0f2017c4679ef9f8e0"
+ "reference": "5b2293f67adcf1b2320b33f521b94a692d18f360"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/pestphp/pest/zipball/5dc49a71d63602a9b98fed0f2017c4679ef9f8e0",
- "reference": "5dc49a71d63602a9b98fed0f2017c4679ef9f8e0",
+ "url": "https://api.github.com/repos/pestphp/pest/zipball/5b2293f67adcf1b2320b33f521b94a692d18f360",
+ "reference": "5b2293f67adcf1b2320b33f521b94a692d18f360",
"shasum": ""
},
"require": {
"brianium/paratest": "^7.20.0",
"composer/xdebug-handler": "^3.0.5",
- "nunomaduro/collision": "^8.9.4",
+ "nunomaduro/collision": "^8.9.5",
"nunomaduro/termwind": "^2.4.0",
"pestphp/pest-plugin": "^4.0.0",
"pestphp/pest-plugin-arch": "^4.0.2",
"pestphp/pest-plugin-mutate": "^4.0.1",
"pestphp/pest-plugin-profanity": "^4.2.1",
"php": "^8.3.0",
- "phpunit/phpunit": "^12.5.30",
+ "phpunit/phpunit": "^12.5.33",
"symfony/process": "^7.4.13|^8.1.0"
},
"conflict": {
"filp/whoops": "<2.18.3",
- "phpunit/phpunit": ">12.5.30",
+ "phpunit/phpunit": ">12.5.33",
"sebastian/exporter": "<7.0.0",
"webmozart/assert": "<1.11.0"
},
"require-dev": {
- "mrpunyapal/peststan": "^0.2.11",
+ "mrpunyapal/peststan": "^0.2.12",
"pestphp/pest-dev-tools": "^4.1.0",
"pestphp/pest-plugin-browser": "^4.3.1",
"pestphp/pest-plugin-type-coverage": "^4.0.4",
@@ -2253,7 +2253,6 @@
"Pest\\Plugins\\Verbose",
"Pest\\Plugins\\Version",
"Pest\\Plugins\\Shard",
- "Pest\\Plugins\\Tia",
"Pest\\Plugins\\Parallel"
]
},
@@ -2293,7 +2292,7 @@
],
"support": {
"issues": "https://github.com/pestphp/pest/issues",
- "source": "https://github.com/pestphp/pest/tree/v4.7.5"
+ "source": "https://github.com/pestphp/pest/tree/v4.7.8"
},
"funding": [
{
@@ -2305,7 +2304,7 @@
"type": "github"
}
],
- "time": "2026-07-06T17:06:29+00:00"
+ "time": "2026-08-03T20:49:44+00:00"
},
{
"name": "pestphp/pest-plugin",
@@ -3073,16 +3072,16 @@
},
{
"name": "phpstan/phpdoc-parser",
- "version": "2.3.3",
+ "version": "2.3.5",
"source": {
"type": "git",
"url": "https://github.com/phpstan/phpdoc-parser.git",
- "reference": "fb19eedd2bb67ff8cf7a5502ad329e701d6398a3"
+ "reference": "148cefffaf0233e4c08cc13db8a195a56dd6dfe9"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/fb19eedd2bb67ff8cf7a5502ad329e701d6398a3",
- "reference": "fb19eedd2bb67ff8cf7a5502ad329e701d6398a3",
+ "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/148cefffaf0233e4c08cc13db8a195a56dd6dfe9",
+ "reference": "148cefffaf0233e4c08cc13db8a195a56dd6dfe9",
"shasum": ""
},
"require": {
@@ -3114,17 +3113,17 @@
"description": "PHPDoc parser with support for nullable, intersection and generic types",
"support": {
"issues": "https://github.com/phpstan/phpdoc-parser/issues",
- "source": "https://github.com/phpstan/phpdoc-parser/tree/2.3.3"
+ "source": "https://github.com/phpstan/phpdoc-parser/tree/2.3.5"
},
- "time": "2026-07-08T07:01:06+00:00"
+ "time": "2026-08-31T16:05:28+00:00"
},
{
"name": "phpstan/phpstan",
- "version": "2.2.10",
+ "version": "2.2.13",
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpstan/phpstan/zipball/36d1509c998b0602811824143526b4a9ee2774e7",
- "reference": "36d1509c998b0602811824143526b4a9ee2774e7",
+ "url": "https://api.github.com/repos/phpstan/phpstan/zipball/9ba9ac76ee9c5cf5b56d58eb5deec6315b7a0260",
+ "reference": "9ba9ac76ee9c5cf5b56d58eb5deec6315b7a0260",
"shasum": ""
},
"require": {
@@ -3180,7 +3179,7 @@
"type": "github"
}
],
- "time": "2026-08-30T12:46:16+00:00"
+ "time": "2026-09-03T20:38:19+00:00"
},
{
"name": "phpstan/phpstan-deprecation-rules",
@@ -3381,23 +3380,23 @@
},
{
"name": "phpunit/php-file-iterator",
- "version": "6.0.1",
+ "version": "6.0.2",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/php-file-iterator.git",
- "reference": "3d1cd096ef6bea4bf2762ba586e35dbd317cbfd5"
+ "reference": "a248d1640ab059b075f53a2ef0f9856e864e06b5"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/3d1cd096ef6bea4bf2762ba586e35dbd317cbfd5",
- "reference": "3d1cd096ef6bea4bf2762ba586e35dbd317cbfd5",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/a248d1640ab059b075f53a2ef0f9856e864e06b5",
+ "reference": "a248d1640ab059b075f53a2ef0f9856e864e06b5",
"shasum": ""
},
"require": {
"php": ">=8.3"
},
"require-dev": {
- "phpunit/phpunit": "^12.0"
+ "phpunit/phpunit": "^12.5.33"
},
"type": "library",
"extra": {
@@ -3430,7 +3429,7 @@
"support": {
"issues": "https://github.com/sebastianbergmann/php-file-iterator/issues",
"security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy",
- "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/6.0.1"
+ "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/6.0.2"
},
"funding": [
{
@@ -3450,7 +3449,7 @@
"type": "tidelift"
}
],
- "time": "2026-02-02T14:04:18+00:00"
+ "time": "2026-08-25T14:40:53+00:00"
},
{
"name": "phpunit/php-invoker",
@@ -3638,24 +3637,24 @@
},
{
"name": "phpunit/phpunit",
- "version": "12.5.30",
+ "version": "12.5.33",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/phpunit.git",
- "reference": "900400a5b616d6fb306f9549f6da33ba615d3fbb"
+ "reference": "b98e028a26c5c5ba7e4a54be96ccf35f2914d184"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/900400a5b616d6fb306f9549f6da33ba615d3fbb",
- "reference": "900400a5b616d6fb306f9549f6da33ba615d3fbb",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/b98e028a26c5c5ba7e4a54be96ccf35f2914d184",
+ "reference": "b98e028a26c5c5ba7e4a54be96ccf35f2914d184",
"shasum": ""
},
"require": {
"ext-dom": "*",
+ "ext-filter": "*",
"ext-json": "*",
"ext-libxml": "*",
"ext-mbstring": "*",
- "ext-xml": "*",
"ext-xmlwriter": "*",
"myclabs/deep-copy": "^1.13.4",
"phar-io/manifest": "^2.0.4",
@@ -3716,7 +3715,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.30"
+ "source": "https://github.com/sebastianbergmann/phpunit/tree/12.5.33"
},
"funding": [
{
@@ -3724,7 +3723,7 @@
"type": "other"
}
],
- "time": "2026-06-15T13:12:30+00:00"
+ "time": "2026-07-28T13:58:09+00:00"
},
{
"name": "psr/cache",
@@ -4128,16 +4127,16 @@
},
{
"name": "respect/fluentgen",
- "version": "2.0.0",
+ "version": "2.1.0",
"source": {
"type": "git",
"url": "https://github.com/Respect/FluentGen.git",
- "reference": "6a9065516f403c5f5abc86646290bd08e44c538e"
+ "reference": "4bed557a2ca6266e42e8953624bcb8f337843542"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/Respect/FluentGen/zipball/6a9065516f403c5f5abc86646290bd08e44c538e",
- "reference": "6a9065516f403c5f5abc86646290bd08e44c538e",
+ "url": "https://api.github.com/repos/Respect/FluentGen/zipball/4bed557a2ca6266e42e8953624bcb8f337843542",
+ "reference": "4bed557a2ca6266e42e8953624bcb8f337843542",
"shasum": ""
},
"require": {
@@ -4148,9 +4147,9 @@
"phpstan/phpstan": "^2.1",
"phpstan/phpstan-deprecation-rules": "^2.0",
"phpstan/phpstan-strict-rules": "^2.0",
- "phpunit/phpunit": "^12.5",
+ "phpunit/phpunit": "^12.5 || ^13.0",
"respect/coding-standard": "^5.0",
- "respect/fluent": "^2.0"
+ "respect/fluent": "^3.0"
},
"suggest": {
"respect/fluent": "Enables #[Composable] prefix composition support"
@@ -4180,9 +4179,9 @@
],
"support": {
"issues": "https://github.com/Respect/FluentGen/issues",
- "source": "https://github.com/Respect/FluentGen/tree/2.0.0"
+ "source": "https://github.com/Respect/FluentGen/tree/2.1.0"
},
- "time": "2026-03-25T05:50:09+00:00"
+ "time": "2026-09-05T17:14:12+00:00"
},
{
"name": "sebastian/cli-parser",
@@ -4405,24 +4404,24 @@
},
{
"name": "sebastian/diff",
- "version": "7.0.0",
+ "version": "7.0.1",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/diff.git",
- "reference": "7ab1ea946c012266ca32390913653d844ecd085f"
+ "reference": "cd4cabe39f8a4e8ee6818ba99f10a05561ea4ad6"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/7ab1ea946c012266ca32390913653d844ecd085f",
- "reference": "7ab1ea946c012266ca32390913653d844ecd085f",
+ "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/cd4cabe39f8a4e8ee6818ba99f10a05561ea4ad6",
+ "reference": "cd4cabe39f8a4e8ee6818ba99f10a05561ea4ad6",
"shasum": ""
},
"require": {
"php": ">=8.3"
},
"require-dev": {
- "phpunit/phpunit": "^12.0",
- "symfony/process": "^7.2"
+ "phpunit/phpunit": "^12.5.33",
+ "symfony/process": "^7.4.17"
},
"type": "library",
"extra": {
@@ -4460,15 +4459,27 @@
"support": {
"issues": "https://github.com/sebastianbergmann/diff/issues",
"security": "https://github.com/sebastianbergmann/diff/security/policy",
- "source": "https://github.com/sebastianbergmann/diff/tree/7.0.0"
+ "source": "https://github.com/sebastianbergmann/diff/tree/7.0.1"
},
"funding": [
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
+ },
+ {
+ "url": "https://liberapay.com/sebastianbergmann",
+ "type": "liberapay"
+ },
+ {
+ "url": "https://thanks.dev/u/gh/sebastianbergmann",
+ "type": "thanks_dev"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/sebastian/diff",
+ "type": "tidelift"
}
],
- "time": "2025-02-07T04:55:46+00:00"
+ "time": "2026-08-25T15:35:54+00:00"
},
{
"name": "sebastian/environment",
@@ -5159,32 +5170,32 @@
},
{
"name": "slevomat/coding-standard",
- "version": "8.29.0",
+ "version": "8.31.1",
"source": {
"type": "git",
"url": "https://github.com/slevomat/coding-standard.git",
- "reference": "81fce13c4ef4b53a03e5cfa6ce36afc191c1598e"
+ "reference": "0a40807a48873948bfa7ffce2a4e69ba40cf5e76"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/slevomat/coding-standard/zipball/81fce13c4ef4b53a03e5cfa6ce36afc191c1598e",
- "reference": "81fce13c4ef4b53a03e5cfa6ce36afc191c1598e",
+ "url": "https://api.github.com/repos/slevomat/coding-standard/zipball/0a40807a48873948bfa7ffce2a4e69ba40cf5e76",
+ "reference": "0a40807a48873948bfa7ffce2a4e69ba40cf5e76",
"shasum": ""
},
"require": {
"dealerdirect/phpcodesniffer-composer-installer": "^0.7 || ^1.2.1",
"php": "^7.4 || ^8.0",
- "phpstan/phpdoc-parser": "^2.3.2",
+ "phpstan/phpdoc-parser": "^2.3.3",
"squizlabs/php_codesniffer": "^4.0.1"
},
"require-dev": {
"phing/phing": "3.0.1|3.1.2",
"php-parallel-lint/php-parallel-lint": "1.4.0",
- "phpstan/phpstan": "2.1.54",
- "phpstan/phpstan-deprecation-rules": "2.0.4",
- "phpstan/phpstan-phpunit": "2.0.16",
- "phpstan/phpstan-strict-rules": "2.0.11",
- "phpunit/phpunit": "9.6.34|10.5.63|11.4.4|11.5.55|12.5.24"
+ "phpstan/phpstan": "2.2.7",
+ "phpstan/phpstan-deprecation-rules": "2.0.5",
+ "phpstan/phpstan-phpunit": "2.0.18",
+ "phpstan/phpstan-strict-rules": "2.0.12",
+ "phpunit/phpunit": "9.6.34|10.5.63|11.4.4|11.5.56|12.5.33"
},
"type": "phpcodesniffer-standard",
"extra": {
@@ -5208,7 +5219,7 @@
],
"support": {
"issues": "https://github.com/slevomat/coding-standard/issues",
- "source": "https://github.com/slevomat/coding-standard/tree/8.29.0"
+ "source": "https://github.com/slevomat/coding-standard/tree/8.31.1"
},
"funding": [
{
@@ -5220,7 +5231,7 @@
"type": "tidelift"
}
],
- "time": "2026-05-07T05:48:08+00:00"
+ "time": "2026-07-31T10:42:43+00:00"
},
{
"name": "sokil/php-isocodes",
@@ -5632,16 +5643,16 @@
},
{
"name": "symfony/filesystem",
- "version": "v8.1.0",
+ "version": "v8.1.6",
"source": {
"type": "git",
"url": "https://github.com/symfony/filesystem.git",
- "reference": "99aec13b82b4967ec5088222c4a3ecca955949c2"
+ "reference": "7599ebb855fede59413ddb7f15198d67bfcae7ba"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/filesystem/zipball/99aec13b82b4967ec5088222c4a3ecca955949c2",
- "reference": "99aec13b82b4967ec5088222c4a3ecca955949c2",
+ "url": "https://api.github.com/repos/symfony/filesystem/zipball/7599ebb855fede59413ddb7f15198d67bfcae7ba",
+ "reference": "7599ebb855fede59413ddb7f15198d67bfcae7ba",
"shasum": ""
},
"require": {
@@ -5679,7 +5690,7 @@
"description": "Provides basic utilities for the filesystem",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/filesystem/tree/v8.1.0"
+ "source": "https://github.com/symfony/filesystem/tree/v8.1.6"
},
"funding": [
{
@@ -5699,20 +5710,20 @@
"type": "tidelift"
}
],
- "time": "2026-05-29T05:06:50+00:00"
+ "time": "2026-08-23T10:06:25+00:00"
},
{
"name": "symfony/finder",
- "version": "v8.1.1",
+ "version": "v8.1.5",
"source": {
"type": "git",
"url": "https://github.com/symfony/finder.git",
- "reference": "e2989e762c70f9490fa3a00a0ac0fae5aa97a531"
+ "reference": "8d7acede2b2ae07605783d1c43e49b5767036474"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/finder/zipball/e2989e762c70f9490fa3a00a0ac0fae5aa97a531",
- "reference": "e2989e762c70f9490fa3a00a0ac0fae5aa97a531",
+ "url": "https://api.github.com/repos/symfony/finder/zipball/8d7acede2b2ae07605783d1c43e49b5767036474",
+ "reference": "8d7acede2b2ae07605783d1c43e49b5767036474",
"shasum": ""
},
"require": {
@@ -5747,7 +5758,7 @@
"description": "Finds files and directories via an intuitive fluent interface",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/finder/tree/v8.1.1"
+ "source": "https://github.com/symfony/finder/tree/v8.1.5"
},
"funding": [
{
@@ -5767,7 +5778,7 @@
"type": "tidelift"
}
],
- "time": "2026-06-27T09:05:56+00:00"
+ "time": "2026-08-21T12:16:08+00:00"
},
{
"name": "symfony/options-resolver",
@@ -6174,16 +6185,16 @@
},
{
"name": "symfony/process",
- "version": "v8.1.0",
+ "version": "v8.1.6",
"source": {
"type": "git",
"url": "https://github.com/symfony/process.git",
- "reference": "c4a9e58f235a6bf7f97ffbfedae2687353ac79e5"
+ "reference": "d863f5e70d7c87abb906ac11b61f83036093000b"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/process/zipball/c4a9e58f235a6bf7f97ffbfedae2687353ac79e5",
- "reference": "c4a9e58f235a6bf7f97ffbfedae2687353ac79e5",
+ "url": "https://api.github.com/repos/symfony/process/zipball/d863f5e70d7c87abb906ac11b61f83036093000b",
+ "reference": "d863f5e70d7c87abb906ac11b61f83036093000b",
"shasum": ""
},
"require": {
@@ -6215,7 +6226,7 @@
"description": "Executes commands in sub-processes",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/process/tree/v8.1.0"
+ "source": "https://github.com/symfony/process/tree/v8.1.6"
},
"funding": [
{
@@ -6235,7 +6246,7 @@
"type": "tidelift"
}
],
- "time": "2026-05-29T05:06:50+00:00"
+ "time": "2026-08-21T17:47:34+00:00"
},
{
"name": "symfony/service-contracts",
@@ -6816,9 +6827,9 @@
}
],
"aliases": [],
- "minimum-stability": "stable",
+ "minimum-stability": "dev",
"stability-flags": {},
- "prefer-stable": false,
+ "prefer-stable": true,
"prefer-lowest": false,
"platform": {
"php": ">=8.5"
diff --git a/phpcs.xml.dist b/phpcs.xml.dist
index 20d17139b..0cc9bec8f 100644
--- a/phpcs.xml.dist
+++ b/phpcs.xml.dist
@@ -15,6 +15,9 @@
src-dev/
tests/
+
+ tests/inference/assertions/*
+
@@ -28,6 +31,21 @@
src/Mixins/
tests/feature/
+
+
+ src/Mixins/
+
+
+ src/Mixins/
+
+
+ src/Mixins/
+
+
+ src/Mixins/
+
tests/Pest.php
tests/feature
diff --git a/phpstan.neon.dist b/phpstan.neon.dist
index 47b7facab..1d4255f51 100644
--- a/phpstan.neon.dist
+++ b/phpstan.neon.dist
@@ -23,6 +23,16 @@ parameters:
path: tests/src/Message/TestingHandler.php
- message: '/Property Respect\\Validation\\Test\\Stubs\\.+::\$[a-zA-Z]+ is never read, only written./'
path: tests/src/Stubs
+ -
+ # Why: src/Mixins/* are generated typing aids. Their @return Chain<...> carry the
+ # narrowing types derived from #[Assurance] (the same ones FluentAnalysis computes
+ # at analysis time), e.g. bare `array` or `ArrayAccess`. Fully parameterising those
+ # generics would only clutter the IDE-facing types without adding narrowing value.
+ identifier: missingType.iterableValue
+ path: src/Mixins/*
+ -
+ identifier: missingType.generics
+ path: src/Mixins/*
level: 8
treatPhpDocTypesAsCertain: false
paths:
diff --git a/phpunit.xml.dist b/phpunit.xml.dist
index 51339be5c..8dae82703 100644
--- a/phpunit.xml.dist
+++ b/phpunit.xml.dist
@@ -14,6 +14,9 @@
./tests/feature
+
+ tests/inference/
+
diff --git a/src-dev/Commands/LintMixinCommand.php b/src-dev/Commands/LintMixinCommand.php
index a31f6b188..a3e1644bf 100644
--- a/src-dev/Commands/LintMixinCommand.php
+++ b/src-dev/Commands/LintMixinCommand.php
@@ -18,6 +18,7 @@
use Respect\FluentGen\Fluent\MethodBuilder;
use Respect\FluentGen\Fluent\MixinGenerator;
use Respect\FluentGen\Fluent\PrefixConstantsGenerator;
+use Respect\FluentGen\Fluent\TerminalMethod;
use Respect\FluentGen\NamespaceScanner;
use Respect\Validation\Mixins\Chain;
use Respect\Validation\Validator;
@@ -82,6 +83,7 @@ interfaces: [
suffix: 'Builder',
returnType: Chain::class,
static: true,
+ emitNarrowing: true,
),
new InterfaceConfig(
suffix: 'Chain',
@@ -89,6 +91,29 @@ interfaces: [
rootExtends: [Validator::class],
rootComment: '@mixin ValidatorBuilder',
rootUses: [ValidatorBuilder::class],
+ emitNarrowing: true,
+ templateParam: 'TSure',
+ terminalMethods: [
+ new TerminalMethod(
+ name: 'assert',
+ returnType: 'void',
+ parameters: ['input' => 'mixed'],
+ comments: ['@phpstan-assert TSure $input', '@psalm-assert TSure $input'],
+ optionalParameters: ['template' => 'mixed'],
+ ),
+ new TerminalMethod(
+ name: 'check',
+ returnType: 'void',
+ parameters: ['input' => 'mixed'],
+ comments: ['@phpstan-assert TSure $input', '@psalm-assert TSure $input'],
+ optionalParameters: ['template' => 'mixed'],
+ ),
+ new TerminalMethod(
+ name: 'isValid',
+ returnType: 'bool',
+ parameters: ['input' => 'mixed'],
+ ),
+ ],
),
],
);
diff --git a/src/Mixins/AllBuilder.php b/src/Mixins/AllBuilder.php
index ea6f9af97..e57694f1e 100644
--- a/src/Mixins/AllBuilder.php
+++ b/src/Mixins/AllBuilder.php
@@ -17,300 +17,462 @@
interface AllBuilder
{
+ /** @return Chain */
public static function allAfter(callable $callable, Validator $validator): Chain;
+ /** @return Chain */
public static function allAllOf(Validator $validator1, Validator $validator2, Validator ...$validators): Chain;
+ /** @return Chain> */
public static function allAlnum(string ...$additionalChars): Chain;
+ /** @return Chain> */
public static function allAlpha(string ...$additionalChars): Chain;
+ /** @return Chain */
public static function allAlwaysInvalid(): Chain;
+ /** @return Chain */
public static function allAlwaysValid(): Chain;
+ /** @return Chain */
public static function allAnyOf(Validator $validator1, Validator $validator2, Validator ...$validators): Chain;
+ /** @return Chain> */
public static function allArrayType(): Chain;
+ /** @return Chain> */
public static function allArrayVal(): Chain;
+ /** @return Chain */
public static function allBase(int $base, string $chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'): Chain;
+ /** @return Chain> */
public static function allBase64(): Chain;
+ /** @return Chain */
public static function allBetween(mixed $minValue, mixed $maxValue): Chain;
+ /** @return Chain */
public static function allBetweenExclusive(mixed $minimum, mixed $maximum): Chain;
+ /** @return Chain */
public static function allBlank(): Chain;
+ /** @return Chain> */
public static function allBoolType(): Chain;
+ /** @return Chain> */
public static function allBoolVal(): Chain;
+ /** @return Chain> */
public static function allBsn(): Chain;
+ /** @return Chain> */
public static function allCallableType(): Chain;
+ /** @return Chain> */
public static function allCharset(string $charset, string ...$charsets): Chain;
+ /** @return Chain> */
public static function allCnh(): Chain;
+ /** @return Chain> */
public static function allCnpj(): Chain;
+ /** @return Chain> */
public static function allConsonant(string ...$additionalChars): Chain;
+ /** @return Chain> */
public static function allContains(mixed $containsValue): Chain;
- /** @param non-empty-array $needles */
+ /**
+ * @param non-empty-array $needles
+ * @return Chain>
+ */
public static function allContainsAny(array $needles): Chain;
+ /** @return Chain> */
public static function allContainsCount(mixed $containsValue, int $count): Chain;
+ /** @return Chain> */
public static function allControl(string ...$additionalChars): Chain;
+ /** @return Chain> */
public static function allCountable(): Chain;
- /** @param "alpha-2"|"alpha-3"|"numeric" $set */
+ /**
+ * @param "alpha-2"|"alpha-3"|"numeric" $set
+ * @return Chain>
+ */
public static function allCountryCode(string $set = 'alpha-2'): Chain;
+ /** @return Chain> */
public static function allCpf(): Chain;
+ /** @return Chain> */
public static function allCreditCard(string $brand = 'Any'): Chain;
- /** @param "alpha-3"|"numeric" $set */
+ /**
+ * @param "alpha-3"|"numeric" $set
+ * @return Chain>
+ */
public static function allCurrencyCode(string $set = 'alpha-3'): Chain;
+ /** @return Chain> */
public static function allDate(string $format = 'Y-m-d'): Chain;
+ /** @return Chain> */
public static function allDateTime(string|null $format = null): Chain;
- /** @param "years"|"months"|"days"|"hours"|"minutes"|"seconds"|"microseconds" $type */
+ /**
+ * @param "years"|"months"|"days"|"hours"|"minutes"|"seconds"|"microseconds" $type
+ * @return Chain>
+ */
public static function allDateTimeDiff(string $type, Validator $validator, string|null $format = null, DateTimeImmutable|null $now = null): Chain;
+ /** @return Chain> */
public static function allDecimal(int $decimals): Chain;
+ /** @return Chain> */
public static function allDigit(string ...$additionalChars): Chain;
+ /** @return Chain> */
public static function allDirectory(): Chain;
+ /** @return Chain> */
public static function allDomain(bool $tldCheck = true): Chain;
+ /** @return Chain */
public static function allEach(Validator $validator): Chain;
+ /** @return Chain */
public static function allEachKey(Validator $validator): Chain;
+ /** @return Chain> */
public static function allEmail(): Chain;
+ /** @return Chain> */
public static function allEmoji(): Chain;
+ /** @return Chain> */
public static function allEndsWith(mixed $endValue, mixed ...$endValues): Chain;
+ /** @return Chain */
public static function allEquals(mixed $compareTo): Chain;
+ /** @return Chain */
public static function allEquivalent(mixed $compareTo): Chain;
+ /** @return Chain> */
public static function allEven(): Chain;
+ /** @return Chain> */
public static function allExecutable(): Chain;
+ /** @return Chain> */
public static function allExtension(string $extension): Chain;
+ /** @return Chain */
public static function allFactor(int $dividend): Chain;
- /** @param callable(mixed): Validator $factory */
+ /**
+ * @param callable(mixed): Validator $factory
+ * @return Chain
+ */
public static function allFactory(callable $factory): Chain;
+ /** @return Chain> */
public static function allFalseVal(): Chain;
+ /** @return Chain */
public static function allFalsy(): Chain;
+ /** @return Chain> */
public static function allFile(): Chain;
+ /** @return Chain> */
public static function allFinite(): Chain;
+ /** @return Chain> */
public static function allFloatType(): Chain;
+ /** @return Chain> */
public static function allFloatVal(): Chain;
+ /** @return Chain> */
public static function allFormat(Formatter $formatter): Chain;
+ /** @return Chain */
public static function allGiven(Validator $when, Validator $then): Chain;
+ /** @return Chain> */
public static function allGraph(string ...$additionalChars): Chain;
+ /** @return Chain */
public static function allGreaterThan(mixed $compareTo): Chain;
+ /** @return Chain */
public static function allGreaterThanOrEqual(mixed $compareTo): Chain;
+ /** @return Chain> */
public static function allHetu(): Chain;
+ /** @return Chain> */
public static function allHexRgbColor(): Chain;
+ /** @return Chain> */
public static function allIban(): Chain;
+ /** @return Chain */
public static function allIdentical(mixed $compareTo): Chain;
+ /** @return Chain> */
public static function allImage(): Chain;
+ /** @return Chain> */
public static function allImei(): Chain;
+ /** @return Chain */
public static function allIn(mixed $haystack): Chain;
+ /** @return Chain> */
public static function allInfinite(): Chain;
- /** @param class-string $class */
+ /**
+ * @param class-string $class
+ * @return Chain
+ */
public static function allInstance(string $class): Chain;
+ /** @return Chain> */
public static function allIntType(): Chain;
+ /** @return Chain> */
public static function allIntVal(): Chain;
+ /** @return Chain> */
public static function allIp(string $range = '*', int|null $options = null): Chain;
+ /** @return Chain> */
public static function allIsbn(): Chain;
+ /** @return Chain> */
public static function allIterableType(): Chain;
+ /** @return Chain> */
public static function allIterableVal(): Chain;
+ /** @return Chain> */
public static function allJson(): Chain;
- /** @param "alpha-2"|"alpha-3" $set */
+ /**
+ * @param "alpha-2"|"alpha-3" $set
+ * @return Chain>
+ */
public static function allLanguageCode(string $set = 'alpha-2'): Chain;
+ /** @return Chain> */
public static function allLeapDate(string $format): Chain;
+ /** @return Chain> */
public static function allLeapYear(): Chain;
+ /** @return Chain */
public static function allLength(Validator $validator): Chain;
+ /** @return Chain */
public static function allLessThan(mixed $compareTo): Chain;
+ /** @return Chain */
public static function allLessThanOrEqual(mixed $compareTo): Chain;
+ /** @return Chain> */
public static function allLowercase(): Chain;
+ /** @return Chain> */
public static function allLuhn(): Chain;
+ /** @return Chain> */
public static function allMacAddress(): Chain;
+ /** @return Chain */
public static function allMax(Validator $validator): Chain;
+ /** @return Chain> */
public static function allMimetype(string $mimetype): Chain;
+ /** @return Chain */
public static function allMin(Validator $validator): Chain;
+ /** @return Chain */
public static function allMultiple(int $multipleOf): Chain;
+ /** @return Chain> */
public static function allNegative(): Chain;
+ /** @return Chain> */
public static function allNfeAccessKey(): Chain;
+ /** @return Chain> */
public static function allNif(): Chain;
+ /** @return Chain> */
public static function allNip(): Chain;
+ /** @return Chain */
public static function allNoneOf(Validator $validator1, Validator $validator2, Validator ...$validators): Chain;
+ /** @return Chain */
public static function allNot(Validator $validator): Chain;
+ /** @return Chain> */
public static function allNullType(): Chain;
+ /** @return Chain> */
public static function allNumber(): Chain;
+ /** @return Chain> */
public static function allNumericVal(): Chain;
+ /** @return Chain> */
public static function allObjectType(): Chain;
+ /** @return Chain> */
public static function allOdd(): Chain;
+ /** @return Chain */
public static function allOneOf(Validator $validator1, Validator $validator2, Validator ...$validators): Chain;
+ /** @return Chain> */
public static function allPesel(): Chain;
+ /** @return Chain> */
public static function allPhone(string|null $countryCode = null): Chain;
+ /** @return Chain> */
public static function allPis(): Chain;
+ /** @return Chain> */
public static function allPolishIdCard(): Chain;
+ /** @return Chain> */
public static function allPortugueseNif(): Chain;
+ /** @return Chain> */
public static function allPositive(): Chain;
+ /** @return Chain> */
public static function allPostalCode(string $countryCode, bool $formatted = false): Chain;
+ /** @return Chain> */
public static function allPrintable(string ...$additionalChars): Chain;
+ /** @return Chain> */
public static function allPublicDomainSuffix(): Chain;
+ /** @return Chain> */
public static function allPunct(string ...$additionalChars): Chain;
+ /** @return Chain> */
public static function allReadable(): Chain;
+ /** @return Chain> */
public static function allRegex(string $regex): Chain;
+ /** @return Chain> */
public static function allResourceType(): Chain;
+ /** @return Chain> */
public static function allRoman(): Chain;
+ /** @return Chain */
public static function allSatisfies(callable $callback, mixed ...$arguments): Chain;
+ /** @return Chain> */
public static function allScalarVal(): Chain;
+ /** @return Chain */
public static function allShortCircuit(Validator ...$validators): Chain;
- /** @param "B"|"KB"|"MB"|"GB"|"TB"|"PB"|"EB"|"ZB"|"YB" $unit */
+ /**
+ * @param "B"|"KB"|"MB"|"GB"|"TB"|"PB"|"EB"|"ZB"|"YB" $unit
+ * @return Chain>
+ */
public static function allSize(string $unit, Validator $validator): Chain;
+ /** @return Chain> */
public static function allSlug(): Chain;
+ /** @return Chain> */
public static function allSorted(string $direction): Chain;
+ /** @return Chain> */
public static function allSpace(string ...$additionalChars): Chain;
+ /** @return Chain> */
public static function allSpaced(): Chain;
+ /** @return Chain> */
public static function allStartsWith(mixed $startValue, mixed ...$startValues): Chain;
+ /** @return Chain> */
public static function allStringType(): Chain;
+ /** @return Chain> */
public static function allStringVal(): Chain;
+ /** @return Chain> */
public static function allSubdivisionCode(string $countryCode): Chain;
- /** @param mixed[] $superset */
+ /**
+ * @param mixed[] $superset
+ * @return Chain>
+ */
public static function allSubset(array $superset): Chain;
+ /** @return Chain> */
public static function allSymbolicLink(): Chain;
+ /** @return Chain> */
public static function allTime(string $format = 'H:i:s'): Chain;
+ /** @return Chain> */
public static function allTld(): Chain;
+ /** @return Chain> */
public static function allTrimmed(string ...$trimValues): Chain;
+ /** @return Chain> */
public static function allTrueVal(): Chain;
+ /** @return Chain> */
public static function allUndef(): Chain;
+ /** @return Chain> */
public static function allUnique(): Chain;
+ /** @return Chain> */
public static function allUppercase(): Chain;
+ /** @return Chain> */
public static function allUrl(): Chain;
+ /** @return Chain> */
public static function allUuid(int|null $version = null): Chain;
+ /** @return Chain> */
public static function allVersion(): Chain;
+ /** @return Chain> */
public static function allVowel(string ...$additionalChars): Chain;
+ /** @return Chain */
public static function allWhen(Validator $when, Validator $then, Validator|null $else = null): Chain;
+ /** @return Chain> */
public static function allWritable(): Chain;
+ /** @return Chain> */
public static function allXdigit(string ...$additionalChars): Chain;
}
diff --git a/src/Mixins/AllChain.php b/src/Mixins/AllChain.php
index 521337b09..d62485a21 100644
--- a/src/Mixins/AllChain.php
+++ b/src/Mixins/AllChain.php
@@ -17,300 +17,462 @@
interface AllChain
{
+ /** @return Chain */
public function allAfter(callable $callable, Validator $validator): Chain;
+ /** @return Chain */
public function allAllOf(Validator $validator1, Validator $validator2, Validator ...$validators): Chain;
+ /** @return Chain */
public function allAlnum(string ...$additionalChars): Chain;
+ /** @return Chain */
public function allAlpha(string ...$additionalChars): Chain;
+ /** @return Chain */
public function allAlwaysInvalid(): Chain;
+ /** @return Chain */
public function allAlwaysValid(): Chain;
+ /** @return Chain */
public function allAnyOf(Validator $validator1, Validator $validator2, Validator ...$validators): Chain;
+ /** @return Chain */
public function allArrayType(): Chain;
+ /** @return Chain */
public function allArrayVal(): Chain;
+ /** @return Chain */
public function allBase(int $base, string $chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'): Chain;
+ /** @return Chain */
public function allBase64(): Chain;
+ /** @return Chain */
public function allBetween(mixed $minValue, mixed $maxValue): Chain;
+ /** @return Chain */
public function allBetweenExclusive(mixed $minimum, mixed $maximum): Chain;
+ /** @return Chain */
public function allBlank(): Chain;
+ /** @return Chain */
public function allBoolType(): Chain;
+ /** @return Chain */
public function allBoolVal(): Chain;
+ /** @return Chain */
public function allBsn(): Chain;
+ /** @return Chain */
public function allCallableType(): Chain;
+ /** @return Chain */
public function allCharset(string $charset, string ...$charsets): Chain;
+ /** @return Chain */
public function allCnh(): Chain;
+ /** @return Chain */
public function allCnpj(): Chain;
+ /** @return Chain */
public function allConsonant(string ...$additionalChars): Chain;
+ /** @return Chain */
public function allContains(mixed $containsValue): Chain;
- /** @param non-empty-array $needles */
+ /**
+ * @param non-empty-array $needles
+ * @return Chain
+ */
public function allContainsAny(array $needles): Chain;
+ /** @return Chain */
public function allContainsCount(mixed $containsValue, int $count): Chain;
+ /** @return Chain */
public function allControl(string ...$additionalChars): Chain;
+ /** @return Chain */
public function allCountable(): Chain;
- /** @param "alpha-2"|"alpha-3"|"numeric" $set */
+ /**
+ * @param "alpha-2"|"alpha-3"|"numeric" $set
+ * @return Chain
+ */
public function allCountryCode(string $set = 'alpha-2'): Chain;
+ /** @return Chain */
public function allCpf(): Chain;
+ /** @return Chain */
public function allCreditCard(string $brand = 'Any'): Chain;
- /** @param "alpha-3"|"numeric" $set */
+ /**
+ * @param "alpha-3"|"numeric" $set
+ * @return Chain
+ */
public function allCurrencyCode(string $set = 'alpha-3'): Chain;
+ /** @return Chain */
public function allDate(string $format = 'Y-m-d'): Chain;
+ /** @return Chain */
public function allDateTime(string|null $format = null): Chain;
- /** @param "years"|"months"|"days"|"hours"|"minutes"|"seconds"|"microseconds" $type */
+ /**
+ * @param "years"|"months"|"days"|"hours"|"minutes"|"seconds"|"microseconds" $type
+ * @return Chain
+ */
public function allDateTimeDiff(string $type, Validator $validator, string|null $format = null, DateTimeImmutable|null $now = null): Chain;
+ /** @return Chain */
public function allDecimal(int $decimals): Chain;
+ /** @return Chain */
public function allDigit(string ...$additionalChars): Chain;
+ /** @return Chain */
public function allDirectory(): Chain;
+ /** @return Chain */
public function allDomain(bool $tldCheck = true): Chain;
+ /** @return Chain */
public function allEach(Validator $validator): Chain;
+ /** @return Chain */
public function allEachKey(Validator $validator): Chain;
+ /** @return Chain */
public function allEmail(): Chain;
+ /** @return Chain */
public function allEmoji(): Chain;
+ /** @return Chain */
public function allEndsWith(mixed $endValue, mixed ...$endValues): Chain;
+ /** @return Chain */
public function allEquals(mixed $compareTo): Chain;
+ /** @return Chain */
public function allEquivalent(mixed $compareTo): Chain;
+ /** @return Chain */
public function allEven(): Chain;
+ /** @return Chain */
public function allExecutable(): Chain;
+ /** @return Chain */
public function allExtension(string $extension): Chain;
+ /** @return Chain */
public function allFactor(int $dividend): Chain;
- /** @param callable(mixed): Validator $factory */
+ /**
+ * @param callable(mixed): Validator $factory
+ * @return Chain
+ */
public function allFactory(callable $factory): Chain;
+ /** @return Chain */
public function allFalseVal(): Chain;
+ /** @return Chain */
public function allFalsy(): Chain;
+ /** @return Chain */
public function allFile(): Chain;
+ /** @return Chain */
public function allFinite(): Chain;
+ /** @return Chain */
public function allFloatType(): Chain;
+ /** @return Chain */
public function allFloatVal(): Chain;
+ /** @return Chain */
public function allFormat(Formatter $formatter): Chain;
+ /** @return Chain */
public function allGiven(Validator $when, Validator $then): Chain;
+ /** @return Chain */
public function allGraph(string ...$additionalChars): Chain;
+ /** @return Chain */
public function allGreaterThan(mixed $compareTo): Chain;
+ /** @return Chain */
public function allGreaterThanOrEqual(mixed $compareTo): Chain;
+ /** @return Chain */
public function allHetu(): Chain;
+ /** @return Chain */
public function allHexRgbColor(): Chain;
+ /** @return Chain */
public function allIban(): Chain;
+ /** @return Chain */
public function allIdentical(mixed $compareTo): Chain;
+ /** @return Chain */
public function allImage(): Chain;
+ /** @return Chain */
public function allImei(): Chain;
+ /** @return Chain */
public function allIn(mixed $haystack): Chain;
+ /** @return Chain */
public function allInfinite(): Chain;
- /** @param class-string $class */
+ /**
+ * @param class-string $class
+ * @return Chain
+ */
public function allInstance(string $class): Chain;
+ /** @return Chain */
public function allIntType(): Chain;
+ /** @return Chain */
public function allIntVal(): Chain;
+ /** @return Chain */
public function allIp(string $range = '*', int|null $options = null): Chain;
+ /** @return Chain */
public function allIsbn(): Chain;
+ /** @return Chain */
public function allIterableType(): Chain;
+ /** @return Chain */
public function allIterableVal(): Chain;
+ /** @return Chain */
public function allJson(): Chain;
- /** @param "alpha-2"|"alpha-3" $set */
+ /**
+ * @param "alpha-2"|"alpha-3" $set
+ * @return Chain
+ */
public function allLanguageCode(string $set = 'alpha-2'): Chain;
+ /** @return Chain */
public function allLeapDate(string $format): Chain;
+ /** @return Chain */
public function allLeapYear(): Chain;
+ /** @return Chain */
public function allLength(Validator $validator): Chain;
+ /** @return Chain */
public function allLessThan(mixed $compareTo): Chain;
+ /** @return Chain */
public function allLessThanOrEqual(mixed $compareTo): Chain;
+ /** @return Chain */
public function allLowercase(): Chain;
+ /** @return Chain */
public function allLuhn(): Chain;
+ /** @return Chain */
public function allMacAddress(): Chain;
+ /** @return Chain */
public function allMax(Validator $validator): Chain;
+ /** @return Chain */
public function allMimetype(string $mimetype): Chain;
+ /** @return Chain */
public function allMin(Validator $validator): Chain;
+ /** @return Chain */
public function allMultiple(int $multipleOf): Chain;
+ /** @return Chain */
public function allNegative(): Chain;
+ /** @return Chain */
public function allNfeAccessKey(): Chain;
+ /** @return Chain */
public function allNif(): Chain;
+ /** @return Chain */
public function allNip(): Chain;
+ /** @return Chain */
public function allNoneOf(Validator $validator1, Validator $validator2, Validator ...$validators): Chain;
+ /** @return Chain */
public function allNot(Validator $validator): Chain;
+ /** @return Chain */
public function allNullType(): Chain;
+ /** @return Chain */
public function allNumber(): Chain;
+ /** @return Chain */
public function allNumericVal(): Chain;
+ /** @return Chain */
public function allObjectType(): Chain;
+ /** @return Chain */
public function allOdd(): Chain;
+ /** @return Chain */
public function allOneOf(Validator $validator1, Validator $validator2, Validator ...$validators): Chain;
+ /** @return Chain */
public function allPesel(): Chain;
+ /** @return Chain