├── .gitignore ├── .travis.yml ├── LICENSE ├── README.md ├── composer.json ├── composer.lock ├── phpunit.xml ├── src └── ServiceProvider.php └── tests ├── TestCase.php └── Unit └── EloquentLatestRelationTest.php /.gitignore: -------------------------------------------------------------------------------- 1 | /node_modules 2 | /public/hot 3 | /public/storage 4 | /storage/*.key 5 | /vendor 6 | .env 7 | .env.backup 8 | .phpunit.result.cache 9 | Homestead.json 10 | Homestead.yaml 11 | npm-debug.log 12 | yarn-error.log 13 | SCRATCH.md -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: php 2 | 3 | env: 4 | global: 5 | - setup=stable 6 | 7 | matrix: 8 | fast_finish: true 9 | include: 10 | - php: 7.1 11 | - php: 7.1 12 | env: setup=lowest 13 | - php: 7.2 14 | - php: 7.2 15 | env: setup=lowest 16 | - php: 7.3 17 | - php: 7.3 18 | env: setup=lowest 19 | 20 | sudo: false 21 | 22 | cache: 23 | directories: 24 | - $HOME/.composer/cache 25 | 26 | install: 27 | - if [[ $setup = 'stable' ]]; then travis_retry composer update --prefer-dist --no-interaction --prefer-stable --no-suggest; fi 28 | - if [[ $setup = 'lowest' ]]; then travis_retry composer update --prefer-dist --no-interaction --prefer-lowest --prefer-stable --no-suggest; fi 29 | 30 | script: vendor/bin/phpunit -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 Jani Gyllenberg 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

2 | Total Downloads 3 | Latest Stable Version 4 | Travis CI Build Status: Master 5 |

6 | 7 | 8 | # Laravel Latest Relation 9 | Eloquent macros for querying the latest HasMany relationship in Laravel. 10 | 11 | More information on the problem and solutions: [Dynamic scope on latest record in Laravel's HasMany relationships, Part 1: solving with Subqueries - nullthoughts.com](https://nullthoughts.com/development/2019/10/08/dynamic-scope-on-latest-relationship-in-laravel/) 12 | 13 | ## Installation 14 | Install via composer: 15 | `composer require nullthoughts/laravel-latest-relation` 16 | 17 | ## Usage / Examples 18 | Use the Builder methods inside a whereHas closure: 19 | 20 | ### Latest: 21 | 22 | #### whereLatestRelation($relation, $column, $operator = null, $value = null) 23 | **Query** 24 | ```php 25 | $users = User::whereLatestRelation('logins', 'device_type', '=', 'desktop'); 26 | ``` 27 | 28 | **Dynamic Scope** 29 | ```php 30 | public function scopeUsingDevice($query, $device) 31 | { 32 | return $query->whereLatestRelation('logins', 'device_type', $device); 33 | } 34 | 35 | public function scopeHavingCountry($query) 36 | { 37 | return $query->whereLatestRelation('logins', 'country', '!=', 'null'); 38 | } 39 | ``` 40 | 41 | #### whereLatest($column, $value) 42 | **Query** 43 | ```php 44 | $users = User::whereHas('logins', function ($query) { 45 | $query->whereLatest('device_type', 'desktop'); 46 | }); 47 | ``` 48 | 49 | **Dynamic Scope** 50 | ```php 51 | public function scopeUsingDevice($query, $device) 52 | { 53 | return $query->whereHas('logins', function ($query) use ($device) { 54 | $query->whereLatest('device_type', $device); 55 | }); 56 | } 57 | ``` 58 | 59 | #### latestRelation() 60 | **Query** 61 | ```php 62 | $users = User::whereHas('logins', function ($query) { 63 | $query->latestRelation()->whereBetween( 64 | 'created_at', [ 65 | Carbon::now()->startOfDay(), 66 | Carbon::now()->endOfDay() 67 | ]); 68 | }); 69 | ``` 70 | 71 | **Dynamic Scope** 72 | ```php 73 | public function scopeHavingDeviceType($query) 74 | { 75 | return $query->whereHas('logins', function ($query) { 76 | $query->latestRelation()->whereNotNull('device_type'); 77 | }); 78 | } 79 | ``` 80 | 81 | ### Earliest: 82 | 83 | ```php 84 | $users = User::whereLatestRelation('logins', 'device_type', 'desktop'); 85 | 86 | $users = User::whereHas('logins', function ($query) { 87 | $query->whereEarliest('device_type', 'desktop'); 88 | }); 89 | 90 | $users = User::whereHas('logins', function ($query) { 91 | $query->earliestRelation()->whereNotNull('device_type'); 92 | }); 93 | ``` -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "nullthoughts/laravel-latest-relation", 3 | "description": "Eloquent macros for querying latest HasMany relationship in Laravel", 4 | "license": "MIT", 5 | "authors": [ 6 | { 7 | "name": "Jani Gyllenberg", 8 | "email": "jani@nullincorporated.com" 9 | } 10 | ], 11 | "require": {}, 12 | "require-dev": { 13 | "orchestra/testbench": "^4.0" 14 | }, 15 | "autoload": { 16 | "psr-4": { 17 | "LaravelLatestRelation\\": "src" 18 | } 19 | }, 20 | "autoload-dev": { 21 | "psr-4": { 22 | "Tests\\": "tests/" 23 | } 24 | }, 25 | "extra": { 26 | "laravel": { 27 | "providers": [ 28 | "LaravelLatestRelation\\ServiceProvider" 29 | ] 30 | } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /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": "bb228193cffc9415fb2c9beb6219de14", 8 | "packages": [], 9 | "packages-dev": [ 10 | { 11 | "name": "doctrine/inflector", 12 | "version": "v1.3.0", 13 | "source": { 14 | "type": "git", 15 | "url": "https://github.com/doctrine/inflector.git", 16 | "reference": "5527a48b7313d15261292c149e55e26eae771b0a" 17 | }, 18 | "dist": { 19 | "type": "zip", 20 | "url": "https://api.github.com/repos/doctrine/inflector/zipball/5527a48b7313d15261292c149e55e26eae771b0a", 21 | "reference": "5527a48b7313d15261292c149e55e26eae771b0a", 22 | "shasum": "" 23 | }, 24 | "require": { 25 | "php": "^7.1" 26 | }, 27 | "require-dev": { 28 | "phpunit/phpunit": "^6.2" 29 | }, 30 | "type": "library", 31 | "extra": { 32 | "branch-alias": { 33 | "dev-master": "1.3.x-dev" 34 | } 35 | }, 36 | "autoload": { 37 | "psr-4": { 38 | "Doctrine\\Common\\Inflector\\": "lib/Doctrine/Common/Inflector" 39 | } 40 | }, 41 | "notification-url": "https://packagist.org/downloads/", 42 | "license": [ 43 | "MIT" 44 | ], 45 | "authors": [ 46 | { 47 | "name": "Roman Borschel", 48 | "email": "roman@code-factory.org" 49 | }, 50 | { 51 | "name": "Benjamin Eberlei", 52 | "email": "kontakt@beberlei.de" 53 | }, 54 | { 55 | "name": "Guilherme Blanco", 56 | "email": "guilhermeblanco@gmail.com" 57 | }, 58 | { 59 | "name": "Jonathan Wage", 60 | "email": "jonwage@gmail.com" 61 | }, 62 | { 63 | "name": "Johannes Schmitt", 64 | "email": "schmittjoh@gmail.com" 65 | } 66 | ], 67 | "description": "Common String Manipulations with regard to casing and singular/plural rules.", 68 | "homepage": "http://www.doctrine-project.org", 69 | "keywords": [ 70 | "inflection", 71 | "pluralize", 72 | "singularize", 73 | "string" 74 | ], 75 | "time": "2018-01-09T20:05:19+00:00" 76 | }, 77 | { 78 | "name": "doctrine/instantiator", 79 | "version": "1.2.0", 80 | "source": { 81 | "type": "git", 82 | "url": "https://github.com/doctrine/instantiator.git", 83 | "reference": "a2c590166b2133a4633738648b6b064edae0814a" 84 | }, 85 | "dist": { 86 | "type": "zip", 87 | "url": "https://api.github.com/repos/doctrine/instantiator/zipball/a2c590166b2133a4633738648b6b064edae0814a", 88 | "reference": "a2c590166b2133a4633738648b6b064edae0814a", 89 | "shasum": "" 90 | }, 91 | "require": { 92 | "php": "^7.1" 93 | }, 94 | "require-dev": { 95 | "doctrine/coding-standard": "^6.0", 96 | "ext-pdo": "*", 97 | "ext-phar": "*", 98 | "phpbench/phpbench": "^0.13", 99 | "phpstan/phpstan-phpunit": "^0.11", 100 | "phpstan/phpstan-shim": "^0.11", 101 | "phpunit/phpunit": "^7.0" 102 | }, 103 | "type": "library", 104 | "extra": { 105 | "branch-alias": { 106 | "dev-master": "1.2.x-dev" 107 | } 108 | }, 109 | "autoload": { 110 | "psr-4": { 111 | "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" 112 | } 113 | }, 114 | "notification-url": "https://packagist.org/downloads/", 115 | "license": [ 116 | "MIT" 117 | ], 118 | "authors": [ 119 | { 120 | "name": "Marco Pivetta", 121 | "email": "ocramius@gmail.com", 122 | "homepage": "http://ocramius.github.com/" 123 | } 124 | ], 125 | "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", 126 | "homepage": "https://www.doctrine-project.org/projects/instantiator.html", 127 | "keywords": [ 128 | "constructor", 129 | "instantiate" 130 | ], 131 | "time": "2019-03-17T17:37:11+00:00" 132 | }, 133 | { 134 | "name": "doctrine/lexer", 135 | "version": "1.1.0", 136 | "source": { 137 | "type": "git", 138 | "url": "https://github.com/doctrine/lexer.git", 139 | "reference": "e17f069ede36f7534b95adec71910ed1b49c74ea" 140 | }, 141 | "dist": { 142 | "type": "zip", 143 | "url": "https://api.github.com/repos/doctrine/lexer/zipball/e17f069ede36f7534b95adec71910ed1b49c74ea", 144 | "reference": "e17f069ede36f7534b95adec71910ed1b49c74ea", 145 | "shasum": "" 146 | }, 147 | "require": { 148 | "php": "^7.2" 149 | }, 150 | "require-dev": { 151 | "doctrine/coding-standard": "^6.0", 152 | "phpstan/phpstan": "^0.11.8", 153 | "phpunit/phpunit": "^8.2" 154 | }, 155 | "type": "library", 156 | "extra": { 157 | "branch-alias": { 158 | "dev-master": "1.1.x-dev" 159 | } 160 | }, 161 | "autoload": { 162 | "psr-4": { 163 | "Doctrine\\Common\\Lexer\\": "lib/Doctrine/Common/Lexer" 164 | } 165 | }, 166 | "notification-url": "https://packagist.org/downloads/", 167 | "license": [ 168 | "MIT" 169 | ], 170 | "authors": [ 171 | { 172 | "name": "Guilherme Blanco", 173 | "email": "guilhermeblanco@gmail.com" 174 | }, 175 | { 176 | "name": "Roman Borschel", 177 | "email": "roman@code-factory.org" 178 | }, 179 | { 180 | "name": "Johannes Schmitt", 181 | "email": "schmittjoh@gmail.com" 182 | } 183 | ], 184 | "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", 185 | "homepage": "https://www.doctrine-project.org/projects/lexer.html", 186 | "keywords": [ 187 | "annotations", 188 | "docblock", 189 | "lexer", 190 | "parser", 191 | "php" 192 | ], 193 | "time": "2019-07-30T19:33:28+00:00" 194 | }, 195 | { 196 | "name": "dragonmantank/cron-expression", 197 | "version": "v2.3.0", 198 | "source": { 199 | "type": "git", 200 | "url": "https://github.com/dragonmantank/cron-expression.git", 201 | "reference": "72b6fbf76adb3cf5bc0db68559b33d41219aba27" 202 | }, 203 | "dist": { 204 | "type": "zip", 205 | "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/72b6fbf76adb3cf5bc0db68559b33d41219aba27", 206 | "reference": "72b6fbf76adb3cf5bc0db68559b33d41219aba27", 207 | "shasum": "" 208 | }, 209 | "require": { 210 | "php": "^7.0" 211 | }, 212 | "require-dev": { 213 | "phpunit/phpunit": "^6.4|^7.0" 214 | }, 215 | "type": "library", 216 | "extra": { 217 | "branch-alias": { 218 | "dev-master": "2.3-dev" 219 | } 220 | }, 221 | "autoload": { 222 | "psr-4": { 223 | "Cron\\": "src/Cron/" 224 | } 225 | }, 226 | "notification-url": "https://packagist.org/downloads/", 227 | "license": [ 228 | "MIT" 229 | ], 230 | "authors": [ 231 | { 232 | "name": "Michael Dowling", 233 | "email": "mtdowling@gmail.com", 234 | "homepage": "https://github.com/mtdowling" 235 | }, 236 | { 237 | "name": "Chris Tankersley", 238 | "email": "chris@ctankersley.com", 239 | "homepage": "https://github.com/dragonmantank" 240 | } 241 | ], 242 | "description": "CRON for PHP: Calculate the next or previous run date and determine if a CRON expression is due", 243 | "keywords": [ 244 | "cron", 245 | "schedule" 246 | ], 247 | "time": "2019-03-31T00:38:28+00:00" 248 | }, 249 | { 250 | "name": "egulias/email-validator", 251 | "version": "2.1.11", 252 | "source": { 253 | "type": "git", 254 | "url": "https://github.com/egulias/EmailValidator.git", 255 | "reference": "92dd169c32f6f55ba570c309d83f5209cefb5e23" 256 | }, 257 | "dist": { 258 | "type": "zip", 259 | "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/92dd169c32f6f55ba570c309d83f5209cefb5e23", 260 | "reference": "92dd169c32f6f55ba570c309d83f5209cefb5e23", 261 | "shasum": "" 262 | }, 263 | "require": { 264 | "doctrine/lexer": "^1.0.1", 265 | "php": ">= 5.5" 266 | }, 267 | "require-dev": { 268 | "dominicsayers/isemail": "dev-master", 269 | "phpunit/phpunit": "^4.8.35||^5.7||^6.0", 270 | "satooshi/php-coveralls": "^1.0.1", 271 | "symfony/phpunit-bridge": "^4.4@dev" 272 | }, 273 | "suggest": { 274 | "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation" 275 | }, 276 | "type": "library", 277 | "extra": { 278 | "branch-alias": { 279 | "dev-master": "2.1.x-dev" 280 | } 281 | }, 282 | "autoload": { 283 | "psr-4": { 284 | "Egulias\\EmailValidator\\": "EmailValidator" 285 | } 286 | }, 287 | "notification-url": "https://packagist.org/downloads/", 288 | "license": [ 289 | "MIT" 290 | ], 291 | "authors": [ 292 | { 293 | "name": "Eduardo Gulias Davis" 294 | } 295 | ], 296 | "description": "A library for validating emails against several RFCs", 297 | "homepage": "https://github.com/egulias/EmailValidator", 298 | "keywords": [ 299 | "email", 300 | "emailvalidation", 301 | "emailvalidator", 302 | "validation", 303 | "validator" 304 | ], 305 | "time": "2019-08-13T17:33:27+00:00" 306 | }, 307 | { 308 | "name": "erusev/parsedown", 309 | "version": "1.7.3", 310 | "source": { 311 | "type": "git", 312 | "url": "https://github.com/erusev/parsedown.git", 313 | "reference": "6d893938171a817f4e9bc9e86f2da1e370b7bcd7" 314 | }, 315 | "dist": { 316 | "type": "zip", 317 | "url": "https://api.github.com/repos/erusev/parsedown/zipball/6d893938171a817f4e9bc9e86f2da1e370b7bcd7", 318 | "reference": "6d893938171a817f4e9bc9e86f2da1e370b7bcd7", 319 | "shasum": "" 320 | }, 321 | "require": { 322 | "ext-mbstring": "*", 323 | "php": ">=5.3.0" 324 | }, 325 | "require-dev": { 326 | "phpunit/phpunit": "^4.8.35" 327 | }, 328 | "type": "library", 329 | "autoload": { 330 | "psr-0": { 331 | "Parsedown": "" 332 | } 333 | }, 334 | "notification-url": "https://packagist.org/downloads/", 335 | "license": [ 336 | "MIT" 337 | ], 338 | "authors": [ 339 | { 340 | "name": "Emanuil Rusev", 341 | "email": "hello@erusev.com", 342 | "homepage": "http://erusev.com" 343 | } 344 | ], 345 | "description": "Parser for Markdown.", 346 | "homepage": "http://parsedown.org", 347 | "keywords": [ 348 | "markdown", 349 | "parser" 350 | ], 351 | "time": "2019-03-17T18:48:37+00:00" 352 | }, 353 | { 354 | "name": "fzaninotto/faker", 355 | "version": "v1.8.0", 356 | "source": { 357 | "type": "git", 358 | "url": "https://github.com/fzaninotto/Faker.git", 359 | "reference": "f72816b43e74063c8b10357394b6bba8cb1c10de" 360 | }, 361 | "dist": { 362 | "type": "zip", 363 | "url": "https://api.github.com/repos/fzaninotto/Faker/zipball/f72816b43e74063c8b10357394b6bba8cb1c10de", 364 | "reference": "f72816b43e74063c8b10357394b6bba8cb1c10de", 365 | "shasum": "" 366 | }, 367 | "require": { 368 | "php": "^5.3.3 || ^7.0" 369 | }, 370 | "require-dev": { 371 | "ext-intl": "*", 372 | "phpunit/phpunit": "^4.8.35 || ^5.7", 373 | "squizlabs/php_codesniffer": "^1.5" 374 | }, 375 | "type": "library", 376 | "extra": { 377 | "branch-alias": { 378 | "dev-master": "1.8-dev" 379 | } 380 | }, 381 | "autoload": { 382 | "psr-4": { 383 | "Faker\\": "src/Faker/" 384 | } 385 | }, 386 | "notification-url": "https://packagist.org/downloads/", 387 | "license": [ 388 | "MIT" 389 | ], 390 | "authors": [ 391 | { 392 | "name": "François Zaninotto" 393 | } 394 | ], 395 | "description": "Faker is a PHP library that generates fake data for you.", 396 | "keywords": [ 397 | "data", 398 | "faker", 399 | "fixtures" 400 | ], 401 | "time": "2018-07-12T10:23:15+00:00" 402 | }, 403 | { 404 | "name": "hamcrest/hamcrest-php", 405 | "version": "v2.0.0", 406 | "source": { 407 | "type": "git", 408 | "url": "https://github.com/hamcrest/hamcrest-php.git", 409 | "reference": "776503d3a8e85d4f9a1148614f95b7a608b046ad" 410 | }, 411 | "dist": { 412 | "type": "zip", 413 | "url": "https://api.github.com/repos/hamcrest/hamcrest-php/zipball/776503d3a8e85d4f9a1148614f95b7a608b046ad", 414 | "reference": "776503d3a8e85d4f9a1148614f95b7a608b046ad", 415 | "shasum": "" 416 | }, 417 | "require": { 418 | "php": "^5.3|^7.0" 419 | }, 420 | "replace": { 421 | "cordoval/hamcrest-php": "*", 422 | "davedevelopment/hamcrest-php": "*", 423 | "kodova/hamcrest-php": "*" 424 | }, 425 | "require-dev": { 426 | "phpunit/php-file-iterator": "1.3.3", 427 | "phpunit/phpunit": "~4.0", 428 | "satooshi/php-coveralls": "^1.0" 429 | }, 430 | "type": "library", 431 | "extra": { 432 | "branch-alias": { 433 | "dev-master": "2.0-dev" 434 | } 435 | }, 436 | "autoload": { 437 | "classmap": [ 438 | "hamcrest" 439 | ] 440 | }, 441 | "notification-url": "https://packagist.org/downloads/", 442 | "license": [ 443 | "BSD" 444 | ], 445 | "description": "This is the PHP port of Hamcrest Matchers", 446 | "keywords": [ 447 | "test" 448 | ], 449 | "time": "2016-01-20T08:20:44+00:00" 450 | }, 451 | { 452 | "name": "laravel/framework", 453 | "version": "v6.1.0", 454 | "source": { 455 | "type": "git", 456 | "url": "https://github.com/laravel/framework.git", 457 | "reference": "a365bea7ff0dea9a50f5904be9e41656def9af4b" 458 | }, 459 | "dist": { 460 | "type": "zip", 461 | "url": "https://api.github.com/repos/laravel/framework/zipball/a365bea7ff0dea9a50f5904be9e41656def9af4b", 462 | "reference": "a365bea7ff0dea9a50f5904be9e41656def9af4b", 463 | "shasum": "" 464 | }, 465 | "require": { 466 | "doctrine/inflector": "^1.1", 467 | "dragonmantank/cron-expression": "^2.0", 468 | "egulias/email-validator": "^2.1.10", 469 | "erusev/parsedown": "^1.7", 470 | "ext-json": "*", 471 | "ext-mbstring": "*", 472 | "ext-openssl": "*", 473 | "league/flysystem": "^1.0.8", 474 | "monolog/monolog": "^1.12|^2.0", 475 | "nesbot/carbon": "^2.0", 476 | "opis/closure": "^3.1", 477 | "php": "^7.2", 478 | "psr/container": "^1.0", 479 | "psr/simple-cache": "^1.0", 480 | "ramsey/uuid": "^3.7", 481 | "swiftmailer/swiftmailer": "^6.0", 482 | "symfony/console": "^4.3.4", 483 | "symfony/debug": "^4.3.4", 484 | "symfony/finder": "^4.3.4", 485 | "symfony/http-foundation": "^4.3.4", 486 | "symfony/http-kernel": "^4.3.4", 487 | "symfony/process": "^4.3.4", 488 | "symfony/routing": "^4.3.4", 489 | "symfony/var-dumper": "^4.3.4", 490 | "tijsverkoyen/css-to-inline-styles": "^2.2.1", 491 | "vlucas/phpdotenv": "^3.3" 492 | }, 493 | "conflict": { 494 | "tightenco/collect": "<5.5.33" 495 | }, 496 | "replace": { 497 | "illuminate/auth": "self.version", 498 | "illuminate/broadcasting": "self.version", 499 | "illuminate/bus": "self.version", 500 | "illuminate/cache": "self.version", 501 | "illuminate/config": "self.version", 502 | "illuminate/console": "self.version", 503 | "illuminate/container": "self.version", 504 | "illuminate/contracts": "self.version", 505 | "illuminate/cookie": "self.version", 506 | "illuminate/database": "self.version", 507 | "illuminate/encryption": "self.version", 508 | "illuminate/events": "self.version", 509 | "illuminate/filesystem": "self.version", 510 | "illuminate/hashing": "self.version", 511 | "illuminate/http": "self.version", 512 | "illuminate/log": "self.version", 513 | "illuminate/mail": "self.version", 514 | "illuminate/notifications": "self.version", 515 | "illuminate/pagination": "self.version", 516 | "illuminate/pipeline": "self.version", 517 | "illuminate/queue": "self.version", 518 | "illuminate/redis": "self.version", 519 | "illuminate/routing": "self.version", 520 | "illuminate/session": "self.version", 521 | "illuminate/support": "self.version", 522 | "illuminate/translation": "self.version", 523 | "illuminate/validation": "self.version", 524 | "illuminate/view": "self.version" 525 | }, 526 | "require-dev": { 527 | "aws/aws-sdk-php": "^3.0", 528 | "doctrine/dbal": "^2.6", 529 | "filp/whoops": "^2.4", 530 | "guzzlehttp/guzzle": "^6.3", 531 | "league/flysystem-cached-adapter": "^1.0", 532 | "mockery/mockery": "^1.2.3", 533 | "moontoast/math": "^1.1", 534 | "orchestra/testbench-core": "^4.0", 535 | "pda/pheanstalk": "^4.0", 536 | "phpunit/phpunit": "^8.3", 537 | "predis/predis": "^1.1.1", 538 | "symfony/cache": "^4.3", 539 | "true/punycode": "^2.1" 540 | }, 541 | "suggest": { 542 | "aws/aws-sdk-php": "Required to use the SQS queue driver, DynamoDb failed job storage and SES mail driver (^3.0).", 543 | "doctrine/dbal": "Required to rename columns and drop SQLite columns (^2.6).", 544 | "ext-gd": "Required to use Illuminate\\Http\\Testing\\FileFactory::image().", 545 | "ext-memcached": "Required to use the memcache cache driver.", 546 | "ext-pcntl": "Required to use all features of the queue worker.", 547 | "ext-posix": "Required to use all features of the queue worker.", 548 | "ext-redis": "Required to use the Redis cache and queue drivers.", 549 | "filp/whoops": "Required for friendly error pages in development (^2.4).", 550 | "fzaninotto/faker": "Required to use the eloquent factory builder (^1.4).", 551 | "guzzlehttp/guzzle": "Required to use the Mailgun mail driver and the ping methods on schedules (^6.0).", 552 | "laravel/tinker": "Required to use the tinker console command (^1.0).", 553 | "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (^1.0).", 554 | "league/flysystem-cached-adapter": "Required to use the Flysystem cache (^1.0).", 555 | "league/flysystem-sftp": "Required to use the Flysystem SFTP driver (^1.0).", 556 | "moontoast/math": "Required to use ordered UUIDs (^1.1).", 557 | "pda/pheanstalk": "Required to use the beanstalk queue driver (^4.0).", 558 | "pusher/pusher-php-server": "Required to use the Pusher broadcast driver (^4.0).", 559 | "symfony/cache": "Required to PSR-6 cache bridge (^4.3.4).", 560 | "symfony/psr-http-message-bridge": "Required to use PSR-7 bridging features (^1.2).", 561 | "wildbit/swiftmailer-postmark": "Required to use Postmark mail driver (^3.0)." 562 | }, 563 | "type": "library", 564 | "extra": { 565 | "branch-alias": { 566 | "dev-master": "6.x-dev" 567 | } 568 | }, 569 | "autoload": { 570 | "files": [ 571 | "src/Illuminate/Foundation/helpers.php", 572 | "src/Illuminate/Support/helpers.php" 573 | ], 574 | "psr-4": { 575 | "Illuminate\\": "src/Illuminate/" 576 | } 577 | }, 578 | "notification-url": "https://packagist.org/downloads/", 579 | "license": [ 580 | "MIT" 581 | ], 582 | "authors": [ 583 | { 584 | "name": "Taylor Otwell", 585 | "email": "taylor@laravel.com" 586 | } 587 | ], 588 | "description": "The Laravel Framework.", 589 | "homepage": "https://laravel.com", 590 | "keywords": [ 591 | "framework", 592 | "laravel" 593 | ], 594 | "time": "2019-10-01T13:55:56+00:00" 595 | }, 596 | { 597 | "name": "league/flysystem", 598 | "version": "1.0.55", 599 | "source": { 600 | "type": "git", 601 | "url": "https://github.com/thephpleague/flysystem.git", 602 | "reference": "33c91155537c6dc899eacdc54a13ac6303f156e6" 603 | }, 604 | "dist": { 605 | "type": "zip", 606 | "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/33c91155537c6dc899eacdc54a13ac6303f156e6", 607 | "reference": "33c91155537c6dc899eacdc54a13ac6303f156e6", 608 | "shasum": "" 609 | }, 610 | "require": { 611 | "ext-fileinfo": "*", 612 | "php": ">=5.5.9" 613 | }, 614 | "conflict": { 615 | "league/flysystem-sftp": "<1.0.6" 616 | }, 617 | "require-dev": { 618 | "phpspec/phpspec": "^3.4", 619 | "phpunit/phpunit": "^5.7.10" 620 | }, 621 | "suggest": { 622 | "ext-fileinfo": "Required for MimeType", 623 | "ext-ftp": "Allows you to use FTP server storage", 624 | "ext-openssl": "Allows you to use FTPS server storage", 625 | "league/flysystem-aws-s3-v2": "Allows you to use S3 storage with AWS SDK v2", 626 | "league/flysystem-aws-s3-v3": "Allows you to use S3 storage with AWS SDK v3", 627 | "league/flysystem-azure": "Allows you to use Windows Azure Blob storage", 628 | "league/flysystem-cached-adapter": "Flysystem adapter decorator for metadata caching", 629 | "league/flysystem-eventable-filesystem": "Allows you to use EventableFilesystem", 630 | "league/flysystem-rackspace": "Allows you to use Rackspace Cloud Files", 631 | "league/flysystem-sftp": "Allows you to use SFTP server storage via phpseclib", 632 | "league/flysystem-webdav": "Allows you to use WebDAV storage", 633 | "league/flysystem-ziparchive": "Allows you to use ZipArchive adapter", 634 | "spatie/flysystem-dropbox": "Allows you to use Dropbox storage", 635 | "srmklive/flysystem-dropbox-v2": "Allows you to use Dropbox storage for PHP 5 applications" 636 | }, 637 | "type": "library", 638 | "extra": { 639 | "branch-alias": { 640 | "dev-master": "1.1-dev" 641 | } 642 | }, 643 | "autoload": { 644 | "psr-4": { 645 | "League\\Flysystem\\": "src/" 646 | } 647 | }, 648 | "notification-url": "https://packagist.org/downloads/", 649 | "license": [ 650 | "MIT" 651 | ], 652 | "authors": [ 653 | { 654 | "name": "Frank de Jonge", 655 | "email": "info@frenky.net" 656 | } 657 | ], 658 | "description": "Filesystem abstraction: Many filesystems, one API.", 659 | "keywords": [ 660 | "Cloud Files", 661 | "WebDAV", 662 | "abstraction", 663 | "aws", 664 | "cloud", 665 | "copy.com", 666 | "dropbox", 667 | "file systems", 668 | "files", 669 | "filesystem", 670 | "filesystems", 671 | "ftp", 672 | "rackspace", 673 | "remote", 674 | "s3", 675 | "sftp", 676 | "storage" 677 | ], 678 | "time": "2019-08-24T11:17:19+00:00" 679 | }, 680 | { 681 | "name": "mockery/mockery", 682 | "version": "1.2.4", 683 | "source": { 684 | "type": "git", 685 | "url": "https://github.com/mockery/mockery.git", 686 | "reference": "b3453f75fd23d9fd41685f2148f4abeacabc6405" 687 | }, 688 | "dist": { 689 | "type": "zip", 690 | "url": "https://api.github.com/repos/mockery/mockery/zipball/b3453f75fd23d9fd41685f2148f4abeacabc6405", 691 | "reference": "b3453f75fd23d9fd41685f2148f4abeacabc6405", 692 | "shasum": "" 693 | }, 694 | "require": { 695 | "hamcrest/hamcrest-php": "~2.0", 696 | "lib-pcre": ">=7.0", 697 | "php": ">=5.6.0" 698 | }, 699 | "require-dev": { 700 | "phpunit/phpunit": "~5.7.10|~6.5|~7.0|~8.0" 701 | }, 702 | "type": "library", 703 | "extra": { 704 | "branch-alias": { 705 | "dev-master": "1.2.x-dev" 706 | } 707 | }, 708 | "autoload": { 709 | "psr-0": { 710 | "Mockery": "library/" 711 | } 712 | }, 713 | "notification-url": "https://packagist.org/downloads/", 714 | "license": [ 715 | "BSD-3-Clause" 716 | ], 717 | "authors": [ 718 | { 719 | "name": "Pádraic Brady", 720 | "email": "padraic.brady@gmail.com", 721 | "homepage": "http://blog.astrumfutura.com" 722 | }, 723 | { 724 | "name": "Dave Marshall", 725 | "email": "dave.marshall@atstsolutions.co.uk", 726 | "homepage": "http://davedevelopment.co.uk" 727 | } 728 | ], 729 | "description": "Mockery is a simple yet flexible PHP mock object framework", 730 | "homepage": "https://github.com/mockery/mockery", 731 | "keywords": [ 732 | "BDD", 733 | "TDD", 734 | "library", 735 | "mock", 736 | "mock objects", 737 | "mockery", 738 | "stub", 739 | "test", 740 | "test double", 741 | "testing" 742 | ], 743 | "time": "2019-09-30T08:30:27+00:00" 744 | }, 745 | { 746 | "name": "monolog/monolog", 747 | "version": "2.0.0", 748 | "source": { 749 | "type": "git", 750 | "url": "https://github.com/Seldaek/monolog.git", 751 | "reference": "68545165e19249013afd1d6f7485aecff07a2d22" 752 | }, 753 | "dist": { 754 | "type": "zip", 755 | "url": "https://api.github.com/repos/Seldaek/monolog/zipball/68545165e19249013afd1d6f7485aecff07a2d22", 756 | "reference": "68545165e19249013afd1d6f7485aecff07a2d22", 757 | "shasum": "" 758 | }, 759 | "require": { 760 | "php": "^7.2", 761 | "psr/log": "^1.0.1" 762 | }, 763 | "provide": { 764 | "psr/log-implementation": "1.0.0" 765 | }, 766 | "require-dev": { 767 | "aws/aws-sdk-php": "^2.4.9 || ^3.0", 768 | "doctrine/couchdb": "~1.0@dev", 769 | "elasticsearch/elasticsearch": "^6.0", 770 | "graylog2/gelf-php": "^1.4.2", 771 | "jakub-onderka/php-parallel-lint": "^0.9", 772 | "php-amqplib/php-amqplib": "~2.4", 773 | "php-console/php-console": "^3.1.3", 774 | "phpspec/prophecy": "^1.6.1", 775 | "phpunit/phpunit": "^8.3", 776 | "predis/predis": "^1.1", 777 | "rollbar/rollbar": "^1.3", 778 | "ruflin/elastica": ">=0.90 <3.0", 779 | "swiftmailer/swiftmailer": "^5.3|^6.0" 780 | }, 781 | "suggest": { 782 | "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", 783 | "doctrine/couchdb": "Allow sending log messages to a CouchDB server", 784 | "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client", 785 | "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", 786 | "ext-mbstring": "Allow to work properly with unicode symbols", 787 | "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)", 788 | "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", 789 | "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)", 790 | "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", 791 | "php-console/php-console": "Allow sending log messages to Google Chrome", 792 | "rollbar/rollbar": "Allow sending log messages to Rollbar", 793 | "ruflin/elastica": "Allow sending log messages to an Elastic Search server" 794 | }, 795 | "type": "library", 796 | "extra": { 797 | "branch-alias": { 798 | "dev-master": "2.x-dev" 799 | } 800 | }, 801 | "autoload": { 802 | "psr-4": { 803 | "Monolog\\": "src/Monolog" 804 | } 805 | }, 806 | "notification-url": "https://packagist.org/downloads/", 807 | "license": [ 808 | "MIT" 809 | ], 810 | "authors": [ 811 | { 812 | "name": "Jordi Boggiano", 813 | "email": "j.boggiano@seld.be", 814 | "homepage": "http://seld.be" 815 | } 816 | ], 817 | "description": "Sends your logs to files, sockets, inboxes, databases and various web services", 818 | "homepage": "http://github.com/Seldaek/monolog", 819 | "keywords": [ 820 | "log", 821 | "logging", 822 | "psr-3" 823 | ], 824 | "time": "2019-08-30T09:56:44+00:00" 825 | }, 826 | { 827 | "name": "myclabs/deep-copy", 828 | "version": "1.9.3", 829 | "source": { 830 | "type": "git", 831 | "url": "https://github.com/myclabs/DeepCopy.git", 832 | "reference": "007c053ae6f31bba39dfa19a7726f56e9763bbea" 833 | }, 834 | "dist": { 835 | "type": "zip", 836 | "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/007c053ae6f31bba39dfa19a7726f56e9763bbea", 837 | "reference": "007c053ae6f31bba39dfa19a7726f56e9763bbea", 838 | "shasum": "" 839 | }, 840 | "require": { 841 | "php": "^7.1" 842 | }, 843 | "replace": { 844 | "myclabs/deep-copy": "self.version" 845 | }, 846 | "require-dev": { 847 | "doctrine/collections": "^1.0", 848 | "doctrine/common": "^2.6", 849 | "phpunit/phpunit": "^7.1" 850 | }, 851 | "type": "library", 852 | "autoload": { 853 | "psr-4": { 854 | "DeepCopy\\": "src/DeepCopy/" 855 | }, 856 | "files": [ 857 | "src/DeepCopy/deep_copy.php" 858 | ] 859 | }, 860 | "notification-url": "https://packagist.org/downloads/", 861 | "license": [ 862 | "MIT" 863 | ], 864 | "description": "Create deep copies (clones) of your objects", 865 | "keywords": [ 866 | "clone", 867 | "copy", 868 | "duplicate", 869 | "object", 870 | "object graph" 871 | ], 872 | "time": "2019-08-09T12:45:53+00:00" 873 | }, 874 | { 875 | "name": "nesbot/carbon", 876 | "version": "2.25.0", 877 | "source": { 878 | "type": "git", 879 | "url": "https://github.com/briannesbitt/Carbon.git", 880 | "reference": "b70da677101cca7b584c7489770d2677c2733593" 881 | }, 882 | "dist": { 883 | "type": "zip", 884 | "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/b70da677101cca7b584c7489770d2677c2733593", 885 | "reference": "b70da677101cca7b584c7489770d2677c2733593", 886 | "shasum": "" 887 | }, 888 | "require": { 889 | "ext-json": "*", 890 | "php": "^7.1.8 || ^8.0", 891 | "symfony/translation": "^3.4 || ^4.0" 892 | }, 893 | "require-dev": { 894 | "friendsofphp/php-cs-fixer": "^2.14 || ^3.0", 895 | "kylekatarnls/multi-tester": "^1.1", 896 | "phpmd/phpmd": "dev-php-7.1-compatibility", 897 | "phpstan/phpstan": "^0.11", 898 | "phpunit/phpunit": "^7.5 || ^8.0", 899 | "squizlabs/php_codesniffer": "^3.4" 900 | }, 901 | "bin": [ 902 | "bin/carbon" 903 | ], 904 | "type": "library", 905 | "extra": { 906 | "laravel": { 907 | "providers": [ 908 | "Carbon\\Laravel\\ServiceProvider" 909 | ] 910 | } 911 | }, 912 | "autoload": { 913 | "psr-4": { 914 | "Carbon\\": "src/Carbon/" 915 | } 916 | }, 917 | "notification-url": "https://packagist.org/downloads/", 918 | "license": [ 919 | "MIT" 920 | ], 921 | "authors": [ 922 | { 923 | "name": "Brian Nesbitt", 924 | "email": "brian@nesbot.com", 925 | "homepage": "http://nesbot.com" 926 | }, 927 | { 928 | "name": "kylekatarnls", 929 | "homepage": "http://github.com/kylekatarnls" 930 | } 931 | ], 932 | "description": "An API extension for DateTime that supports 281 different languages.", 933 | "homepage": "http://carbon.nesbot.com", 934 | "keywords": [ 935 | "date", 936 | "datetime", 937 | "time" 938 | ], 939 | "time": "2019-09-30T16:22:22+00:00" 940 | }, 941 | { 942 | "name": "opis/closure", 943 | "version": "3.4.0", 944 | "source": { 945 | "type": "git", 946 | "url": "https://github.com/opis/closure.git", 947 | "reference": "60a97fff133b1669a5b1776aa8ab06db3f3962b7" 948 | }, 949 | "dist": { 950 | "type": "zip", 951 | "url": "https://api.github.com/repos/opis/closure/zipball/60a97fff133b1669a5b1776aa8ab06db3f3962b7", 952 | "reference": "60a97fff133b1669a5b1776aa8ab06db3f3962b7", 953 | "shasum": "" 954 | }, 955 | "require": { 956 | "php": "^5.4 || ^7.0" 957 | }, 958 | "require-dev": { 959 | "jeremeamia/superclosure": "^2.0", 960 | "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0" 961 | }, 962 | "type": "library", 963 | "extra": { 964 | "branch-alias": { 965 | "dev-master": "3.3.x-dev" 966 | } 967 | }, 968 | "autoload": { 969 | "psr-4": { 970 | "Opis\\Closure\\": "src/" 971 | }, 972 | "files": [ 973 | "functions.php" 974 | ] 975 | }, 976 | "notification-url": "https://packagist.org/downloads/", 977 | "license": [ 978 | "MIT" 979 | ], 980 | "authors": [ 981 | { 982 | "name": "Marius Sarca", 983 | "email": "marius.sarca@gmail.com" 984 | }, 985 | { 986 | "name": "Sorin Sarca", 987 | "email": "sarca_sorin@hotmail.com" 988 | } 989 | ], 990 | "description": "A library that can be used to serialize closures (anonymous functions) and arbitrary objects.", 991 | "homepage": "https://opis.io/closure", 992 | "keywords": [ 993 | "anonymous functions", 994 | "closure", 995 | "function", 996 | "serializable", 997 | "serialization", 998 | "serialize" 999 | ], 1000 | "time": "2019-09-02T21:07:33+00:00" 1001 | }, 1002 | { 1003 | "name": "orchestra/testbench", 1004 | "version": "v4.0.1", 1005 | "source": { 1006 | "type": "git", 1007 | "url": "https://github.com/orchestral/testbench.git", 1008 | "reference": "a10dbc9dba64c6fb98b5169f4daf476691596968" 1009 | }, 1010 | "dist": { 1011 | "type": "zip", 1012 | "url": "https://api.github.com/repos/orchestral/testbench/zipball/a10dbc9dba64c6fb98b5169f4daf476691596968", 1013 | "reference": "a10dbc9dba64c6fb98b5169f4daf476691596968", 1014 | "shasum": "" 1015 | }, 1016 | "require": { 1017 | "laravel/framework": "^6.0", 1018 | "mockery/mockery": "^1.2.3", 1019 | "orchestra/testbench-core": "^4.0", 1020 | "php": ">=7.2", 1021 | "phpunit/phpunit": "^8.3" 1022 | }, 1023 | "type": "library", 1024 | "extra": { 1025 | "branch-alias": { 1026 | "dev-master": "4.0-dev" 1027 | } 1028 | }, 1029 | "notification-url": "https://packagist.org/downloads/", 1030 | "license": [ 1031 | "MIT" 1032 | ], 1033 | "authors": [ 1034 | { 1035 | "name": "Mior Muhammad Zaki", 1036 | "email": "crynobone@gmail.com", 1037 | "homepage": "https://github.com/crynobone" 1038 | } 1039 | ], 1040 | "description": "Laravel Testing Helper for Packages Development", 1041 | "homepage": "http://orchestraplatform.com/docs/latest/components/testbench/", 1042 | "keywords": [ 1043 | "BDD", 1044 | "TDD", 1045 | "laravel", 1046 | "orchestra-platform", 1047 | "orchestral", 1048 | "testing" 1049 | ], 1050 | "time": "2019-09-24T06:46:06+00:00" 1051 | }, 1052 | { 1053 | "name": "orchestra/testbench-core", 1054 | "version": "v4.0.2", 1055 | "source": { 1056 | "type": "git", 1057 | "url": "https://github.com/orchestral/testbench-core.git", 1058 | "reference": "0091a0f1b6493fa445379c58c4d0b757ea4ee2ee" 1059 | }, 1060 | "dist": { 1061 | "type": "zip", 1062 | "url": "https://api.github.com/repos/orchestral/testbench-core/zipball/0091a0f1b6493fa445379c58c4d0b757ea4ee2ee", 1063 | "reference": "0091a0f1b6493fa445379c58c4d0b757ea4ee2ee", 1064 | "shasum": "" 1065 | }, 1066 | "require": { 1067 | "fzaninotto/faker": "^1.4", 1068 | "php": ">=7.2" 1069 | }, 1070 | "require-dev": { 1071 | "laravel/framework": "^6.0", 1072 | "laravel/laravel": "dev-master", 1073 | "mockery/mockery": "^1.2.3", 1074 | "phpunit/phpunit": "^8.3" 1075 | }, 1076 | "suggest": { 1077 | "laravel/framework": "Required for testing (^6.0).", 1078 | "mockery/mockery": "Allow to use Mockery for testing (^1.2.3).", 1079 | "orchestra/testbench-browser-kit": "Allow to use legacy Laravel BrowserKit for testing (^4.0).", 1080 | "orchestra/testbench-dusk": "Allow to use Laravel Dusk for testing (^4.0).", 1081 | "phpunit/phpunit": "Allow to use PHPUnit for testing (^8.3)." 1082 | }, 1083 | "type": "library", 1084 | "extra": { 1085 | "branch-alias": { 1086 | "dev-master": "4.0-dev" 1087 | } 1088 | }, 1089 | "autoload": { 1090 | "psr-4": { 1091 | "Orchestra\\Testbench\\": "src/" 1092 | } 1093 | }, 1094 | "notification-url": "https://packagist.org/downloads/", 1095 | "license": [ 1096 | "MIT" 1097 | ], 1098 | "authors": [ 1099 | { 1100 | "name": "Mior Muhammad Zaki", 1101 | "email": "crynobone@gmail.com", 1102 | "homepage": "https://github.com/crynobone" 1103 | } 1104 | ], 1105 | "description": "Testing Helper for Laravel Development", 1106 | "homepage": "http://orchestraplatform.com/docs/latest/components/testbench/", 1107 | "keywords": [ 1108 | "BDD", 1109 | "TDD", 1110 | "laravel", 1111 | "orchestra-platform", 1112 | "orchestral", 1113 | "testing" 1114 | ], 1115 | "time": "2019-09-15T08:17:06+00:00" 1116 | }, 1117 | { 1118 | "name": "paragonie/random_compat", 1119 | "version": "v9.99.99", 1120 | "source": { 1121 | "type": "git", 1122 | "url": "https://github.com/paragonie/random_compat.git", 1123 | "reference": "84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95" 1124 | }, 1125 | "dist": { 1126 | "type": "zip", 1127 | "url": "https://api.github.com/repos/paragonie/random_compat/zipball/84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95", 1128 | "reference": "84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95", 1129 | "shasum": "" 1130 | }, 1131 | "require": { 1132 | "php": "^7" 1133 | }, 1134 | "require-dev": { 1135 | "phpunit/phpunit": "4.*|5.*", 1136 | "vimeo/psalm": "^1" 1137 | }, 1138 | "suggest": { 1139 | "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes." 1140 | }, 1141 | "type": "library", 1142 | "notification-url": "https://packagist.org/downloads/", 1143 | "license": [ 1144 | "MIT" 1145 | ], 1146 | "authors": [ 1147 | { 1148 | "name": "Paragon Initiative Enterprises", 1149 | "email": "security@paragonie.com", 1150 | "homepage": "https://paragonie.com" 1151 | } 1152 | ], 1153 | "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7", 1154 | "keywords": [ 1155 | "csprng", 1156 | "polyfill", 1157 | "pseudorandom", 1158 | "random" 1159 | ], 1160 | "time": "2018-07-02T15:55:56+00:00" 1161 | }, 1162 | { 1163 | "name": "phar-io/manifest", 1164 | "version": "1.0.3", 1165 | "source": { 1166 | "type": "git", 1167 | "url": "https://github.com/phar-io/manifest.git", 1168 | "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4" 1169 | }, 1170 | "dist": { 1171 | "type": "zip", 1172 | "url": "https://api.github.com/repos/phar-io/manifest/zipball/7761fcacf03b4d4f16e7ccb606d4879ca431fcf4", 1173 | "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4", 1174 | "shasum": "" 1175 | }, 1176 | "require": { 1177 | "ext-dom": "*", 1178 | "ext-phar": "*", 1179 | "phar-io/version": "^2.0", 1180 | "php": "^5.6 || ^7.0" 1181 | }, 1182 | "type": "library", 1183 | "extra": { 1184 | "branch-alias": { 1185 | "dev-master": "1.0.x-dev" 1186 | } 1187 | }, 1188 | "autoload": { 1189 | "classmap": [ 1190 | "src/" 1191 | ] 1192 | }, 1193 | "notification-url": "https://packagist.org/downloads/", 1194 | "license": [ 1195 | "BSD-3-Clause" 1196 | ], 1197 | "authors": [ 1198 | { 1199 | "name": "Arne Blankerts", 1200 | "email": "arne@blankerts.de", 1201 | "role": "Developer" 1202 | }, 1203 | { 1204 | "name": "Sebastian Heuer", 1205 | "email": "sebastian@phpeople.de", 1206 | "role": "Developer" 1207 | }, 1208 | { 1209 | "name": "Sebastian Bergmann", 1210 | "email": "sebastian@phpunit.de", 1211 | "role": "Developer" 1212 | } 1213 | ], 1214 | "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", 1215 | "time": "2018-07-08T19:23:20+00:00" 1216 | }, 1217 | { 1218 | "name": "phar-io/version", 1219 | "version": "2.0.1", 1220 | "source": { 1221 | "type": "git", 1222 | "url": "https://github.com/phar-io/version.git", 1223 | "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6" 1224 | }, 1225 | "dist": { 1226 | "type": "zip", 1227 | "url": "https://api.github.com/repos/phar-io/version/zipball/45a2ec53a73c70ce41d55cedef9063630abaf1b6", 1228 | "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6", 1229 | "shasum": "" 1230 | }, 1231 | "require": { 1232 | "php": "^5.6 || ^7.0" 1233 | }, 1234 | "type": "library", 1235 | "autoload": { 1236 | "classmap": [ 1237 | "src/" 1238 | ] 1239 | }, 1240 | "notification-url": "https://packagist.org/downloads/", 1241 | "license": [ 1242 | "BSD-3-Clause" 1243 | ], 1244 | "authors": [ 1245 | { 1246 | "name": "Arne Blankerts", 1247 | "email": "arne@blankerts.de", 1248 | "role": "Developer" 1249 | }, 1250 | { 1251 | "name": "Sebastian Heuer", 1252 | "email": "sebastian@phpeople.de", 1253 | "role": "Developer" 1254 | }, 1255 | { 1256 | "name": "Sebastian Bergmann", 1257 | "email": "sebastian@phpunit.de", 1258 | "role": "Developer" 1259 | } 1260 | ], 1261 | "description": "Library for handling version information and constraints", 1262 | "time": "2018-07-08T19:19:57+00:00" 1263 | }, 1264 | { 1265 | "name": "phpdocumentor/reflection-common", 1266 | "version": "2.0.0", 1267 | "source": { 1268 | "type": "git", 1269 | "url": "https://github.com/phpDocumentor/ReflectionCommon.git", 1270 | "reference": "63a995caa1ca9e5590304cd845c15ad6d482a62a" 1271 | }, 1272 | "dist": { 1273 | "type": "zip", 1274 | "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/63a995caa1ca9e5590304cd845c15ad6d482a62a", 1275 | "reference": "63a995caa1ca9e5590304cd845c15ad6d482a62a", 1276 | "shasum": "" 1277 | }, 1278 | "require": { 1279 | "php": ">=7.1" 1280 | }, 1281 | "require-dev": { 1282 | "phpunit/phpunit": "~6" 1283 | }, 1284 | "type": "library", 1285 | "extra": { 1286 | "branch-alias": { 1287 | "dev-master": "2.x-dev" 1288 | } 1289 | }, 1290 | "autoload": { 1291 | "psr-4": { 1292 | "phpDocumentor\\Reflection\\": "src/" 1293 | } 1294 | }, 1295 | "notification-url": "https://packagist.org/downloads/", 1296 | "license": [ 1297 | "MIT" 1298 | ], 1299 | "authors": [ 1300 | { 1301 | "name": "Jaap van Otterdijk", 1302 | "email": "opensource@ijaap.nl" 1303 | } 1304 | ], 1305 | "description": "Common reflection classes used by phpdocumentor to reflect the code structure", 1306 | "homepage": "http://www.phpdoc.org", 1307 | "keywords": [ 1308 | "FQSEN", 1309 | "phpDocumentor", 1310 | "phpdoc", 1311 | "reflection", 1312 | "static analysis" 1313 | ], 1314 | "time": "2018-08-07T13:53:10+00:00" 1315 | }, 1316 | { 1317 | "name": "phpdocumentor/reflection-docblock", 1318 | "version": "4.3.2", 1319 | "source": { 1320 | "type": "git", 1321 | "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", 1322 | "reference": "b83ff7cfcfee7827e1e78b637a5904fe6a96698e" 1323 | }, 1324 | "dist": { 1325 | "type": "zip", 1326 | "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/b83ff7cfcfee7827e1e78b637a5904fe6a96698e", 1327 | "reference": "b83ff7cfcfee7827e1e78b637a5904fe6a96698e", 1328 | "shasum": "" 1329 | }, 1330 | "require": { 1331 | "php": "^7.0", 1332 | "phpdocumentor/reflection-common": "^1.0.0 || ^2.0.0", 1333 | "phpdocumentor/type-resolver": "~0.4 || ^1.0.0", 1334 | "webmozart/assert": "^1.0" 1335 | }, 1336 | "require-dev": { 1337 | "doctrine/instantiator": "^1.0.5", 1338 | "mockery/mockery": "^1.0", 1339 | "phpunit/phpunit": "^6.4" 1340 | }, 1341 | "type": "library", 1342 | "extra": { 1343 | "branch-alias": { 1344 | "dev-master": "4.x-dev" 1345 | } 1346 | }, 1347 | "autoload": { 1348 | "psr-4": { 1349 | "phpDocumentor\\Reflection\\": [ 1350 | "src/" 1351 | ] 1352 | } 1353 | }, 1354 | "notification-url": "https://packagist.org/downloads/", 1355 | "license": [ 1356 | "MIT" 1357 | ], 1358 | "authors": [ 1359 | { 1360 | "name": "Mike van Riel", 1361 | "email": "me@mikevanriel.com" 1362 | } 1363 | ], 1364 | "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", 1365 | "time": "2019-09-12T14:27:41+00:00" 1366 | }, 1367 | { 1368 | "name": "phpdocumentor/type-resolver", 1369 | "version": "1.0.1", 1370 | "source": { 1371 | "type": "git", 1372 | "url": "https://github.com/phpDocumentor/TypeResolver.git", 1373 | "reference": "2e32a6d48972b2c1976ed5d8967145b6cec4a4a9" 1374 | }, 1375 | "dist": { 1376 | "type": "zip", 1377 | "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/2e32a6d48972b2c1976ed5d8967145b6cec4a4a9", 1378 | "reference": "2e32a6d48972b2c1976ed5d8967145b6cec4a4a9", 1379 | "shasum": "" 1380 | }, 1381 | "require": { 1382 | "php": "^7.1", 1383 | "phpdocumentor/reflection-common": "^2.0" 1384 | }, 1385 | "require-dev": { 1386 | "ext-tokenizer": "^7.1", 1387 | "mockery/mockery": "~1", 1388 | "phpunit/phpunit": "^7.0" 1389 | }, 1390 | "type": "library", 1391 | "extra": { 1392 | "branch-alias": { 1393 | "dev-master": "1.x-dev" 1394 | } 1395 | }, 1396 | "autoload": { 1397 | "psr-4": { 1398 | "phpDocumentor\\Reflection\\": "src" 1399 | } 1400 | }, 1401 | "notification-url": "https://packagist.org/downloads/", 1402 | "license": [ 1403 | "MIT" 1404 | ], 1405 | "authors": [ 1406 | { 1407 | "name": "Mike van Riel", 1408 | "email": "me@mikevanriel.com" 1409 | } 1410 | ], 1411 | "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", 1412 | "time": "2019-08-22T18:11:29+00:00" 1413 | }, 1414 | { 1415 | "name": "phpoption/phpoption", 1416 | "version": "1.5.0", 1417 | "source": { 1418 | "type": "git", 1419 | "url": "https://github.com/schmittjoh/php-option.git", 1420 | "reference": "94e644f7d2051a5f0fcf77d81605f152eecff0ed" 1421 | }, 1422 | "dist": { 1423 | "type": "zip", 1424 | "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/94e644f7d2051a5f0fcf77d81605f152eecff0ed", 1425 | "reference": "94e644f7d2051a5f0fcf77d81605f152eecff0ed", 1426 | "shasum": "" 1427 | }, 1428 | "require": { 1429 | "php": ">=5.3.0" 1430 | }, 1431 | "require-dev": { 1432 | "phpunit/phpunit": "4.7.*" 1433 | }, 1434 | "type": "library", 1435 | "extra": { 1436 | "branch-alias": { 1437 | "dev-master": "1.3-dev" 1438 | } 1439 | }, 1440 | "autoload": { 1441 | "psr-0": { 1442 | "PhpOption\\": "src/" 1443 | } 1444 | }, 1445 | "notification-url": "https://packagist.org/downloads/", 1446 | "license": [ 1447 | "Apache2" 1448 | ], 1449 | "authors": [ 1450 | { 1451 | "name": "Johannes M. Schmitt", 1452 | "email": "schmittjoh@gmail.com" 1453 | } 1454 | ], 1455 | "description": "Option Type for PHP", 1456 | "keywords": [ 1457 | "language", 1458 | "option", 1459 | "php", 1460 | "type" 1461 | ], 1462 | "time": "2015-07-25T16:39:46+00:00" 1463 | }, 1464 | { 1465 | "name": "phpspec/prophecy", 1466 | "version": "1.9.0", 1467 | "source": { 1468 | "type": "git", 1469 | "url": "https://github.com/phpspec/prophecy.git", 1470 | "reference": "f6811d96d97bdf400077a0cc100ae56aa32b9203" 1471 | }, 1472 | "dist": { 1473 | "type": "zip", 1474 | "url": "https://api.github.com/repos/phpspec/prophecy/zipball/f6811d96d97bdf400077a0cc100ae56aa32b9203", 1475 | "reference": "f6811d96d97bdf400077a0cc100ae56aa32b9203", 1476 | "shasum": "" 1477 | }, 1478 | "require": { 1479 | "doctrine/instantiator": "^1.0.2", 1480 | "php": "^5.3|^7.0", 1481 | "phpdocumentor/reflection-docblock": "^2.0|^3.0.2|^4.0|^5.0", 1482 | "sebastian/comparator": "^1.1|^2.0|^3.0", 1483 | "sebastian/recursion-context": "^1.0|^2.0|^3.0" 1484 | }, 1485 | "require-dev": { 1486 | "phpspec/phpspec": "^2.5|^3.2", 1487 | "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5 || ^7.1" 1488 | }, 1489 | "type": "library", 1490 | "extra": { 1491 | "branch-alias": { 1492 | "dev-master": "1.8.x-dev" 1493 | } 1494 | }, 1495 | "autoload": { 1496 | "psr-4": { 1497 | "Prophecy\\": "src/Prophecy" 1498 | } 1499 | }, 1500 | "notification-url": "https://packagist.org/downloads/", 1501 | "license": [ 1502 | "MIT" 1503 | ], 1504 | "authors": [ 1505 | { 1506 | "name": "Konstantin Kudryashov", 1507 | "email": "ever.zet@gmail.com", 1508 | "homepage": "http://everzet.com" 1509 | }, 1510 | { 1511 | "name": "Marcello Duarte", 1512 | "email": "marcello.duarte@gmail.com" 1513 | } 1514 | ], 1515 | "description": "Highly opinionated mocking framework for PHP 5.3+", 1516 | "homepage": "https://github.com/phpspec/prophecy", 1517 | "keywords": [ 1518 | "Double", 1519 | "Dummy", 1520 | "fake", 1521 | "mock", 1522 | "spy", 1523 | "stub" 1524 | ], 1525 | "time": "2019-10-03T11:07:50+00:00" 1526 | }, 1527 | { 1528 | "name": "phpunit/php-code-coverage", 1529 | "version": "7.0.8", 1530 | "source": { 1531 | "type": "git", 1532 | "url": "https://github.com/sebastianbergmann/php-code-coverage.git", 1533 | "reference": "aa0d179a13284c7420fc281fc32750e6cc7c9e2f" 1534 | }, 1535 | "dist": { 1536 | "type": "zip", 1537 | "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/aa0d179a13284c7420fc281fc32750e6cc7c9e2f", 1538 | "reference": "aa0d179a13284c7420fc281fc32750e6cc7c9e2f", 1539 | "shasum": "" 1540 | }, 1541 | "require": { 1542 | "ext-dom": "*", 1543 | "ext-xmlwriter": "*", 1544 | "php": "^7.2", 1545 | "phpunit/php-file-iterator": "^2.0.2", 1546 | "phpunit/php-text-template": "^1.2.1", 1547 | "phpunit/php-token-stream": "^3.1.1", 1548 | "sebastian/code-unit-reverse-lookup": "^1.0.1", 1549 | "sebastian/environment": "^4.2.2", 1550 | "sebastian/version": "^2.0.1", 1551 | "theseer/tokenizer": "^1.1.3" 1552 | }, 1553 | "require-dev": { 1554 | "phpunit/phpunit": "^8.2.2" 1555 | }, 1556 | "suggest": { 1557 | "ext-xdebug": "^2.7.2" 1558 | }, 1559 | "type": "library", 1560 | "extra": { 1561 | "branch-alias": { 1562 | "dev-master": "7.0-dev" 1563 | } 1564 | }, 1565 | "autoload": { 1566 | "classmap": [ 1567 | "src/" 1568 | ] 1569 | }, 1570 | "notification-url": "https://packagist.org/downloads/", 1571 | "license": [ 1572 | "BSD-3-Clause" 1573 | ], 1574 | "authors": [ 1575 | { 1576 | "name": "Sebastian Bergmann", 1577 | "email": "sebastian@phpunit.de", 1578 | "role": "lead" 1579 | } 1580 | ], 1581 | "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", 1582 | "homepage": "https://github.com/sebastianbergmann/php-code-coverage", 1583 | "keywords": [ 1584 | "coverage", 1585 | "testing", 1586 | "xunit" 1587 | ], 1588 | "time": "2019-09-17T06:24:36+00:00" 1589 | }, 1590 | { 1591 | "name": "phpunit/php-file-iterator", 1592 | "version": "2.0.2", 1593 | "source": { 1594 | "type": "git", 1595 | "url": "https://github.com/sebastianbergmann/php-file-iterator.git", 1596 | "reference": "050bedf145a257b1ff02746c31894800e5122946" 1597 | }, 1598 | "dist": { 1599 | "type": "zip", 1600 | "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/050bedf145a257b1ff02746c31894800e5122946", 1601 | "reference": "050bedf145a257b1ff02746c31894800e5122946", 1602 | "shasum": "" 1603 | }, 1604 | "require": { 1605 | "php": "^7.1" 1606 | }, 1607 | "require-dev": { 1608 | "phpunit/phpunit": "^7.1" 1609 | }, 1610 | "type": "library", 1611 | "extra": { 1612 | "branch-alias": { 1613 | "dev-master": "2.0.x-dev" 1614 | } 1615 | }, 1616 | "autoload": { 1617 | "classmap": [ 1618 | "src/" 1619 | ] 1620 | }, 1621 | "notification-url": "https://packagist.org/downloads/", 1622 | "license": [ 1623 | "BSD-3-Clause" 1624 | ], 1625 | "authors": [ 1626 | { 1627 | "name": "Sebastian Bergmann", 1628 | "email": "sebastian@phpunit.de", 1629 | "role": "lead" 1630 | } 1631 | ], 1632 | "description": "FilterIterator implementation that filters files based on a list of suffixes.", 1633 | "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", 1634 | "keywords": [ 1635 | "filesystem", 1636 | "iterator" 1637 | ], 1638 | "time": "2018-09-13T20:33:42+00:00" 1639 | }, 1640 | { 1641 | "name": "phpunit/php-text-template", 1642 | "version": "1.2.1", 1643 | "source": { 1644 | "type": "git", 1645 | "url": "https://github.com/sebastianbergmann/php-text-template.git", 1646 | "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686" 1647 | }, 1648 | "dist": { 1649 | "type": "zip", 1650 | "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686", 1651 | "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686", 1652 | "shasum": "" 1653 | }, 1654 | "require": { 1655 | "php": ">=5.3.3" 1656 | }, 1657 | "type": "library", 1658 | "autoload": { 1659 | "classmap": [ 1660 | "src/" 1661 | ] 1662 | }, 1663 | "notification-url": "https://packagist.org/downloads/", 1664 | "license": [ 1665 | "BSD-3-Clause" 1666 | ], 1667 | "authors": [ 1668 | { 1669 | "name": "Sebastian Bergmann", 1670 | "email": "sebastian@phpunit.de", 1671 | "role": "lead" 1672 | } 1673 | ], 1674 | "description": "Simple template engine.", 1675 | "homepage": "https://github.com/sebastianbergmann/php-text-template/", 1676 | "keywords": [ 1677 | "template" 1678 | ], 1679 | "time": "2015-06-21T13:50:34+00:00" 1680 | }, 1681 | { 1682 | "name": "phpunit/php-timer", 1683 | "version": "2.1.2", 1684 | "source": { 1685 | "type": "git", 1686 | "url": "https://github.com/sebastianbergmann/php-timer.git", 1687 | "reference": "1038454804406b0b5f5f520358e78c1c2f71501e" 1688 | }, 1689 | "dist": { 1690 | "type": "zip", 1691 | "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/1038454804406b0b5f5f520358e78c1c2f71501e", 1692 | "reference": "1038454804406b0b5f5f520358e78c1c2f71501e", 1693 | "shasum": "" 1694 | }, 1695 | "require": { 1696 | "php": "^7.1" 1697 | }, 1698 | "require-dev": { 1699 | "phpunit/phpunit": "^7.0" 1700 | }, 1701 | "type": "library", 1702 | "extra": { 1703 | "branch-alias": { 1704 | "dev-master": "2.1-dev" 1705 | } 1706 | }, 1707 | "autoload": { 1708 | "classmap": [ 1709 | "src/" 1710 | ] 1711 | }, 1712 | "notification-url": "https://packagist.org/downloads/", 1713 | "license": [ 1714 | "BSD-3-Clause" 1715 | ], 1716 | "authors": [ 1717 | { 1718 | "name": "Sebastian Bergmann", 1719 | "email": "sebastian@phpunit.de", 1720 | "role": "lead" 1721 | } 1722 | ], 1723 | "description": "Utility class for timing", 1724 | "homepage": "https://github.com/sebastianbergmann/php-timer/", 1725 | "keywords": [ 1726 | "timer" 1727 | ], 1728 | "time": "2019-06-07T04:22:29+00:00" 1729 | }, 1730 | { 1731 | "name": "phpunit/php-token-stream", 1732 | "version": "3.1.1", 1733 | "source": { 1734 | "type": "git", 1735 | "url": "https://github.com/sebastianbergmann/php-token-stream.git", 1736 | "reference": "995192df77f63a59e47f025390d2d1fdf8f425ff" 1737 | }, 1738 | "dist": { 1739 | "type": "zip", 1740 | "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/995192df77f63a59e47f025390d2d1fdf8f425ff", 1741 | "reference": "995192df77f63a59e47f025390d2d1fdf8f425ff", 1742 | "shasum": "" 1743 | }, 1744 | "require": { 1745 | "ext-tokenizer": "*", 1746 | "php": "^7.1" 1747 | }, 1748 | "require-dev": { 1749 | "phpunit/phpunit": "^7.0" 1750 | }, 1751 | "type": "library", 1752 | "extra": { 1753 | "branch-alias": { 1754 | "dev-master": "3.1-dev" 1755 | } 1756 | }, 1757 | "autoload": { 1758 | "classmap": [ 1759 | "src/" 1760 | ] 1761 | }, 1762 | "notification-url": "https://packagist.org/downloads/", 1763 | "license": [ 1764 | "BSD-3-Clause" 1765 | ], 1766 | "authors": [ 1767 | { 1768 | "name": "Sebastian Bergmann", 1769 | "email": "sebastian@phpunit.de" 1770 | } 1771 | ], 1772 | "description": "Wrapper around PHP's tokenizer extension.", 1773 | "homepage": "https://github.com/sebastianbergmann/php-token-stream/", 1774 | "keywords": [ 1775 | "tokenizer" 1776 | ], 1777 | "time": "2019-09-17T06:23:10+00:00" 1778 | }, 1779 | { 1780 | "name": "phpunit/phpunit", 1781 | "version": "8.4.0", 1782 | "source": { 1783 | "type": "git", 1784 | "url": "https://github.com/sebastianbergmann/phpunit.git", 1785 | "reference": "57e5e77b62086033528ee1f4063ae03035f57894" 1786 | }, 1787 | "dist": { 1788 | "type": "zip", 1789 | "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/57e5e77b62086033528ee1f4063ae03035f57894", 1790 | "reference": "57e5e77b62086033528ee1f4063ae03035f57894", 1791 | "shasum": "" 1792 | }, 1793 | "require": { 1794 | "doctrine/instantiator": "^1.2.0", 1795 | "ext-dom": "*", 1796 | "ext-json": "*", 1797 | "ext-libxml": "*", 1798 | "ext-mbstring": "*", 1799 | "ext-xml": "*", 1800 | "ext-xmlwriter": "*", 1801 | "myclabs/deep-copy": "^1.9.1", 1802 | "phar-io/manifest": "^1.0.3", 1803 | "phar-io/version": "^2.0.1", 1804 | "php": "^7.2", 1805 | "phpspec/prophecy": "^1.8.1", 1806 | "phpunit/php-code-coverage": "^7.0.7", 1807 | "phpunit/php-file-iterator": "^2.0.2", 1808 | "phpunit/php-text-template": "^1.2.1", 1809 | "phpunit/php-timer": "^2.1.2", 1810 | "sebastian/comparator": "^3.0.2", 1811 | "sebastian/diff": "^3.0.2", 1812 | "sebastian/environment": "^4.2.2", 1813 | "sebastian/exporter": "^3.1.1", 1814 | "sebastian/global-state": "^3.0.0", 1815 | "sebastian/object-enumerator": "^3.0.3", 1816 | "sebastian/resource-operations": "^2.0.1", 1817 | "sebastian/type": "^1.1.3", 1818 | "sebastian/version": "^2.0.1" 1819 | }, 1820 | "require-dev": { 1821 | "ext-pdo": "*" 1822 | }, 1823 | "suggest": { 1824 | "ext-soap": "*", 1825 | "ext-xdebug": "*", 1826 | "phpunit/php-invoker": "^2.0.0" 1827 | }, 1828 | "bin": [ 1829 | "phpunit" 1830 | ], 1831 | "type": "library", 1832 | "extra": { 1833 | "branch-alias": { 1834 | "dev-master": "8.4-dev" 1835 | } 1836 | }, 1837 | "autoload": { 1838 | "classmap": [ 1839 | "src/" 1840 | ] 1841 | }, 1842 | "notification-url": "https://packagist.org/downloads/", 1843 | "license": [ 1844 | "BSD-3-Clause" 1845 | ], 1846 | "authors": [ 1847 | { 1848 | "name": "Sebastian Bergmann", 1849 | "email": "sebastian@phpunit.de", 1850 | "role": "lead" 1851 | } 1852 | ], 1853 | "description": "The PHP Unit Testing framework.", 1854 | "homepage": "https://phpunit.de/", 1855 | "keywords": [ 1856 | "phpunit", 1857 | "testing", 1858 | "xunit" 1859 | ], 1860 | "time": "2019-10-04T03:12:25+00:00" 1861 | }, 1862 | { 1863 | "name": "psr/container", 1864 | "version": "1.0.0", 1865 | "source": { 1866 | "type": "git", 1867 | "url": "https://github.com/php-fig/container.git", 1868 | "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f" 1869 | }, 1870 | "dist": { 1871 | "type": "zip", 1872 | "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f", 1873 | "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f", 1874 | "shasum": "" 1875 | }, 1876 | "require": { 1877 | "php": ">=5.3.0" 1878 | }, 1879 | "type": "library", 1880 | "extra": { 1881 | "branch-alias": { 1882 | "dev-master": "1.0.x-dev" 1883 | } 1884 | }, 1885 | "autoload": { 1886 | "psr-4": { 1887 | "Psr\\Container\\": "src/" 1888 | } 1889 | }, 1890 | "notification-url": "https://packagist.org/downloads/", 1891 | "license": [ 1892 | "MIT" 1893 | ], 1894 | "authors": [ 1895 | { 1896 | "name": "PHP-FIG", 1897 | "homepage": "http://www.php-fig.org/" 1898 | } 1899 | ], 1900 | "description": "Common Container Interface (PHP FIG PSR-11)", 1901 | "homepage": "https://github.com/php-fig/container", 1902 | "keywords": [ 1903 | "PSR-11", 1904 | "container", 1905 | "container-interface", 1906 | "container-interop", 1907 | "psr" 1908 | ], 1909 | "time": "2017-02-14T16:28:37+00:00" 1910 | }, 1911 | { 1912 | "name": "psr/log", 1913 | "version": "1.1.0", 1914 | "source": { 1915 | "type": "git", 1916 | "url": "https://github.com/php-fig/log.git", 1917 | "reference": "6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd" 1918 | }, 1919 | "dist": { 1920 | "type": "zip", 1921 | "url": "https://api.github.com/repos/php-fig/log/zipball/6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd", 1922 | "reference": "6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd", 1923 | "shasum": "" 1924 | }, 1925 | "require": { 1926 | "php": ">=5.3.0" 1927 | }, 1928 | "type": "library", 1929 | "extra": { 1930 | "branch-alias": { 1931 | "dev-master": "1.0.x-dev" 1932 | } 1933 | }, 1934 | "autoload": { 1935 | "psr-4": { 1936 | "Psr\\Log\\": "Psr/Log/" 1937 | } 1938 | }, 1939 | "notification-url": "https://packagist.org/downloads/", 1940 | "license": [ 1941 | "MIT" 1942 | ], 1943 | "authors": [ 1944 | { 1945 | "name": "PHP-FIG", 1946 | "homepage": "http://www.php-fig.org/" 1947 | } 1948 | ], 1949 | "description": "Common interface for logging libraries", 1950 | "homepage": "https://github.com/php-fig/log", 1951 | "keywords": [ 1952 | "log", 1953 | "psr", 1954 | "psr-3" 1955 | ], 1956 | "time": "2018-11-20T15:27:04+00:00" 1957 | }, 1958 | { 1959 | "name": "psr/simple-cache", 1960 | "version": "1.0.1", 1961 | "source": { 1962 | "type": "git", 1963 | "url": "https://github.com/php-fig/simple-cache.git", 1964 | "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b" 1965 | }, 1966 | "dist": { 1967 | "type": "zip", 1968 | "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", 1969 | "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", 1970 | "shasum": "" 1971 | }, 1972 | "require": { 1973 | "php": ">=5.3.0" 1974 | }, 1975 | "type": "library", 1976 | "extra": { 1977 | "branch-alias": { 1978 | "dev-master": "1.0.x-dev" 1979 | } 1980 | }, 1981 | "autoload": { 1982 | "psr-4": { 1983 | "Psr\\SimpleCache\\": "src/" 1984 | } 1985 | }, 1986 | "notification-url": "https://packagist.org/downloads/", 1987 | "license": [ 1988 | "MIT" 1989 | ], 1990 | "authors": [ 1991 | { 1992 | "name": "PHP-FIG", 1993 | "homepage": "http://www.php-fig.org/" 1994 | } 1995 | ], 1996 | "description": "Common interfaces for simple caching", 1997 | "keywords": [ 1998 | "cache", 1999 | "caching", 2000 | "psr", 2001 | "psr-16", 2002 | "simple-cache" 2003 | ], 2004 | "time": "2017-10-23T01:57:42+00:00" 2005 | }, 2006 | { 2007 | "name": "ramsey/uuid", 2008 | "version": "3.8.0", 2009 | "source": { 2010 | "type": "git", 2011 | "url": "https://github.com/ramsey/uuid.git", 2012 | "reference": "d09ea80159c1929d75b3f9c60504d613aeb4a1e3" 2013 | }, 2014 | "dist": { 2015 | "type": "zip", 2016 | "url": "https://api.github.com/repos/ramsey/uuid/zipball/d09ea80159c1929d75b3f9c60504d613aeb4a1e3", 2017 | "reference": "d09ea80159c1929d75b3f9c60504d613aeb4a1e3", 2018 | "shasum": "" 2019 | }, 2020 | "require": { 2021 | "paragonie/random_compat": "^1.0|^2.0|9.99.99", 2022 | "php": "^5.4 || ^7.0", 2023 | "symfony/polyfill-ctype": "^1.8" 2024 | }, 2025 | "replace": { 2026 | "rhumsaa/uuid": "self.version" 2027 | }, 2028 | "require-dev": { 2029 | "codeception/aspect-mock": "^1.0 | ~2.0.0", 2030 | "doctrine/annotations": "~1.2.0", 2031 | "goaop/framework": "1.0.0-alpha.2 | ^1.0 | ~2.1.0", 2032 | "ircmaxell/random-lib": "^1.1", 2033 | "jakub-onderka/php-parallel-lint": "^0.9.0", 2034 | "mockery/mockery": "^0.9.9", 2035 | "moontoast/math": "^1.1", 2036 | "php-mock/php-mock-phpunit": "^0.3|^1.1", 2037 | "phpunit/phpunit": "^4.7|^5.0|^6.5", 2038 | "squizlabs/php_codesniffer": "^2.3" 2039 | }, 2040 | "suggest": { 2041 | "ext-ctype": "Provides support for PHP Ctype functions", 2042 | "ext-libsodium": "Provides the PECL libsodium extension for use with the SodiumRandomGenerator", 2043 | "ext-uuid": "Provides the PECL UUID extension for use with the PeclUuidTimeGenerator and PeclUuidRandomGenerator", 2044 | "ircmaxell/random-lib": "Provides RandomLib for use with the RandomLibAdapter", 2045 | "moontoast/math": "Provides support for converting UUID to 128-bit integer (in string form).", 2046 | "ramsey/uuid-console": "A console application for generating UUIDs with ramsey/uuid", 2047 | "ramsey/uuid-doctrine": "Allows the use of Ramsey\\Uuid\\Uuid as Doctrine field type." 2048 | }, 2049 | "type": "library", 2050 | "extra": { 2051 | "branch-alias": { 2052 | "dev-master": "3.x-dev" 2053 | } 2054 | }, 2055 | "autoload": { 2056 | "psr-4": { 2057 | "Ramsey\\Uuid\\": "src/" 2058 | } 2059 | }, 2060 | "notification-url": "https://packagist.org/downloads/", 2061 | "license": [ 2062 | "MIT" 2063 | ], 2064 | "authors": [ 2065 | { 2066 | "name": "Marijn Huizendveld", 2067 | "email": "marijn.huizendveld@gmail.com" 2068 | }, 2069 | { 2070 | "name": "Thibaud Fabre", 2071 | "email": "thibaud@aztech.io" 2072 | }, 2073 | { 2074 | "name": "Ben Ramsey", 2075 | "email": "ben@benramsey.com", 2076 | "homepage": "https://benramsey.com" 2077 | } 2078 | ], 2079 | "description": "Formerly rhumsaa/uuid. A PHP 5.4+ library for generating RFC 4122 version 1, 3, 4, and 5 universally unique identifiers (UUID).", 2080 | "homepage": "https://github.com/ramsey/uuid", 2081 | "keywords": [ 2082 | "guid", 2083 | "identifier", 2084 | "uuid" 2085 | ], 2086 | "time": "2018-07-19T23:38:55+00:00" 2087 | }, 2088 | { 2089 | "name": "sebastian/code-unit-reverse-lookup", 2090 | "version": "1.0.1", 2091 | "source": { 2092 | "type": "git", 2093 | "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", 2094 | "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18" 2095 | }, 2096 | "dist": { 2097 | "type": "zip", 2098 | "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", 2099 | "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", 2100 | "shasum": "" 2101 | }, 2102 | "require": { 2103 | "php": "^5.6 || ^7.0" 2104 | }, 2105 | "require-dev": { 2106 | "phpunit/phpunit": "^5.7 || ^6.0" 2107 | }, 2108 | "type": "library", 2109 | "extra": { 2110 | "branch-alias": { 2111 | "dev-master": "1.0.x-dev" 2112 | } 2113 | }, 2114 | "autoload": { 2115 | "classmap": [ 2116 | "src/" 2117 | ] 2118 | }, 2119 | "notification-url": "https://packagist.org/downloads/", 2120 | "license": [ 2121 | "BSD-3-Clause" 2122 | ], 2123 | "authors": [ 2124 | { 2125 | "name": "Sebastian Bergmann", 2126 | "email": "sebastian@phpunit.de" 2127 | } 2128 | ], 2129 | "description": "Looks up which function or method a line of code belongs to", 2130 | "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", 2131 | "time": "2017-03-04T06:30:41+00:00" 2132 | }, 2133 | { 2134 | "name": "sebastian/comparator", 2135 | "version": "3.0.2", 2136 | "source": { 2137 | "type": "git", 2138 | "url": "https://github.com/sebastianbergmann/comparator.git", 2139 | "reference": "5de4fc177adf9bce8df98d8d141a7559d7ccf6da" 2140 | }, 2141 | "dist": { 2142 | "type": "zip", 2143 | "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/5de4fc177adf9bce8df98d8d141a7559d7ccf6da", 2144 | "reference": "5de4fc177adf9bce8df98d8d141a7559d7ccf6da", 2145 | "shasum": "" 2146 | }, 2147 | "require": { 2148 | "php": "^7.1", 2149 | "sebastian/diff": "^3.0", 2150 | "sebastian/exporter": "^3.1" 2151 | }, 2152 | "require-dev": { 2153 | "phpunit/phpunit": "^7.1" 2154 | }, 2155 | "type": "library", 2156 | "extra": { 2157 | "branch-alias": { 2158 | "dev-master": "3.0-dev" 2159 | } 2160 | }, 2161 | "autoload": { 2162 | "classmap": [ 2163 | "src/" 2164 | ] 2165 | }, 2166 | "notification-url": "https://packagist.org/downloads/", 2167 | "license": [ 2168 | "BSD-3-Clause" 2169 | ], 2170 | "authors": [ 2171 | { 2172 | "name": "Jeff Welch", 2173 | "email": "whatthejeff@gmail.com" 2174 | }, 2175 | { 2176 | "name": "Volker Dusch", 2177 | "email": "github@wallbash.com" 2178 | }, 2179 | { 2180 | "name": "Bernhard Schussek", 2181 | "email": "bschussek@2bepublished.at" 2182 | }, 2183 | { 2184 | "name": "Sebastian Bergmann", 2185 | "email": "sebastian@phpunit.de" 2186 | } 2187 | ], 2188 | "description": "Provides the functionality to compare PHP values for equality", 2189 | "homepage": "https://github.com/sebastianbergmann/comparator", 2190 | "keywords": [ 2191 | "comparator", 2192 | "compare", 2193 | "equality" 2194 | ], 2195 | "time": "2018-07-12T15:12:46+00:00" 2196 | }, 2197 | { 2198 | "name": "sebastian/diff", 2199 | "version": "3.0.2", 2200 | "source": { 2201 | "type": "git", 2202 | "url": "https://github.com/sebastianbergmann/diff.git", 2203 | "reference": "720fcc7e9b5cf384ea68d9d930d480907a0c1a29" 2204 | }, 2205 | "dist": { 2206 | "type": "zip", 2207 | "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/720fcc7e9b5cf384ea68d9d930d480907a0c1a29", 2208 | "reference": "720fcc7e9b5cf384ea68d9d930d480907a0c1a29", 2209 | "shasum": "" 2210 | }, 2211 | "require": { 2212 | "php": "^7.1" 2213 | }, 2214 | "require-dev": { 2215 | "phpunit/phpunit": "^7.5 || ^8.0", 2216 | "symfony/process": "^2 || ^3.3 || ^4" 2217 | }, 2218 | "type": "library", 2219 | "extra": { 2220 | "branch-alias": { 2221 | "dev-master": "3.0-dev" 2222 | } 2223 | }, 2224 | "autoload": { 2225 | "classmap": [ 2226 | "src/" 2227 | ] 2228 | }, 2229 | "notification-url": "https://packagist.org/downloads/", 2230 | "license": [ 2231 | "BSD-3-Clause" 2232 | ], 2233 | "authors": [ 2234 | { 2235 | "name": "Kore Nordmann", 2236 | "email": "mail@kore-nordmann.de" 2237 | }, 2238 | { 2239 | "name": "Sebastian Bergmann", 2240 | "email": "sebastian@phpunit.de" 2241 | } 2242 | ], 2243 | "description": "Diff implementation", 2244 | "homepage": "https://github.com/sebastianbergmann/diff", 2245 | "keywords": [ 2246 | "diff", 2247 | "udiff", 2248 | "unidiff", 2249 | "unified diff" 2250 | ], 2251 | "time": "2019-02-04T06:01:07+00:00" 2252 | }, 2253 | { 2254 | "name": "sebastian/environment", 2255 | "version": "4.2.2", 2256 | "source": { 2257 | "type": "git", 2258 | "url": "https://github.com/sebastianbergmann/environment.git", 2259 | "reference": "f2a2c8e1c97c11ace607a7a667d73d47c19fe404" 2260 | }, 2261 | "dist": { 2262 | "type": "zip", 2263 | "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/f2a2c8e1c97c11ace607a7a667d73d47c19fe404", 2264 | "reference": "f2a2c8e1c97c11ace607a7a667d73d47c19fe404", 2265 | "shasum": "" 2266 | }, 2267 | "require": { 2268 | "php": "^7.1" 2269 | }, 2270 | "require-dev": { 2271 | "phpunit/phpunit": "^7.5" 2272 | }, 2273 | "suggest": { 2274 | "ext-posix": "*" 2275 | }, 2276 | "type": "library", 2277 | "extra": { 2278 | "branch-alias": { 2279 | "dev-master": "4.2-dev" 2280 | } 2281 | }, 2282 | "autoload": { 2283 | "classmap": [ 2284 | "src/" 2285 | ] 2286 | }, 2287 | "notification-url": "https://packagist.org/downloads/", 2288 | "license": [ 2289 | "BSD-3-Clause" 2290 | ], 2291 | "authors": [ 2292 | { 2293 | "name": "Sebastian Bergmann", 2294 | "email": "sebastian@phpunit.de" 2295 | } 2296 | ], 2297 | "description": "Provides functionality to handle HHVM/PHP environments", 2298 | "homepage": "http://www.github.com/sebastianbergmann/environment", 2299 | "keywords": [ 2300 | "Xdebug", 2301 | "environment", 2302 | "hhvm" 2303 | ], 2304 | "time": "2019-05-05T09:05:15+00:00" 2305 | }, 2306 | { 2307 | "name": "sebastian/exporter", 2308 | "version": "3.1.2", 2309 | "source": { 2310 | "type": "git", 2311 | "url": "https://github.com/sebastianbergmann/exporter.git", 2312 | "reference": "68609e1261d215ea5b21b7987539cbfbe156ec3e" 2313 | }, 2314 | "dist": { 2315 | "type": "zip", 2316 | "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/68609e1261d215ea5b21b7987539cbfbe156ec3e", 2317 | "reference": "68609e1261d215ea5b21b7987539cbfbe156ec3e", 2318 | "shasum": "" 2319 | }, 2320 | "require": { 2321 | "php": "^7.0", 2322 | "sebastian/recursion-context": "^3.0" 2323 | }, 2324 | "require-dev": { 2325 | "ext-mbstring": "*", 2326 | "phpunit/phpunit": "^6.0" 2327 | }, 2328 | "type": "library", 2329 | "extra": { 2330 | "branch-alias": { 2331 | "dev-master": "3.1.x-dev" 2332 | } 2333 | }, 2334 | "autoload": { 2335 | "classmap": [ 2336 | "src/" 2337 | ] 2338 | }, 2339 | "notification-url": "https://packagist.org/downloads/", 2340 | "license": [ 2341 | "BSD-3-Clause" 2342 | ], 2343 | "authors": [ 2344 | { 2345 | "name": "Sebastian Bergmann", 2346 | "email": "sebastian@phpunit.de" 2347 | }, 2348 | { 2349 | "name": "Jeff Welch", 2350 | "email": "whatthejeff@gmail.com" 2351 | }, 2352 | { 2353 | "name": "Volker Dusch", 2354 | "email": "github@wallbash.com" 2355 | }, 2356 | { 2357 | "name": "Adam Harvey", 2358 | "email": "aharvey@php.net" 2359 | }, 2360 | { 2361 | "name": "Bernhard Schussek", 2362 | "email": "bschussek@gmail.com" 2363 | } 2364 | ], 2365 | "description": "Provides the functionality to export PHP variables for visualization", 2366 | "homepage": "http://www.github.com/sebastianbergmann/exporter", 2367 | "keywords": [ 2368 | "export", 2369 | "exporter" 2370 | ], 2371 | "time": "2019-09-14T09:02:43+00:00" 2372 | }, 2373 | { 2374 | "name": "sebastian/global-state", 2375 | "version": "3.0.0", 2376 | "source": { 2377 | "type": "git", 2378 | "url": "https://github.com/sebastianbergmann/global-state.git", 2379 | "reference": "edf8a461cf1d4005f19fb0b6b8b95a9f7fa0adc4" 2380 | }, 2381 | "dist": { 2382 | "type": "zip", 2383 | "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/edf8a461cf1d4005f19fb0b6b8b95a9f7fa0adc4", 2384 | "reference": "edf8a461cf1d4005f19fb0b6b8b95a9f7fa0adc4", 2385 | "shasum": "" 2386 | }, 2387 | "require": { 2388 | "php": "^7.2", 2389 | "sebastian/object-reflector": "^1.1.1", 2390 | "sebastian/recursion-context": "^3.0" 2391 | }, 2392 | "require-dev": { 2393 | "ext-dom": "*", 2394 | "phpunit/phpunit": "^8.0" 2395 | }, 2396 | "suggest": { 2397 | "ext-uopz": "*" 2398 | }, 2399 | "type": "library", 2400 | "extra": { 2401 | "branch-alias": { 2402 | "dev-master": "3.0-dev" 2403 | } 2404 | }, 2405 | "autoload": { 2406 | "classmap": [ 2407 | "src/" 2408 | ] 2409 | }, 2410 | "notification-url": "https://packagist.org/downloads/", 2411 | "license": [ 2412 | "BSD-3-Clause" 2413 | ], 2414 | "authors": [ 2415 | { 2416 | "name": "Sebastian Bergmann", 2417 | "email": "sebastian@phpunit.de" 2418 | } 2419 | ], 2420 | "description": "Snapshotting of global state", 2421 | "homepage": "http://www.github.com/sebastianbergmann/global-state", 2422 | "keywords": [ 2423 | "global state" 2424 | ], 2425 | "time": "2019-02-01T05:30:01+00:00" 2426 | }, 2427 | { 2428 | "name": "sebastian/object-enumerator", 2429 | "version": "3.0.3", 2430 | "source": { 2431 | "type": "git", 2432 | "url": "https://github.com/sebastianbergmann/object-enumerator.git", 2433 | "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5" 2434 | }, 2435 | "dist": { 2436 | "type": "zip", 2437 | "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/7cfd9e65d11ffb5af41198476395774d4c8a84c5", 2438 | "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5", 2439 | "shasum": "" 2440 | }, 2441 | "require": { 2442 | "php": "^7.0", 2443 | "sebastian/object-reflector": "^1.1.1", 2444 | "sebastian/recursion-context": "^3.0" 2445 | }, 2446 | "require-dev": { 2447 | "phpunit/phpunit": "^6.0" 2448 | }, 2449 | "type": "library", 2450 | "extra": { 2451 | "branch-alias": { 2452 | "dev-master": "3.0.x-dev" 2453 | } 2454 | }, 2455 | "autoload": { 2456 | "classmap": [ 2457 | "src/" 2458 | ] 2459 | }, 2460 | "notification-url": "https://packagist.org/downloads/", 2461 | "license": [ 2462 | "BSD-3-Clause" 2463 | ], 2464 | "authors": [ 2465 | { 2466 | "name": "Sebastian Bergmann", 2467 | "email": "sebastian@phpunit.de" 2468 | } 2469 | ], 2470 | "description": "Traverses array structures and object graphs to enumerate all referenced objects", 2471 | "homepage": "https://github.com/sebastianbergmann/object-enumerator/", 2472 | "time": "2017-08-03T12:35:26+00:00" 2473 | }, 2474 | { 2475 | "name": "sebastian/object-reflector", 2476 | "version": "1.1.1", 2477 | "source": { 2478 | "type": "git", 2479 | "url": "https://github.com/sebastianbergmann/object-reflector.git", 2480 | "reference": "773f97c67f28de00d397be301821b06708fca0be" 2481 | }, 2482 | "dist": { 2483 | "type": "zip", 2484 | "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/773f97c67f28de00d397be301821b06708fca0be", 2485 | "reference": "773f97c67f28de00d397be301821b06708fca0be", 2486 | "shasum": "" 2487 | }, 2488 | "require": { 2489 | "php": "^7.0" 2490 | }, 2491 | "require-dev": { 2492 | "phpunit/phpunit": "^6.0" 2493 | }, 2494 | "type": "library", 2495 | "extra": { 2496 | "branch-alias": { 2497 | "dev-master": "1.1-dev" 2498 | } 2499 | }, 2500 | "autoload": { 2501 | "classmap": [ 2502 | "src/" 2503 | ] 2504 | }, 2505 | "notification-url": "https://packagist.org/downloads/", 2506 | "license": [ 2507 | "BSD-3-Clause" 2508 | ], 2509 | "authors": [ 2510 | { 2511 | "name": "Sebastian Bergmann", 2512 | "email": "sebastian@phpunit.de" 2513 | } 2514 | ], 2515 | "description": "Allows reflection of object attributes, including inherited and non-public ones", 2516 | "homepage": "https://github.com/sebastianbergmann/object-reflector/", 2517 | "time": "2017-03-29T09:07:27+00:00" 2518 | }, 2519 | { 2520 | "name": "sebastian/recursion-context", 2521 | "version": "3.0.0", 2522 | "source": { 2523 | "type": "git", 2524 | "url": "https://github.com/sebastianbergmann/recursion-context.git", 2525 | "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8" 2526 | }, 2527 | "dist": { 2528 | "type": "zip", 2529 | "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8", 2530 | "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8", 2531 | "shasum": "" 2532 | }, 2533 | "require": { 2534 | "php": "^7.0" 2535 | }, 2536 | "require-dev": { 2537 | "phpunit/phpunit": "^6.0" 2538 | }, 2539 | "type": "library", 2540 | "extra": { 2541 | "branch-alias": { 2542 | "dev-master": "3.0.x-dev" 2543 | } 2544 | }, 2545 | "autoload": { 2546 | "classmap": [ 2547 | "src/" 2548 | ] 2549 | }, 2550 | "notification-url": "https://packagist.org/downloads/", 2551 | "license": [ 2552 | "BSD-3-Clause" 2553 | ], 2554 | "authors": [ 2555 | { 2556 | "name": "Jeff Welch", 2557 | "email": "whatthejeff@gmail.com" 2558 | }, 2559 | { 2560 | "name": "Sebastian Bergmann", 2561 | "email": "sebastian@phpunit.de" 2562 | }, 2563 | { 2564 | "name": "Adam Harvey", 2565 | "email": "aharvey@php.net" 2566 | } 2567 | ], 2568 | "description": "Provides functionality to recursively process PHP variables", 2569 | "homepage": "http://www.github.com/sebastianbergmann/recursion-context", 2570 | "time": "2017-03-03T06:23:57+00:00" 2571 | }, 2572 | { 2573 | "name": "sebastian/resource-operations", 2574 | "version": "2.0.1", 2575 | "source": { 2576 | "type": "git", 2577 | "url": "https://github.com/sebastianbergmann/resource-operations.git", 2578 | "reference": "4d7a795d35b889bf80a0cc04e08d77cedfa917a9" 2579 | }, 2580 | "dist": { 2581 | "type": "zip", 2582 | "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/4d7a795d35b889bf80a0cc04e08d77cedfa917a9", 2583 | "reference": "4d7a795d35b889bf80a0cc04e08d77cedfa917a9", 2584 | "shasum": "" 2585 | }, 2586 | "require": { 2587 | "php": "^7.1" 2588 | }, 2589 | "type": "library", 2590 | "extra": { 2591 | "branch-alias": { 2592 | "dev-master": "2.0-dev" 2593 | } 2594 | }, 2595 | "autoload": { 2596 | "classmap": [ 2597 | "src/" 2598 | ] 2599 | }, 2600 | "notification-url": "https://packagist.org/downloads/", 2601 | "license": [ 2602 | "BSD-3-Clause" 2603 | ], 2604 | "authors": [ 2605 | { 2606 | "name": "Sebastian Bergmann", 2607 | "email": "sebastian@phpunit.de" 2608 | } 2609 | ], 2610 | "description": "Provides a list of PHP built-in functions that operate on resources", 2611 | "homepage": "https://www.github.com/sebastianbergmann/resource-operations", 2612 | "time": "2018-10-04T04:07:39+00:00" 2613 | }, 2614 | { 2615 | "name": "sebastian/type", 2616 | "version": "1.1.3", 2617 | "source": { 2618 | "type": "git", 2619 | "url": "https://github.com/sebastianbergmann/type.git", 2620 | "reference": "3aaaa15fa71d27650d62a948be022fe3b48541a3" 2621 | }, 2622 | "dist": { 2623 | "type": "zip", 2624 | "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/3aaaa15fa71d27650d62a948be022fe3b48541a3", 2625 | "reference": "3aaaa15fa71d27650d62a948be022fe3b48541a3", 2626 | "shasum": "" 2627 | }, 2628 | "require": { 2629 | "php": "^7.2" 2630 | }, 2631 | "require-dev": { 2632 | "phpunit/phpunit": "^8.2" 2633 | }, 2634 | "type": "library", 2635 | "extra": { 2636 | "branch-alias": { 2637 | "dev-master": "1.1-dev" 2638 | } 2639 | }, 2640 | "autoload": { 2641 | "classmap": [ 2642 | "src/" 2643 | ] 2644 | }, 2645 | "notification-url": "https://packagist.org/downloads/", 2646 | "license": [ 2647 | "BSD-3-Clause" 2648 | ], 2649 | "authors": [ 2650 | { 2651 | "name": "Sebastian Bergmann", 2652 | "email": "sebastian@phpunit.de", 2653 | "role": "lead" 2654 | } 2655 | ], 2656 | "description": "Collection of value objects that represent the types of the PHP type system", 2657 | "homepage": "https://github.com/sebastianbergmann/type", 2658 | "time": "2019-07-02T08:10:15+00:00" 2659 | }, 2660 | { 2661 | "name": "sebastian/version", 2662 | "version": "2.0.1", 2663 | "source": { 2664 | "type": "git", 2665 | "url": "https://github.com/sebastianbergmann/version.git", 2666 | "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019" 2667 | }, 2668 | "dist": { 2669 | "type": "zip", 2670 | "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019", 2671 | "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019", 2672 | "shasum": "" 2673 | }, 2674 | "require": { 2675 | "php": ">=5.6" 2676 | }, 2677 | "type": "library", 2678 | "extra": { 2679 | "branch-alias": { 2680 | "dev-master": "2.0.x-dev" 2681 | } 2682 | }, 2683 | "autoload": { 2684 | "classmap": [ 2685 | "src/" 2686 | ] 2687 | }, 2688 | "notification-url": "https://packagist.org/downloads/", 2689 | "license": [ 2690 | "BSD-3-Clause" 2691 | ], 2692 | "authors": [ 2693 | { 2694 | "name": "Sebastian Bergmann", 2695 | "email": "sebastian@phpunit.de", 2696 | "role": "lead" 2697 | } 2698 | ], 2699 | "description": "Library that helps with managing the version number of Git-hosted PHP projects", 2700 | "homepage": "https://github.com/sebastianbergmann/version", 2701 | "time": "2016-10-03T07:35:21+00:00" 2702 | }, 2703 | { 2704 | "name": "swiftmailer/swiftmailer", 2705 | "version": "v6.2.1", 2706 | "source": { 2707 | "type": "git", 2708 | "url": "https://github.com/swiftmailer/swiftmailer.git", 2709 | "reference": "5397cd05b0a0f7937c47b0adcb4c60e5ab936b6a" 2710 | }, 2711 | "dist": { 2712 | "type": "zip", 2713 | "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/5397cd05b0a0f7937c47b0adcb4c60e5ab936b6a", 2714 | "reference": "5397cd05b0a0f7937c47b0adcb4c60e5ab936b6a", 2715 | "shasum": "" 2716 | }, 2717 | "require": { 2718 | "egulias/email-validator": "~2.0", 2719 | "php": ">=7.0.0", 2720 | "symfony/polyfill-iconv": "^1.0", 2721 | "symfony/polyfill-intl-idn": "^1.10", 2722 | "symfony/polyfill-mbstring": "^1.0" 2723 | }, 2724 | "require-dev": { 2725 | "mockery/mockery": "~0.9.1", 2726 | "symfony/phpunit-bridge": "^3.4.19|^4.1.8" 2727 | }, 2728 | "suggest": { 2729 | "ext-intl": "Needed to support internationalized email addresses", 2730 | "true/punycode": "Needed to support internationalized email addresses, if ext-intl is not installed" 2731 | }, 2732 | "type": "library", 2733 | "extra": { 2734 | "branch-alias": { 2735 | "dev-master": "6.2-dev" 2736 | } 2737 | }, 2738 | "autoload": { 2739 | "files": [ 2740 | "lib/swift_required.php" 2741 | ] 2742 | }, 2743 | "notification-url": "https://packagist.org/downloads/", 2744 | "license": [ 2745 | "MIT" 2746 | ], 2747 | "authors": [ 2748 | { 2749 | "name": "Chris Corbyn" 2750 | }, 2751 | { 2752 | "name": "Fabien Potencier", 2753 | "email": "fabien@symfony.com" 2754 | } 2755 | ], 2756 | "description": "Swiftmailer, free feature-rich PHP mailer", 2757 | "homepage": "https://swiftmailer.symfony.com", 2758 | "keywords": [ 2759 | "email", 2760 | "mail", 2761 | "mailer" 2762 | ], 2763 | "time": "2019-04-21T09:21:45+00:00" 2764 | }, 2765 | { 2766 | "name": "symfony/console", 2767 | "version": "v4.3.4", 2768 | "source": { 2769 | "type": "git", 2770 | "url": "https://github.com/symfony/console.git", 2771 | "reference": "de63799239b3881b8a08f8481b22348f77ed7b36" 2772 | }, 2773 | "dist": { 2774 | "type": "zip", 2775 | "url": "https://api.github.com/repos/symfony/console/zipball/de63799239b3881b8a08f8481b22348f77ed7b36", 2776 | "reference": "de63799239b3881b8a08f8481b22348f77ed7b36", 2777 | "shasum": "" 2778 | }, 2779 | "require": { 2780 | "php": "^7.1.3", 2781 | "symfony/polyfill-mbstring": "~1.0", 2782 | "symfony/polyfill-php73": "^1.8", 2783 | "symfony/service-contracts": "^1.1" 2784 | }, 2785 | "conflict": { 2786 | "symfony/dependency-injection": "<3.4", 2787 | "symfony/event-dispatcher": "<4.3", 2788 | "symfony/process": "<3.3" 2789 | }, 2790 | "provide": { 2791 | "psr/log-implementation": "1.0" 2792 | }, 2793 | "require-dev": { 2794 | "psr/log": "~1.0", 2795 | "symfony/config": "~3.4|~4.0", 2796 | "symfony/dependency-injection": "~3.4|~4.0", 2797 | "symfony/event-dispatcher": "^4.3", 2798 | "symfony/lock": "~3.4|~4.0", 2799 | "symfony/process": "~3.4|~4.0", 2800 | "symfony/var-dumper": "^4.3" 2801 | }, 2802 | "suggest": { 2803 | "psr/log": "For using the console logger", 2804 | "symfony/event-dispatcher": "", 2805 | "symfony/lock": "", 2806 | "symfony/process": "" 2807 | }, 2808 | "type": "library", 2809 | "extra": { 2810 | "branch-alias": { 2811 | "dev-master": "4.3-dev" 2812 | } 2813 | }, 2814 | "autoload": { 2815 | "psr-4": { 2816 | "Symfony\\Component\\Console\\": "" 2817 | }, 2818 | "exclude-from-classmap": [ 2819 | "/Tests/" 2820 | ] 2821 | }, 2822 | "notification-url": "https://packagist.org/downloads/", 2823 | "license": [ 2824 | "MIT" 2825 | ], 2826 | "authors": [ 2827 | { 2828 | "name": "Fabien Potencier", 2829 | "email": "fabien@symfony.com" 2830 | }, 2831 | { 2832 | "name": "Symfony Community", 2833 | "homepage": "https://symfony.com/contributors" 2834 | } 2835 | ], 2836 | "description": "Symfony Console Component", 2837 | "homepage": "https://symfony.com", 2838 | "time": "2019-08-26T08:26:39+00:00" 2839 | }, 2840 | { 2841 | "name": "symfony/css-selector", 2842 | "version": "v4.3.4", 2843 | "source": { 2844 | "type": "git", 2845 | "url": "https://github.com/symfony/css-selector.git", 2846 | "reference": "c6e5e2a00db768c92c3ae131532af4e1acc7bd03" 2847 | }, 2848 | "dist": { 2849 | "type": "zip", 2850 | "url": "https://api.github.com/repos/symfony/css-selector/zipball/c6e5e2a00db768c92c3ae131532af4e1acc7bd03", 2851 | "reference": "c6e5e2a00db768c92c3ae131532af4e1acc7bd03", 2852 | "shasum": "" 2853 | }, 2854 | "require": { 2855 | "php": "^7.1.3" 2856 | }, 2857 | "type": "library", 2858 | "extra": { 2859 | "branch-alias": { 2860 | "dev-master": "4.3-dev" 2861 | } 2862 | }, 2863 | "autoload": { 2864 | "psr-4": { 2865 | "Symfony\\Component\\CssSelector\\": "" 2866 | }, 2867 | "exclude-from-classmap": [ 2868 | "/Tests/" 2869 | ] 2870 | }, 2871 | "notification-url": "https://packagist.org/downloads/", 2872 | "license": [ 2873 | "MIT" 2874 | ], 2875 | "authors": [ 2876 | { 2877 | "name": "Fabien Potencier", 2878 | "email": "fabien@symfony.com" 2879 | }, 2880 | { 2881 | "name": "Jean-François Simon", 2882 | "email": "jeanfrancois.simon@sensiolabs.com" 2883 | }, 2884 | { 2885 | "name": "Symfony Community", 2886 | "homepage": "https://symfony.com/contributors" 2887 | } 2888 | ], 2889 | "description": "Symfony CssSelector Component", 2890 | "homepage": "https://symfony.com", 2891 | "time": "2019-08-20T14:07:54+00:00" 2892 | }, 2893 | { 2894 | "name": "symfony/debug", 2895 | "version": "v4.3.4", 2896 | "source": { 2897 | "type": "git", 2898 | "url": "https://github.com/symfony/debug.git", 2899 | "reference": "afcdea44a2e399c1e4b52246ec8d54c715393ced" 2900 | }, 2901 | "dist": { 2902 | "type": "zip", 2903 | "url": "https://api.github.com/repos/symfony/debug/zipball/afcdea44a2e399c1e4b52246ec8d54c715393ced", 2904 | "reference": "afcdea44a2e399c1e4b52246ec8d54c715393ced", 2905 | "shasum": "" 2906 | }, 2907 | "require": { 2908 | "php": "^7.1.3", 2909 | "psr/log": "~1.0" 2910 | }, 2911 | "conflict": { 2912 | "symfony/http-kernel": "<3.4" 2913 | }, 2914 | "require-dev": { 2915 | "symfony/http-kernel": "~3.4|~4.0" 2916 | }, 2917 | "type": "library", 2918 | "extra": { 2919 | "branch-alias": { 2920 | "dev-master": "4.3-dev" 2921 | } 2922 | }, 2923 | "autoload": { 2924 | "psr-4": { 2925 | "Symfony\\Component\\Debug\\": "" 2926 | }, 2927 | "exclude-from-classmap": [ 2928 | "/Tests/" 2929 | ] 2930 | }, 2931 | "notification-url": "https://packagist.org/downloads/", 2932 | "license": [ 2933 | "MIT" 2934 | ], 2935 | "authors": [ 2936 | { 2937 | "name": "Fabien Potencier", 2938 | "email": "fabien@symfony.com" 2939 | }, 2940 | { 2941 | "name": "Symfony Community", 2942 | "homepage": "https://symfony.com/contributors" 2943 | } 2944 | ], 2945 | "description": "Symfony Debug Component", 2946 | "homepage": "https://symfony.com", 2947 | "time": "2019-08-20T14:27:59+00:00" 2948 | }, 2949 | { 2950 | "name": "symfony/event-dispatcher", 2951 | "version": "v4.3.4", 2952 | "source": { 2953 | "type": "git", 2954 | "url": "https://github.com/symfony/event-dispatcher.git", 2955 | "reference": "429d0a1451d4c9c4abe1959b2986b88794b9b7d2" 2956 | }, 2957 | "dist": { 2958 | "type": "zip", 2959 | "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/429d0a1451d4c9c4abe1959b2986b88794b9b7d2", 2960 | "reference": "429d0a1451d4c9c4abe1959b2986b88794b9b7d2", 2961 | "shasum": "" 2962 | }, 2963 | "require": { 2964 | "php": "^7.1.3", 2965 | "symfony/event-dispatcher-contracts": "^1.1" 2966 | }, 2967 | "conflict": { 2968 | "symfony/dependency-injection": "<3.4" 2969 | }, 2970 | "provide": { 2971 | "psr/event-dispatcher-implementation": "1.0", 2972 | "symfony/event-dispatcher-implementation": "1.1" 2973 | }, 2974 | "require-dev": { 2975 | "psr/log": "~1.0", 2976 | "symfony/config": "~3.4|~4.0", 2977 | "symfony/dependency-injection": "~3.4|~4.0", 2978 | "symfony/expression-language": "~3.4|~4.0", 2979 | "symfony/http-foundation": "^3.4|^4.0", 2980 | "symfony/service-contracts": "^1.1", 2981 | "symfony/stopwatch": "~3.4|~4.0" 2982 | }, 2983 | "suggest": { 2984 | "symfony/dependency-injection": "", 2985 | "symfony/http-kernel": "" 2986 | }, 2987 | "type": "library", 2988 | "extra": { 2989 | "branch-alias": { 2990 | "dev-master": "4.3-dev" 2991 | } 2992 | }, 2993 | "autoload": { 2994 | "psr-4": { 2995 | "Symfony\\Component\\EventDispatcher\\": "" 2996 | }, 2997 | "exclude-from-classmap": [ 2998 | "/Tests/" 2999 | ] 3000 | }, 3001 | "notification-url": "https://packagist.org/downloads/", 3002 | "license": [ 3003 | "MIT" 3004 | ], 3005 | "authors": [ 3006 | { 3007 | "name": "Fabien Potencier", 3008 | "email": "fabien@symfony.com" 3009 | }, 3010 | { 3011 | "name": "Symfony Community", 3012 | "homepage": "https://symfony.com/contributors" 3013 | } 3014 | ], 3015 | "description": "Symfony EventDispatcher Component", 3016 | "homepage": "https://symfony.com", 3017 | "time": "2019-08-26T08:55:16+00:00" 3018 | }, 3019 | { 3020 | "name": "symfony/event-dispatcher-contracts", 3021 | "version": "v1.1.5", 3022 | "source": { 3023 | "type": "git", 3024 | "url": "https://github.com/symfony/event-dispatcher-contracts.git", 3025 | "reference": "c61766f4440ca687de1084a5c00b08e167a2575c" 3026 | }, 3027 | "dist": { 3028 | "type": "zip", 3029 | "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/c61766f4440ca687de1084a5c00b08e167a2575c", 3030 | "reference": "c61766f4440ca687de1084a5c00b08e167a2575c", 3031 | "shasum": "" 3032 | }, 3033 | "require": { 3034 | "php": "^7.1.3" 3035 | }, 3036 | "suggest": { 3037 | "psr/event-dispatcher": "", 3038 | "symfony/event-dispatcher-implementation": "" 3039 | }, 3040 | "type": "library", 3041 | "extra": { 3042 | "branch-alias": { 3043 | "dev-master": "1.1-dev" 3044 | } 3045 | }, 3046 | "autoload": { 3047 | "psr-4": { 3048 | "Symfony\\Contracts\\EventDispatcher\\": "" 3049 | } 3050 | }, 3051 | "notification-url": "https://packagist.org/downloads/", 3052 | "license": [ 3053 | "MIT" 3054 | ], 3055 | "authors": [ 3056 | { 3057 | "name": "Nicolas Grekas", 3058 | "email": "p@tchwork.com" 3059 | }, 3060 | { 3061 | "name": "Symfony Community", 3062 | "homepage": "https://symfony.com/contributors" 3063 | } 3064 | ], 3065 | "description": "Generic abstractions related to dispatching event", 3066 | "homepage": "https://symfony.com", 3067 | "keywords": [ 3068 | "abstractions", 3069 | "contracts", 3070 | "decoupling", 3071 | "interfaces", 3072 | "interoperability", 3073 | "standards" 3074 | ], 3075 | "time": "2019-06-20T06:46:26+00:00" 3076 | }, 3077 | { 3078 | "name": "symfony/finder", 3079 | "version": "v4.3.4", 3080 | "source": { 3081 | "type": "git", 3082 | "url": "https://github.com/symfony/finder.git", 3083 | "reference": "86c1c929f0a4b24812e1eb109262fc3372c8e9f2" 3084 | }, 3085 | "dist": { 3086 | "type": "zip", 3087 | "url": "https://api.github.com/repos/symfony/finder/zipball/86c1c929f0a4b24812e1eb109262fc3372c8e9f2", 3088 | "reference": "86c1c929f0a4b24812e1eb109262fc3372c8e9f2", 3089 | "shasum": "" 3090 | }, 3091 | "require": { 3092 | "php": "^7.1.3" 3093 | }, 3094 | "type": "library", 3095 | "extra": { 3096 | "branch-alias": { 3097 | "dev-master": "4.3-dev" 3098 | } 3099 | }, 3100 | "autoload": { 3101 | "psr-4": { 3102 | "Symfony\\Component\\Finder\\": "" 3103 | }, 3104 | "exclude-from-classmap": [ 3105 | "/Tests/" 3106 | ] 3107 | }, 3108 | "notification-url": "https://packagist.org/downloads/", 3109 | "license": [ 3110 | "MIT" 3111 | ], 3112 | "authors": [ 3113 | { 3114 | "name": "Fabien Potencier", 3115 | "email": "fabien@symfony.com" 3116 | }, 3117 | { 3118 | "name": "Symfony Community", 3119 | "homepage": "https://symfony.com/contributors" 3120 | } 3121 | ], 3122 | "description": "Symfony Finder Component", 3123 | "homepage": "https://symfony.com", 3124 | "time": "2019-08-14T12:26:46+00:00" 3125 | }, 3126 | { 3127 | "name": "symfony/http-foundation", 3128 | "version": "v4.4.1", 3129 | "source": { 3130 | "type": "git", 3131 | "url": "https://github.com/symfony/http-foundation.git", 3132 | "reference": "8bccc59e61b41963d14c3dbdb23181e5c932a1d5" 3133 | }, 3134 | "dist": { 3135 | "type": "zip", 3136 | "url": "https://api.github.com/repos/symfony/http-foundation/zipball/8bccc59e61b41963d14c3dbdb23181e5c932a1d5", 3137 | "reference": "8bccc59e61b41963d14c3dbdb23181e5c932a1d5", 3138 | "shasum": "" 3139 | }, 3140 | "require": { 3141 | "php": "^7.1.3", 3142 | "symfony/mime": "^4.3|^5.0", 3143 | "symfony/polyfill-mbstring": "~1.1" 3144 | }, 3145 | "require-dev": { 3146 | "predis/predis": "~1.0", 3147 | "symfony/expression-language": "^3.4|^4.0|^5.0" 3148 | }, 3149 | "type": "library", 3150 | "extra": { 3151 | "branch-alias": { 3152 | "dev-master": "4.4-dev" 3153 | } 3154 | }, 3155 | "autoload": { 3156 | "psr-4": { 3157 | "Symfony\\Component\\HttpFoundation\\": "" 3158 | }, 3159 | "exclude-from-classmap": [ 3160 | "/Tests/" 3161 | ] 3162 | }, 3163 | "notification-url": "https://packagist.org/downloads/", 3164 | "license": [ 3165 | "MIT" 3166 | ], 3167 | "authors": [ 3168 | { 3169 | "name": "Fabien Potencier", 3170 | "email": "fabien@symfony.com" 3171 | }, 3172 | { 3173 | "name": "Symfony Community", 3174 | "homepage": "https://symfony.com/contributors" 3175 | } 3176 | ], 3177 | "description": "Symfony HttpFoundation Component", 3178 | "homepage": "https://symfony.com", 3179 | "time": "2019-11-28T13:33:56+00:00" 3180 | }, 3181 | { 3182 | "name": "symfony/http-kernel", 3183 | "version": "v4.3.4", 3184 | "source": { 3185 | "type": "git", 3186 | "url": "https://github.com/symfony/http-kernel.git", 3187 | "reference": "5e0fc71be03d52cd00c423061cfd300bd6f92a52" 3188 | }, 3189 | "dist": { 3190 | "type": "zip", 3191 | "url": "https://api.github.com/repos/symfony/http-kernel/zipball/5e0fc71be03d52cd00c423061cfd300bd6f92a52", 3192 | "reference": "5e0fc71be03d52cd00c423061cfd300bd6f92a52", 3193 | "shasum": "" 3194 | }, 3195 | "require": { 3196 | "php": "^7.1.3", 3197 | "psr/log": "~1.0", 3198 | "symfony/debug": "~3.4|~4.0", 3199 | "symfony/event-dispatcher": "^4.3", 3200 | "symfony/http-foundation": "^4.1.1", 3201 | "symfony/polyfill-ctype": "~1.8", 3202 | "symfony/polyfill-php73": "^1.9" 3203 | }, 3204 | "conflict": { 3205 | "symfony/browser-kit": "<4.3", 3206 | "symfony/config": "<3.4", 3207 | "symfony/dependency-injection": "<4.3", 3208 | "symfony/translation": "<4.2", 3209 | "symfony/var-dumper": "<4.1.1", 3210 | "twig/twig": "<1.34|<2.4,>=2" 3211 | }, 3212 | "provide": { 3213 | "psr/log-implementation": "1.0" 3214 | }, 3215 | "require-dev": { 3216 | "psr/cache": "~1.0", 3217 | "symfony/browser-kit": "^4.3", 3218 | "symfony/config": "~3.4|~4.0", 3219 | "symfony/console": "~3.4|~4.0", 3220 | "symfony/css-selector": "~3.4|~4.0", 3221 | "symfony/dependency-injection": "^4.3", 3222 | "symfony/dom-crawler": "~3.4|~4.0", 3223 | "symfony/expression-language": "~3.4|~4.0", 3224 | "symfony/finder": "~3.4|~4.0", 3225 | "symfony/process": "~3.4|~4.0", 3226 | "symfony/routing": "~3.4|~4.0", 3227 | "symfony/stopwatch": "~3.4|~4.0", 3228 | "symfony/templating": "~3.4|~4.0", 3229 | "symfony/translation": "~4.2", 3230 | "symfony/translation-contracts": "^1.1", 3231 | "symfony/var-dumper": "^4.1.1", 3232 | "twig/twig": "^1.34|^2.4" 3233 | }, 3234 | "suggest": { 3235 | "symfony/browser-kit": "", 3236 | "symfony/config": "", 3237 | "symfony/console": "", 3238 | "symfony/dependency-injection": "", 3239 | "symfony/var-dumper": "" 3240 | }, 3241 | "type": "library", 3242 | "extra": { 3243 | "branch-alias": { 3244 | "dev-master": "4.3-dev" 3245 | } 3246 | }, 3247 | "autoload": { 3248 | "psr-4": { 3249 | "Symfony\\Component\\HttpKernel\\": "" 3250 | }, 3251 | "exclude-from-classmap": [ 3252 | "/Tests/" 3253 | ] 3254 | }, 3255 | "notification-url": "https://packagist.org/downloads/", 3256 | "license": [ 3257 | "MIT" 3258 | ], 3259 | "authors": [ 3260 | { 3261 | "name": "Fabien Potencier", 3262 | "email": "fabien@symfony.com" 3263 | }, 3264 | { 3265 | "name": "Symfony Community", 3266 | "homepage": "https://symfony.com/contributors" 3267 | } 3268 | ], 3269 | "description": "Symfony HttpKernel Component", 3270 | "homepage": "https://symfony.com", 3271 | "time": "2019-08-26T16:47:42+00:00" 3272 | }, 3273 | { 3274 | "name": "symfony/mime", 3275 | "version": "v5.0.1", 3276 | "source": { 3277 | "type": "git", 3278 | "url": "https://github.com/symfony/mime.git", 3279 | "reference": "0e6a4ced216e49d457eddcefb61132173a876d79" 3280 | }, 3281 | "dist": { 3282 | "type": "zip", 3283 | "url": "https://api.github.com/repos/symfony/mime/zipball/0e6a4ced216e49d457eddcefb61132173a876d79", 3284 | "reference": "0e6a4ced216e49d457eddcefb61132173a876d79", 3285 | "shasum": "" 3286 | }, 3287 | "require": { 3288 | "php": "^7.2.5", 3289 | "symfony/polyfill-intl-idn": "^1.10", 3290 | "symfony/polyfill-mbstring": "^1.0" 3291 | }, 3292 | "conflict": { 3293 | "symfony/mailer": "<4.4" 3294 | }, 3295 | "require-dev": { 3296 | "egulias/email-validator": "^2.1.10", 3297 | "symfony/dependency-injection": "^4.4|^5.0" 3298 | }, 3299 | "type": "library", 3300 | "extra": { 3301 | "branch-alias": { 3302 | "dev-master": "5.0-dev" 3303 | } 3304 | }, 3305 | "autoload": { 3306 | "psr-4": { 3307 | "Symfony\\Component\\Mime\\": "" 3308 | }, 3309 | "exclude-from-classmap": [ 3310 | "/Tests/" 3311 | ] 3312 | }, 3313 | "notification-url": "https://packagist.org/downloads/", 3314 | "license": [ 3315 | "MIT" 3316 | ], 3317 | "authors": [ 3318 | { 3319 | "name": "Fabien Potencier", 3320 | "email": "fabien@symfony.com" 3321 | }, 3322 | { 3323 | "name": "Symfony Community", 3324 | "homepage": "https://symfony.com/contributors" 3325 | } 3326 | ], 3327 | "description": "A library to manipulate MIME messages", 3328 | "homepage": "https://symfony.com", 3329 | "keywords": [ 3330 | "mime", 3331 | "mime-type" 3332 | ], 3333 | "time": "2019-11-30T14:12:50+00:00" 3334 | }, 3335 | { 3336 | "name": "symfony/polyfill-ctype", 3337 | "version": "v1.12.0", 3338 | "source": { 3339 | "type": "git", 3340 | "url": "https://github.com/symfony/polyfill-ctype.git", 3341 | "reference": "550ebaac289296ce228a706d0867afc34687e3f4" 3342 | }, 3343 | "dist": { 3344 | "type": "zip", 3345 | "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/550ebaac289296ce228a706d0867afc34687e3f4", 3346 | "reference": "550ebaac289296ce228a706d0867afc34687e3f4", 3347 | "shasum": "" 3348 | }, 3349 | "require": { 3350 | "php": ">=5.3.3" 3351 | }, 3352 | "suggest": { 3353 | "ext-ctype": "For best performance" 3354 | }, 3355 | "type": "library", 3356 | "extra": { 3357 | "branch-alias": { 3358 | "dev-master": "1.12-dev" 3359 | } 3360 | }, 3361 | "autoload": { 3362 | "psr-4": { 3363 | "Symfony\\Polyfill\\Ctype\\": "" 3364 | }, 3365 | "files": [ 3366 | "bootstrap.php" 3367 | ] 3368 | }, 3369 | "notification-url": "https://packagist.org/downloads/", 3370 | "license": [ 3371 | "MIT" 3372 | ], 3373 | "authors": [ 3374 | { 3375 | "name": "Gert de Pagter", 3376 | "email": "BackEndTea@gmail.com" 3377 | }, 3378 | { 3379 | "name": "Symfony Community", 3380 | "homepage": "https://symfony.com/contributors" 3381 | } 3382 | ], 3383 | "description": "Symfony polyfill for ctype functions", 3384 | "homepage": "https://symfony.com", 3385 | "keywords": [ 3386 | "compatibility", 3387 | "ctype", 3388 | "polyfill", 3389 | "portable" 3390 | ], 3391 | "time": "2019-08-06T08:03:45+00:00" 3392 | }, 3393 | { 3394 | "name": "symfony/polyfill-iconv", 3395 | "version": "v1.12.0", 3396 | "source": { 3397 | "type": "git", 3398 | "url": "https://github.com/symfony/polyfill-iconv.git", 3399 | "reference": "685968b11e61a347c18bf25db32effa478be610f" 3400 | }, 3401 | "dist": { 3402 | "type": "zip", 3403 | "url": "https://api.github.com/repos/symfony/polyfill-iconv/zipball/685968b11e61a347c18bf25db32effa478be610f", 3404 | "reference": "685968b11e61a347c18bf25db32effa478be610f", 3405 | "shasum": "" 3406 | }, 3407 | "require": { 3408 | "php": ">=5.3.3" 3409 | }, 3410 | "suggest": { 3411 | "ext-iconv": "For best performance" 3412 | }, 3413 | "type": "library", 3414 | "extra": { 3415 | "branch-alias": { 3416 | "dev-master": "1.12-dev" 3417 | } 3418 | }, 3419 | "autoload": { 3420 | "psr-4": { 3421 | "Symfony\\Polyfill\\Iconv\\": "" 3422 | }, 3423 | "files": [ 3424 | "bootstrap.php" 3425 | ] 3426 | }, 3427 | "notification-url": "https://packagist.org/downloads/", 3428 | "license": [ 3429 | "MIT" 3430 | ], 3431 | "authors": [ 3432 | { 3433 | "name": "Nicolas Grekas", 3434 | "email": "p@tchwork.com" 3435 | }, 3436 | { 3437 | "name": "Symfony Community", 3438 | "homepage": "https://symfony.com/contributors" 3439 | } 3440 | ], 3441 | "description": "Symfony polyfill for the Iconv extension", 3442 | "homepage": "https://symfony.com", 3443 | "keywords": [ 3444 | "compatibility", 3445 | "iconv", 3446 | "polyfill", 3447 | "portable", 3448 | "shim" 3449 | ], 3450 | "time": "2019-08-06T08:03:45+00:00" 3451 | }, 3452 | { 3453 | "name": "symfony/polyfill-intl-idn", 3454 | "version": "v1.13.1", 3455 | "source": { 3456 | "type": "git", 3457 | "url": "https://github.com/symfony/polyfill-intl-idn.git", 3458 | "reference": "6f9c239e61e1b0c9229a28ff89a812dc449c3d46" 3459 | }, 3460 | "dist": { 3461 | "type": "zip", 3462 | "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/6f9c239e61e1b0c9229a28ff89a812dc449c3d46", 3463 | "reference": "6f9c239e61e1b0c9229a28ff89a812dc449c3d46", 3464 | "shasum": "" 3465 | }, 3466 | "require": { 3467 | "php": ">=5.3.3", 3468 | "symfony/polyfill-mbstring": "^1.3", 3469 | "symfony/polyfill-php72": "^1.9" 3470 | }, 3471 | "suggest": { 3472 | "ext-intl": "For best performance" 3473 | }, 3474 | "type": "library", 3475 | "extra": { 3476 | "branch-alias": { 3477 | "dev-master": "1.13-dev" 3478 | } 3479 | }, 3480 | "autoload": { 3481 | "psr-4": { 3482 | "Symfony\\Polyfill\\Intl\\Idn\\": "" 3483 | }, 3484 | "files": [ 3485 | "bootstrap.php" 3486 | ] 3487 | }, 3488 | "notification-url": "https://packagist.org/downloads/", 3489 | "license": [ 3490 | "MIT" 3491 | ], 3492 | "authors": [ 3493 | { 3494 | "name": "Laurent Bassin", 3495 | "email": "laurent@bassin.info" 3496 | }, 3497 | { 3498 | "name": "Symfony Community", 3499 | "homepage": "https://symfony.com/contributors" 3500 | } 3501 | ], 3502 | "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", 3503 | "homepage": "https://symfony.com", 3504 | "keywords": [ 3505 | "compatibility", 3506 | "idn", 3507 | "intl", 3508 | "polyfill", 3509 | "portable", 3510 | "shim" 3511 | ], 3512 | "time": "2019-11-27T13:56:44+00:00" 3513 | }, 3514 | { 3515 | "name": "symfony/polyfill-mbstring", 3516 | "version": "v1.13.1", 3517 | "source": { 3518 | "type": "git", 3519 | "url": "https://github.com/symfony/polyfill-mbstring.git", 3520 | "reference": "7b4aab9743c30be783b73de055d24a39cf4b954f" 3521 | }, 3522 | "dist": { 3523 | "type": "zip", 3524 | "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/7b4aab9743c30be783b73de055d24a39cf4b954f", 3525 | "reference": "7b4aab9743c30be783b73de055d24a39cf4b954f", 3526 | "shasum": "" 3527 | }, 3528 | "require": { 3529 | "php": ">=5.3.3" 3530 | }, 3531 | "suggest": { 3532 | "ext-mbstring": "For best performance" 3533 | }, 3534 | "type": "library", 3535 | "extra": { 3536 | "branch-alias": { 3537 | "dev-master": "1.13-dev" 3538 | } 3539 | }, 3540 | "autoload": { 3541 | "psr-4": { 3542 | "Symfony\\Polyfill\\Mbstring\\": "" 3543 | }, 3544 | "files": [ 3545 | "bootstrap.php" 3546 | ] 3547 | }, 3548 | "notification-url": "https://packagist.org/downloads/", 3549 | "license": [ 3550 | "MIT" 3551 | ], 3552 | "authors": [ 3553 | { 3554 | "name": "Nicolas Grekas", 3555 | "email": "p@tchwork.com" 3556 | }, 3557 | { 3558 | "name": "Symfony Community", 3559 | "homepage": "https://symfony.com/contributors" 3560 | } 3561 | ], 3562 | "description": "Symfony polyfill for the Mbstring extension", 3563 | "homepage": "https://symfony.com", 3564 | "keywords": [ 3565 | "compatibility", 3566 | "mbstring", 3567 | "polyfill", 3568 | "portable", 3569 | "shim" 3570 | ], 3571 | "time": "2019-11-27T14:18:11+00:00" 3572 | }, 3573 | { 3574 | "name": "symfony/polyfill-php72", 3575 | "version": "v1.13.1", 3576 | "source": { 3577 | "type": "git", 3578 | "url": "https://github.com/symfony/polyfill-php72.git", 3579 | "reference": "66fea50f6cb37a35eea048d75a7d99a45b586038" 3580 | }, 3581 | "dist": { 3582 | "type": "zip", 3583 | "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/66fea50f6cb37a35eea048d75a7d99a45b586038", 3584 | "reference": "66fea50f6cb37a35eea048d75a7d99a45b586038", 3585 | "shasum": "" 3586 | }, 3587 | "require": { 3588 | "php": ">=5.3.3" 3589 | }, 3590 | "type": "library", 3591 | "extra": { 3592 | "branch-alias": { 3593 | "dev-master": "1.13-dev" 3594 | } 3595 | }, 3596 | "autoload": { 3597 | "psr-4": { 3598 | "Symfony\\Polyfill\\Php72\\": "" 3599 | }, 3600 | "files": [ 3601 | "bootstrap.php" 3602 | ] 3603 | }, 3604 | "notification-url": "https://packagist.org/downloads/", 3605 | "license": [ 3606 | "MIT" 3607 | ], 3608 | "authors": [ 3609 | { 3610 | "name": "Nicolas Grekas", 3611 | "email": "p@tchwork.com" 3612 | }, 3613 | { 3614 | "name": "Symfony Community", 3615 | "homepage": "https://symfony.com/contributors" 3616 | } 3617 | ], 3618 | "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", 3619 | "homepage": "https://symfony.com", 3620 | "keywords": [ 3621 | "compatibility", 3622 | "polyfill", 3623 | "portable", 3624 | "shim" 3625 | ], 3626 | "time": "2019-11-27T13:56:44+00:00" 3627 | }, 3628 | { 3629 | "name": "symfony/polyfill-php73", 3630 | "version": "v1.12.0", 3631 | "source": { 3632 | "type": "git", 3633 | "url": "https://github.com/symfony/polyfill-php73.git", 3634 | "reference": "2ceb49eaccb9352bff54d22570276bb75ba4a188" 3635 | }, 3636 | "dist": { 3637 | "type": "zip", 3638 | "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/2ceb49eaccb9352bff54d22570276bb75ba4a188", 3639 | "reference": "2ceb49eaccb9352bff54d22570276bb75ba4a188", 3640 | "shasum": "" 3641 | }, 3642 | "require": { 3643 | "php": ">=5.3.3" 3644 | }, 3645 | "type": "library", 3646 | "extra": { 3647 | "branch-alias": { 3648 | "dev-master": "1.12-dev" 3649 | } 3650 | }, 3651 | "autoload": { 3652 | "psr-4": { 3653 | "Symfony\\Polyfill\\Php73\\": "" 3654 | }, 3655 | "files": [ 3656 | "bootstrap.php" 3657 | ], 3658 | "classmap": [ 3659 | "Resources/stubs" 3660 | ] 3661 | }, 3662 | "notification-url": "https://packagist.org/downloads/", 3663 | "license": [ 3664 | "MIT" 3665 | ], 3666 | "authors": [ 3667 | { 3668 | "name": "Nicolas Grekas", 3669 | "email": "p@tchwork.com" 3670 | }, 3671 | { 3672 | "name": "Symfony Community", 3673 | "homepage": "https://symfony.com/contributors" 3674 | } 3675 | ], 3676 | "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", 3677 | "homepage": "https://symfony.com", 3678 | "keywords": [ 3679 | "compatibility", 3680 | "polyfill", 3681 | "portable", 3682 | "shim" 3683 | ], 3684 | "time": "2019-08-06T08:03:45+00:00" 3685 | }, 3686 | { 3687 | "name": "symfony/process", 3688 | "version": "v4.3.4", 3689 | "source": { 3690 | "type": "git", 3691 | "url": "https://github.com/symfony/process.git", 3692 | "reference": "e89969c00d762349f078db1128506f7f3dcc0d4a" 3693 | }, 3694 | "dist": { 3695 | "type": "zip", 3696 | "url": "https://api.github.com/repos/symfony/process/zipball/e89969c00d762349f078db1128506f7f3dcc0d4a", 3697 | "reference": "e89969c00d762349f078db1128506f7f3dcc0d4a", 3698 | "shasum": "" 3699 | }, 3700 | "require": { 3701 | "php": "^7.1.3" 3702 | }, 3703 | "type": "library", 3704 | "extra": { 3705 | "branch-alias": { 3706 | "dev-master": "4.3-dev" 3707 | } 3708 | }, 3709 | "autoload": { 3710 | "psr-4": { 3711 | "Symfony\\Component\\Process\\": "" 3712 | }, 3713 | "exclude-from-classmap": [ 3714 | "/Tests/" 3715 | ] 3716 | }, 3717 | "notification-url": "https://packagist.org/downloads/", 3718 | "license": [ 3719 | "MIT" 3720 | ], 3721 | "authors": [ 3722 | { 3723 | "name": "Fabien Potencier", 3724 | "email": "fabien@symfony.com" 3725 | }, 3726 | { 3727 | "name": "Symfony Community", 3728 | "homepage": "https://symfony.com/contributors" 3729 | } 3730 | ], 3731 | "description": "Symfony Process Component", 3732 | "homepage": "https://symfony.com", 3733 | "time": "2019-08-26T08:26:39+00:00" 3734 | }, 3735 | { 3736 | "name": "symfony/routing", 3737 | "version": "v4.3.4", 3738 | "source": { 3739 | "type": "git", 3740 | "url": "https://github.com/symfony/routing.git", 3741 | "reference": "ff1049f6232dc5b6023b1ff1c6de56f82bcd264f" 3742 | }, 3743 | "dist": { 3744 | "type": "zip", 3745 | "url": "https://api.github.com/repos/symfony/routing/zipball/ff1049f6232dc5b6023b1ff1c6de56f82bcd264f", 3746 | "reference": "ff1049f6232dc5b6023b1ff1c6de56f82bcd264f", 3747 | "shasum": "" 3748 | }, 3749 | "require": { 3750 | "php": "^7.1.3" 3751 | }, 3752 | "conflict": { 3753 | "symfony/config": "<4.2", 3754 | "symfony/dependency-injection": "<3.4", 3755 | "symfony/yaml": "<3.4" 3756 | }, 3757 | "require-dev": { 3758 | "doctrine/annotations": "~1.2", 3759 | "psr/log": "~1.0", 3760 | "symfony/config": "~4.2", 3761 | "symfony/dependency-injection": "~3.4|~4.0", 3762 | "symfony/expression-language": "~3.4|~4.0", 3763 | "symfony/http-foundation": "~3.4|~4.0", 3764 | "symfony/yaml": "~3.4|~4.0" 3765 | }, 3766 | "suggest": { 3767 | "doctrine/annotations": "For using the annotation loader", 3768 | "symfony/config": "For using the all-in-one router or any loader", 3769 | "symfony/expression-language": "For using expression matching", 3770 | "symfony/http-foundation": "For using a Symfony Request object", 3771 | "symfony/yaml": "For using the YAML loader" 3772 | }, 3773 | "type": "library", 3774 | "extra": { 3775 | "branch-alias": { 3776 | "dev-master": "4.3-dev" 3777 | } 3778 | }, 3779 | "autoload": { 3780 | "psr-4": { 3781 | "Symfony\\Component\\Routing\\": "" 3782 | }, 3783 | "exclude-from-classmap": [ 3784 | "/Tests/" 3785 | ] 3786 | }, 3787 | "notification-url": "https://packagist.org/downloads/", 3788 | "license": [ 3789 | "MIT" 3790 | ], 3791 | "authors": [ 3792 | { 3793 | "name": "Fabien Potencier", 3794 | "email": "fabien@symfony.com" 3795 | }, 3796 | { 3797 | "name": "Symfony Community", 3798 | "homepage": "https://symfony.com/contributors" 3799 | } 3800 | ], 3801 | "description": "Symfony Routing Component", 3802 | "homepage": "https://symfony.com", 3803 | "keywords": [ 3804 | "router", 3805 | "routing", 3806 | "uri", 3807 | "url" 3808 | ], 3809 | "time": "2019-08-26T08:26:39+00:00" 3810 | }, 3811 | { 3812 | "name": "symfony/service-contracts", 3813 | "version": "v1.1.6", 3814 | "source": { 3815 | "type": "git", 3816 | "url": "https://github.com/symfony/service-contracts.git", 3817 | "reference": "ea7263d6b6d5f798b56a45a5b8d686725f2719a3" 3818 | }, 3819 | "dist": { 3820 | "type": "zip", 3821 | "url": "https://api.github.com/repos/symfony/service-contracts/zipball/ea7263d6b6d5f798b56a45a5b8d686725f2719a3", 3822 | "reference": "ea7263d6b6d5f798b56a45a5b8d686725f2719a3", 3823 | "shasum": "" 3824 | }, 3825 | "require": { 3826 | "php": "^7.1.3", 3827 | "psr/container": "^1.0" 3828 | }, 3829 | "suggest": { 3830 | "symfony/service-implementation": "" 3831 | }, 3832 | "type": "library", 3833 | "extra": { 3834 | "branch-alias": { 3835 | "dev-master": "1.1-dev" 3836 | } 3837 | }, 3838 | "autoload": { 3839 | "psr-4": { 3840 | "Symfony\\Contracts\\Service\\": "" 3841 | } 3842 | }, 3843 | "notification-url": "https://packagist.org/downloads/", 3844 | "license": [ 3845 | "MIT" 3846 | ], 3847 | "authors": [ 3848 | { 3849 | "name": "Nicolas Grekas", 3850 | "email": "p@tchwork.com" 3851 | }, 3852 | { 3853 | "name": "Symfony Community", 3854 | "homepage": "https://symfony.com/contributors" 3855 | } 3856 | ], 3857 | "description": "Generic abstractions related to writing services", 3858 | "homepage": "https://symfony.com", 3859 | "keywords": [ 3860 | "abstractions", 3861 | "contracts", 3862 | "decoupling", 3863 | "interfaces", 3864 | "interoperability", 3865 | "standards" 3866 | ], 3867 | "time": "2019-08-20T14:44:19+00:00" 3868 | }, 3869 | { 3870 | "name": "symfony/translation", 3871 | "version": "v4.3.4", 3872 | "source": { 3873 | "type": "git", 3874 | "url": "https://github.com/symfony/translation.git", 3875 | "reference": "28498169dd334095fa981827992f3a24d50fed0f" 3876 | }, 3877 | "dist": { 3878 | "type": "zip", 3879 | "url": "https://api.github.com/repos/symfony/translation/zipball/28498169dd334095fa981827992f3a24d50fed0f", 3880 | "reference": "28498169dd334095fa981827992f3a24d50fed0f", 3881 | "shasum": "" 3882 | }, 3883 | "require": { 3884 | "php": "^7.1.3", 3885 | "symfony/polyfill-mbstring": "~1.0", 3886 | "symfony/translation-contracts": "^1.1.6" 3887 | }, 3888 | "conflict": { 3889 | "symfony/config": "<3.4", 3890 | "symfony/dependency-injection": "<3.4", 3891 | "symfony/yaml": "<3.4" 3892 | }, 3893 | "provide": { 3894 | "symfony/translation-implementation": "1.0" 3895 | }, 3896 | "require-dev": { 3897 | "psr/log": "~1.0", 3898 | "symfony/config": "~3.4|~4.0", 3899 | "symfony/console": "~3.4|~4.0", 3900 | "symfony/dependency-injection": "~3.4|~4.0", 3901 | "symfony/finder": "~2.8|~3.0|~4.0", 3902 | "symfony/http-kernel": "~3.4|~4.0", 3903 | "symfony/intl": "~3.4|~4.0", 3904 | "symfony/service-contracts": "^1.1.2", 3905 | "symfony/var-dumper": "~3.4|~4.0", 3906 | "symfony/yaml": "~3.4|~4.0" 3907 | }, 3908 | "suggest": { 3909 | "psr/log-implementation": "To use logging capability in translator", 3910 | "symfony/config": "", 3911 | "symfony/yaml": "" 3912 | }, 3913 | "type": "library", 3914 | "extra": { 3915 | "branch-alias": { 3916 | "dev-master": "4.3-dev" 3917 | } 3918 | }, 3919 | "autoload": { 3920 | "psr-4": { 3921 | "Symfony\\Component\\Translation\\": "" 3922 | }, 3923 | "exclude-from-classmap": [ 3924 | "/Tests/" 3925 | ] 3926 | }, 3927 | "notification-url": "https://packagist.org/downloads/", 3928 | "license": [ 3929 | "MIT" 3930 | ], 3931 | "authors": [ 3932 | { 3933 | "name": "Fabien Potencier", 3934 | "email": "fabien@symfony.com" 3935 | }, 3936 | { 3937 | "name": "Symfony Community", 3938 | "homepage": "https://symfony.com/contributors" 3939 | } 3940 | ], 3941 | "description": "Symfony Translation Component", 3942 | "homepage": "https://symfony.com", 3943 | "time": "2019-08-26T08:55:16+00:00" 3944 | }, 3945 | { 3946 | "name": "symfony/translation-contracts", 3947 | "version": "v1.1.6", 3948 | "source": { 3949 | "type": "git", 3950 | "url": "https://github.com/symfony/translation-contracts.git", 3951 | "reference": "325b17c24f3ee23cbecfa63ba809c6d89b5fa04a" 3952 | }, 3953 | "dist": { 3954 | "type": "zip", 3955 | "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/325b17c24f3ee23cbecfa63ba809c6d89b5fa04a", 3956 | "reference": "325b17c24f3ee23cbecfa63ba809c6d89b5fa04a", 3957 | "shasum": "" 3958 | }, 3959 | "require": { 3960 | "php": "^7.1.3" 3961 | }, 3962 | "suggest": { 3963 | "symfony/translation-implementation": "" 3964 | }, 3965 | "type": "library", 3966 | "extra": { 3967 | "branch-alias": { 3968 | "dev-master": "1.1-dev" 3969 | } 3970 | }, 3971 | "autoload": { 3972 | "psr-4": { 3973 | "Symfony\\Contracts\\Translation\\": "" 3974 | } 3975 | }, 3976 | "notification-url": "https://packagist.org/downloads/", 3977 | "license": [ 3978 | "MIT" 3979 | ], 3980 | "authors": [ 3981 | { 3982 | "name": "Nicolas Grekas", 3983 | "email": "p@tchwork.com" 3984 | }, 3985 | { 3986 | "name": "Symfony Community", 3987 | "homepage": "https://symfony.com/contributors" 3988 | } 3989 | ], 3990 | "description": "Generic abstractions related to translation", 3991 | "homepage": "https://symfony.com", 3992 | "keywords": [ 3993 | "abstractions", 3994 | "contracts", 3995 | "decoupling", 3996 | "interfaces", 3997 | "interoperability", 3998 | "standards" 3999 | ], 4000 | "time": "2019-08-02T12:15:04+00:00" 4001 | }, 4002 | { 4003 | "name": "symfony/var-dumper", 4004 | "version": "v4.3.4", 4005 | "source": { 4006 | "type": "git", 4007 | "url": "https://github.com/symfony/var-dumper.git", 4008 | "reference": "641043e0f3e615990a0f29479f9c117e8a6698c6" 4009 | }, 4010 | "dist": { 4011 | "type": "zip", 4012 | "url": "https://api.github.com/repos/symfony/var-dumper/zipball/641043e0f3e615990a0f29479f9c117e8a6698c6", 4013 | "reference": "641043e0f3e615990a0f29479f9c117e8a6698c6", 4014 | "shasum": "" 4015 | }, 4016 | "require": { 4017 | "php": "^7.1.3", 4018 | "symfony/polyfill-mbstring": "~1.0", 4019 | "symfony/polyfill-php72": "~1.5" 4020 | }, 4021 | "conflict": { 4022 | "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0", 4023 | "symfony/console": "<3.4" 4024 | }, 4025 | "require-dev": { 4026 | "ext-iconv": "*", 4027 | "symfony/console": "~3.4|~4.0", 4028 | "symfony/process": "~3.4|~4.0", 4029 | "twig/twig": "~1.34|~2.4" 4030 | }, 4031 | "suggest": { 4032 | "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).", 4033 | "ext-intl": "To show region name in time zone dump", 4034 | "symfony/console": "To use the ServerDumpCommand and/or the bin/var-dump-server script" 4035 | }, 4036 | "bin": [ 4037 | "Resources/bin/var-dump-server" 4038 | ], 4039 | "type": "library", 4040 | "extra": { 4041 | "branch-alias": { 4042 | "dev-master": "4.3-dev" 4043 | } 4044 | }, 4045 | "autoload": { 4046 | "files": [ 4047 | "Resources/functions/dump.php" 4048 | ], 4049 | "psr-4": { 4050 | "Symfony\\Component\\VarDumper\\": "" 4051 | }, 4052 | "exclude-from-classmap": [ 4053 | "/Tests/" 4054 | ] 4055 | }, 4056 | "notification-url": "https://packagist.org/downloads/", 4057 | "license": [ 4058 | "MIT" 4059 | ], 4060 | "authors": [ 4061 | { 4062 | "name": "Nicolas Grekas", 4063 | "email": "p@tchwork.com" 4064 | }, 4065 | { 4066 | "name": "Symfony Community", 4067 | "homepage": "https://symfony.com/contributors" 4068 | } 4069 | ], 4070 | "description": "Symfony mechanism for exploring and dumping PHP variables", 4071 | "homepage": "https://symfony.com", 4072 | "keywords": [ 4073 | "debug", 4074 | "dump" 4075 | ], 4076 | "time": "2019-08-26T08:26:39+00:00" 4077 | }, 4078 | { 4079 | "name": "theseer/tokenizer", 4080 | "version": "1.1.3", 4081 | "source": { 4082 | "type": "git", 4083 | "url": "https://github.com/theseer/tokenizer.git", 4084 | "reference": "11336f6f84e16a720dae9d8e6ed5019efa85a0f9" 4085 | }, 4086 | "dist": { 4087 | "type": "zip", 4088 | "url": "https://api.github.com/repos/theseer/tokenizer/zipball/11336f6f84e16a720dae9d8e6ed5019efa85a0f9", 4089 | "reference": "11336f6f84e16a720dae9d8e6ed5019efa85a0f9", 4090 | "shasum": "" 4091 | }, 4092 | "require": { 4093 | "ext-dom": "*", 4094 | "ext-tokenizer": "*", 4095 | "ext-xmlwriter": "*", 4096 | "php": "^7.0" 4097 | }, 4098 | "type": "library", 4099 | "autoload": { 4100 | "classmap": [ 4101 | "src/" 4102 | ] 4103 | }, 4104 | "notification-url": "https://packagist.org/downloads/", 4105 | "license": [ 4106 | "BSD-3-Clause" 4107 | ], 4108 | "authors": [ 4109 | { 4110 | "name": "Arne Blankerts", 4111 | "email": "arne@blankerts.de", 4112 | "role": "Developer" 4113 | } 4114 | ], 4115 | "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", 4116 | "time": "2019-06-13T22:48:21+00:00" 4117 | }, 4118 | { 4119 | "name": "tijsverkoyen/css-to-inline-styles", 4120 | "version": "2.2.1", 4121 | "source": { 4122 | "type": "git", 4123 | "url": "https://github.com/tijsverkoyen/CssToInlineStyles.git", 4124 | "reference": "0ed4a2ea4e0902dac0489e6436ebcd5bbcae9757" 4125 | }, 4126 | "dist": { 4127 | "type": "zip", 4128 | "url": "https://api.github.com/repos/tijsverkoyen/CssToInlineStyles/zipball/0ed4a2ea4e0902dac0489e6436ebcd5bbcae9757", 4129 | "reference": "0ed4a2ea4e0902dac0489e6436ebcd5bbcae9757", 4130 | "shasum": "" 4131 | }, 4132 | "require": { 4133 | "php": "^5.5 || ^7.0", 4134 | "symfony/css-selector": "^2.7 || ^3.0 || ^4.0" 4135 | }, 4136 | "require-dev": { 4137 | "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" 4138 | }, 4139 | "type": "library", 4140 | "extra": { 4141 | "branch-alias": { 4142 | "dev-master": "2.2.x-dev" 4143 | } 4144 | }, 4145 | "autoload": { 4146 | "psr-4": { 4147 | "TijsVerkoyen\\CssToInlineStyles\\": "src" 4148 | } 4149 | }, 4150 | "notification-url": "https://packagist.org/downloads/", 4151 | "license": [ 4152 | "BSD-3-Clause" 4153 | ], 4154 | "authors": [ 4155 | { 4156 | "name": "Tijs Verkoyen", 4157 | "email": "css_to_inline_styles@verkoyen.eu", 4158 | "role": "Developer" 4159 | } 4160 | ], 4161 | "description": "CssToInlineStyles is a class that enables you to convert HTML-pages/files into HTML-pages/files with inline styles. This is very useful when you're sending emails.", 4162 | "homepage": "https://github.com/tijsverkoyen/CssToInlineStyles", 4163 | "time": "2017-11-27T11:13:29+00:00" 4164 | }, 4165 | { 4166 | "name": "vlucas/phpdotenv", 4167 | "version": "v3.6.0", 4168 | "source": { 4169 | "type": "git", 4170 | "url": "https://github.com/vlucas/phpdotenv.git", 4171 | "reference": "1bdf24f065975594f6a117f0f1f6cabf1333b156" 4172 | }, 4173 | "dist": { 4174 | "type": "zip", 4175 | "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/1bdf24f065975594f6a117f0f1f6cabf1333b156", 4176 | "reference": "1bdf24f065975594f6a117f0f1f6cabf1333b156", 4177 | "shasum": "" 4178 | }, 4179 | "require": { 4180 | "php": "^5.4 || ^7.0", 4181 | "phpoption/phpoption": "^1.5", 4182 | "symfony/polyfill-ctype": "^1.9" 4183 | }, 4184 | "require-dev": { 4185 | "phpunit/phpunit": "^4.8.35 || ^5.0 || ^6.0 || ^7.0" 4186 | }, 4187 | "type": "library", 4188 | "extra": { 4189 | "branch-alias": { 4190 | "dev-master": "3.6-dev" 4191 | } 4192 | }, 4193 | "autoload": { 4194 | "psr-4": { 4195 | "Dotenv\\": "src/" 4196 | } 4197 | }, 4198 | "notification-url": "https://packagist.org/downloads/", 4199 | "license": [ 4200 | "BSD-3-Clause" 4201 | ], 4202 | "authors": [ 4203 | { 4204 | "name": "Graham Campbell", 4205 | "email": "graham@alt-three.com", 4206 | "homepage": "https://gjcampbell.co.uk/" 4207 | }, 4208 | { 4209 | "name": "Vance Lucas", 4210 | "email": "vance@vancelucas.com", 4211 | "homepage": "https://vancelucas.com/" 4212 | } 4213 | ], 4214 | "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.", 4215 | "keywords": [ 4216 | "dotenv", 4217 | "env", 4218 | "environment" 4219 | ], 4220 | "time": "2019-09-10T21:37:39+00:00" 4221 | }, 4222 | { 4223 | "name": "webmozart/assert", 4224 | "version": "1.5.0", 4225 | "source": { 4226 | "type": "git", 4227 | "url": "https://github.com/webmozart/assert.git", 4228 | "reference": "88e6d84706d09a236046d686bbea96f07b3a34f4" 4229 | }, 4230 | "dist": { 4231 | "type": "zip", 4232 | "url": "https://api.github.com/repos/webmozart/assert/zipball/88e6d84706d09a236046d686bbea96f07b3a34f4", 4233 | "reference": "88e6d84706d09a236046d686bbea96f07b3a34f4", 4234 | "shasum": "" 4235 | }, 4236 | "require": { 4237 | "php": "^5.3.3 || ^7.0", 4238 | "symfony/polyfill-ctype": "^1.8" 4239 | }, 4240 | "require-dev": { 4241 | "phpunit/phpunit": "^4.8.36 || ^7.5.13" 4242 | }, 4243 | "type": "library", 4244 | "extra": { 4245 | "branch-alias": { 4246 | "dev-master": "1.3-dev" 4247 | } 4248 | }, 4249 | "autoload": { 4250 | "psr-4": { 4251 | "Webmozart\\Assert\\": "src/" 4252 | } 4253 | }, 4254 | "notification-url": "https://packagist.org/downloads/", 4255 | "license": [ 4256 | "MIT" 4257 | ], 4258 | "authors": [ 4259 | { 4260 | "name": "Bernhard Schussek", 4261 | "email": "bschussek@gmail.com" 4262 | } 4263 | ], 4264 | "description": "Assertions to validate method input/output with nice error messages.", 4265 | "keywords": [ 4266 | "assert", 4267 | "check", 4268 | "validate" 4269 | ], 4270 | "time": "2019-08-24T08:43:50+00:00" 4271 | } 4272 | ], 4273 | "aliases": [], 4274 | "minimum-stability": "stable", 4275 | "stability-flags": [], 4276 | "prefer-stable": false, 4277 | "prefer-lowest": false, 4278 | "platform": [], 4279 | "platform-dev": [] 4280 | } 4281 | -------------------------------------------------------------------------------- /phpunit.xml: -------------------------------------------------------------------------------- 1 | 2 | 11 | 12 | 13 | ./tests/Unit 14 | 15 | 16 | 17 | 18 | ./src 19 | 20 | 21 | -------------------------------------------------------------------------------- /src/ServiceProvider.php: -------------------------------------------------------------------------------- 1 | wheres[0] ?? null) { 16 | throw new InvalidArgumentException('The relation methods should only be called from within a whereHas callback.'); 17 | } 18 | 19 | return $this->where('id', function ($sub) use ($where, $type) { 20 | $sub->from($this->from) 21 | ->selectRaw($type . '(id)') 22 | ->whereColumn($where['first'], $where['second']); 23 | }); 24 | }); 25 | 26 | QueryBuilder::macro('earliestRelation', function () { 27 | return $this->relation('min'); 28 | }); 29 | 30 | QueryBuilder::macro('latestRelation', function () { 31 | return $this->relation('max'); 32 | }); 33 | 34 | QueryBuilder::macro('whereEarliest', function ($column, $operator = null, $value = null) { 35 | return $this->earliestRelation()->where($column, $operator, $value); 36 | }); 37 | 38 | QueryBuilder::macro('whereLatest', function ($column, $operator = null, $value = null) { 39 | return $this->latestRelation()->where($column, $operator, $value); 40 | }); 41 | 42 | EloquentBuilder::macro('whereEarliestRelation', function ($relation, $column, $operator = null, $value = null) { 43 | return $this->whereHas($relation, function($query) use ($column, $operator, $value) { 44 | return $query->whereEarliest($column, $operator, $value); 45 | }); 46 | }); 47 | 48 | EloquentBuilder::macro('whereLatestRelation', function ($relation, $column, $operator = null, $value = null) { 49 | return $this->whereHas($relation, function ($query) use ($column, $operator, $value) { 50 | $query->whereLatest($column, $operator, $value); 51 | }); 52 | }); 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /tests/TestCase.php: -------------------------------------------------------------------------------- 1 | set('database.default', 'testing'); 20 | $app['config']->set('database.connections.testing', [ 21 | 'driver' => 'sqlite', 22 | 'database' => ':memory:', 23 | ]); 24 | } 25 | 26 | /** 27 | * Get package providers. 28 | * 29 | * @param \Illuminate\Foundation\Application $app 30 | * 31 | * @return array 32 | */ 33 | protected function getPackageProviders($app) 34 | { 35 | return [ 36 | ServiceProvider::class, 37 | ]; 38 | } 39 | } -------------------------------------------------------------------------------- /tests/Unit/EloquentLatestRelationTest.php: -------------------------------------------------------------------------------- 1 | bigIncrements('id'); 20 | $table->string('name'); 21 | $table->string('email')->unique(); 22 | $table->timestamps(); 23 | }); 24 | 25 | Schema::create('logins', function (Blueprint $table) { 26 | $table->bigIncrements('id'); 27 | $table->timestamp('created_at'); 28 | $table->unsignedBigInteger('user_id'); 29 | $table->enum('device_type', ['mobile', 'desktop']); 30 | $table->string('country')->nullable(); 31 | }); 32 | 33 | DB::table('users')->insert([ 34 | [ 35 | 'name' => 'Ferris Bueller', 36 | 'email' => 'ferris@buellerandco.com' 37 | ], [ 38 | 'name' => 'Cameron Frye', 39 | 'email' => 'cameron@nervouswrecks.com' 40 | ], [ 41 | 'name' => 'Ed Rooney', 42 | 'email' => 'ed@rooneypi.com' 43 | ], 44 | ]); 45 | 46 | DB::table('logins')->insert([ 47 | [ 48 | 'user_id' => 1, 49 | 'created_at' => Carbon::now()->subDays(3), 50 | 'device_type' => 'mobile', 51 | 'country' => null 52 | ], [ 53 | 54 | 'user_id' => 2, 55 | 'created_at' => Carbon::now()->subDays(3), 56 | 'device_type' => 'mobile', 57 | 'country' => null 58 | ], [ 59 | 'user_id' => 3, 60 | 'created_at' => Carbon::now()->subDays(3), 61 | 'device_type' => 'mobile', 62 | 'country' => 'US' 63 | ], [ 64 | 'user_id' => 1, 65 | 'created_at' => Carbon::now()->subDay(2), 66 | 'device_type' => 'desktop', 67 | 'country' => null 68 | ], [ 69 | 'user_id' => 2, 70 | 'created_at' => Carbon::now()->subDay(2), 71 | 'device_type' => 'desktop', 72 | 'country' => null 73 | ], [ 74 | 'user_id' => 3, 75 | 'created_at' => Carbon::now()->subDay(2), 76 | 'device_type' => 'desktop', 77 | 'country' => null 78 | ], [ 79 | 'user_id' => 1, 80 | 'created_at' => Carbon::now(), 81 | 'device_type' => 'desktop', 82 | 'country' => 'US' 83 | ], [ 84 | 'user_id' => 2, 85 | 'created_at' => Carbon::now()->subDay(1), 86 | 'device_type' => 'mobile', 87 | 'country' => null 88 | ], [ 89 | 'user_id' => 3, 90 | 'created_at' => Carbon::now(), 91 | 'device_type' => 'mobile', 92 | 'country' => null 93 | ], 94 | ]); 95 | } 96 | 97 | /** 98 | * @test 99 | */ 100 | public function latest_relation() 101 | { 102 | $users = User::whereHas('logins', function ($query) { 103 | $query->latestRelation()->whereNotNull('country'); 104 | }); 105 | 106 | $this->assertSame(1, $users->count()); 107 | $this->assertSame('Ferris Bueller', $users->first()->name); 108 | 109 | $loggedInYesterday = User::whereHas('logins', function ($query) { 110 | $query->latestRelation()->whereBetween( 111 | 'created_at', [ 112 | Carbon::now()->subDay(1)->startOfDay(), 113 | Carbon::now()->subDay(1)->endOfDay() 114 | ]); 115 | }); 116 | 117 | $this->assertSame(1, $loggedInYesterday->count()); 118 | $this->assertSame('Cameron Frye', $loggedInYesterday->first()->name); 119 | } 120 | 121 | /** 122 | * @test 123 | */ 124 | public function earliest_relation() 125 | { 126 | $users = User::whereHas('logins', function ($query) { 127 | $query->earliestRelation()->whereNotNull('country'); 128 | }); 129 | 130 | $this->assertSame(1, $users->count()); 131 | $this->assertSame('Ed Rooney', $users->first()->name); 132 | } 133 | 134 | /** 135 | * @test 136 | */ 137 | public function where_latest() 138 | { 139 | $users = User::whereHas('logins', function ($query) { 140 | $query->whereLatest('device_type', 'mobile'); 141 | })->get(); 142 | 143 | $this->assertCount(2, $users); 144 | $this->assertSame('Cameron Frye', $users->first()->name); 145 | $this->assertSame('mobile', $users->first()->lastLogin->device_type); 146 | $this->assertTrue($users->first()->lastLogin->created_at->isYesterday()); 147 | $this->assertSame('Ed Rooney', $users->last()->name); 148 | $this->assertSame('mobile', $users->last()->lastLogin->device_type); 149 | $this->assertTrue($users->last()->lastLogin->created_at->isToday()); 150 | 151 | $users = User::whereHas('logins', function ($query) { 152 | $query->whereLatest('device_type', 'desktop'); 153 | })->get(); 154 | 155 | $this->assertCount(1, $users); 156 | $this->assertSame('Ferris Bueller', $users->first()->name); 157 | $this->assertSame('desktop', $users->first()->lastLogin->device_type); 158 | } 159 | 160 | /** 161 | * @test 162 | */ 163 | public function where_earliest() 164 | { 165 | $users = User::whereHas('logins', function ($query) { 166 | $query->whereEarliest('device_type', 'mobile'); 167 | })->get(); 168 | 169 | $this->assertCount(3, $users); 170 | 171 | $users = User::whereHas('logins', function ($query) { 172 | $query->whereEarliest('device_type', 'desktop'); 173 | })->get(); 174 | 175 | $this->assertCount(0, $users); 176 | } 177 | 178 | /** 179 | * @test 180 | */ 181 | public function where_latest_relation() 182 | { 183 | $users = User::whereLatestRelation('logins', 'device_type', 'mobile')->get(); 184 | 185 | $this->assertCount(2, $users); 186 | $this->assertSame('Cameron Frye', $users->first()->name); 187 | $this->assertSame('mobile', $users->first()->lastLogin->device_type); 188 | $this->assertTrue($users->first()->lastLogin->created_at->isYesterday()); 189 | $this->assertSame('Ed Rooney', $users->last()->name); 190 | $this->assertSame('mobile', $users->last()->lastLogin->device_type); 191 | $this->assertTrue($users->last()->lastLogin->created_at->isToday()); 192 | 193 | $users = User::whereLatestRelation('logins', 'device_type', 'desktop')->get(); 194 | 195 | $this->assertCount(1, $users); 196 | $this->assertSame('Ferris Bueller', $users->first()->name); 197 | $this->assertSame('desktop', $users->first()->lastLogin->device_type); 198 | } 199 | 200 | /** 201 | * @test 202 | */ 203 | public function where_earliest_relation() 204 | { 205 | $users = User::whereEarliestRelation('logins', 'device_type', 'mobile')->get(); 206 | 207 | $this->assertCount(3, $users); 208 | 209 | $users = User::whereEarliestRelation('logins', 'device_type', 'desktop')->get(); 210 | 211 | $this->assertCount(0, $users); 212 | } 213 | 214 | /** 215 | * @test 216 | */ 217 | public function where_latest_relation_country_is_not_null() 218 | { 219 | $users = User::whereLatestRelation('logins', 'country', '!=', 'null'); 220 | 221 | $this->assertSame(1, $users->count()); 222 | $this->assertSame('Ferris Bueller', $users->first()->name); 223 | } 224 | 225 | /** 226 | * @test 227 | */ 228 | public function where_earliest_relation_country_is_not_null() 229 | { 230 | $users = User::whereEarliestRelation('logins', 'country', '!=', 'null'); 231 | 232 | $this->assertSame(1, $users->count()); 233 | $this->assertSame('Ed Rooney', $users->first()->name); 234 | } 235 | } 236 | 237 | class User extends Model 238 | { 239 | public function logins() 240 | { 241 | return $this->hasMany(Login::class); 242 | } 243 | 244 | public function lastLogin() 245 | { 246 | return $this->hasOne(Login::class)->latest(); 247 | } 248 | } 249 | 250 | class Login extends Model 251 | { 252 | public function user() 253 | { 254 | return $this->belongsTo(User::class); 255 | } 256 | } 257 | --------------------------------------------------------------------------------