├── .github └── workflows │ ├── pest.yml │ └── pint.yml ├── .gitignore ├── README.md ├── composer.json ├── composer.lock ├── phpunit.xml ├── src ├── Exceptions │ ├── BigNumberException.php │ ├── InvalidNumberException.php │ ├── InvalidObjectException.php │ ├── InvalidObjectSchemaException.php │ ├── InvalidStringException.php │ ├── LongStringException.php │ ├── ShortStringException.php │ └── SmallNumberException.php ├── Schemas │ ├── NumberSchema.php │ ├── ObjectSchema.php │ ├── Schema.php │ └── StringSchema.php └── Zod.php └── tests ├── Pest.php └── Schemas ├── NumberSchemaTest.php ├── ObjectSchemaTest.php └── StringSchemaTest.php /.github/workflows/pest.yml: -------------------------------------------------------------------------------- 1 | name: Pest 2 | 3 | on: [push, pull_request] 4 | 5 | jobs: 6 | test: 7 | runs-on: ubuntu-latest 8 | name: Pest 9 | steps: 10 | - name: Checkout source code 11 | uses: actions/checkout@master 12 | - name: Setup PHP 13 | uses: shivammathur/setup-php@v2 14 | with: 15 | php-version: 8.1 16 | - name: Install Dependencies 17 | run: | 18 | composer install 19 | - name: Test 20 | run: | 21 | composer test -- --ci 22 | -------------------------------------------------------------------------------- /.github/workflows/pint.yml: -------------------------------------------------------------------------------- 1 | name: Pint 2 | 3 | on: [push, pull_request] 4 | 5 | jobs: 6 | test: 7 | runs-on: ubuntu-latest 8 | name: Pint 9 | steps: 10 | - name: Checkout source code 11 | uses: actions/checkout@master 12 | - name: Setup PHP 13 | uses: shivammathur/setup-php@v2 14 | with: 15 | php-version: 8.1 16 | - name: Install Dependencies 17 | run: | 18 | composer install 19 | - name: Lint 20 | run: | 21 | composer lint -- --test 22 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /vendor 2 | .phpunit* -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Zod-PHP 2 | 3 | A [Zod](https://github.com/colinhacks/zod)-like implementation in PHP, inspired by [Laravel](https://github.com/laravel/framework/)'s code standards. 4 | 5 | ## Usage: 6 | 7 | The usage is pretty simple & straightforward, and is very similar to the original Zod library: 8 | 9 | ```php 10 | use StyleShit\Zod\Zod as Z; 11 | 12 | // Create the schema. 13 | $schema = Z::object([ 14 | 'name' => Z::string()->min(3)->max(15), 15 | 'age' => Z::number()->min(0), 16 | 'address' => Z::object([ 17 | 'city' => Z::string(), 18 | 'street' => Z::string(), 19 | ]), 20 | ]); 21 | 22 | // Validate the data. 23 | $parsed = $schema->parse([ 24 | 'name' => 'John Doe', 25 | 'age' => 20, 26 | 'address' => [ 27 | 'city' => 'New York', 28 | 'street' => 'Wall Street', 29 | ], 30 | ]); 31 | ``` 32 | 33 | For more information, see the [tests](tests/Parsers/). 34 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "require-dev": { 3 | "laravel/pint": "^1.2", 4 | "pestphp/pest": "^1.22" 5 | }, 6 | "scripts": { 7 | "lint": "pint", 8 | "test": "pest" 9 | }, 10 | "config": { 11 | "allow-plugins": { 12 | "pestphp/pest-plugin": true 13 | } 14 | }, 15 | "autoload": { 16 | "psr-4": { 17 | "StyleShit\\Zod\\": "src" 18 | } 19 | }, 20 | "autoload-dev": { 21 | "psr-4": { 22 | "StyleShit\\Zod\\Tests\\": "tests" 23 | } 24 | } 25 | } -------------------------------------------------------------------------------- /composer.lock: -------------------------------------------------------------------------------- 1 | { 2 | "_readme": [ 3 | "This file locks the dependencies of your project to a known state", 4 | "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", 5 | "This file is @generated automatically" 6 | ], 7 | "content-hash": "c4345903fdee0b66c40b70db10636752", 8 | "packages": [], 9 | "packages-dev": [ 10 | { 11 | "name": "doctrine/instantiator", 12 | "version": "2.0.0", 13 | "source": { 14 | "type": "git", 15 | "url": "https://github.com/doctrine/instantiator.git", 16 | "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0" 17 | }, 18 | "dist": { 19 | "type": "zip", 20 | "url": "https://api.github.com/repos/doctrine/instantiator/zipball/c6222283fa3f4ac679f8b9ced9a4e23f163e80d0", 21 | "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0", 22 | "shasum": "" 23 | }, 24 | "require": { 25 | "php": "^8.1" 26 | }, 27 | "require-dev": { 28 | "doctrine/coding-standard": "^11", 29 | "ext-pdo": "*", 30 | "ext-phar": "*", 31 | "phpbench/phpbench": "^1.2", 32 | "phpstan/phpstan": "^1.9.4", 33 | "phpstan/phpstan-phpunit": "^1.3", 34 | "phpunit/phpunit": "^9.5.27", 35 | "vimeo/psalm": "^5.4" 36 | }, 37 | "type": "library", 38 | "autoload": { 39 | "psr-4": { 40 | "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" 41 | } 42 | }, 43 | "notification-url": "https://packagist.org/downloads/", 44 | "license": [ 45 | "MIT" 46 | ], 47 | "authors": [ 48 | { 49 | "name": "Marco Pivetta", 50 | "email": "ocramius@gmail.com", 51 | "homepage": "https://ocramius.github.io/" 52 | } 53 | ], 54 | "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", 55 | "homepage": "https://www.doctrine-project.org/projects/instantiator.html", 56 | "keywords": [ 57 | "constructor", 58 | "instantiate" 59 | ], 60 | "support": { 61 | "issues": "https://github.com/doctrine/instantiator/issues", 62 | "source": "https://github.com/doctrine/instantiator/tree/2.0.0" 63 | }, 64 | "funding": [ 65 | { 66 | "url": "https://www.doctrine-project.org/sponsorship.html", 67 | "type": "custom" 68 | }, 69 | { 70 | "url": "https://www.patreon.com/phpdoctrine", 71 | "type": "patreon" 72 | }, 73 | { 74 | "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", 75 | "type": "tidelift" 76 | } 77 | ], 78 | "time": "2022-12-30T00:23:10+00:00" 79 | }, 80 | { 81 | "name": "filp/whoops", 82 | "version": "2.15.2", 83 | "source": { 84 | "type": "git", 85 | "url": "https://github.com/filp/whoops.git", 86 | "reference": "aac9304c5ed61bf7b1b7a6064bf9806ab842ce73" 87 | }, 88 | "dist": { 89 | "type": "zip", 90 | "url": "https://api.github.com/repos/filp/whoops/zipball/aac9304c5ed61bf7b1b7a6064bf9806ab842ce73", 91 | "reference": "aac9304c5ed61bf7b1b7a6064bf9806ab842ce73", 92 | "shasum": "" 93 | }, 94 | "require": { 95 | "php": "^5.5.9 || ^7.0 || ^8.0", 96 | "psr/log": "^1.0.1 || ^2.0 || ^3.0" 97 | }, 98 | "require-dev": { 99 | "mockery/mockery": "^0.9 || ^1.0", 100 | "phpunit/phpunit": "^4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.8 || ^9.3.3", 101 | "symfony/var-dumper": "^2.6 || ^3.0 || ^4.0 || ^5.0" 102 | }, 103 | "suggest": { 104 | "symfony/var-dumper": "Pretty print complex values better with var-dumper available", 105 | "whoops/soap": "Formats errors as SOAP responses" 106 | }, 107 | "type": "library", 108 | "extra": { 109 | "branch-alias": { 110 | "dev-master": "2.7-dev" 111 | } 112 | }, 113 | "autoload": { 114 | "psr-4": { 115 | "Whoops\\": "src/Whoops/" 116 | } 117 | }, 118 | "notification-url": "https://packagist.org/downloads/", 119 | "license": [ 120 | "MIT" 121 | ], 122 | "authors": [ 123 | { 124 | "name": "Filipe Dobreira", 125 | "homepage": "https://github.com/filp", 126 | "role": "Developer" 127 | } 128 | ], 129 | "description": "php error handling for cool kids", 130 | "homepage": "https://filp.github.io/whoops/", 131 | "keywords": [ 132 | "error", 133 | "exception", 134 | "handling", 135 | "library", 136 | "throwable", 137 | "whoops" 138 | ], 139 | "support": { 140 | "issues": "https://github.com/filp/whoops/issues", 141 | "source": "https://github.com/filp/whoops/tree/2.15.2" 142 | }, 143 | "funding": [ 144 | { 145 | "url": "https://github.com/denis-sokolov", 146 | "type": "github" 147 | } 148 | ], 149 | "time": "2023-04-12T12:00:00+00:00" 150 | }, 151 | { 152 | "name": "laravel/pint", 153 | "version": "v1.10.0", 154 | "source": { 155 | "type": "git", 156 | "url": "https://github.com/laravel/pint.git", 157 | "reference": "c7a01fa9bdd79819e7a2f1ba63ac1b02e6692dbc" 158 | }, 159 | "dist": { 160 | "type": "zip", 161 | "url": "https://api.github.com/repos/laravel/pint/zipball/c7a01fa9bdd79819e7a2f1ba63ac1b02e6692dbc", 162 | "reference": "c7a01fa9bdd79819e7a2f1ba63ac1b02e6692dbc", 163 | "shasum": "" 164 | }, 165 | "require": { 166 | "ext-json": "*", 167 | "ext-mbstring": "*", 168 | "ext-tokenizer": "*", 169 | "ext-xml": "*", 170 | "php": "^8.1.0" 171 | }, 172 | "require-dev": { 173 | "friendsofphp/php-cs-fixer": "^3.16.0", 174 | "illuminate/view": "^10.5.1", 175 | "laravel-zero/framework": "^10.0.2", 176 | "mockery/mockery": "^1.5.1", 177 | "nunomaduro/larastan": "^2.5.1", 178 | "nunomaduro/termwind": "^1.15.1", 179 | "pestphp/pest": "^2.4.0" 180 | }, 181 | "bin": [ 182 | "builds/pint" 183 | ], 184 | "type": "project", 185 | "autoload": { 186 | "psr-4": { 187 | "App\\": "app/", 188 | "Database\\Seeders\\": "database/seeders/", 189 | "Database\\Factories\\": "database/factories/" 190 | } 191 | }, 192 | "notification-url": "https://packagist.org/downloads/", 193 | "license": [ 194 | "MIT" 195 | ], 196 | "authors": [ 197 | { 198 | "name": "Nuno Maduro", 199 | "email": "enunomaduro@gmail.com" 200 | } 201 | ], 202 | "description": "An opinionated code formatter for PHP.", 203 | "homepage": "https://laravel.com", 204 | "keywords": [ 205 | "format", 206 | "formatter", 207 | "lint", 208 | "linter", 209 | "php" 210 | ], 211 | "support": { 212 | "issues": "https://github.com/laravel/pint/issues", 213 | "source": "https://github.com/laravel/pint" 214 | }, 215 | "time": "2023-04-25T14:52:30+00:00" 216 | }, 217 | { 218 | "name": "myclabs/deep-copy", 219 | "version": "1.11.1", 220 | "source": { 221 | "type": "git", 222 | "url": "https://github.com/myclabs/DeepCopy.git", 223 | "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c" 224 | }, 225 | "dist": { 226 | "type": "zip", 227 | "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", 228 | "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", 229 | "shasum": "" 230 | }, 231 | "require": { 232 | "php": "^7.1 || ^8.0" 233 | }, 234 | "conflict": { 235 | "doctrine/collections": "<1.6.8", 236 | "doctrine/common": "<2.13.3 || >=3,<3.2.2" 237 | }, 238 | "require-dev": { 239 | "doctrine/collections": "^1.6.8", 240 | "doctrine/common": "^2.13.3 || ^3.2.2", 241 | "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" 242 | }, 243 | "type": "library", 244 | "autoload": { 245 | "files": [ 246 | "src/DeepCopy/deep_copy.php" 247 | ], 248 | "psr-4": { 249 | "DeepCopy\\": "src/DeepCopy/" 250 | } 251 | }, 252 | "notification-url": "https://packagist.org/downloads/", 253 | "license": [ 254 | "MIT" 255 | ], 256 | "description": "Create deep copies (clones) of your objects", 257 | "keywords": [ 258 | "clone", 259 | "copy", 260 | "duplicate", 261 | "object", 262 | "object graph" 263 | ], 264 | "support": { 265 | "issues": "https://github.com/myclabs/DeepCopy/issues", 266 | "source": "https://github.com/myclabs/DeepCopy/tree/1.11.1" 267 | }, 268 | "funding": [ 269 | { 270 | "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", 271 | "type": "tidelift" 272 | } 273 | ], 274 | "time": "2023-03-08T13:26:56+00:00" 275 | }, 276 | { 277 | "name": "nikic/php-parser", 278 | "version": "v4.15.4", 279 | "source": { 280 | "type": "git", 281 | "url": "https://github.com/nikic/PHP-Parser.git", 282 | "reference": "6bb5176bc4af8bcb7d926f88718db9b96a2d4290" 283 | }, 284 | "dist": { 285 | "type": "zip", 286 | "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/6bb5176bc4af8bcb7d926f88718db9b96a2d4290", 287 | "reference": "6bb5176bc4af8bcb7d926f88718db9b96a2d4290", 288 | "shasum": "" 289 | }, 290 | "require": { 291 | "ext-tokenizer": "*", 292 | "php": ">=7.0" 293 | }, 294 | "require-dev": { 295 | "ircmaxell/php-yacc": "^0.0.7", 296 | "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0" 297 | }, 298 | "bin": [ 299 | "bin/php-parse" 300 | ], 301 | "type": "library", 302 | "extra": { 303 | "branch-alias": { 304 | "dev-master": "4.9-dev" 305 | } 306 | }, 307 | "autoload": { 308 | "psr-4": { 309 | "PhpParser\\": "lib/PhpParser" 310 | } 311 | }, 312 | "notification-url": "https://packagist.org/downloads/", 313 | "license": [ 314 | "BSD-3-Clause" 315 | ], 316 | "authors": [ 317 | { 318 | "name": "Nikita Popov" 319 | } 320 | ], 321 | "description": "A PHP parser written in PHP", 322 | "keywords": [ 323 | "parser", 324 | "php" 325 | ], 326 | "support": { 327 | "issues": "https://github.com/nikic/PHP-Parser/issues", 328 | "source": "https://github.com/nikic/PHP-Parser/tree/v4.15.4" 329 | }, 330 | "time": "2023-03-05T19:49:14+00:00" 331 | }, 332 | { 333 | "name": "nunomaduro/collision", 334 | "version": "v6.4.0", 335 | "source": { 336 | "type": "git", 337 | "url": "https://github.com/nunomaduro/collision.git", 338 | "reference": "f05978827b9343cba381ca05b8c7deee346b6015" 339 | }, 340 | "dist": { 341 | "type": "zip", 342 | "url": "https://api.github.com/repos/nunomaduro/collision/zipball/f05978827b9343cba381ca05b8c7deee346b6015", 343 | "reference": "f05978827b9343cba381ca05b8c7deee346b6015", 344 | "shasum": "" 345 | }, 346 | "require": { 347 | "filp/whoops": "^2.14.5", 348 | "php": "^8.0.0", 349 | "symfony/console": "^6.0.2" 350 | }, 351 | "require-dev": { 352 | "brianium/paratest": "^6.4.1", 353 | "laravel/framework": "^9.26.1", 354 | "laravel/pint": "^1.1.1", 355 | "nunomaduro/larastan": "^1.0.3", 356 | "nunomaduro/mock-final-classes": "^1.1.0", 357 | "orchestra/testbench": "^7.7", 358 | "phpunit/phpunit": "^9.5.23", 359 | "spatie/ignition": "^1.4.1" 360 | }, 361 | "type": "library", 362 | "extra": { 363 | "branch-alias": { 364 | "dev-develop": "6.x-dev" 365 | }, 366 | "laravel": { 367 | "providers": [ 368 | "NunoMaduro\\Collision\\Adapters\\Laravel\\CollisionServiceProvider" 369 | ] 370 | } 371 | }, 372 | "autoload": { 373 | "psr-4": { 374 | "NunoMaduro\\Collision\\": "src/" 375 | } 376 | }, 377 | "notification-url": "https://packagist.org/downloads/", 378 | "license": [ 379 | "MIT" 380 | ], 381 | "authors": [ 382 | { 383 | "name": "Nuno Maduro", 384 | "email": "enunomaduro@gmail.com" 385 | } 386 | ], 387 | "description": "Cli error handling for console/command-line PHP applications.", 388 | "keywords": [ 389 | "artisan", 390 | "cli", 391 | "command-line", 392 | "console", 393 | "error", 394 | "handling", 395 | "laravel", 396 | "laravel-zero", 397 | "php", 398 | "symfony" 399 | ], 400 | "support": { 401 | "issues": "https://github.com/nunomaduro/collision/issues", 402 | "source": "https://github.com/nunomaduro/collision" 403 | }, 404 | "funding": [ 405 | { 406 | "url": "https://www.paypal.com/paypalme/enunomaduro", 407 | "type": "custom" 408 | }, 409 | { 410 | "url": "https://github.com/nunomaduro", 411 | "type": "github" 412 | }, 413 | { 414 | "url": "https://www.patreon.com/nunomaduro", 415 | "type": "patreon" 416 | } 417 | ], 418 | "time": "2023-01-03T12:54:54+00:00" 419 | }, 420 | { 421 | "name": "pestphp/pest", 422 | "version": "v1.23.0", 423 | "source": { 424 | "type": "git", 425 | "url": "https://github.com/pestphp/pest.git", 426 | "reference": "061c9de301531e500a8157b476a5899361e60068" 427 | }, 428 | "dist": { 429 | "type": "zip", 430 | "url": "https://api.github.com/repos/pestphp/pest/zipball/061c9de301531e500a8157b476a5899361e60068", 431 | "reference": "061c9de301531e500a8157b476a5899361e60068", 432 | "shasum": "" 433 | }, 434 | "require": { 435 | "nunomaduro/collision": "^5.11.0|^6.4.0", 436 | "pestphp/pest-plugin": "^1.1.0", 437 | "php": "^7.3 || ^8.0", 438 | "phpunit/phpunit": "^9.6.7" 439 | }, 440 | "require-dev": { 441 | "illuminate/console": "^8.83.27", 442 | "illuminate/support": "^8.83.27", 443 | "laravel/dusk": "^6.25.2", 444 | "pestphp/pest-dev-tools": "^1.0.0", 445 | "pestphp/pest-plugin-parallel": "^1.2.1" 446 | }, 447 | "bin": [ 448 | "bin/pest" 449 | ], 450 | "type": "library", 451 | "extra": { 452 | "branch-alias": { 453 | "dev-1.x": "1.x-dev" 454 | }, 455 | "pest": { 456 | "plugins": [ 457 | "Pest\\Plugins\\Coverage", 458 | "Pest\\Plugins\\Init", 459 | "Pest\\Plugins\\Version", 460 | "Pest\\Plugins\\Environment" 461 | ] 462 | }, 463 | "laravel": { 464 | "providers": [ 465 | "Pest\\Laravel\\PestServiceProvider" 466 | ] 467 | } 468 | }, 469 | "autoload": { 470 | "files": [ 471 | "src/Functions.php", 472 | "src/Pest.php" 473 | ], 474 | "psr-4": { 475 | "Pest\\": "src/" 476 | } 477 | }, 478 | "notification-url": "https://packagist.org/downloads/", 479 | "license": [ 480 | "MIT" 481 | ], 482 | "authors": [ 483 | { 484 | "name": "Nuno Maduro", 485 | "email": "enunomaduro@gmail.com" 486 | } 487 | ], 488 | "description": "An elegant PHP Testing Framework.", 489 | "keywords": [ 490 | "framework", 491 | "pest", 492 | "php", 493 | "test", 494 | "testing", 495 | "unit" 496 | ], 497 | "support": { 498 | "issues": "https://github.com/pestphp/pest/issues", 499 | "source": "https://github.com/pestphp/pest/tree/v1.23.0" 500 | }, 501 | "funding": [ 502 | { 503 | "url": "https://www.paypal.com/paypalme/enunomaduro", 504 | "type": "custom" 505 | }, 506 | { 507 | "url": "https://github.com/nunomaduro", 508 | "type": "github" 509 | } 510 | ], 511 | "time": "2023-04-19T20:10:22+00:00" 512 | }, 513 | { 514 | "name": "pestphp/pest-plugin", 515 | "version": "v1.1.0", 516 | "source": { 517 | "type": "git", 518 | "url": "https://github.com/pestphp/pest-plugin.git", 519 | "reference": "606c5f79c6a339b49838ffbee0151ca519efe378" 520 | }, 521 | "dist": { 522 | "type": "zip", 523 | "url": "https://api.github.com/repos/pestphp/pest-plugin/zipball/606c5f79c6a339b49838ffbee0151ca519efe378", 524 | "reference": "606c5f79c6a339b49838ffbee0151ca519efe378", 525 | "shasum": "" 526 | }, 527 | "require": { 528 | "composer-plugin-api": "^1.1.0 || ^2.0.0", 529 | "php": "^7.3 || ^8.0" 530 | }, 531 | "conflict": { 532 | "pestphp/pest": "<1.0" 533 | }, 534 | "require-dev": { 535 | "composer/composer": "^2.4.2", 536 | "pestphp/pest": "^1.22.1", 537 | "pestphp/pest-dev-tools": "^1.0.0" 538 | }, 539 | "type": "composer-plugin", 540 | "extra": { 541 | "branch-alias": { 542 | "dev-master": "1.x-dev" 543 | }, 544 | "class": "Pest\\Plugin\\Manager" 545 | }, 546 | "autoload": { 547 | "psr-4": { 548 | "Pest\\Plugin\\": "src/" 549 | } 550 | }, 551 | "notification-url": "https://packagist.org/downloads/", 552 | "license": [ 553 | "MIT" 554 | ], 555 | "description": "The Pest plugin manager", 556 | "keywords": [ 557 | "framework", 558 | "manager", 559 | "pest", 560 | "php", 561 | "plugin", 562 | "test", 563 | "testing", 564 | "unit" 565 | ], 566 | "support": { 567 | "source": "https://github.com/pestphp/pest-plugin/tree/v1.1.0" 568 | }, 569 | "funding": [ 570 | { 571 | "url": "https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=66BYDWAT92N6L", 572 | "type": "custom" 573 | }, 574 | { 575 | "url": "https://github.com/nunomaduro", 576 | "type": "github" 577 | }, 578 | { 579 | "url": "https://www.patreon.com/nunomaduro", 580 | "type": "patreon" 581 | } 582 | ], 583 | "time": "2022-09-18T13:18:17+00:00" 584 | }, 585 | { 586 | "name": "phar-io/manifest", 587 | "version": "2.0.3", 588 | "source": { 589 | "type": "git", 590 | "url": "https://github.com/phar-io/manifest.git", 591 | "reference": "97803eca37d319dfa7826cc2437fc020857acb53" 592 | }, 593 | "dist": { 594 | "type": "zip", 595 | "url": "https://api.github.com/repos/phar-io/manifest/zipball/97803eca37d319dfa7826cc2437fc020857acb53", 596 | "reference": "97803eca37d319dfa7826cc2437fc020857acb53", 597 | "shasum": "" 598 | }, 599 | "require": { 600 | "ext-dom": "*", 601 | "ext-phar": "*", 602 | "ext-xmlwriter": "*", 603 | "phar-io/version": "^3.0.1", 604 | "php": "^7.2 || ^8.0" 605 | }, 606 | "type": "library", 607 | "extra": { 608 | "branch-alias": { 609 | "dev-master": "2.0.x-dev" 610 | } 611 | }, 612 | "autoload": { 613 | "classmap": [ 614 | "src/" 615 | ] 616 | }, 617 | "notification-url": "https://packagist.org/downloads/", 618 | "license": [ 619 | "BSD-3-Clause" 620 | ], 621 | "authors": [ 622 | { 623 | "name": "Arne Blankerts", 624 | "email": "arne@blankerts.de", 625 | "role": "Developer" 626 | }, 627 | { 628 | "name": "Sebastian Heuer", 629 | "email": "sebastian@phpeople.de", 630 | "role": "Developer" 631 | }, 632 | { 633 | "name": "Sebastian Bergmann", 634 | "email": "sebastian@phpunit.de", 635 | "role": "Developer" 636 | } 637 | ], 638 | "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", 639 | "support": { 640 | "issues": "https://github.com/phar-io/manifest/issues", 641 | "source": "https://github.com/phar-io/manifest/tree/2.0.3" 642 | }, 643 | "time": "2021-07-20T11:28:43+00:00" 644 | }, 645 | { 646 | "name": "phar-io/version", 647 | "version": "3.2.1", 648 | "source": { 649 | "type": "git", 650 | "url": "https://github.com/phar-io/version.git", 651 | "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" 652 | }, 653 | "dist": { 654 | "type": "zip", 655 | "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", 656 | "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", 657 | "shasum": "" 658 | }, 659 | "require": { 660 | "php": "^7.2 || ^8.0" 661 | }, 662 | "type": "library", 663 | "autoload": { 664 | "classmap": [ 665 | "src/" 666 | ] 667 | }, 668 | "notification-url": "https://packagist.org/downloads/", 669 | "license": [ 670 | "BSD-3-Clause" 671 | ], 672 | "authors": [ 673 | { 674 | "name": "Arne Blankerts", 675 | "email": "arne@blankerts.de", 676 | "role": "Developer" 677 | }, 678 | { 679 | "name": "Sebastian Heuer", 680 | "email": "sebastian@phpeople.de", 681 | "role": "Developer" 682 | }, 683 | { 684 | "name": "Sebastian Bergmann", 685 | "email": "sebastian@phpunit.de", 686 | "role": "Developer" 687 | } 688 | ], 689 | "description": "Library for handling version information and constraints", 690 | "support": { 691 | "issues": "https://github.com/phar-io/version/issues", 692 | "source": "https://github.com/phar-io/version/tree/3.2.1" 693 | }, 694 | "time": "2022-02-21T01:04:05+00:00" 695 | }, 696 | { 697 | "name": "phpunit/php-code-coverage", 698 | "version": "9.2.26", 699 | "source": { 700 | "type": "git", 701 | "url": "https://github.com/sebastianbergmann/php-code-coverage.git", 702 | "reference": "443bc6912c9bd5b409254a40f4b0f4ced7c80ea1" 703 | }, 704 | "dist": { 705 | "type": "zip", 706 | "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/443bc6912c9bd5b409254a40f4b0f4ced7c80ea1", 707 | "reference": "443bc6912c9bd5b409254a40f4b0f4ced7c80ea1", 708 | "shasum": "" 709 | }, 710 | "require": { 711 | "ext-dom": "*", 712 | "ext-libxml": "*", 713 | "ext-xmlwriter": "*", 714 | "nikic/php-parser": "^4.15", 715 | "php": ">=7.3", 716 | "phpunit/php-file-iterator": "^3.0.3", 717 | "phpunit/php-text-template": "^2.0.2", 718 | "sebastian/code-unit-reverse-lookup": "^2.0.2", 719 | "sebastian/complexity": "^2.0", 720 | "sebastian/environment": "^5.1.2", 721 | "sebastian/lines-of-code": "^1.0.3", 722 | "sebastian/version": "^3.0.1", 723 | "theseer/tokenizer": "^1.2.0" 724 | }, 725 | "require-dev": { 726 | "phpunit/phpunit": "^9.3" 727 | }, 728 | "suggest": { 729 | "ext-pcov": "PHP extension that provides line coverage", 730 | "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" 731 | }, 732 | "type": "library", 733 | "extra": { 734 | "branch-alias": { 735 | "dev-master": "9.2-dev" 736 | } 737 | }, 738 | "autoload": { 739 | "classmap": [ 740 | "src/" 741 | ] 742 | }, 743 | "notification-url": "https://packagist.org/downloads/", 744 | "license": [ 745 | "BSD-3-Clause" 746 | ], 747 | "authors": [ 748 | { 749 | "name": "Sebastian Bergmann", 750 | "email": "sebastian@phpunit.de", 751 | "role": "lead" 752 | } 753 | ], 754 | "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", 755 | "homepage": "https://github.com/sebastianbergmann/php-code-coverage", 756 | "keywords": [ 757 | "coverage", 758 | "testing", 759 | "xunit" 760 | ], 761 | "support": { 762 | "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", 763 | "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.26" 764 | }, 765 | "funding": [ 766 | { 767 | "url": "https://github.com/sebastianbergmann", 768 | "type": "github" 769 | } 770 | ], 771 | "time": "2023-03-06T12:58:08+00:00" 772 | }, 773 | { 774 | "name": "phpunit/php-file-iterator", 775 | "version": "3.0.6", 776 | "source": { 777 | "type": "git", 778 | "url": "https://github.com/sebastianbergmann/php-file-iterator.git", 779 | "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf" 780 | }, 781 | "dist": { 782 | "type": "zip", 783 | "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", 784 | "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", 785 | "shasum": "" 786 | }, 787 | "require": { 788 | "php": ">=7.3" 789 | }, 790 | "require-dev": { 791 | "phpunit/phpunit": "^9.3" 792 | }, 793 | "type": "library", 794 | "extra": { 795 | "branch-alias": { 796 | "dev-master": "3.0-dev" 797 | } 798 | }, 799 | "autoload": { 800 | "classmap": [ 801 | "src/" 802 | ] 803 | }, 804 | "notification-url": "https://packagist.org/downloads/", 805 | "license": [ 806 | "BSD-3-Clause" 807 | ], 808 | "authors": [ 809 | { 810 | "name": "Sebastian Bergmann", 811 | "email": "sebastian@phpunit.de", 812 | "role": "lead" 813 | } 814 | ], 815 | "description": "FilterIterator implementation that filters files based on a list of suffixes.", 816 | "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", 817 | "keywords": [ 818 | "filesystem", 819 | "iterator" 820 | ], 821 | "support": { 822 | "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", 823 | "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.6" 824 | }, 825 | "funding": [ 826 | { 827 | "url": "https://github.com/sebastianbergmann", 828 | "type": "github" 829 | } 830 | ], 831 | "time": "2021-12-02T12:48:52+00:00" 832 | }, 833 | { 834 | "name": "phpunit/php-invoker", 835 | "version": "3.1.1", 836 | "source": { 837 | "type": "git", 838 | "url": "https://github.com/sebastianbergmann/php-invoker.git", 839 | "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67" 840 | }, 841 | "dist": { 842 | "type": "zip", 843 | "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67", 844 | "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67", 845 | "shasum": "" 846 | }, 847 | "require": { 848 | "php": ">=7.3" 849 | }, 850 | "require-dev": { 851 | "ext-pcntl": "*", 852 | "phpunit/phpunit": "^9.3" 853 | }, 854 | "suggest": { 855 | "ext-pcntl": "*" 856 | }, 857 | "type": "library", 858 | "extra": { 859 | "branch-alias": { 860 | "dev-master": "3.1-dev" 861 | } 862 | }, 863 | "autoload": { 864 | "classmap": [ 865 | "src/" 866 | ] 867 | }, 868 | "notification-url": "https://packagist.org/downloads/", 869 | "license": [ 870 | "BSD-3-Clause" 871 | ], 872 | "authors": [ 873 | { 874 | "name": "Sebastian Bergmann", 875 | "email": "sebastian@phpunit.de", 876 | "role": "lead" 877 | } 878 | ], 879 | "description": "Invoke callables with a timeout", 880 | "homepage": "https://github.com/sebastianbergmann/php-invoker/", 881 | "keywords": [ 882 | "process" 883 | ], 884 | "support": { 885 | "issues": "https://github.com/sebastianbergmann/php-invoker/issues", 886 | "source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1" 887 | }, 888 | "funding": [ 889 | { 890 | "url": "https://github.com/sebastianbergmann", 891 | "type": "github" 892 | } 893 | ], 894 | "time": "2020-09-28T05:58:55+00:00" 895 | }, 896 | { 897 | "name": "phpunit/php-text-template", 898 | "version": "2.0.4", 899 | "source": { 900 | "type": "git", 901 | "url": "https://github.com/sebastianbergmann/php-text-template.git", 902 | "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28" 903 | }, 904 | "dist": { 905 | "type": "zip", 906 | "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", 907 | "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", 908 | "shasum": "" 909 | }, 910 | "require": { 911 | "php": ">=7.3" 912 | }, 913 | "require-dev": { 914 | "phpunit/phpunit": "^9.3" 915 | }, 916 | "type": "library", 917 | "extra": { 918 | "branch-alias": { 919 | "dev-master": "2.0-dev" 920 | } 921 | }, 922 | "autoload": { 923 | "classmap": [ 924 | "src/" 925 | ] 926 | }, 927 | "notification-url": "https://packagist.org/downloads/", 928 | "license": [ 929 | "BSD-3-Clause" 930 | ], 931 | "authors": [ 932 | { 933 | "name": "Sebastian Bergmann", 934 | "email": "sebastian@phpunit.de", 935 | "role": "lead" 936 | } 937 | ], 938 | "description": "Simple template engine.", 939 | "homepage": "https://github.com/sebastianbergmann/php-text-template/", 940 | "keywords": [ 941 | "template" 942 | ], 943 | "support": { 944 | "issues": "https://github.com/sebastianbergmann/php-text-template/issues", 945 | "source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4" 946 | }, 947 | "funding": [ 948 | { 949 | "url": "https://github.com/sebastianbergmann", 950 | "type": "github" 951 | } 952 | ], 953 | "time": "2020-10-26T05:33:50+00:00" 954 | }, 955 | { 956 | "name": "phpunit/php-timer", 957 | "version": "5.0.3", 958 | "source": { 959 | "type": "git", 960 | "url": "https://github.com/sebastianbergmann/php-timer.git", 961 | "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2" 962 | }, 963 | "dist": { 964 | "type": "zip", 965 | "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", 966 | "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", 967 | "shasum": "" 968 | }, 969 | "require": { 970 | "php": ">=7.3" 971 | }, 972 | "require-dev": { 973 | "phpunit/phpunit": "^9.3" 974 | }, 975 | "type": "library", 976 | "extra": { 977 | "branch-alias": { 978 | "dev-master": "5.0-dev" 979 | } 980 | }, 981 | "autoload": { 982 | "classmap": [ 983 | "src/" 984 | ] 985 | }, 986 | "notification-url": "https://packagist.org/downloads/", 987 | "license": [ 988 | "BSD-3-Clause" 989 | ], 990 | "authors": [ 991 | { 992 | "name": "Sebastian Bergmann", 993 | "email": "sebastian@phpunit.de", 994 | "role": "lead" 995 | } 996 | ], 997 | "description": "Utility class for timing", 998 | "homepage": "https://github.com/sebastianbergmann/php-timer/", 999 | "keywords": [ 1000 | "timer" 1001 | ], 1002 | "support": { 1003 | "issues": "https://github.com/sebastianbergmann/php-timer/issues", 1004 | "source": "https://github.com/sebastianbergmann/php-timer/tree/5.0.3" 1005 | }, 1006 | "funding": [ 1007 | { 1008 | "url": "https://github.com/sebastianbergmann", 1009 | "type": "github" 1010 | } 1011 | ], 1012 | "time": "2020-10-26T13:16:10+00:00" 1013 | }, 1014 | { 1015 | "name": "phpunit/phpunit", 1016 | "version": "9.6.8", 1017 | "source": { 1018 | "type": "git", 1019 | "url": "https://github.com/sebastianbergmann/phpunit.git", 1020 | "reference": "17d621b3aff84d0c8b62539e269e87d8d5baa76e" 1021 | }, 1022 | "dist": { 1023 | "type": "zip", 1024 | "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/17d621b3aff84d0c8b62539e269e87d8d5baa76e", 1025 | "reference": "17d621b3aff84d0c8b62539e269e87d8d5baa76e", 1026 | "shasum": "" 1027 | }, 1028 | "require": { 1029 | "doctrine/instantiator": "^1.3.1 || ^2", 1030 | "ext-dom": "*", 1031 | "ext-json": "*", 1032 | "ext-libxml": "*", 1033 | "ext-mbstring": "*", 1034 | "ext-xml": "*", 1035 | "ext-xmlwriter": "*", 1036 | "myclabs/deep-copy": "^1.10.1", 1037 | "phar-io/manifest": "^2.0.3", 1038 | "phar-io/version": "^3.0.2", 1039 | "php": ">=7.3", 1040 | "phpunit/php-code-coverage": "^9.2.13", 1041 | "phpunit/php-file-iterator": "^3.0.5", 1042 | "phpunit/php-invoker": "^3.1.1", 1043 | "phpunit/php-text-template": "^2.0.3", 1044 | "phpunit/php-timer": "^5.0.2", 1045 | "sebastian/cli-parser": "^1.0.1", 1046 | "sebastian/code-unit": "^1.0.6", 1047 | "sebastian/comparator": "^4.0.8", 1048 | "sebastian/diff": "^4.0.3", 1049 | "sebastian/environment": "^5.1.3", 1050 | "sebastian/exporter": "^4.0.5", 1051 | "sebastian/global-state": "^5.0.1", 1052 | "sebastian/object-enumerator": "^4.0.3", 1053 | "sebastian/resource-operations": "^3.0.3", 1054 | "sebastian/type": "^3.2", 1055 | "sebastian/version": "^3.0.2" 1056 | }, 1057 | "suggest": { 1058 | "ext-soap": "To be able to generate mocks based on WSDL files", 1059 | "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" 1060 | }, 1061 | "bin": [ 1062 | "phpunit" 1063 | ], 1064 | "type": "library", 1065 | "extra": { 1066 | "branch-alias": { 1067 | "dev-master": "9.6-dev" 1068 | } 1069 | }, 1070 | "autoload": { 1071 | "files": [ 1072 | "src/Framework/Assert/Functions.php" 1073 | ], 1074 | "classmap": [ 1075 | "src/" 1076 | ] 1077 | }, 1078 | "notification-url": "https://packagist.org/downloads/", 1079 | "license": [ 1080 | "BSD-3-Clause" 1081 | ], 1082 | "authors": [ 1083 | { 1084 | "name": "Sebastian Bergmann", 1085 | "email": "sebastian@phpunit.de", 1086 | "role": "lead" 1087 | } 1088 | ], 1089 | "description": "The PHP Unit Testing framework.", 1090 | "homepage": "https://phpunit.de/", 1091 | "keywords": [ 1092 | "phpunit", 1093 | "testing", 1094 | "xunit" 1095 | ], 1096 | "support": { 1097 | "issues": "https://github.com/sebastianbergmann/phpunit/issues", 1098 | "security": "https://github.com/sebastianbergmann/phpunit/security/policy", 1099 | "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.8" 1100 | }, 1101 | "funding": [ 1102 | { 1103 | "url": "https://phpunit.de/sponsors.html", 1104 | "type": "custom" 1105 | }, 1106 | { 1107 | "url": "https://github.com/sebastianbergmann", 1108 | "type": "github" 1109 | }, 1110 | { 1111 | "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", 1112 | "type": "tidelift" 1113 | } 1114 | ], 1115 | "time": "2023-05-11T05:14:45+00:00" 1116 | }, 1117 | { 1118 | "name": "psr/container", 1119 | "version": "2.0.2", 1120 | "source": { 1121 | "type": "git", 1122 | "url": "https://github.com/php-fig/container.git", 1123 | "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" 1124 | }, 1125 | "dist": { 1126 | "type": "zip", 1127 | "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", 1128 | "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", 1129 | "shasum": "" 1130 | }, 1131 | "require": { 1132 | "php": ">=7.4.0" 1133 | }, 1134 | "type": "library", 1135 | "extra": { 1136 | "branch-alias": { 1137 | "dev-master": "2.0.x-dev" 1138 | } 1139 | }, 1140 | "autoload": { 1141 | "psr-4": { 1142 | "Psr\\Container\\": "src/" 1143 | } 1144 | }, 1145 | "notification-url": "https://packagist.org/downloads/", 1146 | "license": [ 1147 | "MIT" 1148 | ], 1149 | "authors": [ 1150 | { 1151 | "name": "PHP-FIG", 1152 | "homepage": "https://www.php-fig.org/" 1153 | } 1154 | ], 1155 | "description": "Common Container Interface (PHP FIG PSR-11)", 1156 | "homepage": "https://github.com/php-fig/container", 1157 | "keywords": [ 1158 | "PSR-11", 1159 | "container", 1160 | "container-interface", 1161 | "container-interop", 1162 | "psr" 1163 | ], 1164 | "support": { 1165 | "issues": "https://github.com/php-fig/container/issues", 1166 | "source": "https://github.com/php-fig/container/tree/2.0.2" 1167 | }, 1168 | "time": "2021-11-05T16:47:00+00:00" 1169 | }, 1170 | { 1171 | "name": "psr/log", 1172 | "version": "3.0.0", 1173 | "source": { 1174 | "type": "git", 1175 | "url": "https://github.com/php-fig/log.git", 1176 | "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001" 1177 | }, 1178 | "dist": { 1179 | "type": "zip", 1180 | "url": "https://api.github.com/repos/php-fig/log/zipball/fe5ea303b0887d5caefd3d431c3e61ad47037001", 1181 | "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001", 1182 | "shasum": "" 1183 | }, 1184 | "require": { 1185 | "php": ">=8.0.0" 1186 | }, 1187 | "type": "library", 1188 | "extra": { 1189 | "branch-alias": { 1190 | "dev-master": "3.x-dev" 1191 | } 1192 | }, 1193 | "autoload": { 1194 | "psr-4": { 1195 | "Psr\\Log\\": "src" 1196 | } 1197 | }, 1198 | "notification-url": "https://packagist.org/downloads/", 1199 | "license": [ 1200 | "MIT" 1201 | ], 1202 | "authors": [ 1203 | { 1204 | "name": "PHP-FIG", 1205 | "homepage": "https://www.php-fig.org/" 1206 | } 1207 | ], 1208 | "description": "Common interface for logging libraries", 1209 | "homepage": "https://github.com/php-fig/log", 1210 | "keywords": [ 1211 | "log", 1212 | "psr", 1213 | "psr-3" 1214 | ], 1215 | "support": { 1216 | "source": "https://github.com/php-fig/log/tree/3.0.0" 1217 | }, 1218 | "time": "2021-07-14T16:46:02+00:00" 1219 | }, 1220 | { 1221 | "name": "sebastian/cli-parser", 1222 | "version": "1.0.1", 1223 | "source": { 1224 | "type": "git", 1225 | "url": "https://github.com/sebastianbergmann/cli-parser.git", 1226 | "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2" 1227 | }, 1228 | "dist": { 1229 | "type": "zip", 1230 | "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/442e7c7e687e42adc03470c7b668bc4b2402c0b2", 1231 | "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2", 1232 | "shasum": "" 1233 | }, 1234 | "require": { 1235 | "php": ">=7.3" 1236 | }, 1237 | "require-dev": { 1238 | "phpunit/phpunit": "^9.3" 1239 | }, 1240 | "type": "library", 1241 | "extra": { 1242 | "branch-alias": { 1243 | "dev-master": "1.0-dev" 1244 | } 1245 | }, 1246 | "autoload": { 1247 | "classmap": [ 1248 | "src/" 1249 | ] 1250 | }, 1251 | "notification-url": "https://packagist.org/downloads/", 1252 | "license": [ 1253 | "BSD-3-Clause" 1254 | ], 1255 | "authors": [ 1256 | { 1257 | "name": "Sebastian Bergmann", 1258 | "email": "sebastian@phpunit.de", 1259 | "role": "lead" 1260 | } 1261 | ], 1262 | "description": "Library for parsing CLI options", 1263 | "homepage": "https://github.com/sebastianbergmann/cli-parser", 1264 | "support": { 1265 | "issues": "https://github.com/sebastianbergmann/cli-parser/issues", 1266 | "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.1" 1267 | }, 1268 | "funding": [ 1269 | { 1270 | "url": "https://github.com/sebastianbergmann", 1271 | "type": "github" 1272 | } 1273 | ], 1274 | "time": "2020-09-28T06:08:49+00:00" 1275 | }, 1276 | { 1277 | "name": "sebastian/code-unit", 1278 | "version": "1.0.8", 1279 | "source": { 1280 | "type": "git", 1281 | "url": "https://github.com/sebastianbergmann/code-unit.git", 1282 | "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120" 1283 | }, 1284 | "dist": { 1285 | "type": "zip", 1286 | "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/1fc9f64c0927627ef78ba436c9b17d967e68e120", 1287 | "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120", 1288 | "shasum": "" 1289 | }, 1290 | "require": { 1291 | "php": ">=7.3" 1292 | }, 1293 | "require-dev": { 1294 | "phpunit/phpunit": "^9.3" 1295 | }, 1296 | "type": "library", 1297 | "extra": { 1298 | "branch-alias": { 1299 | "dev-master": "1.0-dev" 1300 | } 1301 | }, 1302 | "autoload": { 1303 | "classmap": [ 1304 | "src/" 1305 | ] 1306 | }, 1307 | "notification-url": "https://packagist.org/downloads/", 1308 | "license": [ 1309 | "BSD-3-Clause" 1310 | ], 1311 | "authors": [ 1312 | { 1313 | "name": "Sebastian Bergmann", 1314 | "email": "sebastian@phpunit.de", 1315 | "role": "lead" 1316 | } 1317 | ], 1318 | "description": "Collection of value objects that represent the PHP code units", 1319 | "homepage": "https://github.com/sebastianbergmann/code-unit", 1320 | "support": { 1321 | "issues": "https://github.com/sebastianbergmann/code-unit/issues", 1322 | "source": "https://github.com/sebastianbergmann/code-unit/tree/1.0.8" 1323 | }, 1324 | "funding": [ 1325 | { 1326 | "url": "https://github.com/sebastianbergmann", 1327 | "type": "github" 1328 | } 1329 | ], 1330 | "time": "2020-10-26T13:08:54+00:00" 1331 | }, 1332 | { 1333 | "name": "sebastian/code-unit-reverse-lookup", 1334 | "version": "2.0.3", 1335 | "source": { 1336 | "type": "git", 1337 | "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", 1338 | "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5" 1339 | }, 1340 | "dist": { 1341 | "type": "zip", 1342 | "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", 1343 | "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", 1344 | "shasum": "" 1345 | }, 1346 | "require": { 1347 | "php": ">=7.3" 1348 | }, 1349 | "require-dev": { 1350 | "phpunit/phpunit": "^9.3" 1351 | }, 1352 | "type": "library", 1353 | "extra": { 1354 | "branch-alias": { 1355 | "dev-master": "2.0-dev" 1356 | } 1357 | }, 1358 | "autoload": { 1359 | "classmap": [ 1360 | "src/" 1361 | ] 1362 | }, 1363 | "notification-url": "https://packagist.org/downloads/", 1364 | "license": [ 1365 | "BSD-3-Clause" 1366 | ], 1367 | "authors": [ 1368 | { 1369 | "name": "Sebastian Bergmann", 1370 | "email": "sebastian@phpunit.de" 1371 | } 1372 | ], 1373 | "description": "Looks up which function or method a line of code belongs to", 1374 | "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", 1375 | "support": { 1376 | "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", 1377 | "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3" 1378 | }, 1379 | "funding": [ 1380 | { 1381 | "url": "https://github.com/sebastianbergmann", 1382 | "type": "github" 1383 | } 1384 | ], 1385 | "time": "2020-09-28T05:30:19+00:00" 1386 | }, 1387 | { 1388 | "name": "sebastian/comparator", 1389 | "version": "4.0.8", 1390 | "source": { 1391 | "type": "git", 1392 | "url": "https://github.com/sebastianbergmann/comparator.git", 1393 | "reference": "fa0f136dd2334583309d32b62544682ee972b51a" 1394 | }, 1395 | "dist": { 1396 | "type": "zip", 1397 | "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/fa0f136dd2334583309d32b62544682ee972b51a", 1398 | "reference": "fa0f136dd2334583309d32b62544682ee972b51a", 1399 | "shasum": "" 1400 | }, 1401 | "require": { 1402 | "php": ">=7.3", 1403 | "sebastian/diff": "^4.0", 1404 | "sebastian/exporter": "^4.0" 1405 | }, 1406 | "require-dev": { 1407 | "phpunit/phpunit": "^9.3" 1408 | }, 1409 | "type": "library", 1410 | "extra": { 1411 | "branch-alias": { 1412 | "dev-master": "4.0-dev" 1413 | } 1414 | }, 1415 | "autoload": { 1416 | "classmap": [ 1417 | "src/" 1418 | ] 1419 | }, 1420 | "notification-url": "https://packagist.org/downloads/", 1421 | "license": [ 1422 | "BSD-3-Clause" 1423 | ], 1424 | "authors": [ 1425 | { 1426 | "name": "Sebastian Bergmann", 1427 | "email": "sebastian@phpunit.de" 1428 | }, 1429 | { 1430 | "name": "Jeff Welch", 1431 | "email": "whatthejeff@gmail.com" 1432 | }, 1433 | { 1434 | "name": "Volker Dusch", 1435 | "email": "github@wallbash.com" 1436 | }, 1437 | { 1438 | "name": "Bernhard Schussek", 1439 | "email": "bschussek@2bepublished.at" 1440 | } 1441 | ], 1442 | "description": "Provides the functionality to compare PHP values for equality", 1443 | "homepage": "https://github.com/sebastianbergmann/comparator", 1444 | "keywords": [ 1445 | "comparator", 1446 | "compare", 1447 | "equality" 1448 | ], 1449 | "support": { 1450 | "issues": "https://github.com/sebastianbergmann/comparator/issues", 1451 | "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.8" 1452 | }, 1453 | "funding": [ 1454 | { 1455 | "url": "https://github.com/sebastianbergmann", 1456 | "type": "github" 1457 | } 1458 | ], 1459 | "time": "2022-09-14T12:41:17+00:00" 1460 | }, 1461 | { 1462 | "name": "sebastian/complexity", 1463 | "version": "2.0.2", 1464 | "source": { 1465 | "type": "git", 1466 | "url": "https://github.com/sebastianbergmann/complexity.git", 1467 | "reference": "739b35e53379900cc9ac327b2147867b8b6efd88" 1468 | }, 1469 | "dist": { 1470 | "type": "zip", 1471 | "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/739b35e53379900cc9ac327b2147867b8b6efd88", 1472 | "reference": "739b35e53379900cc9ac327b2147867b8b6efd88", 1473 | "shasum": "" 1474 | }, 1475 | "require": { 1476 | "nikic/php-parser": "^4.7", 1477 | "php": ">=7.3" 1478 | }, 1479 | "require-dev": { 1480 | "phpunit/phpunit": "^9.3" 1481 | }, 1482 | "type": "library", 1483 | "extra": { 1484 | "branch-alias": { 1485 | "dev-master": "2.0-dev" 1486 | } 1487 | }, 1488 | "autoload": { 1489 | "classmap": [ 1490 | "src/" 1491 | ] 1492 | }, 1493 | "notification-url": "https://packagist.org/downloads/", 1494 | "license": [ 1495 | "BSD-3-Clause" 1496 | ], 1497 | "authors": [ 1498 | { 1499 | "name": "Sebastian Bergmann", 1500 | "email": "sebastian@phpunit.de", 1501 | "role": "lead" 1502 | } 1503 | ], 1504 | "description": "Library for calculating the complexity of PHP code units", 1505 | "homepage": "https://github.com/sebastianbergmann/complexity", 1506 | "support": { 1507 | "issues": "https://github.com/sebastianbergmann/complexity/issues", 1508 | "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.2" 1509 | }, 1510 | "funding": [ 1511 | { 1512 | "url": "https://github.com/sebastianbergmann", 1513 | "type": "github" 1514 | } 1515 | ], 1516 | "time": "2020-10-26T15:52:27+00:00" 1517 | }, 1518 | { 1519 | "name": "sebastian/diff", 1520 | "version": "4.0.5", 1521 | "source": { 1522 | "type": "git", 1523 | "url": "https://github.com/sebastianbergmann/diff.git", 1524 | "reference": "74be17022044ebaaecfdf0c5cd504fc9cd5a7131" 1525 | }, 1526 | "dist": { 1527 | "type": "zip", 1528 | "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/74be17022044ebaaecfdf0c5cd504fc9cd5a7131", 1529 | "reference": "74be17022044ebaaecfdf0c5cd504fc9cd5a7131", 1530 | "shasum": "" 1531 | }, 1532 | "require": { 1533 | "php": ">=7.3" 1534 | }, 1535 | "require-dev": { 1536 | "phpunit/phpunit": "^9.3", 1537 | "symfony/process": "^4.2 || ^5" 1538 | }, 1539 | "type": "library", 1540 | "extra": { 1541 | "branch-alias": { 1542 | "dev-master": "4.0-dev" 1543 | } 1544 | }, 1545 | "autoload": { 1546 | "classmap": [ 1547 | "src/" 1548 | ] 1549 | }, 1550 | "notification-url": "https://packagist.org/downloads/", 1551 | "license": [ 1552 | "BSD-3-Clause" 1553 | ], 1554 | "authors": [ 1555 | { 1556 | "name": "Sebastian Bergmann", 1557 | "email": "sebastian@phpunit.de" 1558 | }, 1559 | { 1560 | "name": "Kore Nordmann", 1561 | "email": "mail@kore-nordmann.de" 1562 | } 1563 | ], 1564 | "description": "Diff implementation", 1565 | "homepage": "https://github.com/sebastianbergmann/diff", 1566 | "keywords": [ 1567 | "diff", 1568 | "udiff", 1569 | "unidiff", 1570 | "unified diff" 1571 | ], 1572 | "support": { 1573 | "issues": "https://github.com/sebastianbergmann/diff/issues", 1574 | "source": "https://github.com/sebastianbergmann/diff/tree/4.0.5" 1575 | }, 1576 | "funding": [ 1577 | { 1578 | "url": "https://github.com/sebastianbergmann", 1579 | "type": "github" 1580 | } 1581 | ], 1582 | "time": "2023-05-07T05:35:17+00:00" 1583 | }, 1584 | { 1585 | "name": "sebastian/environment", 1586 | "version": "5.1.5", 1587 | "source": { 1588 | "type": "git", 1589 | "url": "https://github.com/sebastianbergmann/environment.git", 1590 | "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed" 1591 | }, 1592 | "dist": { 1593 | "type": "zip", 1594 | "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/830c43a844f1f8d5b7a1f6d6076b784454d8b7ed", 1595 | "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed", 1596 | "shasum": "" 1597 | }, 1598 | "require": { 1599 | "php": ">=7.3" 1600 | }, 1601 | "require-dev": { 1602 | "phpunit/phpunit": "^9.3" 1603 | }, 1604 | "suggest": { 1605 | "ext-posix": "*" 1606 | }, 1607 | "type": "library", 1608 | "extra": { 1609 | "branch-alias": { 1610 | "dev-master": "5.1-dev" 1611 | } 1612 | }, 1613 | "autoload": { 1614 | "classmap": [ 1615 | "src/" 1616 | ] 1617 | }, 1618 | "notification-url": "https://packagist.org/downloads/", 1619 | "license": [ 1620 | "BSD-3-Clause" 1621 | ], 1622 | "authors": [ 1623 | { 1624 | "name": "Sebastian Bergmann", 1625 | "email": "sebastian@phpunit.de" 1626 | } 1627 | ], 1628 | "description": "Provides functionality to handle HHVM/PHP environments", 1629 | "homepage": "http://www.github.com/sebastianbergmann/environment", 1630 | "keywords": [ 1631 | "Xdebug", 1632 | "environment", 1633 | "hhvm" 1634 | ], 1635 | "support": { 1636 | "issues": "https://github.com/sebastianbergmann/environment/issues", 1637 | "source": "https://github.com/sebastianbergmann/environment/tree/5.1.5" 1638 | }, 1639 | "funding": [ 1640 | { 1641 | "url": "https://github.com/sebastianbergmann", 1642 | "type": "github" 1643 | } 1644 | ], 1645 | "time": "2023-02-03T06:03:51+00:00" 1646 | }, 1647 | { 1648 | "name": "sebastian/exporter", 1649 | "version": "4.0.5", 1650 | "source": { 1651 | "type": "git", 1652 | "url": "https://github.com/sebastianbergmann/exporter.git", 1653 | "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d" 1654 | }, 1655 | "dist": { 1656 | "type": "zip", 1657 | "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d", 1658 | "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d", 1659 | "shasum": "" 1660 | }, 1661 | "require": { 1662 | "php": ">=7.3", 1663 | "sebastian/recursion-context": "^4.0" 1664 | }, 1665 | "require-dev": { 1666 | "ext-mbstring": "*", 1667 | "phpunit/phpunit": "^9.3" 1668 | }, 1669 | "type": "library", 1670 | "extra": { 1671 | "branch-alias": { 1672 | "dev-master": "4.0-dev" 1673 | } 1674 | }, 1675 | "autoload": { 1676 | "classmap": [ 1677 | "src/" 1678 | ] 1679 | }, 1680 | "notification-url": "https://packagist.org/downloads/", 1681 | "license": [ 1682 | "BSD-3-Clause" 1683 | ], 1684 | "authors": [ 1685 | { 1686 | "name": "Sebastian Bergmann", 1687 | "email": "sebastian@phpunit.de" 1688 | }, 1689 | { 1690 | "name": "Jeff Welch", 1691 | "email": "whatthejeff@gmail.com" 1692 | }, 1693 | { 1694 | "name": "Volker Dusch", 1695 | "email": "github@wallbash.com" 1696 | }, 1697 | { 1698 | "name": "Adam Harvey", 1699 | "email": "aharvey@php.net" 1700 | }, 1701 | { 1702 | "name": "Bernhard Schussek", 1703 | "email": "bschussek@gmail.com" 1704 | } 1705 | ], 1706 | "description": "Provides the functionality to export PHP variables for visualization", 1707 | "homepage": "https://www.github.com/sebastianbergmann/exporter", 1708 | "keywords": [ 1709 | "export", 1710 | "exporter" 1711 | ], 1712 | "support": { 1713 | "issues": "https://github.com/sebastianbergmann/exporter/issues", 1714 | "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.5" 1715 | }, 1716 | "funding": [ 1717 | { 1718 | "url": "https://github.com/sebastianbergmann", 1719 | "type": "github" 1720 | } 1721 | ], 1722 | "time": "2022-09-14T06:03:37+00:00" 1723 | }, 1724 | { 1725 | "name": "sebastian/global-state", 1726 | "version": "5.0.5", 1727 | "source": { 1728 | "type": "git", 1729 | "url": "https://github.com/sebastianbergmann/global-state.git", 1730 | "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2" 1731 | }, 1732 | "dist": { 1733 | "type": "zip", 1734 | "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/0ca8db5a5fc9c8646244e629625ac486fa286bf2", 1735 | "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2", 1736 | "shasum": "" 1737 | }, 1738 | "require": { 1739 | "php": ">=7.3", 1740 | "sebastian/object-reflector": "^2.0", 1741 | "sebastian/recursion-context": "^4.0" 1742 | }, 1743 | "require-dev": { 1744 | "ext-dom": "*", 1745 | "phpunit/phpunit": "^9.3" 1746 | }, 1747 | "suggest": { 1748 | "ext-uopz": "*" 1749 | }, 1750 | "type": "library", 1751 | "extra": { 1752 | "branch-alias": { 1753 | "dev-master": "5.0-dev" 1754 | } 1755 | }, 1756 | "autoload": { 1757 | "classmap": [ 1758 | "src/" 1759 | ] 1760 | }, 1761 | "notification-url": "https://packagist.org/downloads/", 1762 | "license": [ 1763 | "BSD-3-Clause" 1764 | ], 1765 | "authors": [ 1766 | { 1767 | "name": "Sebastian Bergmann", 1768 | "email": "sebastian@phpunit.de" 1769 | } 1770 | ], 1771 | "description": "Snapshotting of global state", 1772 | "homepage": "http://www.github.com/sebastianbergmann/global-state", 1773 | "keywords": [ 1774 | "global state" 1775 | ], 1776 | "support": { 1777 | "issues": "https://github.com/sebastianbergmann/global-state/issues", 1778 | "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.5" 1779 | }, 1780 | "funding": [ 1781 | { 1782 | "url": "https://github.com/sebastianbergmann", 1783 | "type": "github" 1784 | } 1785 | ], 1786 | "time": "2022-02-14T08:28:10+00:00" 1787 | }, 1788 | { 1789 | "name": "sebastian/lines-of-code", 1790 | "version": "1.0.3", 1791 | "source": { 1792 | "type": "git", 1793 | "url": "https://github.com/sebastianbergmann/lines-of-code.git", 1794 | "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc" 1795 | }, 1796 | "dist": { 1797 | "type": "zip", 1798 | "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/c1c2e997aa3146983ed888ad08b15470a2e22ecc", 1799 | "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc", 1800 | "shasum": "" 1801 | }, 1802 | "require": { 1803 | "nikic/php-parser": "^4.6", 1804 | "php": ">=7.3" 1805 | }, 1806 | "require-dev": { 1807 | "phpunit/phpunit": "^9.3" 1808 | }, 1809 | "type": "library", 1810 | "extra": { 1811 | "branch-alias": { 1812 | "dev-master": "1.0-dev" 1813 | } 1814 | }, 1815 | "autoload": { 1816 | "classmap": [ 1817 | "src/" 1818 | ] 1819 | }, 1820 | "notification-url": "https://packagist.org/downloads/", 1821 | "license": [ 1822 | "BSD-3-Clause" 1823 | ], 1824 | "authors": [ 1825 | { 1826 | "name": "Sebastian Bergmann", 1827 | "email": "sebastian@phpunit.de", 1828 | "role": "lead" 1829 | } 1830 | ], 1831 | "description": "Library for counting the lines of code in PHP source code", 1832 | "homepage": "https://github.com/sebastianbergmann/lines-of-code", 1833 | "support": { 1834 | "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", 1835 | "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.3" 1836 | }, 1837 | "funding": [ 1838 | { 1839 | "url": "https://github.com/sebastianbergmann", 1840 | "type": "github" 1841 | } 1842 | ], 1843 | "time": "2020-11-28T06:42:11+00:00" 1844 | }, 1845 | { 1846 | "name": "sebastian/object-enumerator", 1847 | "version": "4.0.4", 1848 | "source": { 1849 | "type": "git", 1850 | "url": "https://github.com/sebastianbergmann/object-enumerator.git", 1851 | "reference": "5c9eeac41b290a3712d88851518825ad78f45c71" 1852 | }, 1853 | "dist": { 1854 | "type": "zip", 1855 | "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71", 1856 | "reference": "5c9eeac41b290a3712d88851518825ad78f45c71", 1857 | "shasum": "" 1858 | }, 1859 | "require": { 1860 | "php": ">=7.3", 1861 | "sebastian/object-reflector": "^2.0", 1862 | "sebastian/recursion-context": "^4.0" 1863 | }, 1864 | "require-dev": { 1865 | "phpunit/phpunit": "^9.3" 1866 | }, 1867 | "type": "library", 1868 | "extra": { 1869 | "branch-alias": { 1870 | "dev-master": "4.0-dev" 1871 | } 1872 | }, 1873 | "autoload": { 1874 | "classmap": [ 1875 | "src/" 1876 | ] 1877 | }, 1878 | "notification-url": "https://packagist.org/downloads/", 1879 | "license": [ 1880 | "BSD-3-Clause" 1881 | ], 1882 | "authors": [ 1883 | { 1884 | "name": "Sebastian Bergmann", 1885 | "email": "sebastian@phpunit.de" 1886 | } 1887 | ], 1888 | "description": "Traverses array structures and object graphs to enumerate all referenced objects", 1889 | "homepage": "https://github.com/sebastianbergmann/object-enumerator/", 1890 | "support": { 1891 | "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", 1892 | "source": "https://github.com/sebastianbergmann/object-enumerator/tree/4.0.4" 1893 | }, 1894 | "funding": [ 1895 | { 1896 | "url": "https://github.com/sebastianbergmann", 1897 | "type": "github" 1898 | } 1899 | ], 1900 | "time": "2020-10-26T13:12:34+00:00" 1901 | }, 1902 | { 1903 | "name": "sebastian/object-reflector", 1904 | "version": "2.0.4", 1905 | "source": { 1906 | "type": "git", 1907 | "url": "https://github.com/sebastianbergmann/object-reflector.git", 1908 | "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7" 1909 | }, 1910 | "dist": { 1911 | "type": "zip", 1912 | "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", 1913 | "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", 1914 | "shasum": "" 1915 | }, 1916 | "require": { 1917 | "php": ">=7.3" 1918 | }, 1919 | "require-dev": { 1920 | "phpunit/phpunit": "^9.3" 1921 | }, 1922 | "type": "library", 1923 | "extra": { 1924 | "branch-alias": { 1925 | "dev-master": "2.0-dev" 1926 | } 1927 | }, 1928 | "autoload": { 1929 | "classmap": [ 1930 | "src/" 1931 | ] 1932 | }, 1933 | "notification-url": "https://packagist.org/downloads/", 1934 | "license": [ 1935 | "BSD-3-Clause" 1936 | ], 1937 | "authors": [ 1938 | { 1939 | "name": "Sebastian Bergmann", 1940 | "email": "sebastian@phpunit.de" 1941 | } 1942 | ], 1943 | "description": "Allows reflection of object attributes, including inherited and non-public ones", 1944 | "homepage": "https://github.com/sebastianbergmann/object-reflector/", 1945 | "support": { 1946 | "issues": "https://github.com/sebastianbergmann/object-reflector/issues", 1947 | "source": "https://github.com/sebastianbergmann/object-reflector/tree/2.0.4" 1948 | }, 1949 | "funding": [ 1950 | { 1951 | "url": "https://github.com/sebastianbergmann", 1952 | "type": "github" 1953 | } 1954 | ], 1955 | "time": "2020-10-26T13:14:26+00:00" 1956 | }, 1957 | { 1958 | "name": "sebastian/recursion-context", 1959 | "version": "4.0.5", 1960 | "source": { 1961 | "type": "git", 1962 | "url": "https://github.com/sebastianbergmann/recursion-context.git", 1963 | "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1" 1964 | }, 1965 | "dist": { 1966 | "type": "zip", 1967 | "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1", 1968 | "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1", 1969 | "shasum": "" 1970 | }, 1971 | "require": { 1972 | "php": ">=7.3" 1973 | }, 1974 | "require-dev": { 1975 | "phpunit/phpunit": "^9.3" 1976 | }, 1977 | "type": "library", 1978 | "extra": { 1979 | "branch-alias": { 1980 | "dev-master": "4.0-dev" 1981 | } 1982 | }, 1983 | "autoload": { 1984 | "classmap": [ 1985 | "src/" 1986 | ] 1987 | }, 1988 | "notification-url": "https://packagist.org/downloads/", 1989 | "license": [ 1990 | "BSD-3-Clause" 1991 | ], 1992 | "authors": [ 1993 | { 1994 | "name": "Sebastian Bergmann", 1995 | "email": "sebastian@phpunit.de" 1996 | }, 1997 | { 1998 | "name": "Jeff Welch", 1999 | "email": "whatthejeff@gmail.com" 2000 | }, 2001 | { 2002 | "name": "Adam Harvey", 2003 | "email": "aharvey@php.net" 2004 | } 2005 | ], 2006 | "description": "Provides functionality to recursively process PHP variables", 2007 | "homepage": "https://github.com/sebastianbergmann/recursion-context", 2008 | "support": { 2009 | "issues": "https://github.com/sebastianbergmann/recursion-context/issues", 2010 | "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.5" 2011 | }, 2012 | "funding": [ 2013 | { 2014 | "url": "https://github.com/sebastianbergmann", 2015 | "type": "github" 2016 | } 2017 | ], 2018 | "time": "2023-02-03T06:07:39+00:00" 2019 | }, 2020 | { 2021 | "name": "sebastian/resource-operations", 2022 | "version": "3.0.3", 2023 | "source": { 2024 | "type": "git", 2025 | "url": "https://github.com/sebastianbergmann/resource-operations.git", 2026 | "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8" 2027 | }, 2028 | "dist": { 2029 | "type": "zip", 2030 | "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", 2031 | "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", 2032 | "shasum": "" 2033 | }, 2034 | "require": { 2035 | "php": ">=7.3" 2036 | }, 2037 | "require-dev": { 2038 | "phpunit/phpunit": "^9.0" 2039 | }, 2040 | "type": "library", 2041 | "extra": { 2042 | "branch-alias": { 2043 | "dev-master": "3.0-dev" 2044 | } 2045 | }, 2046 | "autoload": { 2047 | "classmap": [ 2048 | "src/" 2049 | ] 2050 | }, 2051 | "notification-url": "https://packagist.org/downloads/", 2052 | "license": [ 2053 | "BSD-3-Clause" 2054 | ], 2055 | "authors": [ 2056 | { 2057 | "name": "Sebastian Bergmann", 2058 | "email": "sebastian@phpunit.de" 2059 | } 2060 | ], 2061 | "description": "Provides a list of PHP built-in functions that operate on resources", 2062 | "homepage": "https://www.github.com/sebastianbergmann/resource-operations", 2063 | "support": { 2064 | "issues": "https://github.com/sebastianbergmann/resource-operations/issues", 2065 | "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.3" 2066 | }, 2067 | "funding": [ 2068 | { 2069 | "url": "https://github.com/sebastianbergmann", 2070 | "type": "github" 2071 | } 2072 | ], 2073 | "time": "2020-09-28T06:45:17+00:00" 2074 | }, 2075 | { 2076 | "name": "sebastian/type", 2077 | "version": "3.2.1", 2078 | "source": { 2079 | "type": "git", 2080 | "url": "https://github.com/sebastianbergmann/type.git", 2081 | "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7" 2082 | }, 2083 | "dist": { 2084 | "type": "zip", 2085 | "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7", 2086 | "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7", 2087 | "shasum": "" 2088 | }, 2089 | "require": { 2090 | "php": ">=7.3" 2091 | }, 2092 | "require-dev": { 2093 | "phpunit/phpunit": "^9.5" 2094 | }, 2095 | "type": "library", 2096 | "extra": { 2097 | "branch-alias": { 2098 | "dev-master": "3.2-dev" 2099 | } 2100 | }, 2101 | "autoload": { 2102 | "classmap": [ 2103 | "src/" 2104 | ] 2105 | }, 2106 | "notification-url": "https://packagist.org/downloads/", 2107 | "license": [ 2108 | "BSD-3-Clause" 2109 | ], 2110 | "authors": [ 2111 | { 2112 | "name": "Sebastian Bergmann", 2113 | "email": "sebastian@phpunit.de", 2114 | "role": "lead" 2115 | } 2116 | ], 2117 | "description": "Collection of value objects that represent the types of the PHP type system", 2118 | "homepage": "https://github.com/sebastianbergmann/type", 2119 | "support": { 2120 | "issues": "https://github.com/sebastianbergmann/type/issues", 2121 | "source": "https://github.com/sebastianbergmann/type/tree/3.2.1" 2122 | }, 2123 | "funding": [ 2124 | { 2125 | "url": "https://github.com/sebastianbergmann", 2126 | "type": "github" 2127 | } 2128 | ], 2129 | "time": "2023-02-03T06:13:03+00:00" 2130 | }, 2131 | { 2132 | "name": "sebastian/version", 2133 | "version": "3.0.2", 2134 | "source": { 2135 | "type": "git", 2136 | "url": "https://github.com/sebastianbergmann/version.git", 2137 | "reference": "c6c1022351a901512170118436c764e473f6de8c" 2138 | }, 2139 | "dist": { 2140 | "type": "zip", 2141 | "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c", 2142 | "reference": "c6c1022351a901512170118436c764e473f6de8c", 2143 | "shasum": "" 2144 | }, 2145 | "require": { 2146 | "php": ">=7.3" 2147 | }, 2148 | "type": "library", 2149 | "extra": { 2150 | "branch-alias": { 2151 | "dev-master": "3.0-dev" 2152 | } 2153 | }, 2154 | "autoload": { 2155 | "classmap": [ 2156 | "src/" 2157 | ] 2158 | }, 2159 | "notification-url": "https://packagist.org/downloads/", 2160 | "license": [ 2161 | "BSD-3-Clause" 2162 | ], 2163 | "authors": [ 2164 | { 2165 | "name": "Sebastian Bergmann", 2166 | "email": "sebastian@phpunit.de", 2167 | "role": "lead" 2168 | } 2169 | ], 2170 | "description": "Library that helps with managing the version number of Git-hosted PHP projects", 2171 | "homepage": "https://github.com/sebastianbergmann/version", 2172 | "support": { 2173 | "issues": "https://github.com/sebastianbergmann/version/issues", 2174 | "source": "https://github.com/sebastianbergmann/version/tree/3.0.2" 2175 | }, 2176 | "funding": [ 2177 | { 2178 | "url": "https://github.com/sebastianbergmann", 2179 | "type": "github" 2180 | } 2181 | ], 2182 | "time": "2020-09-28T06:39:44+00:00" 2183 | }, 2184 | { 2185 | "name": "symfony/console", 2186 | "version": "v6.2.10", 2187 | "source": { 2188 | "type": "git", 2189 | "url": "https://github.com/symfony/console.git", 2190 | "reference": "12288d9f4500f84a4d02254d4aa968b15488476f" 2191 | }, 2192 | "dist": { 2193 | "type": "zip", 2194 | "url": "https://api.github.com/repos/symfony/console/zipball/12288d9f4500f84a4d02254d4aa968b15488476f", 2195 | "reference": "12288d9f4500f84a4d02254d4aa968b15488476f", 2196 | "shasum": "" 2197 | }, 2198 | "require": { 2199 | "php": ">=8.1", 2200 | "symfony/deprecation-contracts": "^2.1|^3", 2201 | "symfony/polyfill-mbstring": "~1.0", 2202 | "symfony/service-contracts": "^1.1|^2|^3", 2203 | "symfony/string": "^5.4|^6.0" 2204 | }, 2205 | "conflict": { 2206 | "symfony/dependency-injection": "<5.4", 2207 | "symfony/dotenv": "<5.4", 2208 | "symfony/event-dispatcher": "<5.4", 2209 | "symfony/lock": "<5.4", 2210 | "symfony/process": "<5.4" 2211 | }, 2212 | "provide": { 2213 | "psr/log-implementation": "1.0|2.0|3.0" 2214 | }, 2215 | "require-dev": { 2216 | "psr/log": "^1|^2|^3", 2217 | "symfony/config": "^5.4|^6.0", 2218 | "symfony/dependency-injection": "^5.4|^6.0", 2219 | "symfony/event-dispatcher": "^5.4|^6.0", 2220 | "symfony/lock": "^5.4|^6.0", 2221 | "symfony/process": "^5.4|^6.0", 2222 | "symfony/var-dumper": "^5.4|^6.0" 2223 | }, 2224 | "suggest": { 2225 | "psr/log": "For using the console logger", 2226 | "symfony/event-dispatcher": "", 2227 | "symfony/lock": "", 2228 | "symfony/process": "" 2229 | }, 2230 | "type": "library", 2231 | "autoload": { 2232 | "psr-4": { 2233 | "Symfony\\Component\\Console\\": "" 2234 | }, 2235 | "exclude-from-classmap": [ 2236 | "/Tests/" 2237 | ] 2238 | }, 2239 | "notification-url": "https://packagist.org/downloads/", 2240 | "license": [ 2241 | "MIT" 2242 | ], 2243 | "authors": [ 2244 | { 2245 | "name": "Fabien Potencier", 2246 | "email": "fabien@symfony.com" 2247 | }, 2248 | { 2249 | "name": "Symfony Community", 2250 | "homepage": "https://symfony.com/contributors" 2251 | } 2252 | ], 2253 | "description": "Eases the creation of beautiful and testable command line interfaces", 2254 | "homepage": "https://symfony.com", 2255 | "keywords": [ 2256 | "cli", 2257 | "command-line", 2258 | "console", 2259 | "terminal" 2260 | ], 2261 | "support": { 2262 | "source": "https://github.com/symfony/console/tree/v6.2.10" 2263 | }, 2264 | "funding": [ 2265 | { 2266 | "url": "https://symfony.com/sponsor", 2267 | "type": "custom" 2268 | }, 2269 | { 2270 | "url": "https://github.com/fabpot", 2271 | "type": "github" 2272 | }, 2273 | { 2274 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 2275 | "type": "tidelift" 2276 | } 2277 | ], 2278 | "time": "2023-04-28T13:37:43+00:00" 2279 | }, 2280 | { 2281 | "name": "symfony/deprecation-contracts", 2282 | "version": "v3.2.1", 2283 | "source": { 2284 | "type": "git", 2285 | "url": "https://github.com/symfony/deprecation-contracts.git", 2286 | "reference": "e2d1534420bd723d0ef5aec58a22c5fe60ce6f5e" 2287 | }, 2288 | "dist": { 2289 | "type": "zip", 2290 | "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/e2d1534420bd723d0ef5aec58a22c5fe60ce6f5e", 2291 | "reference": "e2d1534420bd723d0ef5aec58a22c5fe60ce6f5e", 2292 | "shasum": "" 2293 | }, 2294 | "require": { 2295 | "php": ">=8.1" 2296 | }, 2297 | "type": "library", 2298 | "extra": { 2299 | "branch-alias": { 2300 | "dev-main": "3.3-dev" 2301 | }, 2302 | "thanks": { 2303 | "name": "symfony/contracts", 2304 | "url": "https://github.com/symfony/contracts" 2305 | } 2306 | }, 2307 | "autoload": { 2308 | "files": [ 2309 | "function.php" 2310 | ] 2311 | }, 2312 | "notification-url": "https://packagist.org/downloads/", 2313 | "license": [ 2314 | "MIT" 2315 | ], 2316 | "authors": [ 2317 | { 2318 | "name": "Nicolas Grekas", 2319 | "email": "p@tchwork.com" 2320 | }, 2321 | { 2322 | "name": "Symfony Community", 2323 | "homepage": "https://symfony.com/contributors" 2324 | } 2325 | ], 2326 | "description": "A generic function and convention to trigger deprecation notices", 2327 | "homepage": "https://symfony.com", 2328 | "support": { 2329 | "source": "https://github.com/symfony/deprecation-contracts/tree/v3.2.1" 2330 | }, 2331 | "funding": [ 2332 | { 2333 | "url": "https://symfony.com/sponsor", 2334 | "type": "custom" 2335 | }, 2336 | { 2337 | "url": "https://github.com/fabpot", 2338 | "type": "github" 2339 | }, 2340 | { 2341 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 2342 | "type": "tidelift" 2343 | } 2344 | ], 2345 | "time": "2023-03-01T10:25:55+00:00" 2346 | }, 2347 | { 2348 | "name": "symfony/polyfill-ctype", 2349 | "version": "v1.27.0", 2350 | "source": { 2351 | "type": "git", 2352 | "url": "https://github.com/symfony/polyfill-ctype.git", 2353 | "reference": "5bbc823adecdae860bb64756d639ecfec17b050a" 2354 | }, 2355 | "dist": { 2356 | "type": "zip", 2357 | "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/5bbc823adecdae860bb64756d639ecfec17b050a", 2358 | "reference": "5bbc823adecdae860bb64756d639ecfec17b050a", 2359 | "shasum": "" 2360 | }, 2361 | "require": { 2362 | "php": ">=7.1" 2363 | }, 2364 | "provide": { 2365 | "ext-ctype": "*" 2366 | }, 2367 | "suggest": { 2368 | "ext-ctype": "For best performance" 2369 | }, 2370 | "type": "library", 2371 | "extra": { 2372 | "branch-alias": { 2373 | "dev-main": "1.27-dev" 2374 | }, 2375 | "thanks": { 2376 | "name": "symfony/polyfill", 2377 | "url": "https://github.com/symfony/polyfill" 2378 | } 2379 | }, 2380 | "autoload": { 2381 | "files": [ 2382 | "bootstrap.php" 2383 | ], 2384 | "psr-4": { 2385 | "Symfony\\Polyfill\\Ctype\\": "" 2386 | } 2387 | }, 2388 | "notification-url": "https://packagist.org/downloads/", 2389 | "license": [ 2390 | "MIT" 2391 | ], 2392 | "authors": [ 2393 | { 2394 | "name": "Gert de Pagter", 2395 | "email": "BackEndTea@gmail.com" 2396 | }, 2397 | { 2398 | "name": "Symfony Community", 2399 | "homepage": "https://symfony.com/contributors" 2400 | } 2401 | ], 2402 | "description": "Symfony polyfill for ctype functions", 2403 | "homepage": "https://symfony.com", 2404 | "keywords": [ 2405 | "compatibility", 2406 | "ctype", 2407 | "polyfill", 2408 | "portable" 2409 | ], 2410 | "support": { 2411 | "source": "https://github.com/symfony/polyfill-ctype/tree/v1.27.0" 2412 | }, 2413 | "funding": [ 2414 | { 2415 | "url": "https://symfony.com/sponsor", 2416 | "type": "custom" 2417 | }, 2418 | { 2419 | "url": "https://github.com/fabpot", 2420 | "type": "github" 2421 | }, 2422 | { 2423 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 2424 | "type": "tidelift" 2425 | } 2426 | ], 2427 | "time": "2022-11-03T14:55:06+00:00" 2428 | }, 2429 | { 2430 | "name": "symfony/polyfill-intl-grapheme", 2431 | "version": "v1.27.0", 2432 | "source": { 2433 | "type": "git", 2434 | "url": "https://github.com/symfony/polyfill-intl-grapheme.git", 2435 | "reference": "511a08c03c1960e08a883f4cffcacd219b758354" 2436 | }, 2437 | "dist": { 2438 | "type": "zip", 2439 | "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/511a08c03c1960e08a883f4cffcacd219b758354", 2440 | "reference": "511a08c03c1960e08a883f4cffcacd219b758354", 2441 | "shasum": "" 2442 | }, 2443 | "require": { 2444 | "php": ">=7.1" 2445 | }, 2446 | "suggest": { 2447 | "ext-intl": "For best performance" 2448 | }, 2449 | "type": "library", 2450 | "extra": { 2451 | "branch-alias": { 2452 | "dev-main": "1.27-dev" 2453 | }, 2454 | "thanks": { 2455 | "name": "symfony/polyfill", 2456 | "url": "https://github.com/symfony/polyfill" 2457 | } 2458 | }, 2459 | "autoload": { 2460 | "files": [ 2461 | "bootstrap.php" 2462 | ], 2463 | "psr-4": { 2464 | "Symfony\\Polyfill\\Intl\\Grapheme\\": "" 2465 | } 2466 | }, 2467 | "notification-url": "https://packagist.org/downloads/", 2468 | "license": [ 2469 | "MIT" 2470 | ], 2471 | "authors": [ 2472 | { 2473 | "name": "Nicolas Grekas", 2474 | "email": "p@tchwork.com" 2475 | }, 2476 | { 2477 | "name": "Symfony Community", 2478 | "homepage": "https://symfony.com/contributors" 2479 | } 2480 | ], 2481 | "description": "Symfony polyfill for intl's grapheme_* functions", 2482 | "homepage": "https://symfony.com", 2483 | "keywords": [ 2484 | "compatibility", 2485 | "grapheme", 2486 | "intl", 2487 | "polyfill", 2488 | "portable", 2489 | "shim" 2490 | ], 2491 | "support": { 2492 | "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.27.0" 2493 | }, 2494 | "funding": [ 2495 | { 2496 | "url": "https://symfony.com/sponsor", 2497 | "type": "custom" 2498 | }, 2499 | { 2500 | "url": "https://github.com/fabpot", 2501 | "type": "github" 2502 | }, 2503 | { 2504 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 2505 | "type": "tidelift" 2506 | } 2507 | ], 2508 | "time": "2022-11-03T14:55:06+00:00" 2509 | }, 2510 | { 2511 | "name": "symfony/polyfill-intl-normalizer", 2512 | "version": "v1.27.0", 2513 | "source": { 2514 | "type": "git", 2515 | "url": "https://github.com/symfony/polyfill-intl-normalizer.git", 2516 | "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6" 2517 | }, 2518 | "dist": { 2519 | "type": "zip", 2520 | "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/19bd1e4fcd5b91116f14d8533c57831ed00571b6", 2521 | "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6", 2522 | "shasum": "" 2523 | }, 2524 | "require": { 2525 | "php": ">=7.1" 2526 | }, 2527 | "suggest": { 2528 | "ext-intl": "For best performance" 2529 | }, 2530 | "type": "library", 2531 | "extra": { 2532 | "branch-alias": { 2533 | "dev-main": "1.27-dev" 2534 | }, 2535 | "thanks": { 2536 | "name": "symfony/polyfill", 2537 | "url": "https://github.com/symfony/polyfill" 2538 | } 2539 | }, 2540 | "autoload": { 2541 | "files": [ 2542 | "bootstrap.php" 2543 | ], 2544 | "psr-4": { 2545 | "Symfony\\Polyfill\\Intl\\Normalizer\\": "" 2546 | }, 2547 | "classmap": [ 2548 | "Resources/stubs" 2549 | ] 2550 | }, 2551 | "notification-url": "https://packagist.org/downloads/", 2552 | "license": [ 2553 | "MIT" 2554 | ], 2555 | "authors": [ 2556 | { 2557 | "name": "Nicolas Grekas", 2558 | "email": "p@tchwork.com" 2559 | }, 2560 | { 2561 | "name": "Symfony Community", 2562 | "homepage": "https://symfony.com/contributors" 2563 | } 2564 | ], 2565 | "description": "Symfony polyfill for intl's Normalizer class and related functions", 2566 | "homepage": "https://symfony.com", 2567 | "keywords": [ 2568 | "compatibility", 2569 | "intl", 2570 | "normalizer", 2571 | "polyfill", 2572 | "portable", 2573 | "shim" 2574 | ], 2575 | "support": { 2576 | "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.27.0" 2577 | }, 2578 | "funding": [ 2579 | { 2580 | "url": "https://symfony.com/sponsor", 2581 | "type": "custom" 2582 | }, 2583 | { 2584 | "url": "https://github.com/fabpot", 2585 | "type": "github" 2586 | }, 2587 | { 2588 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 2589 | "type": "tidelift" 2590 | } 2591 | ], 2592 | "time": "2022-11-03T14:55:06+00:00" 2593 | }, 2594 | { 2595 | "name": "symfony/polyfill-mbstring", 2596 | "version": "v1.27.0", 2597 | "source": { 2598 | "type": "git", 2599 | "url": "https://github.com/symfony/polyfill-mbstring.git", 2600 | "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534" 2601 | }, 2602 | "dist": { 2603 | "type": "zip", 2604 | "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/8ad114f6b39e2c98a8b0e3bd907732c207c2b534", 2605 | "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534", 2606 | "shasum": "" 2607 | }, 2608 | "require": { 2609 | "php": ">=7.1" 2610 | }, 2611 | "provide": { 2612 | "ext-mbstring": "*" 2613 | }, 2614 | "suggest": { 2615 | "ext-mbstring": "For best performance" 2616 | }, 2617 | "type": "library", 2618 | "extra": { 2619 | "branch-alias": { 2620 | "dev-main": "1.27-dev" 2621 | }, 2622 | "thanks": { 2623 | "name": "symfony/polyfill", 2624 | "url": "https://github.com/symfony/polyfill" 2625 | } 2626 | }, 2627 | "autoload": { 2628 | "files": [ 2629 | "bootstrap.php" 2630 | ], 2631 | "psr-4": { 2632 | "Symfony\\Polyfill\\Mbstring\\": "" 2633 | } 2634 | }, 2635 | "notification-url": "https://packagist.org/downloads/", 2636 | "license": [ 2637 | "MIT" 2638 | ], 2639 | "authors": [ 2640 | { 2641 | "name": "Nicolas Grekas", 2642 | "email": "p@tchwork.com" 2643 | }, 2644 | { 2645 | "name": "Symfony Community", 2646 | "homepage": "https://symfony.com/contributors" 2647 | } 2648 | ], 2649 | "description": "Symfony polyfill for the Mbstring extension", 2650 | "homepage": "https://symfony.com", 2651 | "keywords": [ 2652 | "compatibility", 2653 | "mbstring", 2654 | "polyfill", 2655 | "portable", 2656 | "shim" 2657 | ], 2658 | "support": { 2659 | "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.27.0" 2660 | }, 2661 | "funding": [ 2662 | { 2663 | "url": "https://symfony.com/sponsor", 2664 | "type": "custom" 2665 | }, 2666 | { 2667 | "url": "https://github.com/fabpot", 2668 | "type": "github" 2669 | }, 2670 | { 2671 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 2672 | "type": "tidelift" 2673 | } 2674 | ], 2675 | "time": "2022-11-03T14:55:06+00:00" 2676 | }, 2677 | { 2678 | "name": "symfony/service-contracts", 2679 | "version": "v3.2.1", 2680 | "source": { 2681 | "type": "git", 2682 | "url": "https://github.com/symfony/service-contracts.git", 2683 | "reference": "a8c9cedf55f314f3a186041d19537303766df09a" 2684 | }, 2685 | "dist": { 2686 | "type": "zip", 2687 | "url": "https://api.github.com/repos/symfony/service-contracts/zipball/a8c9cedf55f314f3a186041d19537303766df09a", 2688 | "reference": "a8c9cedf55f314f3a186041d19537303766df09a", 2689 | "shasum": "" 2690 | }, 2691 | "require": { 2692 | "php": ">=8.1", 2693 | "psr/container": "^2.0" 2694 | }, 2695 | "conflict": { 2696 | "ext-psr": "<1.1|>=2" 2697 | }, 2698 | "suggest": { 2699 | "symfony/service-implementation": "" 2700 | }, 2701 | "type": "library", 2702 | "extra": { 2703 | "branch-alias": { 2704 | "dev-main": "3.3-dev" 2705 | }, 2706 | "thanks": { 2707 | "name": "symfony/contracts", 2708 | "url": "https://github.com/symfony/contracts" 2709 | } 2710 | }, 2711 | "autoload": { 2712 | "psr-4": { 2713 | "Symfony\\Contracts\\Service\\": "" 2714 | }, 2715 | "exclude-from-classmap": [ 2716 | "/Test/" 2717 | ] 2718 | }, 2719 | "notification-url": "https://packagist.org/downloads/", 2720 | "license": [ 2721 | "MIT" 2722 | ], 2723 | "authors": [ 2724 | { 2725 | "name": "Nicolas Grekas", 2726 | "email": "p@tchwork.com" 2727 | }, 2728 | { 2729 | "name": "Symfony Community", 2730 | "homepage": "https://symfony.com/contributors" 2731 | } 2732 | ], 2733 | "description": "Generic abstractions related to writing services", 2734 | "homepage": "https://symfony.com", 2735 | "keywords": [ 2736 | "abstractions", 2737 | "contracts", 2738 | "decoupling", 2739 | "interfaces", 2740 | "interoperability", 2741 | "standards" 2742 | ], 2743 | "support": { 2744 | "source": "https://github.com/symfony/service-contracts/tree/v3.2.1" 2745 | }, 2746 | "funding": [ 2747 | { 2748 | "url": "https://symfony.com/sponsor", 2749 | "type": "custom" 2750 | }, 2751 | { 2752 | "url": "https://github.com/fabpot", 2753 | "type": "github" 2754 | }, 2755 | { 2756 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 2757 | "type": "tidelift" 2758 | } 2759 | ], 2760 | "time": "2023-03-01T10:32:47+00:00" 2761 | }, 2762 | { 2763 | "name": "symfony/string", 2764 | "version": "v6.2.8", 2765 | "source": { 2766 | "type": "git", 2767 | "url": "https://github.com/symfony/string.git", 2768 | "reference": "193e83bbd6617d6b2151c37fff10fa7168ebddef" 2769 | }, 2770 | "dist": { 2771 | "type": "zip", 2772 | "url": "https://api.github.com/repos/symfony/string/zipball/193e83bbd6617d6b2151c37fff10fa7168ebddef", 2773 | "reference": "193e83bbd6617d6b2151c37fff10fa7168ebddef", 2774 | "shasum": "" 2775 | }, 2776 | "require": { 2777 | "php": ">=8.1", 2778 | "symfony/polyfill-ctype": "~1.8", 2779 | "symfony/polyfill-intl-grapheme": "~1.0", 2780 | "symfony/polyfill-intl-normalizer": "~1.0", 2781 | "symfony/polyfill-mbstring": "~1.0" 2782 | }, 2783 | "conflict": { 2784 | "symfony/translation-contracts": "<2.0" 2785 | }, 2786 | "require-dev": { 2787 | "symfony/error-handler": "^5.4|^6.0", 2788 | "symfony/http-client": "^5.4|^6.0", 2789 | "symfony/intl": "^6.2", 2790 | "symfony/translation-contracts": "^2.0|^3.0", 2791 | "symfony/var-exporter": "^5.4|^6.0" 2792 | }, 2793 | "type": "library", 2794 | "autoload": { 2795 | "files": [ 2796 | "Resources/functions.php" 2797 | ], 2798 | "psr-4": { 2799 | "Symfony\\Component\\String\\": "" 2800 | }, 2801 | "exclude-from-classmap": [ 2802 | "/Tests/" 2803 | ] 2804 | }, 2805 | "notification-url": "https://packagist.org/downloads/", 2806 | "license": [ 2807 | "MIT" 2808 | ], 2809 | "authors": [ 2810 | { 2811 | "name": "Nicolas Grekas", 2812 | "email": "p@tchwork.com" 2813 | }, 2814 | { 2815 | "name": "Symfony Community", 2816 | "homepage": "https://symfony.com/contributors" 2817 | } 2818 | ], 2819 | "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", 2820 | "homepage": "https://symfony.com", 2821 | "keywords": [ 2822 | "grapheme", 2823 | "i18n", 2824 | "string", 2825 | "unicode", 2826 | "utf-8", 2827 | "utf8" 2828 | ], 2829 | "support": { 2830 | "source": "https://github.com/symfony/string/tree/v6.2.8" 2831 | }, 2832 | "funding": [ 2833 | { 2834 | "url": "https://symfony.com/sponsor", 2835 | "type": "custom" 2836 | }, 2837 | { 2838 | "url": "https://github.com/fabpot", 2839 | "type": "github" 2840 | }, 2841 | { 2842 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 2843 | "type": "tidelift" 2844 | } 2845 | ], 2846 | "time": "2023-03-20T16:06:02+00:00" 2847 | }, 2848 | { 2849 | "name": "theseer/tokenizer", 2850 | "version": "1.2.1", 2851 | "source": { 2852 | "type": "git", 2853 | "url": "https://github.com/theseer/tokenizer.git", 2854 | "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e" 2855 | }, 2856 | "dist": { 2857 | "type": "zip", 2858 | "url": "https://api.github.com/repos/theseer/tokenizer/zipball/34a41e998c2183e22995f158c581e7b5e755ab9e", 2859 | "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e", 2860 | "shasum": "" 2861 | }, 2862 | "require": { 2863 | "ext-dom": "*", 2864 | "ext-tokenizer": "*", 2865 | "ext-xmlwriter": "*", 2866 | "php": "^7.2 || ^8.0" 2867 | }, 2868 | "type": "library", 2869 | "autoload": { 2870 | "classmap": [ 2871 | "src/" 2872 | ] 2873 | }, 2874 | "notification-url": "https://packagist.org/downloads/", 2875 | "license": [ 2876 | "BSD-3-Clause" 2877 | ], 2878 | "authors": [ 2879 | { 2880 | "name": "Arne Blankerts", 2881 | "email": "arne@blankerts.de", 2882 | "role": "Developer" 2883 | } 2884 | ], 2885 | "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", 2886 | "support": { 2887 | "issues": "https://github.com/theseer/tokenizer/issues", 2888 | "source": "https://github.com/theseer/tokenizer/tree/1.2.1" 2889 | }, 2890 | "funding": [ 2891 | { 2892 | "url": "https://github.com/theseer", 2893 | "type": "github" 2894 | } 2895 | ], 2896 | "time": "2021-07-28T10:34:58+00:00" 2897 | } 2898 | ], 2899 | "aliases": [], 2900 | "minimum-stability": "stable", 2901 | "stability-flags": [], 2902 | "prefer-stable": false, 2903 | "prefer-lowest": false, 2904 | "platform": [], 2905 | "platform-dev": [], 2906 | "plugin-api-version": "2.3.0" 2907 | } 2908 | -------------------------------------------------------------------------------- /phpunit.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 9 | ./tests 10 | 11 | 12 | 13 | 14 | ./src 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/Exceptions/BigNumberException.php: -------------------------------------------------------------------------------- 1 | min = $min; 23 | 24 | return $this; 25 | } 26 | 27 | public function max($max) 28 | { 29 | $this->max = $max; 30 | 31 | return $this; 32 | } 33 | 34 | protected function parseValue($value) 35 | { 36 | if (! is_numeric($value)) { 37 | throw InvalidNumberException::make($value); 38 | } 39 | 40 | // Convert both integers and floats to numbers. 41 | $value = $value + 0; 42 | 43 | if (! is_null($this->min) && $value < $this->min) { 44 | throw SmallNumberException::make($value, $this->min); 45 | } 46 | 47 | if (! is_null($this->max) && $value > $this->max) { 48 | throw BigNumberException::make($value, $this->max); 49 | } 50 | 51 | return $value; 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /src/Schemas/ObjectSchema.php: -------------------------------------------------------------------------------- 1 | isValidSchemasArray($schema)) { 18 | throw InvalidObjectSchemaException::make($schema); 19 | } 20 | 21 | $this->schema = $schema; 22 | } 23 | 24 | public static function make($schema = []) 25 | { 26 | return new static($schema); 27 | } 28 | 29 | protected function parseValue($value) 30 | { 31 | if ($this->isAssociativeArray($value)) { 32 | $value = $this->arrayToObject($value); 33 | } 34 | 35 | if (! is_object($value)) { 36 | throw InvalidObjectException::make($value); 37 | } 38 | 39 | $parsedValue = new \stdClass(); 40 | 41 | foreach ($this->schema as $key => $parser) { 42 | $parsedValue->$key = $parser->parse($value->$key ?? null); 43 | } 44 | 45 | return $parsedValue; 46 | } 47 | 48 | private function isAssociativeArray($value) 49 | { 50 | if (! is_array($value)) { 51 | return false; 52 | } 53 | 54 | $keys = array_keys($value); 55 | $numericKeys = array_filter($keys, 'is_numeric'); 56 | 57 | return count($numericKeys) === 0; 58 | } 59 | 60 | private function arrayToObject($value) 61 | { 62 | if (! is_array($value)) { 63 | return $value; 64 | } 65 | 66 | foreach ($value as $key => $item) { 67 | $value[$key] = $this->arrayToObject($item); 68 | } 69 | 70 | return (object) $value; 71 | } 72 | 73 | private function isValidSchemasArray($schema) 74 | { 75 | if (! $this->isAssociativeArray($schema)) { 76 | return false; 77 | } 78 | 79 | foreach ($schema as $item) { 80 | if (! ($item instanceof Schema)) { 81 | return false; 82 | } 83 | } 84 | 85 | return true; 86 | } 87 | } 88 | -------------------------------------------------------------------------------- /src/Schemas/Schema.php: -------------------------------------------------------------------------------- 1 | isOptional = true; 14 | 15 | return $this; 16 | } 17 | 18 | public function required() 19 | { 20 | $this->isOptional = false; 21 | 22 | return $this; 23 | } 24 | 25 | public function default($value) 26 | { 27 | // Parse the default value to make sure it's valid for the current schema. 28 | $this->defaultValue = $this->parseValue($value); 29 | 30 | return $this->optional(); 31 | } 32 | 33 | public function parse($value = null) 34 | { 35 | if ($this->isOptional && is_null($value)) { 36 | return $this->defaultValue; 37 | } 38 | 39 | return $this->parseValue($value); 40 | } 41 | 42 | abstract protected function parseValue($value); 43 | } 44 | -------------------------------------------------------------------------------- /src/Schemas/StringSchema.php: -------------------------------------------------------------------------------- 1 | min = $min; 23 | 24 | return $this; 25 | } 26 | 27 | public function max($max) 28 | { 29 | $this->max = $max; 30 | 31 | return $this; 32 | } 33 | 34 | protected function parseValue($value) 35 | { 36 | if (! is_string($value)) { 37 | throw InvalidStringException::make($value); 38 | } 39 | 40 | if (! is_null($this->min) && strlen($value) < $this->min) { 41 | throw ShortStringException::make($value, $this->min); 42 | } 43 | 44 | if (! is_null($this->max) && strlen($value) > $this->max) { 45 | throw LongStringException::make($value, $this->max); 46 | } 47 | 48 | return $value; 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /src/Zod.php: -------------------------------------------------------------------------------- 1 | in('Feature'); 15 | 16 | /* 17 | |-------------------------------------------------------------------------- 18 | | Expectations 19 | |-------------------------------------------------------------------------- 20 | | 21 | | When you're writing tests, you often need to check that values meet certain conditions. The 22 | | "expect()" function gives you access to a set of "expectations" methods that you can use 23 | | to assert different things. Of course, you may extend the Expectation API at any time. 24 | | 25 | */ 26 | 27 | expect()->extend('toBeOne', function () { 28 | return $this->toBe(1); 29 | }); 30 | 31 | /* 32 | |-------------------------------------------------------------------------- 33 | | Functions 34 | |-------------------------------------------------------------------------- 35 | | 36 | | While Pest is very powerful out-of-the-box, you may have some testing code specific to your 37 | | project that you don't want to repeat in every file. Here you can also expose helpers as 38 | | global functions to help you to reduce the number of lines of code in your test files. 39 | | 40 | */ 41 | 42 | function something() 43 | { 44 | // .. 45 | } 46 | -------------------------------------------------------------------------------- /tests/Schemas/NumberSchemaTest.php: -------------------------------------------------------------------------------- 1 | parse(42))->toEqual(42); 13 | expect(Z::number()->parse(42.5))->toEqual(42.5); 14 | expect(Z::number()->parse('42'))->toEqual(42); 15 | }); 16 | 17 | it('should validate number size', function () { 18 | // Act & Assert. 19 | expect(function () { 20 | Z::number()->min(5)->parse(1); 21 | })->toThrow(SmallNumberException::class); 22 | 23 | expect(function () { 24 | Z::number()->max(1)->parse(2); 25 | })->toThrow(BigNumberException::class); 26 | }); 27 | 28 | it('should throw for non-numbers', function () { 29 | // Act & Assert. 30 | expect(function () { 31 | Z::number()->parse('test'); 32 | })->toThrow(InvalidNumberException::class); 33 | }); 34 | -------------------------------------------------------------------------------- /tests/Schemas/ObjectSchemaTest.php: -------------------------------------------------------------------------------- 1 | 'John Doe', 13 | 'age' => 42, 14 | 'address' => (object) [ 15 | 'city' => 'Test City', 16 | 'street' => 'Test Street', 17 | ], 18 | ]; 19 | 20 | // Act. 21 | $result = Z::object([ 22 | 'name' => Z::string(), 23 | 'age' => Z::number(), 24 | 'address' => Z::object([ 25 | 'city' => Z::string(), 26 | 'street' => Z::string(), 27 | ]), 28 | ])->parse($object); 29 | 30 | // Assert. 31 | expect($result)->toEqual($object); 32 | }); 33 | 34 | it('should parse an associative array as object', function () { 35 | $array = [ 36 | 'name' => 'John Doe', 37 | 'age' => 42, 38 | 'address' => [ 39 | 'city' => 'Test City', 40 | 'street' => 'Test Street', 41 | ], 42 | ]; 43 | 44 | // Act. 45 | $result = Z::object([ 46 | 'name' => Z::string(), 47 | 'age' => Z::number(), 48 | 'address' => Z::object([ 49 | 'city' => Z::string(), 50 | 'street' => Z::string(), 51 | ]), 52 | ])->parse($array); 53 | 54 | // Assert. 55 | expect($result)->toEqual((object) [ 56 | 'name' => 'John Doe', 57 | 'age' => 42, 58 | 'address' => (object) [ 59 | 'city' => 'Test City', 60 | 'street' => 'Test Street', 61 | ], 62 | ]); 63 | }); 64 | 65 | it('should throw when passing invalid schemas', function () { 66 | // Act & Assert. 67 | expect(function () { 68 | // Non-array schema. 69 | Z::object('asd'); 70 | })->toThrow(InvalidObjectSchemaException::class); 71 | 72 | expect(function () { 73 | // Non-associative array. 74 | Z::object([ 75 | Z::string(), 76 | Z::number(), 77 | ]); 78 | })->toThrow(InvalidObjectSchemaException::class); 79 | 80 | expect(function () { 81 | // Non-Schema array. 82 | Z::object([ 83 | 'name' => Z::string(), 84 | 'age' => 'non-schema', 85 | ]); 86 | })->toThrow(InvalidObjectSchemaException::class); 87 | }); 88 | 89 | it('should support optional keys', function () { 90 | // Act. 91 | $result = Z::object([ 92 | 'name' => Z::string()->optional(), 93 | 'age' => Z::number()->optional(), 94 | ])->parse([]); 95 | 96 | // Assert. 97 | expect($result)->toEqual((object) [ 98 | 'name' => null, 99 | 'age' => null, 100 | ]); 101 | }); 102 | 103 | it('should support required keys', function () { 104 | // Arrange. 105 | $name = Z::string()->optional(); 106 | $age = Z::number()->optional(); 107 | 108 | // Act & Assert. 109 | expect(function () use ($name, $age) { 110 | Z::object([ 111 | 'name' => $name->required(), 112 | 'age' => $age->required(), 113 | ])->parse([]); 114 | })->toThrow(\Exception::class); 115 | }); 116 | 117 | it('should support default values', function () { 118 | // Act. 119 | $result = Z::object([ 120 | 'name' => Z::string()->default('John Doe'), 121 | 'age' => Z::number()->default(42), 122 | ])->parse([]); 123 | 124 | // Assert. 125 | expect($result)->toEqual((object) [ 126 | 'name' => 'John Doe', 127 | 'age' => 42, 128 | ]); 129 | }); 130 | 131 | it('should throw when passing invalid default value', function () { 132 | // Act & Assert. 133 | expect(function () { 134 | Z::object()->default('test'); 135 | })->toThrow(InvalidObjectException::class); 136 | }); 137 | 138 | it('should throw for non-objects', function () { 139 | // Act & Assert. 140 | expect(function () { 141 | Z::object()->parse('test'); 142 | })->toThrow(InvalidObjectException::class); 143 | }); 144 | -------------------------------------------------------------------------------- /tests/Schemas/StringSchemaTest.php: -------------------------------------------------------------------------------- 1 | parse('test'); 13 | 14 | // Assert. 15 | expect($result)->toEqual('test'); 16 | }); 17 | 18 | it('should validate string length', function () { 19 | // Act & Assert. 20 | expect(function () { 21 | Z::string()->min(5)->parse('1'); 22 | })->toThrow(ShortStringException::class); 23 | 24 | expect(function () { 25 | Z::string()->max(1)->parse('123'); 26 | })->toThrow(LongStringException::class); 27 | }); 28 | 29 | it('should throw for non-strings', function () { 30 | // Act & Assert. 31 | expect(function () { 32 | Z::string()->parse([]); 33 | })->toThrow(InvalidStringException::class); 34 | }); 35 | --------------------------------------------------------------------------------