diff --git a/.travis.yml b/.travis.yml index 077ea260c..7052ae55e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,9 +3,8 @@ language: php # Versions of PHP you want your project run with. php: - - 5.5 - - 5.6 - - hhvm + - 7.1 + - 7.2 # Commands to be run before your environment runs. before_script: @@ -20,7 +19,6 @@ script: phpunit matrix: allow_failures: - php: 5.5 - - php: hhvm fast_finish: true # Customize when the notification emails are sent. diff --git a/composer.json b/composer.json index b9d70f2e1..47b6b635c 100644 --- a/composer.json +++ b/composer.json @@ -8,7 +8,8 @@ "license": "MIT", "type": "project", "require": { - "laravel/framework": "5.5.*", + "php": ">=7.1.3", + "laravel/framework": "5.6.*", "laravelcollective/html": "5.*", "vsmoraes/laravel-pdf": "1.0.1", "propaganistas/laravel-phone": "~2.0", @@ -19,11 +20,10 @@ "chumper/datatable": "dev-develop", "chumper/zipper": "1.0.x", "tymon/jwt-auth": "dev-develop", - "php": ">=5.5.9", "davejamesmiller/laravel-breadcrumbs": "^3.0", "davibennun/laravel-push-notification": "dev-laravel5", "brozot/laravel-fcm": "^1.0", - "barryvdh/laravel-debugbar": "^2.2", + "barryvdh/laravel-debugbar": "3.1.*", "aws/aws-sdk-php": "~3.0", "predis/predis": "~1.0", "mremi/url-shortener": "^1.0", @@ -38,13 +38,13 @@ "doctrine/dbal": "^2.5" }, "require-dev": { - "phpunit/phpunit": "~6.0", - "phpspec/phpspec": "~2.1", + "phpunit/phpunit": "~7.0", + "phpspec/phpspec": "^4.0", "symfony/dom-crawler": "3.1.*", "symfony/css-selector": "3.1.*", "fzaninotto/faker": "1.*", "filp/whoops": "~2.0", - "laravel/dusk": "2.0.0" + "laravel/dusk": "~3.0" }, "autoload": { "classmap": [ @@ -57,8 +57,7 @@ }, "autoload-dev": { "classmap": [ - "tests/TestCase.php", - "tests/DuskTestCase.php" + "tests/TestCase.php" ] }, "extra": { @@ -70,12 +69,10 @@ }, "scripts": { "post-install-cmd": [ - "php artisan clear-compiled", - "php artisan optimize" + "php artisan clear-compiled" ], "post-update-cmd": [ - "php artisan clear-compiled", - "php artisan optimize" + "php artisan clear-compiled" ], "post-create-project-cmd": [ "php -r \"copy('.env.example', '.env');\"", diff --git a/composer.lock b/composer.lock index 3ef4550ba..6e8462332 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "content-hash": "fb21d8fc7f54fd49740f98c753ba52c6", + "content-hash": "2b3efd18bd91ef10e2f43b0e29f90661", "packages": [ { "name": "aws/aws-sdk-php", @@ -88,25 +88,44 @@ }, { "name": "barryvdh/laravel-debugbar", - "version": "v2.4.3", + "version": "v3.1.5", "source": { "type": "git", "url": "https://github.com/barryvdh/laravel-debugbar.git", - "reference": "d7c88f08131f6404cb714f3f6cf0642f6afa3903" + "reference": "d3cdca2ad6cc6e67735b4a63e7551c690a497f5f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/d7c88f08131f6404cb714f3f6cf0642f6afa3903", - "reference": "d7c88f08131f6404cb714f3f6cf0642f6afa3903", + "url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/d3cdca2ad6cc6e67735b4a63e7551c690a497f5f", + "reference": "d3cdca2ad6cc6e67735b4a63e7551c690a497f5f", "shasum": "" }, "require": { - "illuminate/support": "5.1.*|5.2.*|5.3.*|5.4.*|5.5.*", - "maximebf/debugbar": "~1.13.0", - "php": ">=5.5.9", - "symfony/finder": "~2.7|~3.0" + "illuminate/routing": "5.5.x|5.6.x", + "illuminate/session": "5.5.x|5.6.x", + "illuminate/support": "5.5.x|5.6.x", + "maximebf/debugbar": "~1.15.0", + "php": ">=7.0", + "symfony/debug": "^3|^4", + "symfony/finder": "^3|^4" + }, + "require-dev": { + "illuminate/framework": "5.5.x" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.2-dev" + }, + "laravel": { + "providers": [ + "Barryvdh\\Debugbar\\ServiceProvider" + ], + "aliases": { + "Debugbar": "Barryvdh\\Debugbar\\Facade" + } + } + }, "autoload": { "psr-4": { "Barryvdh\\Debugbar\\": "src/" @@ -133,7 +152,7 @@ "profiler", "webprofiler" ], - "time": "2017-07-21T11:56:48+00:00" + "time": "2018-05-03T18:27:04+00:00" }, { "name": "brozot/laravel-fcm", @@ -917,6 +936,55 @@ "homepage": "https://github.com/dompdf/dompdf", "time": "2015-12-07T04:07:13+00:00" }, + { + "name": "dragonmantank/cron-expression", + "version": "v2.2.0", + "source": { + "type": "git", + "url": "https://github.com/dragonmantank/cron-expression.git", + "reference": "92a2c3768d50e21a1f26a53cb795ce72806266c5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/92a2c3768d50e21a1f26a53cb795ce72806266c5", + "reference": "92a2c3768d50e21a1f26a53cb795ce72806266c5", + "shasum": "" + }, + "require": { + "php": ">=7.0.0" + }, + "require-dev": { + "phpunit/phpunit": "~6.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Cron\\": "src/Cron/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Chris Tankersley", + "email": "chris@ctankersley.com", + "homepage": "https://github.com/dragonmantank" + } + ], + "description": "CRON for PHP: Calculate the next or previous run date and determine if a CRON expression is due", + "keywords": [ + "cron", + "schedule" + ], + "time": "2018-06-06T03:12:17+00:00" + }, { "name": "egulias/email-validator", "version": "2.1.4", @@ -1626,43 +1694,46 @@ }, { "name": "laravel/framework", - "version": "v5.5.41", + "version": "v5.6.29", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "a2c54e6e69035111fa2709f9cdac55be811feb6b" + "reference": "acc6b5c54ab196d3358f60acc5f55d9ebaaccc02" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/a2c54e6e69035111fa2709f9cdac55be811feb6b", - "reference": "a2c54e6e69035111fa2709f9cdac55be811feb6b", + "url": "https://api.github.com/repos/laravel/framework/zipball/acc6b5c54ab196d3358f60acc5f55d9ebaaccc02", + "reference": "acc6b5c54ab196d3358f60acc5f55d9ebaaccc02", "shasum": "" }, "require": { "doctrine/inflector": "~1.1", + "dragonmantank/cron-expression": "~2.0", "erusev/parsedown": "~1.7", "ext-mbstring": "*", "ext-openssl": "*", "league/flysystem": "^1.0.8", "monolog/monolog": "~1.12", - "mtdowling/cron-expression": "~1.0", - "nesbot/carbon": "^1.24.1", - "php": ">=7.0", + "nesbot/carbon": "1.25.*", + "php": "^7.1.3", "psr/container": "~1.0", "psr/simple-cache": "^1.0", - "ramsey/uuid": "~3.0", + "ramsey/uuid": "^3.7", "swiftmailer/swiftmailer": "~6.0", - "symfony/console": "~3.3", - "symfony/debug": "~3.3", - "symfony/finder": "~3.3", - "symfony/http-foundation": "~3.3", - "symfony/http-kernel": "~3.3", - "symfony/process": "~3.3", - "symfony/routing": "~3.3", - "symfony/var-dumper": "~3.3", - "tijsverkoyen/css-to-inline-styles": "~2.2", + "symfony/console": "~4.0", + "symfony/debug": "~4.0", + "symfony/finder": "~4.0", + "symfony/http-foundation": "~4.0", + "symfony/http-kernel": "~4.0", + "symfony/process": "~4.0", + "symfony/routing": "~4.0", + "symfony/var-dumper": "~4.0", + "tijsverkoyen/css-to-inline-styles": "^2.2.1", "vlucas/phpdotenv": "~2.2" }, + "conflict": { + "tightenco/collect": "<5.5.33" + }, "replace": { "illuminate/auth": "self.version", "illuminate/broadcasting": "self.version", @@ -1691,44 +1762,46 @@ "illuminate/support": "self.version", "illuminate/translation": "self.version", "illuminate/validation": "self.version", - "illuminate/view": "self.version", - "tightenco/collect": "<5.5.33" + "illuminate/view": "self.version" }, "require-dev": { "aws/aws-sdk-php": "~3.0", - "doctrine/dbal": "~2.5", + "doctrine/dbal": "~2.6", "filp/whoops": "^2.1.4", + "league/flysystem-cached-adapter": "~1.0", "mockery/mockery": "~1.0", - "orchestra/testbench-core": "3.5.*", + "moontoast/math": "^1.1", + "orchestra/testbench-core": "3.6.*", "pda/pheanstalk": "~3.0", - "phpunit/phpunit": "~6.0", + "phpunit/phpunit": "~7.0", "predis/predis": "^1.1.1", - "symfony/css-selector": "~3.3", - "symfony/dom-crawler": "~3.3" + "symfony/css-selector": "~4.0", + "symfony/dom-crawler": "~4.0" }, "suggest": { "aws/aws-sdk-php": "Required to use the SQS queue driver and SES mail driver (~3.0).", - "doctrine/dbal": "Required to rename columns and drop SQLite columns (~2.5).", + "doctrine/dbal": "Required to rename columns and drop SQLite columns (~2.6).", "ext-pcntl": "Required to use all features of the queue worker.", "ext-posix": "Required to use all features of the queue worker.", "fzaninotto/faker": "Required to use the eloquent factory builder (~1.4).", "guzzlehttp/guzzle": "Required to use the Mailgun and Mandrill mail drivers and the ping methods on schedules (~6.0).", "laravel/tinker": "Required to use the tinker console command (~1.0).", "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (~1.0).", - "league/flysystem-cached-adapter": "Required to use Flysystem caching (~1.0).", + "league/flysystem-cached-adapter": "Required to use the Flysystem cache (~1.0).", "league/flysystem-rackspace": "Required to use the Flysystem Rackspace driver (~1.0).", + "league/flysystem-sftp": "Required to use the Flysystem SFTP driver (~1.0).", "nexmo/client": "Required to use the Nexmo transport (~1.0).", "pda/pheanstalk": "Required to use the beanstalk queue driver (~3.0).", "predis/predis": "Required to use the redis cache and queue drivers (~1.0).", "pusher/pusher-php-server": "Required to use the Pusher broadcast driver (~3.0).", - "symfony/css-selector": "Required to use some of the crawler integration testing tools (~3.3).", - "symfony/dom-crawler": "Required to use most of the crawler integration testing tools (~3.3).", + "symfony/css-selector": "Required to use some of the crawler integration testing tools (~4.0).", + "symfony/dom-crawler": "Required to use most of the crawler integration testing tools (~4.0).", "symfony/psr-http-message-bridge": "Required to psr7 bridging features (~1.0)." }, "type": "library", "extra": { "branch-alias": { - "dev-master": "5.5-dev" + "dev-master": "5.6-dev" } }, "autoload": { @@ -1756,7 +1829,7 @@ "framework", "laravel" ], - "time": "2018-08-01T13:48:57+00:00" + "time": "2018-07-26T16:01:26+00:00" }, { "name": "laravel/socialite", @@ -1814,35 +1887,35 @@ }, { "name": "laravelcollective/html", - "version": "v5.5.4", + "version": "v5.6.10", "source": { "type": "git", "url": "https://github.com/LaravelCollective/html.git", - "reference": "04c596a69975b901f2223eb6eb4adf55354121c2" + "reference": "974605fcd22a7e4d19f0b2ef635a0d1d7400387d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/LaravelCollective/html/zipball/04c596a69975b901f2223eb6eb4adf55354121c2", - "reference": "04c596a69975b901f2223eb6eb4adf55354121c2", + "url": "https://api.github.com/repos/LaravelCollective/html/zipball/974605fcd22a7e4d19f0b2ef635a0d1d7400387d", + "reference": "974605fcd22a7e4d19f0b2ef635a0d1d7400387d", "shasum": "" }, "require": { - "illuminate/http": "5.5.*", - "illuminate/routing": "5.5.*", - "illuminate/session": "5.5.*", - "illuminate/support": "5.5.*", - "illuminate/view": "5.5.*", - "php": ">=7.0.0" + "illuminate/http": "5.6.*", + "illuminate/routing": "5.6.*", + "illuminate/session": "5.6.*", + "illuminate/support": "5.6.*", + "illuminate/view": "5.6.*", + "php": ">=7.1.3" }, "require-dev": { - "illuminate/database": "5.5.*", - "mockery/mockery": "~0.9.4", - "phpunit/phpunit": "~5.4" + "illuminate/database": "5.6.*", + "mockery/mockery": "~1.0", + "phpunit/phpunit": "~7.1" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "5.5-dev" + "dev-master": "5.6-dev" }, "laravel": { "providers": [ @@ -1878,7 +1951,7 @@ ], "description": "HTML and Form Builders for the Laravel Framework", "homepage": "https://laravelcollective.com", - "time": "2018-03-24T00:39:21+00:00" + "time": "2018-06-18T15:04:16+00:00" }, { "name": "lcobucci/jwt", @@ -2229,22 +2302,22 @@ }, { "name": "maximebf/debugbar", - "version": "1.13.1", + "version": "v1.15.0", "source": { "type": "git", "url": "https://github.com/maximebf/php-debugbar.git", - "reference": "afee79a236348e39a44cb837106b7c5b4897ac2a" + "reference": "30e7d60937ee5f1320975ca9bc7bcdd44d500f07" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/maximebf/php-debugbar/zipball/afee79a236348e39a44cb837106b7c5b4897ac2a", - "reference": "afee79a236348e39a44cb837106b7c5b4897ac2a", + "url": "https://api.github.com/repos/maximebf/php-debugbar/zipball/30e7d60937ee5f1320975ca9bc7bcdd44d500f07", + "reference": "30e7d60937ee5f1320975ca9bc7bcdd44d500f07", "shasum": "" }, "require": { "php": ">=5.3.0", "psr/log": "^1.0", - "symfony/var-dumper": "^2.6|^3.0" + "symfony/var-dumper": "^2.6|^3.0|^4.0" }, "require-dev": { "phpunit/phpunit": "^4.0|^5.0" @@ -2257,7 +2330,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.13-dev" + "dev-master": "1.14-dev" } }, "autoload": { @@ -2286,7 +2359,7 @@ "debug", "debugbar" ], - "time": "2017-01-05T08:46:19+00:00" + "time": "2017-12-15T11:13:46+00:00" }, { "name": "monolog/monolog", @@ -2409,50 +2482,6 @@ ], "time": "2013-10-18T21:34:40+00:00" }, - { - "name": "mtdowling/cron-expression", - "version": "v1.2.1", - "source": { - "type": "git", - "url": "https://github.com/mtdowling/cron-expression.git", - "reference": "9504fa9ea681b586028adaaa0877db4aecf32bad" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/mtdowling/cron-expression/zipball/9504fa9ea681b586028adaaa0877db4aecf32bad", - "reference": "9504fa9ea681b586028adaaa0877db4aecf32bad", - "shasum": "" - }, - "require": { - "php": ">=5.3.2" - }, - "require-dev": { - "phpunit/phpunit": "~4.0|~5.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Cron\\": "src/Cron/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - } - ], - "description": "CRON for PHP: Calculate the next or previous run date and determine if a CRON expression is due", - "keywords": [ - "cron", - "schedule" - ], - "time": "2017-01-23T04:29:33+00:00" - }, { "name": "mtdowling/jmespath.php", "version": "2.4.0", @@ -2607,16 +2636,16 @@ }, { "name": "nesbot/carbon", - "version": "1.32.0", + "version": "1.25.0", "source": { "type": "git", "url": "https://github.com/briannesbitt/Carbon.git", - "reference": "64563e2b9f69e4db1b82a60e81efa327a30ff343" + "reference": "cbcf13da0b531767e39eb86e9687f5deba9857b4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/64563e2b9f69e4db1b82a60e81efa327a30ff343", - "reference": "64563e2b9f69e4db1b82a60e81efa327a30ff343", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/cbcf13da0b531767e39eb86e9687f5deba9857b4", + "reference": "cbcf13da0b531767e39eb86e9687f5deba9857b4", "shasum": "" }, "require": { @@ -2629,15 +2658,13 @@ }, "type": "library", "extra": { - "laravel": { - "providers": [ - "Carbon\\Laravel\\ServiceProvider" - ] + "branch-alias": { + "dev-master": "1.23-dev" } }, "autoload": { "psr-4": { - "": "src/" + "Carbon\\": "src/Carbon/" } }, "notification-url": "https://packagist.org/downloads/", @@ -2658,7 +2685,7 @@ "datetime", "time" ], - "time": "2018-07-05T06:59:26+00:00" + "time": "2018-03-19T15:50:49+00:00" }, { "name": "nicolaslopezj/searchable", @@ -2759,33 +2786,29 @@ }, { "name": "paragonie/random_compat", - "version": "v2.0.17", + "version": "v9.99.99", "source": { "type": "git", "url": "https://github.com/paragonie/random_compat.git", - "reference": "29af24f25bab834fcbb38ad2a69fa93b867e070d" + "reference": "84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/paragonie/random_compat/zipball/29af24f25bab834fcbb38ad2a69fa93b867e070d", - "reference": "29af24f25bab834fcbb38ad2a69fa93b867e070d", + "url": "https://api.github.com/repos/paragonie/random_compat/zipball/84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95", + "reference": "84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95", "shasum": "" }, "require": { - "php": ">=5.2.0" + "php": "^7" }, "require-dev": { - "phpunit/phpunit": "4.*|5.*" + "phpunit/phpunit": "4.*|5.*", + "vimeo/psalm": "^1" }, "suggest": { "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes." }, "type": "library", - "autoload": { - "files": [ - "lib/random.php" - ] - }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" @@ -2804,7 +2827,7 @@ "pseudorandom", "random" ], - "time": "2018-07-04T16:31:37+00:00" + "time": "2018-07-02T15:55:56+00:00" }, { "name": "phenx/php-font-lib", @@ -3417,21 +3440,20 @@ }, { "name": "symfony/console", - "version": "v3.4.14", + "version": "v4.1.3", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "6b217594552b9323bcdcfc14f8a0ce126e84cd73" + "reference": "ca80b8ced97cf07390078b29773dc384c39eee1f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/6b217594552b9323bcdcfc14f8a0ce126e84cd73", - "reference": "6b217594552b9323bcdcfc14f8a0ce126e84cd73", + "url": "https://api.github.com/repos/symfony/console/zipball/ca80b8ced97cf07390078b29773dc384c39eee1f", + "reference": "ca80b8ced97cf07390078b29773dc384c39eee1f", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8", - "symfony/debug": "~2.8|~3.0|~4.0", + "php": "^7.1.3", "symfony/polyfill-mbstring": "~1.0" }, "conflict": { @@ -3440,11 +3462,11 @@ }, "require-dev": { "psr/log": "~1.0", - "symfony/config": "~3.3|~4.0", + "symfony/config": "~3.4|~4.0", "symfony/dependency-injection": "~3.4|~4.0", - "symfony/event-dispatcher": "~2.8|~3.0|~4.0", + "symfony/event-dispatcher": "~3.4|~4.0", "symfony/lock": "~3.4|~4.0", - "symfony/process": "~3.3|~4.0" + "symfony/process": "~3.4|~4.0" }, "suggest": { "psr/log-implementation": "For using the console logger", @@ -3455,7 +3477,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.4-dev" + "dev-master": "4.1-dev" } }, "autoload": { @@ -3482,7 +3504,7 @@ ], "description": "Symfony Console Component", "homepage": "https://symfony.com", - "time": "2018-07-26T11:19:56+00:00" + "time": "2018-07-26T11:24:31+00:00" }, { "name": "symfony/css-selector", @@ -3539,32 +3561,32 @@ }, { "name": "symfony/debug", - "version": "v3.4.14", + "version": "v4.1.3", "source": { "type": "git", "url": "https://github.com/symfony/debug.git", - "reference": "d5a058ff6ecad26b30c1ba452241306ea34c65cc" + "reference": "9316545571f079c4dd183e674721d9dc783ce196" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/debug/zipball/d5a058ff6ecad26b30c1ba452241306ea34c65cc", - "reference": "d5a058ff6ecad26b30c1ba452241306ea34c65cc", + "url": "https://api.github.com/repos/symfony/debug/zipball/9316545571f079c4dd183e674721d9dc783ce196", + "reference": "9316545571f079c4dd183e674721d9dc783ce196", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8", + "php": "^7.1.3", "psr/log": "~1.0" }, "conflict": { - "symfony/http-kernel": ">=2.3,<2.3.24|~2.4.0|>=2.5,<2.5.9|>=2.6,<2.6.2" + "symfony/http-kernel": "<3.4" }, "require-dev": { - "symfony/http-kernel": "~2.8|~3.0|~4.0" + "symfony/http-kernel": "~3.4|~4.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.4-dev" + "dev-master": "4.1-dev" } }, "autoload": { @@ -3591,34 +3613,34 @@ ], "description": "Symfony Debug Component", "homepage": "https://symfony.com", - "time": "2018-07-26T11:19:56+00:00" + "time": "2018-07-26T11:24:31+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v3.4.14", + "version": "v4.1.3", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "b2e1f19280c09a42dc64c0b72b80fe44dd6e88fb" + "reference": "bfb30c2ad377615a463ebbc875eba64a99f6aa3e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/b2e1f19280c09a42dc64c0b72b80fe44dd6e88fb", - "reference": "b2e1f19280c09a42dc64c0b72b80fe44dd6e88fb", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/bfb30c2ad377615a463ebbc875eba64a99f6aa3e", + "reference": "bfb30c2ad377615a463ebbc875eba64a99f6aa3e", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8" + "php": "^7.1.3" }, "conflict": { - "symfony/dependency-injection": "<3.3" + "symfony/dependency-injection": "<3.4" }, "require-dev": { "psr/log": "~1.0", - "symfony/config": "~2.8|~3.0|~4.0", - "symfony/dependency-injection": "~3.3|~4.0", - "symfony/expression-language": "~2.8|~3.0|~4.0", - "symfony/stopwatch": "~2.8|~3.0|~4.0" + "symfony/config": "~3.4|~4.0", + "symfony/dependency-injection": "~3.4|~4.0", + "symfony/expression-language": "~3.4|~4.0", + "symfony/stopwatch": "~3.4|~4.0" }, "suggest": { "symfony/dependency-injection": "", @@ -3627,7 +3649,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.4-dev" + "dev-master": "4.1-dev" } }, "autoload": { @@ -3654,7 +3676,7 @@ ], "description": "Symfony EventDispatcher Component", "homepage": "https://symfony.com", - "time": "2018-07-26T09:06:28+00:00" + "time": "2018-07-26T09:10:45+00:00" }, { "name": "symfony/filesystem", @@ -3708,25 +3730,25 @@ }, { "name": "symfony/finder", - "version": "v3.4.14", + "version": "v4.1.3", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "8a84fcb207451df0013b2c74cbbf1b62d47b999a" + "reference": "e162f1df3102d0b7472805a5a9d5db9fcf0a8068" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/8a84fcb207451df0013b2c74cbbf1b62d47b999a", - "reference": "8a84fcb207451df0013b2c74cbbf1b62d47b999a", + "url": "https://api.github.com/repos/symfony/finder/zipball/e162f1df3102d0b7472805a5a9d5db9fcf0a8068", + "reference": "e162f1df3102d0b7472805a5a9d5db9fcf0a8068", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8" + "php": "^7.1.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.4-dev" + "dev-master": "4.1-dev" } }, "autoload": { @@ -3753,34 +3775,34 @@ ], "description": "Symfony Finder Component", "homepage": "https://symfony.com", - "time": "2018-07-26T11:19:56+00:00" + "time": "2018-07-26T11:24:31+00:00" }, { "name": "symfony/http-foundation", - "version": "v3.4.14", + "version": "v4.1.3", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "19a3267828046a2a4a05e3dc2954bbd2e0ad9fa6" + "reference": "7d93e3547660ec7ee3dad1428ba42e8076a0e5f1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/19a3267828046a2a4a05e3dc2954bbd2e0ad9fa6", - "reference": "19a3267828046a2a4a05e3dc2954bbd2e0ad9fa6", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/7d93e3547660ec7ee3dad1428ba42e8076a0e5f1", + "reference": "7d93e3547660ec7ee3dad1428ba42e8076a0e5f1", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8", - "symfony/polyfill-mbstring": "~1.1", - "symfony/polyfill-php70": "~1.6" + "php": "^7.1.3", + "symfony/polyfill-mbstring": "~1.1" }, "require-dev": { - "symfony/expression-language": "~2.8|~3.0|~4.0" + "predis/predis": "~1.0", + "symfony/expression-language": "~3.4|~4.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.4-dev" + "dev-master": "4.1-dev" } }, "autoload": { @@ -3807,34 +3829,34 @@ ], "description": "Symfony HttpFoundation Component", "homepage": "https://symfony.com", - "time": "2018-08-01T14:04:26+00:00" + "time": "2018-08-01T14:07:44+00:00" }, { "name": "symfony/http-kernel", - "version": "v3.4.14", + "version": "v4.1.3", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "8e84cc498f0ffecfbabdea78b87828fd66189544" + "reference": "6347be5110efb27fe45ea04bf213078b67a05036" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/8e84cc498f0ffecfbabdea78b87828fd66189544", - "reference": "8e84cc498f0ffecfbabdea78b87828fd66189544", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/6347be5110efb27fe45ea04bf213078b67a05036", + "reference": "6347be5110efb27fe45ea04bf213078b67a05036", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8", + "php": "^7.1.3", "psr/log": "~1.0", - "symfony/debug": "~2.8|~3.0|~4.0", - "symfony/event-dispatcher": "~2.8|~3.0|~4.0", - "symfony/http-foundation": "~3.4.12|~4.0.12|^4.1.1", + "symfony/debug": "~3.4|~4.0", + "symfony/event-dispatcher": "~4.1", + "symfony/http-foundation": "^4.1.1", "symfony/polyfill-ctype": "~1.8" }, "conflict": { - "symfony/config": "<2.8", - "symfony/dependency-injection": "<3.4.10|<4.0.10,>=4", - "symfony/var-dumper": "<3.3", + "symfony/config": "<3.4", + "symfony/dependency-injection": "<4.1", + "symfony/var-dumper": "<4.1.1", "twig/twig": "<1.34|<2.4,>=2" }, "provide": { @@ -3842,34 +3864,32 @@ }, "require-dev": { "psr/cache": "~1.0", - "symfony/browser-kit": "~2.8|~3.0|~4.0", - "symfony/class-loader": "~2.8|~3.0", - "symfony/config": "~2.8|~3.0|~4.0", - "symfony/console": "~2.8|~3.0|~4.0", - "symfony/css-selector": "~2.8|~3.0|~4.0", - "symfony/dependency-injection": "^3.4.10|^4.0.10", - "symfony/dom-crawler": "~2.8|~3.0|~4.0", - "symfony/expression-language": "~2.8|~3.0|~4.0", - "symfony/finder": "~2.8|~3.0|~4.0", - "symfony/process": "~2.8|~3.0|~4.0", + "symfony/browser-kit": "~3.4|~4.0", + "symfony/config": "~3.4|~4.0", + "symfony/console": "~3.4|~4.0", + "symfony/css-selector": "~3.4|~4.0", + "symfony/dependency-injection": "^4.1", + "symfony/dom-crawler": "~3.4|~4.0", + "symfony/expression-language": "~3.4|~4.0", + "symfony/finder": "~3.4|~4.0", + "symfony/process": "~3.4|~4.0", "symfony/routing": "~3.4|~4.0", - "symfony/stopwatch": "~2.8|~3.0|~4.0", - "symfony/templating": "~2.8|~3.0|~4.0", - "symfony/translation": "~2.8|~3.0|~4.0", - "symfony/var-dumper": "~3.3|~4.0" + "symfony/stopwatch": "~3.4|~4.0", + "symfony/templating": "~3.4|~4.0", + "symfony/translation": "~3.4|~4.0", + "symfony/var-dumper": "^4.1.1" }, "suggest": { "symfony/browser-kit": "", "symfony/config": "", "symfony/console": "", "symfony/dependency-injection": "", - "symfony/finder": "", "symfony/var-dumper": "" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.4-dev" + "dev-master": "4.1-dev" } }, "autoload": { @@ -3896,7 +3916,7 @@ ], "description": "Symfony HttpKernel Component", "homepage": "https://symfony.com", - "time": "2018-08-01T14:47:47+00:00" + "time": "2018-08-01T15:30:34+00:00" }, { "name": "symfony/options-resolver", @@ -4123,21 +4143,20 @@ "time": "2018-04-26T10:06:28+00:00" }, { - "name": "symfony/polyfill-php70", + "name": "symfony/polyfill-php72", "version": "v1.8.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-php70.git", - "reference": "77454693d8f10dd23bb24955cffd2d82db1007a6" + "url": "https://github.com/symfony/polyfill-php72.git", + "reference": "a4576e282d782ad82397f3e4ec1df8e0f0cafb46" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php70/zipball/77454693d8f10dd23bb24955cffd2d82db1007a6", - "reference": "77454693d8f10dd23bb24955cffd2d82db1007a6", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/a4576e282d782ad82397f3e4ec1df8e0f0cafb46", + "reference": "a4576e282d782ad82397f3e4ec1df8e0f0cafb46", "shasum": "" }, "require": { - "paragonie/random_compat": "~1.0|~2.0", "php": ">=5.3.3" }, "type": "library", @@ -4148,13 +4167,10 @@ }, "autoload": { "psr-4": { - "Symfony\\Polyfill\\Php70\\": "" + "Symfony\\Polyfill\\Php72\\": "" }, "files": [ "bootstrap.php" - ], - "classmap": [ - "Resources/stubs" ] }, "notification-url": "https://packagist.org/downloads/", @@ -4171,7 +4187,7 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill backporting some PHP 7.0+ features to lower PHP versions", + "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", "homepage": "https://symfony.com", "keywords": [ "compatibility", @@ -4235,25 +4251,25 @@ }, { "name": "symfony/process", - "version": "v3.4.14", + "version": "v4.1.3", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "0414db29bd770ec5a4152683e655f55efd4fa60f" + "reference": "f01fc7a4493572f7f506c49dcb50ad01fb3a2f56" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/0414db29bd770ec5a4152683e655f55efd4fa60f", - "reference": "0414db29bd770ec5a4152683e655f55efd4fa60f", + "url": "https://api.github.com/repos/symfony/process/zipball/f01fc7a4493572f7f506c49dcb50ad01fb3a2f56", + "reference": "f01fc7a4493572f7f506c49dcb50ad01fb3a2f56", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8" + "php": "^7.1.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.4-dev" + "dev-master": "4.1-dev" } }, "autoload": { @@ -4280,37 +4296,37 @@ ], "description": "Symfony Process Component", "homepage": "https://symfony.com", - "time": "2018-07-26T11:19:56+00:00" + "time": "2018-07-26T11:24:31+00:00" }, { "name": "symfony/routing", - "version": "v3.4.14", + "version": "v4.1.3", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "e20f4bb79502c3c0db86d572f7683a30d4143911" + "reference": "6912cfebc0ea4e7a46fdd15c9bd1f427dd39ff1b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/e20f4bb79502c3c0db86d572f7683a30d4143911", - "reference": "e20f4bb79502c3c0db86d572f7683a30d4143911", + "url": "https://api.github.com/repos/symfony/routing/zipball/6912cfebc0ea4e7a46fdd15c9bd1f427dd39ff1b", + "reference": "6912cfebc0ea4e7a46fdd15c9bd1f427dd39ff1b", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8" + "php": "^7.1.3" }, "conflict": { - "symfony/config": "<3.3.1", - "symfony/dependency-injection": "<3.3", + "symfony/config": "<3.4", + "symfony/dependency-injection": "<3.4", "symfony/yaml": "<3.4" }, "require-dev": { "doctrine/annotations": "~1.0", "psr/log": "~1.0", - "symfony/config": "^3.3.1|~4.0", - "symfony/dependency-injection": "~3.3|~4.0", - "symfony/expression-language": "~2.8|~3.0|~4.0", - "symfony/http-foundation": "~2.8|~3.0|~4.0", + "symfony/config": "~3.4|~4.0", + "symfony/dependency-injection": "~3.4|~4.0", + "symfony/expression-language": "~3.4|~4.0", + "symfony/http-foundation": "~3.4|~4.0", "symfony/yaml": "~3.4|~4.0" }, "suggest": { @@ -4324,7 +4340,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.4-dev" + "dev-master": "4.1-dev" } }, "autoload": { @@ -4357,7 +4373,7 @@ "uri", "url" ], - "time": "2018-07-26T11:19:56+00:00" + "time": "2018-07-26T11:24:31+00:00" }, { "name": "symfony/translation", @@ -4430,38 +4446,44 @@ }, { "name": "symfony/var-dumper", - "version": "v3.4.14", + "version": "v4.1.3", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "f62a394bd3de96f2f5e8f4c7d685035897fb3cb3" + "reference": "69e174f4c02ec43919380171c6f7550753299316" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/f62a394bd3de96f2f5e8f4c7d685035897fb3cb3", - "reference": "f62a394bd3de96f2f5e8f4c7d685035897fb3cb3", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/69e174f4c02ec43919380171c6f7550753299316", + "reference": "69e174f4c02ec43919380171c6f7550753299316", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8", - "symfony/polyfill-mbstring": "~1.0" + "php": "^7.1.3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php72": "~1.5" }, "conflict": { - "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0" + "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0", + "symfony/console": "<3.4" }, "require-dev": { "ext-iconv": "*", + "symfony/process": "~3.4|~4.0", "twig/twig": "~1.34|~2.4" }, "suggest": { "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).", "ext-intl": "To show region name in time zone dump", - "ext-symfony_debug": "" + "symfony/console": "To use the ServerDumpCommand and/or the bin/var-dump-server script" }, + "bin": [ + "Resources/bin/var-dump-server" + ], "type": "library", "extra": { "branch-alias": { - "dev-master": "3.4-dev" + "dev-master": "4.1-dev" } }, "autoload": { @@ -4495,7 +4517,7 @@ "debug", "dump" ], - "time": "2018-07-26T11:19:56+00:00" + "time": "2018-07-26T11:24:31+00:00" }, { "name": "tedivm/fetch", @@ -5836,35 +5858,35 @@ }, { "name": "laravel/dusk", - "version": "v2.0.0", + "version": "v3.0.9", "source": { "type": "git", "url": "https://github.com/laravel/dusk.git", - "reference": "7f75d602dd6d59311ff46777eff44fa14d39e5af" + "reference": "48215ab0028d759e5fd7cc8989f4b6c58050841d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/dusk/zipball/7f75d602dd6d59311ff46777eff44fa14d39e5af", - "reference": "7f75d602dd6d59311ff46777eff44fa14d39e5af", + "url": "https://api.github.com/repos/laravel/dusk/zipball/48215ab0028d759e5fd7cc8989f4b6c58050841d", + "reference": "48215ab0028d759e5fd7cc8989f4b6c58050841d", "shasum": "" }, "require": { - "facebook/webdriver": "~1.0", - "illuminate/console": "~5.5", - "illuminate/support": "~5.5", + "facebook/webdriver": "~1.3", + "illuminate/console": "~5.6", + "illuminate/support": "~5.6", "nesbot/carbon": "~1.20", - "php": ">=5.6.4", - "symfony/console": "~3.2", - "symfony/process": "~3.2" + "php": ">=7.1.0", + "symfony/console": "~4.0", + "symfony/process": "~4.0" }, "require-dev": { - "mockery/mockery": "^0.9.6", - "phpunit/phpunit": "^5.7" + "mockery/mockery": "~1.0", + "phpunit/phpunit": "~7.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0-dev" + "dev-master": "4.0-dev" }, "laravel": { "providers": [ @@ -5893,7 +5915,7 @@ "testing", "webdriver" ], - "time": "2017-08-28T10:03:58+00:00" + "time": "2018-06-20T13:47:27+00:00" }, { "name": "myclabs/deep-copy", @@ -5945,22 +5967,22 @@ }, { "name": "phar-io/manifest", - "version": "1.0.1", + "version": "1.0.3", "source": { "type": "git", "url": "https://github.com/phar-io/manifest.git", - "reference": "2df402786ab5368a0169091f61a7c1e0eb6852d0" + "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phar-io/manifest/zipball/2df402786ab5368a0169091f61a7c1e0eb6852d0", - "reference": "2df402786ab5368a0169091f61a7c1e0eb6852d0", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/7761fcacf03b4d4f16e7ccb606d4879ca431fcf4", + "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4", "shasum": "" }, "require": { "ext-dom": "*", "ext-phar": "*", - "phar-io/version": "^1.0.1", + "phar-io/version": "^2.0", "php": "^5.6 || ^7.0" }, "type": "library", @@ -5996,20 +6018,20 @@ } ], "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", - "time": "2017-03-05T18:14:27+00:00" + "time": "2018-07-08T19:23:20+00:00" }, { "name": "phar-io/version", - "version": "1.0.1", + "version": "2.0.1", "source": { "type": "git", "url": "https://github.com/phar-io/version.git", - "reference": "a70c0ced4be299a63d32fa96d9281d03e94041df" + "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phar-io/version/zipball/a70c0ced4be299a63d32fa96d9281d03e94041df", - "reference": "a70c0ced4be299a63d32fa96d9281d03e94041df", + "url": "https://api.github.com/repos/phar-io/version/zipball/45a2ec53a73c70ce41d55cedef9063630abaf1b6", + "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6", "shasum": "" }, "require": { @@ -6043,7 +6065,7 @@ } ], "description": "Library for handling version information and constraints", - "time": "2017-03-05T17:38:23+00:00" + "time": "2018-07-08T19:19:57+00:00" }, { "name": "phpdocumentor/reflection-common", @@ -6199,19 +6221,24 @@ }, { "name": "phpspec/php-diff", - "version": "v1.0.2", + "version": "v1.1.0", "source": { "type": "git", "url": "https://github.com/phpspec/php-diff.git", - "reference": "30e103d19519fe678ae64a60d77884ef3d71b28a" + "reference": "0464787bfa7cd13576c5a1e318709768798bec6a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpspec/php-diff/zipball/30e103d19519fe678ae64a60d77884ef3d71b28a", - "reference": "30e103d19519fe678ae64a60d77884ef3d71b28a", + "url": "https://api.github.com/repos/phpspec/php-diff/zipball/0464787bfa7cd13576c5a1e318709768798bec6a", + "reference": "0464787bfa7cd13576c5a1e318709768798bec6a", "shasum": "" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, "autoload": { "psr-0": { "Diff": "lib/" @@ -6228,43 +6255,42 @@ } ], "description": "A comprehensive library for generating differences between two hashable objects (strings or arrays).", - "time": "2013-11-01T13:02:21+00:00" + "time": "2016-04-07T12:29:16+00:00" }, { "name": "phpspec/phpspec", - "version": "2.5.8", + "version": "4.3.1", "source": { "type": "git", "url": "https://github.com/phpspec/phpspec.git", - "reference": "d8a153dcb52f929b448c0bf2cc19c7388951adb1" + "reference": "4474f1cb4cf9873996fc07fac6533ab9298eb6fd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpspec/phpspec/zipball/d8a153dcb52f929b448c0bf2cc19c7388951adb1", - "reference": "d8a153dcb52f929b448c0bf2cc19c7388951adb1", + "url": "https://api.github.com/repos/phpspec/phpspec/zipball/4474f1cb4cf9873996fc07fac6533ab9298eb6fd", + "reference": "4474f1cb4cf9873996fc07fac6533ab9298eb6fd", "shasum": "" }, "require": { - "doctrine/instantiator": "^1.0.1", + "doctrine/instantiator": "^1.0.5", "ext-tokenizer": "*", - "php": ">=5.3.3", - "phpspec/php-diff": "~1.0.0", - "phpspec/prophecy": "~1.4", - "sebastian/exporter": "~1.0|~2.0|^3.0", - "symfony/console": "~2.3|~3.0,!=3.2.8", - "symfony/event-dispatcher": "~2.1|~3.0", - "symfony/finder": "~2.1|~3.0", - "symfony/process": "^2.6|~3.0", - "symfony/yaml": "~2.1|~3.0" + "php": "^7.0,<7.3", + "phpspec/php-diff": "^1.0.0", + "phpspec/prophecy": "^1.5", + "sebastian/exporter": "^1.0 || ^2.0 || ^3.0", + "symfony/console": "^3.2 || ^4.0", + "symfony/event-dispatcher": "^3.2 || ^4.0", + "symfony/finder": "^3.2 || ^4.0", + "symfony/process": "^3.2 || ^4.0", + "symfony/yaml": "^3.2 || ^4.0" }, "require-dev": { - "behat/behat": "^3.0.11,!=3.3.1", - "ciaranmcnulty/versionbasedtestskipper": "^0.2.1", - "phpunit/phpunit": "~4.4", - "symfony/filesystem": "~2.1|~3.0" + "behat/behat": "^3.3", + "phpunit/phpunit": "^5.7|^6.0", + "symfony/filesystem": "^3.2 || ^4.0" }, "suggest": { - "phpspec/nyan-formatters": "~1.0 – Adds Nyan formatters" + "phpspec/nyan-formatters": "Adds Nyan formatters" }, "bin": [ "bin/phpspec" @@ -6272,7 +6298,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.5.x-dev" + "dev-master": "4.3.x-dev" } }, "autoload": { @@ -6293,9 +6319,13 @@ { "name": "Marcello Duarte", "homepage": "http://marcelloduarte.net/" + }, + { + "name": "Ciaran McNulty", + "homepage": "https://ciaranmcnulty.com/" } ], - "description": "Specification-oriented BDD framework for PHP 5.3+", + "description": "Specification-oriented BDD framework for PHP 5.6+", "homepage": "http://phpspec.net/", "keywords": [ "BDD", @@ -6306,7 +6336,7 @@ "testing", "tests" ], - "time": "2017-07-29T17:19:38+00:00" + "time": "2018-07-02T17:43:33+00:00" }, { "name": "phpspec/prophecy", @@ -6373,40 +6403,40 @@ }, { "name": "phpunit/php-code-coverage", - "version": "5.3.2", + "version": "6.0.7", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "c89677919c5dd6d3b3852f230a663118762218ac" + "reference": "865662550c384bc1db7e51d29aeda1c2c161d69a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/c89677919c5dd6d3b3852f230a663118762218ac", - "reference": "c89677919c5dd6d3b3852f230a663118762218ac", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/865662550c384bc1db7e51d29aeda1c2c161d69a", + "reference": "865662550c384bc1db7e51d29aeda1c2c161d69a", "shasum": "" }, "require": { "ext-dom": "*", "ext-xmlwriter": "*", - "php": "^7.0", - "phpunit/php-file-iterator": "^1.4.2", + "php": "^7.1", + "phpunit/php-file-iterator": "^2.0", "phpunit/php-text-template": "^1.2.1", - "phpunit/php-token-stream": "^2.0.1", + "phpunit/php-token-stream": "^3.0", "sebastian/code-unit-reverse-lookup": "^1.0.1", - "sebastian/environment": "^3.0", + "sebastian/environment": "^3.1", "sebastian/version": "^2.0.1", "theseer/tokenizer": "^1.1" }, "require-dev": { - "phpunit/phpunit": "^6.0" + "phpunit/phpunit": "^7.0" }, "suggest": { - "ext-xdebug": "^2.5.5" + "ext-xdebug": "^2.6.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "5.3.x-dev" + "dev-master": "6.0-dev" } }, "autoload": { @@ -6432,29 +6462,29 @@ "testing", "xunit" ], - "time": "2018-04-06T15:36:58+00:00" + "time": "2018-06-01T07:51:50+00:00" }, { "name": "phpunit/php-file-iterator", - "version": "1.4.5", + "version": "2.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "730b01bc3e867237eaac355e06a36b85dd93a8b4" + "reference": "cecbc684605bb0cc288828eb5d65d93d5c676d3c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/730b01bc3e867237eaac355e06a36b85dd93a8b4", - "reference": "730b01bc3e867237eaac355e06a36b85dd93a8b4", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/cecbc684605bb0cc288828eb5d65d93d5c676d3c", + "reference": "cecbc684605bb0cc288828eb5d65d93d5c676d3c", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": "^7.1" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.4.x-dev" + "dev-master": "2.0.x-dev" } }, "autoload": { @@ -6469,7 +6499,7 @@ "authors": [ { "name": "Sebastian Bergmann", - "email": "sb@sebastian-bergmann.de", + "email": "sebastian@phpunit.de", "role": "lead" } ], @@ -6479,7 +6509,7 @@ "filesystem", "iterator" ], - "time": "2017-11-27T13:52:08+00:00" + "time": "2018-06-11T11:44:00+00:00" }, { "name": "phpunit/php-text-template", @@ -6524,28 +6554,28 @@ }, { "name": "phpunit/php-timer", - "version": "1.0.9", + "version": "2.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f" + "reference": "8b8454ea6958c3dee38453d3bd571e023108c91f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3dcf38ca72b158baf0bc245e9184d3fdffa9c46f", - "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/8b8454ea6958c3dee38453d3bd571e023108c91f", + "reference": "8b8454ea6958c3dee38453d3bd571e023108c91f", "shasum": "" }, "require": { - "php": "^5.3.3 || ^7.0" + "php": "^7.1" }, "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" + "phpunit/phpunit": "^7.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0-dev" + "dev-master": "2.0-dev" } }, "autoload": { @@ -6560,7 +6590,7 @@ "authors": [ { "name": "Sebastian Bergmann", - "email": "sb@sebastian-bergmann.de", + "email": "sebastian@phpunit.de", "role": "lead" } ], @@ -6569,33 +6599,33 @@ "keywords": [ "timer" ], - "time": "2017-02-26T11:10:40+00:00" + "time": "2018-02-01T13:07:23+00:00" }, { "name": "phpunit/php-token-stream", - "version": "2.0.2", + "version": "3.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-token-stream.git", - "reference": "791198a2c6254db10131eecfe8c06670700904db" + "reference": "21ad88bbba7c3d93530d93994e0a33cd45f02ace" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/791198a2c6254db10131eecfe8c06670700904db", - "reference": "791198a2c6254db10131eecfe8c06670700904db", + "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/21ad88bbba7c3d93530d93994e0a33cd45f02ace", + "reference": "21ad88bbba7c3d93530d93994e0a33cd45f02ace", "shasum": "" }, "require": { "ext-tokenizer": "*", - "php": "^7.0" + "php": "^7.1" }, "require-dev": { - "phpunit/phpunit": "^6.2.4" + "phpunit/phpunit": "^7.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0-dev" + "dev-master": "3.0-dev" } }, "autoload": { @@ -6618,40 +6648,40 @@ "keywords": [ "tokenizer" ], - "time": "2017-11-27T05:48:46+00:00" + "time": "2018-02-01T13:16:43+00:00" }, { "name": "phpunit/phpunit", - "version": "6.5.10", + "version": "7.3.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "5744955af9c0a2de74a5eb5287c50bf025100d39" + "reference": "0b6b29faf95c03fd7867e866438b78d5692b6f03" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/5744955af9c0a2de74a5eb5287c50bf025100d39", - "reference": "5744955af9c0a2de74a5eb5287c50bf025100d39", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/0b6b29faf95c03fd7867e866438b78d5692b6f03", + "reference": "0b6b29faf95c03fd7867e866438b78d5692b6f03", "shasum": "" }, "require": { + "doctrine/instantiator": "^1.1", "ext-dom": "*", "ext-json": "*", "ext-libxml": "*", "ext-mbstring": "*", "ext-xml": "*", - "myclabs/deep-copy": "^1.6.1", - "phar-io/manifest": "^1.0.1", - "phar-io/version": "^1.0", - "php": "^7.0", + "myclabs/deep-copy": "^1.7", + "phar-io/manifest": "^1.0.2", + "phar-io/version": "^2.0", + "php": "^7.1", "phpspec/prophecy": "^1.7", - "phpunit/php-code-coverage": "^5.3", - "phpunit/php-file-iterator": "^1.4.3", + "phpunit/php-code-coverage": "^6.0.7", + "phpunit/php-file-iterator": "^2.0.1", "phpunit/php-text-template": "^1.2.1", - "phpunit/php-timer": "^1.0.9", - "phpunit/phpunit-mock-objects": "^5.0.8", - "sebastian/comparator": "^2.1", - "sebastian/diff": "^2.0", + "phpunit/php-timer": "^2.0", + "sebastian/comparator": "^3.0", + "sebastian/diff": "^3.0", "sebastian/environment": "^3.1", "sebastian/exporter": "^3.1", "sebastian/global-state": "^2.0", @@ -6660,15 +6690,15 @@ "sebastian/version": "^2.0.1" }, "conflict": { - "phpdocumentor/reflection-docblock": "3.0.2", - "phpunit/dbunit": "<3.0" + "phpunit/phpunit-mock-objects": "*" }, "require-dev": { "ext-pdo": "*" }, "suggest": { + "ext-soap": "*", "ext-xdebug": "*", - "phpunit/php-invoker": "^1.1" + "phpunit/php-invoker": "^2.0" }, "bin": [ "phpunit" @@ -6676,7 +6706,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "6.5.x-dev" + "dev-master": "7.3-dev" } }, "autoload": { @@ -6702,66 +6732,7 @@ "testing", "xunit" ], - "time": "2018-08-03T05:27:14+00:00" - }, - { - "name": "phpunit/phpunit-mock-objects", - "version": "5.0.8", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git", - "reference": "6f9a3c8bf34188a2b53ce2ae7a126089c53e0a9f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/6f9a3c8bf34188a2b53ce2ae7a126089c53e0a9f", - "reference": "6f9a3c8bf34188a2b53ce2ae7a126089c53e0a9f", - "shasum": "" - }, - "require": { - "doctrine/instantiator": "^1.0.5", - "php": "^7.0", - "phpunit/php-text-template": "^1.2.1", - "sebastian/exporter": "^3.1" - }, - "conflict": { - "phpunit/phpunit": "<6.0" - }, - "require-dev": { - "phpunit/phpunit": "^6.5" - }, - "suggest": { - "ext-soap": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Mock Object library for PHPUnit", - "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/", - "keywords": [ - "mock", - "xunit" - ], - "time": "2018-07-13T03:27:23+00:00" + "time": "2018-08-03T06:02:45+00:00" }, { "name": "sebastian/code-unit-reverse-lookup", @@ -6810,30 +6781,30 @@ }, { "name": "sebastian/comparator", - "version": "2.1.3", + "version": "3.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "34369daee48eafb2651bea869b4b15d75ccc35f9" + "reference": "5de4fc177adf9bce8df98d8d141a7559d7ccf6da" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/34369daee48eafb2651bea869b4b15d75ccc35f9", - "reference": "34369daee48eafb2651bea869b4b15d75ccc35f9", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/5de4fc177adf9bce8df98d8d141a7559d7ccf6da", + "reference": "5de4fc177adf9bce8df98d8d141a7559d7ccf6da", "shasum": "" }, "require": { - "php": "^7.0", - "sebastian/diff": "^2.0 || ^3.0", + "php": "^7.1", + "sebastian/diff": "^3.0", "sebastian/exporter": "^3.1" }, "require-dev": { - "phpunit/phpunit": "^6.4" + "phpunit/phpunit": "^7.1" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.1.x-dev" + "dev-master": "3.0-dev" } }, "autoload": { @@ -6870,32 +6841,33 @@ "compare", "equality" ], - "time": "2018-02-01T13:46:46+00:00" + "time": "2018-07-12T15:12:46+00:00" }, { "name": "sebastian/diff", - "version": "2.0.1", + "version": "3.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "347c1d8b49c5c3ee30c7040ea6fc446790e6bddd" + "reference": "366541b989927187c4ca70490a35615d3fef2dce" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/347c1d8b49c5c3ee30c7040ea6fc446790e6bddd", - "reference": "347c1d8b49c5c3ee30c7040ea6fc446790e6bddd", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/366541b989927187c4ca70490a35615d3fef2dce", + "reference": "366541b989927187c4ca70490a35615d3fef2dce", "shasum": "" }, "require": { - "php": "^7.0" + "php": "^7.1" }, "require-dev": { - "phpunit/phpunit": "^6.2" + "phpunit/phpunit": "^7.0", + "symfony/process": "^2 || ^3.3 || ^4" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0-dev" + "dev-master": "3.0-dev" } }, "autoload": { @@ -6920,9 +6892,12 @@ "description": "Diff implementation", "homepage": "https://github.com/sebastianbergmann/diff", "keywords": [ - "diff" + "diff", + "udiff", + "unidiff", + "unified diff" ], - "time": "2017-08-03T08:09:46+00:00" + "time": "2018-06-10T07:54:39+00:00" }, { "name": "sebastian/environment", @@ -7380,20 +7355,20 @@ }, { "name": "symfony/yaml", - "version": "v3.4.14", + "version": "v4.1.3", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "810af2d35fc72b6cf5c01116806d2b65ccaaf2e2" + "reference": "46bc69aa91fc4ab78a96ce67873a6b0c148fd48c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/810af2d35fc72b6cf5c01116806d2b65ccaaf2e2", - "reference": "810af2d35fc72b6cf5c01116806d2b65ccaaf2e2", + "url": "https://api.github.com/repos/symfony/yaml/zipball/46bc69aa91fc4ab78a96ce67873a6b0c148fd48c", + "reference": "46bc69aa91fc4ab78a96ce67873a6b0c148fd48c", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8", + "php": "^7.1.3", "symfony/polyfill-ctype": "~1.8" }, "conflict": { @@ -7408,7 +7383,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.4-dev" + "dev-master": "4.1-dev" } }, "autoload": { @@ -7435,7 +7410,7 @@ ], "description": "Symfony Yaml Component", "homepage": "https://symfony.com", - "time": "2018-07-26T11:19:56+00:00" + "time": "2018-07-26T11:24:31+00:00" }, { "name": "theseer/tokenizer", @@ -7539,7 +7514,7 @@ "prefer-stable": false, "prefer-lowest": false, "platform": { - "php": ">=5.5.9" + "php": ">=7.1.3" }, "platform-dev": [] } diff --git a/vendor/barryvdh/laravel-debugbar/LICENSE b/vendor/barryvdh/laravel-debugbar/LICENSE index 1b751326e..f724f7c29 100644 --- a/vendor/barryvdh/laravel-debugbar/LICENSE +++ b/vendor/barryvdh/laravel-debugbar/LICENSE @@ -1,4 +1,4 @@ -Copyright (C) 2013-2014 Barry vd. Heuvel +Copyright (C) 2013-present Barry vd. Heuvel Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in @@ -16,4 +16,4 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. \ No newline at end of file +SOFTWARE. diff --git a/vendor/barryvdh/laravel-debugbar/composer.json b/vendor/barryvdh/laravel-debugbar/composer.json index 33cd81050..c96ac7dff 100644 --- a/vendor/barryvdh/laravel-debugbar/composer.json +++ b/vendor/barryvdh/laravel-debugbar/composer.json @@ -10,10 +10,13 @@ } ], "require": { - "php": ">=5.5.9", - "illuminate/support": "5.1.*|5.2.*|5.3.*|5.4.*|5.5.*", - "symfony/finder": "~2.7|~3.0", - "maximebf/debugbar": "~1.13.0" + "php": ">=7.0", + "maximebf/debugbar": "~1.15.0", + "illuminate/routing": "5.5.x|5.6.x", + "illuminate/session": "5.5.x|5.6.x", + "illuminate/support": "5.5.x|5.6.x", + "symfony/debug": "^3|^4", + "symfony/finder": "^3|^4" }, "autoload": { "psr-4": { @@ -22,5 +25,23 @@ "files": [ "src/helpers.php" ] + }, + "minimum-stability": "dev", + "prefer-stable": true, + "extra": { + "branch-alias": { + "dev-master": "3.2-dev" + }, + "laravel": { + "providers": [ + "Barryvdh\\Debugbar\\ServiceProvider" + ], + "aliases": { + "Debugbar": "Barryvdh\\Debugbar\\Facade" + } + } + }, + "require-dev": { + "illuminate/framework": "5.5.x" } } diff --git a/vendor/barryvdh/laravel-debugbar/config/debugbar.php b/vendor/barryvdh/laravel-debugbar/config/debugbar.php index 0fb450fd8..8350e1c8d 100644 --- a/vendor/barryvdh/laravel-debugbar/config/debugbar.php +++ b/vendor/barryvdh/laravel-debugbar/config/debugbar.php @@ -9,10 +9,15 @@ return [ | | Debugbar is enabled by default, when debug is set to true in app.php. | You can override the value by setting enable to true or false instead of null. + | + | You can provide an array of URI's that must be ignored (eg. 'api/*') | */ 'enabled' => env('DEBUGBAR_ENABLED', null), + 'except' => [ + // + ], /* |-------------------------------------------------------------------------- @@ -116,6 +121,7 @@ return [ 'logs' => false, // Add the latest log messages 'files' => false, // Show the included files 'config' => false, // Display config settings + 'cache' => false, // Display cache events ], /* @@ -153,6 +159,9 @@ return [ 'logs' => [ 'file' => null ], + 'cache' => [ + 'values' => true // collect cache values + ], ], /* diff --git a/vendor/barryvdh/laravel-debugbar/readme.md b/vendor/barryvdh/laravel-debugbar/readme.md index 7f593124c..e3c3d813f 100644 --- a/vendor/barryvdh/laravel-debugbar/readme.md +++ b/vendor/barryvdh/laravel-debugbar/readme.md @@ -3,7 +3,9 @@ [![Latest Stable Version](https://poser.pugx.org/barryvdh/laravel-debugbar/version.png)](https://packagist.org/packages/barryvdh/laravel-debugbar) [![Total Downloads](https://poser.pugx.org/barryvdh/laravel-debugbar/d/total.png)](https://packagist.org/packages/barryvdh/laravel-debugbar) -### For Laravel 4, please use the [1.8 branch](https://github.com/barryvdh/laravel-debugbar/tree/1.8)! +### Note for v3: Debugbar is now enabled by requiring the package, but still needs APP_DEBUG=true by default! + +### For Laravel < 5.5, please use the [2.4 branch](https://github.com/barryvdh/laravel-debugbar/tree/2.4)! This is a package to integrate [PHP Debug Bar](http://phpdebugbar.com/) with Laravel 5. It includes a ServiceProvider to register the debugbar and attach it to the output. You can publish assets and configure it through Laravel. @@ -25,6 +27,7 @@ This package includes some custom collectors: - LogsCollector: Show the latest log entries from the storage logs. (disabled by default) - FilesCollector: Show the files that are included/required by PHP. (disabled by default) - ConfigCollector: Display the values from the config files. (disabled by default) + - CacheCollector: Display all cache events. (disabled by default) Bootstraps the following collectors for Laravel: - LogCollector: Show all Log messages @@ -41,17 +44,21 @@ It also provides a Facade interface for easy logging Messages, Exceptions and Ti ## Installation -Require this package with composer: +Require this package with composer. It is recommended to only require the package for development. ```shell -composer require barryvdh/laravel-debugbar +composer require barryvdh/laravel-debugbar --dev ``` -After updating composer, add the ServiceProvider to the providers array in config/app.php +Laravel 5.5 uses Package Auto-Discovery, so doesn't require you to manually add the ServiceProvider. + +The Debugbar will be enabled when `APP_DEBUG` is `true`. > If you use a catch-all/fallback route, make sure you load the Debugbar ServiceProvider before your own App ServiceProviders. -### Laravel 5.x: +### Laravel 5.5+: + +If you don't use auto-discovery, add the ServiceProvider to the providers array in config/app.php ```php Barryvdh\Debugbar\ServiceProvider::class, @@ -63,7 +70,7 @@ If you want to use the facade to log messages, add this to your facades in app.p 'Debugbar' => Barryvdh\Debugbar\Facade::class, ``` -The profiler is enabled by default, if you have app.debug=true. You can override that in the config (`debugbar.enabled`). See more options in `config/debugbar.php` +The profiler is enabled by default, if you have APP_DEBUG=true. You can override that in the config (`debugbar.enabled`) or by setting `DEBUGBAR_ENABLED` in your `.env`. See more options in `config/debugbar.php` You can also set in your config if you want to include/exclude the vendor files also (FontAwesome, Highlight.js and jQuery). If you already use them in your site, set it to false. You can also only display the js or css vendors, by setting it to 'js' or 'css'. (Highlight.js requires both css + js, so set to `true` for syntax highlighting) diff --git a/vendor/barryvdh/laravel-debugbar/src/Console/ClearCommand.php b/vendor/barryvdh/laravel-debugbar/src/Console/ClearCommand.php index 8ca66032b..64c7dd28d 100644 --- a/vendor/barryvdh/laravel-debugbar/src/Console/ClearCommand.php +++ b/vendor/barryvdh/laravel-debugbar/src/Console/ClearCommand.php @@ -16,7 +16,7 @@ class ClearCommand extends Command parent::__construct(); } - public function fire() + public function handle() { $this->debugbar->boot(); diff --git a/vendor/barryvdh/laravel-debugbar/src/Console/PublishCommand.php b/vendor/barryvdh/laravel-debugbar/src/Console/PublishCommand.php deleted file mode 100644 index 84479d156..000000000 --- a/vendor/barryvdh/laravel-debugbar/src/Console/PublishCommand.php +++ /dev/null @@ -1,39 +0,0 @@ - - * @deprecated No longer needed because of the AssetController - */ -class PublishCommand extends Command -{ - /** - * The console command name. - * - * @var string - */ - protected $name = 'debugbar:publish'; - - /** - * The console command description. - * - * @var string - */ - protected $description = 'Publish the Debugbar assets'; - - /** - * Execute the console command. - * - * @return void - */ - public function fire() - { - $this->info( - 'NOTICE: Since laravel-debugbar 1.7.x, publishing assets is no longer necessary. The assets in public/packages/barryvdh/laravel-debugbar and maximebf/php-debugbar can be safely removed.' - ); - } -} diff --git a/vendor/barryvdh/laravel-debugbar/src/Controllers/BaseController.php b/vendor/barryvdh/laravel-debugbar/src/Controllers/BaseController.php index 904747d48..3c0d08b41 100644 --- a/vendor/barryvdh/laravel-debugbar/src/Controllers/BaseController.php +++ b/vendor/barryvdh/laravel-debugbar/src/Controllers/BaseController.php @@ -35,4 +35,4 @@ if (class_exists('Illuminate\Routing\Controller')) { } } } -} \ No newline at end of file +} diff --git a/vendor/barryvdh/laravel-debugbar/src/Controllers/CacheController.php b/vendor/barryvdh/laravel-debugbar/src/Controllers/CacheController.php new file mode 100644 index 000000000..3d04305ab --- /dev/null +++ b/vendor/barryvdh/laravel-debugbar/src/Controllers/CacheController.php @@ -0,0 +1,27 @@ +tags($tags); + } else { + unset($tags); + } + + $success = $cache->forget($key); + + return response()->json(compact('success')); + } + +} diff --git a/vendor/barryvdh/laravel-debugbar/src/Controllers/OpenHandlerController.php b/vendor/barryvdh/laravel-debugbar/src/Controllers/OpenHandlerController.php index 3d2c73ee4..77056f403 100644 --- a/vendor/barryvdh/laravel-debugbar/src/Controllers/OpenHandlerController.php +++ b/vendor/barryvdh/laravel-debugbar/src/Controllers/OpenHandlerController.php @@ -6,17 +6,10 @@ use Illuminate\Http\Response; class OpenHandlerController extends BaseController { - + public function handle() { - $debugbar = $this->debugbar; - - if (!$debugbar->isEnabled()) { - $this->app->abort('500', 'Debugbar is not enabled'); - } - - $openHandler = new OpenHandler($debugbar); - + $openHandler = new OpenHandler($this->debugbar); $data = $openHandler->handle(null, false, false); return new Response( @@ -40,14 +33,7 @@ class OpenHandlerController extends BaseController 'id' => $id, ]; - $debugbar = $this->debugbar; - - if (!$debugbar->isEnabled()) { - $this->app->abort('500', 'Debugbar is not enabled'); - } - - $openHandler = new OpenHandler($debugbar); - + $openHandler = new OpenHandler($this->debugbar); $data = $openHandler->handle($request, false, false); // Convert to Clockwork diff --git a/vendor/barryvdh/laravel-debugbar/src/DataCollector/AuthCollector.php b/vendor/barryvdh/laravel-debugbar/src/DataCollector/AuthCollector.php deleted file mode 100644 index 9f98160eb..000000000 --- a/vendor/barryvdh/laravel-debugbar/src/DataCollector/AuthCollector.php +++ /dev/null @@ -1,115 +0,0 @@ -auth = $auth; - } - - /** - * Set to show the users name/email - * @param bool $showName - */ - public function setShowName($showName) - { - $this->showName = (bool) $showName; - } - - /** - * @{inheritDoc} - */ - public function collect() - { - try { - $user = $this->auth->user(); - } catch (\Exception $e) { - $user = null; - } - return $this->getUserInformation($user); - } - - /** - * Get displayed user information - * @param \Illuminate\Auth\UserInterface $user - * @return array - */ - protected function getUserInformation($user = null) - { - // Defaults - if (is_null($user)) { - return [ - 'name' => 'Guest', - 'user' => ['guest' => true], - ]; - } - - // The default auth identifer is the ID number, which isn't all that - // useful. Try username and email. - $identifier = $user->getAuthIdentifier(); - if (is_numeric($identifier)) { - try { - if ($user->username) { - $identifier = $user->username; - } elseif ($user->email) { - $identifier = $user->email; - } - } catch (\Exception $e) { - } - } - - return [ - 'name' => $identifier, - 'user' => $user instanceof Arrayable ? $user->toArray() : $user, - ]; - } - - /** - * @{inheritDoc} - */ - public function getName() - { - return 'auth'; - } - - /** - * @{inheritDoc} - */ - public function getWidgets() - { - $widgets = [ - 'auth' => [ - 'icon' => 'lock', - 'widget' => 'PhpDebugBar.Widgets.VariableListWidget', - 'map' => 'auth.user', - 'default' => '{}' - ] - ]; - if ($this->showName) { - $widgets['auth.name'] = [ - 'icon' => 'user', - 'tooltip' => 'Auth status', - 'map' => 'auth.name', - 'default' => '', - ]; - } - return $widgets; - } -} diff --git a/vendor/barryvdh/laravel-debugbar/src/DataCollector/CacheCollector.php b/vendor/barryvdh/laravel-debugbar/src/DataCollector/CacheCollector.php new file mode 100644 index 000000000..61b7ad4fa --- /dev/null +++ b/vendor/barryvdh/laravel-debugbar/src/DataCollector/CacheCollector.php @@ -0,0 +1,95 @@ + 'hit', + CacheMissed::class => 'missed', + KeyWritten::class => 'written', + KeyForgotten::class => 'forgotten', + ]; + + public function __construct($requestStartTime = null, $collectValues) + { + parent::__construct(); + + $this->collectValues = $collectValues; + } + + public function onCacheEvent(CacheEvent $event) + { + $class = get_class($event); + $params = get_object_vars($event); + + $label = $this->classMap[$class]; + + if (isset($params['value'])) { + if ($this->collectValues) { + $params['value'] = htmlspecialchars($this->getDataFormatter()->formatVar($event->value)); + } else { + unset($params['value']); + } + } + + + if (!empty($params['key']) && in_array($label, ['hit', 'written'])) { + $params['delete'] = route('debugbar.cache.delete', [ + 'key' => urlencode($params['key']), + 'tags' => !empty($params['tags']) ? json_encode($params['tags']) : '', + ]); + } + + $time = microtime(true); + $this->addMeasure($label . "\t" . $event->key, $time, $time, $params); + } + + + public function subscribe(Dispatcher $dispatcher) + { + foreach ($this->classMap as $eventClass => $type) { + $dispatcher->listen($eventClass, [$this, 'onCacheEvent']); + } + } + + public function collect() + { + $data = parent::collect(); + $data['nb_measures'] = count($data['measures']); + + return $data; + } + + public function getName() + { + return 'cache'; + } + + public function getWidgets() + { + return [ + 'cache' => [ + 'icon' => 'clipboard', + 'widget' => 'PhpDebugBar.Widgets.LaravelCacheWidget', + 'map' => 'cache', + 'default' => '{}', + ], + 'cache:badge' => [ + 'map' => 'cache.nb_measures', + 'default' => 'null', + ], + ]; + } +} diff --git a/vendor/barryvdh/laravel-debugbar/src/DataCollector/EventCollector.php b/vendor/barryvdh/laravel-debugbar/src/DataCollector/EventCollector.php index 75326b6d0..572cab538 100644 --- a/vendor/barryvdh/laravel-debugbar/src/DataCollector/EventCollector.php +++ b/vendor/barryvdh/laravel-debugbar/src/DataCollector/EventCollector.php @@ -1,36 +1,25 @@ exporter = new ValueExporter(); + $this->setDataFormatter(new SimpleFormatter()); } public function onWildcardEvent($name = null, $data = []) { - // Pre-Laravel 5.4, using 'firing' to get the current event name. - if (method_exists($this->events, 'firing')) { - $name = $this->events->firing(); - - // Get the arguments passed to the event - $data = func_get_args(); - } - $params = $this->prepareParams($data); $time = microtime(true); @@ -63,7 +52,7 @@ class EventCollector extends TimeDataCollector $listener = $reflector->getName() . ' (' . $filename . ':' . $reflector->getStartLine() . '-' . $reflector->getEndLine() . ')'; } else { // Not sure if this is possible, but to prevent edge cases - $listener = $this->formatVar($listener); + $listener = $this->getDataFormatter()->formatVar($listener); } $params['listeners.' . $i] = $listener; @@ -84,7 +73,7 @@ class EventCollector extends TimeDataCollector if (is_object($value) && Str::is('Illuminate\*\Events\*', get_class($value))) { $value = $this->prepareParams(get_object_vars($value)); } - $data[$key] = htmlentities($this->exporter->exportValue($value), ENT_QUOTES, 'UTF-8', false); + $data[$key] = htmlentities($this->getDataFormatter()->formatVar($value), ENT_QUOTES, 'UTF-8', false); } return $data; diff --git a/vendor/barryvdh/laravel-debugbar/src/DataCollector/FilesCollector.php b/vendor/barryvdh/laravel-debugbar/src/DataCollector/FilesCollector.php index aad57ecd1..4c56837c4 100644 --- a/vendor/barryvdh/laravel-debugbar/src/DataCollector/FilesCollector.php +++ b/vendor/barryvdh/laravel-debugbar/src/DataCollector/FilesCollector.php @@ -4,18 +4,18 @@ namespace Barryvdh\Debugbar\DataCollector; use DebugBar\DataCollector\DataCollector; use DebugBar\DataCollector\Renderable; -use Illuminate\Contracts\Foundation\Application; +use Illuminate\Container\Container; class FilesCollector extends DataCollector implements Renderable { - /** @var \Illuminate\Contracts\Foundation\Application */ + /** @var \Illuminate\Container\Container */ protected $app; protected $basePath; /** - * @param \Illuminate\Contracts\Foundation\Application $app + * @param \Illuminate\Container\Container $app */ - public function __construct(Application $app = null) + public function __construct(Container $app = null) { $this->app = $app; $this->basePath = base_path(); diff --git a/vendor/barryvdh/laravel-debugbar/src/DataCollector/GateCollector.php b/vendor/barryvdh/laravel-debugbar/src/DataCollector/GateCollector.php index 8ed4bb591..5e6ad850b 100644 --- a/vendor/barryvdh/laravel-debugbar/src/DataCollector/GateCollector.php +++ b/vendor/barryvdh/laravel-debugbar/src/DataCollector/GateCollector.php @@ -2,40 +2,45 @@ namespace Barryvdh\Debugbar\DataCollector; +use Barryvdh\Debugbar\DataFormatter\SimpleFormatter; use DebugBar\DataCollector\MessagesCollector; use Illuminate\Contracts\Auth\Access\Gate; +use Illuminate\Contracts\Auth\Access\Authorizable; use Illuminate\Contracts\Auth\Authenticatable; -use Symfony\Component\HttpKernel\DataCollector\Util\ValueExporter; +use Symfony\Component\VarDumper\Cloner\VarCloner; /** * Collector for Laravel's Auth provider */ class GateCollector extends MessagesCollector { - /** @var ValueExporter */ - protected $exporter; /** * @param Gate $gate */ public function __construct(Gate $gate) { parent::__construct('gate'); - $this->exporter = new ValueExporter(); - - if (method_exists($gate, 'after')) { - $gate->after([$this, 'addCheck']); - } + $this->setDataFormatter(new SimpleFormatter()); + $gate->after([$this, 'addCheck']); } - public function addCheck(Authenticatable $user, $ability, $result, $arguments = []) + public function addCheck(Authorizable $user = null, $ability, $result, $arguments = []) { + $userKey = 'user'; + $userId = null; + + if ($user) { + $userKey = snake_case(class_basename($user)); + $userId = $user instanceof Authenticatable ? $user->getAuthIdentifier() : $user->id; + } + $label = $result ? 'success' : 'error'; $this->addMessage([ 'ability' => $ability, 'result' => $result, - 'user' => $user->getAuthIdentifier(), - 'arguments' => $this->exporter->exportValue($arguments), + $userKey => $userId, + 'arguments' => $this->getDataFormatter()->formatVar($arguments), ], $label, false); } } diff --git a/vendor/barryvdh/laravel-debugbar/src/DataCollector/MultiAuthCollector.php b/vendor/barryvdh/laravel-debugbar/src/DataCollector/MultiAuthCollector.php index c25d7ba10..59722c763 100644 --- a/vendor/barryvdh/laravel-debugbar/src/DataCollector/MultiAuthCollector.php +++ b/vendor/barryvdh/laravel-debugbar/src/DataCollector/MultiAuthCollector.php @@ -2,28 +2,45 @@ namespace Barryvdh\Debugbar\DataCollector; +use DebugBar\DataCollector\DataCollector; +use DebugBar\DataCollector\Renderable; use Illuminate\Auth\SessionGuard; use Illuminate\Contracts\Auth\Guard; use Illuminate\Support\Str; +use Illuminate\Contracts\Support\Arrayable; + /** * Collector for Laravel's Auth provider */ -class MultiAuthCollector extends AuthCollector +class MultiAuthCollector extends DataCollector implements Renderable { /** @var array $guards */ protected $guards; + /** @var \Illuminate\Auth\AuthManager */ + protected $auth; + /** @var bool */ + protected $showName = false; + /** * @param \Illuminate\Auth\AuthManager $auth * @param array $guards */ public function __construct($auth, $guards) { - parent::__construct($auth); + $this->auth = $auth; $this->guards = $guards; } + /** + * Set to show the users name/email + * @param bool $showName + */ + public function setShowName($showName) + { + $this->showName = (bool) $showName; + } /** * @{inheritDoc} @@ -77,6 +94,49 @@ class MultiAuthCollector extends AuthCollector return $guard->user(); } + /** + * Get displayed user information + * @param \Illuminate\Auth\UserInterface $user + * @return array + */ + protected function getUserInformation($user = null) + { + // Defaults + if (is_null($user)) { + return [ + 'name' => 'Guest', + 'user' => ['guest' => true], + ]; + } + + // The default auth identifer is the ID number, which isn't all that + // useful. Try username and email. + $identifier = $user->getAuthIdentifier(); + if (is_numeric($identifier)) { + try { + if ($user->username) { + $identifier = $user->username; + } elseif ($user->email) { + $identifier = $user->email; + } + } catch (\Exception $e) { + } + } + + return [ + 'name' => $identifier, + 'user' => $user instanceof Arrayable ? $user->toArray() : $user, + ]; + } + + /** + * @{inheritDoc} + */ + public function getName() + { + return 'auth'; + } + /** * @{inheritDoc} */ @@ -102,4 +162,5 @@ class MultiAuthCollector extends AuthCollector return $widgets; } + } diff --git a/vendor/barryvdh/laravel-debugbar/src/DataCollector/QueryCollector.php b/vendor/barryvdh/laravel-debugbar/src/DataCollector/QueryCollector.php index 6f6d7df67..211c5f1ea 100644 --- a/vendor/barryvdh/laravel-debugbar/src/DataCollector/QueryCollector.php +++ b/vendor/barryvdh/laravel-debugbar/src/DataCollector/QueryCollector.php @@ -185,7 +185,7 @@ class QueryCollector extends PDOCollector */ protected function findSource() { - $stack = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS | DEBUG_BACKTRACE_PROVIDE_OBJECT); + $stack = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS | DEBUG_BACKTRACE_PROVIDE_OBJECT, 50); $sources = []; @@ -218,13 +218,9 @@ class QueryCollector extends PDOCollector return $frame; } - if (isset($trace['class']) && isset($trace['file']) && strpos( - $trace['file'], - DIRECTORY_SEPARATOR . 'vendor' . DIRECTORY_SEPARATOR . 'laravel' . DIRECTORY_SEPARATOR . 'framework' - ) === false && strpos( - $trace['file'], - DIRECTORY_SEPARATOR . 'vendor' . DIRECTORY_SEPARATOR . 'barryvdh' . DIRECTORY_SEPARATOR . 'laravel-debugbar' - ) === false + if (isset($trace['class']) && + isset($trace['file']) && + !$this->fileIsInExcludedPath($trace['file']) ) { $file = $trace['file']; @@ -261,6 +257,31 @@ class QueryCollector extends PDOCollector return false; } + /** + * Check if the given file is to be excluded from analysis + * + * @param string $file + * @return bool + */ + protected function fileIsInExcludedPath($file) + { + $excludedPaths = [ + '/vendor/laravel/framework/src/Illuminate/Database', + '/vendor/laravel/framework/src/Illuminate/Events', + '/vendor/barryvdh/laravel-debugbar', + ]; + + $normalizedPath = str_replace('\\', '/', $file); + + foreach ($excludedPaths as $excludedPath) { + if (strpos($normalizedPath, $excludedPath) !== false) { + return true; + } + } + + return false; + } + /** * Find the middleware alias from the file. * diff --git a/vendor/barryvdh/laravel-debugbar/src/DataCollector/SymfonyRequestCollector.php b/vendor/barryvdh/laravel-debugbar/src/DataCollector/RequestCollector.php similarity index 98% rename from vendor/barryvdh/laravel-debugbar/src/DataCollector/SymfonyRequestCollector.php rename to vendor/barryvdh/laravel-debugbar/src/DataCollector/RequestCollector.php index 37fbcc4b9..25bada3c2 100644 --- a/vendor/barryvdh/laravel-debugbar/src/DataCollector/SymfonyRequestCollector.php +++ b/vendor/barryvdh/laravel-debugbar/src/DataCollector/RequestCollector.php @@ -12,7 +12,7 @@ use Symfony\Component\HttpFoundation\Response; * Based on \Symfony\Component\HttpKernel\DataCollector\RequestDataCollector by Fabien Potencier * */ -class SymfonyRequestCollector extends DataCollector implements DataCollectorInterface, Renderable +class RequestCollector extends DataCollector implements DataCollectorInterface, Renderable { /** @var \Symfony\Component\HttpFoundation\Request $request */ protected $request; diff --git a/vendor/barryvdh/laravel-debugbar/src/DataCollector/IlluminateRouteCollector.php b/vendor/barryvdh/laravel-debugbar/src/DataCollector/RouteCollector.php similarity index 97% rename from vendor/barryvdh/laravel-debugbar/src/DataCollector/IlluminateRouteCollector.php rename to vendor/barryvdh/laravel-debugbar/src/DataCollector/RouteCollector.php index c9db589da..6128e331d 100644 --- a/vendor/barryvdh/laravel-debugbar/src/DataCollector/IlluminateRouteCollector.php +++ b/vendor/barryvdh/laravel-debugbar/src/DataCollector/RouteCollector.php @@ -14,7 +14,7 @@ use Illuminate\Support\Facades\Config; * https://github.com/laravel/framework/blob/master/src/Illuminate/Foundation/Console/RoutesCommand.php * */ -class IlluminateRouteCollector extends DataCollector implements Renderable +class RouteCollector extends DataCollector implements Renderable { /** * The router instance. diff --git a/vendor/barryvdh/laravel-debugbar/src/DataCollector/ViewCollector.php b/vendor/barryvdh/laravel-debugbar/src/DataCollector/ViewCollector.php index 92e4d4133..b7c657e16 100644 --- a/vendor/barryvdh/laravel-debugbar/src/DataCollector/ViewCollector.php +++ b/vendor/barryvdh/laravel-debugbar/src/DataCollector/ViewCollector.php @@ -2,9 +2,10 @@ namespace Barryvdh\Debugbar\DataCollector; +use Barryvdh\Debugbar\DataFormatter\SimpleFormatter; use DebugBar\Bridge\Twig\TwigCollector; use Illuminate\View\View; -use Symfony\Component\HttpKernel\DataCollector\Util\ValueExporter; +use Symfony\Component\VarDumper\Cloner\VarCloner; class ViewCollector extends TwigCollector { @@ -18,10 +19,10 @@ class ViewCollector extends TwigCollector */ public function __construct($collectData = true) { + $this->setDataFormatter(new SimpleFormatter()); $this->collect_data = $collectData; $this->name = 'views'; $this->templates = []; - $this->exporter = new ValueExporter(); } public function getName() @@ -75,17 +76,23 @@ class ViewCollector extends TwigCollector } else { $data = []; foreach ($view->getData() as $key => $value) { - $data[$key] = $this->exporter->exportValue($value); + $data[$key] = $this->getDataFormatter()->formatVar($value); } $params = $data; } - $this->templates[] = [ + $template = [ 'name' => $path ? sprintf('%s (%s)', $name, $path) : $name, 'param_count' => count($params), 'params' => $params, 'type' => $type, ]; + + if ( $this->getXdebugLink($path)) { + $template['xdebug_link'] = $this->getXdebugLink($path); + } + + $this->templates[] = $template; } public function collect() diff --git a/vendor/symfony/http-kernel/DataCollector/Util/ValueExporter.php b/vendor/barryvdh/laravel-debugbar/src/DataFormatter/SimpleFormatter.php similarity index 62% rename from vendor/symfony/http-kernel/DataCollector/Util/ValueExporter.php rename to vendor/barryvdh/laravel-debugbar/src/DataFormatter/SimpleFormatter.php index e30b3a502..0a1fc9380 100644 --- a/vendor/symfony/http-kernel/DataCollector/Util/ValueExporter.php +++ b/vendor/barryvdh/laravel-debugbar/src/DataFormatter/SimpleFormatter.php @@ -1,25 +1,25 @@ - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ +namespace Barryvdh\Debugbar\DataFormatter; -namespace Symfony\Component\HttpKernel\DataCollector\Util; - -@trigger_error('The '.__NAMESPACE__.'\ValueExporter class is deprecated since Symfony 3.2 and will be removed in 4.0. Use the VarDumper component instead.', E_USER_DEPRECATED); +use DebugBar\DataFormatter\DataFormatter; /** - * @author Bernhard Schussek + * Simple DataFormatter based on the deprecated Symfony ValueExporter * - * @deprecated since version 3.2, to be removed in 4.0. Use the VarDumper component instead. + * @see https://github.com/symfony/symfony/blob/v3.4.4/src/Symfony/Component/HttpKernel/DataCollector/Util/ValueExporter.php */ -class ValueExporter +class SimpleFormatter extends DataFormatter { + /** + * @param $data + * @return string + */ + public function formatVar($data) + { + return $this->exportValue($data); + } + /** * Converts a PHP value to a string. * @@ -28,22 +28,23 @@ class ValueExporter * @param bool $deep Only for internal usage * * @return string The string representation of the given value + * @author Bernhard Schussek */ - public function exportValue($value, $depth = 1, $deep = false) + private function exportValue($value, $depth = 1, $deep = false) { if ($value instanceof \__PHP_Incomplete_Class) { return sprintf('__PHP_Incomplete_Class(%s)', $this->getClassNameFromIncomplete($value)); } - if (\is_object($value)) { + if (is_object($value)) { if ($value instanceof \DateTimeInterface) { - return sprintf('Object(%s) - %s', \get_class($value), $value->format(\DateTime::ATOM)); + return sprintf('Object(%s) - %s', get_class($value), $value->format(\DateTime::ATOM)); } - return sprintf('Object(%s)', \get_class($value)); + return sprintf('Object(%s)', get_class($value)); } - if (\is_array($value)) { + if (is_array($value)) { if (empty($value)) { return '[]'; } @@ -52,7 +53,7 @@ class ValueExporter $a = array(); foreach ($value as $k => $v) { - if (\is_array($v)) { + if (is_array($v)) { $deep = true; } $a[] = sprintf('%s => %s', $k, $this->exportValue($v, $depth + 1, $deep)); @@ -64,14 +65,14 @@ class ValueExporter $s = sprintf('[%s]', implode(', ', $a)); - if (80 > \strlen($s)) { + if (80 > strlen($s)) { return $s; } return sprintf("[\n%s%s\n]", $indent, implode(sprintf(",\n%s", $indent), $a)); } - if (\is_resource($value)) { + if (is_resource($value)) { return sprintf('Resource(%s#%d)', get_resource_type($value), $value); } @@ -90,6 +91,11 @@ class ValueExporter return (string) $value; } + /** + * @param \__PHP_Incomplete_Class $value + * @return mixed + * @author Bernhard Schussek + */ private function getClassNameFromIncomplete(\__PHP_Incomplete_Class $value) { $array = new \ArrayObject($value); diff --git a/vendor/barryvdh/laravel-debugbar/src/Facade.php b/vendor/barryvdh/laravel-debugbar/src/Facade.php index 678a2b3f4..d2bbcf5eb 100644 --- a/vendor/barryvdh/laravel-debugbar/src/Facade.php +++ b/vendor/barryvdh/laravel-debugbar/src/Facade.php @@ -7,6 +7,6 @@ class Facade extends \Illuminate\Support\Facades\Facade */ protected static function getFacadeAccessor() { - return 'debugbar'; + return LaravelDebugbar::class; } } diff --git a/vendor/barryvdh/laravel-debugbar/src/JavascriptRenderer.php b/vendor/barryvdh/laravel-debugbar/src/JavascriptRenderer.php index fa19402f0..df4423258 100644 --- a/vendor/barryvdh/laravel-debugbar/src/JavascriptRenderer.php +++ b/vendor/barryvdh/laravel-debugbar/src/JavascriptRenderer.php @@ -20,6 +20,7 @@ class JavascriptRenderer extends BaseJavascriptRenderer $this->cssFiles['laravel'] = __DIR__ . '/Resources/laravel-debugbar.css'; $this->cssVendors['fontawesome'] = __DIR__ . '/Resources/vendor/font-awesome/style.css'; $this->jsFiles['laravel-sql'] = __DIR__ . '/Resources/sqlqueries/widget.js'; + $this->jsFiles['laravel-cache'] = __DIR__ . '/Resources/cache/widget.js'; } /** @@ -56,9 +57,24 @@ class JavascriptRenderer extends BaseJavascriptRenderer $html .= '' . "\n"; } + $html .= $this->getInlineHtml(); + + return $html; } + protected function getInlineHtml() + { + $html = ''; + + foreach (['head', 'css', 'js'] as $asset) { + foreach ($this->getAssets('inline_' . $asset) as $item) { + $html .= $item . "\n"; + } + } + + return $html; + } /** * Get the last modified time of any assets. * diff --git a/vendor/barryvdh/laravel-debugbar/src/LaravelDebugbar.php b/vendor/barryvdh/laravel-debugbar/src/LaravelDebugbar.php index 1295abdc9..5ad17d307 100644 --- a/vendor/barryvdh/laravel-debugbar/src/LaravelDebugbar.php +++ b/vendor/barryvdh/laravel-debugbar/src/LaravelDebugbar.php @@ -1,6 +1,7 @@ app; - + // Set custom error handler if ($app['config']->get('debugbar.error_handler' , false)) { set_error_handler([$this, 'handleError']); @@ -222,7 +224,7 @@ class LaravelDebugbar extends DebugBar if (!$this->isLumen() && $this->shouldCollect('route')) { try { - $this->addCollector($this->app->make('Barryvdh\Debugbar\DataCollector\IlluminateRouteCollector')); + $this->addCollector($this->app->make('Barryvdh\Debugbar\DataCollector\RouteCollector')); } catch (\Exception $e) { $this->addThrowable( new Exception( @@ -317,6 +319,9 @@ class LaravelDebugbar extends DebugBar try { $db->listen( function ($query, $bindings = null, $time = null, $connectionName = null) use ($db, $queryCollector) { + if (!$this->shouldCollect('db', true)) { + return; // Issue 776 : We've turned off collecting after the listener was attached + } // Laravel 5.2 changed the way some core events worked. We must account for // the first argument being an "event object", where arguments are passed // via object properties, instead of individual arguments. @@ -436,13 +441,8 @@ class LaravelDebugbar extends DebugBar if ($this->shouldCollect('auth', false)) { try { - if($this->checkVersion('5.2')) { - // fix for compatibility with Laravel 5.2.* - $guards = array_keys($this->app['config']->get('auth.guards')); - $authCollector = new MultiAuthCollector($app['auth'], $guards); - } else { - $authCollector = new AuthCollector($app['auth']); - } + $guards = array_keys($this->app['config']->get('auth.guards', [])); + $authCollector = new MultiAuthCollector($app['auth'], $guards); $authCollector->setShowName( $this->app['config']->get('debugbar.options.auth.show_name') @@ -466,6 +466,25 @@ class LaravelDebugbar extends DebugBar } } + if ($this->shouldCollect('cache', false) && isset($this->app['events'])) { + try { + $collectValues = $this->app['config']->get('debugbar.options.cache.values', true); + $startTime = $this->app['request']->server('REQUEST_TIME_FLOAT'); + $cacheCollector = new CacheCollector($startTime, $collectValues); + $this->addCollector($cacheCollector); + $this->app['events']->subscribe($cacheCollector); + + } catch (\Exception $e) { + $this->addThrowable( + new Exception( + 'Cannot add CacheCollector to Laravel Debugbar: ' . $e->getMessage(), + $e->getCode(), + $e + ) + ); + } + } + $renderer = $this->getJavascriptRenderer(); $renderer->setIncludeVendors($this->app['config']->get('debugbar.include_vendors', true)); $renderer->setBindAjaxHandlerToXHR($app['config']->get('debugbar.capture_ajax', true)); @@ -478,6 +497,25 @@ class LaravelDebugbar extends DebugBar return $this->app['config']->get('debugbar.collectors.' . $name, $default); } + /** + * Adds a data collector + * + * @param DataCollectorInterface $collector + * + * @throws DebugBarException + * @return $this + */ + public function addCollector(DataCollectorInterface $collector) + { + parent::addCollector($collector); + + if (method_exists($collector, 'useHtmlVarDumper')) { + $collector->useHtmlVarDumper(); + } + + return $this; + } + /** * Handle silenced errors * @@ -580,7 +618,7 @@ class LaravelDebugbar extends DebugBar public function modifyResponse(Request $request, Response $response) { $app = $this->app; - if ($app->runningInConsole() || !$this->isEnabled() || $this->isDebugbarRequest()) { + if (!$this->isEnabled() || $this->isDebugbarRequest()) { return $response; } @@ -631,7 +669,7 @@ class LaravelDebugbar extends DebugBar if ($this->shouldCollect('symfony_request', true) && !$this->hasCollector('request')) { try { - $this->addCollector(new SymfonyRequestCollector($request, $response, $sessionManager)); + $this->addCollector(new RequestCollector($request, $response, $sessionManager)); } catch (\Exception $e) { $this->addThrowable( new Exception( @@ -712,7 +750,14 @@ class LaravelDebugbar extends DebugBar public function isEnabled() { if ($this->enabled === null) { - $this->enabled = value($this->app['config']->get('debugbar.enabled')); + $config = $this->app['config']; + $configEnabled = value($config->get('debugbar.enabled')); + + if ($configEnabled === null) { + $configEnabled = $config->get('app.debug'); + } + + $this->enabled = $configEnabled && !$this->app->runningInConsole() && !$this->app->environment('testing'); } return $this->enabled; @@ -970,7 +1015,7 @@ class LaravelDebugbar extends DebugBar case 'redis': $connection = $config->get('debugbar.storage.connection'); $client = $this->app['redis']->connection($connection); - if (is_a($client, 'Illuminate\Redis\Connections\PredisConnection', false)) { + if (is_a($client, 'Illuminate\Redis\Connections\Connection', false)) { $client = $client->client(); } $storage = new RedisStorage($client); @@ -1011,7 +1056,7 @@ class LaravelDebugbar extends DebugBar $headers = []; foreach ($collector->collect()['measures'] as $k => $m) { - $headers[] = sprintf('%d=%F; "%s"', $k, $m['duration'], str_replace('"', "'", $m['label'])); + $headers[] = sprintf('%d=%F; "%s"', $k, $m['duration'] * 1000, str_replace('"', "'", $m['label'])); } $response->headers->set('Server-Timing', $headers, false); diff --git a/vendor/barryvdh/laravel-debugbar/src/LumenServiceProvider.php b/vendor/barryvdh/laravel-debugbar/src/LumenServiceProvider.php index c0e0c0596..a3542753d 100644 --- a/vendor/barryvdh/laravel-debugbar/src/LumenServiceProvider.php +++ b/vendor/barryvdh/laravel-debugbar/src/LumenServiceProvider.php @@ -14,7 +14,7 @@ class LumenServiceProvider extends ServiceProvider */ protected function getRouter() { - return $this->app; + return $this->app->router; } /** @@ -37,14 +37,6 @@ class LumenServiceProvider extends ServiceProvider $this->app->middleware([$middleware]); } - /** - * Check the App Debug status - */ - protected function checkAppDebug() - { - return env('APP_DEBUG'); - } - /** * Get the services provided by the provider. * diff --git a/vendor/barryvdh/laravel-debugbar/src/Middleware/DebugbarEnabled.php b/vendor/barryvdh/laravel-debugbar/src/Middleware/DebugbarEnabled.php new file mode 100644 index 000000000..9e10a7664 --- /dev/null +++ b/vendor/barryvdh/laravel-debugbar/src/Middleware/DebugbarEnabled.php @@ -0,0 +1,42 @@ +debugbar = $debugbar; + } + + /** + * Handle an incoming request. + * + * @param Request $request + * @param Closure $next + * @return mixed + */ + public function handle($request, Closure $next) + { + if (!$this->debugbar->isEnabled()) { + abort(404); + } + + return $next($request); + + } +} diff --git a/vendor/barryvdh/laravel-debugbar/src/Middleware/Debugbar.php b/vendor/barryvdh/laravel-debugbar/src/Middleware/InjectDebugbar.php similarity index 72% rename from vendor/barryvdh/laravel-debugbar/src/Middleware/Debugbar.php rename to vendor/barryvdh/laravel-debugbar/src/Middleware/InjectDebugbar.php index edbc12779..42934fa02 100644 --- a/vendor/barryvdh/laravel-debugbar/src/Middleware/Debugbar.php +++ b/vendor/barryvdh/laravel-debugbar/src/Middleware/InjectDebugbar.php @@ -9,7 +9,7 @@ use Illuminate\Contracts\Container\Container; use Illuminate\Contracts\Debug\ExceptionHandler; use Symfony\Component\Debug\Exception\FatalThrowableError; -class Debugbar +class InjectDebugbar { /** * The App container @@ -25,6 +25,13 @@ class Debugbar */ protected $debugbar; + /** + * The URIs that should be excluded. + * + * @var array + */ + protected $except = []; + /** * Create a new middleware instance. * @@ -35,6 +42,7 @@ class Debugbar { $this->container = $container; $this->debugbar = $debugbar; + $this->except = config('debugbar.except') ?: []; } /** @@ -46,6 +54,12 @@ class Debugbar */ public function handle($request, Closure $next) { + if (!$this->debugbar->isEnabled() || $this->inExceptArray($request)) { + return $next($request); + } + + $this->debugbar->boot(); + try { /** @var \Illuminate\Http\Response $response */ $response = $next($request); @@ -85,4 +99,25 @@ class Debugbar return $handler->render($passable, $e); } + + /** + * Determine if the request has a URI that should be ignored. + * + * @param \Illuminate\Http\Request $request + * @return bool + */ + protected function inExceptArray($request) + { + foreach ($this->except as $except) { + if ($except !== '/') { + $except = trim($except, '/'); + } + + if ($request->is($except)) { + return true; + } + } + + return false; + } } diff --git a/vendor/barryvdh/laravel-debugbar/src/Resources/cache/widget.js b/vendor/barryvdh/laravel-debugbar/src/Resources/cache/widget.js new file mode 100644 index 000000000..ad7d967fe --- /dev/null +++ b/vendor/barryvdh/laravel-debugbar/src/Resources/cache/widget.js @@ -0,0 +1,59 @@ +(function($) { + + var csscls = PhpDebugBar.utils.makecsscls('phpdebugbar-widgets-'); + + /** + * Widget for the displaying cache events + * + * Options: + * - data + */ + var LaravelCacheWidget = PhpDebugBar.Widgets.LaravelCacheWidget = PhpDebugBar.Widgets.TimelineWidget.extend({ + + tagName: 'ul', + + className: csscls('timeline cache'), + + onForgetClick: function(e, el) { + e.stopPropagation(); + + $.ajax({ + url: $(el).attr("data-url"), + type: 'DELETE', + success: function(result) { + $(el).fadeOut(200); + } + }); + }, + + render: function() { + LaravelCacheWidget.__super__.render.apply(this); + + this.bindAttr('data', function(data) { + + if (data.measures) { + var self = this; + var lines = this.$el.find('.'+csscls('measure')); + + for (var i = 0; i < data.measures.length; i++) { + var measure = data.measures[i]; + var m = lines[i]; + + if (measure.params && !$.isEmptyObject(measure.params)) { + + if (measure.params.delete && measure.params.key) { + $('') + .addClass(csscls('forget')) + .text('forget') + .attr('data-url', measure.params.delete) + .one('click', function(e) { self.onForgetClick(e, this); }) + .appendTo(m); + } + } + } + } + }); + } + }); + +})(PhpDebugBar.$); diff --git a/vendor/barryvdh/laravel-debugbar/src/Resources/laravel-debugbar.css b/vendor/barryvdh/laravel-debugbar/src/Resources/laravel-debugbar.css index 7e93000f6..d708aab14 100644 --- a/vendor/barryvdh/laravel-debugbar/src/Resources/laravel-debugbar.css +++ b/vendor/barryvdh/laravel-debugbar/src/Resources/laravel-debugbar.css @@ -3,6 +3,7 @@ div.phpdebugbar { font-family: "Lucida Grande", "Lucida Sans Unicode", "Lucida Sans", Geneva, Verdana, sans-serif; direction: ltr; text-align: left; + z-index: 100000; } div.phpdebugbar-resize-handle { @@ -18,14 +19,23 @@ a.phpdebugbar-restore-btn { border-right-color: #ddd !important; } -div.phpdebugbar code, div.phpdebugbar pre { +div.phpdebugbar code, div.phpdebugbar pre, div.phpdebugbar samp { background: none; - font-family: monospace; + font-family: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 1em; border: 0; padding: 0; } +div.phpdebugbar code, div.phpdebugbar pre { + color: #000; +} + +div.phpdebugbar pre.sf-dump { + color: #a0a000; + outline: 0; +} + div.phpdebugbar-body { border-top: none; } @@ -195,7 +205,7 @@ div.phpdebugbar-widgets-messages div.phpdebugbar-widgets-toolbar a.phpdebugbar-w } ul.phpdebugbar-widgets-list li.phpdebugbar-widgets-list-item { - padding: 5px 10px; + padding: 15px 10px; border: none; font-family: inherit; overflow: visible; @@ -210,6 +220,7 @@ ul.phpdebugbar-widgets-list li.phpdebugbar-widgets-list-item { ul.phpdebugbar-widgets-list li.phpdebugbar-widgets-list-item .phpdebugbar-widgets-sql { flex: 1; margin-right: 5px; + cursor: text; } ul.phpdebugbar-widgets-list li.phpdebugbar-widgets-list-item .phpdebugbar-widgets-duration { @@ -294,3 +305,15 @@ ul.phpdebugbar-widgets-list li.phpdebugbar-widgets-table-list-item { .phpdebugbar-text-muted { color: #888; } + +ul.phpdebugbar-widgets-cache a.phpdebugbar-widgets-forget { + float: right; + font-size: 12px; + padding: 0 4px; + background: #f4645f; + margin: 0 2px; + border-radius: 4px; + color: #fff; + text-decoration: none; + line-height: 1.5rem; +} \ No newline at end of file diff --git a/vendor/barryvdh/laravel-debugbar/src/Resources/sqlqueries/widget.js b/vendor/barryvdh/laravel-debugbar/src/Resources/sqlqueries/widget.js index 17e273c52..4959e0837 100644 --- a/vendor/barryvdh/laravel-debugbar/src/Resources/sqlqueries/widget.js +++ b/vendor/barryvdh/laravel-debugbar/src/Resources/sqlqueries/widget.js @@ -186,6 +186,9 @@ if (data.statements[i].bindings && data.statements[i].bindings.length) { stmt += JSON.stringify(data.statements[i].bindings); } + if (data.statements[i].connection) { + stmt += '@' + data.statements[i].connection; + } sql[stmt] = sql[stmt] || { keys: [] }; sql[stmt].keys.push(i); } diff --git a/vendor/barryvdh/laravel-debugbar/src/Resources/vendor/font-awesome/style.css b/vendor/barryvdh/laravel-debugbar/src/Resources/vendor/font-awesome/style.css index 2078bb381..6fc6c340a 100644 --- a/vendor/barryvdh/laravel-debugbar/src/Resources/vendor/font-awesome/style.css +++ b/vendor/barryvdh/laravel-debugbar/src/Resources/vendor/font-awesome/style.css @@ -6,7 +6,7 @@ * -------------------------- */ @font-face { font-family: 'PhpDebugbarFontAwesome'; - src: url(data:application/font-woff;charset=utf-8;base64,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) format('woff'); + src: url(data:application/font-woff;charset=utf-8;base64,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) format('woff'); font-weight: normal; font-style: normal; } diff --git a/vendor/barryvdh/laravel-debugbar/src/ServiceProvider.php b/vendor/barryvdh/laravel-debugbar/src/ServiceProvider.php index 0fabc7e3e..f86b593ac 100644 --- a/vendor/barryvdh/laravel-debugbar/src/ServiceProvider.php +++ b/vendor/barryvdh/laravel-debugbar/src/ServiceProvider.php @@ -1,5 +1,10 @@ mergeConfigFrom($configPath, 'debugbar'); $this->app->alias( - 'DebugBar\DataFormatter\DataFormatter', - 'DebugBar\DataFormatter\DataFormatterInterface' + DataFormatter::class, + DataFormatterInterface::class ); - $this->app->singleton('debugbar', function ($app) { - $debugbar = new LaravelDebugbar($app); + $this->app->singleton(LaravelDebugbar::class, function () { + $debugbar = new LaravelDebugbar($this->app); - if ($app->bound(SessionManager::class)) { - $sessionManager = $app->make(SessionManager::class); + if ($this->app->bound(SessionManager::class)) { + $sessionManager = $this->app->make(SessionManager::class); $httpDriver = new SymfonyHttpDriver($sessionManager); $debugbar->setHttpDriver($httpDriver); } @@ -40,7 +45,7 @@ class ServiceProvider extends \Illuminate\Support\ServiceProvider } ); - $this->app->alias('debugbar', 'Barryvdh\Debugbar\LaravelDebugbar'); + $this->app->alias(LaravelDebugbar::class, 'debugbar'); $this->app->singleton('command.debugbar.clear', function ($app) { @@ -58,26 +63,14 @@ class ServiceProvider extends \Illuminate\Support\ServiceProvider */ public function boot() { - $app = $this->app; - $configPath = __DIR__ . '/../config/debugbar.php'; $this->publishes([$configPath => $this->getConfigPath()], 'config'); - // If enabled is null, set from the app.debug value - $enabled = $this->app['config']->get('debugbar.enabled'); - - if (is_null($enabled)) { - $enabled = $this->checkAppDebug(); - } - - if (! $enabled) { - return; - } - $routeConfig = [ 'namespace' => 'Barryvdh\Debugbar\Controllers', 'prefix' => $this->app['config']->get('debugbar.route_prefix'), 'domain' => $this->app['config']->get('debugbar.route_domain'), + 'middleware' => [DebugbarEnabled::class], ]; $this->getRouter()->group($routeConfig, function($router) { @@ -100,18 +93,14 @@ class ServiceProvider extends \Illuminate\Support\ServiceProvider 'uses' => 'AssetController@js', 'as' => 'debugbar.assets.js', ]); + + $router->delete('cache/{key}/{tags?}', [ + 'uses' => 'CacheController@delete', + 'as' => 'debugbar.cache.delete', + ]); }); - if ($app->runningInConsole() || $app->environment('testing')) { - return; - } - - /** @var LaravelDebugbar $debugbar */ - $debugbar = $this->app['debugbar']; - $debugbar->enable(); - $debugbar->boot(); - - $this->registerMiddleware('Barryvdh\Debugbar\Middleware\Debugbar'); + $this->registerMiddleware(InjectDebugbar::class); } /** @@ -151,18 +140,10 @@ class ServiceProvider extends \Illuminate\Support\ServiceProvider */ protected function registerMiddleware($middleware) { - $kernel = $this->app['Illuminate\Contracts\Http\Kernel']; + $kernel = $this->app[Kernel::class]; $kernel->pushMiddleware($middleware); } - /** - * Check the App Debug status - */ - protected function checkAppDebug() - { - return $this->app['config']->get('app.debug'); - } - /** * Get the services provided by the provider. * @@ -170,6 +151,6 @@ class ServiceProvider extends \Illuminate\Support\ServiceProvider */ public function provides() { - return ['debugbar', 'command.debugbar.clear']; + return ['debugbar', 'command.debugbar.clear', DataFormatterInterface::class, LaravelDebugbar::class]; } } diff --git a/vendor/barryvdh/laravel-debugbar/src/Storage/FilesystemStorage.php b/vendor/barryvdh/laravel-debugbar/src/Storage/FilesystemStorage.php index d336921c7..1ea11aee7 100644 --- a/vendor/barryvdh/laravel-debugbar/src/Storage/FilesystemStorage.php +++ b/vendor/barryvdh/laravel-debugbar/src/Storage/FilesystemStorage.php @@ -33,7 +33,7 @@ class FilesystemStorage implements StorageInterface { if (!$this->files->isDirectory($this->dirname)) { if ($this->files->makeDirectory($this->dirname, 0777, true)) { - $this->files->put($this->dirname . '.gitignore', "*\n!.gitignore"); + $this->files->put($this->dirname . '.gitignore', "*\n!.gitignore\n"); } else { throw new \Exception("Cannot create directory '$this->dirname'.."); } diff --git a/vendor/barryvdh/laravel-debugbar/src/SymfonyHttpDriver.php b/vendor/barryvdh/laravel-debugbar/src/SymfonyHttpDriver.php index f17619969..088a5ab9f 100644 --- a/vendor/barryvdh/laravel-debugbar/src/SymfonyHttpDriver.php +++ b/vendor/barryvdh/laravel-debugbar/src/SymfonyHttpDriver.php @@ -11,8 +11,9 @@ use Symfony\Component\HttpFoundation\Session\Session; */ class SymfonyHttpDriver implements HttpDriverInterface { - /** @var \Symfony\Component\HttpFoundation\Session\Session|\Illuminate\Contracts\Session\Session|\Illuminate\Session\SessionManager */ + /** @var \Illuminate\Contracts\Session\Session|\Illuminate\Session\SessionManager */ protected $session; + /** @var \Symfony\Component\HttpFoundation\Response */ protected $response; @@ -40,6 +41,7 @@ class SymfonyHttpDriver implements HttpDriverInterface if (!$this->session->isStarted()) { $this->session->start(); } + return $this->session->isStarted(); } @@ -48,14 +50,7 @@ class SymfonyHttpDriver implements HttpDriverInterface */ public function setSessionValue($name, $value) { - // In Laravel 5.4 the session changed to use their own custom implementation - // instead of the one from Symfony. One of the changes was the set method - // that was changed to put. Here we check if we are using the new one. - if (method_exists($this->session, 'driver') && $this->session->driver() instanceof \Illuminate\Contracts\Session\Session) { - $this->session->put($name, $value); - return; - } - $this->session->set($name, $value); + $this->session->put($name, $value); } /** diff --git a/vendor/barryvdh/laravel-debugbar/src/helpers.php b/vendor/barryvdh/laravel-debugbar/src/helpers.php index 396360165..0cd00444f 100644 --- a/vendor/barryvdh/laravel-debugbar/src/helpers.php +++ b/vendor/barryvdh/laravel-debugbar/src/helpers.php @@ -8,7 +8,7 @@ if (!function_exists('debugbar')) { */ function debugbar() { - return app('debugbar'); + return app(\Barryvdh\Debugbar\LaravelDebugbar::class); } } @@ -21,7 +21,7 @@ if (!function_exists('debug')) { */ function debug($value) { - $debugbar = app('debugbar'); + $debugbar = debugbar(); foreach (func_get_args() as $value) { $debugbar->addMessage($value, 'debug'); } @@ -37,7 +37,7 @@ if (!function_exists('start_measure')) { */ function start_measure($name, $label = null) { - app('debugbar')->startMeasure($name, $label); + debugbar()->startMeasure($name, $label); } } @@ -49,7 +49,7 @@ if (!function_exists('stop_measure')) { */ function stop_measure($name) { - app('debugbar')->stopMeasure($name); + debugbar()->stopMeasure($name); } } @@ -63,7 +63,7 @@ if (!function_exists('add_measure')) { */ function add_measure($label, $start, $end) { - app('debugbar')->addMeasure($label, $start, $end); + debugbar()->addMeasure($label, $start, $end); } } @@ -76,6 +76,6 @@ if (!function_exists('measure')) { */ function measure($label, \Closure $closure) { - app('debugbar')->measure($label, $closure); + debugbar()->measure($label, $closure); } } diff --git a/vendor/bin/var-dump-server b/vendor/bin/var-dump-server new file mode 100644 index 000000000..e41c85bbf --- /dev/null +++ b/vendor/bin/var-dump-server @@ -0,0 +1,10 @@ +#!/usr/bin/env sh + +dir=$(cd "${0%[/\\]*}" > /dev/null; cd "../symfony/var-dumper/Resources/bin" && pwd) + +if [ -d /proc/cygdrive ] && [[ $(which php) == $(readlink -n /proc/cygdrive)/* ]]; then + # We are in Cgywin using Windows php, so the path must be translated + dir=$(cygpath -m "$dir"); +fi + +"${dir}/var-dump-server" "$@" diff --git a/vendor/bin/var-dump-server.bat b/vendor/bin/var-dump-server.bat new file mode 100644 index 000000000..46836b50c --- /dev/null +++ b/vendor/bin/var-dump-server.bat @@ -0,0 +1,4 @@ +@ECHO OFF +setlocal DISABLEDELAYEDEXPANSION +SET BIN_TARGET=%~dp0/../symfony/var-dumper/Resources/bin/var-dump-server +php "%BIN_TARGET%" %* diff --git a/vendor/composer/autoload_classmap.php b/vendor/composer/autoload_classmap.php index 11fed06b7..935125eba 100644 --- a/vendor/composer/autoload_classmap.php +++ b/vendor/composer/autoload_classmap.php @@ -28,8 +28,6 @@ return array( 'AddForeignKeysToUsersTable' => $baseDir . '/database/migrations/2016_02_16_140454_add_foreign_keys_to_users_table.php', 'Adobe_Font_Metrics' => $vendorDir . '/phenx/php-font-lib/classes/Adobe_Font_Metrics.php', 'AlterTicketSourceTable' => $baseDir . '/database/migrations/2016_08_16_104539_alter_ticket_source_table.php', - 'ArithmeticError' => $vendorDir . '/symfony/polyfill-php70/Resources/stubs/ArithmeticError.php', - 'AssertionError' => $vendorDir . '/symfony/polyfill-php70/Resources/stubs/AssertionError.php', 'Attribute_Translator' => $vendorDir . '/dompdf/dompdf/include/attribute_translator.cls.php', 'Block_Frame_Decorator' => $vendorDir . '/dompdf/dompdf/include/block_frame_decorator.cls.php', 'Block_Frame_Reflower' => $vendorDir . '/dompdf/dompdf/include/block_frame_reflower.cls.php', @@ -122,12 +120,7 @@ return array( 'DOMPDF_Exception' => $vendorDir . '/dompdf/dompdf/include/dompdf_exception.cls.php', 'DOMPDF_Image_Exception' => $vendorDir . '/dompdf/dompdf/include/dompdf_image_exception.cls.php', 'DatabaseSeeder' => $baseDir . '/database/seeds/DatabaseSeeder.php', - 'DivisionByZeroError' => $vendorDir . '/symfony/polyfill-php70/Resources/stubs/DivisionByZeroError.php', 'Encoding_Map' => $vendorDir . '/phenx/php-font-lib/classes/Encoding_Map.php', - 'Error' => $vendorDir . '/symfony/polyfill-php70/Resources/stubs/Error.php', - 'File_Iterator' => $vendorDir . '/phpunit/php-file-iterator/src/Iterator.php', - 'File_Iterator_Facade' => $vendorDir . '/phpunit/php-file-iterator/src/Facade.php', - 'File_Iterator_Factory' => $vendorDir . '/phpunit/php-file-iterator/src/Factory.php', 'Fixed_Positioner' => $vendorDir . '/dompdf/dompdf/include/fixed_positioner.cls.php', 'Font' => $vendorDir . '/phenx/php-font-lib/classes/Font.php', 'Font_Binary_Stream' => $vendorDir . '/phenx/php-font-lib/classes/Font_Binary_Stream.php', @@ -222,7 +215,6 @@ return array( 'PHPUnit\\Exception' => $vendorDir . '/phpunit/phpunit/src/Exception.php', 'PHPUnit\\Framework\\Assert' => $vendorDir . '/phpunit/phpunit/src/Framework/Assert.php', 'PHPUnit\\Framework\\AssertionFailedError' => $vendorDir . '/phpunit/phpunit/src/Framework/AssertionFailedError.php', - 'PHPUnit\\Framework\\BaseTestListener' => $vendorDir . '/phpunit/phpunit/src/Framework/BaseTestListener.php', 'PHPUnit\\Framework\\CodeCoverageException' => $vendorDir . '/phpunit/phpunit/src/Framework/CodeCoverageException.php', 'PHPUnit\\Framework\\Constraint\\ArrayHasKey' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/ArrayHasKey.php', 'PHPUnit\\Framework\\Constraint\\ArraySubset' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/ArraySubset.php', @@ -285,49 +277,50 @@ return array( 'PHPUnit\\Framework\\IncompleteTestError' => $vendorDir . '/phpunit/phpunit/src/Framework/IncompleteTestError.php', 'PHPUnit\\Framework\\InvalidCoversTargetException' => $vendorDir . '/phpunit/phpunit/src/Framework/InvalidCoversTargetException.php', 'PHPUnit\\Framework\\MissingCoversAnnotationException' => $vendorDir . '/phpunit/phpunit/src/Framework/MissingCoversAnnotationException.php', - 'PHPUnit\\Framework\\MockObject\\BadMethodCallException' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Exception/BadMethodCallException.php', - 'PHPUnit\\Framework\\MockObject\\Builder\\Identity' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Builder/Identity.php', - 'PHPUnit\\Framework\\MockObject\\Builder\\InvocationMocker' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Builder/InvocationMocker.php', - 'PHPUnit\\Framework\\MockObject\\Builder\\Match' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Builder/Match.php', - 'PHPUnit\\Framework\\MockObject\\Builder\\MethodNameMatch' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Builder/MethodNameMatch.php', - 'PHPUnit\\Framework\\MockObject\\Builder\\NamespaceMatch' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Builder/NamespaceMatch.php', - 'PHPUnit\\Framework\\MockObject\\Builder\\ParametersMatch' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Builder/ParametersMatch.php', - 'PHPUnit\\Framework\\MockObject\\Builder\\Stub' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Builder/Stub.php', - 'PHPUnit\\Framework\\MockObject\\Exception' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Exception/Exception.php', - 'PHPUnit\\Framework\\MockObject\\Generator' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Generator.php', - 'PHPUnit\\Framework\\MockObject\\Invocation' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Invocation/Invocation.php', - 'PHPUnit\\Framework\\MockObject\\InvocationMocker' => $vendorDir . '/phpunit/phpunit-mock-objects/src/InvocationMocker.php', - 'PHPUnit\\Framework\\MockObject\\Invocation\\ObjectInvocation' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Invocation/ObjectInvocation.php', - 'PHPUnit\\Framework\\MockObject\\Invocation\\StaticInvocation' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Invocation/StaticInvocation.php', - 'PHPUnit\\Framework\\MockObject\\Invokable' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Invokable.php', - 'PHPUnit\\Framework\\MockObject\\Matcher' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Matcher.php', - 'PHPUnit\\Framework\\MockObject\\Matcher\\AnyInvokedCount' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Matcher/AnyInvokedCount.php', - 'PHPUnit\\Framework\\MockObject\\Matcher\\AnyParameters' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Matcher/AnyParameters.php', - 'PHPUnit\\Framework\\MockObject\\Matcher\\ConsecutiveParameters' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Matcher/ConsecutiveParameters.php', - 'PHPUnit\\Framework\\MockObject\\Matcher\\Invocation' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Matcher/Invocation.php', - 'PHPUnit\\Framework\\MockObject\\Matcher\\InvokedAtIndex' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Matcher/InvokedAtIndex.php', - 'PHPUnit\\Framework\\MockObject\\Matcher\\InvokedAtLeastCount' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Matcher/InvokedAtLeastCount.php', - 'PHPUnit\\Framework\\MockObject\\Matcher\\InvokedAtLeastOnce' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Matcher/InvokedAtLeastOnce.php', - 'PHPUnit\\Framework\\MockObject\\Matcher\\InvokedAtMostCount' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Matcher/InvokedAtMostCount.php', - 'PHPUnit\\Framework\\MockObject\\Matcher\\InvokedCount' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Matcher/InvokedCount.php', - 'PHPUnit\\Framework\\MockObject\\Matcher\\InvokedRecorder' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Matcher/InvokedRecorder.php', - 'PHPUnit\\Framework\\MockObject\\Matcher\\MethodName' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Matcher/MethodName.php', - 'PHPUnit\\Framework\\MockObject\\Matcher\\Parameters' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Matcher/Parameters.php', - 'PHPUnit\\Framework\\MockObject\\Matcher\\StatelessInvocation' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Matcher/StatelessInvocation.php', - 'PHPUnit\\Framework\\MockObject\\MockBuilder' => $vendorDir . '/phpunit/phpunit-mock-objects/src/MockBuilder.php', - 'PHPUnit\\Framework\\MockObject\\MockObject' => $vendorDir . '/phpunit/phpunit-mock-objects/src/ForwardCompatibility/MockObject.php', - 'PHPUnit\\Framework\\MockObject\\RuntimeException' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Exception/RuntimeException.php', - 'PHPUnit\\Framework\\MockObject\\Stub' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Stub.php', - 'PHPUnit\\Framework\\MockObject\\Stub\\ConsecutiveCalls' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Stub/ConsecutiveCalls.php', - 'PHPUnit\\Framework\\MockObject\\Stub\\Exception' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Stub/Exception.php', - 'PHPUnit\\Framework\\MockObject\\Stub\\MatcherCollection' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Stub/MatcherCollection.php', - 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnArgument' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Stub/ReturnArgument.php', - 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnCallback' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Stub/ReturnCallback.php', - 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnReference' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Stub/ReturnReference.php', - 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnSelf' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Stub/ReturnSelf.php', - 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnStub' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Stub/ReturnStub.php', - 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnValueMap' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Stub/ReturnValueMap.php', - 'PHPUnit\\Framework\\MockObject\\Verifiable' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Verifiable.php', + 'PHPUnit\\Framework\\MockObject\\BadMethodCallException' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Exception/BadMethodCallException.php', + 'PHPUnit\\Framework\\MockObject\\Builder\\Identity' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Builder/Identity.php', + 'PHPUnit\\Framework\\MockObject\\Builder\\InvocationMocker' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Builder/InvocationMocker.php', + 'PHPUnit\\Framework\\MockObject\\Builder\\Match' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Builder/Match.php', + 'PHPUnit\\Framework\\MockObject\\Builder\\MethodNameMatch' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Builder/MethodNameMatch.php', + 'PHPUnit\\Framework\\MockObject\\Builder\\NamespaceMatch' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Builder/NamespaceMatch.php', + 'PHPUnit\\Framework\\MockObject\\Builder\\ParametersMatch' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Builder/ParametersMatch.php', + 'PHPUnit\\Framework\\MockObject\\Builder\\Stub' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Builder/Stub.php', + 'PHPUnit\\Framework\\MockObject\\Exception' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Exception/Exception.php', + 'PHPUnit\\Framework\\MockObject\\Generator' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Generator.php', + 'PHPUnit\\Framework\\MockObject\\Invocation' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Invocation/Invocation.php', + 'PHPUnit\\Framework\\MockObject\\InvocationMocker' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/InvocationMocker.php', + 'PHPUnit\\Framework\\MockObject\\Invocation\\ObjectInvocation' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Invocation/ObjectInvocation.php', + 'PHPUnit\\Framework\\MockObject\\Invocation\\StaticInvocation' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Invocation/StaticInvocation.php', + 'PHPUnit\\Framework\\MockObject\\Invokable' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Invokable.php', + 'PHPUnit\\Framework\\MockObject\\Matcher' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Matcher.php', + 'PHPUnit\\Framework\\MockObject\\Matcher\\AnyInvokedCount' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Matcher/AnyInvokedCount.php', + 'PHPUnit\\Framework\\MockObject\\Matcher\\AnyParameters' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Matcher/AnyParameters.php', + 'PHPUnit\\Framework\\MockObject\\Matcher\\ConsecutiveParameters' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Matcher/ConsecutiveParameters.php', + 'PHPUnit\\Framework\\MockObject\\Matcher\\DeferredError' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Matcher/DeferredError.php', + 'PHPUnit\\Framework\\MockObject\\Matcher\\Invocation' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Matcher/Invocation.php', + 'PHPUnit\\Framework\\MockObject\\Matcher\\InvokedAtIndex' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Matcher/InvokedAtIndex.php', + 'PHPUnit\\Framework\\MockObject\\Matcher\\InvokedAtLeastCount' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Matcher/InvokedAtLeastCount.php', + 'PHPUnit\\Framework\\MockObject\\Matcher\\InvokedAtLeastOnce' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Matcher/InvokedAtLeastOnce.php', + 'PHPUnit\\Framework\\MockObject\\Matcher\\InvokedAtMostCount' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Matcher/InvokedAtMostCount.php', + 'PHPUnit\\Framework\\MockObject\\Matcher\\InvokedCount' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Matcher/InvokedCount.php', + 'PHPUnit\\Framework\\MockObject\\Matcher\\InvokedRecorder' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Matcher/InvokedRecorder.php', + 'PHPUnit\\Framework\\MockObject\\Matcher\\MethodName' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Matcher/MethodName.php', + 'PHPUnit\\Framework\\MockObject\\Matcher\\Parameters' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Matcher/Parameters.php', + 'PHPUnit\\Framework\\MockObject\\Matcher\\StatelessInvocation' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Matcher/StatelessInvocation.php', + 'PHPUnit\\Framework\\MockObject\\MockBuilder' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/MockBuilder.php', + 'PHPUnit\\Framework\\MockObject\\MockObject' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/ForwardCompatibility/MockObject.php', + 'PHPUnit\\Framework\\MockObject\\RuntimeException' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Exception/RuntimeException.php', + 'PHPUnit\\Framework\\MockObject\\Stub' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Stub.php', + 'PHPUnit\\Framework\\MockObject\\Stub\\ConsecutiveCalls' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Stub/ConsecutiveCalls.php', + 'PHPUnit\\Framework\\MockObject\\Stub\\Exception' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Stub/Exception.php', + 'PHPUnit\\Framework\\MockObject\\Stub\\MatcherCollection' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Stub/MatcherCollection.php', + 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnArgument' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnArgument.php', + 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnCallback' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnCallback.php', + 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnReference' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnReference.php', + 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnSelf' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnSelf.php', + 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnStub' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnStub.php', + 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnValueMap' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnValueMap.php', + 'PHPUnit\\Framework\\MockObject\\Verifiable' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Verifiable.php', 'PHPUnit\\Framework\\OutputError' => $vendorDir . '/phpunit/phpunit/src/Framework/OutputError.php', 'PHPUnit\\Framework\\RiskyTest' => $vendorDir . '/phpunit/phpunit/src/Framework/RiskyTest.php', 'PHPUnit\\Framework\\RiskyTestError' => $vendorDir . '/phpunit/phpunit/src/Framework/RiskyTestError.php', @@ -348,16 +341,34 @@ return array( 'PHPUnit\\Framework\\UnintentionallyCoveredCodeError' => $vendorDir . '/phpunit/phpunit/src/Framework/UnintentionallyCoveredCodeError.php', 'PHPUnit\\Framework\\Warning' => $vendorDir . '/phpunit/phpunit/src/Framework/Warning.php', 'PHPUnit\\Framework\\WarningTestCase' => $vendorDir . '/phpunit/phpunit/src/Framework/WarningTestCase.php', + 'PHPUnit\\Runner\\AfterIncompleteTestHook' => $vendorDir . '/phpunit/phpunit/src/Runner/Hook/AfterIncompleteTestHook.php', + 'PHPUnit\\Runner\\AfterLastTestHook' => $vendorDir . '/phpunit/phpunit/src/Runner/Hook/AfterLastTestHook.php', + 'PHPUnit\\Runner\\AfterRiskyTestHook' => $vendorDir . '/phpunit/phpunit/src/Runner/Hook/AfterRiskyTestHook.php', + 'PHPUnit\\Runner\\AfterSkippedTestHook' => $vendorDir . '/phpunit/phpunit/src/Runner/Hook/AfterSkippedTestHook.php', + 'PHPUnit\\Runner\\AfterSuccessfulTestHook' => $vendorDir . '/phpunit/phpunit/src/Runner/Hook/AfterSuccessfulTestHook.php', + 'PHPUnit\\Runner\\AfterTestErrorHook' => $vendorDir . '/phpunit/phpunit/src/Runner/Hook/AfterTestErrorHook.php', + 'PHPUnit\\Runner\\AfterTestFailureHook' => $vendorDir . '/phpunit/phpunit/src/Runner/Hook/AfterTestFailureHook.php', + 'PHPUnit\\Runner\\AfterTestWarningHook' => $vendorDir . '/phpunit/phpunit/src/Runner/Hook/AfterTestWarningHook.php', 'PHPUnit\\Runner\\BaseTestRunner' => $vendorDir . '/phpunit/phpunit/src/Runner/BaseTestRunner.php', + 'PHPUnit\\Runner\\BeforeFirstTestHook' => $vendorDir . '/phpunit/phpunit/src/Runner/Hook/BeforeFirstTestHook.php', + 'PHPUnit\\Runner\\BeforeTestHook' => $vendorDir . '/phpunit/phpunit/src/Runner/Hook/BeforeTestHook.php', 'PHPUnit\\Runner\\Exception' => $vendorDir . '/phpunit/phpunit/src/Runner/Exception.php', 'PHPUnit\\Runner\\Filter\\ExcludeGroupFilterIterator' => $vendorDir . '/phpunit/phpunit/src/Runner/Filter/ExcludeGroupFilterIterator.php', 'PHPUnit\\Runner\\Filter\\Factory' => $vendorDir . '/phpunit/phpunit/src/Runner/Filter/Factory.php', 'PHPUnit\\Runner\\Filter\\GroupFilterIterator' => $vendorDir . '/phpunit/phpunit/src/Runner/Filter/GroupFilterIterator.php', 'PHPUnit\\Runner\\Filter\\IncludeGroupFilterIterator' => $vendorDir . '/phpunit/phpunit/src/Runner/Filter/IncludeGroupFilterIterator.php', 'PHPUnit\\Runner\\Filter\\NameFilterIterator' => $vendorDir . '/phpunit/phpunit/src/Runner/Filter/NameFilterIterator.php', + 'PHPUnit\\Runner\\Hook' => $vendorDir . '/phpunit/phpunit/src/Runner/Hook/Hook.php', + 'PHPUnit\\Runner\\NullTestResultCache' => $vendorDir . '/phpunit/phpunit/src/Util/NullTestResultCache.php', 'PHPUnit\\Runner\\PhptTestCase' => $vendorDir . '/phpunit/phpunit/src/Runner/PhptTestCase.php', + 'PHPUnit\\Runner\\ResultCacheExtension' => $vendorDir . '/phpunit/phpunit/src/Runner/ResultCacheExtension.php', 'PHPUnit\\Runner\\StandardTestSuiteLoader' => $vendorDir . '/phpunit/phpunit/src/Runner/StandardTestSuiteLoader.php', + 'PHPUnit\\Runner\\TestHook' => $vendorDir . '/phpunit/phpunit/src/Runner/Hook/TestHook.php', + 'PHPUnit\\Runner\\TestListenerAdapter' => $vendorDir . '/phpunit/phpunit/src/Runner/Hook/TestListenerAdapter.php', + 'PHPUnit\\Runner\\TestResultCache' => $vendorDir . '/phpunit/phpunit/src/Util/TestResultCache.php', + 'PHPUnit\\Runner\\TestResultCacheInterface' => $vendorDir . '/phpunit/phpunit/src/Util/TestResultCacheInterface.php', 'PHPUnit\\Runner\\TestSuiteLoader' => $vendorDir . '/phpunit/phpunit/src/Runner/TestSuiteLoader.php', + 'PHPUnit\\Runner\\TestSuiteSorter' => $vendorDir . '/phpunit/phpunit/src/Runner/TestSuiteSorter.php', 'PHPUnit\\Runner\\Version' => $vendorDir . '/phpunit/phpunit/src/Runner/Version.php', 'PHPUnit\\TextUI\\Command' => $vendorDir . '/phpunit/phpunit/src/TextUI/Command.php', 'PHPUnit\\TextUI\\ResultPrinter' => $vendorDir . '/phpunit/phpunit/src/TextUI/ResultPrinter.php', @@ -366,7 +377,7 @@ return array( 'PHPUnit\\Util\\Configuration' => $vendorDir . '/phpunit/phpunit/src/Util/Configuration.php', 'PHPUnit\\Util\\ConfigurationGenerator' => $vendorDir . '/phpunit/phpunit/src/Util/ConfigurationGenerator.php', 'PHPUnit\\Util\\ErrorHandler' => $vendorDir . '/phpunit/phpunit/src/Util/ErrorHandler.php', - 'PHPUnit\\Util\\Fileloader' => $vendorDir . '/phpunit/phpunit/src/Util/Fileloader.php', + 'PHPUnit\\Util\\FileLoader' => $vendorDir . '/phpunit/phpunit/src/Util/FileLoader.php', 'PHPUnit\\Util\\Filesystem' => $vendorDir . '/phpunit/phpunit/src/Util/Filesystem.php', 'PHPUnit\\Util\\Filter' => $vendorDir . '/phpunit/phpunit/src/Util/Filter.php', 'PHPUnit\\Util\\Getopt' => $vendorDir . '/phpunit/phpunit/src/Util/Getopt.php', @@ -381,18 +392,19 @@ return array( 'PHPUnit\\Util\\Printer' => $vendorDir . '/phpunit/phpunit/src/Util/Printer.php', 'PHPUnit\\Util\\RegularExpression' => $vendorDir . '/phpunit/phpunit/src/Util/RegularExpression.php', 'PHPUnit\\Util\\Test' => $vendorDir . '/phpunit/phpunit/src/Util/Test.php', + 'PHPUnit\\Util\\TestDox\\CliTestDoxPrinter' => $vendorDir . '/phpunit/phpunit/src/Util/TestDox/CliTestDoxPrinter.php', 'PHPUnit\\Util\\TestDox\\HtmlResultPrinter' => $vendorDir . '/phpunit/phpunit/src/Util/TestDox/HtmlResultPrinter.php', 'PHPUnit\\Util\\TestDox\\NamePrettifier' => $vendorDir . '/phpunit/phpunit/src/Util/TestDox/NamePrettifier.php', 'PHPUnit\\Util\\TestDox\\ResultPrinter' => $vendorDir . '/phpunit/phpunit/src/Util/TestDox/ResultPrinter.php', + 'PHPUnit\\Util\\TestDox\\TestResult' => $vendorDir . '/phpunit/phpunit/src/Util/TestDox/TestResult.php', 'PHPUnit\\Util\\TestDox\\TextResultPrinter' => $vendorDir . '/phpunit/phpunit/src/Util/TestDox/TextResultPrinter.php', 'PHPUnit\\Util\\TestDox\\XmlResultPrinter' => $vendorDir . '/phpunit/phpunit/src/Util/TestDox/XmlResultPrinter.php', 'PHPUnit\\Util\\TextTestListRenderer' => $vendorDir . '/phpunit/phpunit/src/Util/TextTestListRenderer.php', 'PHPUnit\\Util\\Type' => $vendorDir . '/phpunit/phpunit/src/Util/Type.php', 'PHPUnit\\Util\\Xml' => $vendorDir . '/phpunit/phpunit/src/Util/Xml.php', 'PHPUnit\\Util\\XmlTestListRenderer' => $vendorDir . '/phpunit/phpunit/src/Util/XmlTestListRenderer.php', - 'PHPUnit_Framework_MockObject_MockObject' => $vendorDir . '/phpunit/phpunit-mock-objects/src/MockObject.php', + 'PHPUnit_Framework_MockObject_MockObject' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/MockObject.php', 'PHP_Evaluator' => $vendorDir . '/dompdf/dompdf/include/php_evaluator.cls.php', - 'PHP_Timer' => $vendorDir . '/phpunit/php-timer/src/Timer.php', 'PHP_Token' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_TokenWithScope' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_TokenWithScopeAndVisibility' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', @@ -402,9 +414,7 @@ return array( 'PHP_Token_ARRAY' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_ARRAY_CAST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_AS' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_ASYNC' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_AT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_AWAIT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_BACKTICK' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_BAD_CHARACTER' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_BOOLEAN_AND' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', @@ -428,7 +438,6 @@ return array( 'PHP_Token_COLON' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_COMMA' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_COMMENT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_COMPILER_HALT_OFFSET' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_CONCAT_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_CONST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_CONSTANT_ENCAPSED_STRING' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', @@ -463,9 +472,7 @@ return array( 'PHP_Token_ENDSWITCH' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_ENDWHILE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_END_HEREDOC' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_ENUM' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_EQUALS' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_EVAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_EXCLAMATION_MARK' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_EXIT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', @@ -483,7 +490,6 @@ return array( 'PHP_Token_HALT_COMPILER' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_IF' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_IMPLEMENTS' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_IN' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_INC' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_INCLUDE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_INCLUDE_ONCE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', @@ -500,10 +506,6 @@ return array( 'PHP_Token_IS_NOT_IDENTICAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_IS_SMALLER_OR_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_Includes' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_JOIN' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_LAMBDA_ARROW' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_LAMBDA_CP' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_LAMBDA_OP' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_LINE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_LIST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_LNUMBER' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', @@ -521,11 +523,9 @@ return array( 'PHP_Token_NEW' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_NS_C' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_NS_SEPARATOR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_NULLSAFE_OBJECT_OPERATOR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_NUM_STRING' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_OBJECT_CAST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_OBJECT_OPERATOR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_ONUMBER' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_OPEN_BRACKET' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_OPEN_CURLY' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_OPEN_SQUARE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', @@ -548,7 +548,6 @@ return array( 'PHP_Token_REQUIRE_ONCE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_RETURN' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_SEMICOLON' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_SHAPE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_SL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_SL_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_SPACESHIP' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', @@ -559,7 +558,6 @@ return array( 'PHP_Token_STRING' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_STRING_CAST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_STRING_VARNAME' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_SUPER' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_SWITCH' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_Stream' => $vendorDir . '/phpunit/php-token-stream/src/Token/Stream.php', 'PHP_Token_Stream_CachingFactory' => $vendorDir . '/phpunit/php-token-stream/src/Token/Stream/CachingFactory.php', @@ -568,34 +566,20 @@ return array( 'PHP_Token_TRAIT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_TRAIT_C' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_TRY' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_TYPE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_TYPELIST_GT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_TYPELIST_LT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_UNSET' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_UNSET_CAST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_USE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_USE_FUNCTION' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_VAR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_VARIABLE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_WHERE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_WHILE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_WHITESPACE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_XHP_ATTRIBUTE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_XHP_CATEGORY' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_XHP_CATEGORY_LABEL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_XHP_CHILDREN' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_XHP_LABEL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_XHP_REQUIRED' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_XHP_TAG_GT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_XHP_TAG_LT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_XHP_TEXT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_XOR_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_YIELD' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_YIELD_FROM' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', 'Page_Cache' => $vendorDir . '/dompdf/dompdf/include/page_cache.cls.php', 'Page_Frame_Decorator' => $vendorDir . '/dompdf/dompdf/include/page_frame_decorator.cls.php', 'Page_Frame_Reflower' => $vendorDir . '/dompdf/dompdf/include/page_frame_reflower.cls.php', - 'ParseError' => $vendorDir . '/symfony/polyfill-php70/Resources/stubs/ParseError.php', 'PharIo\\Manifest\\Application' => $vendorDir . '/phar-io/manifest/src/values/Application.php', 'PharIo\\Manifest\\ApplicationName' => $vendorDir . '/phar-io/manifest/src/values/ApplicationName.php', 'PharIo\\Manifest\\Author' => $vendorDir . '/phar-io/manifest/src/values/Author.php', @@ -645,20 +629,21 @@ return array( 'PharIo\\Manifest\\RequiresElement' => $vendorDir . '/phar-io/manifest/src/xml/RequiresElement.php', 'PharIo\\Manifest\\Type' => $vendorDir . '/phar-io/manifest/src/values/Type.php', 'PharIo\\Manifest\\Url' => $vendorDir . '/phar-io/manifest/src/values/Url.php', - 'PharIo\\Version\\AbstractVersionConstraint' => $vendorDir . '/phar-io/version/src/AbstractVersionConstraint.php', - 'PharIo\\Version\\AndVersionConstraintGroup' => $vendorDir . '/phar-io/version/src/AndVersionConstraintGroup.php', - 'PharIo\\Version\\AnyVersionConstraint' => $vendorDir . '/phar-io/version/src/AnyVersionConstraint.php', - 'PharIo\\Version\\ExactVersionConstraint' => $vendorDir . '/phar-io/version/src/ExactVersionConstraint.php', - 'PharIo\\Version\\Exception' => $vendorDir . '/phar-io/version/src/Exception.php', - 'PharIo\\Version\\GreaterThanOrEqualToVersionConstraint' => $vendorDir . '/phar-io/version/src/GreaterThanOrEqualToVersionConstraint.php', - 'PharIo\\Version\\InvalidVersionException' => $vendorDir . '/phar-io/version/src/InvalidVersionException.php', - 'PharIo\\Version\\OrVersionConstraintGroup' => $vendorDir . '/phar-io/version/src/OrVersionConstraintGroup.php', + 'PharIo\\Version\\AbstractVersionConstraint' => $vendorDir . '/phar-io/version/src/constraints/AbstractVersionConstraint.php', + 'PharIo\\Version\\AndVersionConstraintGroup' => $vendorDir . '/phar-io/version/src/constraints/AndVersionConstraintGroup.php', + 'PharIo\\Version\\AnyVersionConstraint' => $vendorDir . '/phar-io/version/src/constraints/AnyVersionConstraint.php', + 'PharIo\\Version\\ExactVersionConstraint' => $vendorDir . '/phar-io/version/src/constraints/ExactVersionConstraint.php', + 'PharIo\\Version\\Exception' => $vendorDir . '/phar-io/version/src/exceptions/Exception.php', + 'PharIo\\Version\\GreaterThanOrEqualToVersionConstraint' => $vendorDir . '/phar-io/version/src/constraints/GreaterThanOrEqualToVersionConstraint.php', + 'PharIo\\Version\\InvalidPreReleaseSuffixException' => $vendorDir . '/phar-io/version/src/exceptions/InvalidPreReleaseSuffixException.php', + 'PharIo\\Version\\InvalidVersionException' => $vendorDir . '/phar-io/version/src/exceptions/InvalidVersionException.php', + 'PharIo\\Version\\OrVersionConstraintGroup' => $vendorDir . '/phar-io/version/src/constraints/OrVersionConstraintGroup.php', 'PharIo\\Version\\PreReleaseSuffix' => $vendorDir . '/phar-io/version/src/PreReleaseSuffix.php', - 'PharIo\\Version\\SpecificMajorAndMinorVersionConstraint' => $vendorDir . '/phar-io/version/src/SpecificMajorAndMinorVersionConstraint.php', - 'PharIo\\Version\\SpecificMajorVersionConstraint' => $vendorDir . '/phar-io/version/src/SpecificMajorVersionConstraint.php', - 'PharIo\\Version\\UnsupportedVersionConstraintException' => $vendorDir . '/phar-io/version/src/UnsupportedVersionConstraintException.php', + 'PharIo\\Version\\SpecificMajorAndMinorVersionConstraint' => $vendorDir . '/phar-io/version/src/constraints/SpecificMajorAndMinorVersionConstraint.php', + 'PharIo\\Version\\SpecificMajorVersionConstraint' => $vendorDir . '/phar-io/version/src/constraints/SpecificMajorVersionConstraint.php', + 'PharIo\\Version\\UnsupportedVersionConstraintException' => $vendorDir . '/phar-io/version/src/exceptions/UnsupportedVersionConstraintException.php', 'PharIo\\Version\\Version' => $vendorDir . '/phar-io/version/src/Version.php', - 'PharIo\\Version\\VersionConstraint' => $vendorDir . '/phar-io/version/src/VersionConstraint.php', + 'PharIo\\Version\\VersionConstraint' => $vendorDir . '/phar-io/version/src/constraints/VersionConstraint.php', 'PharIo\\Version\\VersionConstraintParser' => $vendorDir . '/phar-io/version/src/VersionConstraintParser.php', 'PharIo\\Version\\VersionConstraintValue' => $vendorDir . '/phar-io/version/src/VersionConstraintValue.php', 'PharIo\\Version\\VersionNumber' => $vendorDir . '/phar-io/version/src/VersionNumber.php', @@ -667,7 +652,6 @@ return array( 'SebastianBergmann\\CodeCoverage\\CodeCoverage' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage.php', 'SebastianBergmann\\CodeCoverage\\CoveredCodeNotExecutedException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/CoveredCodeNotExecutedException.php', 'SebastianBergmann\\CodeCoverage\\Driver\\Driver' => $vendorDir . '/phpunit/php-code-coverage/src/Driver/Driver.php', - 'SebastianBergmann\\CodeCoverage\\Driver\\HHVM' => $vendorDir . '/phpunit/php-code-coverage/src/Driver/HHVM.php', 'SebastianBergmann\\CodeCoverage\\Driver\\PHPDBG' => $vendorDir . '/phpunit/php-code-coverage/src/Driver/PHPDBG.php', 'SebastianBergmann\\CodeCoverage\\Driver\\Xdebug' => $vendorDir . '/phpunit/php-code-coverage/src/Driver/Xdebug.php', 'SebastianBergmann\\CodeCoverage\\Exception' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/Exception.php', @@ -722,6 +706,7 @@ return array( 'SebastianBergmann\\Comparator\\SplObjectStorageComparator' => $vendorDir . '/sebastian/comparator/src/SplObjectStorageComparator.php', 'SebastianBergmann\\Comparator\\TypeComparator' => $vendorDir . '/sebastian/comparator/src/TypeComparator.php', 'SebastianBergmann\\Diff\\Chunk' => $vendorDir . '/sebastian/diff/src/Chunk.php', + 'SebastianBergmann\\Diff\\ConfigurationException' => $vendorDir . '/sebastian/diff/src/Exception/ConfigurationException.php', 'SebastianBergmann\\Diff\\Diff' => $vendorDir . '/sebastian/diff/src/Diff.php', 'SebastianBergmann\\Diff\\Differ' => $vendorDir . '/sebastian/diff/src/Differ.php', 'SebastianBergmann\\Diff\\Exception' => $vendorDir . '/sebastian/diff/src/Exception/Exception.php', @@ -732,6 +717,7 @@ return array( 'SebastianBergmann\\Diff\\Output\\AbstractChunkOutputBuilder' => $vendorDir . '/sebastian/diff/src/Output/AbstractChunkOutputBuilder.php', 'SebastianBergmann\\Diff\\Output\\DiffOnlyOutputBuilder' => $vendorDir . '/sebastian/diff/src/Output/DiffOnlyOutputBuilder.php', 'SebastianBergmann\\Diff\\Output\\DiffOutputBuilderInterface' => $vendorDir . '/sebastian/diff/src/Output/DiffOutputBuilderInterface.php', + 'SebastianBergmann\\Diff\\Output\\StrictUnifiedDiffOutputBuilder' => $vendorDir . '/sebastian/diff/src/Output/StrictUnifiedDiffOutputBuilder.php', 'SebastianBergmann\\Diff\\Output\\UnifiedDiffOutputBuilder' => $vendorDir . '/sebastian/diff/src/Output/UnifiedDiffOutputBuilder.php', 'SebastianBergmann\\Diff\\Parser' => $vendorDir . '/sebastian/diff/src/Parser.php', 'SebastianBergmann\\Diff\\TimeEfficientLongestCommonSubsequenceCalculator' => $vendorDir . '/sebastian/diff/src/TimeEfficientLongestCommonSubsequenceCalculator.php', @@ -739,6 +725,9 @@ return array( 'SebastianBergmann\\Environment\\OperatingSystem' => $vendorDir . '/sebastian/environment/src/OperatingSystem.php', 'SebastianBergmann\\Environment\\Runtime' => $vendorDir . '/sebastian/environment/src/Runtime.php', 'SebastianBergmann\\Exporter\\Exporter' => $vendorDir . '/sebastian/exporter/src/Exporter.php', + 'SebastianBergmann\\FileIterator\\Facade' => $vendorDir . '/phpunit/php-file-iterator/src/Facade.php', + 'SebastianBergmann\\FileIterator\\Factory' => $vendorDir . '/phpunit/php-file-iterator/src/Factory.php', + 'SebastianBergmann\\FileIterator\\Iterator' => $vendorDir . '/phpunit/php-file-iterator/src/Iterator.php', 'SebastianBergmann\\GlobalState\\Blacklist' => $vendorDir . '/sebastian/global-state/src/Blacklist.php', 'SebastianBergmann\\GlobalState\\CodeExporter' => $vendorDir . '/sebastian/global-state/src/CodeExporter.php', 'SebastianBergmann\\GlobalState\\Exception' => $vendorDir . '/sebastian/global-state/src/exceptions/Exception.php', @@ -755,8 +744,10 @@ return array( 'SebastianBergmann\\RecursionContext\\Exception' => $vendorDir . '/sebastian/recursion-context/src/Exception.php', 'SebastianBergmann\\RecursionContext\\InvalidArgumentException' => $vendorDir . '/sebastian/recursion-context/src/InvalidArgumentException.php', 'SebastianBergmann\\ResourceOperations\\ResourceOperations' => $vendorDir . '/sebastian/resource-operations/src/ResourceOperations.php', + 'SebastianBergmann\\Timer\\Exception' => $vendorDir . '/phpunit/php-timer/src/Exception.php', + 'SebastianBergmann\\Timer\\RuntimeException' => $vendorDir . '/phpunit/php-timer/src/RuntimeException.php', + 'SebastianBergmann\\Timer\\Timer' => $vendorDir . '/phpunit/php-timer/src/Timer.php', 'SebastianBergmann\\Version' => $vendorDir . '/sebastian/version/src/Version.php', - 'SessionUpdateTimestampHandlerInterface' => $vendorDir . '/symfony/polyfill-php70/Resources/stubs/SessionUpdateTimestampHandlerInterface.php', 'Style' => $vendorDir . '/dompdf/dompdf/include/style.cls.php', 'Stylesheet' => $vendorDir . '/dompdf/dompdf/include/stylesheet.cls.php', 'TCPDF_Adapter' => $vendorDir . '/dompdf/dompdf/include/tcpdf_adapter.cls.php', @@ -773,7 +764,6 @@ return array( 'Table_Row_Group_Renderer' => $vendorDir . '/dompdf/dompdf/include/table_row_group_renderer.cls.php', 'Table_Row_Positioner' => $vendorDir . '/dompdf/dompdf/include/table_row_positioner.cls.php', 'TestCase' => $baseDir . '/tests/TestCase.php', - 'Tests\\DuskTestCase' => $baseDir . '/tests/DuskTestCase.php', 'Text_Frame_Decorator' => $vendorDir . '/dompdf/dompdf/include/text_frame_decorator.cls.php', 'Text_Frame_Reflower' => $vendorDir . '/dompdf/dompdf/include/text_frame_reflower.cls.php', 'Text_Renderer' => $vendorDir . '/dompdf/dompdf/include/text_renderer.cls.php', @@ -786,6 +776,5 @@ return array( 'TheSeer\\Tokenizer\\TokenCollectionException' => $vendorDir . '/theseer/tokenizer/src/TokenCollectionException.php', 'TheSeer\\Tokenizer\\Tokenizer' => $vendorDir . '/theseer/tokenizer/src/Tokenizer.php', 'TheSeer\\Tokenizer\\XMLSerializer' => $vendorDir . '/theseer/tokenizer/src/XMLSerializer.php', - 'TypeError' => $vendorDir . '/symfony/polyfill-php70/Resources/stubs/TypeError.php', 'Version1079table' => $baseDir . '/database/migrations/2016_06_28_141613_version1079table.php', ); diff --git a/vendor/composer/autoload_files.php b/vendor/composer/autoload_files.php index 919e0c666..c70ddfe20 100644 --- a/vendor/composer/autoload_files.php +++ b/vendor/composer/autoload_files.php @@ -8,11 +8,10 @@ $baseDir = dirname($vendorDir); return array( '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => $vendorDir . '/symfony/polyfill-mbstring/bootstrap.php', '320cde22f66dd4f5d3fd621d3e88b98f' => $vendorDir . '/symfony/polyfill-ctype/bootstrap.php', - '667aeda72477189d0494fecd327c3641' => $vendorDir . '/symfony/var-dumper/Resources/functions/dump.php', - '5255c38a0faeba867671b61dfda6d864' => $vendorDir . '/paragonie/random_compat/lib/random.php', - '023d27dca8066ef29e6739335ea73bad' => $vendorDir . '/symfony/polyfill-php70/bootstrap.php', 'a0edc8309cc5e1d60e3047b5df6b7052' => $vendorDir . '/guzzlehttp/psr7/src/functions_include.php', 'c964ee0ededf28c96ebd9db5099ef910' => $vendorDir . '/guzzlehttp/promises/src/functions_include.php', + '25072dd6e2470089de65ae7bf11d3109' => $vendorDir . '/symfony/polyfill-php72/bootstrap.php', + '667aeda72477189d0494fecd327c3641' => $vendorDir . '/symfony/var-dumper/Resources/functions/dump.php', '37a3dc5111fe8f707ab4c132ef1dbc62' => $vendorDir . '/guzzlehttp/guzzle/src/functions_include.php', 'b067bc7112e384b61c701452d53a14a8' => $vendorDir . '/mtdowling/jmespath.php/src/JmesPath.php', '8a9dc1de0ca7e01f3e08231539562f61' => $vendorDir . '/aws/aws-sdk-php/src/functions.php', diff --git a/vendor/composer/autoload_psr4.php b/vendor/composer/autoload_psr4.php index 05e0ea59c..2a290f374 100644 --- a/vendor/composer/autoload_psr4.php +++ b/vendor/composer/autoload_psr4.php @@ -30,7 +30,7 @@ return array( 'Thomaswelton\\LaravelGravatar\\' => array($vendorDir . '/thomaswelton/laravel-gravatar/src'), 'Tests\\' => array($baseDir . '/tests'), 'Symfony\\Polyfill\\Util\\' => array($vendorDir . '/symfony/polyfill-util'), - 'Symfony\\Polyfill\\Php70\\' => array($vendorDir . '/symfony/polyfill-php70'), + 'Symfony\\Polyfill\\Php72\\' => array($vendorDir . '/symfony/polyfill-php72'), 'Symfony\\Polyfill\\Php56\\' => array($vendorDir . '/symfony/polyfill-php56'), 'Symfony\\Polyfill\\Mbstring\\' => array($vendorDir . '/symfony/polyfill-mbstring'), 'Symfony\\Polyfill\\Ctype\\' => array($vendorDir . '/symfony/polyfill-ctype'), @@ -89,11 +89,11 @@ return array( 'DeepCopy\\' => array($vendorDir . '/myclabs/deep-copy/src/DeepCopy'), 'DebugBar\\' => array($vendorDir . '/maximebf/debugbar/src/DebugBar'), 'DaveJamesMiller\\Breadcrumbs\\' => array($vendorDir . '/davejamesmiller/laravel-breadcrumbs/src'), - 'Cron\\' => array($vendorDir . '/mtdowling/cron-expression/src/Cron'), + 'Cron\\' => array($vendorDir . '/dragonmantank/cron-expression/src/Cron'), 'Collective\\Html\\' => array($vendorDir . '/laravelcollective/html/src'), 'Chumper\\Zipper\\' => array($vendorDir . '/chumper/zipper/src/Chumper/Zipper'), + 'Carbon\\' => array($vendorDir . '/nesbot/carbon/src/Carbon'), 'Barryvdh\\Debugbar\\' => array($vendorDir . '/barryvdh/laravel-debugbar/src'), 'Aws\\' => array($vendorDir . '/aws/aws-sdk-php/src'), 'App\\' => array($baseDir . '/app'), - '' => array($vendorDir . '/nesbot/carbon/src'), ); diff --git a/vendor/composer/autoload_static.php b/vendor/composer/autoload_static.php index d43761404..6c59c3e5f 100644 --- a/vendor/composer/autoload_static.php +++ b/vendor/composer/autoload_static.php @@ -9,11 +9,10 @@ class ComposerStaticInit598add4b9b35c76d3599603201ccdd6d public static $files = array ( '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php', '320cde22f66dd4f5d3fd621d3e88b98f' => __DIR__ . '/..' . '/symfony/polyfill-ctype/bootstrap.php', - '667aeda72477189d0494fecd327c3641' => __DIR__ . '/..' . '/symfony/var-dumper/Resources/functions/dump.php', - '5255c38a0faeba867671b61dfda6d864' => __DIR__ . '/..' . '/paragonie/random_compat/lib/random.php', - '023d27dca8066ef29e6739335ea73bad' => __DIR__ . '/..' . '/symfony/polyfill-php70/bootstrap.php', 'a0edc8309cc5e1d60e3047b5df6b7052' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/functions_include.php', 'c964ee0ededf28c96ebd9db5099ef910' => __DIR__ . '/..' . '/guzzlehttp/promises/src/functions_include.php', + '25072dd6e2470089de65ae7bf11d3109' => __DIR__ . '/..' . '/symfony/polyfill-php72/bootstrap.php', + '667aeda72477189d0494fecd327c3641' => __DIR__ . '/..' . '/symfony/var-dumper/Resources/functions/dump.php', '37a3dc5111fe8f707ab4c132ef1dbc62' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/functions_include.php', 'b067bc7112e384b61c701452d53a14a8' => __DIR__ . '/..' . '/mtdowling/jmespath.php/src/JmesPath.php', '8a9dc1de0ca7e01f3e08231539562f61' => __DIR__ . '/..' . '/aws/aws-sdk-php/src/functions.php', @@ -79,7 +78,7 @@ class ComposerStaticInit598add4b9b35c76d3599603201ccdd6d 'S' => array ( 'Symfony\\Polyfill\\Util\\' => 22, - 'Symfony\\Polyfill\\Php70\\' => 23, + 'Symfony\\Polyfill\\Php72\\' => 23, 'Symfony\\Polyfill\\Php56\\' => 23, 'Symfony\\Polyfill\\Mbstring\\' => 26, 'Symfony\\Polyfill\\Ctype\\' => 23, @@ -177,6 +176,7 @@ class ComposerStaticInit598add4b9b35c76d3599603201ccdd6d 'Cron\\' => 5, 'Collective\\Html\\' => 16, 'Chumper\\Zipper\\' => 15, + 'Carbon\\' => 7, ), 'B' => array ( @@ -288,9 +288,9 @@ class ComposerStaticInit598add4b9b35c76d3599603201ccdd6d array ( 0 => __DIR__ . '/..' . '/symfony/polyfill-util', ), - 'Symfony\\Polyfill\\Php70\\' => + 'Symfony\\Polyfill\\Php72\\' => array ( - 0 => __DIR__ . '/..' . '/symfony/polyfill-php70', + 0 => __DIR__ . '/..' . '/symfony/polyfill-php72', ), 'Symfony\\Polyfill\\Php56\\' => array ( @@ -526,7 +526,7 @@ class ComposerStaticInit598add4b9b35c76d3599603201ccdd6d ), 'Cron\\' => array ( - 0 => __DIR__ . '/..' . '/mtdowling/cron-expression/src/Cron', + 0 => __DIR__ . '/..' . '/dragonmantank/cron-expression/src/Cron', ), 'Collective\\Html\\' => array ( @@ -536,6 +536,10 @@ class ComposerStaticInit598add4b9b35c76d3599603201ccdd6d array ( 0 => __DIR__ . '/..' . '/chumper/zipper/src/Chumper/Zipper', ), + 'Carbon\\' => + array ( + 0 => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon', + ), 'Barryvdh\\Debugbar\\' => array ( 0 => __DIR__ . '/..' . '/barryvdh/laravel-debugbar/src', @@ -550,10 +554,6 @@ class ComposerStaticInit598add4b9b35c76d3599603201ccdd6d ), ); - public static $fallbackDirsPsr4 = array ( - 0 => __DIR__ . '/..' . '/nesbot/carbon/src', - ); - public static $prefixesPsr0 = array ( 't' => array ( @@ -687,8 +687,6 @@ class ComposerStaticInit598add4b9b35c76d3599603201ccdd6d 'AddForeignKeysToUsersTable' => __DIR__ . '/../..' . '/database/migrations/2016_02_16_140454_add_foreign_keys_to_users_table.php', 'Adobe_Font_Metrics' => __DIR__ . '/..' . '/phenx/php-font-lib/classes/Adobe_Font_Metrics.php', 'AlterTicketSourceTable' => __DIR__ . '/../..' . '/database/migrations/2016_08_16_104539_alter_ticket_source_table.php', - 'ArithmeticError' => __DIR__ . '/..' . '/symfony/polyfill-php70/Resources/stubs/ArithmeticError.php', - 'AssertionError' => __DIR__ . '/..' . '/symfony/polyfill-php70/Resources/stubs/AssertionError.php', 'Attribute_Translator' => __DIR__ . '/..' . '/dompdf/dompdf/include/attribute_translator.cls.php', 'Block_Frame_Decorator' => __DIR__ . '/..' . '/dompdf/dompdf/include/block_frame_decorator.cls.php', 'Block_Frame_Reflower' => __DIR__ . '/..' . '/dompdf/dompdf/include/block_frame_reflower.cls.php', @@ -781,12 +779,7 @@ class ComposerStaticInit598add4b9b35c76d3599603201ccdd6d 'DOMPDF_Exception' => __DIR__ . '/..' . '/dompdf/dompdf/include/dompdf_exception.cls.php', 'DOMPDF_Image_Exception' => __DIR__ . '/..' . '/dompdf/dompdf/include/dompdf_image_exception.cls.php', 'DatabaseSeeder' => __DIR__ . '/../..' . '/database/seeds/DatabaseSeeder.php', - 'DivisionByZeroError' => __DIR__ . '/..' . '/symfony/polyfill-php70/Resources/stubs/DivisionByZeroError.php', 'Encoding_Map' => __DIR__ . '/..' . '/phenx/php-font-lib/classes/Encoding_Map.php', - 'Error' => __DIR__ . '/..' . '/symfony/polyfill-php70/Resources/stubs/Error.php', - 'File_Iterator' => __DIR__ . '/..' . '/phpunit/php-file-iterator/src/Iterator.php', - 'File_Iterator_Facade' => __DIR__ . '/..' . '/phpunit/php-file-iterator/src/Facade.php', - 'File_Iterator_Factory' => __DIR__ . '/..' . '/phpunit/php-file-iterator/src/Factory.php', 'Fixed_Positioner' => __DIR__ . '/..' . '/dompdf/dompdf/include/fixed_positioner.cls.php', 'Font' => __DIR__ . '/..' . '/phenx/php-font-lib/classes/Font.php', 'Font_Binary_Stream' => __DIR__ . '/..' . '/phenx/php-font-lib/classes/Font_Binary_Stream.php', @@ -881,7 +874,6 @@ class ComposerStaticInit598add4b9b35c76d3599603201ccdd6d 'PHPUnit\\Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/Exception.php', 'PHPUnit\\Framework\\Assert' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Assert.php', 'PHPUnit\\Framework\\AssertionFailedError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/AssertionFailedError.php', - 'PHPUnit\\Framework\\BaseTestListener' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/BaseTestListener.php', 'PHPUnit\\Framework\\CodeCoverageException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/CodeCoverageException.php', 'PHPUnit\\Framework\\Constraint\\ArrayHasKey' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/ArrayHasKey.php', 'PHPUnit\\Framework\\Constraint\\ArraySubset' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/ArraySubset.php', @@ -944,49 +936,50 @@ class ComposerStaticInit598add4b9b35c76d3599603201ccdd6d 'PHPUnit\\Framework\\IncompleteTestError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/IncompleteTestError.php', 'PHPUnit\\Framework\\InvalidCoversTargetException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/InvalidCoversTargetException.php', 'PHPUnit\\Framework\\MissingCoversAnnotationException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MissingCoversAnnotationException.php', - 'PHPUnit\\Framework\\MockObject\\BadMethodCallException' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Exception/BadMethodCallException.php', - 'PHPUnit\\Framework\\MockObject\\Builder\\Identity' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Builder/Identity.php', - 'PHPUnit\\Framework\\MockObject\\Builder\\InvocationMocker' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Builder/InvocationMocker.php', - 'PHPUnit\\Framework\\MockObject\\Builder\\Match' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Builder/Match.php', - 'PHPUnit\\Framework\\MockObject\\Builder\\MethodNameMatch' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Builder/MethodNameMatch.php', - 'PHPUnit\\Framework\\MockObject\\Builder\\NamespaceMatch' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Builder/NamespaceMatch.php', - 'PHPUnit\\Framework\\MockObject\\Builder\\ParametersMatch' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Builder/ParametersMatch.php', - 'PHPUnit\\Framework\\MockObject\\Builder\\Stub' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Builder/Stub.php', - 'PHPUnit\\Framework\\MockObject\\Exception' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Exception/Exception.php', - 'PHPUnit\\Framework\\MockObject\\Generator' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Generator.php', - 'PHPUnit\\Framework\\MockObject\\Invocation' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Invocation/Invocation.php', - 'PHPUnit\\Framework\\MockObject\\InvocationMocker' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/InvocationMocker.php', - 'PHPUnit\\Framework\\MockObject\\Invocation\\ObjectInvocation' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Invocation/ObjectInvocation.php', - 'PHPUnit\\Framework\\MockObject\\Invocation\\StaticInvocation' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Invocation/StaticInvocation.php', - 'PHPUnit\\Framework\\MockObject\\Invokable' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Invokable.php', - 'PHPUnit\\Framework\\MockObject\\Matcher' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Matcher.php', - 'PHPUnit\\Framework\\MockObject\\Matcher\\AnyInvokedCount' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Matcher/AnyInvokedCount.php', - 'PHPUnit\\Framework\\MockObject\\Matcher\\AnyParameters' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Matcher/AnyParameters.php', - 'PHPUnit\\Framework\\MockObject\\Matcher\\ConsecutiveParameters' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Matcher/ConsecutiveParameters.php', - 'PHPUnit\\Framework\\MockObject\\Matcher\\Invocation' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Matcher/Invocation.php', - 'PHPUnit\\Framework\\MockObject\\Matcher\\InvokedAtIndex' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Matcher/InvokedAtIndex.php', - 'PHPUnit\\Framework\\MockObject\\Matcher\\InvokedAtLeastCount' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Matcher/InvokedAtLeastCount.php', - 'PHPUnit\\Framework\\MockObject\\Matcher\\InvokedAtLeastOnce' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Matcher/InvokedAtLeastOnce.php', - 'PHPUnit\\Framework\\MockObject\\Matcher\\InvokedAtMostCount' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Matcher/InvokedAtMostCount.php', - 'PHPUnit\\Framework\\MockObject\\Matcher\\InvokedCount' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Matcher/InvokedCount.php', - 'PHPUnit\\Framework\\MockObject\\Matcher\\InvokedRecorder' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Matcher/InvokedRecorder.php', - 'PHPUnit\\Framework\\MockObject\\Matcher\\MethodName' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Matcher/MethodName.php', - 'PHPUnit\\Framework\\MockObject\\Matcher\\Parameters' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Matcher/Parameters.php', - 'PHPUnit\\Framework\\MockObject\\Matcher\\StatelessInvocation' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Matcher/StatelessInvocation.php', - 'PHPUnit\\Framework\\MockObject\\MockBuilder' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/MockBuilder.php', - 'PHPUnit\\Framework\\MockObject\\MockObject' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/ForwardCompatibility/MockObject.php', - 'PHPUnit\\Framework\\MockObject\\RuntimeException' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Exception/RuntimeException.php', - 'PHPUnit\\Framework\\MockObject\\Stub' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Stub.php', - 'PHPUnit\\Framework\\MockObject\\Stub\\ConsecutiveCalls' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Stub/ConsecutiveCalls.php', - 'PHPUnit\\Framework\\MockObject\\Stub\\Exception' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Stub/Exception.php', - 'PHPUnit\\Framework\\MockObject\\Stub\\MatcherCollection' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Stub/MatcherCollection.php', - 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnArgument' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Stub/ReturnArgument.php', - 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnCallback' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Stub/ReturnCallback.php', - 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnReference' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Stub/ReturnReference.php', - 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnSelf' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Stub/ReturnSelf.php', - 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnStub' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Stub/ReturnStub.php', - 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnValueMap' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Stub/ReturnValueMap.php', - 'PHPUnit\\Framework\\MockObject\\Verifiable' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Verifiable.php', + 'PHPUnit\\Framework\\MockObject\\BadMethodCallException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Exception/BadMethodCallException.php', + 'PHPUnit\\Framework\\MockObject\\Builder\\Identity' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Builder/Identity.php', + 'PHPUnit\\Framework\\MockObject\\Builder\\InvocationMocker' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Builder/InvocationMocker.php', + 'PHPUnit\\Framework\\MockObject\\Builder\\Match' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Builder/Match.php', + 'PHPUnit\\Framework\\MockObject\\Builder\\MethodNameMatch' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Builder/MethodNameMatch.php', + 'PHPUnit\\Framework\\MockObject\\Builder\\NamespaceMatch' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Builder/NamespaceMatch.php', + 'PHPUnit\\Framework\\MockObject\\Builder\\ParametersMatch' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Builder/ParametersMatch.php', + 'PHPUnit\\Framework\\MockObject\\Builder\\Stub' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Builder/Stub.php', + 'PHPUnit\\Framework\\MockObject\\Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Exception/Exception.php', + 'PHPUnit\\Framework\\MockObject\\Generator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Generator.php', + 'PHPUnit\\Framework\\MockObject\\Invocation' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Invocation/Invocation.php', + 'PHPUnit\\Framework\\MockObject\\InvocationMocker' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/InvocationMocker.php', + 'PHPUnit\\Framework\\MockObject\\Invocation\\ObjectInvocation' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Invocation/ObjectInvocation.php', + 'PHPUnit\\Framework\\MockObject\\Invocation\\StaticInvocation' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Invocation/StaticInvocation.php', + 'PHPUnit\\Framework\\MockObject\\Invokable' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Invokable.php', + 'PHPUnit\\Framework\\MockObject\\Matcher' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Matcher.php', + 'PHPUnit\\Framework\\MockObject\\Matcher\\AnyInvokedCount' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Matcher/AnyInvokedCount.php', + 'PHPUnit\\Framework\\MockObject\\Matcher\\AnyParameters' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Matcher/AnyParameters.php', + 'PHPUnit\\Framework\\MockObject\\Matcher\\ConsecutiveParameters' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Matcher/ConsecutiveParameters.php', + 'PHPUnit\\Framework\\MockObject\\Matcher\\DeferredError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Matcher/DeferredError.php', + 'PHPUnit\\Framework\\MockObject\\Matcher\\Invocation' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Matcher/Invocation.php', + 'PHPUnit\\Framework\\MockObject\\Matcher\\InvokedAtIndex' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Matcher/InvokedAtIndex.php', + 'PHPUnit\\Framework\\MockObject\\Matcher\\InvokedAtLeastCount' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Matcher/InvokedAtLeastCount.php', + 'PHPUnit\\Framework\\MockObject\\Matcher\\InvokedAtLeastOnce' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Matcher/InvokedAtLeastOnce.php', + 'PHPUnit\\Framework\\MockObject\\Matcher\\InvokedAtMostCount' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Matcher/InvokedAtMostCount.php', + 'PHPUnit\\Framework\\MockObject\\Matcher\\InvokedCount' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Matcher/InvokedCount.php', + 'PHPUnit\\Framework\\MockObject\\Matcher\\InvokedRecorder' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Matcher/InvokedRecorder.php', + 'PHPUnit\\Framework\\MockObject\\Matcher\\MethodName' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Matcher/MethodName.php', + 'PHPUnit\\Framework\\MockObject\\Matcher\\Parameters' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Matcher/Parameters.php', + 'PHPUnit\\Framework\\MockObject\\Matcher\\StatelessInvocation' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Matcher/StatelessInvocation.php', + 'PHPUnit\\Framework\\MockObject\\MockBuilder' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/MockBuilder.php', + 'PHPUnit\\Framework\\MockObject\\MockObject' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/ForwardCompatibility/MockObject.php', + 'PHPUnit\\Framework\\MockObject\\RuntimeException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Exception/RuntimeException.php', + 'PHPUnit\\Framework\\MockObject\\Stub' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Stub.php', + 'PHPUnit\\Framework\\MockObject\\Stub\\ConsecutiveCalls' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Stub/ConsecutiveCalls.php', + 'PHPUnit\\Framework\\MockObject\\Stub\\Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Stub/Exception.php', + 'PHPUnit\\Framework\\MockObject\\Stub\\MatcherCollection' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Stub/MatcherCollection.php', + 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnArgument' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnArgument.php', + 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnCallback' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnCallback.php', + 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnReference' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnReference.php', + 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnSelf' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnSelf.php', + 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnStub' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnStub.php', + 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnValueMap' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnValueMap.php', + 'PHPUnit\\Framework\\MockObject\\Verifiable' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Verifiable.php', 'PHPUnit\\Framework\\OutputError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/OutputError.php', 'PHPUnit\\Framework\\RiskyTest' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/RiskyTest.php', 'PHPUnit\\Framework\\RiskyTestError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/RiskyTestError.php', @@ -1007,16 +1000,34 @@ class ComposerStaticInit598add4b9b35c76d3599603201ccdd6d 'PHPUnit\\Framework\\UnintentionallyCoveredCodeError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/UnintentionallyCoveredCodeError.php', 'PHPUnit\\Framework\\Warning' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Warning.php', 'PHPUnit\\Framework\\WarningTestCase' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/WarningTestCase.php', + 'PHPUnit\\Runner\\AfterIncompleteTestHook' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Hook/AfterIncompleteTestHook.php', + 'PHPUnit\\Runner\\AfterLastTestHook' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Hook/AfterLastTestHook.php', + 'PHPUnit\\Runner\\AfterRiskyTestHook' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Hook/AfterRiskyTestHook.php', + 'PHPUnit\\Runner\\AfterSkippedTestHook' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Hook/AfterSkippedTestHook.php', + 'PHPUnit\\Runner\\AfterSuccessfulTestHook' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Hook/AfterSuccessfulTestHook.php', + 'PHPUnit\\Runner\\AfterTestErrorHook' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Hook/AfterTestErrorHook.php', + 'PHPUnit\\Runner\\AfterTestFailureHook' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Hook/AfterTestFailureHook.php', + 'PHPUnit\\Runner\\AfterTestWarningHook' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Hook/AfterTestWarningHook.php', 'PHPUnit\\Runner\\BaseTestRunner' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/BaseTestRunner.php', + 'PHPUnit\\Runner\\BeforeFirstTestHook' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Hook/BeforeFirstTestHook.php', + 'PHPUnit\\Runner\\BeforeTestHook' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Hook/BeforeTestHook.php', 'PHPUnit\\Runner\\Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Exception.php', 'PHPUnit\\Runner\\Filter\\ExcludeGroupFilterIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Filter/ExcludeGroupFilterIterator.php', 'PHPUnit\\Runner\\Filter\\Factory' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Filter/Factory.php', 'PHPUnit\\Runner\\Filter\\GroupFilterIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Filter/GroupFilterIterator.php', 'PHPUnit\\Runner\\Filter\\IncludeGroupFilterIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Filter/IncludeGroupFilterIterator.php', 'PHPUnit\\Runner\\Filter\\NameFilterIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Filter/NameFilterIterator.php', + 'PHPUnit\\Runner\\Hook' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Hook/Hook.php', + 'PHPUnit\\Runner\\NullTestResultCache' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/NullTestResultCache.php', 'PHPUnit\\Runner\\PhptTestCase' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/PhptTestCase.php', + 'PHPUnit\\Runner\\ResultCacheExtension' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/ResultCacheExtension.php', 'PHPUnit\\Runner\\StandardTestSuiteLoader' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/StandardTestSuiteLoader.php', + 'PHPUnit\\Runner\\TestHook' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Hook/TestHook.php', + 'PHPUnit\\Runner\\TestListenerAdapter' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Hook/TestListenerAdapter.php', + 'PHPUnit\\Runner\\TestResultCache' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/TestResultCache.php', + 'PHPUnit\\Runner\\TestResultCacheInterface' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/TestResultCacheInterface.php', 'PHPUnit\\Runner\\TestSuiteLoader' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/TestSuiteLoader.php', + 'PHPUnit\\Runner\\TestSuiteSorter' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/TestSuiteSorter.php', 'PHPUnit\\Runner\\Version' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Version.php', 'PHPUnit\\TextUI\\Command' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Command.php', 'PHPUnit\\TextUI\\ResultPrinter' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/ResultPrinter.php', @@ -1025,7 +1036,7 @@ class ComposerStaticInit598add4b9b35c76d3599603201ccdd6d 'PHPUnit\\Util\\Configuration' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Configuration.php', 'PHPUnit\\Util\\ConfigurationGenerator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/ConfigurationGenerator.php', 'PHPUnit\\Util\\ErrorHandler' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/ErrorHandler.php', - 'PHPUnit\\Util\\Fileloader' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Fileloader.php', + 'PHPUnit\\Util\\FileLoader' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/FileLoader.php', 'PHPUnit\\Util\\Filesystem' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Filesystem.php', 'PHPUnit\\Util\\Filter' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Filter.php', 'PHPUnit\\Util\\Getopt' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Getopt.php', @@ -1040,18 +1051,19 @@ class ComposerStaticInit598add4b9b35c76d3599603201ccdd6d 'PHPUnit\\Util\\Printer' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Printer.php', 'PHPUnit\\Util\\RegularExpression' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/RegularExpression.php', 'PHPUnit\\Util\\Test' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Test.php', + 'PHPUnit\\Util\\TestDox\\CliTestDoxPrinter' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/TestDox/CliTestDoxPrinter.php', 'PHPUnit\\Util\\TestDox\\HtmlResultPrinter' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/TestDox/HtmlResultPrinter.php', 'PHPUnit\\Util\\TestDox\\NamePrettifier' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/TestDox/NamePrettifier.php', 'PHPUnit\\Util\\TestDox\\ResultPrinter' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/TestDox/ResultPrinter.php', + 'PHPUnit\\Util\\TestDox\\TestResult' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/TestDox/TestResult.php', 'PHPUnit\\Util\\TestDox\\TextResultPrinter' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/TestDox/TextResultPrinter.php', 'PHPUnit\\Util\\TestDox\\XmlResultPrinter' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/TestDox/XmlResultPrinter.php', 'PHPUnit\\Util\\TextTestListRenderer' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/TextTestListRenderer.php', 'PHPUnit\\Util\\Type' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Type.php', 'PHPUnit\\Util\\Xml' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Xml.php', 'PHPUnit\\Util\\XmlTestListRenderer' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/XmlTestListRenderer.php', - 'PHPUnit_Framework_MockObject_MockObject' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/MockObject.php', + 'PHPUnit_Framework_MockObject_MockObject' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/MockObject.php', 'PHP_Evaluator' => __DIR__ . '/..' . '/dompdf/dompdf/include/php_evaluator.cls.php', - 'PHP_Timer' => __DIR__ . '/..' . '/phpunit/php-timer/src/Timer.php', 'PHP_Token' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_TokenWithScope' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_TokenWithScopeAndVisibility' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', @@ -1061,9 +1073,7 @@ class ComposerStaticInit598add4b9b35c76d3599603201ccdd6d 'PHP_Token_ARRAY' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_ARRAY_CAST' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_AS' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_ASYNC' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_AT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_AWAIT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_BACKTICK' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_BAD_CHARACTER' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_BOOLEAN_AND' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', @@ -1087,7 +1097,6 @@ class ComposerStaticInit598add4b9b35c76d3599603201ccdd6d 'PHP_Token_COLON' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_COMMA' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_COMMENT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_COMPILER_HALT_OFFSET' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_CONCAT_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_CONST' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_CONSTANT_ENCAPSED_STRING' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', @@ -1122,9 +1131,7 @@ class ComposerStaticInit598add4b9b35c76d3599603201ccdd6d 'PHP_Token_ENDSWITCH' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_ENDWHILE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_END_HEREDOC' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_ENUM' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_EQUALS' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_EVAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_EXCLAMATION_MARK' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_EXIT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', @@ -1142,7 +1149,6 @@ class ComposerStaticInit598add4b9b35c76d3599603201ccdd6d 'PHP_Token_HALT_COMPILER' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_IF' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_IMPLEMENTS' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_IN' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_INC' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_INCLUDE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_INCLUDE_ONCE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', @@ -1159,10 +1165,6 @@ class ComposerStaticInit598add4b9b35c76d3599603201ccdd6d 'PHP_Token_IS_NOT_IDENTICAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_IS_SMALLER_OR_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_Includes' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_JOIN' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_LAMBDA_ARROW' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_LAMBDA_CP' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_LAMBDA_OP' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_LINE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_LIST' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_LNUMBER' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', @@ -1180,11 +1182,9 @@ class ComposerStaticInit598add4b9b35c76d3599603201ccdd6d 'PHP_Token_NEW' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_NS_C' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_NS_SEPARATOR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_NULLSAFE_OBJECT_OPERATOR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_NUM_STRING' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_OBJECT_CAST' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_OBJECT_OPERATOR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_ONUMBER' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_OPEN_BRACKET' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_OPEN_CURLY' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_OPEN_SQUARE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', @@ -1207,7 +1207,6 @@ class ComposerStaticInit598add4b9b35c76d3599603201ccdd6d 'PHP_Token_REQUIRE_ONCE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_RETURN' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_SEMICOLON' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_SHAPE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_SL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_SL_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_SPACESHIP' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', @@ -1218,7 +1217,6 @@ class ComposerStaticInit598add4b9b35c76d3599603201ccdd6d 'PHP_Token_STRING' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_STRING_CAST' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_STRING_VARNAME' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_SUPER' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_SWITCH' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_Stream' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token/Stream.php', 'PHP_Token_Stream_CachingFactory' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token/Stream/CachingFactory.php', @@ -1227,34 +1225,20 @@ class ComposerStaticInit598add4b9b35c76d3599603201ccdd6d 'PHP_Token_TRAIT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_TRAIT_C' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_TRY' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_TYPE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_TYPELIST_GT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_TYPELIST_LT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_UNSET' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_UNSET_CAST' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_USE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_USE_FUNCTION' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_VAR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_VARIABLE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_WHERE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_WHILE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_WHITESPACE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_XHP_ATTRIBUTE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_XHP_CATEGORY' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_XHP_CATEGORY_LABEL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_XHP_CHILDREN' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_XHP_LABEL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_XHP_REQUIRED' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_XHP_TAG_GT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_XHP_TAG_LT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_XHP_TEXT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_XOR_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_YIELD' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'PHP_Token_YIELD_FROM' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', 'Page_Cache' => __DIR__ . '/..' . '/dompdf/dompdf/include/page_cache.cls.php', 'Page_Frame_Decorator' => __DIR__ . '/..' . '/dompdf/dompdf/include/page_frame_decorator.cls.php', 'Page_Frame_Reflower' => __DIR__ . '/..' . '/dompdf/dompdf/include/page_frame_reflower.cls.php', - 'ParseError' => __DIR__ . '/..' . '/symfony/polyfill-php70/Resources/stubs/ParseError.php', 'PharIo\\Manifest\\Application' => __DIR__ . '/..' . '/phar-io/manifest/src/values/Application.php', 'PharIo\\Manifest\\ApplicationName' => __DIR__ . '/..' . '/phar-io/manifest/src/values/ApplicationName.php', 'PharIo\\Manifest\\Author' => __DIR__ . '/..' . '/phar-io/manifest/src/values/Author.php', @@ -1304,20 +1288,21 @@ class ComposerStaticInit598add4b9b35c76d3599603201ccdd6d 'PharIo\\Manifest\\RequiresElement' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/RequiresElement.php', 'PharIo\\Manifest\\Type' => __DIR__ . '/..' . '/phar-io/manifest/src/values/Type.php', 'PharIo\\Manifest\\Url' => __DIR__ . '/..' . '/phar-io/manifest/src/values/Url.php', - 'PharIo\\Version\\AbstractVersionConstraint' => __DIR__ . '/..' . '/phar-io/version/src/AbstractVersionConstraint.php', - 'PharIo\\Version\\AndVersionConstraintGroup' => __DIR__ . '/..' . '/phar-io/version/src/AndVersionConstraintGroup.php', - 'PharIo\\Version\\AnyVersionConstraint' => __DIR__ . '/..' . '/phar-io/version/src/AnyVersionConstraint.php', - 'PharIo\\Version\\ExactVersionConstraint' => __DIR__ . '/..' . '/phar-io/version/src/ExactVersionConstraint.php', - 'PharIo\\Version\\Exception' => __DIR__ . '/..' . '/phar-io/version/src/Exception.php', - 'PharIo\\Version\\GreaterThanOrEqualToVersionConstraint' => __DIR__ . '/..' . '/phar-io/version/src/GreaterThanOrEqualToVersionConstraint.php', - 'PharIo\\Version\\InvalidVersionException' => __DIR__ . '/..' . '/phar-io/version/src/InvalidVersionException.php', - 'PharIo\\Version\\OrVersionConstraintGroup' => __DIR__ . '/..' . '/phar-io/version/src/OrVersionConstraintGroup.php', + 'PharIo\\Version\\AbstractVersionConstraint' => __DIR__ . '/..' . '/phar-io/version/src/constraints/AbstractVersionConstraint.php', + 'PharIo\\Version\\AndVersionConstraintGroup' => __DIR__ . '/..' . '/phar-io/version/src/constraints/AndVersionConstraintGroup.php', + 'PharIo\\Version\\AnyVersionConstraint' => __DIR__ . '/..' . '/phar-io/version/src/constraints/AnyVersionConstraint.php', + 'PharIo\\Version\\ExactVersionConstraint' => __DIR__ . '/..' . '/phar-io/version/src/constraints/ExactVersionConstraint.php', + 'PharIo\\Version\\Exception' => __DIR__ . '/..' . '/phar-io/version/src/exceptions/Exception.php', + 'PharIo\\Version\\GreaterThanOrEqualToVersionConstraint' => __DIR__ . '/..' . '/phar-io/version/src/constraints/GreaterThanOrEqualToVersionConstraint.php', + 'PharIo\\Version\\InvalidPreReleaseSuffixException' => __DIR__ . '/..' . '/phar-io/version/src/exceptions/InvalidPreReleaseSuffixException.php', + 'PharIo\\Version\\InvalidVersionException' => __DIR__ . '/..' . '/phar-io/version/src/exceptions/InvalidVersionException.php', + 'PharIo\\Version\\OrVersionConstraintGroup' => __DIR__ . '/..' . '/phar-io/version/src/constraints/OrVersionConstraintGroup.php', 'PharIo\\Version\\PreReleaseSuffix' => __DIR__ . '/..' . '/phar-io/version/src/PreReleaseSuffix.php', - 'PharIo\\Version\\SpecificMajorAndMinorVersionConstraint' => __DIR__ . '/..' . '/phar-io/version/src/SpecificMajorAndMinorVersionConstraint.php', - 'PharIo\\Version\\SpecificMajorVersionConstraint' => __DIR__ . '/..' . '/phar-io/version/src/SpecificMajorVersionConstraint.php', - 'PharIo\\Version\\UnsupportedVersionConstraintException' => __DIR__ . '/..' . '/phar-io/version/src/UnsupportedVersionConstraintException.php', + 'PharIo\\Version\\SpecificMajorAndMinorVersionConstraint' => __DIR__ . '/..' . '/phar-io/version/src/constraints/SpecificMajorAndMinorVersionConstraint.php', + 'PharIo\\Version\\SpecificMajorVersionConstraint' => __DIR__ . '/..' . '/phar-io/version/src/constraints/SpecificMajorVersionConstraint.php', + 'PharIo\\Version\\UnsupportedVersionConstraintException' => __DIR__ . '/..' . '/phar-io/version/src/exceptions/UnsupportedVersionConstraintException.php', 'PharIo\\Version\\Version' => __DIR__ . '/..' . '/phar-io/version/src/Version.php', - 'PharIo\\Version\\VersionConstraint' => __DIR__ . '/..' . '/phar-io/version/src/VersionConstraint.php', + 'PharIo\\Version\\VersionConstraint' => __DIR__ . '/..' . '/phar-io/version/src/constraints/VersionConstraint.php', 'PharIo\\Version\\VersionConstraintParser' => __DIR__ . '/..' . '/phar-io/version/src/VersionConstraintParser.php', 'PharIo\\Version\\VersionConstraintValue' => __DIR__ . '/..' . '/phar-io/version/src/VersionConstraintValue.php', 'PharIo\\Version\\VersionNumber' => __DIR__ . '/..' . '/phar-io/version/src/VersionNumber.php', @@ -1326,7 +1311,6 @@ class ComposerStaticInit598add4b9b35c76d3599603201ccdd6d 'SebastianBergmann\\CodeCoverage\\CodeCoverage' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/CodeCoverage.php', 'SebastianBergmann\\CodeCoverage\\CoveredCodeNotExecutedException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/CoveredCodeNotExecutedException.php', 'SebastianBergmann\\CodeCoverage\\Driver\\Driver' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Driver/Driver.php', - 'SebastianBergmann\\CodeCoverage\\Driver\\HHVM' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Driver/HHVM.php', 'SebastianBergmann\\CodeCoverage\\Driver\\PHPDBG' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Driver/PHPDBG.php', 'SebastianBergmann\\CodeCoverage\\Driver\\Xdebug' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Driver/Xdebug.php', 'SebastianBergmann\\CodeCoverage\\Exception' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/Exception.php', @@ -1381,6 +1365,7 @@ class ComposerStaticInit598add4b9b35c76d3599603201ccdd6d 'SebastianBergmann\\Comparator\\SplObjectStorageComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/SplObjectStorageComparator.php', 'SebastianBergmann\\Comparator\\TypeComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/TypeComparator.php', 'SebastianBergmann\\Diff\\Chunk' => __DIR__ . '/..' . '/sebastian/diff/src/Chunk.php', + 'SebastianBergmann\\Diff\\ConfigurationException' => __DIR__ . '/..' . '/sebastian/diff/src/Exception/ConfigurationException.php', 'SebastianBergmann\\Diff\\Diff' => __DIR__ . '/..' . '/sebastian/diff/src/Diff.php', 'SebastianBergmann\\Diff\\Differ' => __DIR__ . '/..' . '/sebastian/diff/src/Differ.php', 'SebastianBergmann\\Diff\\Exception' => __DIR__ . '/..' . '/sebastian/diff/src/Exception/Exception.php', @@ -1391,6 +1376,7 @@ class ComposerStaticInit598add4b9b35c76d3599603201ccdd6d 'SebastianBergmann\\Diff\\Output\\AbstractChunkOutputBuilder' => __DIR__ . '/..' . '/sebastian/diff/src/Output/AbstractChunkOutputBuilder.php', 'SebastianBergmann\\Diff\\Output\\DiffOnlyOutputBuilder' => __DIR__ . '/..' . '/sebastian/diff/src/Output/DiffOnlyOutputBuilder.php', 'SebastianBergmann\\Diff\\Output\\DiffOutputBuilderInterface' => __DIR__ . '/..' . '/sebastian/diff/src/Output/DiffOutputBuilderInterface.php', + 'SebastianBergmann\\Diff\\Output\\StrictUnifiedDiffOutputBuilder' => __DIR__ . '/..' . '/sebastian/diff/src/Output/StrictUnifiedDiffOutputBuilder.php', 'SebastianBergmann\\Diff\\Output\\UnifiedDiffOutputBuilder' => __DIR__ . '/..' . '/sebastian/diff/src/Output/UnifiedDiffOutputBuilder.php', 'SebastianBergmann\\Diff\\Parser' => __DIR__ . '/..' . '/sebastian/diff/src/Parser.php', 'SebastianBergmann\\Diff\\TimeEfficientLongestCommonSubsequenceCalculator' => __DIR__ . '/..' . '/sebastian/diff/src/TimeEfficientLongestCommonSubsequenceCalculator.php', @@ -1398,6 +1384,9 @@ class ComposerStaticInit598add4b9b35c76d3599603201ccdd6d 'SebastianBergmann\\Environment\\OperatingSystem' => __DIR__ . '/..' . '/sebastian/environment/src/OperatingSystem.php', 'SebastianBergmann\\Environment\\Runtime' => __DIR__ . '/..' . '/sebastian/environment/src/Runtime.php', 'SebastianBergmann\\Exporter\\Exporter' => __DIR__ . '/..' . '/sebastian/exporter/src/Exporter.php', + 'SebastianBergmann\\FileIterator\\Facade' => __DIR__ . '/..' . '/phpunit/php-file-iterator/src/Facade.php', + 'SebastianBergmann\\FileIterator\\Factory' => __DIR__ . '/..' . '/phpunit/php-file-iterator/src/Factory.php', + 'SebastianBergmann\\FileIterator\\Iterator' => __DIR__ . '/..' . '/phpunit/php-file-iterator/src/Iterator.php', 'SebastianBergmann\\GlobalState\\Blacklist' => __DIR__ . '/..' . '/sebastian/global-state/src/Blacklist.php', 'SebastianBergmann\\GlobalState\\CodeExporter' => __DIR__ . '/..' . '/sebastian/global-state/src/CodeExporter.php', 'SebastianBergmann\\GlobalState\\Exception' => __DIR__ . '/..' . '/sebastian/global-state/src/exceptions/Exception.php', @@ -1414,8 +1403,10 @@ class ComposerStaticInit598add4b9b35c76d3599603201ccdd6d 'SebastianBergmann\\RecursionContext\\Exception' => __DIR__ . '/..' . '/sebastian/recursion-context/src/Exception.php', 'SebastianBergmann\\RecursionContext\\InvalidArgumentException' => __DIR__ . '/..' . '/sebastian/recursion-context/src/InvalidArgumentException.php', 'SebastianBergmann\\ResourceOperations\\ResourceOperations' => __DIR__ . '/..' . '/sebastian/resource-operations/src/ResourceOperations.php', + 'SebastianBergmann\\Timer\\Exception' => __DIR__ . '/..' . '/phpunit/php-timer/src/Exception.php', + 'SebastianBergmann\\Timer\\RuntimeException' => __DIR__ . '/..' . '/phpunit/php-timer/src/RuntimeException.php', + 'SebastianBergmann\\Timer\\Timer' => __DIR__ . '/..' . '/phpunit/php-timer/src/Timer.php', 'SebastianBergmann\\Version' => __DIR__ . '/..' . '/sebastian/version/src/Version.php', - 'SessionUpdateTimestampHandlerInterface' => __DIR__ . '/..' . '/symfony/polyfill-php70/Resources/stubs/SessionUpdateTimestampHandlerInterface.php', 'Style' => __DIR__ . '/..' . '/dompdf/dompdf/include/style.cls.php', 'Stylesheet' => __DIR__ . '/..' . '/dompdf/dompdf/include/stylesheet.cls.php', 'TCPDF_Adapter' => __DIR__ . '/..' . '/dompdf/dompdf/include/tcpdf_adapter.cls.php', @@ -1432,7 +1423,6 @@ class ComposerStaticInit598add4b9b35c76d3599603201ccdd6d 'Table_Row_Group_Renderer' => __DIR__ . '/..' . '/dompdf/dompdf/include/table_row_group_renderer.cls.php', 'Table_Row_Positioner' => __DIR__ . '/..' . '/dompdf/dompdf/include/table_row_positioner.cls.php', 'TestCase' => __DIR__ . '/../..' . '/tests/TestCase.php', - 'Tests\\DuskTestCase' => __DIR__ . '/../..' . '/tests/DuskTestCase.php', 'Text_Frame_Decorator' => __DIR__ . '/..' . '/dompdf/dompdf/include/text_frame_decorator.cls.php', 'Text_Frame_Reflower' => __DIR__ . '/..' . '/dompdf/dompdf/include/text_frame_reflower.cls.php', 'Text_Renderer' => __DIR__ . '/..' . '/dompdf/dompdf/include/text_renderer.cls.php', @@ -1445,7 +1435,6 @@ class ComposerStaticInit598add4b9b35c76d3599603201ccdd6d 'TheSeer\\Tokenizer\\TokenCollectionException' => __DIR__ . '/..' . '/theseer/tokenizer/src/TokenCollectionException.php', 'TheSeer\\Tokenizer\\Tokenizer' => __DIR__ . '/..' . '/theseer/tokenizer/src/Tokenizer.php', 'TheSeer\\Tokenizer\\XMLSerializer' => __DIR__ . '/..' . '/theseer/tokenizer/src/XMLSerializer.php', - 'TypeError' => __DIR__ . '/..' . '/symfony/polyfill-php70/Resources/stubs/TypeError.php', 'Version1079table' => __DIR__ . '/../..' . '/database/migrations/2016_06_28_141613_version1079table.php', ); @@ -1454,7 +1443,6 @@ class ComposerStaticInit598add4b9b35c76d3599603201ccdd6d return \Closure::bind(function () use ($loader) { $loader->prefixLengthsPsr4 = ComposerStaticInit598add4b9b35c76d3599603201ccdd6d::$prefixLengthsPsr4; $loader->prefixDirsPsr4 = ComposerStaticInit598add4b9b35c76d3599603201ccdd6d::$prefixDirsPsr4; - $loader->fallbackDirsPsr4 = ComposerStaticInit598add4b9b35c76d3599603201ccdd6d::$fallbackDirsPsr4; $loader->prefixesPsr0 = ComposerStaticInit598add4b9b35c76d3599603201ccdd6d::$prefixesPsr0; $loader->classMap = ComposerStaticInit598add4b9b35c76d3599603201ccdd6d::$classMap; diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json index 10fcc81d3..b8e86dc4f 100644 --- a/vendor/composer/installed.json +++ b/vendor/composer/installed.json @@ -83,27 +83,46 @@ }, { "name": "barryvdh/laravel-debugbar", - "version": "v2.4.3", - "version_normalized": "2.4.3.0", + "version": "v3.1.5", + "version_normalized": "3.1.5.0", "source": { "type": "git", "url": "https://github.com/barryvdh/laravel-debugbar.git", - "reference": "d7c88f08131f6404cb714f3f6cf0642f6afa3903" + "reference": "d3cdca2ad6cc6e67735b4a63e7551c690a497f5f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/d7c88f08131f6404cb714f3f6cf0642f6afa3903", - "reference": "d7c88f08131f6404cb714f3f6cf0642f6afa3903", + "url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/d3cdca2ad6cc6e67735b4a63e7551c690a497f5f", + "reference": "d3cdca2ad6cc6e67735b4a63e7551c690a497f5f", "shasum": "" }, "require": { - "illuminate/support": "5.1.*|5.2.*|5.3.*|5.4.*|5.5.*", - "maximebf/debugbar": "~1.13.0", - "php": ">=5.5.9", - "symfony/finder": "~2.7|~3.0" + "illuminate/routing": "5.5.x|5.6.x", + "illuminate/session": "5.5.x|5.6.x", + "illuminate/support": "5.5.x|5.6.x", + "maximebf/debugbar": "~1.15.0", + "php": ">=7.0", + "symfony/debug": "^3|^4", + "symfony/finder": "^3|^4" }, - "time": "2017-07-21T11:56:48+00:00", + "require-dev": { + "illuminate/framework": "5.5.x" + }, + "time": "2018-05-03T18:27:04+00:00", "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.2-dev" + }, + "laravel": { + "providers": [ + "Barryvdh\\Debugbar\\ServiceProvider" + ], + "aliases": { + "Debugbar": "Barryvdh\\Debugbar\\Facade" + } + } + }, "installation-source": "dist", "autoload": { "psr-4": { @@ -998,6 +1017,57 @@ "description": "DOMPDF is a CSS 2.1 compliant HTML to PDF converter", "homepage": "https://github.com/dompdf/dompdf" }, + { + "name": "dragonmantank/cron-expression", + "version": "v2.2.0", + "version_normalized": "2.2.0.0", + "source": { + "type": "git", + "url": "https://github.com/dragonmantank/cron-expression.git", + "reference": "92a2c3768d50e21a1f26a53cb795ce72806266c5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/92a2c3768d50e21a1f26a53cb795ce72806266c5", + "reference": "92a2c3768d50e21a1f26a53cb795ce72806266c5", + "shasum": "" + }, + "require": { + "php": ">=7.0.0" + }, + "require-dev": { + "phpunit/phpunit": "~6.4" + }, + "time": "2018-06-06T03:12:17+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Cron\\": "src/Cron/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Chris Tankersley", + "email": "chris@ctankersley.com", + "homepage": "https://github.com/dragonmantank" + } + ], + "description": "CRON for PHP: Calculate the next or previous run date and determine if a CRON expression is due", + "keywords": [ + "cron", + "schedule" + ] + }, { "name": "egulias/email-validator", "version": "2.1.4", @@ -1908,37 +1978,37 @@ }, { "name": "laravel/dusk", - "version": "v2.0.0", - "version_normalized": "2.0.0.0", + "version": "v3.0.9", + "version_normalized": "3.0.9.0", "source": { "type": "git", "url": "https://github.com/laravel/dusk.git", - "reference": "7f75d602dd6d59311ff46777eff44fa14d39e5af" + "reference": "48215ab0028d759e5fd7cc8989f4b6c58050841d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/dusk/zipball/7f75d602dd6d59311ff46777eff44fa14d39e5af", - "reference": "7f75d602dd6d59311ff46777eff44fa14d39e5af", + "url": "https://api.github.com/repos/laravel/dusk/zipball/48215ab0028d759e5fd7cc8989f4b6c58050841d", + "reference": "48215ab0028d759e5fd7cc8989f4b6c58050841d", "shasum": "" }, "require": { - "facebook/webdriver": "~1.0", - "illuminate/console": "~5.5", - "illuminate/support": "~5.5", + "facebook/webdriver": "~1.3", + "illuminate/console": "~5.6", + "illuminate/support": "~5.6", "nesbot/carbon": "~1.20", - "php": ">=5.6.4", - "symfony/console": "~3.2", - "symfony/process": "~3.2" + "php": ">=7.1.0", + "symfony/console": "~4.0", + "symfony/process": "~4.0" }, "require-dev": { - "mockery/mockery": "^0.9.6", - "phpunit/phpunit": "^5.7" + "mockery/mockery": "~1.0", + "phpunit/phpunit": "~7.0" }, - "time": "2017-08-28T10:03:58+00:00", + "time": "2018-06-20T13:47:27+00:00", "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0-dev" + "dev-master": "4.0-dev" }, "laravel": { "providers": [ @@ -1971,44 +2041,47 @@ }, { "name": "laravel/framework", - "version": "v5.5.41", - "version_normalized": "5.5.41.0", + "version": "v5.6.29", + "version_normalized": "5.6.29.0", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "a2c54e6e69035111fa2709f9cdac55be811feb6b" + "reference": "acc6b5c54ab196d3358f60acc5f55d9ebaaccc02" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/a2c54e6e69035111fa2709f9cdac55be811feb6b", - "reference": "a2c54e6e69035111fa2709f9cdac55be811feb6b", + "url": "https://api.github.com/repos/laravel/framework/zipball/acc6b5c54ab196d3358f60acc5f55d9ebaaccc02", + "reference": "acc6b5c54ab196d3358f60acc5f55d9ebaaccc02", "shasum": "" }, "require": { "doctrine/inflector": "~1.1", + "dragonmantank/cron-expression": "~2.0", "erusev/parsedown": "~1.7", "ext-mbstring": "*", "ext-openssl": "*", "league/flysystem": "^1.0.8", "monolog/monolog": "~1.12", - "mtdowling/cron-expression": "~1.0", - "nesbot/carbon": "^1.24.1", - "php": ">=7.0", + "nesbot/carbon": "1.25.*", + "php": "^7.1.3", "psr/container": "~1.0", "psr/simple-cache": "^1.0", - "ramsey/uuid": "~3.0", + "ramsey/uuid": "^3.7", "swiftmailer/swiftmailer": "~6.0", - "symfony/console": "~3.3", - "symfony/debug": "~3.3", - "symfony/finder": "~3.3", - "symfony/http-foundation": "~3.3", - "symfony/http-kernel": "~3.3", - "symfony/process": "~3.3", - "symfony/routing": "~3.3", - "symfony/var-dumper": "~3.3", - "tijsverkoyen/css-to-inline-styles": "~2.2", + "symfony/console": "~4.0", + "symfony/debug": "~4.0", + "symfony/finder": "~4.0", + "symfony/http-foundation": "~4.0", + "symfony/http-kernel": "~4.0", + "symfony/process": "~4.0", + "symfony/routing": "~4.0", + "symfony/var-dumper": "~4.0", + "tijsverkoyen/css-to-inline-styles": "^2.2.1", "vlucas/phpdotenv": "~2.2" }, + "conflict": { + "tightenco/collect": "<5.5.33" + }, "replace": { "illuminate/auth": "self.version", "illuminate/broadcasting": "self.version", @@ -2037,45 +2110,47 @@ "illuminate/support": "self.version", "illuminate/translation": "self.version", "illuminate/validation": "self.version", - "illuminate/view": "self.version", - "tightenco/collect": "<5.5.33" + "illuminate/view": "self.version" }, "require-dev": { "aws/aws-sdk-php": "~3.0", - "doctrine/dbal": "~2.5", + "doctrine/dbal": "~2.6", "filp/whoops": "^2.1.4", + "league/flysystem-cached-adapter": "~1.0", "mockery/mockery": "~1.0", - "orchestra/testbench-core": "3.5.*", + "moontoast/math": "^1.1", + "orchestra/testbench-core": "3.6.*", "pda/pheanstalk": "~3.0", - "phpunit/phpunit": "~6.0", + "phpunit/phpunit": "~7.0", "predis/predis": "^1.1.1", - "symfony/css-selector": "~3.3", - "symfony/dom-crawler": "~3.3" + "symfony/css-selector": "~4.0", + "symfony/dom-crawler": "~4.0" }, "suggest": { "aws/aws-sdk-php": "Required to use the SQS queue driver and SES mail driver (~3.0).", - "doctrine/dbal": "Required to rename columns and drop SQLite columns (~2.5).", + "doctrine/dbal": "Required to rename columns and drop SQLite columns (~2.6).", "ext-pcntl": "Required to use all features of the queue worker.", "ext-posix": "Required to use all features of the queue worker.", "fzaninotto/faker": "Required to use the eloquent factory builder (~1.4).", "guzzlehttp/guzzle": "Required to use the Mailgun and Mandrill mail drivers and the ping methods on schedules (~6.0).", "laravel/tinker": "Required to use the tinker console command (~1.0).", "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (~1.0).", - "league/flysystem-cached-adapter": "Required to use Flysystem caching (~1.0).", + "league/flysystem-cached-adapter": "Required to use the Flysystem cache (~1.0).", "league/flysystem-rackspace": "Required to use the Flysystem Rackspace driver (~1.0).", + "league/flysystem-sftp": "Required to use the Flysystem SFTP driver (~1.0).", "nexmo/client": "Required to use the Nexmo transport (~1.0).", "pda/pheanstalk": "Required to use the beanstalk queue driver (~3.0).", "predis/predis": "Required to use the redis cache and queue drivers (~1.0).", "pusher/pusher-php-server": "Required to use the Pusher broadcast driver (~3.0).", - "symfony/css-selector": "Required to use some of the crawler integration testing tools (~3.3).", - "symfony/dom-crawler": "Required to use most of the crawler integration testing tools (~3.3).", + "symfony/css-selector": "Required to use some of the crawler integration testing tools (~4.0).", + "symfony/dom-crawler": "Required to use most of the crawler integration testing tools (~4.0).", "symfony/psr-http-message-bridge": "Required to psr7 bridging features (~1.0)." }, - "time": "2018-08-01T13:48:57+00:00", + "time": "2018-07-26T16:01:26+00:00", "type": "library", "extra": { "branch-alias": { - "dev-master": "5.5-dev" + "dev-master": "5.6-dev" } }, "installation-source": "dist", @@ -2163,37 +2238,37 @@ }, { "name": "laravelcollective/html", - "version": "v5.5.4", - "version_normalized": "5.5.4.0", + "version": "v5.6.10", + "version_normalized": "5.6.10.0", "source": { "type": "git", "url": "https://github.com/LaravelCollective/html.git", - "reference": "04c596a69975b901f2223eb6eb4adf55354121c2" + "reference": "974605fcd22a7e4d19f0b2ef635a0d1d7400387d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/LaravelCollective/html/zipball/04c596a69975b901f2223eb6eb4adf55354121c2", - "reference": "04c596a69975b901f2223eb6eb4adf55354121c2", + "url": "https://api.github.com/repos/LaravelCollective/html/zipball/974605fcd22a7e4d19f0b2ef635a0d1d7400387d", + "reference": "974605fcd22a7e4d19f0b2ef635a0d1d7400387d", "shasum": "" }, "require": { - "illuminate/http": "5.5.*", - "illuminate/routing": "5.5.*", - "illuminate/session": "5.5.*", - "illuminate/support": "5.5.*", - "illuminate/view": "5.5.*", - "php": ">=7.0.0" + "illuminate/http": "5.6.*", + "illuminate/routing": "5.6.*", + "illuminate/session": "5.6.*", + "illuminate/support": "5.6.*", + "illuminate/view": "5.6.*", + "php": ">=7.1.3" }, "require-dev": { - "illuminate/database": "5.5.*", - "mockery/mockery": "~0.9.4", - "phpunit/phpunit": "~5.4" + "illuminate/database": "5.6.*", + "mockery/mockery": "~1.0", + "phpunit/phpunit": "~7.1" }, - "time": "2018-03-24T00:39:21+00:00", + "time": "2018-06-18T15:04:16+00:00", "type": "library", "extra": { "branch-alias": { - "dev-master": "5.5-dev" + "dev-master": "5.6-dev" }, "laravel": { "providers": [ @@ -2590,23 +2665,23 @@ }, { "name": "maximebf/debugbar", - "version": "1.13.1", - "version_normalized": "1.13.1.0", + "version": "v1.15.0", + "version_normalized": "1.15.0.0", "source": { "type": "git", "url": "https://github.com/maximebf/php-debugbar.git", - "reference": "afee79a236348e39a44cb837106b7c5b4897ac2a" + "reference": "30e7d60937ee5f1320975ca9bc7bcdd44d500f07" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/maximebf/php-debugbar/zipball/afee79a236348e39a44cb837106b7c5b4897ac2a", - "reference": "afee79a236348e39a44cb837106b7c5b4897ac2a", + "url": "https://api.github.com/repos/maximebf/php-debugbar/zipball/30e7d60937ee5f1320975ca9bc7bcdd44d500f07", + "reference": "30e7d60937ee5f1320975ca9bc7bcdd44d500f07", "shasum": "" }, "require": { "php": ">=5.3.0", "psr/log": "^1.0", - "symfony/var-dumper": "^2.6|^3.0" + "symfony/var-dumper": "^2.6|^3.0|^4.0" }, "require-dev": { "phpunit/phpunit": "^4.0|^5.0" @@ -2616,11 +2691,11 @@ "monolog/monolog": "Log using Monolog", "predis/predis": "Redis storage" }, - "time": "2017-01-05T08:46:19+00:00", + "time": "2017-12-15T11:13:46+00:00", "type": "library", "extra": { "branch-alias": { - "dev-master": "1.13-dev" + "dev-master": "1.14-dev" } }, "installation-source": "dist", @@ -2776,52 +2851,6 @@ "url" ] }, - { - "name": "mtdowling/cron-expression", - "version": "v1.2.1", - "version_normalized": "1.2.1.0", - "source": { - "type": "git", - "url": "https://github.com/mtdowling/cron-expression.git", - "reference": "9504fa9ea681b586028adaaa0877db4aecf32bad" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/mtdowling/cron-expression/zipball/9504fa9ea681b586028adaaa0877db4aecf32bad", - "reference": "9504fa9ea681b586028adaaa0877db4aecf32bad", - "shasum": "" - }, - "require": { - "php": ">=5.3.2" - }, - "require-dev": { - "phpunit/phpunit": "~4.0|~5.0" - }, - "time": "2017-01-23T04:29:33+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "Cron\\": "src/Cron/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - } - ], - "description": "CRON for PHP: Calculate the next or previous run date and determine if a CRON expression is due", - "keywords": [ - "cron", - "schedule" - ] - }, { "name": "mtdowling/jmespath.php", "version": "2.4.0", @@ -3032,17 +3061,17 @@ }, { "name": "nesbot/carbon", - "version": "1.32.0", - "version_normalized": "1.32.0.0", + "version": "1.25.0", + "version_normalized": "1.25.0.0", "source": { "type": "git", "url": "https://github.com/briannesbitt/Carbon.git", - "reference": "64563e2b9f69e4db1b82a60e81efa327a30ff343" + "reference": "cbcf13da0b531767e39eb86e9687f5deba9857b4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/64563e2b9f69e4db1b82a60e81efa327a30ff343", - "reference": "64563e2b9f69e4db1b82a60e81efa327a30ff343", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/cbcf13da0b531767e39eb86e9687f5deba9857b4", + "reference": "cbcf13da0b531767e39eb86e9687f5deba9857b4", "shasum": "" }, "require": { @@ -3053,19 +3082,17 @@ "friendsofphp/php-cs-fixer": "~2", "phpunit/phpunit": "^4.8.35 || ^5.7" }, - "time": "2018-07-05T06:59:26+00:00", + "time": "2018-03-19T15:50:49+00:00", "type": "library", "extra": { - "laravel": { - "providers": [ - "Carbon\\Laravel\\ServiceProvider" - ] + "branch-alias": { + "dev-master": "1.23-dev" } }, "installation-source": "dist", "autoload": { "psr-4": { - "": "src/" + "Carbon\\": "src/Carbon/" } }, "notification-url": "https://packagist.org/downloads/", @@ -3190,36 +3217,32 @@ }, { "name": "paragonie/random_compat", - "version": "v2.0.17", - "version_normalized": "2.0.17.0", + "version": "v9.99.99", + "version_normalized": "9.99.99.0", "source": { "type": "git", "url": "https://github.com/paragonie/random_compat.git", - "reference": "29af24f25bab834fcbb38ad2a69fa93b867e070d" + "reference": "84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/paragonie/random_compat/zipball/29af24f25bab834fcbb38ad2a69fa93b867e070d", - "reference": "29af24f25bab834fcbb38ad2a69fa93b867e070d", + "url": "https://api.github.com/repos/paragonie/random_compat/zipball/84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95", + "reference": "84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95", "shasum": "" }, "require": { - "php": ">=5.2.0" + "php": "^7" }, "require-dev": { - "phpunit/phpunit": "4.*|5.*" + "phpunit/phpunit": "4.*|5.*", + "vimeo/psalm": "^1" }, "suggest": { "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes." }, - "time": "2018-07-04T16:31:37+00:00", + "time": "2018-07-02T15:55:56+00:00", "type": "library", "installation-source": "dist", - "autoload": { - "files": [ - "lib/random.php" - ] - }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" @@ -3241,26 +3264,26 @@ }, { "name": "phar-io/manifest", - "version": "1.0.1", - "version_normalized": "1.0.1.0", + "version": "1.0.3", + "version_normalized": "1.0.3.0", "source": { "type": "git", "url": "https://github.com/phar-io/manifest.git", - "reference": "2df402786ab5368a0169091f61a7c1e0eb6852d0" + "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phar-io/manifest/zipball/2df402786ab5368a0169091f61a7c1e0eb6852d0", - "reference": "2df402786ab5368a0169091f61a7c1e0eb6852d0", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/7761fcacf03b4d4f16e7ccb606d4879ca431fcf4", + "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4", "shasum": "" }, "require": { "ext-dom": "*", "ext-phar": "*", - "phar-io/version": "^1.0.1", + "phar-io/version": "^2.0", "php": "^5.6 || ^7.0" }, - "time": "2017-03-05T18:14:27+00:00", + "time": "2018-07-08T19:23:20+00:00", "type": "library", "extra": { "branch-alias": { @@ -3298,23 +3321,23 @@ }, { "name": "phar-io/version", - "version": "1.0.1", - "version_normalized": "1.0.1.0", + "version": "2.0.1", + "version_normalized": "2.0.1.0", "source": { "type": "git", "url": "https://github.com/phar-io/version.git", - "reference": "a70c0ced4be299a63d32fa96d9281d03e94041df" + "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phar-io/version/zipball/a70c0ced4be299a63d32fa96d9281d03e94041df", - "reference": "a70c0ced4be299a63d32fa96d9281d03e94041df", + "url": "https://api.github.com/repos/phar-io/version/zipball/45a2ec53a73c70ce41d55cedef9063630abaf1b6", + "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6", "shasum": "" }, "require": { "php": "^5.6 || ^7.0" }, - "time": "2017-03-05T17:38:23+00:00", + "time": "2018-07-08T19:19:57+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -3601,21 +3624,26 @@ }, { "name": "phpspec/php-diff", - "version": "v1.0.2", - "version_normalized": "1.0.2.0", + "version": "v1.1.0", + "version_normalized": "1.1.0.0", "source": { "type": "git", "url": "https://github.com/phpspec/php-diff.git", - "reference": "30e103d19519fe678ae64a60d77884ef3d71b28a" + "reference": "0464787bfa7cd13576c5a1e318709768798bec6a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpspec/php-diff/zipball/30e103d19519fe678ae64a60d77884ef3d71b28a", - "reference": "30e103d19519fe678ae64a60d77884ef3d71b28a", + "url": "https://api.github.com/repos/phpspec/php-diff/zipball/0464787bfa7cd13576c5a1e318709768798bec6a", + "reference": "0464787bfa7cd13576c5a1e318709768798bec6a", "shasum": "" }, - "time": "2013-11-01T13:02:21+00:00", + "time": "2016-04-07T12:29:16+00:00", "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, "installation-source": "dist", "autoload": { "psr-0": { @@ -3636,49 +3664,48 @@ }, { "name": "phpspec/phpspec", - "version": "2.5.8", - "version_normalized": "2.5.8.0", + "version": "4.3.1", + "version_normalized": "4.3.1.0", "source": { "type": "git", "url": "https://github.com/phpspec/phpspec.git", - "reference": "d8a153dcb52f929b448c0bf2cc19c7388951adb1" + "reference": "4474f1cb4cf9873996fc07fac6533ab9298eb6fd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpspec/phpspec/zipball/d8a153dcb52f929b448c0bf2cc19c7388951adb1", - "reference": "d8a153dcb52f929b448c0bf2cc19c7388951adb1", + "url": "https://api.github.com/repos/phpspec/phpspec/zipball/4474f1cb4cf9873996fc07fac6533ab9298eb6fd", + "reference": "4474f1cb4cf9873996fc07fac6533ab9298eb6fd", "shasum": "" }, "require": { - "doctrine/instantiator": "^1.0.1", + "doctrine/instantiator": "^1.0.5", "ext-tokenizer": "*", - "php": ">=5.3.3", - "phpspec/php-diff": "~1.0.0", - "phpspec/prophecy": "~1.4", - "sebastian/exporter": "~1.0|~2.0|^3.0", - "symfony/console": "~2.3|~3.0,!=3.2.8", - "symfony/event-dispatcher": "~2.1|~3.0", - "symfony/finder": "~2.1|~3.0", - "symfony/process": "^2.6|~3.0", - "symfony/yaml": "~2.1|~3.0" + "php": "^7.0,<7.3", + "phpspec/php-diff": "^1.0.0", + "phpspec/prophecy": "^1.5", + "sebastian/exporter": "^1.0 || ^2.0 || ^3.0", + "symfony/console": "^3.2 || ^4.0", + "symfony/event-dispatcher": "^3.2 || ^4.0", + "symfony/finder": "^3.2 || ^4.0", + "symfony/process": "^3.2 || ^4.0", + "symfony/yaml": "^3.2 || ^4.0" }, "require-dev": { - "behat/behat": "^3.0.11,!=3.3.1", - "ciaranmcnulty/versionbasedtestskipper": "^0.2.1", - "phpunit/phpunit": "~4.4", - "symfony/filesystem": "~2.1|~3.0" + "behat/behat": "^3.3", + "phpunit/phpunit": "^5.7|^6.0", + "symfony/filesystem": "^3.2 || ^4.0" }, "suggest": { - "phpspec/nyan-formatters": "~1.0 – Adds Nyan formatters" + "phpspec/nyan-formatters": "Adds Nyan formatters" }, - "time": "2017-07-29T17:19:38+00:00", + "time": "2018-07-02T17:43:33+00:00", "bin": [ "bin/phpspec" ], "type": "library", "extra": { "branch-alias": { - "dev-master": "2.5.x-dev" + "dev-master": "4.3.x-dev" } }, "installation-source": "dist", @@ -3700,9 +3727,13 @@ { "name": "Marcello Duarte", "homepage": "http://marcelloduarte.net/" + }, + { + "name": "Ciaran McNulty", + "homepage": "https://ciaranmcnulty.com/" } ], - "description": "Specification-oriented BDD framework for PHP 5.3+", + "description": "Specification-oriented BDD framework for PHP 5.6+", "homepage": "http://phpspec.net/", "keywords": [ "BDD", @@ -3781,42 +3812,42 @@ }, { "name": "phpunit/php-code-coverage", - "version": "5.3.2", - "version_normalized": "5.3.2.0", + "version": "6.0.7", + "version_normalized": "6.0.7.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "c89677919c5dd6d3b3852f230a663118762218ac" + "reference": "865662550c384bc1db7e51d29aeda1c2c161d69a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/c89677919c5dd6d3b3852f230a663118762218ac", - "reference": "c89677919c5dd6d3b3852f230a663118762218ac", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/865662550c384bc1db7e51d29aeda1c2c161d69a", + "reference": "865662550c384bc1db7e51d29aeda1c2c161d69a", "shasum": "" }, "require": { "ext-dom": "*", "ext-xmlwriter": "*", - "php": "^7.0", - "phpunit/php-file-iterator": "^1.4.2", + "php": "^7.1", + "phpunit/php-file-iterator": "^2.0", "phpunit/php-text-template": "^1.2.1", - "phpunit/php-token-stream": "^2.0.1", + "phpunit/php-token-stream": "^3.0", "sebastian/code-unit-reverse-lookup": "^1.0.1", - "sebastian/environment": "^3.0", + "sebastian/environment": "^3.1", "sebastian/version": "^2.0.1", "theseer/tokenizer": "^1.1" }, "require-dev": { - "phpunit/phpunit": "^6.0" + "phpunit/phpunit": "^7.0" }, "suggest": { - "ext-xdebug": "^2.5.5" + "ext-xdebug": "^2.6.0" }, - "time": "2018-04-06T15:36:58+00:00", + "time": "2018-06-01T07:51:50+00:00", "type": "library", "extra": { "branch-alias": { - "dev-master": "5.3.x-dev" + "dev-master": "6.0-dev" } }, "installation-source": "dist", @@ -3846,27 +3877,27 @@ }, { "name": "phpunit/php-file-iterator", - "version": "1.4.5", - "version_normalized": "1.4.5.0", + "version": "2.0.1", + "version_normalized": "2.0.1.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "730b01bc3e867237eaac355e06a36b85dd93a8b4" + "reference": "cecbc684605bb0cc288828eb5d65d93d5c676d3c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/730b01bc3e867237eaac355e06a36b85dd93a8b4", - "reference": "730b01bc3e867237eaac355e06a36b85dd93a8b4", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/cecbc684605bb0cc288828eb5d65d93d5c676d3c", + "reference": "cecbc684605bb0cc288828eb5d65d93d5c676d3c", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": "^7.1" }, - "time": "2017-11-27T13:52:08+00:00", + "time": "2018-06-11T11:44:00+00:00", "type": "library", "extra": { "branch-alias": { - "dev-master": "1.4.x-dev" + "dev-master": "2.0.x-dev" } }, "installation-source": "dist", @@ -3882,7 +3913,7 @@ "authors": [ { "name": "Sebastian Bergmann", - "email": "sb@sebastian-bergmann.de", + "email": "sebastian@phpunit.de", "role": "lead" } ], @@ -3938,30 +3969,30 @@ }, { "name": "phpunit/php-timer", - "version": "1.0.9", - "version_normalized": "1.0.9.0", + "version": "2.0.0", + "version_normalized": "2.0.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f" + "reference": "8b8454ea6958c3dee38453d3bd571e023108c91f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3dcf38ca72b158baf0bc245e9184d3fdffa9c46f", - "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/8b8454ea6958c3dee38453d3bd571e023108c91f", + "reference": "8b8454ea6958c3dee38453d3bd571e023108c91f", "shasum": "" }, "require": { - "php": "^5.3.3 || ^7.0" + "php": "^7.1" }, "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" + "phpunit/phpunit": "^7.0" }, - "time": "2017-02-26T11:10:40+00:00", + "time": "2018-02-01T13:07:23+00:00", "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0-dev" + "dev-master": "2.0-dev" } }, "installation-source": "dist", @@ -3977,7 +4008,7 @@ "authors": [ { "name": "Sebastian Bergmann", - "email": "sb@sebastian-bergmann.de", + "email": "sebastian@phpunit.de", "role": "lead" } ], @@ -3989,31 +4020,31 @@ }, { "name": "phpunit/php-token-stream", - "version": "2.0.2", - "version_normalized": "2.0.2.0", + "version": "3.0.0", + "version_normalized": "3.0.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-token-stream.git", - "reference": "791198a2c6254db10131eecfe8c06670700904db" + "reference": "21ad88bbba7c3d93530d93994e0a33cd45f02ace" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/791198a2c6254db10131eecfe8c06670700904db", - "reference": "791198a2c6254db10131eecfe8c06670700904db", + "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/21ad88bbba7c3d93530d93994e0a33cd45f02ace", + "reference": "21ad88bbba7c3d93530d93994e0a33cd45f02ace", "shasum": "" }, "require": { "ext-tokenizer": "*", - "php": "^7.0" + "php": "^7.1" }, "require-dev": { - "phpunit/phpunit": "^6.2.4" + "phpunit/phpunit": "^7.0" }, - "time": "2017-11-27T05:48:46+00:00", + "time": "2018-02-01T13:16:43+00:00", "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0-dev" + "dev-master": "3.0-dev" } }, "installation-source": "dist", @@ -4040,37 +4071,37 @@ }, { "name": "phpunit/phpunit", - "version": "6.5.10", - "version_normalized": "6.5.10.0", + "version": "7.3.0", + "version_normalized": "7.3.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "5744955af9c0a2de74a5eb5287c50bf025100d39" + "reference": "0b6b29faf95c03fd7867e866438b78d5692b6f03" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/5744955af9c0a2de74a5eb5287c50bf025100d39", - "reference": "5744955af9c0a2de74a5eb5287c50bf025100d39", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/0b6b29faf95c03fd7867e866438b78d5692b6f03", + "reference": "0b6b29faf95c03fd7867e866438b78d5692b6f03", "shasum": "" }, "require": { + "doctrine/instantiator": "^1.1", "ext-dom": "*", "ext-json": "*", "ext-libxml": "*", "ext-mbstring": "*", "ext-xml": "*", - "myclabs/deep-copy": "^1.6.1", - "phar-io/manifest": "^1.0.1", - "phar-io/version": "^1.0", - "php": "^7.0", + "myclabs/deep-copy": "^1.7", + "phar-io/manifest": "^1.0.2", + "phar-io/version": "^2.0", + "php": "^7.1", "phpspec/prophecy": "^1.7", - "phpunit/php-code-coverage": "^5.3", - "phpunit/php-file-iterator": "^1.4.3", + "phpunit/php-code-coverage": "^6.0.7", + "phpunit/php-file-iterator": "^2.0.1", "phpunit/php-text-template": "^1.2.1", - "phpunit/php-timer": "^1.0.9", - "phpunit/phpunit-mock-objects": "^5.0.8", - "sebastian/comparator": "^2.1", - "sebastian/diff": "^2.0", + "phpunit/php-timer": "^2.0", + "sebastian/comparator": "^3.0", + "sebastian/diff": "^3.0", "sebastian/environment": "^3.1", "sebastian/exporter": "^3.1", "sebastian/global-state": "^2.0", @@ -4079,24 +4110,24 @@ "sebastian/version": "^2.0.1" }, "conflict": { - "phpdocumentor/reflection-docblock": "3.0.2", - "phpunit/dbunit": "<3.0" + "phpunit/phpunit-mock-objects": "*" }, "require-dev": { "ext-pdo": "*" }, "suggest": { + "ext-soap": "*", "ext-xdebug": "*", - "phpunit/php-invoker": "^1.1" + "phpunit/php-invoker": "^2.0" }, - "time": "2018-08-03T05:27:14+00:00", + "time": "2018-08-03T06:02:45+00:00", "bin": [ "phpunit" ], "type": "library", "extra": { "branch-alias": { - "dev-master": "6.5.x-dev" + "dev-master": "7.3-dev" } }, "installation-source": "dist", @@ -4124,67 +4155,6 @@ "xunit" ] }, - { - "name": "phpunit/phpunit-mock-objects", - "version": "5.0.8", - "version_normalized": "5.0.8.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git", - "reference": "6f9a3c8bf34188a2b53ce2ae7a126089c53e0a9f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/6f9a3c8bf34188a2b53ce2ae7a126089c53e0a9f", - "reference": "6f9a3c8bf34188a2b53ce2ae7a126089c53e0a9f", - "shasum": "" - }, - "require": { - "doctrine/instantiator": "^1.0.5", - "php": "^7.0", - "phpunit/php-text-template": "^1.2.1", - "sebastian/exporter": "^3.1" - }, - "conflict": { - "phpunit/phpunit": "<6.0" - }, - "require-dev": { - "phpunit/phpunit": "^6.5" - }, - "suggest": { - "ext-soap": "*" - }, - "time": "2018-07-13T03:27:23+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Mock Object library for PHPUnit", - "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/", - "keywords": [ - "mock", - "xunit" - ] - }, { "name": "predis/predis", "version": "v1.1.1", @@ -4637,32 +4607,32 @@ }, { "name": "sebastian/comparator", - "version": "2.1.3", - "version_normalized": "2.1.3.0", + "version": "3.0.2", + "version_normalized": "3.0.2.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "34369daee48eafb2651bea869b4b15d75ccc35f9" + "reference": "5de4fc177adf9bce8df98d8d141a7559d7ccf6da" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/34369daee48eafb2651bea869b4b15d75ccc35f9", - "reference": "34369daee48eafb2651bea869b4b15d75ccc35f9", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/5de4fc177adf9bce8df98d8d141a7559d7ccf6da", + "reference": "5de4fc177adf9bce8df98d8d141a7559d7ccf6da", "shasum": "" }, "require": { - "php": "^7.0", - "sebastian/diff": "^2.0 || ^3.0", + "php": "^7.1", + "sebastian/diff": "^3.0", "sebastian/exporter": "^3.1" }, "require-dev": { - "phpunit/phpunit": "^6.4" + "phpunit/phpunit": "^7.1" }, - "time": "2018-02-01T13:46:46+00:00", + "time": "2018-07-12T15:12:46+00:00", "type": "library", "extra": { "branch-alias": { - "dev-master": "2.1.x-dev" + "dev-master": "3.0-dev" } }, "installation-source": "dist", @@ -4703,30 +4673,31 @@ }, { "name": "sebastian/diff", - "version": "2.0.1", - "version_normalized": "2.0.1.0", + "version": "3.0.1", + "version_normalized": "3.0.1.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "347c1d8b49c5c3ee30c7040ea6fc446790e6bddd" + "reference": "366541b989927187c4ca70490a35615d3fef2dce" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/347c1d8b49c5c3ee30c7040ea6fc446790e6bddd", - "reference": "347c1d8b49c5c3ee30c7040ea6fc446790e6bddd", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/366541b989927187c4ca70490a35615d3fef2dce", + "reference": "366541b989927187c4ca70490a35615d3fef2dce", "shasum": "" }, "require": { - "php": "^7.0" + "php": "^7.1" }, "require-dev": { - "phpunit/phpunit": "^6.2" + "phpunit/phpunit": "^7.0", + "symfony/process": "^2 || ^3.3 || ^4" }, - "time": "2017-08-03T08:09:46+00:00", + "time": "2018-06-10T07:54:39+00:00", "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0-dev" + "dev-master": "3.0-dev" } }, "installation-source": "dist", @@ -4752,7 +4723,10 @@ "description": "Diff implementation", "homepage": "https://github.com/sebastianbergmann/diff", "keywords": [ - "diff" + "diff", + "udiff", + "unidiff", + "unified diff" ] }, { @@ -5303,22 +5277,21 @@ }, { "name": "symfony/console", - "version": "v3.4.14", - "version_normalized": "3.4.14.0", + "version": "v4.1.3", + "version_normalized": "4.1.3.0", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "6b217594552b9323bcdcfc14f8a0ce126e84cd73" + "reference": "ca80b8ced97cf07390078b29773dc384c39eee1f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/6b217594552b9323bcdcfc14f8a0ce126e84cd73", - "reference": "6b217594552b9323bcdcfc14f8a0ce126e84cd73", + "url": "https://api.github.com/repos/symfony/console/zipball/ca80b8ced97cf07390078b29773dc384c39eee1f", + "reference": "ca80b8ced97cf07390078b29773dc384c39eee1f", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8", - "symfony/debug": "~2.8|~3.0|~4.0", + "php": "^7.1.3", "symfony/polyfill-mbstring": "~1.0" }, "conflict": { @@ -5327,11 +5300,11 @@ }, "require-dev": { "psr/log": "~1.0", - "symfony/config": "~3.3|~4.0", + "symfony/config": "~3.4|~4.0", "symfony/dependency-injection": "~3.4|~4.0", - "symfony/event-dispatcher": "~2.8|~3.0|~4.0", + "symfony/event-dispatcher": "~3.4|~4.0", "symfony/lock": "~3.4|~4.0", - "symfony/process": "~3.3|~4.0" + "symfony/process": "~3.4|~4.0" }, "suggest": { "psr/log-implementation": "For using the console logger", @@ -5339,11 +5312,11 @@ "symfony/lock": "", "symfony/process": "" }, - "time": "2018-07-26T11:19:56+00:00", + "time": "2018-07-26T11:24:31+00:00", "type": "library", "extra": { "branch-alias": { - "dev-master": "3.4-dev" + "dev-master": "4.1-dev" } }, "installation-source": "dist", @@ -5429,34 +5402,34 @@ }, { "name": "symfony/debug", - "version": "v3.4.14", - "version_normalized": "3.4.14.0", + "version": "v4.1.3", + "version_normalized": "4.1.3.0", "source": { "type": "git", "url": "https://github.com/symfony/debug.git", - "reference": "d5a058ff6ecad26b30c1ba452241306ea34c65cc" + "reference": "9316545571f079c4dd183e674721d9dc783ce196" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/debug/zipball/d5a058ff6ecad26b30c1ba452241306ea34c65cc", - "reference": "d5a058ff6ecad26b30c1ba452241306ea34c65cc", + "url": "https://api.github.com/repos/symfony/debug/zipball/9316545571f079c4dd183e674721d9dc783ce196", + "reference": "9316545571f079c4dd183e674721d9dc783ce196", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8", + "php": "^7.1.3", "psr/log": "~1.0" }, "conflict": { - "symfony/http-kernel": ">=2.3,<2.3.24|~2.4.0|>=2.5,<2.5.9|>=2.6,<2.6.2" + "symfony/http-kernel": "<3.4" }, "require-dev": { - "symfony/http-kernel": "~2.8|~3.0|~4.0" + "symfony/http-kernel": "~3.4|~4.0" }, - "time": "2018-07-26T11:19:56+00:00", + "time": "2018-07-26T11:24:31+00:00", "type": "library", "extra": { "branch-alias": { - "dev-master": "3.4-dev" + "dev-master": "4.1-dev" } }, "installation-source": "dist", @@ -5545,41 +5518,41 @@ }, { "name": "symfony/event-dispatcher", - "version": "v3.4.14", - "version_normalized": "3.4.14.0", + "version": "v4.1.3", + "version_normalized": "4.1.3.0", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "b2e1f19280c09a42dc64c0b72b80fe44dd6e88fb" + "reference": "bfb30c2ad377615a463ebbc875eba64a99f6aa3e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/b2e1f19280c09a42dc64c0b72b80fe44dd6e88fb", - "reference": "b2e1f19280c09a42dc64c0b72b80fe44dd6e88fb", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/bfb30c2ad377615a463ebbc875eba64a99f6aa3e", + "reference": "bfb30c2ad377615a463ebbc875eba64a99f6aa3e", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8" + "php": "^7.1.3" }, "conflict": { - "symfony/dependency-injection": "<3.3" + "symfony/dependency-injection": "<3.4" }, "require-dev": { "psr/log": "~1.0", - "symfony/config": "~2.8|~3.0|~4.0", - "symfony/dependency-injection": "~3.3|~4.0", - "symfony/expression-language": "~2.8|~3.0|~4.0", - "symfony/stopwatch": "~2.8|~3.0|~4.0" + "symfony/config": "~3.4|~4.0", + "symfony/dependency-injection": "~3.4|~4.0", + "symfony/expression-language": "~3.4|~4.0", + "symfony/stopwatch": "~3.4|~4.0" }, "suggest": { "symfony/dependency-injection": "", "symfony/http-kernel": "" }, - "time": "2018-07-26T09:06:28+00:00", + "time": "2018-07-26T09:10:45+00:00", "type": "library", "extra": { "branch-alias": { - "dev-master": "3.4-dev" + "dev-master": "4.1-dev" } }, "installation-source": "dist", @@ -5662,27 +5635,27 @@ }, { "name": "symfony/finder", - "version": "v3.4.14", - "version_normalized": "3.4.14.0", + "version": "v4.1.3", + "version_normalized": "4.1.3.0", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "8a84fcb207451df0013b2c74cbbf1b62d47b999a" + "reference": "e162f1df3102d0b7472805a5a9d5db9fcf0a8068" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/8a84fcb207451df0013b2c74cbbf1b62d47b999a", - "reference": "8a84fcb207451df0013b2c74cbbf1b62d47b999a", + "url": "https://api.github.com/repos/symfony/finder/zipball/e162f1df3102d0b7472805a5a9d5db9fcf0a8068", + "reference": "e162f1df3102d0b7472805a5a9d5db9fcf0a8068", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8" + "php": "^7.1.3" }, - "time": "2018-07-26T11:19:56+00:00", + "time": "2018-07-26T11:24:31+00:00", "type": "library", "extra": { "branch-alias": { - "dev-master": "3.4-dev" + "dev-master": "4.1-dev" } }, "installation-source": "dist", @@ -5713,32 +5686,32 @@ }, { "name": "symfony/http-foundation", - "version": "v3.4.14", - "version_normalized": "3.4.14.0", + "version": "v4.1.3", + "version_normalized": "4.1.3.0", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "19a3267828046a2a4a05e3dc2954bbd2e0ad9fa6" + "reference": "7d93e3547660ec7ee3dad1428ba42e8076a0e5f1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/19a3267828046a2a4a05e3dc2954bbd2e0ad9fa6", - "reference": "19a3267828046a2a4a05e3dc2954bbd2e0ad9fa6", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/7d93e3547660ec7ee3dad1428ba42e8076a0e5f1", + "reference": "7d93e3547660ec7ee3dad1428ba42e8076a0e5f1", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8", - "symfony/polyfill-mbstring": "~1.1", - "symfony/polyfill-php70": "~1.6" + "php": "^7.1.3", + "symfony/polyfill-mbstring": "~1.1" }, "require-dev": { - "symfony/expression-language": "~2.8|~3.0|~4.0" + "predis/predis": "~1.0", + "symfony/expression-language": "~3.4|~4.0" }, - "time": "2018-08-01T14:04:26+00:00", + "time": "2018-08-01T14:07:44+00:00", "type": "library", "extra": { "branch-alias": { - "dev-master": "3.4-dev" + "dev-master": "4.1-dev" } }, "installation-source": "dist", @@ -5769,31 +5742,31 @@ }, { "name": "symfony/http-kernel", - "version": "v3.4.14", - "version_normalized": "3.4.14.0", + "version": "v4.1.3", + "version_normalized": "4.1.3.0", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "8e84cc498f0ffecfbabdea78b87828fd66189544" + "reference": "6347be5110efb27fe45ea04bf213078b67a05036" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/8e84cc498f0ffecfbabdea78b87828fd66189544", - "reference": "8e84cc498f0ffecfbabdea78b87828fd66189544", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/6347be5110efb27fe45ea04bf213078b67a05036", + "reference": "6347be5110efb27fe45ea04bf213078b67a05036", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8", + "php": "^7.1.3", "psr/log": "~1.0", - "symfony/debug": "~2.8|~3.0|~4.0", - "symfony/event-dispatcher": "~2.8|~3.0|~4.0", - "symfony/http-foundation": "~3.4.12|~4.0.12|^4.1.1", + "symfony/debug": "~3.4|~4.0", + "symfony/event-dispatcher": "~4.1", + "symfony/http-foundation": "^4.1.1", "symfony/polyfill-ctype": "~1.8" }, "conflict": { - "symfony/config": "<2.8", - "symfony/dependency-injection": "<3.4.10|<4.0.10,>=4", - "symfony/var-dumper": "<3.3", + "symfony/config": "<3.4", + "symfony/dependency-injection": "<4.1", + "symfony/var-dumper": "<4.1.1", "twig/twig": "<1.34|<2.4,>=2" }, "provide": { @@ -5801,35 +5774,33 @@ }, "require-dev": { "psr/cache": "~1.0", - "symfony/browser-kit": "~2.8|~3.0|~4.0", - "symfony/class-loader": "~2.8|~3.0", - "symfony/config": "~2.8|~3.0|~4.0", - "symfony/console": "~2.8|~3.0|~4.0", - "symfony/css-selector": "~2.8|~3.0|~4.0", - "symfony/dependency-injection": "^3.4.10|^4.0.10", - "symfony/dom-crawler": "~2.8|~3.0|~4.0", - "symfony/expression-language": "~2.8|~3.0|~4.0", - "symfony/finder": "~2.8|~3.0|~4.0", - "symfony/process": "~2.8|~3.0|~4.0", + "symfony/browser-kit": "~3.4|~4.0", + "symfony/config": "~3.4|~4.0", + "symfony/console": "~3.4|~4.0", + "symfony/css-selector": "~3.4|~4.0", + "symfony/dependency-injection": "^4.1", + "symfony/dom-crawler": "~3.4|~4.0", + "symfony/expression-language": "~3.4|~4.0", + "symfony/finder": "~3.4|~4.0", + "symfony/process": "~3.4|~4.0", "symfony/routing": "~3.4|~4.0", - "symfony/stopwatch": "~2.8|~3.0|~4.0", - "symfony/templating": "~2.8|~3.0|~4.0", - "symfony/translation": "~2.8|~3.0|~4.0", - "symfony/var-dumper": "~3.3|~4.0" + "symfony/stopwatch": "~3.4|~4.0", + "symfony/templating": "~3.4|~4.0", + "symfony/translation": "~3.4|~4.0", + "symfony/var-dumper": "^4.1.1" }, "suggest": { "symfony/browser-kit": "", "symfony/config": "", "symfony/console": "", "symfony/dependency-injection": "", - "symfony/finder": "", "symfony/var-dumper": "" }, - "time": "2018-08-01T14:47:47+00:00", + "time": "2018-08-01T15:30:34+00:00", "type": "library", "extra": { "branch-alias": { - "dev-master": "3.4-dev" + "dev-master": "4.1-dev" } }, "installation-source": "dist", @@ -6091,22 +6062,21 @@ ] }, { - "name": "symfony/polyfill-php70", + "name": "symfony/polyfill-php72", "version": "v1.8.0", "version_normalized": "1.8.0.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-php70.git", - "reference": "77454693d8f10dd23bb24955cffd2d82db1007a6" + "url": "https://github.com/symfony/polyfill-php72.git", + "reference": "a4576e282d782ad82397f3e4ec1df8e0f0cafb46" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php70/zipball/77454693d8f10dd23bb24955cffd2d82db1007a6", - "reference": "77454693d8f10dd23bb24955cffd2d82db1007a6", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/a4576e282d782ad82397f3e4ec1df8e0f0cafb46", + "reference": "a4576e282d782ad82397f3e4ec1df8e0f0cafb46", "shasum": "" }, "require": { - "paragonie/random_compat": "~1.0|~2.0", "php": ">=5.3.3" }, "time": "2018-04-26T10:06:28+00:00", @@ -6119,13 +6089,10 @@ "installation-source": "dist", "autoload": { "psr-4": { - "Symfony\\Polyfill\\Php70\\": "" + "Symfony\\Polyfill\\Php72\\": "" }, "files": [ "bootstrap.php" - ], - "classmap": [ - "Resources/stubs" ] }, "notification-url": "https://packagist.org/downloads/", @@ -6142,7 +6109,7 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill backporting some PHP 7.0+ features to lower PHP versions", + "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", "homepage": "https://symfony.com", "keywords": [ "compatibility", @@ -6207,27 +6174,27 @@ }, { "name": "symfony/process", - "version": "v3.4.14", - "version_normalized": "3.4.14.0", + "version": "v4.1.3", + "version_normalized": "4.1.3.0", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "0414db29bd770ec5a4152683e655f55efd4fa60f" + "reference": "f01fc7a4493572f7f506c49dcb50ad01fb3a2f56" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/0414db29bd770ec5a4152683e655f55efd4fa60f", - "reference": "0414db29bd770ec5a4152683e655f55efd4fa60f", + "url": "https://api.github.com/repos/symfony/process/zipball/f01fc7a4493572f7f506c49dcb50ad01fb3a2f56", + "reference": "f01fc7a4493572f7f506c49dcb50ad01fb3a2f56", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8" + "php": "^7.1.3" }, - "time": "2018-07-26T11:19:56+00:00", + "time": "2018-07-26T11:24:31+00:00", "type": "library", "extra": { "branch-alias": { - "dev-master": "3.4-dev" + "dev-master": "4.1-dev" } }, "installation-source": "dist", @@ -6258,34 +6225,34 @@ }, { "name": "symfony/routing", - "version": "v3.4.14", - "version_normalized": "3.4.14.0", + "version": "v4.1.3", + "version_normalized": "4.1.3.0", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "e20f4bb79502c3c0db86d572f7683a30d4143911" + "reference": "6912cfebc0ea4e7a46fdd15c9bd1f427dd39ff1b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/e20f4bb79502c3c0db86d572f7683a30d4143911", - "reference": "e20f4bb79502c3c0db86d572f7683a30d4143911", + "url": "https://api.github.com/repos/symfony/routing/zipball/6912cfebc0ea4e7a46fdd15c9bd1f427dd39ff1b", + "reference": "6912cfebc0ea4e7a46fdd15c9bd1f427dd39ff1b", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8" + "php": "^7.1.3" }, "conflict": { - "symfony/config": "<3.3.1", - "symfony/dependency-injection": "<3.3", + "symfony/config": "<3.4", + "symfony/dependency-injection": "<3.4", "symfony/yaml": "<3.4" }, "require-dev": { "doctrine/annotations": "~1.0", "psr/log": "~1.0", - "symfony/config": "^3.3.1|~4.0", - "symfony/dependency-injection": "~3.3|~4.0", - "symfony/expression-language": "~2.8|~3.0|~4.0", - "symfony/http-foundation": "~2.8|~3.0|~4.0", + "symfony/config": "~3.4|~4.0", + "symfony/dependency-injection": "~3.4|~4.0", + "symfony/expression-language": "~3.4|~4.0", + "symfony/http-foundation": "~3.4|~4.0", "symfony/yaml": "~3.4|~4.0" }, "suggest": { @@ -6296,11 +6263,11 @@ "symfony/http-foundation": "For using a Symfony Request object", "symfony/yaml": "For using the YAML loader" }, - "time": "2018-07-26T11:19:56+00:00", + "time": "2018-07-26T11:24:31+00:00", "type": "library", "extra": { "branch-alias": { - "dev-master": "3.4-dev" + "dev-master": "4.1-dev" } }, "installation-source": "dist", @@ -6408,40 +6375,46 @@ }, { "name": "symfony/var-dumper", - "version": "v3.4.14", - "version_normalized": "3.4.14.0", + "version": "v4.1.3", + "version_normalized": "4.1.3.0", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "f62a394bd3de96f2f5e8f4c7d685035897fb3cb3" + "reference": "69e174f4c02ec43919380171c6f7550753299316" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/f62a394bd3de96f2f5e8f4c7d685035897fb3cb3", - "reference": "f62a394bd3de96f2f5e8f4c7d685035897fb3cb3", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/69e174f4c02ec43919380171c6f7550753299316", + "reference": "69e174f4c02ec43919380171c6f7550753299316", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8", - "symfony/polyfill-mbstring": "~1.0" + "php": "^7.1.3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php72": "~1.5" }, "conflict": { - "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0" + "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0", + "symfony/console": "<3.4" }, "require-dev": { "ext-iconv": "*", + "symfony/process": "~3.4|~4.0", "twig/twig": "~1.34|~2.4" }, "suggest": { "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).", "ext-intl": "To show region name in time zone dump", - "ext-symfony_debug": "" + "symfony/console": "To use the ServerDumpCommand and/or the bin/var-dump-server script" }, - "time": "2018-07-26T11:19:56+00:00", + "time": "2018-07-26T11:24:31+00:00", + "bin": [ + "Resources/bin/var-dump-server" + ], "type": "library", "extra": { "branch-alias": { - "dev-master": "3.4-dev" + "dev-master": "4.1-dev" } }, "installation-source": "dist", @@ -6479,21 +6452,21 @@ }, { "name": "symfony/yaml", - "version": "v3.4.14", - "version_normalized": "3.4.14.0", + "version": "v4.1.3", + "version_normalized": "4.1.3.0", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "810af2d35fc72b6cf5c01116806d2b65ccaaf2e2" + "reference": "46bc69aa91fc4ab78a96ce67873a6b0c148fd48c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/810af2d35fc72b6cf5c01116806d2b65ccaaf2e2", - "reference": "810af2d35fc72b6cf5c01116806d2b65ccaaf2e2", + "url": "https://api.github.com/repos/symfony/yaml/zipball/46bc69aa91fc4ab78a96ce67873a6b0c148fd48c", + "reference": "46bc69aa91fc4ab78a96ce67873a6b0c148fd48c", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8", + "php": "^7.1.3", "symfony/polyfill-ctype": "~1.8" }, "conflict": { @@ -6505,11 +6478,11 @@ "suggest": { "symfony/console": "For validating YAML files using the lint command" }, - "time": "2018-07-26T11:19:56+00:00", + "time": "2018-07-26T11:24:31+00:00", "type": "library", "extra": { "branch-alias": { - "dev-master": "3.4-dev" + "dev-master": "4.1-dev" } }, "installation-source": "dist", diff --git a/vendor/mtdowling/cron-expression/.editorconfig b/vendor/dragonmantank/cron-expression/.editorconfig similarity index 100% rename from vendor/mtdowling/cron-expression/.editorconfig rename to vendor/dragonmantank/cron-expression/.editorconfig diff --git a/vendor/mtdowling/cron-expression/CHANGELOG.md b/vendor/dragonmantank/cron-expression/CHANGELOG.md similarity index 58% rename from vendor/mtdowling/cron-expression/CHANGELOG.md rename to vendor/dragonmantank/cron-expression/CHANGELOG.md index 8ddab9057..8cb3a084e 100644 --- a/vendor/mtdowling/cron-expression/CHANGELOG.md +++ b/vendor/dragonmantank/cron-expression/CHANGELOG.md @@ -1,5 +1,35 @@ # Change Log +## [2.2.0] - 2018-06-05 +### Added +- Added support for steps larger than field ranges (#6) +## Changed +- N/A +### Fixed +- Fixed validation for numbers with leading 0s (#12) + +## [2.1.0] - 2018-04-06 +### Added +- N/A +### Changed +- Upgraded to PHPUnit 6 (#2) +### Fixed +- Refactored timezones to deal with some inconsistent behavior (#3) +- Allow ranges and lists in same expression (#5) +- Fixed regression where literals were not converted to their numerical counterpart (#) + +## [2.0.0] - 2017-10-12 +### Added +- N/A + +### Changed +- Dropped support for PHP 5.x +- Dropped support for the YEAR field, as it was not part of the cron standard + +### Fixed +- Reworked validation for all the field types +- Stepping should now work for 1-indexed fields like Month (#153) + ## [1.2.0] - 2017-01-22 ### Added - Added IDE, CodeSniffer, and StyleCI.IO support diff --git a/vendor/mtdowling/cron-expression/LICENSE b/vendor/dragonmantank/cron-expression/LICENSE similarity index 89% rename from vendor/mtdowling/cron-expression/LICENSE rename to vendor/dragonmantank/cron-expression/LICENSE index c6d88ac6c..3e38bbc88 100644 --- a/vendor/mtdowling/cron-expression/LICENSE +++ b/vendor/dragonmantank/cron-expression/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2011 Michael Dowling and contributors +Copyright (c) 2011 Michael Dowling , 2016 Chris Tankersley , and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/vendor/mtdowling/cron-expression/README.md b/vendor/dragonmantank/cron-expression/README.md similarity index 66% rename from vendor/mtdowling/cron-expression/README.md rename to vendor/dragonmantank/cron-expression/README.md index c9e3bf3e5..67992c7db 100644 --- a/vendor/mtdowling/cron-expression/README.md +++ b/vendor/dragonmantank/cron-expression/README.md @@ -1,7 +1,7 @@ PHP Cron Expression Parser ========================== -[![Latest Stable Version](https://poser.pugx.org/mtdowling/cron-expression/v/stable.png)](https://packagist.org/packages/mtdowling/cron-expression) [![Total Downloads](https://poser.pugx.org/mtdowling/cron-expression/downloads.png)](https://packagist.org/packages/mtdowling/cron-expression) [![Build Status](https://secure.travis-ci.org/mtdowling/cron-expression.png)](http://travis-ci.org/mtdowling/cron-expression) +[![Latest Stable Version](https://poser.pugx.org/dragonmantank/cron-expression/v/stable.png)](https://packagist.org/packages/dragonmantank/cron-expression) [![Total Downloads](https://poser.pugx.org/dragonmantank/cron-expression/downloads.png)](https://packagist.org/packages/dragonmantank/cron-expression) [![Build Status](https://secure.travis-ci.org/dragonmantank/cron-expression.png)](http://travis-ci.org/dragonmantank/cron-expression) The PHP cron expression parser can parse a CRON expression, determine if it is due to run, calculate the next run date of the expression, and calculate the previous @@ -13,13 +13,15 @@ lists (e.g. 1,2,3), W to find the nearest weekday for a given day of the month, find the last day of the month, L to find the last given weekday of a month, and hash (#) to find the nth weekday of a given month. +More information about this fork can be found in the blog post [here](http://ctankersley.com/2017/10/12/cron-expression-update/). tl;dr - v2.0.0 is a major breaking change, and @dragonmantank can better take care of the project in a separate fork. + Installing ========== Add the dependency to your project: ```bash -composer require mtdowling/cron-expression +composer require dragonmantank/cron-expression ``` Usage @@ -36,7 +38,7 @@ echo $cron->getNextRunDate()->format('Y-m-d H:i:s'); echo $cron->getPreviousRunDate()->format('Y-m-d H:i:s'); // Works with complex expressions -$cron = Cron\CronExpression::factory('3-59/15 2,6-12 */15 1 2-5'); +$cron = Cron\CronExpression::factory('3-59/15 6-12 */15 1 2-5'); echo $cron->getNextRunDate()->format('Y-m-d H:i:s'); // Calculate a run date two iterations into the future @@ -53,10 +55,10 @@ CRON Expressions A CRON expression is a string representing the schedule for a particular command to execute. The parts of a CRON schedule are as follows: - * * * * * * - - - - - - - - | | | | | | - | | | | | + year [optional] + * * * * * + - - - - - + | | | | | + | | | | | | | | | +----- day of week (0 - 7) (Sunday=0 or 7) | | | +---------- month (1 - 12) | | +--------------- day of month (1 - 31) @@ -66,6 +68,6 @@ A CRON expression is a string representing the schedule for a particular command Requirements ============ -- PHP 5.3+ +- PHP 7.0+ - PHPUnit is required to run the unit tests -- Composer is required to run the unit tests \ No newline at end of file +- Composer is required to run the unit tests diff --git a/vendor/dragonmantank/cron-expression/composer.json b/vendor/dragonmantank/cron-expression/composer.json new file mode 100644 index 000000000..d9997ead2 --- /dev/null +++ b/vendor/dragonmantank/cron-expression/composer.json @@ -0,0 +1,35 @@ +{ + "name": "dragonmantank/cron-expression", + "type": "library", + "description": "CRON for PHP: Calculate the next or previous run date and determine if a CRON expression is due", + "keywords": ["cron", "schedule"], + "license": "MIT", + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Chris Tankersley", + "email": "chris@ctankersley.com", + "homepage": "https://github.com/dragonmantank" + } + ], + "require": { + "php": ">=7.0.0" + }, + "require-dev": { + "phpunit/phpunit": "~6.4" + }, + "autoload": { + "psr-4": { + "Cron\\": "src/Cron/" + } + }, + "autoload-dev": { + "psr-4": { + "Tests\\": "tests/Cron/" + } + } +} diff --git a/vendor/dragonmantank/cron-expression/src/Cron/AbstractField.php b/vendor/dragonmantank/cron-expression/src/Cron/AbstractField.php new file mode 100644 index 000000000..262ab63cf --- /dev/null +++ b/vendor/dragonmantank/cron-expression/src/Cron/AbstractField.php @@ -0,0 +1,278 @@ +fullRange = range($this->rangeStart, $this->rangeEnd); + } + + /** + * Check to see if a field is satisfied by a value + * + * @param string $dateValue Date value to check + * @param string $value Value to test + * + * @return bool + */ + public function isSatisfied($dateValue, $value) + { + if ($this->isIncrementsOfRanges($value)) { + return $this->isInIncrementsOfRanges($dateValue, $value); + } elseif ($this->isRange($value)) { + return $this->isInRange($dateValue, $value); + } + + return $value == '*' || $dateValue == $value; + } + + /** + * Check if a value is a range + * + * @param string $value Value to test + * + * @return bool + */ + public function isRange($value) + { + return strpos($value, '-') !== false; + } + + /** + * Check if a value is an increments of ranges + * + * @param string $value Value to test + * + * @return bool + */ + public function isIncrementsOfRanges($value) + { + return strpos($value, '/') !== false; + } + + /** + * Test if a value is within a range + * + * @param string $dateValue Set date value + * @param string $value Value to test + * + * @return bool + */ + public function isInRange($dateValue, $value) + { + $parts = array_map(function($value) { + $value = trim($value); + $value = $this->convertLiterals($value); + return $value; + }, + explode('-', $value, 2) + ); + + + return $dateValue >= $parts[0] && $dateValue <= $parts[1]; + } + + /** + * Test if a value is within an increments of ranges (offset[-to]/step size) + * + * @param string $dateValue Set date value + * @param string $value Value to test + * + * @return bool + */ + public function isInIncrementsOfRanges($dateValue, $value) + { + $chunks = array_map('trim', explode('/', $value, 2)); + $range = $chunks[0]; + $step = isset($chunks[1]) ? $chunks[1] : 0; + + // No step or 0 steps aren't cool + if (is_null($step) || '0' === $step || 0 === $step) { + return false; + } + + // Expand the * to a full range + if ('*' == $range) { + $range = $this->rangeStart . '-' . $this->rangeEnd; + } + + // Generate the requested small range + $rangeChunks = explode('-', $range, 2); + $rangeStart = $rangeChunks[0]; + $rangeEnd = isset($rangeChunks[1]) ? $rangeChunks[1] : $rangeStart; + + if ($rangeStart < $this->rangeStart || $rangeStart > $this->rangeEnd || $rangeStart > $rangeEnd) { + throw new \OutOfRangeException('Invalid range start requested'); + } + + if ($rangeEnd < $this->rangeStart || $rangeEnd > $this->rangeEnd || $rangeEnd < $rangeStart) { + throw new \OutOfRangeException('Invalid range end requested'); + } + + // Steps larger than the range need to wrap around and be handled slightly differently than smaller steps + if ($step >= $this->rangeEnd) { + $thisRange = [$this->fullRange[$step % count($this->fullRange)]]; + } else { + $thisRange = range($rangeStart, $rangeEnd, $step); + } + + return in_array($dateValue, $thisRange); + } + + /** + * Returns a range of values for the given cron expression + * + * @param string $expression The expression to evaluate + * @param int $max Maximum offset for range + * + * @return array + */ + public function getRangeForExpression($expression, $max) + { + $values = array(); + $expression = $this->convertLiterals($expression); + + if (strpos($expression, ',') !== false) { + $ranges = explode(',', $expression); + $values = []; + foreach ($ranges as $range) { + $expanded = $this->getRangeForExpression($range, $this->rangeEnd); + $values = array_merge($values, $expanded); + } + return $values; + } + + if ($this->isRange($expression) || $this->isIncrementsOfRanges($expression)) { + if (!$this->isIncrementsOfRanges($expression)) { + list ($offset, $to) = explode('-', $expression); + $offset = $this->convertLiterals($offset); + $to = $this->convertLiterals($to); + $stepSize = 1; + } + else { + $range = array_map('trim', explode('/', $expression, 2)); + $stepSize = isset($range[1]) ? $range[1] : 0; + $range = $range[0]; + $range = explode('-', $range, 2); + $offset = $range[0]; + $to = isset($range[1]) ? $range[1] : $max; + } + $offset = $offset == '*' ? $this->rangeStart : $offset; + if ($stepSize >= $this->rangeEnd) { + $values = [$this->fullRange[$stepSize % count($this->fullRange)]]; + } else { + for ($i = $offset; $i <= $to; $i += $stepSize) { + $values[] = (int)$i; + } + } + sort($values); + } + else { + $values = array($expression); + } + + return $values; + } + + protected function convertLiterals($value) + { + if (count($this->literals)) { + $key = array_search($value, $this->literals); + if ($key !== false) { + return $key; + } + } + + return $value; + } + + /** + * Checks to see if a value is valid for the field + * + * @param string $value + * @return bool + */ + public function validate($value) + { + $value = $this->convertLiterals($value); + + // All fields allow * as a valid value + if ('*' === $value) { + return true; + } + + if (strpos($value, '/') !== false) { + list($range, $step) = explode('/', $value); + return $this->validate($range) && filter_var($step, FILTER_VALIDATE_INT); + } + + // Validate each chunk of a list individually + if (strpos($value, ',') !== false) { + foreach (explode(',', $value) as $listItem) { + if (!$this->validate($listItem)) { + return false; + } + } + return true; + } + + if (strpos($value, '-') !== false) { + if (substr_count($value, '-') > 1) { + return false; + } + + $chunks = explode('-', $value); + $chunks[0] = $this->convertLiterals($chunks[0]); + $chunks[1] = $this->convertLiterals($chunks[1]); + + if ('*' == $chunks[0] || '*' == $chunks[1]) { + return false; + } + + return $this->validate($chunks[0]) && $this->validate($chunks[1]); + } + + if (!is_numeric($value)) { + return false; + } + + if (is_float($value) || strpos($value, '.') !== false) { + return false; + } + + // We should have a numeric by now, so coerce this into an integer + $value = (int) $value; + + return in_array($value, $this->fullRange, true); + } +} diff --git a/vendor/mtdowling/cron-expression/src/Cron/CronExpression.php b/vendor/dragonmantank/cron-expression/src/Cron/CronExpression.php similarity index 85% rename from vendor/mtdowling/cron-expression/src/Cron/CronExpression.php rename to vendor/dragonmantank/cron-expression/src/Cron/CronExpression.php index d69b4154e..b7ba7da0f 100644 --- a/vendor/mtdowling/cron-expression/src/Cron/CronExpression.php +++ b/vendor/dragonmantank/cron-expression/src/Cron/CronExpression.php @@ -171,7 +171,7 @@ class CronExpression public function setMaxIterationCount($maxIterationCount) { $this->maxIterationCount = $maxIterationCount; - + return $this; } @@ -187,13 +187,14 @@ class CronExpression * matches and so on. * @param bool $allowCurrentDate Set to TRUE to return the current date if * it matches the cron expression. + * @param null|string $timeZone TimeZone to use instead of the system default * * @return \DateTime * @throws \RuntimeException on too many iterations */ - public function getNextRunDate($currentTime = 'now', $nth = 0, $allowCurrentDate = false) + public function getNextRunDate($currentTime = 'now', $nth = 0, $allowCurrentDate = false, $timeZone = null) { - return $this->getRunDate($currentTime, $nth, false, $allowCurrentDate); + return $this->getRunDate($currentTime, $nth, false, $allowCurrentDate, $timeZone); } /** @@ -203,14 +204,15 @@ class CronExpression * @param int $nth Number of matches to skip before returning * @param bool $allowCurrentDate Set to TRUE to return the * current date if it matches the cron expression + * @param null|string $timeZone TimeZone to use instead of the system default * * @return \DateTime * @throws \RuntimeException on too many iterations * @see \Cron\CronExpression::getNextRunDate */ - public function getPreviousRunDate($currentTime = 'now', $nth = 0, $allowCurrentDate = false) + public function getPreviousRunDate($currentTime = 'now', $nth = 0, $allowCurrentDate = false, $timeZone = null) { - return $this->getRunDate($currentTime, $nth, true, $allowCurrentDate); + return $this->getRunDate($currentTime, $nth, true, $allowCurrentDate, $timeZone); } /** @@ -221,15 +223,16 @@ class CronExpression * @param bool $invert Set to TRUE to retrieve previous dates * @param bool $allowCurrentDate Set to TRUE to return the * current date if it matches the cron expression + * @param null|string $timeZone TimeZone to use instead of the system default * * @return array Returns an array of run dates */ - public function getMultipleRunDates($total, $currentTime = 'now', $invert = false, $allowCurrentDate = false) + public function getMultipleRunDates($total, $currentTime = 'now', $invert = false, $allowCurrentDate = false, $timeZone = null) { $matches = array(); for ($i = 0; $i < max(0, $total); $i++) { try { - $matches[] = $this->getRunDate($currentTime, $i, $invert, $allowCurrentDate); + $matches[] = $this->getRunDate($currentTime, $i, $invert, $allowCurrentDate, $timeZone); } catch (RuntimeException $e) { break; } @@ -274,34 +277,30 @@ class CronExpression * seconds are irrelevant, and should be called once per minute. * * @param string|\DateTime $currentTime Relative calculation date + * @param null|string $timeZone TimeZone to use instead of the system default * * @return bool Returns TRUE if the cron is due to run or FALSE if not */ - public function isDue($currentTime = 'now') + public function isDue($currentTime = 'now', $timeZone = null) { + $timeZone = $this->determineTimeZone($currentTime, $timeZone); + if ('now' === $currentTime) { - $currentDate = date('Y-m-d H:i'); - $currentTime = strtotime($currentDate); + $currentTime = new DateTime(); } elseif ($currentTime instanceof DateTime) { - $currentDate = clone $currentTime; - // Ensure time in 'current' timezone is used - $currentDate->setTimezone(new DateTimeZone(date_default_timezone_get())); - $currentDate = $currentDate->format('Y-m-d H:i'); - $currentTime = strtotime($currentDate); + // } elseif ($currentTime instanceof DateTimeImmutable) { - $currentDate = DateTime::createFromFormat('U', $currentTime->format('U')); - $currentDate->setTimezone(new DateTimeZone(date_default_timezone_get())); - $currentDate = $currentDate->format('Y-m-d H:i'); - $currentTime = strtotime($currentDate); + $currentTime = DateTime::createFromFormat('U', $currentTime->format('U')); } else { $currentTime = new DateTime($currentTime); - $currentTime->setTime($currentTime->format('H'), $currentTime->format('i'), 0); - $currentDate = $currentTime->format('Y-m-d H:i'); - $currentTime = $currentTime->getTimeStamp(); } + $currentTime->setTimeZone(new DateTimeZone($timeZone)); + + // drop the seconds to 0 + $currentTime = DateTime::createFromFormat('Y-m-d H:i', $currentTime->format('Y-m-d H:i')); try { - return $this->getNextRunDate($currentDate, 0, true)->getTimestamp() == $currentTime; + return $this->getNextRunDate($currentTime, 0, true)->getTimestamp() === $currentTime->getTimestamp(); } catch (Exception $e) { return false; } @@ -315,22 +314,24 @@ class CronExpression * @param bool $invert Set to TRUE to go backwards in time * @param bool $allowCurrentDate Set to TRUE to return the * current date if it matches the cron expression + * @param string|null $timeZone TimeZone to use instead of the system default * * @return \DateTime * @throws \RuntimeException on too many iterations */ - protected function getRunDate($currentTime = null, $nth = 0, $invert = false, $allowCurrentDate = false) + protected function getRunDate($currentTime = null, $nth = 0, $invert = false, $allowCurrentDate = false, $timeZone = null) { + $timeZone = $this->determineTimeZone($currentTime, $timeZone); + if ($currentTime instanceof DateTime) { $currentDate = clone $currentTime; } elseif ($currentTime instanceof DateTimeImmutable) { $currentDate = DateTime::createFromFormat('U', $currentTime->format('U')); - $currentDate->setTimezone($currentTime->getTimezone()); } else { $currentDate = new DateTime($currentTime ?: 'now'); - $currentDate->setTimezone(new DateTimeZone(date_default_timezone_get())); } + $currentDate->setTimeZone(new DateTimeZone($timeZone)); $currentDate->setTime($currentDate->format('H'), $currentDate->format('i'), 0); $nextRun = clone $currentDate; $nth = (int) $nth; @@ -386,4 +387,25 @@ class CronExpression throw new RuntimeException('Impossible CRON expression'); // @codeCoverageIgnoreEnd } + + /** + * Workout what timeZone should be used. + * + * @param string|\DateTime $currentTime Relative calculation date + * @param string|null $timeZone TimeZone to use instead of the system default + * + * @return string + */ + protected function determineTimeZone($currentTime, $timeZone) + { + if (! is_null($timeZone)) { + return $timeZone; + } + + if ($currentTime instanceOf Datetime) { + return $currentTime->getTimeZone()->getName(); + } + + return date_default_timezone_get(); + } } diff --git a/vendor/mtdowling/cron-expression/src/Cron/DayOfMonthField.php b/vendor/dragonmantank/cron-expression/src/Cron/DayOfMonthField.php similarity index 62% rename from vendor/mtdowling/cron-expression/src/Cron/DayOfMonthField.php rename to vendor/dragonmantank/cron-expression/src/Cron/DayOfMonthField.php index 53e15bc41..abf596900 100644 --- a/vendor/mtdowling/cron-expression/src/Cron/DayOfMonthField.php +++ b/vendor/dragonmantank/cron-expression/src/Cron/DayOfMonthField.php @@ -24,6 +24,9 @@ use DateTime; */ class DayOfMonthField extends AbstractField { + protected $rangeStart = 1; + protected $rangeEnd = 31; + /** * Get the nearest day of the week for a given day in a month * @@ -99,75 +102,30 @@ class DayOfMonthField extends AbstractField } /** - * Validates that the value is valid for the Day of the Month field - * Days of the month can contain values of 1-31, *, L, or ? by default. This can be augmented with lists via a ',', - * ranges via a '-', or with a '[0-9]W' to specify the closest weekday. - * - * @param string $value - * @return bool + * @inheritDoc */ public function validate($value) { - // Allow wildcards and a single L - if ($value === '?' || $value === '*' || $value === 'L') { - return true; + $basicChecks = parent::validate($value); + + // Validate that a list don't have W or L + if (strpos($value, ',') !== false && (strpos($value, 'W') !== false || strpos($value, 'L') !== false)) { + return false; } - // If you only contain numbers and are within 1-31 - if ((bool) preg_match('/^\d{1,2}$/', $value) && ($value >= 1 && $value <= 31)) { - return true; - } + if (!$basicChecks) { - // If you have a -, we will deal with each of your chunks - if ((bool) preg_match('/-/', $value)) { - // We cannot have a range within a list or vice versa - if ((bool) preg_match('/,/', $value)) { - return false; + if ($value === 'L') { + return true; } - $chunks = explode('-', $value); - foreach ($chunks as $chunk) { - if (!$this->validate($chunk)) { - return false; - } + if (preg_match('/^(.*)W$/', $value, $matches)) { + return $this->validate($matches[1]); } - return true; + return false; } - // If you have a comma, we will deal with each value - if ((bool) preg_match('/,/', $value)) { - // We cannot have a range within a list or vice versa - if ((bool) preg_match('/-/', $value)) { - return false; - } - - $chunks = explode(',', $value); - foreach ($chunks as $chunk) { - if (!$this->validate($chunk)) { - return false; - } - } - - return true; - } - - // If you contain a /, we'll deal with it - if ((bool) preg_match('/\//', $value)) { - $chunks = explode('/', $value); - foreach ($chunks as $chunk) { - if (!$this->validate($chunk)) { - return false; - } - } - return true; - } - - // If you end in W, make sure that it has a numeric in front of it - if ((bool) preg_match('/^\d{1,2}W$/', $value)) { - return true; - } - - return false; + return $basicChecks; } } diff --git a/vendor/mtdowling/cron-expression/src/Cron/DayOfWeekField.php b/vendor/dragonmantank/cron-expression/src/Cron/DayOfWeekField.php similarity index 72% rename from vendor/mtdowling/cron-expression/src/Cron/DayOfWeekField.php rename to vendor/dragonmantank/cron-expression/src/Cron/DayOfWeekField.php index 83e2f4c16..e1780134e 100644 --- a/vendor/mtdowling/cron-expression/src/Cron/DayOfWeekField.php +++ b/vendor/dragonmantank/cron-expression/src/Cron/DayOfWeekField.php @@ -21,6 +21,19 @@ use InvalidArgumentException; */ class DayOfWeekField extends AbstractField { + protected $rangeStart = 0; + protected $rangeEnd = 7; + + protected $nthRange; + + protected $literals = [1 => 'MON', 2 => 'TUE', 3 => 'WED', 4 => 'THU', 5 => 'FRI', 6 => 'SAT', 7 => 'SUN']; + + public function __construct() + { + $this->nthRange = range(1, 5); + parent::__construct(); + } + public function isSatisfiedBy(DateTime $date, $value) { if ($value == '?') { @@ -53,18 +66,28 @@ class DayOfWeekField extends AbstractField if (strpos($value, '#')) { list($weekday, $nth) = explode('#', $value); + if (!is_numeric($nth)) { + throw new InvalidArgumentException("Hashed weekdays must be numeric, {$nth} given"); + } else { + $nth = (int) $nth; + } + // 0 and 7 are both Sunday, however 7 matches date('N') format ISO-8601 if ($weekday === '0') { $weekday = 7; } + $weekday = $this->convertLiterals($weekday); + // Validate the hash fields if ($weekday < 0 || $weekday > 7) { throw new InvalidArgumentException("Weekday must be a value between 0 and 7. {$weekday} given"); } - if ($nth > 5) { - throw new InvalidArgumentException('There are never more than 5 of a given weekday in a month'); + + if (!in_array($nth, $this->nthRange)) { + throw new InvalidArgumentException("There are never more than 5 or less than 1 of a given weekday in a month, {$nth} given"); } + // The current weekday must match the targeted weekday to proceed if ($date->format('N') != $weekday) { return false; @@ -117,25 +140,31 @@ class DayOfWeekField extends AbstractField return $this; } + /** + * @inheritDoc + */ public function validate($value) { - $value = $this->convertLiterals($value); + $basicChecks = parent::validate($value); - foreach (explode(',', $value) as $expr) { - if (!preg_match('/^(\*|[0-7](L?|#[1-5]))([\/\,\-][0-7]+)*$/', $expr)) { - return false; + if (!$basicChecks) { + // Handle the # value + if (strpos($value, '#') !== false) { + $chunks = explode('#', $value); + $chunks[0] = $this->convertLiterals($chunks[0]); + + if (parent::validate($chunks[0]) && is_numeric($chunks[1]) && in_array($chunks[1], $this->nthRange)) { + return true; + } } + + if (preg_match('/^(.*)L$/', $value, $matches)) { + return $this->validate($matches[1]); + } + + return false; } - return true; - } - - private function convertLiterals($string) - { - return str_ireplace( - array('SUN', 'MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT'), - range(0, 6), - $string - ); + return $basicChecks; } } diff --git a/vendor/mtdowling/cron-expression/src/Cron/FieldFactory.php b/vendor/dragonmantank/cron-expression/src/Cron/FieldFactory.php similarity index 92% rename from vendor/mtdowling/cron-expression/src/Cron/FieldFactory.php rename to vendor/dragonmantank/cron-expression/src/Cron/FieldFactory.php index fa0e6fe23..fd27352d1 100644 --- a/vendor/mtdowling/cron-expression/src/Cron/FieldFactory.php +++ b/vendor/dragonmantank/cron-expression/src/Cron/FieldFactory.php @@ -42,9 +42,6 @@ class FieldFactory case 4: $this->fields[$position] = new DayOfWeekField(); break; - case 5: - $this->fields[$position] = new YearField(); - break; default: throw new InvalidArgumentException( $position . ' is not a valid position' diff --git a/vendor/mtdowling/cron-expression/src/Cron/FieldInterface.php b/vendor/dragonmantank/cron-expression/src/Cron/FieldInterface.php similarity index 100% rename from vendor/mtdowling/cron-expression/src/Cron/FieldInterface.php rename to vendor/dragonmantank/cron-expression/src/Cron/FieldInterface.php diff --git a/vendor/mtdowling/cron-expression/src/Cron/HoursField.php b/vendor/dragonmantank/cron-expression/src/Cron/HoursField.php similarity index 94% rename from vendor/mtdowling/cron-expression/src/Cron/HoursField.php rename to vendor/dragonmantank/cron-expression/src/Cron/HoursField.php index 107f1300d..4def9ca1b 100644 --- a/vendor/mtdowling/cron-expression/src/Cron/HoursField.php +++ b/vendor/dragonmantank/cron-expression/src/Cron/HoursField.php @@ -10,6 +10,9 @@ use DateTimeZone; */ class HoursField extends AbstractField { + protected $rangeStart = 0; + protected $rangeEnd = 23; + public function isSatisfiedBy(DateTime $date, $value) { return $this->isSatisfied($date->format('H'), $value); @@ -63,9 +66,4 @@ class HoursField extends AbstractField return $this; } - - public function validate($value) - { - return (bool) preg_match('/^[\*,\/\-0-9]+$/', $value); - } } diff --git a/vendor/mtdowling/cron-expression/src/Cron/MinutesField.php b/vendor/dragonmantank/cron-expression/src/Cron/MinutesField.php similarity index 93% rename from vendor/mtdowling/cron-expression/src/Cron/MinutesField.php rename to vendor/dragonmantank/cron-expression/src/Cron/MinutesField.php index d8432b55e..59bb386f9 100644 --- a/vendor/mtdowling/cron-expression/src/Cron/MinutesField.php +++ b/vendor/dragonmantank/cron-expression/src/Cron/MinutesField.php @@ -10,6 +10,9 @@ use DateTime; */ class MinutesField extends AbstractField { + protected $rangeStart = 0; + protected $rangeEnd = 59; + public function isSatisfiedBy(DateTime $date, $value) { return $this->isSatisfied($date->format('i'), $value); @@ -54,9 +57,4 @@ class MinutesField extends AbstractField return $this; } - - public function validate($value) - { - return (bool) preg_match('/^[\*,\/\-0-9]+$/', $value); - } } diff --git a/vendor/mtdowling/cron-expression/src/Cron/MonthField.php b/vendor/dragonmantank/cron-expression/src/Cron/MonthField.php similarity index 59% rename from vendor/mtdowling/cron-expression/src/Cron/MonthField.php rename to vendor/dragonmantank/cron-expression/src/Cron/MonthField.php index 0205c171a..79fdf3cf5 100644 --- a/vendor/mtdowling/cron-expression/src/Cron/MonthField.php +++ b/vendor/dragonmantank/cron-expression/src/Cron/MonthField.php @@ -9,17 +9,14 @@ use DateTime; */ class MonthField extends AbstractField { + protected $rangeStart = 1; + protected $rangeEnd = 12; + protected $literals = [1 => 'JAN', 2 => 'FEB', 3 => 'MAR', 4 => 'APR', 5 => 'MAY', 6 => 'JUN', 7 => 'JUL', + 8 => 'AUG', 9 => 'SEP', 10 => 'OCT', 11 => 'NOV', 12 => 'DEC']; + public function isSatisfiedBy(DateTime $date, $value) { - // Convert text month values to integers - $value = str_ireplace( - array( - 'JAN', 'FEB', 'MAR', 'APR', 'MAY', 'JUN', - 'JUL', 'AUG', 'SEP', 'OCT', 'NOV', 'DEC' - ), - range(1, 12), - $value - ); + $value = $this->convertLiterals($value); return $this->isSatisfied($date->format('m'), $value); } @@ -37,8 +34,5 @@ class MonthField extends AbstractField return $this; } - public function validate($value) - { - return (bool) preg_match('/^[\*,\/\-0-9A-Z]+$/', $value); - } + } diff --git a/vendor/dragonmantank/cron-expression/tests/Cron/AbstractFieldTest.php b/vendor/dragonmantank/cron-expression/tests/Cron/AbstractFieldTest.php new file mode 100644 index 000000000..38114392e --- /dev/null +++ b/vendor/dragonmantank/cron-expression/tests/Cron/AbstractFieldTest.php @@ -0,0 +1,139 @@ + + */ +class AbstractFieldTest extends TestCase +{ + /** + * @covers \Cron\AbstractField::isRange + */ + public function testTestsIfRange() + { + $f = new DayOfWeekField(); + $this->assertTrue($f->isRange('1-2')); + $this->assertFalse($f->isRange('2')); + } + + /** + * @covers \Cron\AbstractField::isIncrementsOfRanges + */ + public function testTestsIfIncrementsOfRanges() + { + $f = new DayOfWeekField(); + $this->assertFalse($f->isIncrementsOfRanges('1-2')); + $this->assertTrue($f->isIncrementsOfRanges('1/2')); + $this->assertTrue($f->isIncrementsOfRanges('*/2')); + $this->assertTrue($f->isIncrementsOfRanges('3-12/2')); + } + + /** + * @covers \Cron\AbstractField::isInRange + */ + public function testTestsIfInRange() + { + $f = new DayOfWeekField(); + $this->assertTrue($f->isInRange('1', '1-2')); + $this->assertTrue($f->isInRange('2', '1-2')); + $this->assertTrue($f->isInRange('5', '4-12')); + $this->assertFalse($f->isInRange('3', '4-12')); + $this->assertFalse($f->isInRange('13', '4-12')); + } + + /** + * @covers \Cron\AbstractField::isInIncrementsOfRanges + */ + public function testTestsIfInIncrementsOfRangesOnZeroStartRange() + { + $f = new MinutesField(); + $this->assertTrue($f->isInIncrementsOfRanges('3', '3-59/2')); + $this->assertTrue($f->isInIncrementsOfRanges('13', '3-59/2')); + $this->assertTrue($f->isInIncrementsOfRanges('15', '3-59/2')); + $this->assertTrue($f->isInIncrementsOfRanges('14', '*/2')); + $this->assertFalse($f->isInIncrementsOfRanges('2', '3-59/13')); + $this->assertFalse($f->isInIncrementsOfRanges('14', '*/13')); + $this->assertFalse($f->isInIncrementsOfRanges('14', '3-59/2')); + $this->assertFalse($f->isInIncrementsOfRanges('3', '2-59')); + $this->assertFalse($f->isInIncrementsOfRanges('3', '2')); + $this->assertFalse($f->isInIncrementsOfRanges('3', '*')); + $this->assertFalse($f->isInIncrementsOfRanges('0', '*/0')); + $this->assertFalse($f->isInIncrementsOfRanges('1', '*/0')); + + $this->assertTrue($f->isInIncrementsOfRanges('4', '4/1')); + $this->assertFalse($f->isInIncrementsOfRanges('14', '4/1')); + $this->assertFalse($f->isInIncrementsOfRanges('34', '4/1')); + } + + /** + * @covers \Cron\AbstractField::isInIncrementsOfRanges + */ + public function testTestsIfInIncrementsOfRangesOnOneStartRange() + { + $f = new MonthField(); + $this->assertTrue($f->isInIncrementsOfRanges('3', '3-12/2')); + $this->assertFalse($f->isInIncrementsOfRanges('13', '3-12/2')); + $this->assertFalse($f->isInIncrementsOfRanges('15', '3-12/2')); + $this->assertTrue($f->isInIncrementsOfRanges('3', '*/2')); + $this->assertFalse($f->isInIncrementsOfRanges('3', '*/3')); + $this->assertTrue($f->isInIncrementsOfRanges('7', '*/3')); + $this->assertFalse($f->isInIncrementsOfRanges('14', '3-12/2')); + $this->assertFalse($f->isInIncrementsOfRanges('3', '2-12')); + $this->assertFalse($f->isInIncrementsOfRanges('3', '2')); + $this->assertFalse($f->isInIncrementsOfRanges('3', '*')); + $this->assertFalse($f->isInIncrementsOfRanges('0', '*/0')); + $this->assertFalse($f->isInIncrementsOfRanges('1', '*/0')); + + $this->assertTrue($f->isInIncrementsOfRanges('4', '4/1')); + $this->assertFalse($f->isInIncrementsOfRanges('14', '4/1')); + $this->assertFalse($f->isInIncrementsOfRanges('34', '4/1')); + } + + /** + * @covers \Cron\AbstractField::isSatisfied + */ + public function testTestsIfSatisfied() + { + $f = new DayOfWeekField(); + $this->assertTrue($f->isSatisfied('12', '3-13')); + $this->assertFalse($f->isSatisfied('15', '3-7/2')); + $this->assertTrue($f->isSatisfied('12', '*')); + $this->assertTrue($f->isSatisfied('12', '12')); + $this->assertFalse($f->isSatisfied('12', '3-11')); + $this->assertFalse($f->isSatisfied('12', '3-7/2')); + $this->assertFalse($f->isSatisfied('12', '11')); + } + + /** + * Allows ranges and lists to coexist in the same expression + * + * @see https://github.com/dragonmantank/cron-expression/issues/5 + */ + public function testAllowRangesAndLists() + { + $expression = '5-7,11-13'; + $f = new HoursField(); + $this->assertTrue($f->validate($expression)); + } + + /** + * Makes sure that various types of ranges expand out properly + * + * @see https://github.com/dragonmantank/cron-expression/issues/5 + */ + public function testGetRangeForExpressionExpandsCorrectly() + { + $f = new HoursField(); + $this->assertSame([5, 6, 7, 11, 12, 13], $f->getRangeForExpression('5-7,11-13', 23)); + $this->assertSame(['5', '6', '7', '11', '12', '13'], $f->getRangeForExpression('5,6,7,11,12,13', 23)); + $this->assertSame([0, 6, 12, 18], $f->getRangeForExpression('*/6', 23)); + $this->assertSame([5, 11], $f->getRangeForExpression('5-13/6', 23)); + } +} diff --git a/vendor/mtdowling/cron-expression/tests/Cron/CronExpressionTest.php b/vendor/dragonmantank/cron-expression/tests/Cron/CronExpressionTest.php similarity index 52% rename from vendor/mtdowling/cron-expression/tests/Cron/CronExpressionTest.php rename to vendor/dragonmantank/cron-expression/tests/Cron/CronExpressionTest.php index f6fedb989..5d46644bc 100644 --- a/vendor/mtdowling/cron-expression/tests/Cron/CronExpressionTest.php +++ b/vendor/dragonmantank/cron-expression/tests/Cron/CronExpressionTest.php @@ -3,65 +3,71 @@ namespace Cron\Tests; use Cron\CronExpression; +use Cron\MonthField; use DateTime; use DateTimeZone; use InvalidArgumentException; -use PHPUnit_Framework_TestCase; +use PHPUnit\Framework\TestCase; /** * @author Michael Dowling */ -class CronExpressionTest extends PHPUnit_Framework_TestCase +class CronExpressionTest extends TestCase { /** - * @covers Cron\CronExpression::factory + * @covers \Cron\CronExpression::factory */ public function testFactoryRecognizesTemplates() { - $this->assertEquals('0 0 1 1 *', CronExpression::factory('@annually')->getExpression()); - $this->assertEquals('0 0 1 1 *', CronExpression::factory('@yearly')->getExpression()); - $this->assertEquals('0 0 * * 0', CronExpression::factory('@weekly')->getExpression()); + $this->assertSame('0 0 1 1 *', CronExpression::factory('@annually')->getExpression()); + $this->assertSame('0 0 1 1 *', CronExpression::factory('@yearly')->getExpression()); + $this->assertSame('0 0 * * 0', CronExpression::factory('@weekly')->getExpression()); } /** - * @covers Cron\CronExpression::__construct - * @covers Cron\CronExpression::getExpression - * @covers Cron\CronExpression::__toString + * @covers \Cron\CronExpression::__construct + * @covers \Cron\CronExpression::getExpression + * @covers \Cron\CronExpression::__toString */ public function testParsesCronSchedule() { // '2010-09-10 12:00:00' $cron = CronExpression::factory('1 2-4 * 4,5,6 */3'); - $this->assertEquals('1', $cron->getExpression(CronExpression::MINUTE)); - $this->assertEquals('2-4', $cron->getExpression(CronExpression::HOUR)); - $this->assertEquals('*', $cron->getExpression(CronExpression::DAY)); - $this->assertEquals('4,5,6', $cron->getExpression(CronExpression::MONTH)); - $this->assertEquals('*/3', $cron->getExpression(CronExpression::WEEKDAY)); - $this->assertEquals('1 2-4 * 4,5,6 */3', $cron->getExpression()); - $this->assertEquals('1 2-4 * 4,5,6 */3', (string) $cron); + $this->assertSame('1', $cron->getExpression(CronExpression::MINUTE)); + $this->assertSame('2-4', $cron->getExpression(CronExpression::HOUR)); + $this->assertSame('*', $cron->getExpression(CronExpression::DAY)); + $this->assertSame('4,5,6', $cron->getExpression(CronExpression::MONTH)); + $this->assertSame('*/3', $cron->getExpression(CronExpression::WEEKDAY)); + $this->assertSame('1 2-4 * 4,5,6 */3', $cron->getExpression()); + $this->assertSame('1 2-4 * 4,5,6 */3', (string) $cron); $this->assertNull($cron->getExpression('foo')); - - try { - $cron = CronExpression::factory('A 1 2 3 4'); - $this->fail('Validation exception not thrown'); - } catch (InvalidArgumentException $e) { - } } /** - * @covers Cron\CronExpression::__construct - * @covers Cron\CronExpression::getExpression + * @covers \Cron\CronExpression::__construct + * @covers \Cron\CronExpression::getExpression + * @covers \Cron\CronExpression::__toString + * @expectedException \InvalidArgumentException + * @expectedExceptionMessage Invalid CRON field value A at position 0 + */ + public function testParsesCronScheduleThrowsAnException() + { + CronExpression::factory('A 1 2 3 4'); + } + + /** + * @covers \Cron\CronExpression::__construct + * @covers \Cron\CronExpression::getExpression * @dataProvider scheduleWithDifferentSeparatorsProvider */ public function testParsesCronScheduleWithAnySpaceCharsAsSeparators($schedule, array $expected) { $cron = CronExpression::factory($schedule); - $this->assertEquals($expected[0], $cron->getExpression(CronExpression::MINUTE)); - $this->assertEquals($expected[1], $cron->getExpression(CronExpression::HOUR)); - $this->assertEquals($expected[2], $cron->getExpression(CronExpression::DAY)); - $this->assertEquals($expected[3], $cron->getExpression(CronExpression::MONTH)); - $this->assertEquals($expected[4], $cron->getExpression(CronExpression::WEEKDAY)); - $this->assertEquals($expected[5], $cron->getExpression(CronExpression::YEAR)); + $this->assertSame($expected[0], $cron->getExpression(CronExpression::MINUTE)); + $this->assertSame($expected[1], $cron->getExpression(CronExpression::HOUR)); + $this->assertSame($expected[2], $cron->getExpression(CronExpression::DAY)); + $this->assertSame($expected[3], $cron->getExpression(CronExpression::MONTH)); + $this->assertSame($expected[4], $cron->getExpression(CronExpression::WEEKDAY)); } /** @@ -72,17 +78,17 @@ class CronExpressionTest extends PHPUnit_Framework_TestCase public static function scheduleWithDifferentSeparatorsProvider() { return array( - array("*\t*\t*\t*\t*\t*", array('*', '*', '*', '*', '*', '*')), - array("* * * * * *", array('*', '*', '*', '*', '*', '*')), - array("* \t * \t * \t * \t * \t *", array('*', '*', '*', '*', '*', '*')), - array("*\t \t*\t \t*\t \t*\t \t*\t \t*", array('*', '*', '*', '*', '*', '*')), + array("*\t*\t*\t*\t*\t", array('*', '*', '*', '*', '*', '*')), + array("* * * * * ", array('*', '*', '*', '*', '*', '*')), + array("* \t * \t * \t * \t * \t", array('*', '*', '*', '*', '*', '*')), + array("*\t \t*\t \t*\t \t*\t \t*\t \t", array('*', '*', '*', '*', '*', '*')), ); } /** - * @covers Cron\CronExpression::__construct - * @covers Cron\CronExpression::setExpression - * @covers Cron\CronExpression::setPart + * @covers \Cron\CronExpression::__construct + * @covers \Cron\CronExpression::setExpression + * @covers \Cron\CronExpression::setPart * @expectedException InvalidArgumentException */ public function testInvalidCronsWillFail() @@ -92,7 +98,7 @@ class CronExpressionTest extends PHPUnit_Framework_TestCase } /** - * @covers Cron\CronExpression::setPart + * @covers \Cron\CronExpression::setPart * @expectedException InvalidArgumentException */ public function testInvalidPartsWillFail() @@ -116,8 +122,7 @@ class CronExpressionTest extends PHPUnit_Framework_TestCase // Handles CSV values array('* 20,22 * * *', '2015-08-10 21:50:00', '2015-08-10 22:00:00', false), // CSV values can be complex - array('* 5,21-22 * * *', '2015-08-10 21:50:00', '2015-08-10 21:50:00', true), - array('7-9 * */9 * *', '2015-08-10 22:02:33', '2015-08-18 00:07:00', false), + array('7-9 * */9 * *', '2015-08-10 22:02:33', '2015-08-10 22:07:00', false), // 15th minute, of the second hour, every 15 days, in January, every Friday array('1 * * * 7', '2015-08-10 21:47:27', '2015-08-16 00:01:00', false), // Test with exact times @@ -138,7 +143,6 @@ class CronExpressionTest extends PHPUnit_Framework_TestCase array('0 0 * * 3-7', strtotime('2011-06-18 23:09:00'), '2011-06-19 00:00:00', false), // Test lists of values and ranges (Abhoryo) array('0 0 * * 2-7', strtotime('2011-06-20 23:09:00'), '2011-06-21 00:00:00', false), - array('0 0 * * 0,2-6', strtotime('2011-06-20 23:09:00'), '2011-06-21 00:00:00', false), array('0 0 * * 2-7', strtotime('2011-06-18 23:09:00'), '2011-06-19 00:00:00', false), array('0 0 * * 4-7', strtotime('2011-07-19 00:00:00'), '2011-07-21 00:00:00', false), // Test increments of ranges @@ -146,12 +150,10 @@ class CronExpressionTest extends PHPUnit_Framework_TestCase array('4-59/2 * * * *', strtotime('2011-06-20 12:04:00'), '2011-06-20 12:04:00', true), array('4-59/2 * * * *', strtotime('2011-06-20 12:06:00'), '2011-06-20 12:06:00', true), array('4-59/3 * * * *', strtotime('2011-06-20 12:06:00'), '2011-06-20 12:07:00', false), - //array('0 0 * * 0,2-6', strtotime('2011-06-20 23:09:00'), '2011-06-21 00:00:00', false), // Test Day of the Week and the Day of the Month (issue #1) array('0 0 1 1 0', strtotime('2011-06-15 23:09:00'), '2012-01-01 00:00:00', false), array('0 0 1 JAN 0', strtotime('2011-06-15 23:09:00'), '2012-01-01 00:00:00', false), array('0 0 1 * 0', strtotime('2011-06-15 23:09:00'), '2012-01-01 00:00:00', false), - array('0 0 L * *', strtotime('2011-07-15 00:00:00'), '2011-07-31 00:00:00', false), // Test the W day of the week modifier for day of the month field array('0 0 2W * *', strtotime('2011-07-01 00:00:00'), '2011-07-01 00:00:00', true), array('0 0 1W * *', strtotime('2011-05-01 00:00:00'), '2011-05-02 00:00:00', false), @@ -161,32 +163,35 @@ class CronExpressionTest extends PHPUnit_Framework_TestCase array('0 0 28W * *', strtotime('2011-07-01 00:00:00'), '2011-07-28 00:00:00', false), array('0 0 30W * *', strtotime('2011-07-01 00:00:00'), '2011-07-29 00:00:00', false), array('0 0 31W * *', strtotime('2011-07-01 00:00:00'), '2011-07-29 00:00:00', false), - // Test the year field - array('* * * * * 2012', strtotime('2011-05-01 00:00:00'), '2012-01-01 00:00:00', false), // Test the last weekday of a month array('* * * * 5L', strtotime('2011-07-01 00:00:00'), '2011-07-29 00:00:00', false), array('* * * * 6L', strtotime('2011-07-01 00:00:00'), '2011-07-30 00:00:00', false), array('* * * * 7L', strtotime('2011-07-01 00:00:00'), '2011-07-31 00:00:00', false), array('* * * * 1L', strtotime('2011-07-24 00:00:00'), '2011-07-25 00:00:00', false), - array('* * * * TUEL', strtotime('2011-07-24 00:00:00'), '2011-07-26 00:00:00', false), array('* * * 1 5L', strtotime('2011-12-25 00:00:00'), '2012-01-27 00:00:00', false), // Test the hash symbol for the nth weekday of a given month array('* * * * 5#2', strtotime('2011-07-01 00:00:00'), '2011-07-08 00:00:00', false), array('* * * * 5#1', strtotime('2011-07-01 00:00:00'), '2011-07-01 00:00:00', true), array('* * * * 3#4', strtotime('2011-07-01 00:00:00'), '2011-07-27 00:00:00', false), + + // Issue #7, documented example failed + ['3-59/15 6-12 */15 1 2-5', strtotime('2017-01-08 00:00:00'), '2017-01-31 06:03:00', false], + + // https://github.com/laravel/framework/commit/07d160ac3cc9764d5b429734ffce4fa311385403 + ['* * * * MON-FRI', strtotime('2017-01-08 00:00:00'), strtotime('2017-01-09 00:00:00'), false], + ['* * * * TUE', strtotime('2017-01-08 00:00:00'), strtotime('2017-01-10 00:00:00'), false], ); } /** - * @covers Cron\CronExpression::isDue - * @covers Cron\CronExpression::getNextRunDate - * @covers Cron\DayOfMonthField - * @covers Cron\DayOfWeekField - * @covers Cron\MinutesField - * @covers Cron\HoursField - * @covers Cron\MonthField - * @covers Cron\YearField - * @covers Cron\CronExpression::getRunDate + * @covers \Cron\CronExpression::isDue + * @covers \Cron\CronExpression::getNextRunDate + * @covers \Cron\DayOfMonthField + * @covers \Cron\DayOfWeekField + * @covers \Cron\MinutesField + * @covers \Cron\HoursField + * @covers \Cron\MonthField + * @covers \Cron\CronExpression::getRunDate * @dataProvider scheduleProvider */ public function testDeterminesIfCronIsDue($schedule, $relativeTime, $nextRun, $isDue) @@ -200,13 +205,21 @@ class CronExpressionTest extends PHPUnit_Framework_TestCase } elseif (is_int($relativeTime)) { $relativeTime = date('Y-m-d H:i:s', $relativeTime); } - $this->assertEquals($isDue, $cron->isDue($relativeTime)); + + if (is_string($nextRun)) { + $nextRunDate = new DateTime($nextRun); + } elseif (is_int($nextRun)) { + $nextRunDate = new DateTime(); + $nextRunDate->setTimestamp($nextRun); + } + $this->assertSame($isDue, $cron->isDue($relativeTime)); $next = $cron->getNextRunDate($relativeTime, 0, true); - $this->assertEquals(new DateTime($nextRun), $next); + + $this->assertEquals($nextRunDate, $next); } /** - * @covers Cron\CronExpression::isDue + * @covers \Cron\CronExpression::isDue */ public function testIsDueHandlesDifferentDates() { @@ -218,34 +231,104 @@ class CronExpressionTest extends PHPUnit_Framework_TestCase } /** - * @covers Cron\CronExpression::isDue + * @covers \Cron\CronExpression::isDue */ - public function testIsDueHandlesDifferentTimezones() + public function testIsDueHandlesDifferentDefaultTimezones() { + $originalTimezone = date_default_timezone_get(); $cron = CronExpression::factory('0 15 * * 3'); //Wednesday at 15:00 $date = '2014-01-01 15:00'; //Wednesday - $utc = new DateTimeZone('UTC'); - $amsterdam = new DateTimeZone('Europe/Amsterdam'); - $tokyo = new DateTimeZone('Asia/Tokyo'); date_default_timezone_set('UTC'); - $this->assertTrue($cron->isDue(new DateTime($date, $utc))); - $this->assertFalse($cron->isDue(new DateTime($date, $amsterdam))); - $this->assertFalse($cron->isDue(new DateTime($date, $tokyo))); + $this->assertTrue($cron->isDue(new DateTime($date), 'UTC')); + $this->assertFalse($cron->isDue(new DateTime($date), 'Europe/Amsterdam')); + $this->assertFalse($cron->isDue(new DateTime($date), 'Asia/Tokyo')); date_default_timezone_set('Europe/Amsterdam'); - $this->assertFalse($cron->isDue(new DateTime($date, $utc))); - $this->assertTrue($cron->isDue(new DateTime($date, $amsterdam))); - $this->assertFalse($cron->isDue(new DateTime($date, $tokyo))); + $this->assertFalse($cron->isDue(new DateTime($date), 'UTC')); + $this->assertTrue($cron->isDue(new DateTime($date), 'Europe/Amsterdam')); + $this->assertFalse($cron->isDue(new DateTime($date), 'Asia/Tokyo')); date_default_timezone_set('Asia/Tokyo'); - $this->assertFalse($cron->isDue(new DateTime($date, $utc))); - $this->assertFalse($cron->isDue(new DateTime($date, $amsterdam))); - $this->assertTrue($cron->isDue(new DateTime($date, $tokyo))); + $this->assertFalse($cron->isDue(new DateTime($date), 'UTC')); + $this->assertFalse($cron->isDue(new DateTime($date), 'Europe/Amsterdam')); + $this->assertTrue($cron->isDue(new DateTime($date), 'Asia/Tokyo')); + + date_default_timezone_set($originalTimezone); } /** - * @covers Cron\CronExpression::getPreviousRunDate + * @covers \Cron\CronExpression::isDue + */ + public function testIsDueHandlesDifferentSuppliedTimezones() + { + $cron = CronExpression::factory('0 15 * * 3'); //Wednesday at 15:00 + $date = '2014-01-01 15:00'; //Wednesday + + $this->assertTrue($cron->isDue(new DateTime($date, new DateTimeZone('UTC')), 'UTC')); + $this->assertFalse($cron->isDue(new DateTime($date, new DateTimeZone('UTC')), 'Europe/Amsterdam')); + $this->assertFalse($cron->isDue(new DateTime($date, new DateTimeZone('UTC')), 'Asia/Tokyo')); + + $this->assertFalse($cron->isDue(new DateTime($date, new DateTimeZone('Europe/Amsterdam')), 'UTC')); + $this->assertTrue($cron->isDue(new DateTime($date, new DateTimeZone('Europe/Amsterdam')), 'Europe/Amsterdam')); + $this->assertFalse($cron->isDue(new DateTime($date, new DateTimeZone('Europe/Amsterdam')), 'Asia/Tokyo')); + + $this->assertFalse($cron->isDue(new DateTime($date, new DateTimeZone('Asia/Tokyo')), 'UTC')); + $this->assertFalse($cron->isDue(new DateTime($date, new DateTimeZone('Asia/Tokyo')), 'Europe/Amsterdam')); + $this->assertTrue($cron->isDue(new DateTime($date, new DateTimeZone('Asia/Tokyo')), 'Asia/Tokyo')); + } + + /** + * @covers Cron\CronExpression::isDue + */ + public function testIsDueHandlesDifferentTimezonesAsArgument() + { + $cron = CronExpression::factory('0 15 * * 3'); //Wednesday at 15:00 + $date = '2014-01-01 15:00'; //Wednesday + $utc = new \DateTimeZone('UTC'); + $amsterdam = new \DateTimeZone('Europe/Amsterdam'); + $tokyo = new \DateTimeZone('Asia/Tokyo'); + $this->assertTrue($cron->isDue(new DateTime($date, $utc), 'UTC')); + $this->assertFalse($cron->isDue(new DateTime($date, $amsterdam), 'UTC')); + $this->assertFalse($cron->isDue(new DateTime($date, $tokyo), 'UTC')); + $this->assertFalse($cron->isDue(new DateTime($date, $utc), 'Europe/Amsterdam')); + $this->assertTrue($cron->isDue(new DateTime($date, $amsterdam), 'Europe/Amsterdam')); + $this->assertFalse($cron->isDue(new DateTime($date, $tokyo), 'Europe/Amsterdam')); + $this->assertFalse($cron->isDue(new DateTime($date, $utc), 'Asia/Tokyo')); + $this->assertFalse($cron->isDue(new DateTime($date, $amsterdam), 'Asia/Tokyo')); + $this->assertTrue($cron->isDue(new DateTime($date, $tokyo), 'Asia/Tokyo')); + } + + /** + * @covers Cron\CronExpression::isDue + */ + public function testRecognisesTimezonesAsPartOfDateTime() + { + $cron = CronExpression::factory("0 7 * * *"); + $tzCron = "America/New_York"; + $tzServer = new \DateTimeZone("Europe/London"); + + $dtCurrent = \DateTime::createFromFormat("!Y-m-d H:i:s", "2017-10-17 10:00:00", $tzServer); + $dtPrev = $cron->getPreviousRunDate($dtCurrent, 0, true, $tzCron); + $this->assertEquals('1508151600 : 2017-10-16T07:00:00-04:00 : America/New_York', $dtPrev->format("U \: c \: e")); + + $dtCurrent = \DateTimeImmutable::createFromFormat("!Y-m-d H:i:s", "2017-10-17 10:00:00", $tzServer); + $dtPrev = $cron->getPreviousRunDate($dtCurrent, 0, true, $tzCron); + $this->assertEquals('1508151600 : 2017-10-16T07:00:00-04:00 : America/New_York', $dtPrev->format("U \: c \: e")); + + $dtCurrent = \DateTimeImmutable::createFromFormat("!Y-m-d H:i:s", "2017-10-17 10:00:00", $tzServer); + $dtPrev = $cron->getPreviousRunDate($dtCurrent->format("c"), 0, true, $tzCron); + $this->assertEquals('1508151600 : 2017-10-16T07:00:00-04:00 : America/New_York', $dtPrev->format("U \: c \: e")); + + $dtCurrent = \DateTimeImmutable::createFromFormat("!Y-m-d H:i:s", "2017-10-17 10:00:00", $tzServer); + $dtPrev = $cron->getPreviousRunDate($dtCurrent->format("\@U"), 0, true, $tzCron); + $this->assertEquals('1508151600 : 2017-10-16T07:00:00-04:00 : America/New_York', $dtPrev->format("U \: c \: e")); + + } + + + /** + * @covers \Cron\CronExpression::getPreviousRunDate */ public function testCanGetPreviousRunDates() { @@ -266,7 +349,7 @@ class CronExpressionTest extends PHPUnit_Framework_TestCase } /** - * @covers Cron\CronExpression::getMultipleRunDates + * @covers \Cron\CronExpression::getMultipleRunDates */ public function testProvidesMultipleRunDates() { @@ -280,28 +363,28 @@ class CronExpressionTest extends PHPUnit_Framework_TestCase } /** - * @covers Cron\CronExpression::getMultipleRunDates - * @covers Cron\CronExpression::setMaxIterationCount + * @covers \Cron\CronExpression::getMultipleRunDates + * @covers \Cron\CronExpression::setMaxIterationCount */ public function testProvidesMultipleRunDatesForTheFarFuture() { // Fails with the default 1000 iteration limit - $cron = CronExpression::factory('0 0 12 1 * */2'); + $cron = CronExpression::factory('0 0 12 1 *'); $cron->setMaxIterationCount(2000); $this->assertEquals(array( new DateTime('2016-01-12 00:00:00'), + new DateTime('2017-01-12 00:00:00'), new DateTime('2018-01-12 00:00:00'), + new DateTime('2019-01-12 00:00:00'), new DateTime('2020-01-12 00:00:00'), + new DateTime('2021-01-12 00:00:00'), new DateTime('2022-01-12 00:00:00'), + new DateTime('2023-01-12 00:00:00'), new DateTime('2024-01-12 00:00:00'), - new DateTime('2026-01-12 00:00:00'), - new DateTime('2028-01-12 00:00:00'), - new DateTime('2030-01-12 00:00:00'), - new DateTime('2032-01-12 00:00:00'), ), $cron->getMultipleRunDates(9, '2015-04-28 00:00:00', false, true)); } /** - * @covers Cron\CronExpression + * @covers \Cron\CronExpression */ public function testCanIterateOverNextRuns() { @@ -325,7 +408,7 @@ class CronExpressionTest extends PHPUnit_Framework_TestCase } /** - * @covers Cron\CronExpression::getRunDate + * @covers \Cron\CronExpression::getRunDate */ public function testSkipsCurrentDateByDefault() { @@ -333,33 +416,33 @@ class CronExpressionTest extends PHPUnit_Framework_TestCase $current = new DateTime('now'); $next = $cron->getNextRunDate($current); $nextPrev = $cron->getPreviousRunDate($next); - $this->assertEquals($current->format('Y-m-d H:i:00'), $nextPrev->format('Y-m-d H:i:s')); + $this->assertSame($current->format('Y-m-d H:i:00'), $nextPrev->format('Y-m-d H:i:s')); } /** - * @covers Cron\CronExpression::getRunDate + * @covers \Cron\CronExpression::getRunDate * @ticket 7 */ public function testStripsForSeconds() { $cron = CronExpression::factory('* * * * *'); $current = new DateTime('2011-09-27 10:10:54'); - $this->assertEquals('2011-09-27 10:11:00', $cron->getNextRunDate($current)->format('Y-m-d H:i:s')); + $this->assertSame('2011-09-27 10:11:00', $cron->getNextRunDate($current)->format('Y-m-d H:i:s')); } /** - * @covers Cron\CronExpression::getRunDate + * @covers \Cron\CronExpression::getRunDate */ public function testFixesPhpBugInDateIntervalMonth() { $cron = CronExpression::factory('0 0 27 JAN *'); - $this->assertEquals('2011-01-27 00:00:00', $cron->getPreviousRunDate('2011-08-22 00:00:00')->format('Y-m-d H:i:s')); + $this->assertSame('2011-01-27 00:00:00', $cron->getPreviousRunDate('2011-08-22 00:00:00')->format('Y-m-d H:i:s')); } public function testIssue29() { $cron = CronExpression::factory('@weekly'); - $this->assertEquals( + $this->assertSame( '2013-03-10 00:00:00', $cron->getPreviousRunDate('2013-03-17 00:00:00')->format('Y-m-d H:i:s') ); @@ -386,7 +469,7 @@ class CronExpressionTest extends PHPUnit_Framework_TestCase } /** - * @covers Cron\CronExpression::getRunDate + * @covers \Cron\CronExpression::getRunDate */ public function testKeepOriginalTime() { @@ -394,15 +477,15 @@ class CronExpressionTest extends PHPUnit_Framework_TestCase $strNow = $now->format(DateTime::ISO8601); $cron = CronExpression::factory('0 0 * * *'); $cron->getPreviousRunDate($now); - $this->assertEquals($strNow, $now->format(DateTime::ISO8601)); + $this->assertSame($strNow, $now->format(DateTime::ISO8601)); } /** - * @covers Cron\CronExpression::__construct - * @covers Cron\CronExpression::factory - * @covers Cron\CronExpression::isValidExpression - * @covers Cron\CronExpression::setExpression - * @covers Cron\CronExpression::setPart + * @covers \Cron\CronExpression::__construct + * @covers \Cron\CronExpression::factory + * @covers \Cron\CronExpression::isValidExpression + * @covers \Cron\CronExpression::setExpression + * @covers \Cron\CronExpression::setPart */ public function testValidationWorks() { @@ -410,5 +493,68 @@ class CronExpressionTest extends PHPUnit_Framework_TestCase $this->assertFalse(CronExpression::isValidExpression('* * * 1')); // Valid $this->assertTrue(CronExpression::isValidExpression('* * * * 1')); + + // Issue #156, 13 is an invalid month + $this->assertFalse(CronExpression::isValidExpression("* * * 13 * ")); + + // Issue #155, 90 is an invalid second + $this->assertFalse(CronExpression::isValidExpression('90 * * * *')); + + // Issue #154, 24 is an invalid hour + $this->assertFalse(CronExpression::isValidExpression("0 24 1 12 0")); + + // Issue #125, this is just all sorts of wrong + $this->assertFalse(CronExpression::isValidExpression('990 14 * * mon-fri0345345')); + + // see https://github.com/dragonmantank/cron-expression/issues/5 + $this->assertTrue(CronExpression::isValidExpression('2,17,35,47 5-7,11-13 * * *')); + } + + /** + * Makes sure that 00 is considered a valid value for 0-based fields + * cronie allows numbers with a leading 0, so adding support for this as well + * + * @see https://github.com/dragonmantank/cron-expression/issues/12 + */ + public function testDoubleZeroIsValid() + { + $this->assertTrue(CronExpression::isValidExpression('00 * * * *')); + $this->assertTrue(CronExpression::isValidExpression('01 * * * *')); + $this->assertTrue(CronExpression::isValidExpression('* 00 * * *')); + $this->assertTrue(CronExpression::isValidExpression('* 01 * * *')); + + $e = CronExpression::factory('00 * * * *'); + $this->assertTrue($e->isDue(new DateTime('2014-04-07 00:00:00'))); + $e = CronExpression::factory('01 * * * *'); + $this->assertTrue($e->isDue(new DateTime('2014-04-07 00:01:00'))); + + $e = CronExpression::factory('* 00 * * *'); + $this->assertTrue($e->isDue(new DateTime('2014-04-07 00:00:00'))); + $e = CronExpression::factory('* 01 * * *'); + $this->assertTrue($e->isDue(new DateTime('2014-04-07 01:00:00'))); + } + + + /** + * Ranges with large steps should "wrap around" to the appropriate value + * cronie allows for steps that are larger than the range of a field, with it wrapping around like a ring buffer. We + * should do the same. + * + * @see https://github.com/dragonmantank/cron-expression/issues/6 + */ + public function testRangesWrapAroundWithLargeSteps() + { + $f = new MonthField(); + $this->assertTrue($f->validate('*/123')); + $this->assertSame([4], $f->getRangeForExpression('*/123', 12)); + + $e = CronExpression::factory('* * * */123 *'); + $this->assertTrue($e->isDue(new DateTime('2014-04-07 00:00:00'))); + + $nextRunDate = $e->getNextRunDate(new DateTime('2014-04-07 00:00:00')); + $this->assertSame('2014-04-07 00:01:00', $nextRunDate->format('Y-m-d H:i:s')); + + $nextRunDate = $e->getNextRunDate(new DateTime('2014-05-07 00:00:00')); + $this->assertSame('2015-04-01 00:00:00', $nextRunDate->format('Y-m-d H:i:s')); } } diff --git a/vendor/mtdowling/cron-expression/tests/Cron/DayOfMonthFieldTest.php b/vendor/dragonmantank/cron-expression/tests/Cron/DayOfMonthFieldTest.php similarity index 66% rename from vendor/mtdowling/cron-expression/tests/Cron/DayOfMonthFieldTest.php rename to vendor/dragonmantank/cron-expression/tests/Cron/DayOfMonthFieldTest.php index eff04557f..0dae4ed6a 100644 --- a/vendor/mtdowling/cron-expression/tests/Cron/DayOfMonthFieldTest.php +++ b/vendor/dragonmantank/cron-expression/tests/Cron/DayOfMonthFieldTest.php @@ -4,27 +4,30 @@ namespace Cron\Tests; use Cron\DayOfMonthField; use DateTime; -use PHPUnit_Framework_TestCase; +use PHPUnit\Framework\TestCase; /** * @author Michael Dowling */ -class DayOfMonthFieldTest extends PHPUnit_Framework_TestCase +class DayOfMonthFieldTest extends TestCase { /** - * @covers Cron\DayOfMonthField::validate + * @covers \Cron\DayOfMonthField::validate */ public function testValidatesField() { $f = new DayOfMonthField(); $this->assertTrue($f->validate('1')); $this->assertTrue($f->validate('*')); - $this->assertTrue($f->validate('5W,L')); + $this->assertTrue($f->validate('L')); + $this->assertTrue($f->validate('5W')); + $this->assertTrue($f->validate('01')); + $this->assertFalse($f->validate('5W,L')); $this->assertFalse($f->validate('1.')); } /** - * @covers Cron\DayOfMonthField::isSatisfiedBy + * @covers \Cron\DayOfMonthField::isSatisfiedBy */ public function testChecksIfSatisfied() { @@ -33,18 +36,18 @@ class DayOfMonthFieldTest extends PHPUnit_Framework_TestCase } /** - * @covers Cron\DayOfMonthField::increment + * @covers \Cron\DayOfMonthField::increment */ public function testIncrementsDate() { $d = new DateTime('2011-03-15 11:15:00'); $f = new DayOfMonthField(); $f->increment($d); - $this->assertEquals('2011-03-16 00:00:00', $d->format('Y-m-d H:i:s')); + $this->assertSame('2011-03-16 00:00:00', $d->format('Y-m-d H:i:s')); $d = new DateTime('2011-03-15 11:15:00'); $f->increment($d, true); - $this->assertEquals('2011-03-14 23:59:00', $d->format('Y-m-d H:i:s')); + $this->assertSame('2011-03-14 23:59:00', $d->format('Y-m-d H:i:s')); } /** diff --git a/vendor/mtdowling/cron-expression/tests/Cron/DayOfWeekFieldTest.php b/vendor/dragonmantank/cron-expression/tests/Cron/DayOfWeekFieldTest.php similarity index 72% rename from vendor/mtdowling/cron-expression/tests/Cron/DayOfWeekFieldTest.php rename to vendor/dragonmantank/cron-expression/tests/Cron/DayOfWeekFieldTest.php index 182d5e906..d27c34df8 100644 --- a/vendor/mtdowling/cron-expression/tests/Cron/DayOfWeekFieldTest.php +++ b/vendor/dragonmantank/cron-expression/tests/Cron/DayOfWeekFieldTest.php @@ -4,28 +4,30 @@ namespace Cron\Tests; use Cron\DayOfWeekField; use DateTime; -use PHPUnit_Framework_TestCase; +use PHPUnit\Framework\TestCase; /** * @author Michael Dowling */ -class DayOfWeekFieldTest extends PHPUnit_Framework_TestCase +class DayOfWeekFieldTest extends TestCase { /** - * @covers Cron\DayOfWeekField::validate + * @covers \Cron\DayOfWeekField::validate */ public function testValidatesField() { $f = new DayOfWeekField(); $this->assertTrue($f->validate('1')); + $this->assertTrue($f->validate('01')); + $this->assertTrue($f->validate('00')); $this->assertTrue($f->validate('*')); - $this->assertTrue($f->validate('*/3,1,1-12')); + $this->assertFalse($f->validate('*/3,1,1-12')); $this->assertTrue($f->validate('SUN-2')); $this->assertFalse($f->validate('1.')); } /** - * @covers Cron\DayOfWeekField::isSatisfiedBy + * @covers \Cron\DayOfWeekField::isSatisfiedBy */ public function testChecksIfSatisfied() { @@ -34,22 +36,22 @@ class DayOfWeekFieldTest extends PHPUnit_Framework_TestCase } /** - * @covers Cron\DayOfWeekField::increment + * @covers \Cron\DayOfWeekField::increment */ public function testIncrementsDate() { $d = new DateTime('2011-03-15 11:15:00'); $f = new DayOfWeekField(); $f->increment($d); - $this->assertEquals('2011-03-16 00:00:00', $d->format('Y-m-d H:i:s')); + $this->assertSame('2011-03-16 00:00:00', $d->format('Y-m-d H:i:s')); $d = new DateTime('2011-03-15 11:15:00'); $f->increment($d, true); - $this->assertEquals('2011-03-14 23:59:00', $d->format('Y-m-d H:i:s')); + $this->assertSame('2011-03-14 23:59:00', $d->format('Y-m-d H:i:s')); } /** - * @covers Cron\DayOfWeekField::isSatisfiedBy + * @covers \Cron\DayOfWeekField::isSatisfiedBy * @expectedException InvalidArgumentException * @expectedExceptionMessage Weekday must be a value between 0 and 7. 12 given */ @@ -60,9 +62,9 @@ class DayOfWeekFieldTest extends PHPUnit_Framework_TestCase } /** - * @covers Cron\DayOfWeekField::isSatisfiedBy + * @covers \Cron\DayOfWeekField::isSatisfiedBy * @expectedException InvalidArgumentException - * @expectedExceptionMessage There are never more than 5 of a given weekday in a month + * @expectedExceptionMessage There are never more than 5 or less than 1 of a given weekday in a month */ public function testValidatesHashValueNth() { @@ -71,7 +73,7 @@ class DayOfWeekFieldTest extends PHPUnit_Framework_TestCase } /** - * @covers Cron\DayOfWeekField::validate + * @covers \Cron\DayOfWeekField::validate */ public function testValidateWeekendHash() { @@ -87,7 +89,7 @@ class DayOfWeekFieldTest extends PHPUnit_Framework_TestCase } /** - * @covers Cron\DayOfWeekField::isSatisfiedBy + * @covers \Cron\DayOfWeekField::isSatisfiedBy */ public function testHandlesZeroAndSevenDayOfTheWeekValues() { @@ -114,4 +116,14 @@ class DayOfWeekFieldTest extends PHPUnit_Framework_TestCase $this->assertFalse($f->validate('*-')); $this->assertFalse($f->validate(',-')); } + + /** + * @see https://github.com/laravel/framework/commit/07d160ac3cc9764d5b429734ffce4fa311385403 + */ + public function testLiteralsExpandProperly() + { + $f = new DayOfWeekField(); + $this->assertTrue($f->validate('MON-FRI')); + $this->assertSame([1,2,3,4,5], $f->getRangeForExpression('MON-FRI', 7)); + } } diff --git a/vendor/mtdowling/cron-expression/tests/Cron/FieldFactoryTest.php b/vendor/dragonmantank/cron-expression/tests/Cron/FieldFactoryTest.php similarity index 71% rename from vendor/mtdowling/cron-expression/tests/Cron/FieldFactoryTest.php rename to vendor/dragonmantank/cron-expression/tests/Cron/FieldFactoryTest.php index f34cc9b58..a6e66b0e1 100644 --- a/vendor/mtdowling/cron-expression/tests/Cron/FieldFactoryTest.php +++ b/vendor/dragonmantank/cron-expression/tests/Cron/FieldFactoryTest.php @@ -3,15 +3,15 @@ namespace Cron\Tests; use Cron\FieldFactory; -use PHPUnit_Framework_TestCase; +use PHPUnit\Framework\TestCase; /** * @author Michael Dowling */ -class FieldFactoryTest extends PHPUnit_Framework_TestCase +class FieldFactoryTest extends TestCase { /** - * @covers Cron\FieldFactory::getField + * @covers \Cron\FieldFactory::getField */ public function testRetrievesFieldInstances() { @@ -21,18 +21,17 @@ class FieldFactoryTest extends PHPUnit_Framework_TestCase 2 => 'Cron\DayOfMonthField', 3 => 'Cron\MonthField', 4 => 'Cron\DayOfWeekField', - 5 => 'Cron\YearField' ); $f = new FieldFactory(); foreach ($mappings as $position => $class) { - $this->assertEquals($class, get_class($f->getField($position))); + $this->assertSame($class, get_class($f->getField($position))); } } /** - * @covers Cron\FieldFactory::getField + * @covers \Cron\FieldFactory::getField * @expectedException InvalidArgumentException */ public function testValidatesFieldPosition() diff --git a/vendor/mtdowling/cron-expression/tests/Cron/HoursFieldTest.php b/vendor/dragonmantank/cron-expression/tests/Cron/HoursFieldTest.php similarity index 61% rename from vendor/mtdowling/cron-expression/tests/Cron/HoursFieldTest.php rename to vendor/dragonmantank/cron-expression/tests/Cron/HoursFieldTest.php index d2d8a22a6..e936d11a6 100644 --- a/vendor/mtdowling/cron-expression/tests/Cron/HoursFieldTest.php +++ b/vendor/dragonmantank/cron-expression/tests/Cron/HoursFieldTest.php @@ -4,41 +4,43 @@ namespace Cron\Tests; use Cron\HoursField; use DateTime; -use PHPUnit_Framework_TestCase; +use PHPUnit\Framework\TestCase; /** * @author Michael Dowling */ -class HoursFieldTest extends PHPUnit_Framework_TestCase +class HoursFieldTest extends TestCase { /** - * @covers Cron\HoursField::validate + * @covers \Cron\HoursField::validate */ public function testValidatesField() { $f = new HoursField(); $this->assertTrue($f->validate('1')); + $this->assertTrue($f->validate('00')); + $this->assertTrue($f->validate('01')); $this->assertTrue($f->validate('*')); - $this->assertTrue($f->validate('*/3,1,1-12')); + $this->assertFalse($f->validate('*/3,1,1-12')); } /** - * @covers Cron\HoursField::increment + * @covers \Cron\HoursField::increment */ public function testIncrementsDate() { $d = new DateTime('2011-03-15 11:15:00'); $f = new HoursField(); $f->increment($d); - $this->assertEquals('2011-03-15 12:00:00', $d->format('Y-m-d H:i:s')); + $this->assertSame('2011-03-15 12:00:00', $d->format('Y-m-d H:i:s')); $d->setTime(11, 15, 0); $f->increment($d, true); - $this->assertEquals('2011-03-15 10:59:00', $d->format('Y-m-d H:i:s')); + $this->assertSame('2011-03-15 10:59:00', $d->format('Y-m-d H:i:s')); } /** - * @covers Cron\HoursField::increment + * @covers \Cron\HoursField::increment */ public function testIncrementsDateWithThirtyMinuteOffsetTimezone() { @@ -47,16 +49,16 @@ class HoursFieldTest extends PHPUnit_Framework_TestCase $d = new DateTime('2011-03-15 11:15:00'); $f = new HoursField(); $f->increment($d); - $this->assertEquals('2011-03-15 12:00:00', $d->format('Y-m-d H:i:s')); + $this->assertSame('2011-03-15 12:00:00', $d->format('Y-m-d H:i:s')); $d->setTime(11, 15, 0); $f->increment($d, true); - $this->assertEquals('2011-03-15 10:59:00', $d->format('Y-m-d H:i:s')); + $this->assertSame('2011-03-15 10:59:00', $d->format('Y-m-d H:i:s')); date_default_timezone_set($tz); } /** - * @covers Cron\HoursField::increment + * @covers \Cron\HoursField::increment */ public function testIncrementDateWithFifteenMinuteOffsetTimezone() { @@ -65,11 +67,11 @@ class HoursFieldTest extends PHPUnit_Framework_TestCase $d = new DateTime('2011-03-15 11:15:00'); $f = new HoursField(); $f->increment($d); - $this->assertEquals('2011-03-15 12:00:00', $d->format('Y-m-d H:i:s')); + $this->assertSame('2011-03-15 12:00:00', $d->format('Y-m-d H:i:s')); $d->setTime(11, 15, 0); $f->increment($d, true); - $this->assertEquals('2011-03-15 10:59:00', $d->format('Y-m-d H:i:s')); + $this->assertSame('2011-03-15 10:59:00', $d->format('Y-m-d H:i:s')); date_default_timezone_set($tz); } } diff --git a/vendor/dragonmantank/cron-expression/tests/Cron/MinutesFieldTest.php b/vendor/dragonmantank/cron-expression/tests/Cron/MinutesFieldTest.php new file mode 100644 index 000000000..b91bffac5 --- /dev/null +++ b/vendor/dragonmantank/cron-expression/tests/Cron/MinutesFieldTest.php @@ -0,0 +1,51 @@ + + */ +class MinutesFieldTest extends TestCase +{ + /** + * @covers \Cron\MinutesField::validate + */ + public function testValidatesField() + { + $f = new MinutesField(); + $this->assertTrue($f->validate('1')); + $this->assertTrue($f->validate('*')); + $this->assertFalse($f->validate('*/3,1,1-12')); + } + + /** + * @covers \Cron\MinutesField::increment + */ + public function testIncrementsDate() + { + $d = new DateTime('2011-03-15 11:15:00'); + $f = new MinutesField(); + $f->increment($d); + $this->assertSame('2011-03-15 11:16:00', $d->format('Y-m-d H:i:s')); + $f->increment($d, true); + $this->assertSame('2011-03-15 11:15:00', $d->format('Y-m-d H:i:s')); + } + + /** + * Various bad syntaxes that are reported to work, but shouldn't. + * + * @author Chris Tankersley + * @since 2017-08-18 + */ + public function testBadSyntaxesShouldNotValidate() + { + $f = new MinutesField(); + $this->assertFalse($f->validate('*-1')); + $this->assertFalse($f->validate('1-2-3')); + $this->assertFalse($f->validate('-1')); + } +} diff --git a/vendor/mtdowling/cron-expression/tests/Cron/MonthFieldTest.php b/vendor/dragonmantank/cron-expression/tests/Cron/MonthFieldTest.php similarity index 63% rename from vendor/mtdowling/cron-expression/tests/Cron/MonthFieldTest.php rename to vendor/dragonmantank/cron-expression/tests/Cron/MonthFieldTest.php index 2d9b0ad2d..83f0f164b 100644 --- a/vendor/mtdowling/cron-expression/tests/Cron/MonthFieldTest.php +++ b/vendor/dragonmantank/cron-expression/tests/Cron/MonthFieldTest.php @@ -4,42 +4,42 @@ namespace Cron\Tests; use Cron\MonthField; use DateTime; -use PHPUnit_Framework_TestCase; +use PHPUnit\Framework\TestCase; /** * @author Michael Dowling */ -class MonthFieldTest extends PHPUnit_Framework_TestCase +class MonthFieldTest extends TestCase { /** - * @covers Cron\MonthField::validate + * @covers \Cron\MonthField::validate */ public function testValidatesField() { $f = new MonthField(); $this->assertTrue($f->validate('12')); $this->assertTrue($f->validate('*')); - $this->assertTrue($f->validate('*/10,2,1-12')); + $this->assertFalse($f->validate('*/10,2,1-12')); $this->assertFalse($f->validate('1.fix-regexp')); } /** - * @covers Cron\MonthField::increment + * @covers \Cron\MonthField::increment */ public function testIncrementsDate() { $d = new DateTime('2011-03-15 11:15:00'); $f = new MonthField(); $f->increment($d); - $this->assertEquals('2011-04-01 00:00:00', $d->format('Y-m-d H:i:s')); + $this->assertSame('2011-04-01 00:00:00', $d->format('Y-m-d H:i:s')); $d = new DateTime('2011-03-15 11:15:00'); $f->increment($d, true); - $this->assertEquals('2011-02-28 23:59:00', $d->format('Y-m-d H:i:s')); + $this->assertSame('2011-02-28 23:59:00', $d->format('Y-m-d H:i:s')); } /** - * @covers Cron\MonthField::increment + * @covers \Cron\MonthField::increment */ public function testIncrementsDateWithThirtyMinuteTimezone() { @@ -48,34 +48,34 @@ class MonthFieldTest extends PHPUnit_Framework_TestCase $d = new DateTime('2011-03-31 11:59:59'); $f = new MonthField(); $f->increment($d); - $this->assertEquals('2011-04-01 00:00:00', $d->format('Y-m-d H:i:s')); + $this->assertSame('2011-04-01 00:00:00', $d->format('Y-m-d H:i:s')); $d = new DateTime('2011-03-15 11:15:00'); $f->increment($d, true); - $this->assertEquals('2011-02-28 23:59:00', $d->format('Y-m-d H:i:s')); + $this->assertSame('2011-02-28 23:59:00', $d->format('Y-m-d H:i:s')); date_default_timezone_set($tz); } /** - * @covers Cron\MonthField::increment + * @covers \Cron\MonthField::increment */ public function testIncrementsYearAsNeeded() { $f = new MonthField(); $d = new DateTime('2011-12-15 00:00:00'); $f->increment($d); - $this->assertEquals('2012-01-01 00:00:00', $d->format('Y-m-d H:i:s')); + $this->assertSame('2012-01-01 00:00:00', $d->format('Y-m-d H:i:s')); } /** - * @covers Cron\MonthField::increment + * @covers \Cron\MonthField::increment */ public function testDecrementsYearAsNeeded() { $f = new MonthField(); $d = new DateTime('2011-01-15 00:00:00'); $f->increment($d, true); - $this->assertEquals('2010-12-31 23:59:00', $d->format('Y-m-d H:i:s')); + $this->assertSame('2010-12-31 23:59:00', $d->format('Y-m-d H:i:s')); } } diff --git a/vendor/laravel/dusk/bin/chromedriver-linux b/vendor/laravel/dusk/bin/chromedriver-linux index 0917dd567..02ff671ca 100644 Binary files a/vendor/laravel/dusk/bin/chromedriver-linux and b/vendor/laravel/dusk/bin/chromedriver-linux differ diff --git a/vendor/laravel/dusk/bin/chromedriver-mac b/vendor/laravel/dusk/bin/chromedriver-mac index da5057e85..f2bcba360 100644 Binary files a/vendor/laravel/dusk/bin/chromedriver-mac and b/vendor/laravel/dusk/bin/chromedriver-mac differ diff --git a/vendor/laravel/dusk/bin/chromedriver-win.exe b/vendor/laravel/dusk/bin/chromedriver-win.exe index f8b34f1be..28a406798 100644 Binary files a/vendor/laravel/dusk/bin/chromedriver-win.exe and b/vendor/laravel/dusk/bin/chromedriver-win.exe differ diff --git a/vendor/laravel/dusk/composer.json b/vendor/laravel/dusk/composer.json index 1e51129fe..95dd81f5c 100644 --- a/vendor/laravel/dusk/composer.json +++ b/vendor/laravel/dusk/composer.json @@ -10,17 +10,17 @@ } ], "require": { - "php": ">=5.6.4", - "facebook/webdriver": "~1.0", + "php": ">=7.1.0", + "facebook/webdriver": "~1.3", "nesbot/carbon": "~1.20", - "illuminate/console": "~5.5", - "illuminate/support": "~5.5", - "symfony/console": "~3.2", - "symfony/process": "~3.2" + "illuminate/console": "~5.6", + "illuminate/support": "~5.6", + "symfony/console": "~4.0", + "symfony/process": "~4.0" }, "require-dev": { - "phpunit/phpunit": "^5.7", - "mockery/mockery": "^0.9.6" + "mockery/mockery": "~1.0", + "phpunit/phpunit": "~7.0" }, "autoload": { "psr-4": { @@ -29,7 +29,7 @@ }, "extra": { "branch-alias": { - "dev-master": "2.0-dev" + "dev-master": "4.0-dev" }, "laravel": { "providers": [ diff --git a/vendor/laravel/dusk/phpunit.xml.dist b/vendor/laravel/dusk/phpunit.xml.dist index 892d7305a..44186d157 100644 --- a/vendor/laravel/dusk/phpunit.xml.dist +++ b/vendor/laravel/dusk/phpunit.xml.dist @@ -1,6 +1,7 @@ driver->manage()->getLog('browser'); + if (in_array($this->driver->getCapabilities()->getBrowserName(), static::$supportsRemoteLogs)) { + $console = $this->driver->manage()->getLog('browser'); - if (! empty($console)) { - file_put_contents( - sprintf('%s/%s.log', rtrim(static::$storeConsoleLogAt, '/'), $name) - , json_encode($console, JSON_PRETTY_PRINT) - ); + if (!empty($console)) { + file_put_contents( + sprintf('%s/%s.log', rtrim(static::$storeConsoleLogAt, '/'), $name) + , json_encode($console, JSON_PRETTY_PRINT) + ); + } } return $this; @@ -270,11 +297,33 @@ class Browser $browser->on($this->page); } + if ($selector instanceof Component) { + $browser->onComponent($selector, $this->resolver); + } + call_user_func($callback, $browser); return $this; } + public function onComponent($component, $parentResolver) + { + $this->component = $component; + + // Here we will set the component elements on the resolver instance, which will allow + // the developer to access short-cuts for CSS selectors on the component which can + // allow for more expressive navigation and interaction with all the components. + $this->resolver->pageElements( + $component->elements() + $parentResolver->elements + ); + + $component->assert($this); + + $this->resolver->prefix = $this->resolver->format( + $component->selector() + ); + } + /** * Ensure that jQuery is available on the page. * @@ -373,6 +422,14 @@ class Browser return $this->macroCall($method, $parameters); } + if ($this->component && method_exists($this->component, $method)) { + array_unshift($parameters, $this); + + $this->component->{$method}(...$parameters); + + return $this; + } + if ($this->page && method_exists($this->page, $method)) { array_unshift($parameters, $this); diff --git a/vendor/laravel/dusk/src/Chrome/ChromeProcess.php b/vendor/laravel/dusk/src/Chrome/ChromeProcess.php new file mode 100644 index 000000000..9901d8a03 --- /dev/null +++ b/vendor/laravel/dusk/src/Chrome/ChromeProcess.php @@ -0,0 +1,102 @@ +driver = $driver; + + if (! is_null($driver) && realpath($driver) === false) { + throw new RuntimeException("Invalid path to Chromedriver [{$driver}]."); + } + } + + /** + * Build the process to run Chromedriver. + * + * @return \Symfony\Component\Process\Process + */ + public function toProcess() + { + if ($this->driver) { + return $this->process(); + } + + if ($this->onWindows()) { + $this->driver = realpath(__DIR__.'/../../bin/chromedriver-win.exe'); + + return $this->process(); + } + + $this->driver = $this->onMac() + ? realpath(__DIR__.'/../../bin/chromedriver-mac') + : realpath(__DIR__.'/../../bin/chromedriver-linux'); + + return $this->process(); + } + + /** + * Build the Chromedriver with Symfony Process. + * + * @return \Symfony\Component\Process\Process + */ + protected function process() + { + return (new Process( + [realpath($this->driver)], null, $this->chromeEnvironment() + )); + } + + /** + * Get the Chromedriver environment variables. + * + * @return array + */ + protected function chromeEnvironment() + { + if ($this->onMac() || $this->onWindows()) { + return []; + } + + return ['DISPLAY' => ':0']; + } + + /** + * Determine if Dusk is running on Windows or Windows Subsystem for Linux. + * + * @return bool + */ + protected function onWindows() + { + return PHP_OS === 'WINNT' || Str::contains(php_uname(), 'Microsoft'); + } + + /** + * Determine if Dusk is running on Mac. + * + * @return bool + */ + protected function onMac() + { + return PHP_OS === 'Darwin'; + } +} diff --git a/vendor/laravel/dusk/src/SupportsChrome.php b/vendor/laravel/dusk/src/Chrome/SupportsChrome.php similarity index 54% rename from vendor/laravel/dusk/src/SupportsChrome.php rename to vendor/laravel/dusk/src/Chrome/SupportsChrome.php index 09b27bac3..8eee8b4de 100644 --- a/vendor/laravel/dusk/src/SupportsChrome.php +++ b/vendor/laravel/dusk/src/Chrome/SupportsChrome.php @@ -1,10 +1,6 @@ setPrefix(realpath($driver)) - ->getProcess() - ->setEnv(static::chromeEnvironment()); + return (new ChromeProcess(static::$chromeDriver))->toProcess(); } /** @@ -84,35 +70,4 @@ trait SupportsChrome { static::$chromeDriver = $path; } - - /** - * Get the Chromedriver environment variables. - * - * @return array - */ - protected static function chromeEnvironment() - { - if (PHP_OS === 'Darwin' || PHP_OS === 'WINNT') { - return []; - } - - return ['DISPLAY' => ':0']; - } - - /** - * Get the suffix for the Chromedriver binary. - * - * @return string - */ - protected static function driverSuffix() - { - switch (PHP_OS) { - case 'Darwin': - return 'mac'; - case 'WINNT': - return 'win.exe'; - default: - return 'linux'; - } - } } diff --git a/vendor/laravel/dusk/src/Component.php b/vendor/laravel/dusk/src/Component.php new file mode 100644 index 000000000..7a919bf00 --- /dev/null +++ b/vendor/laravel/dusk/src/Component.php @@ -0,0 +1,44 @@ +resolver->find($selector); } - /** - * Click the element at the given selector. - * - * @param string $selector - * @return $this - */ - public function click($selector) - { - $this->resolver->findOrFail($selector)->click(); - - return $this; - } - - /** - * Right click the element at the given selector. - * - * @param string $selector - * @return $this - */ - public function rightClick($selector) - { - (new WebDriverActions($this->driver))->contextClick( - $this->resolver->findOrFail($selector) - )->perform(); - - return $this; - } - /** * Click the link with the given text. * * @param string $link + * @param string $element * @return $this */ - public function clickLink($link) + public function clickLink($link, $element = "a") { $this->ensurejQueryIsAvailable(); - $selector = addslashes(trim($this->resolver->format("a:contains({$link})"))); + $selector = addslashes(trim($this->resolver->format("{$element}:contains({$link})"))); $this->driver->executeScript("jQuery.find(\"{$selector}\")[0].click();"); @@ -213,9 +186,7 @@ trait InteractsWithElements if (is_null($value)) { $options[array_rand($options)]->click(); - } - - else { + } else { foreach ($options as $option) { if ((string) $option->getAttribute('value') === (string) $value) { $option->click(); @@ -418,6 +389,19 @@ trait InteractsWithElements return $this; } + /** + * Type the given value in an open JavaScript prompt dialog. + * + * @param string $value + * @return $this + */ + public function typeInDialog($value) + { + $this->driver->switchTo()->alert()->sendKeys($value); + + return $this; + } + /** * Dismiss a JavaScript dialog. * diff --git a/vendor/laravel/dusk/src/Concerns/InteractsWithMouse.php b/vendor/laravel/dusk/src/Concerns/InteractsWithMouse.php index 91f4acd1a..e3273cd68 100644 --- a/vendor/laravel/dusk/src/Concerns/InteractsWithMouse.php +++ b/vendor/laravel/dusk/src/Concerns/InteractsWithMouse.php @@ -2,8 +2,26 @@ namespace Laravel\Dusk\Concerns; +use Facebook\WebDriver\Interactions\WebDriverActions; + trait InteractsWithMouse { + /** + * Move the mouse by offset X and Y. + * + * @param int $xOffset + * @param int $yOffset + * @return $this + */ + public function moveMouse($xOffset, $yOffset) + { + (new WebDriverActions($this->driver))->moveByOffset( + $xOffset, $yOffset + )->perform(); + + return $this; + } + /** * Move the mouse over the given selector. * @@ -18,4 +36,76 @@ trait InteractsWithMouse return $this; } + + /** + * Click the element at the given selector. + * + * @param string|null $selector + * @return $this + */ + public function click($selector = null) + { + if (is_null($selector)) { + (new WebDriverActions($this->driver))->click()->perform(); + } else { + $this->resolver->findOrFail($selector)->click(); + } + + return $this; + } + + /** + * Perform a mouse click and hold the mouse button down. + * + * @return $this + */ + public function clickAndHold() + { + (new WebDriverActions($this->driver))->clickAndHold()->perform(); + + return $this; + } + + /** + * Perform a double click at the current mouse position. + * + * @return $this + */ + public function doubleClick() + { + (new WebDriverActions($this->driver))->doubleClick()->perform(); + + return $this; + } + + /** + * Right click the element at the given selector. + * + * @param string|null $selector + * @return $this + */ + public function rightClick($selector = null) + { + if (is_null($selector)) { + (new WebDriverActions($this->driver))->contextClick()->perform(); + } else { + (new WebDriverActions($this->driver))->contextClick( + $this->resolver->findOrFail($selector) + )->perform(); + } + + return $this; + } + + /** + * Release the currenctly clicked mouse button. + * + * @return $this + */ + public function releaseMouse() + { + (new WebDriverActions($this->driver))->release()->perform(); + + return $this; + } } diff --git a/vendor/laravel/dusk/src/Concerns/MakesAssertions.php b/vendor/laravel/dusk/src/Concerns/MakesAssertions.php index 4f79187bb..80aa0fe20 100644 --- a/vendor/laravel/dusk/src/Concerns/MakesAssertions.php +++ b/vendor/laravel/dusk/src/Concerns/MakesAssertions.php @@ -4,6 +4,7 @@ namespace Laravel\Dusk\Concerns; use Illuminate\Support\Str; use PHPUnit\Framework\Assert as PHPUnit; +use Facebook\WebDriver\Remote\RemoteWebElement; use Facebook\WebDriver\Exception\NoSuchElementException; trait MakesAssertions @@ -16,7 +17,10 @@ trait MakesAssertions */ public function assertTitle($title) { - PHPUnit::assertEquals($title, $this->driver->getTitle()); + PHPUnit::assertEquals( + $title, $this->driver->getTitle(), + "Expected title [{$title}] does not equal actual title [{$this->driver->getTitle()}]." + ); return $this; } @@ -30,7 +34,36 @@ trait MakesAssertions public function assertTitleContains($title) { PHPUnit::assertTrue( - Str::contains($this->driver->getTitle(), $title) + Str::contains($this->driver->getTitle(), $title), + "Did not see expected value [{$title}] within title [{$this->driver->getTitle()}]." + ); + + return $this; + } + + /** + * Assert that the current URL matches the given URL. + * + * @param string $url + * @return $this + */ + public function assertUrlIs($url) + { + $pattern = str_replace('\*', '.*', preg_quote($url, '/')); + + $segments = parse_url($this->driver->getCurrentURL()); + + $currentUrl = sprintf( + '%s://%s%s%s', + $segments['scheme'], + $segments['host'], + array_get($segments, 'port', '') ? ':'.$segments['port'] : '', + array_get($segments, 'path', '') + ); + + PHPUnit::assertRegExp( + '/^'.$pattern.'$/u', $currentUrl, + "Actual URL [{$this->driver->getCurrentURL()}] does not equal expected URL [{$url}]." ); return $this; @@ -48,9 +81,12 @@ trait MakesAssertions $pattern = str_replace('\*', '.*', $pattern); - PHPUnit::assertRegExp('/^'.$pattern.'/u', parse_url( - $this->driver->getCurrentURL() - )['path']); + $actualPath = parse_url($this->driver->getCurrentURL())['path']; + + PHPUnit::assertRegExp( + '/^'.$pattern.'$/u', $actualPath, + "Actual path [{$actualPath}] does not equal expected path [{$path}]." + ); return $this; } @@ -63,9 +99,12 @@ trait MakesAssertions */ public function assertPathBeginsWith($path) { - PHPUnit::assertStringStartsWith($path, parse_url( - $this->driver->getCurrentURL() - )['path']); + $actualPath = parse_url($this->driver->getCurrentURL())['path']; + + PHPUnit::assertStringStartsWith( + $path, $actualPath, + "Actual path [{$actualPath}] does not begin with expected path [{$path}]." + ); return $this; } @@ -78,9 +117,68 @@ trait MakesAssertions */ public function assertPathIsNot($path) { - PHPUnit::assertNotEquals($path, parse_url( - $this->driver->getCurrentURL() - )['path']); + $actualPath = parse_url($this->driver->getCurrentURL())['path']; + + PHPUnit::assertNotEquals( + $path, $actualPath, + "Path [{$path}] should not equal the actual value." + ); + + return $this; + } + + /** + * Assert that the current URL fragment matches the given pattern. + * + * @param string $fragment + * @return $this + */ + public function assertFragmentIs($fragment) + { + $pattern = preg_quote($fragment, '/'); + + $actualFragment = (string) parse_url($this->driver->executeScript('return window.location.href;'), PHP_URL_FRAGMENT); + + PHPUnit::assertRegExp( + '/^'.str_replace('\*', '.*', $pattern).'$/u', $actualFragment, + "Actual fragment [{$actualFragment}] does not equal expected fragment [{$fragment}]." + ); + + return $this; + } + + /** + * Assert that the current URL fragment begins with given fragment. + * + * @param string $fragment + * @return $this + */ + public function assertFragmentBeginsWith($fragment) + { + $actualFragment = (string) parse_url($this->driver->executeScript('return window.location.href;'), PHP_URL_FRAGMENT); + + PHPUnit::assertStringStartsWith( + $fragment, $actualFragment, + "Actual fragment [$actualFragment] does not begin with expected fragment [$fragment]." + ); + + return $this; + } + + /** + * Assert that the current URL fragment does not match the given fragment. + * + * @param string $fragment + * @return $this + */ + public function assertFragmentIsNot($fragment) + { + $actualFragment = (string) parse_url($this->driver->executeScript('return window.location.href;'), PHP_URL_FRAGMENT); + + PHPUnit::assertNotEquals( + $fragment, $actualFragment, + "Fragment [{$fragment}] should not equal the actual value." + ); return $this; } @@ -149,7 +247,7 @@ trait MakesAssertions * Assert that the given query string parameter is present. * * @param string $name - * @return $this + * @return array */ protected function assertHasQueryStringParameter($name) { @@ -186,6 +284,22 @@ trait MakesAssertions return $this; } + /** + * Assert that the given cookie is not present. + * + * @param string $name + * @return $this + */ + public function assertCookieMissing($name) + { + PHPUnit::assertTrue( + is_null($this->cookie($name)), + "Found unexpected cookie [{$name}]." + ); + + return $this; + } + /** * Assert that an encrypted cookie has a given value. * @@ -347,7 +461,7 @@ trait MakesAssertions if ($this->resolver->prefix) { $message = "Saw unexpected link [{$link}] within [{$this->resolver->prefix}]."; } else { - $message = "Saw unexpected expected link [{$link}]."; + $message = "Saw unexpected link [{$link}]."; } PHPUnit::assertFalse( @@ -387,7 +501,10 @@ JS; */ public function assertInputValue($field, $value) { - PHPUnit::assertEquals($value, $this->inputValue($field)); + PHPUnit::assertEquals( + $value, $this->inputValue($field), + "Expected value [{$value}] for the [{$field}] input does not equal the actual value [{$this->inputValue($field)}]." + ); return $this; } @@ -401,7 +518,10 @@ JS; */ public function assertInputValueIsNot($field, $value) { - PHPUnit::assertNotEquals($value, $this->inputValue($field)); + PHPUnit::assertNotEquals( + $value, $this->inputValue($field), + "Value [{$value}] for the [{$field}] input should not equal the actual value." + ); return $this; } @@ -466,7 +586,7 @@ JS; * @param string $value * @return $this */ - function assertRadioSelected($field, $value) + public function assertRadioSelected($field, $value) { $element = $this->resolver->resolveForRadioSelection($field, $value); @@ -540,9 +660,14 @@ JS; */ public function assertSelectHasOptions($field, array $values) { + $options = $this->resolver->resolveSelectOptions($field, $values); + + $options = collect($options)->unique(function (RemoteWebElement $option) { + return $option->getAttribute('value'); + })->all(); + PHPUnit::assertCount( - count($values), - $this->resolver->resolveSelectOptions($field, $values), + count($values), $options, "Expected options [".implode(',', $values)."] for selection field [{$field}] to be available." ); @@ -638,6 +763,24 @@ JS; return $this; } + /** + * Assert that the element with the given selector is present in the DOM. + * + * @param string $selector + * @return $this + */ + public function assertPresent($selector) + { + $fullSelector = $this->resolver->format($selector); + + PHPUnit::assertTrue( + ! is_null($this->resolver->find($selector)), + "Element [{$fullSelector}] is not present." + ); + + return $this; + } + /** * Assert that the element with the given selector is not on the page. * @@ -667,10 +810,160 @@ JS; */ public function assertDialogOpened($message) { + $actualMessage = $this->driver->switchTo()->alert()->getText(); + PHPUnit::assertEquals( - $message, $this->driver->switchTo()->alert()->getText() + $message, $actualMessage, + "Expected dialog message [{$message}] does not equal actual message [{$actualMessage}]." ); return $this; } + + /** + * Assert that the given field is enabled. + * + * @param string $field + * @return $this + */ + public function assertEnabled($field) { + $element = $this->resolver->resolveForField($field); + + PHPUnit::assertTrue( + $element->isEnabled(), + "Expected element [{$field}] to be enabled, but it wasn't." + ); + + return $this; + } + + /** + * Assert that the given field is disabled. + * + * @param string $field + * @return $this + */ + public function assertDisabled($field) { + $element = $this->resolver->resolveForField($field); + + PHPUnit::assertFalse( + $element->isEnabled(), + "Expected element [{$field}] to be disabled, but it wasn't." + ); + + return $this; + } + + /** + * Assert that the given field is focused. + * + * @param string $field + * @return $this + */ + public function assertFocused($field) { + $element = $this->resolver->resolveForField($field); + + PHPUnit::assertTrue( + $this->driver->switchTo()->activeElement()->equals($element), + "Expected element [{$field}] to be focused, but it wasn't." + ); + + return $this; + } + + /** + * Assert that the given field is not focused. + * + * @param string $field + * @return $this + */ + public function assertNotFocused($field) { + $element = $this->resolver->resolveForField($field); + + PHPUnit::assertFalse( + $this->driver->switchTo()->activeElement()->equals($element), + "Expected element [{$field}] not to be focused, but it was." + ); + + return $this; + } + + /** + * Assert that the Vue component's attribute at the given key has the given value. + * + * @param string $key + * @param string $value + * @param string|null $componentSelector + * @return $this + */ + public function assertVue($key, $value, $componentSelector = null) + { + PHPUnit::assertEquals($value, $this->vueAttribute($componentSelector, $key)); + + return $this; + } + + /** + * Assert that the Vue component's attribute at the given key + * does not have the given value. + * + * @param string $key + * @param string $value + * @param string|null $componentSelector + * @return $this + */ + public function assertVueIsNot($key, $value, $componentSelector = null) + { + PHPUnit::assertNotEquals($value, $this->vueAttribute($componentSelector, $key)); + + return $this; + } + + /** + * Assert that the Vue component's attribute at the given key + * is an array that contains the given value. + * + * @param string $key + * @param string $value + * @param string|null $componentSelector + * @return $this + */ + public function assertVueContains($key, $value, $componentSelector = null) + { + PHPUnit::assertContains($value, $this->vueAttribute($componentSelector, $key)); + + return $this; + } + + /** + * Assert that the Vue component's attribute at the given key + * is an array that does not contain the given value. + * + * @param string $key + * @param string $value + * @param string|null $componentSelector + * @return $this + */ + public function assertVueDoesNotContain($key, $value, $componentSelector = null) + { + PHPUnit::assertNotContains($value, $this->vueAttribute($componentSelector, $key)); + + return $this; + } + + /** + * Retrieve the value of the Vue component's attribute at the given key. + * + * @param string $componentSelector + * @param string $key + * @return mixed + */ + public function vueAttribute($componentSelector, $key) + { + $fullSelector = $this->resolver->format($componentSelector); + + return $this->driver->executeScript( + "return document.querySelector('" . $fullSelector . "').__vue__." . $key + ); + } } diff --git a/vendor/laravel/dusk/src/Concerns/ProvidesBrowser.php b/vendor/laravel/dusk/src/Concerns/ProvidesBrowser.php new file mode 100644 index 000000000..d767463da --- /dev/null +++ b/vendor/laravel/dusk/src/Concerns/ProvidesBrowser.php @@ -0,0 +1,199 @@ +createBrowsersFor($callback); + + try { + $callback(...$browsers->all()); + } catch (Exception $e) { + $this->captureFailuresFor($browsers); + + throw $e; + } catch (Throwable $e) { + $this->captureFailuresFor($browsers); + + throw $e; + } finally { + $this->storeConsoleLogsFor($browsers); + + static::$browsers = $this->closeAllButPrimary($browsers); + } + } + + /** + * Create the browser instances needed for the given callback. + * + * @param \Closure $callback + * @return array + */ + protected function createBrowsersFor(Closure $callback) + { + if (count(static::$browsers) === 0) { + static::$browsers = collect([$this->newBrowser($this->createWebDriver())]); + } + + $additional = $this->browsersNeededFor($callback) - 1; + + for ($i = 0; $i < $additional; $i++) { + static::$browsers->push($this->newBrowser($this->createWebDriver())); + } + + return static::$browsers; + } + + /** + * Create a new Browser instance. + * + * @param \Facebook\WebDriver\Remote\RemoteWebDriver $driver + * @return \Laravel\Dusk\Browser + */ + protected function newBrowser($driver) + { + return new Browser($driver); + } + + /** + * Get the number of browsers needed for a given callback. + * + * @param \Closure $callback + * @return int + */ + protected function browsersNeededFor(Closure $callback) + { + return (new ReflectionFunction($callback))->getNumberOfParameters(); + } + + /** + * Capture failure screenshots for each browser. + * + * @param \Illuminate\Support\Collection $browsers + * @return void + */ + protected function captureFailuresFor($browsers) + { + $browsers->each(function ($browser, $key) { + $name = str_replace('\\', '_', get_class($this)).'_'.$this->getName(false); + + $browser->screenshot('failure-'.$name.'-'.$key); + }); + } + + /** + * Store the console output for the given browsers. + * + * @param \Illuminate\Support\Collection $browsers + * @return void + */ + protected function storeConsoleLogsFor($browsers) + { + $browsers->each(function ($browser, $key) { + $name = str_replace('\\', '_', get_class($this)).'_'.$this->getName(false); + + $browser->storeConsoleLog($name.'-'.$key); + }); + } + + /** + * Close all of the browsers except the primary (first) one. + * + * @param \Illuminate\Support\Collection $browsers + * @return \Illuminate\Support\Collection + */ + protected function closeAllButPrimary($browsers) + { + $browsers->slice(1)->each->quit(); + + return $browsers->take(1); + } + + /** + * Close all of the active browsers. + * + * @return void + */ + public static function closeAll() + { + Collection::make(static::$browsers)->each->quit(); + + static::$browsers = collect(); + } + + /** + * Create the remote web driver instance. + * + * @return \Facebook\WebDriver\Remote\RemoteWebDriver + */ + protected function createWebDriver() + { + return retry(5, function () { + return $this->driver(); + }, 50); + } + + /** + * Create the RemoteWebDriver instance. + * + * @return \Facebook\WebDriver\Remote\RemoteWebDriver + */ + abstract protected function driver(); +} diff --git a/vendor/laravel/dusk/src/Concerns/WaitsForElements.php b/vendor/laravel/dusk/src/Concerns/WaitsForElements.php index 603a2e49f..6b652bab0 100644 --- a/vendor/laravel/dusk/src/Concerns/WaitsForElements.php +++ b/vendor/laravel/dusk/src/Concerns/WaitsForElements.php @@ -8,6 +8,7 @@ use Carbon\Carbon; use Illuminate\Support\Str; use Facebook\WebDriver\Exception\TimeOutException; use Facebook\WebDriver\Exception\NoSuchElementException; +use Facebook\WebDriver\WebDriverExpectedCondition; trait WaitsForElements { @@ -19,7 +20,7 @@ trait WaitsForElements * @param int $seconds * @return $this */ - public function whenAvailable($selector, Closure $callback, $seconds = 5) + public function whenAvailable($selector, Closure $callback, $seconds = null) { return $this->waitFor($selector, $seconds)->with($selector, $callback); } @@ -31,11 +32,11 @@ trait WaitsForElements * @param int $seconds * @return $this */ - public function waitFor($selector, $seconds = 5) + public function waitFor($selector, $seconds = null) { return $this->waitUsing($seconds, 100, function () use ($selector) { return $this->resolver->findOrFail($selector)->isDisplayed(); - }, "Waited {$seconds} seconds for selector [{$selector}]."); + }, "Waited %s seconds for selector [{$selector}]."); } /** @@ -45,7 +46,7 @@ trait WaitsForElements * @param int $seconds * @return $this */ - public function waitUntilMissing($selector, $seconds = 5) + public function waitUntilMissing($selector, $seconds = null) { return $this->waitUsing($seconds, 100, function () use ($selector) { try { @@ -55,7 +56,7 @@ trait WaitsForElements } return $missing; - }, "Waited {$seconds} seconds for removal of selector [{$selector}]."); + }, "Waited %s seconds for removal of selector [{$selector}]."); } /** @@ -65,11 +66,11 @@ trait WaitsForElements * @param int $seconds * @return $this */ - public function waitForText($text, $seconds = 5) + public function waitForText($text, $seconds = null) { return $this->waitUsing($seconds, 100, function () use ($text) { return Str::contains($this->resolver->findOrFail('')->getText(), $text); - }, "Waited {$seconds} seconds for text [{$text}]."); + }, "Waited %s seconds for text [{$text}]."); } /** @@ -79,7 +80,7 @@ trait WaitsForElements * @param int $seconds * @return $this */ - public function waitForLink($link, $seconds = 5) + public function waitForLink($link, $seconds = null) { return $this->waitUsing($seconds, 100, function () use ($link) { return $this->seeLink($link); @@ -93,11 +94,24 @@ trait WaitsForElements * @param int $seconds * @return $this */ - public function waitForLocation($path, $seconds = 5) + public function waitForLocation($path, $seconds = null) { return $this->waitUntil("window.location.pathname == '{$path}'", $seconds); } + /** + * Wait for the given location using a named route. + * + * @param string $route + * @param array $parameters + * @param int $seconds + * @return $this + */ + public function waitForRoute($route, $parameters = [], $seconds = null) + { + return $this->waitForLocation(route($route, $parameters), $seconds); + } + /** * Wait until the given script returns true. * @@ -105,7 +119,7 @@ trait WaitsForElements * @param int $seconds * @return $this */ - public function waitUntil($script, $seconds = 5) + public function waitUntil($script, $seconds = null) { if (! Str::startsWith($script, 'return ')) { $script = 'return '.$script; @@ -120,6 +134,23 @@ trait WaitsForElements }); } + /** + * Wait for a JavaScript dialog to open. + * + * @param int $seconds + * @return $this + */ + public function waitForDialog($seconds = null) + { + $seconds = is_null($seconds) ? static::$waitSeconds : $seconds; + + $this->driver->wait($seconds, 100)->until( + WebDriverExpectedCondition::alertIsPresent(), "Waited {$seconds} seconds for dialog." + ); + + return $this; + } + /** * Wait for the current page to reload. * @@ -127,7 +158,7 @@ trait WaitsForElements * @param int $seconds * @return $this */ - public function waitForReload($callback = null, $seconds = 5) + public function waitForReload($callback = null, $seconds = null) { $token = str_random(); @@ -139,7 +170,7 @@ trait WaitsForElements return $this->waitUsing($seconds, 100, function () use ($token) { return $this->driver->executeScript("return typeof window['{$token}'] === 'undefined';"); - }); + }, 'Waited %s seconds for page reload.'); } /** @@ -154,6 +185,8 @@ trait WaitsForElements */ public function waitUsing($seconds, $interval, Closure $callback, $message = null) { + $seconds = is_null($seconds) ? static::$waitSeconds : $seconds; + $this->pause($interval); $started = Carbon::now(); @@ -168,7 +201,10 @@ trait WaitsForElements } if ($started->lt(Carbon::now()->subSeconds($seconds))) { - throw new TimeOutException($message ?: "Waited {$seconds} seconds for callback."); + throw new TimeOutException($message + ? sprintf($message, $seconds) + : "Waited {$seconds} seconds for callback." + ); } $this->pause($interval); diff --git a/vendor/laravel/dusk/src/Console/ComponentCommand.php b/vendor/laravel/dusk/src/Console/ComponentCommand.php new file mode 100644 index 000000000..273f0037a --- /dev/null +++ b/vendor/laravel/dusk/src/Console/ComponentCommand.php @@ -0,0 +1,73 @@ +rootNamespace(), '', $name); + + return $this->laravel->basePath().'/tests'.str_replace('\\', '/', $name).'.php'; + } + + /** + * Get the default namespace for the class. + * + * @param string $rootNamespace + * @return string + */ + protected function getDefaultNamespace($rootNamespace) + { + return $rootNamespace.'\Browser\Components'; + } + + /** + * Get the root namespace for the class. + * + * @return string + */ + protected function rootNamespace() + { + return 'Tests'; + } +} diff --git a/vendor/laravel/dusk/src/Console/DuskCommand.php b/vendor/laravel/dusk/src/Console/DuskCommand.php index 99940128e..bce3dea38 100644 --- a/vendor/laravel/dusk/src/Console/DuskCommand.php +++ b/vendor/laravel/dusk/src/Console/DuskCommand.php @@ -3,9 +3,10 @@ namespace Laravel\Dusk\Console; use Dotenv\Dotenv; +use Illuminate\Support\Str; use Illuminate\Console\Command; use Symfony\Component\Finder\Finder; -use Symfony\Component\Process\ProcessBuilder; +use Symfony\Component\Process\Process; use Symfony\Component\Process\Exception\RuntimeException; class DuskCommand extends Command @@ -15,7 +16,7 @@ class DuskCommand extends Command * * @var string */ - protected $signature = 'dusk'; + protected $signature = 'dusk {--without-tty : Disable output to TTY}'; /** * The console command description. @@ -54,17 +55,15 @@ class DuskCommand extends Command $this->purgeConsoleLogs(); - $options = array_slice($_SERVER['argv'], 2); + $options = array_slice($_SERVER['argv'], $this->option('without-tty') ? 3 : 2); return $this->withDuskEnvironment(function () use ($options) { - $process = (new ProcessBuilder()) - ->setTimeout(null) - ->setPrefix($this->binary()) - ->setArguments($this->phpunitArguments($options)) - ->getProcess(); + $process = (new Process(array_merge( + $this->binary(), $this->phpunitArguments($options) + )))->setTimeout(null); try { - $process->setTty(true); + $process->setTty(! $this->option('without-tty')); } catch (RuntimeException $e) { $this->output->writeln('Warning: '.$e->getMessage()); } @@ -88,10 +87,15 @@ class DuskCommand extends Command /** * Get the array of arguments for running PHPUnit. * + * @param array $options * @return array */ protected function phpunitArguments($options) { + $options = array_values(array_filter($options, function ($option) { + return ! Str::startsWith($option, '--env='); + })); + return array_merge(['-c', base_path('phpunit.dusk.xml')], $options); } diff --git a/vendor/laravel/dusk/src/Console/InstallCommand.php b/vendor/laravel/dusk/src/Console/InstallCommand.php index ab927d325..158cf66e2 100644 --- a/vendor/laravel/dusk/src/Console/InstallCommand.php +++ b/vendor/laravel/dusk/src/Console/InstallCommand.php @@ -41,6 +41,10 @@ class InstallCommand extends Command mkdir(base_path('tests/Browser/Pages'), 0755, true); } + if (! is_dir(base_path('tests/Browser/Components'))) { + mkdir(base_path('tests/Browser/Components'), 0755, true); + } + if (! is_dir(base_path('tests/Browser/screenshots'))) { $this->createScreenshotsDirectory(); } @@ -49,14 +53,14 @@ class InstallCommand extends Command $this->createConsoleDirectory(); } - $subs = [ + $stubs = [ 'ExampleTest.stub' => base_path('tests/Browser/ExampleTest.php'), 'HomePage.stub' => base_path('tests/Browser/Pages/HomePage.php'), 'DuskTestCase.stub' => base_path('tests/DuskTestCase.php'), 'Page.stub' => base_path('tests/Browser/Pages/Page.php'), ]; - foreach ($subs as $stub => $file) { + foreach ($stubs as $stub => $file) { if (! is_file($file)) { copy(__DIR__.'/../../stubs/'.$stub, $file); } diff --git a/vendor/laravel/dusk/src/Console/stubs/component.stub b/vendor/laravel/dusk/src/Console/stubs/component.stub new file mode 100644 index 000000000..c0c115022 --- /dev/null +++ b/vendor/laravel/dusk/src/Console/stubs/component.stub @@ -0,0 +1,42 @@ +assertVisible($this->selector()); + } + + /** + * Get the element shortcuts for the component. + * + * @return array + */ + public function elements() + { + return [ + '@element' => '#selector', + ]; + } +} diff --git a/vendor/laravel/dusk/src/Console/stubs/page.stub b/vendor/laravel/dusk/src/Console/stubs/page.stub index ee3cf995d..31cf74cc7 100644 --- a/vendor/laravel/dusk/src/Console/stubs/page.stub +++ b/vendor/laravel/dusk/src/Console/stubs/page.stub @@ -3,9 +3,8 @@ namespace DummyNamespace; use Laravel\Dusk\Browser; -use Laravel\Dusk\Page as BasePage; -class DummyClass extends BasePage +class DummyClass extends Page { /** * Get the URL for the page. diff --git a/vendor/laravel/dusk/src/DuskServiceProvider.php b/vendor/laravel/dusk/src/DuskServiceProvider.php index 5a21c6fcd..5110645d4 100644 --- a/vendor/laravel/dusk/src/DuskServiceProvider.php +++ b/vendor/laravel/dusk/src/DuskServiceProvider.php @@ -49,6 +49,7 @@ class DuskServiceProvider extends ServiceProvider Console\DuskCommand::class, Console\MakeCommand::class, Console\PageCommand::class, + Console\ComponentCommand::class, ]); } } diff --git a/vendor/laravel/dusk/src/ElementResolver.php b/vendor/laravel/dusk/src/ElementResolver.php index 865a0219b..c0ceab2ff 100644 --- a/vendor/laravel/dusk/src/ElementResolver.php +++ b/vendor/laravel/dusk/src/ElementResolver.php @@ -111,7 +111,7 @@ class ElementResolver * * @param string $field * @param array $values - * @return array + * @return \Facebook\WebDriver\Remote\RemoteWebElement[] */ public function resolveSelectOptions($field, array $values) { @@ -122,7 +122,7 @@ class ElementResolver return []; } - return array_filter($options, function($option) use ($values) { + return array_filter($options, function ($option) use ($values) { return in_array($option->getAttribute('value'), $values); }); } @@ -192,6 +192,24 @@ class ElementResolver ]); } + /** + * Resolve the element for a given "field". + * + * @param string $field + * @return \Facebook\WebDriver\Remote\RemoteWebElement + */ + public function resolveForField($field) + { + if (! is_null($element = $this->findById($field))) { + return $element; + } + + return $this->firstOrFail([ + $field, "input[name='{$field}']", "textarea[name='{$field}']", + "select[name='{$field}']", "button[name='{$field}']" + ]); + } + /** * Resolve the element for a given button. * @@ -337,7 +355,7 @@ class ElementResolver * Find the elements by the given selector or return an empty array. * * @param string $selector - * @return array + * @return \Facebook\WebDriver\Remote\RemoteWebElement[] */ public function all($selector) { @@ -360,7 +378,7 @@ class ElementResolver */ public function format($selector) { - $sortedElements = collect($this->elements)->sortByDesc(function($element, $key){ + $sortedElements = collect($this->elements)->sortByDesc(function ($element, $key) { return strlen($key); })->toArray(); diff --git a/vendor/laravel/dusk/src/Http/Controllers/UserController.php b/vendor/laravel/dusk/src/Http/Controllers/UserController.php index 2a4f833bc..108dec696 100644 --- a/vendor/laravel/dusk/src/Http/Controllers/UserController.php +++ b/vendor/laravel/dusk/src/Http/Controllers/UserController.php @@ -31,19 +31,16 @@ class UserController * * @param string $userId * @param string $guard - * @return Response */ public function login($userId, $guard = null) { - $model = $this->modelForGuard( - $guard = $guard ?: config('auth.defaults.guard') - ); + $guard = $guard ?: config('auth.defaults.guard'); - if (str_contains($userId, '@')) { - $user = (new $model)->where('email', $userId)->first(); - } else { - $user = (new $model)->find($userId); - } + $provider = Auth::guard($guard)->getProvider(); + + $user = str_contains($userId, '@') + ? $provider->retrieveByCredentials(['email' => $userId]) + : $provider->retrieveById($userId); Auth::guard($guard)->login($user); } @@ -52,7 +49,6 @@ class UserController * Log the user out of the application. * * @param string $guard - * @return Response */ public function logout($guard = null) { diff --git a/vendor/laravel/dusk/src/TestCase.php b/vendor/laravel/dusk/src/TestCase.php index b9a30f88e..9eb4164a1 100644 --- a/vendor/laravel/dusk/src/TestCase.php +++ b/vendor/laravel/dusk/src/TestCase.php @@ -2,32 +2,16 @@ namespace Laravel\Dusk; -use Closure; use Exception; -use Throwable; -use ReflectionFunction; -use Illuminate\Support\Collection; +use Laravel\Dusk\Chrome\SupportsChrome; use Facebook\WebDriver\Remote\RemoteWebDriver; use Facebook\WebDriver\Remote\DesiredCapabilities; use Illuminate\Foundation\Testing\TestCase as FoundationTestCase; abstract class TestCase extends FoundationTestCase { - use SupportsChrome; - - /** - * All of the active browser instances. - * - * @var array - */ - protected static $browsers = []; - - /** - * The callbacks that should be run on class tear down. - * - * @var array - */ - protected static $afterClassCallbacks = []; + use Concerns\ProvidesBrowser, + SupportsChrome; /** * Register the base URL with Dusk. @@ -49,167 +33,6 @@ abstract class TestCase extends FoundationTestCase }; } - /** - * Tear down the Dusk test case class. - * - * @afterClass - * @return void - */ - public static function tearDownDuskClass() - { - static::closeAll(); - - foreach (static::$afterClassCallbacks as $callback) { - $callback(); - } - } - - /** - * Register an "after class" tear down callback. - * - * @param \Closure $callback - * @return void - */ - public static function afterClass(Closure $callback) - { - static::$afterClassCallbacks[] = $callback; - } - - /** - * Create a new browser instance. - * - * @param \Closure $callback - * @return \Laravel\Dusk\Browser|void - * @throws \Exception - * @throws \Throwable - */ - public function browse(Closure $callback) - { - $browsers = $this->createBrowsersFor($callback); - - try { - $callback(...$browsers->all()); - } catch (Exception $e) { - $this->captureFailuresFor($browsers); - - throw $e; - } catch (Throwable $e) { - $this->captureFailuresFor($browsers); - - throw $e; - } finally { - $this->storeConsoleLogsFor($browsers); - - static::$browsers = $this->closeAllButPrimary($browsers); - } - } - - /** - * Create the browser instances needed for the given callback. - * - * @param \Closure $callback - * @return array - */ - protected function createBrowsersFor(Closure $callback) - { - if (count(static::$browsers) === 0) { - static::$browsers = collect([$this->newBrowser($this->createWebDriver())]); - } - - $additional = $this->browsersNeededFor($callback) - 1; - - for ($i = 0; $i < $additional; $i++) { - static::$browsers->push($this->newBrowser($this->createWebDriver())); - } - - return static::$browsers; - } - - /** - * Create a new Browser instance. - * - * @param \Facebook\WebDriver\Remote\RemoteWebDriver $driver - * @return \Laravel\Dusk\Browser - */ - protected function newBrowser($driver) - { - return new Browser($driver); - } - - /** - * Get the number of browsers needed for a given callback. - * - * @param \Closure $callback - * @return int - */ - protected function browsersNeededFor(Closure $callback) - { - return (new ReflectionFunction($callback))->getNumberOfParameters(); - } - - /** - * Capture failure screenshots for each browser. - * - * @param \Illuminate\Support\Collection $browsers - * @return void - */ - protected function captureFailuresFor($browsers) - { - $browsers->each(function ($browser, $key) { - $browser->screenshot('failure-'.$this->getName().'-'.$key); - }); - } - - /** - * Store the console output for the given browsers. - * - * @param \Illuminate\Support\Collection $browsers - * @return void - */ - protected function storeConsoleLogsFor($browsers) - { - $browsers->each(function ($browser, $key) { - $browser->storeConsoleLog($this->getName().'-'.$key); - }); - } - - /** - * Close all of the browsers except the primary (first) one. - * - * @param \Illuminate\Support\Collection $browsers - * @return \Illuminate\Support\Collection - */ - protected function closeAllButPrimary($browsers) - { - $browsers->slice(1)->each->quit(); - - return $browsers->take(1); - } - - /** - * Close all of the active browsers. - * - * @return void - */ - public static function closeAll() - { - Collection::make(static::$browsers)->each->quit(); - - static::$browsers = collect(); - } - - /** - * Create the remote web driver instance. - * - * @return \Facebook\WebDriver\Remote\RemoteWebDriver - */ - protected function createWebDriver() - { - return retry(5, function () { - return $this->driver(); - }, 50); - } - /** * Create the RemoteWebDriver instance. * @@ -225,7 +48,7 @@ abstract class TestCase extends FoundationTestCase /** * Determine the application's base URL. * - * @var string + * @return string */ protected function baseUrl() { @@ -233,9 +56,9 @@ abstract class TestCase extends FoundationTestCase } /** - * Get a callback that returns the default user to authenticate. + * Return the default user to authenticate. * - * @return \Closure + * @return \App\User|int|null * @throws \Exception */ protected function user() diff --git a/vendor/laravel/framework/composer.json b/vendor/laravel/framework/composer.json index f892a85e9..2942e7a4e 100644 --- a/vendor/laravel/framework/composer.json +++ b/vendor/laravel/framework/composer.json @@ -15,28 +15,28 @@ } ], "require": { - "php": ">=7.0", + "php": "^7.1.3", "ext-mbstring": "*", "ext-openssl": "*", "doctrine/inflector": "~1.1", + "dragonmantank/cron-expression": "~2.0", "erusev/parsedown": "~1.7", "league/flysystem": "^1.0.8", "monolog/monolog": "~1.12", - "mtdowling/cron-expression": "~1.0", - "nesbot/carbon": "^1.24.1", + "nesbot/carbon": "1.25.*", "psr/container": "~1.0", "psr/simple-cache": "^1.0", - "ramsey/uuid": "~3.0", + "ramsey/uuid": "^3.7", "swiftmailer/swiftmailer": "~6.0", - "symfony/console": "~3.3", - "symfony/debug": "~3.3", - "symfony/finder": "~3.3", - "symfony/http-foundation": "~3.3", - "symfony/http-kernel": "~3.3", - "symfony/process": "~3.3", - "symfony/routing": "~3.3", - "symfony/var-dumper": "~3.3", - "tijsverkoyen/css-to-inline-styles": "~2.2", + "symfony/console": "~4.0", + "symfony/debug": "~4.0", + "symfony/finder": "~4.0", + "symfony/http-foundation": "~4.0", + "symfony/http-kernel": "~4.0", + "symfony/process": "~4.0", + "symfony/routing": "~4.0", + "symfony/var-dumper": "~4.0", + "tijsverkoyen/css-to-inline-styles": "^2.2.1", "vlucas/phpdotenv": "~2.2" }, "replace": { @@ -67,20 +67,24 @@ "illuminate/support": "self.version", "illuminate/translation": "self.version", "illuminate/validation": "self.version", - "illuminate/view": "self.version", + "illuminate/view": "self.version" + }, + "conflict": { "tightenco/collect": "<5.5.33" }, "require-dev": { "aws/aws-sdk-php": "~3.0", - "doctrine/dbal": "~2.5", + "doctrine/dbal": "~2.6", "filp/whoops": "^2.1.4", + "league/flysystem-cached-adapter": "~1.0", "mockery/mockery": "~1.0", - "orchestra/testbench-core": "3.5.*", + "moontoast/math": "^1.1", + "orchestra/testbench-core": "3.6.*", "pda/pheanstalk": "~3.0", - "phpunit/phpunit": "~6.0", + "phpunit/phpunit": "~7.0", "predis/predis": "^1.1.1", - "symfony/css-selector": "~3.3", - "symfony/dom-crawler": "~3.3" + "symfony/css-selector": "~4.0", + "symfony/dom-crawler": "~4.0" }, "autoload": { "files": [ @@ -101,26 +105,27 @@ }, "extra": { "branch-alias": { - "dev-master": "5.5-dev" + "dev-master": "5.6-dev" } }, "suggest": { "ext-pcntl": "Required to use all features of the queue worker.", "ext-posix": "Required to use all features of the queue worker.", "aws/aws-sdk-php": "Required to use the SQS queue driver and SES mail driver (~3.0).", - "doctrine/dbal": "Required to rename columns and drop SQLite columns (~2.5).", + "doctrine/dbal": "Required to rename columns and drop SQLite columns (~2.6).", "fzaninotto/faker": "Required to use the eloquent factory builder (~1.4).", "guzzlehttp/guzzle": "Required to use the Mailgun and Mandrill mail drivers and the ping methods on schedules (~6.0).", "laravel/tinker": "Required to use the tinker console command (~1.0).", "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (~1.0).", + "league/flysystem-cached-adapter": "Required to use the Flysystem cache (~1.0).", "league/flysystem-rackspace": "Required to use the Flysystem Rackspace driver (~1.0).", - "league/flysystem-cached-adapter": "Required to use Flysystem caching (~1.0).", + "league/flysystem-sftp": "Required to use the Flysystem SFTP driver (~1.0).", "nexmo/client": "Required to use the Nexmo transport (~1.0).", "pda/pheanstalk": "Required to use the beanstalk queue driver (~3.0).", "predis/predis": "Required to use the redis cache and queue drivers (~1.0).", "pusher/pusher-php-server": "Required to use the Pusher broadcast driver (~3.0).", - "symfony/css-selector": "Required to use some of the crawler integration testing tools (~3.3).", - "symfony/dom-crawler": "Required to use most of the crawler integration testing tools (~3.3).", + "symfony/css-selector": "Required to use some of the crawler integration testing tools (~4.0).", + "symfony/dom-crawler": "Required to use most of the crawler integration testing tools (~4.0).", "symfony/psr-http-message-bridge": "Required to psr7 bridging features (~1.0)." }, "config": { diff --git a/vendor/laravel/framework/readme.md b/vendor/laravel/framework/readme.md index d5c2fa27b..834277a6e 100644 --- a/vendor/laravel/framework/readme.md +++ b/vendor/laravel/framework/readme.md @@ -30,7 +30,7 @@ If you're not in the mood to read, [Laracasts](https://laracasts.com) contains o ## Contributing -Thank you for considering contributing to the Laravel framework! The contribution guide can be found in the [Laravel documentation](http://laravel.com/docs/contributions). +Thank you for considering contributing to the Laravel framework! The contribution guide can be found in the [Laravel documentation](https://laravel.com/docs/contributions). ## Code of Conduct @@ -42,4 +42,4 @@ If you discover a security vulnerability within Laravel, please send an e-mail t ## License -The Laravel framework is open-sourced software licensed under the [MIT license](http://opensource.org/licenses/MIT). +The Laravel framework is open-sourced software licensed under the [MIT license](https://opensource.org/licenses/MIT). diff --git a/vendor/laravel/framework/src/Illuminate/Auth/Access/Gate.php b/vendor/laravel/framework/src/Illuminate/Auth/Access/Gate.php index dfc72cf02..ab42fcbc4 100644 --- a/vendor/laravel/framework/src/Illuminate/Auth/Access/Gate.php +++ b/vendor/laravel/framework/src/Illuminate/Auth/Access/Gate.php @@ -122,7 +122,7 @@ class Gate implements GateContract * * @param string $name * @param string $class - * @param array $abilities + * @param array|null $abilities * @return $this */ public function resource($name, $class, array $abilities = null) diff --git a/vendor/laravel/framework/src/Illuminate/Auth/Access/Response.php b/vendor/laravel/framework/src/Illuminate/Auth/Access/Response.php index a2baff366..ee29c293f 100644 --- a/vendor/laravel/framework/src/Illuminate/Auth/Access/Response.php +++ b/vendor/laravel/framework/src/Illuminate/Auth/Access/Response.php @@ -35,7 +35,7 @@ class Response /** * Get the string representation of the message. * - * @return string + * @return string|null */ public function __toString() { diff --git a/vendor/laravel/framework/src/Illuminate/Auth/AuthManager.php b/vendor/laravel/framework/src/Illuminate/Auth/AuthManager.php index 49825faed..05fefe172 100644 --- a/vendor/laravel/framework/src/Illuminate/Auth/AuthManager.php +++ b/vendor/laravel/framework/src/Illuminate/Auth/AuthManager.php @@ -94,7 +94,7 @@ class AuthManager implements FactoryContract return $this->{$driverMethod}($name, $config); } - throw new InvalidArgumentException("Auth guard driver [{$name}] is not defined."); + throw new InvalidArgumentException("Auth driver [{$config['driver']}] for guard [{$name}] is not defined."); } /** diff --git a/vendor/laravel/framework/src/Illuminate/Auth/Console/stubs/make/views/auth/login.stub b/vendor/laravel/framework/src/Illuminate/Auth/Console/stubs/make/views/auth/login.stub index 07924ce66..474be66e4 100644 --- a/vendor/laravel/framework/src/Illuminate/Auth/Console/stubs/make/views/auth/login.stub +++ b/vendor/laravel/framework/src/Illuminate/Auth/Console/stubs/make/views/auth/login.stub @@ -2,61 +2,63 @@ @section('content')
-
-
-
-
Login
+
+
+
+
{{ __('Login') }}
-
-
- {{ csrf_field() }} +
+ + @csrf -
- +
+
- + @if ($errors->has('email')) - + {{ $errors->first('email') }} @endif
-
- +
+
- + @if ($errors->has('password')) - + {{ $errors->first('password') }} @endif
-
-
-
-
-
+ diff --git a/vendor/laravel/framework/src/Illuminate/Auth/Console/stubs/make/views/auth/passwords/email.stub b/vendor/laravel/framework/src/Illuminate/Auth/Console/stubs/make/views/auth/passwords/email.stub index ad38245bd..12e808345 100644 --- a/vendor/laravel/framework/src/Illuminate/Auth/Console/stubs/make/views/auth/passwords/email.stub +++ b/vendor/laravel/framework/src/Illuminate/Auth/Console/stubs/make/views/auth/passwords/email.stub @@ -2,39 +2,39 @@ @section('content')
-
-
-
-
Reset Password
+
+
+
+
{{ __('Reset Password') }}
-
+
@if (session('status')) -
+ @endif - - {{ csrf_field() }} + + @csrf -
- +
+
- + @if ($errors->has('email')) - + {{ $errors->first('email') }} @endif
-
-
+
+
diff --git a/vendor/laravel/framework/src/Illuminate/Auth/Console/stubs/make/views/auth/passwords/reset.stub b/vendor/laravel/framework/src/Illuminate/Auth/Console/stubs/make/views/auth/passwords/reset.stub index 84ec01016..35576628f 100644 --- a/vendor/laravel/framework/src/Illuminate/Auth/Console/stubs/make/views/auth/passwords/reset.stub +++ b/vendor/laravel/framework/src/Illuminate/Auth/Console/stubs/make/views/auth/passwords/reset.stub @@ -2,62 +2,57 @@ @section('content')
-
-
-
-
Reset Password
+
+
+
+
{{ __('Reset Password') }}
-
- - {{ csrf_field() }} +
+ + @csrf -
- +
+
- + @if ($errors->has('email')) - + {{ $errors->first('email') }} @endif
-
- +
+
- + @if ($errors->has('password')) - + {{ $errors->first('password') }} @endif
-
- +
+ +
- - @if ($errors->has('password_confirmation')) - - {{ $errors->first('password_confirmation') }} - - @endif
-
-
+
+
diff --git a/vendor/laravel/framework/src/Illuminate/Auth/Console/stubs/make/views/auth/register.stub b/vendor/laravel/framework/src/Illuminate/Auth/Console/stubs/make/views/auth/register.stub index 38eef8384..f9dd66293 100644 --- a/vendor/laravel/framework/src/Illuminate/Auth/Console/stubs/make/views/auth/register.stub +++ b/vendor/laravel/framework/src/Illuminate/Auth/Console/stubs/make/views/auth/register.stub @@ -2,69 +2,69 @@ @section('content')
-
-
-
-
Register
+
+
+
+
{{ __('Register') }}
-
- - {{ csrf_field() }} +
+ + @csrf -
- +
+
- + @if ($errors->has('name')) - + {{ $errors->first('name') }} @endif
-
- +
+
- + @if ($errors->has('email')) - + {{ $errors->first('email') }} @endif
-
- +
+
- + @if ($errors->has('password')) - + {{ $errors->first('password') }} @endif
-
- +
+
-
-
+
+
diff --git a/vendor/laravel/framework/src/Illuminate/Auth/Console/stubs/make/views/home.stub b/vendor/laravel/framework/src/Illuminate/Auth/Console/stubs/make/views/home.stub index d8437bf89..05dfca922 100644 --- a/vendor/laravel/framework/src/Illuminate/Auth/Console/stubs/make/views/home.stub +++ b/vendor/laravel/framework/src/Illuminate/Auth/Console/stubs/make/views/home.stub @@ -2,14 +2,14 @@ @section('content')
-
-
-
-
Dashboard
+
+
+
+
Dashboard
-
+
@if (session('status')) -
+ @endif diff --git a/vendor/laravel/framework/src/Illuminate/Auth/Console/stubs/make/views/layouts/app.stub b/vendor/laravel/framework/src/Illuminate/Auth/Console/stubs/make/views/layouts/app.stub index f97a8a20c..6dba26cde 100644 --- a/vendor/laravel/framework/src/Illuminate/Auth/Console/stubs/make/views/layouts/app.stub +++ b/vendor/laravel/framework/src/Illuminate/Auth/Console/stubs/make/views/layouts/app.stub @@ -1,5 +1,5 @@ - + @@ -10,60 +10,60 @@ {{ config('app.name', 'Laravel') }} + + + + + + + - - - diff --git a/vendor/laravel/framework/src/Illuminate/Auth/DatabaseUserProvider.php b/vendor/laravel/framework/src/Illuminate/Auth/DatabaseUserProvider.php index d69cfc626..f8005b7d1 100644 --- a/vendor/laravel/framework/src/Illuminate/Auth/DatabaseUserProvider.php +++ b/vendor/laravel/framework/src/Illuminate/Auth/DatabaseUserProvider.php @@ -4,6 +4,7 @@ namespace Illuminate\Auth; use Illuminate\Support\Str; use Illuminate\Contracts\Auth\UserProvider; +use Illuminate\Contracts\Support\Arrayable; use Illuminate\Database\ConnectionInterface; use Illuminate\Contracts\Hashing\Hasher as HasherContract; use Illuminate\Contracts\Auth\Authenticatable as UserContract; @@ -110,7 +111,13 @@ class DatabaseUserProvider implements UserProvider $query = $this->conn->table($this->table); foreach ($credentials as $key => $value) { - if (! Str::contains($key, 'password')) { + if (Str::contains($key, 'password')) { + continue; + } + + if (is_array($value) || $value instanceof Arrayable) { + $query->whereIn($key, $value); + } else { $query->where($key, $value); } } diff --git a/vendor/laravel/framework/src/Illuminate/Auth/EloquentUserProvider.php b/vendor/laravel/framework/src/Illuminate/Auth/EloquentUserProvider.php index 1630ebe91..e7b447d22 100644 --- a/vendor/laravel/framework/src/Illuminate/Auth/EloquentUserProvider.php +++ b/vendor/laravel/framework/src/Illuminate/Auth/EloquentUserProvider.php @@ -4,6 +4,7 @@ namespace Illuminate\Auth; use Illuminate\Support\Str; use Illuminate\Contracts\Auth\UserProvider; +use Illuminate\Contracts\Support\Arrayable; use Illuminate\Contracts\Hashing\Hasher as HasherContract; use Illuminate\Contracts\Auth\Authenticatable as UserContract; @@ -113,7 +114,13 @@ class EloquentUserProvider implements UserProvider $query = $this->createModel()->newQuery(); foreach ($credentials as $key => $value) { - if (! Str::contains($key, 'password')) { + if (Str::contains($key, 'password')) { + continue; + } + + if (is_array($value) || $value instanceof Arrayable) { + $query->whereIn($key, $value); + } else { $query->where($key, $value); } } diff --git a/vendor/laravel/framework/src/Illuminate/Auth/GuardHelpers.php b/vendor/laravel/framework/src/Illuminate/Auth/GuardHelpers.php index 9a682c3dc..7c41f4d6a 100644 --- a/vendor/laravel/framework/src/Illuminate/Auth/GuardHelpers.php +++ b/vendor/laravel/framework/src/Illuminate/Auth/GuardHelpers.php @@ -40,6 +40,16 @@ trait GuardHelpers throw new AuthenticationException; } + /** + * Determine if the guard has a user instance. + * + * @return bool + */ + public function hasUser() + { + return ! is_null($this->user); + } + /** * Determine if the current user is authenticated. * diff --git a/vendor/laravel/framework/src/Illuminate/Auth/Middleware/Authorize.php b/vendor/laravel/framework/src/Illuminate/Auth/Middleware/Authorize.php index 45d523b52..0993b3b4c 100644 --- a/vendor/laravel/framework/src/Illuminate/Auth/Middleware/Authorize.php +++ b/vendor/laravel/framework/src/Illuminate/Auth/Middleware/Authorize.php @@ -42,7 +42,7 @@ class Authorize * @param \Illuminate\Http\Request $request * @param \Closure $next * @param string $ability - * @param array|null $models + * @param array|null ...$models * @return mixed * * @throws \Illuminate\Auth\AuthenticationException diff --git a/vendor/laravel/framework/src/Illuminate/Auth/Notifications/ResetPassword.php b/vendor/laravel/framework/src/Illuminate/Auth/Notifications/ResetPassword.php index cd1ca8661..c2978fe60 100644 --- a/vendor/laravel/framework/src/Illuminate/Auth/Notifications/ResetPassword.php +++ b/vendor/laravel/framework/src/Illuminate/Auth/Notifications/ResetPassword.php @@ -2,6 +2,7 @@ namespace Illuminate\Auth\Notifications; +use Illuminate\Support\Facades\Lang; use Illuminate\Notifications\Notification; use Illuminate\Notifications\Messages\MailMessage; @@ -14,6 +15,13 @@ class ResetPassword extends Notification */ public $token; + /** + * The callback that should be used to build the mail message. + * + * @var \Closure|null + */ + public static $toMailCallback; + /** * Create a notification instance. * @@ -44,9 +52,25 @@ class ResetPassword extends Notification */ public function toMail($notifiable) { + if (static::$toMailCallback) { + return call_user_func(static::$toMailCallback, $notifiable, $this->token); + } + return (new MailMessage) - ->line('You are receiving this email because we received a password reset request for your account.') - ->action('Reset Password', url(config('app.url').route('password.reset', $this->token, false))) - ->line('If you did not request a password reset, no further action is required.'); + ->subject(Lang::getFromJson('Reset Password Notification')) + ->line(Lang::getFromJson('You are receiving this email because we received a password reset request for your account.')) + ->action(Lang::getFromJson('Reset Password'), url(config('app.url').route('password.reset', $this->token, false))) + ->line(Lang::getFromJson('If you did not request a password reset, no further action is required.')); + } + + /** + * Set a callback that should be used when building the notification mail message. + * + * @param \Closure $callback + * @return void + */ + public static function toMailUsing($callback) + { + static::$toMailCallback = $callback; } } diff --git a/vendor/laravel/framework/src/Illuminate/Auth/Passwords/PasswordBrokerManager.php b/vendor/laravel/framework/src/Illuminate/Auth/Passwords/PasswordBrokerManager.php index 8c21e111a..1d943bd64 100644 --- a/vendor/laravel/framework/src/Illuminate/Auth/Passwords/PasswordBrokerManager.php +++ b/vendor/laravel/framework/src/Illuminate/Auth/Passwords/PasswordBrokerManager.php @@ -39,7 +39,7 @@ class PasswordBrokerManager implements FactoryContract /** * Attempt to get the broker from the local cache. * - * @param string $name + * @param string|null $name * @return \Illuminate\Contracts\Auth\PasswordBroker */ public function broker($name = null) diff --git a/vendor/laravel/framework/src/Illuminate/Auth/SessionGuard.php b/vendor/laravel/framework/src/Illuminate/Auth/SessionGuard.php index 2e40c473d..25b5b2295 100644 --- a/vendor/laravel/framework/src/Illuminate/Auth/SessionGuard.php +++ b/vendor/laravel/framework/src/Illuminate/Auth/SessionGuard.php @@ -4,6 +4,7 @@ namespace Illuminate\Auth; use RuntimeException; use Illuminate\Support\Str; +use Illuminate\Support\Facades\Hash; use Illuminate\Support\Traits\Macroable; use Illuminate\Contracts\Session\Session; use Illuminate\Contracts\Auth\UserProvider; @@ -90,7 +91,7 @@ class SessionGuard implements StatefulGuard, SupportsBasicAuth * @param string $name * @param \Illuminate\Contracts\Auth\UserProvider $provider * @param \Illuminate\Contracts\Session\Session $session - * @param \Symfony\Component\HttpFoundation\Request $request + * @param \Symfony\Component\HttpFoundation\Request|null $request * @return void */ public function __construct($name, @@ -533,6 +534,26 @@ class SessionGuard implements StatefulGuard, SupportsBasicAuth $this->provider->updateRememberToken($user, $token); } + /** + * Invalidate other sessions for the current user. + * + * The application must be using the AuthenticateSession middleware. + * + * @param string $password + * @param string $attribute + * @return null|bool + */ + public function logoutOtherDevices($password, $attribute = 'password') + { + if (! $this->user()) { + return; + } + + return tap($this->user()->forceFill([ + $attribute => Hash::make($password), + ]))->save(); + } + /** * Register an authentication attempt event listener. * diff --git a/vendor/laravel/framework/src/Illuminate/Auth/TokenGuard.php b/vendor/laravel/framework/src/Illuminate/Auth/TokenGuard.php index dec39f432..56ac19b16 100644 --- a/vendor/laravel/framework/src/Illuminate/Auth/TokenGuard.php +++ b/vendor/laravel/framework/src/Illuminate/Auth/TokenGuard.php @@ -36,14 +36,16 @@ class TokenGuard implements Guard * * @param \Illuminate\Contracts\Auth\UserProvider $provider * @param \Illuminate\Http\Request $request + * @param string $inputKey + * @param string $storageKey * @return void */ - public function __construct(UserProvider $provider, Request $request) + public function __construct(UserProvider $provider, Request $request, $inputKey = 'api_token', $storageKey = 'api_token') { $this->request = $request; $this->provider = $provider; - $this->inputKey = 'api_token'; - $this->storageKey = 'api_token'; + $this->inputKey = $inputKey; + $this->storageKey = $storageKey; } /** diff --git a/vendor/laravel/framework/src/Illuminate/Auth/composer.json b/vendor/laravel/framework/src/Illuminate/Auth/composer.json index f3a41d953..896c871a3 100644 --- a/vendor/laravel/framework/src/Illuminate/Auth/composer.json +++ b/vendor/laravel/framework/src/Illuminate/Auth/composer.json @@ -14,11 +14,11 @@ } ], "require": { - "php": ">=7.0", - "illuminate/contracts": "5.5.*", - "illuminate/http": "5.5.*", - "illuminate/queue": "5.5.*", - "illuminate/support": "5.5.*" + "php": "^7.1.3", + "illuminate/contracts": "5.6.*", + "illuminate/http": "5.6.*", + "illuminate/queue": "5.6.*", + "illuminate/support": "5.6.*" }, "autoload": { "psr-4": { @@ -27,13 +27,13 @@ }, "extra": { "branch-alias": { - "dev-master": "5.5-dev" + "dev-master": "5.6-dev" } }, "suggest": { - "illuminate/console": "Required to use the auth:clear-resets command (5.5.*).", - "illuminate/queue": "Required to fire login / logout events (5.5.*).", - "illuminate/session": "Required to use the session based guard (5.5.*)." + "illuminate/console": "Required to use the auth:clear-resets command (5.6.*).", + "illuminate/queue": "Required to fire login / logout events (5.6.*).", + "illuminate/session": "Required to use the session based guard (5.6.*)." }, "config": { "sort-packages": true diff --git a/vendor/laravel/framework/src/Illuminate/Broadcasting/BroadcastManager.php b/vendor/laravel/framework/src/Illuminate/Broadcasting/BroadcastManager.php index 1b4f6101d..0ac9055f8 100644 --- a/vendor/laravel/framework/src/Illuminate/Broadcasting/BroadcastManager.php +++ b/vendor/laravel/framework/src/Illuminate/Broadcasting/BroadcastManager.php @@ -65,7 +65,10 @@ class BroadcastManager implements FactoryContract $attributes = $attributes ?: ['middleware' => ['web']]; $this->app['router']->group($attributes, function ($router) { - $router->post('/broadcasting/auth', '\\'.BroadcastController::class.'@authenticate'); + $router->match( + ['get', 'post'], '/broadcasting/auth', + '\\'.BroadcastController::class.'@authenticate' + ); }); } @@ -140,7 +143,7 @@ class BroadcastManager implements FactoryContract /** * Get a driver instance. * - * @param string $name + * @param string|null $name * @return mixed */ public function driver($name = null) diff --git a/vendor/laravel/framework/src/Illuminate/Broadcasting/Broadcasters/Broadcaster.php b/vendor/laravel/framework/src/Illuminate/Broadcasting/Broadcasters/Broadcaster.php index e5fd8fd9f..18a8fefbd 100644 --- a/vendor/laravel/framework/src/Illuminate/Broadcasting/Broadcasters/Broadcaster.php +++ b/vendor/laravel/framework/src/Illuminate/Broadcasting/Broadcasters/Broadcaster.php @@ -2,6 +2,8 @@ namespace Illuminate\Broadcasting\Broadcasters; +use Exception; +use ReflectionClass; use ReflectionFunction; use Illuminate\Support\Str; use Illuminate\Container\Container; @@ -30,10 +32,10 @@ abstract class Broadcaster implements BroadcasterContract * Register a channel authenticator. * * @param string $channel - * @param callable $callback + * @param callable|string $callback * @return $this */ - public function channel($channel, callable $callback) + public function channel($channel, $callback) { $this->channels[$channel] = $callback; @@ -57,7 +59,9 @@ abstract class Broadcaster implements BroadcasterContract $parameters = $this->extractAuthParameters($pattern, $channel, $callback); - if ($result = $callback($request->user(), ...$parameters)) { + $handler = $this->normalizeChannelHandlerToCallable($callback); + + if ($result = $handler($request->user(), ...$parameters)) { return $this->validAuthenticationResponse($request, $result); } } @@ -70,12 +74,12 @@ abstract class Broadcaster implements BroadcasterContract * * @param string $pattern * @param string $channel - * @param callable $callback + * @param callable|string $callback * @return array */ protected function extractAuthParameters($pattern, $channel, $callback) { - $callbackParameters = (new ReflectionFunction($callback))->getParameters(); + $callbackParameters = $this->extractParameters($callback); return collect($this->extractChannelKeys($pattern, $channel))->reject(function ($value, $key) { return is_numeric($key); @@ -84,6 +88,42 @@ abstract class Broadcaster implements BroadcasterContract })->values()->all(); } + /** + * Extracts the parameters out of what the user passed to handle the channel authentication. + * + * @param callable|string $callback + * @return \ReflectionParameter[] + * @throws \Exception + */ + protected function extractParameters($callback) + { + if (is_callable($callback)) { + return (new ReflectionFunction($callback))->getParameters(); + } elseif (is_string($callback)) { + return $this->extractParametersFromClass($callback); + } + + throw new Exception('Given channel handler is an unknown type.'); + } + + /** + * Extracts the parameters out of a class channel's "join" method. + * + * @param string $callback + * @return \ReflectionParameter[] + * @throws \Exception + */ + protected function extractParametersFromClass($callback) + { + $reflection = new ReflectionClass($callback); + + if (! $reflection->hasMethod('join')) { + throw new Exception('Class based channel must define a "join" method.'); + } + + return $reflection->getMethod('join')->getParameters(); + } + /** * Extract the channel keys from the incoming channel name. * @@ -201,4 +241,19 @@ abstract class Broadcaster implements BroadcasterContract return $this->bindingRegistrar; } + + /** + * Normalize the given callback into a callable. + * + * @param mixed $callback + * @return callable|\Closure + */ + protected function normalizeChannelHandlerToCallable($callback) + { + return is_callable($callback) ? $callback : function (...$args) use ($callback) { + return Container::getInstance() + ->make($callback) + ->join(...$args); + }; + } } diff --git a/vendor/laravel/framework/src/Illuminate/Broadcasting/Broadcasters/PusherBroadcaster.php b/vendor/laravel/framework/src/Illuminate/Broadcasting/Broadcasters/PusherBroadcaster.php index 856024f37..afb922a9b 100644 --- a/vendor/laravel/framework/src/Illuminate/Broadcasting/Broadcasters/PusherBroadcaster.php +++ b/vendor/laravel/framework/src/Illuminate/Broadcasting/Broadcasters/PusherBroadcaster.php @@ -62,25 +62,34 @@ class PusherBroadcaster extends Broadcaster { if (Str::startsWith($request->channel_name, 'private')) { return $this->decodePusherResponse( - $this->pusher->socket_auth($request->channel_name, $request->socket_id) + $request, $this->pusher->socket_auth($request->channel_name, $request->socket_id) ); } return $this->decodePusherResponse( + $request, $this->pusher->presence_auth( - $request->channel_name, $request->socket_id, $request->user()->getAuthIdentifier(), $result) + $request->channel_name, $request->socket_id, + $request->user()->getAuthIdentifier(), $result + ) ); } /** * Decode the given Pusher response. * + * @param \Illuminate\Http\Request $request * @param mixed $response * @return array */ - protected function decodePusherResponse($response) + protected function decodePusherResponse($request, $response) { - return json_decode($response, true); + if (! $request->input('callback', false)) { + return json_decode($response, true); + } + + return response()->json(json_decode($response, true)) + ->withCallback($request->callback); } /** diff --git a/vendor/laravel/framework/src/Illuminate/Broadcasting/Broadcasters/RedisBroadcaster.php b/vendor/laravel/framework/src/Illuminate/Broadcasting/Broadcasters/RedisBroadcaster.php index 1a89bebf9..ccda0e65f 100644 --- a/vendor/laravel/framework/src/Illuminate/Broadcasting/Broadcasters/RedisBroadcaster.php +++ b/vendor/laravel/framework/src/Illuminate/Broadcasting/Broadcasters/RedisBroadcaster.php @@ -27,7 +27,7 @@ class RedisBroadcaster extends Broadcaster * Create a new broadcaster instance. * * @param \Illuminate\Contracts\Redis\Factory $redis - * @param string $connection + * @param string|null $connection * @return void */ public function __construct(Redis $redis, $connection = null) diff --git a/vendor/laravel/framework/src/Illuminate/Broadcasting/composer.json b/vendor/laravel/framework/src/Illuminate/Broadcasting/composer.json index 2f4b18ef8..02069ac25 100644 --- a/vendor/laravel/framework/src/Illuminate/Broadcasting/composer.json +++ b/vendor/laravel/framework/src/Illuminate/Broadcasting/composer.json @@ -14,12 +14,12 @@ } ], "require": { - "php": ">=7.0", + "php": "^7.1.3", "psr/log": "~1.0", - "illuminate/bus": "5.5.*", - "illuminate/contracts": "5.5.*", - "illuminate/queue": "5.5.*", - "illuminate/support": "5.5.*" + "illuminate/bus": "5.6.*", + "illuminate/contracts": "5.6.*", + "illuminate/queue": "5.6.*", + "illuminate/support": "5.6.*" }, "autoload": { "psr-4": { @@ -28,7 +28,7 @@ }, "extra": { "branch-alias": { - "dev-master": "5.5-dev" + "dev-master": "5.6-dev" } }, "suggest": { diff --git a/vendor/laravel/framework/src/Illuminate/Bus/composer.json b/vendor/laravel/framework/src/Illuminate/Bus/composer.json index 3836cee9b..4939a99d9 100644 --- a/vendor/laravel/framework/src/Illuminate/Bus/composer.json +++ b/vendor/laravel/framework/src/Illuminate/Bus/composer.json @@ -14,10 +14,10 @@ } ], "require": { - "php": ">=7.0", - "illuminate/contracts": "5.5.*", - "illuminate/pipeline": "5.5.*", - "illuminate/support": "5.5.*" + "php": "^7.1.3", + "illuminate/contracts": "5.6.*", + "illuminate/pipeline": "5.6.*", + "illuminate/support": "5.6.*" }, "autoload": { "psr-4": { @@ -26,7 +26,7 @@ }, "extra": { "branch-alias": { - "dev-master": "5.5-dev" + "dev-master": "5.6-dev" } }, "config": { diff --git a/vendor/laravel/framework/src/Illuminate/Cache/ArrayStore.php b/vendor/laravel/framework/src/Illuminate/Cache/ArrayStore.php index 8901a489b..806f97116 100644 --- a/vendor/laravel/framework/src/Illuminate/Cache/ArrayStore.php +++ b/vendor/laravel/framework/src/Illuminate/Cache/ArrayStore.php @@ -23,9 +23,7 @@ class ArrayStore extends TaggableStore implements Store */ public function get($key) { - if (array_key_exists($key, $this->storage)) { - return $this->storage[$key]; - } + return $this->storage[$key] ?? null; } /** diff --git a/vendor/laravel/framework/src/Illuminate/Cache/CacheManager.php b/vendor/laravel/framework/src/Illuminate/Cache/CacheManager.php index f52053c9b..550249e5e 100644 --- a/vendor/laravel/framework/src/Illuminate/Cache/CacheManager.php +++ b/vendor/laravel/framework/src/Illuminate/Cache/CacheManager.php @@ -61,7 +61,7 @@ class CacheManager implements FactoryContract /** * Get a cache driver instance. * - * @param string $driver + * @param string|null $driver * @return mixed */ public function driver($driver = null) diff --git a/vendor/laravel/framework/src/Illuminate/Cache/Console/ClearCommand.php b/vendor/laravel/framework/src/Illuminate/Cache/Console/ClearCommand.php index 0c3e6ddd2..34f2a4d87 100644 --- a/vendor/laravel/framework/src/Illuminate/Cache/Console/ClearCommand.php +++ b/vendor/laravel/framework/src/Illuminate/Cache/Console/ClearCommand.php @@ -72,7 +72,7 @@ class ClearCommand extends Command 'cache:cleared', [$this->argument('store'), $this->tags()] ); - $this->info('Cache cleared successfully.'); + $this->info('Application cache cleared!'); } /** @@ -82,7 +82,11 @@ class ClearCommand extends Command */ public function flushFacades() { - foreach ($this->files->files(storage_path('framework/cache')) as $file) { + if (! $this->files->exists($storagePath = storage_path('framework/cache'))) { + return; + } + + foreach ($this->files->files($storagePath) as $file) { if (preg_match('/facade-.*\.php$/', $file)) { $this->files->delete($file); } diff --git a/vendor/laravel/framework/src/Illuminate/Cache/FileStore.php b/vendor/laravel/framework/src/Illuminate/Cache/FileStore.php index 4cf97da3b..cead4ac85 100644 --- a/vendor/laravel/framework/src/Illuminate/Cache/FileStore.php +++ b/vendor/laravel/framework/src/Illuminate/Cache/FileStore.php @@ -91,7 +91,7 @@ class FileStore implements Store $raw = $this->getPayload($key); return tap(((int) $raw['data']) + $value, function ($newValue) use ($key, $raw) { - $this->put($key, $newValue, $raw['time']); + $this->put($key, $newValue, $raw['time'] ?? 0); }); } diff --git a/vendor/laravel/framework/src/Illuminate/Cache/MemcachedConnector.php b/vendor/laravel/framework/src/Illuminate/Cache/MemcachedConnector.php index ebfb28c70..a4593b347 100644 --- a/vendor/laravel/framework/src/Illuminate/Cache/MemcachedConnector.php +++ b/vendor/laravel/framework/src/Illuminate/Cache/MemcachedConnector.php @@ -47,7 +47,7 @@ class MemcachedConnector { $memcached = $this->createMemcachedInstance($connectionId); - if (count($credentials) == 2) { + if (count($credentials) === 2) { $this->setCredentials($memcached, $credentials); } diff --git a/vendor/laravel/framework/src/Illuminate/Cache/RateLimiter.php b/vendor/laravel/framework/src/Illuminate/Cache/RateLimiter.php index 5bd79fdaf..1de6ac816 100644 --- a/vendor/laravel/framework/src/Illuminate/Cache/RateLimiter.php +++ b/vendor/laravel/framework/src/Illuminate/Cache/RateLimiter.php @@ -32,10 +32,9 @@ class RateLimiter * * @param string $key * @param int $maxAttempts - * @param float|int $decayMinutes * @return bool */ - public function tooManyAttempts($key, $maxAttempts, $decayMinutes = 1) + public function tooManyAttempts($key, $maxAttempts) { if ($this->attempts($key) >= $maxAttempts) { if ($this->cache->has($key.':timer')) { diff --git a/vendor/laravel/framework/src/Illuminate/Cache/RedisTaggedCache.php b/vendor/laravel/framework/src/Illuminate/Cache/RedisTaggedCache.php index d2325a007..12209caf0 100644 --- a/vendor/laravel/framework/src/Illuminate/Cache/RedisTaggedCache.php +++ b/vendor/laravel/framework/src/Illuminate/Cache/RedisTaggedCache.php @@ -22,7 +22,7 @@ class RedisTaggedCache extends TaggedCache * * @param string $key * @param mixed $value - * @param \DateTime|float|int $minutes + * @param \DateTime|float|int|null $minutes * @return void */ public function put($key, $value, $minutes = null) @@ -32,6 +32,34 @@ class RedisTaggedCache extends TaggedCache parent::put($key, $value, $minutes); } + /** + * Increment the value of an item in the cache. + * + * @param string $key + * @param mixed $value + * @return void + */ + public function increment($key, $value = 1) + { + $this->pushStandardKeys($this->tags->getNamespace(), $key); + + parent::increment($key, $value); + } + + /** + * Decrement the value of an item in the cache. + * + * @param string $key + * @param mixed $value + * @return void + */ + public function decrement($key, $value = 1) + { + $this->pushStandardKeys($this->tags->getNamespace(), $key); + + parent::decrement($key, $value); + } + /** * Store an item in the cache indefinitely. * diff --git a/vendor/laravel/framework/src/Illuminate/Cache/Repository.php b/vendor/laravel/framework/src/Illuminate/Cache/Repository.php index f5dfd7cc6..16319a09a 100644 --- a/vendor/laravel/framework/src/Illuminate/Cache/Repository.php +++ b/vendor/laravel/framework/src/Illuminate/Cache/Repository.php @@ -182,7 +182,7 @@ class Repository implements CacheContract, ArrayAccess * * @param string $key * @param mixed $value - * @param \DateTimeInterface|\DateInterval|float|int $minutes + * @param \DateTimeInterface|\DateInterval|float|int|null $minutes * @return void */ public function put($key, $value, $minutes = null) @@ -419,7 +419,7 @@ class Repository implements CacheContract, ArrayAccess throw new BadMethodCallException('This cache store does not support tagging.'); } - $cache = $this->store->tags($names); + $cache = $this->store->tags(is_array($names) ? $names : func_get_args()); if (! is_null($this->events)) { $cache->setEventDispatcher($this->events); diff --git a/vendor/laravel/framework/src/Illuminate/Cache/TaggedCache.php b/vendor/laravel/framework/src/Illuminate/Cache/TaggedCache.php index 095f296af..c37025d7c 100644 --- a/vendor/laravel/framework/src/Illuminate/Cache/TaggedCache.php +++ b/vendor/laravel/framework/src/Illuminate/Cache/TaggedCache.php @@ -42,7 +42,7 @@ class TaggedCache extends Repository } /** - * Increment the value of an item in the cache. + * Decrement the value of an item in the cache. * * @param string $key * @param mixed $value diff --git a/vendor/laravel/framework/src/Illuminate/Cache/composer.json b/vendor/laravel/framework/src/Illuminate/Cache/composer.json index f81a218c7..48b7e1bb7 100644 --- a/vendor/laravel/framework/src/Illuminate/Cache/composer.json +++ b/vendor/laravel/framework/src/Illuminate/Cache/composer.json @@ -14,9 +14,9 @@ } ], "require": { - "php": ">=7.0", - "illuminate/contracts": "5.5.*", - "illuminate/support": "5.5.*" + "php": "^7.1.3", + "illuminate/contracts": "5.6.*", + "illuminate/support": "5.6.*" }, "autoload": { "psr-4": { @@ -25,13 +25,13 @@ }, "extra": { "branch-alias": { - "dev-master": "5.5-dev" + "dev-master": "5.6-dev" } }, "suggest": { - "illuminate/database": "Required to use the database cache driver (5.5.*).", - "illuminate/filesystem": "Required to use the file cache driver (5.5.*).", - "illuminate/redis": "Required to use the redis cache driver (5.5.*)." + "illuminate/database": "Required to use the database cache driver (5.6.*).", + "illuminate/filesystem": "Required to use the file cache driver (5.6.*).", + "illuminate/redis": "Required to use the redis cache driver (5.6.*)." }, "config": { "sort-packages": true diff --git a/vendor/laravel/framework/src/Illuminate/Config/composer.json b/vendor/laravel/framework/src/Illuminate/Config/composer.json index 55d6f0a0e..f79f6f566 100644 --- a/vendor/laravel/framework/src/Illuminate/Config/composer.json +++ b/vendor/laravel/framework/src/Illuminate/Config/composer.json @@ -14,9 +14,9 @@ } ], "require": { - "php": ">=7.0", - "illuminate/contracts": "5.5.*", - "illuminate/support": "5.5.*" + "php": "^7.1.3", + "illuminate/contracts": "5.6.*", + "illuminate/support": "5.6.*" }, "autoload": { "psr-4": { @@ -25,7 +25,7 @@ }, "extra": { "branch-alias": { - "dev-master": "5.5-dev" + "dev-master": "5.6-dev" } }, "config": { diff --git a/vendor/laravel/framework/src/Illuminate/Console/Application.php b/vendor/laravel/framework/src/Illuminate/Console/Application.php index c53221bf0..e836f71c0 100644 --- a/vendor/laravel/framework/src/Illuminate/Console/Application.php +++ b/vendor/laravel/framework/src/Illuminate/Console/Application.php @@ -16,6 +16,7 @@ use Symfony\Component\Console\Output\BufferedOutput; use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Console\Application as SymfonyApplication; use Symfony\Component\Console\Command\Command as SymfonyCommand; +use Symfony\Component\Console\Exception\CommandNotFoundException; use Illuminate\Contracts\Console\Application as ApplicationContract; class Application extends SymfonyApplication implements ApplicationContract @@ -163,18 +164,28 @@ class Application extends SymfonyApplication implements ApplicationContract * * @param string $command * @param array $parameters - * @param \Symfony\Component\Console\Output\OutputInterface $outputBuffer + * @param \Symfony\Component\Console\Output\OutputInterface|null $outputBuffer * @return int + * + * @throws \Symfony\Component\Console\Exception\CommandNotFoundException */ public function call($command, array $parameters = [], $outputBuffer = null) { - $parameters = collect($parameters)->prepend($command); + if (is_subclass_of($command, SymfonyCommand::class)) { + $command = $this->laravel->make($command)->getName(); + } + + if (! $this->has($command)) { + throw new CommandNotFoundException(sprintf('The command "%s" does not exist.', $command)); + } + + array_unshift($parameters, $command); $this->lastOutput = $outputBuffer ?: new BufferedOutput; $this->setCatchExceptions(false); - $result = $this->run(new ArrayInput($parameters->toArray()), $this->lastOutput); + $result = $this->run(new ArrayInput($parameters), $this->lastOutput); $this->setCatchExceptions(true); @@ -188,7 +199,9 @@ class Application extends SymfonyApplication implements ApplicationContract */ public function output() { - return $this->lastOutput ? $this->lastOutput->fetch() : ''; + return $this->lastOutput && method_exists($this->lastOutput, 'fetch') + ? $this->lastOutput->fetch() + : ''; } /** diff --git a/vendor/laravel/framework/src/Illuminate/Console/Command.php b/vendor/laravel/framework/src/Illuminate/Console/Command.php index b79a354d6..f8c455d69 100644 --- a/vendor/laravel/framework/src/Illuminate/Console/Command.php +++ b/vendor/laravel/framework/src/Illuminate/Console/Command.php @@ -2,6 +2,7 @@ namespace Illuminate\Console; +use Illuminate\Support\Str; use Illuminate\Support\Traits\Macroable; use Illuminate\Contracts\Support\Arrayable; use Symfony\Component\Console\Helper\Table; @@ -245,7 +246,7 @@ class Command extends SymfonyCommand * Get the value of a command argument. * * @param string|null $key - * @return string|array + * @return string|array|null */ public function argument($key = null) { @@ -280,8 +281,8 @@ class Command extends SymfonyCommand /** * Get the value of a command option. * - * @param string $key - * @return string|array + * @param string|null $key + * @return string|array|null */ public function option($key = null) { @@ -318,7 +319,7 @@ class Command extends SymfonyCommand * Prompt the user for input. * * @param string $question - * @param string $default + * @param string|null $default * @return string */ public function ask($question, $default = null) @@ -331,7 +332,7 @@ class Command extends SymfonyCommand * * @param string $question * @param array $choices - * @param string $default + * @param string|null $default * @return string */ public function anticipate($question, array $choices, $default = null) @@ -344,7 +345,7 @@ class Command extends SymfonyCommand * * @param string $question * @param array $choices - * @param string $default + * @param string|null $default * @return string */ public function askWithCompletion($question, array $choices, $default = null) @@ -377,9 +378,9 @@ class Command extends SymfonyCommand * * @param string $question * @param array $choices - * @param string $default - * @param mixed $attempts - * @param bool $multiple + * @param string|null $default + * @param mixed|null $attempts + * @param bool|null $multiple * @return string */ public function choice($question, array $choices, $default = null, $attempts = null, $multiple = null) @@ -506,9 +507,11 @@ class Command extends SymfonyCommand */ public function alert($string) { - $this->comment(str_repeat('*', strlen($string) + 12)); + $length = Str::length(strip_tags($string)) + 12; + + $this->comment(str_repeat('*', $length)); $this->comment('* '.$string.' *'); - $this->comment(str_repeat('*', strlen($string) + 12)); + $this->comment(str_repeat('*', $length)); $this->output->newLine(); } @@ -527,7 +530,7 @@ class Command extends SymfonyCommand /** * Get the verbosity level in terms of Symfony's OutputInterface level. * - * @param string|int $level + * @param string|int|null $level * @return int */ protected function parseVerbosity($level = null) diff --git a/vendor/laravel/framework/src/Illuminate/Console/GeneratorCommand.php b/vendor/laravel/framework/src/Illuminate/Console/GeneratorCommand.php index 92f978764..32d26e9e0 100644 --- a/vendor/laravel/framework/src/Illuminate/Console/GeneratorCommand.php +++ b/vendor/laravel/framework/src/Illuminate/Console/GeneratorCommand.php @@ -56,7 +56,9 @@ abstract class GeneratorCommand extends Command // First we will check to see if the class already exists. If it does, we don't want // to create the class and overwrite the user's code. So, we will bail out so the // code is untouched. Otherwise, we will continue generating this class' files. - if ((! $this->hasOption('force') || ! $this->option('force')) && $this->alreadyExists($this->getNameInput())) { + if ((! $this->hasOption('force') || + ! $this->option('force')) && + $this->alreadyExists($this->getNameInput())) { $this->error($this->type.' already exists!'); return false; diff --git a/vendor/laravel/framework/src/Illuminate/Console/Scheduling/CacheEventMutex.php b/vendor/laravel/framework/src/Illuminate/Console/Scheduling/CacheEventMutex.php new file mode 100644 index 000000000..4eaaf0529 --- /dev/null +++ b/vendor/laravel/framework/src/Illuminate/Console/Scheduling/CacheEventMutex.php @@ -0,0 +1,81 @@ +cache = $cache; + } + + /** + * Attempt to obtain an event mutex for the given event. + * + * @param \Illuminate\Console\Scheduling\Event $event + * @return bool + */ + public function create(Event $event) + { + return $this->cache->store($this->store)->add( + $event->mutexName(), true, $event->expiresAt + ); + } + + /** + * Determine if an event mutex exists for the given event. + * + * @param \Illuminate\Console\Scheduling\Event $event + * @return bool + */ + public function exists(Event $event) + { + return $this->cache->store($this->store)->has($event->mutexName()); + } + + /** + * Clear the event mutex for the given event. + * + * @param \Illuminate\Console\Scheduling\Event $event + * @return void + */ + public function forget(Event $event) + { + $this->cache->store($this->store)->forget($event->mutexName()); + } + + /** + * Specify the cache store that should be used. + * + * @param string $store + * @return $this + */ + public function useStore($store) + { + $this->store = $store; + + return $this; + } +} diff --git a/vendor/laravel/framework/src/Illuminate/Console/Scheduling/CacheMutex.php b/vendor/laravel/framework/src/Illuminate/Console/Scheduling/CacheMutex.php deleted file mode 100644 index f698ff2c9..000000000 --- a/vendor/laravel/framework/src/Illuminate/Console/Scheduling/CacheMutex.php +++ /dev/null @@ -1,61 +0,0 @@ -cache = $cache; - } - - /** - * Attempt to obtain a mutex for the given event. - * - * @param \Illuminate\Console\Scheduling\Event $event - * @return bool - */ - public function create(Event $event) - { - return $this->cache->add( - $event->mutexName(), true, $event->expiresAt - ); - } - - /** - * Determine if a mutex exists for the given event. - * - * @param \Illuminate\Console\Scheduling\Event $event - * @return bool - */ - public function exists(Event $event) - { - return $this->cache->has($event->mutexName()); - } - - /** - * Clear the mutex for the given event. - * - * @param \Illuminate\Console\Scheduling\Event $event - * @return void - */ - public function forget(Event $event) - { - $this->cache->forget($event->mutexName()); - } -} diff --git a/vendor/laravel/framework/src/Illuminate/Console/Scheduling/CacheSchedulingMutex.php b/vendor/laravel/framework/src/Illuminate/Console/Scheduling/CacheSchedulingMutex.php new file mode 100644 index 000000000..dfa20348e --- /dev/null +++ b/vendor/laravel/framework/src/Illuminate/Console/Scheduling/CacheSchedulingMutex.php @@ -0,0 +1,75 @@ +cache = $cache; + } + + /** + * Attempt to obtain a scheduling mutex for the given event. + * + * @param \Illuminate\Console\Scheduling\Event $event + * @param \DateTimeInterface $time + * @return bool + */ + public function create(Event $event, DateTimeInterface $time) + { + return $this->cache->store($this->store)->add( + $event->mutexName().$time->format('Hi'), true, 60 + ); + } + + /** + * Determine if a scheduling mutex exists for the given event. + * + * @param \Illuminate\Console\Scheduling\Event $event + * @param \DateTimeInterface $time + * @return bool + */ + public function exists(Event $event, DateTimeInterface $time) + { + return $this->cache->store($this->store)->has( + $event->mutexName().$time->format('Hi') + ); + } + + /** + * Specify the cache store that should be used. + * + * @param string $store + * @return $this + */ + public function useStore($store) + { + $this->store = $store; + + return $this; + } +} diff --git a/vendor/laravel/framework/src/Illuminate/Console/Scheduling/CallbackEvent.php b/vendor/laravel/framework/src/Illuminate/Console/Scheduling/CallbackEvent.php index 8bbc6b568..1b54a1aaf 100644 --- a/vendor/laravel/framework/src/Illuminate/Console/Scheduling/CallbackEvent.php +++ b/vendor/laravel/framework/src/Illuminate/Console/Scheduling/CallbackEvent.php @@ -25,14 +25,14 @@ class CallbackEvent extends Event /** * Create a new event instance. * - * @param \Illuminate\Console\Scheduling\Mutex $mutex + * @param \Illuminate\Console\Scheduling\EventMutex $mutex * @param string $callback * @param array $parameters * @return void * * @throws \InvalidArgumentException */ - public function __construct(Mutex $mutex, $callback, array $parameters = []) + public function __construct(EventMutex $mutex, $callback, array $parameters = []) { if (! is_string($callback) && ! is_callable($callback)) { throw new InvalidArgumentException( @@ -98,6 +98,8 @@ class CallbackEvent extends Event * * @param int $expiresAt * @return $this + * + * @throws \LogicException */ public function withoutOverlapping($expiresAt = 1440) { @@ -116,6 +118,26 @@ class CallbackEvent extends Event }); } + /** + * Allow the event to only run on one server for each cron expression. + * + * @return $this + * + * @throws \LogicException + */ + public function onOneServer() + { + if (! isset($this->description)) { + throw new LogicException( + "A scheduled event name is required to only run on one server. Use the 'name' method before 'onOneServer'." + ); + } + + $this->onOneServer = true; + + return $this; + } + /** * Get the mutex name for the scheduled command. * diff --git a/vendor/laravel/framework/src/Illuminate/Console/Scheduling/Event.php b/vendor/laravel/framework/src/Illuminate/Console/Scheduling/Event.php index 2b4ec97cf..f9ae25845 100644 --- a/vendor/laravel/framework/src/Illuminate/Console/Scheduling/Event.php +++ b/vendor/laravel/framework/src/Illuminate/Console/Scheduling/Event.php @@ -4,6 +4,7 @@ namespace Illuminate\Console\Scheduling; use Closure; use Cron\CronExpression; +use Illuminate\Support\Arr; use Illuminate\Support\Carbon; use GuzzleHttp\Client as HttpClient; use Illuminate\Contracts\Mail\Mailer; @@ -27,7 +28,7 @@ class Event * * @var string */ - public $expression = '* * * * * *'; + public $expression = '* * * * *'; /** * The timezone the date should be evaluated on. @@ -64,6 +65,13 @@ class Event */ public $withoutOverlapping = false; + /** + * Indicates if the command should only be allowed to run on one server for each cron expression. + * + * @var bool + */ + public $onOneServer = false; + /** * The amount of time the mutex should be valid. * @@ -128,20 +136,20 @@ class Event public $description; /** - * The mutex implementation. + * The event mutex implementation. * - * @var \Illuminate\Console\Scheduling\Mutex + * @var \Illuminate\Console\Scheduling\EventMutex */ public $mutex; /** * Create a new event instance. * - * @param \Illuminate\Console\Scheduling\Mutex $mutex + * @param \Illuminate\Console\Scheduling\EventMutex $mutex * @param string $command * @return void */ - public function __construct(Mutex $mutex, $command) + public function __construct(EventMutex $mutex, $command) { $this->mutex = $mutex; $this->command = $command; @@ -370,7 +378,7 @@ class Event { $this->ensureOutputIsBeingCapturedForEmail(); - $addresses = is_array($addresses) ? $addresses : [$addresses]; + $addresses = Arr::wrap($addresses); return $this->then(function (Mailer $mailer) use ($addresses, $onlyIfOutputExists) { $this->emailOutput($mailer, $addresses, $onlyIfOutputExists); @@ -450,6 +458,18 @@ class Event }); } + /** + * Register a callback to ping a given URL before the job runs if the given condition is true. + * + * @param bool $value + * @param string $url + * @return $this + */ + public function pingBeforeIf($value, $url) + { + return $value ? $this->pingBefore($url) : $this; + } + /** * Register a callback to ping a given URL after the job runs. * @@ -463,6 +483,18 @@ class Event }); } + /** + * Register a callback to ping a given URL after the job runs if the given condition is true. + * + * @param bool $value + * @param string $url + * @return $this + */ + public function thenPingIf($value, $url) + { + return $value ? $this->thenPing($url) : $this; + } + /** * State that the command should run in background. * @@ -532,6 +564,18 @@ class Event }); } + /** + * Allow the event to only run on one server for each cron expression. + * + * @return $this + */ + public function onOneServer() + { + $this->onOneServer = true; + + return $this; + } + /** * Register a callback to further filter the schedule. * @@ -663,12 +707,12 @@ class Event } /** - * Set the mutex implementation to be used. + * Set the event mutex implementation to be used. * - * @param \Illuminate\Console\Scheduling\Mutex $mutex + * @param \Illuminate\Console\Scheduling\EventMutex $mutex * @return $this */ - public function preventOverlapsUsing(Mutex $mutex) + public function preventOverlapsUsing(EventMutex $mutex) { $this->mutex = $mutex; diff --git a/vendor/laravel/framework/src/Illuminate/Console/Scheduling/Mutex.php b/vendor/laravel/framework/src/Illuminate/Console/Scheduling/EventMutex.php similarity index 71% rename from vendor/laravel/framework/src/Illuminate/Console/Scheduling/Mutex.php rename to vendor/laravel/framework/src/Illuminate/Console/Scheduling/EventMutex.php index 47ca939e1..1840e2420 100644 --- a/vendor/laravel/framework/src/Illuminate/Console/Scheduling/Mutex.php +++ b/vendor/laravel/framework/src/Illuminate/Console/Scheduling/EventMutex.php @@ -2,10 +2,10 @@ namespace Illuminate\Console\Scheduling; -interface Mutex +interface EventMutex { /** - * Attempt to obtain a mutex for the given event. + * Attempt to obtain an event mutex for the given event. * * @param \Illuminate\Console\Scheduling\Event $event * @return bool @@ -13,7 +13,7 @@ interface Mutex public function create(Event $event); /** - * Determine if a mutex exists for the given event. + * Determine if an event mutex exists for the given event. * * @param \Illuminate\Console\Scheduling\Event $event * @return bool @@ -21,7 +21,7 @@ interface Mutex public function exists(Event $event); /** - * Clear the mutex for the given event. + * Clear the event mutex for the given event. * * @param \Illuminate\Console\Scheduling\Event $event * @return void diff --git a/vendor/laravel/framework/src/Illuminate/Console/Scheduling/Schedule.php b/vendor/laravel/framework/src/Illuminate/Console/Scheduling/Schedule.php index c3b602cae..be99741fc 100644 --- a/vendor/laravel/framework/src/Illuminate/Console/Scheduling/Schedule.php +++ b/vendor/laravel/framework/src/Illuminate/Console/Scheduling/Schedule.php @@ -2,6 +2,7 @@ namespace Illuminate\Console\Scheduling; +use DateTimeInterface; use Illuminate\Console\Application; use Illuminate\Container\Container; use Illuminate\Support\ProcessUtils; @@ -17,11 +18,18 @@ class Schedule protected $events = []; /** - * The mutex implementation. + * The event mutex implementation. * - * @var \Illuminate\Console\Scheduling\Mutex + * @var \Illuminate\Console\Scheduling\EventMutex */ - protected $mutex; + protected $eventMutex; + + /** + * The scheduling mutex implementation. + * + * @var \Illuminate\Console\Scheduling\SchedulingMutex + */ + protected $schedulingMutex; /** * Create a new schedule instance. @@ -32,9 +40,13 @@ class Schedule { $container = Container::getInstance(); - $this->mutex = $container->bound(Mutex::class) - ? $container->make(Mutex::class) - : $container->make(CacheMutex::class); + $this->eventMutex = $container->bound(EventMutex::class) + ? $container->make(EventMutex::class) + : $container->make(CacheEventMutex::class); + + $this->schedulingMutex = $container->bound(SchedulingMutex::class) + ? $container->make(SchedulingMutex::class) + : $container->make(CacheSchedulingMutex::class); } /** @@ -47,7 +59,7 @@ class Schedule public function call($callback, array $parameters = []) { $this->events[] = $event = new CallbackEvent( - $this->mutex, $callback, $parameters + $this->eventMutex, $callback, $parameters ); return $event; @@ -104,7 +116,7 @@ class Schedule $command .= ' '.$this->compileParameters($parameters); } - $this->events[] = $event = new Event($this->mutex, $command); + $this->events[] = $event = new Event($this->eventMutex, $command); return $event; } @@ -130,6 +142,18 @@ class Schedule })->implode(' '); } + /** + * Determine if the server is allowed to run this event. + * + * @param \Illuminate\Console\Scheduling\Event $event + * @param \DateTimeInterface $time + * @return bool + */ + public function serverShouldRun(Event $event, DateTimeInterface $time) + { + return $this->schedulingMutex->create($event, $time); + } + /** * Get all of the events on the schedule that are due. * @@ -150,4 +174,23 @@ class Schedule { return $this->events; } + + /** + * Specify the cache store that should be used to store mutexes. + * + * @param string $store + * @return $this + */ + public function useCache($store) + { + if ($this->eventMutex instanceof CacheEventMutex) { + $this->eventMutex->useStore($store); + } + + if ($this->schedulingMutex instanceof CacheSchedulingMutex) { + $this->schedulingMutex->useStore($store); + } + + return $this; + } } diff --git a/vendor/laravel/framework/src/Illuminate/Console/Scheduling/ScheduleRunCommand.php b/vendor/laravel/framework/src/Illuminate/Console/Scheduling/ScheduleRunCommand.php index a07a9a4c6..21695438a 100644 --- a/vendor/laravel/framework/src/Illuminate/Console/Scheduling/ScheduleRunCommand.php +++ b/vendor/laravel/framework/src/Illuminate/Console/Scheduling/ScheduleRunCommand.php @@ -2,6 +2,7 @@ namespace Illuminate\Console\Scheduling; +use Illuminate\Support\Carbon; use Illuminate\Console\Command; class ScheduleRunCommand extends Command @@ -27,6 +28,20 @@ class ScheduleRunCommand extends Command */ protected $schedule; + /** + * The 24 hour timestamp this scheduler command started running. + * + * @var \Illuminate\Support\Carbon; + */ + protected $startedAt; + + /** + * Check if any events ran. + * + * @var bool + */ + protected $eventsRan = false; + /** * Create a new command instance. * @@ -37,6 +52,8 @@ class ScheduleRunCommand extends Command { $this->schedule = $schedule; + $this->startedAt = Carbon::now(); + parent::__construct(); } @@ -47,22 +64,52 @@ class ScheduleRunCommand extends Command */ public function handle() { - $eventsRan = false; - foreach ($this->schedule->dueEvents($this->laravel) as $event) { if (! $event->filtersPass($this->laravel)) { continue; } - $this->line('Running scheduled command: '.$event->getSummaryForDisplay()); + if ($event->onOneServer) { + $this->runSingleServerEvent($event); + } else { + $this->runEvent($event); + } - $event->run($this->laravel); - - $eventsRan = true; + $this->eventsRan = true; } - if (! $eventsRan) { + if (! $this->eventsRan) { $this->info('No scheduled commands are ready to run.'); } } + + /** + * Run the given single server event. + * + * @param \Illuminate\Console\Scheduling\Event $event + * @return void + */ + protected function runSingleServerEvent($event) + { + if ($this->schedule->serverShouldRun($event, $this->startedAt)) { + $this->runEvent($event); + } else { + $this->line('Skipping command (has already run on another server): '.$event->getSummaryForDisplay()); + } + } + + /** + * Run the given event. + * + * @param \Illuminate\Console\Scheduling\Event $event + * @return void + */ + protected function runEvent($event) + { + $this->line('Running scheduled command: '.$event->getSummaryForDisplay()); + + $event->run($this->laravel); + + $this->eventsRan = true; + } } diff --git a/vendor/laravel/framework/src/Illuminate/Console/Scheduling/SchedulingMutex.php b/vendor/laravel/framework/src/Illuminate/Console/Scheduling/SchedulingMutex.php new file mode 100644 index 000000000..ab4e87da5 --- /dev/null +++ b/vendor/laravel/framework/src/Illuminate/Console/Scheduling/SchedulingMutex.php @@ -0,0 +1,26 @@ +=7.0", - "illuminate/contracts": "5.5.*", - "illuminate/support": "5.5.*", - "symfony/console": "~3.3" + "php": "^7.1.3", + "illuminate/contracts": "5.6.*", + "illuminate/support": "5.6.*", + "symfony/console": "~4.0" }, "autoload": { "psr-4": { @@ -26,13 +26,13 @@ }, "extra": { "branch-alias": { - "dev-master": "5.5-dev" + "dev-master": "5.6-dev" } }, "suggest": { + "dragonmantank/cron-expression": "Required to use scheduling component (~2.0).", "guzzlehttp/guzzle": "Required to use the ping methods on schedules (~6.0).", - "mtdowling/cron-expression": "Required to use scheduling component (~1.0).", - "symfony/process": "Required to use scheduling component (~3.3)." + "symfony/process": "Required to use scheduling component (~4.0)." }, "config": { "sort-packages": true diff --git a/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php b/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php index 0dfd6fdc5..69a812f72 100644 --- a/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php +++ b/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php @@ -152,6 +152,10 @@ class BoundMethod $dependencies[] = $parameters[$parameter->name]; unset($parameters[$parameter->name]); + } elseif ($parameter->getClass() && array_key_exists($parameter->getClass()->name, $parameters)) { + $dependencies[] = $parameters[$parameter->getClass()->name]; + + unset($parameters[$parameter->getClass()->name]); } elseif ($parameter->getClass()) { $dependencies[] = $container->make($parameter->getClass()->name); } elseif ($parameter->isDefaultValueAvailable()) { diff --git a/vendor/laravel/framework/src/Illuminate/Container/Container.php b/vendor/laravel/framework/src/Illuminate/Container/Container.php index 61c2b5eff..63c8b878e 100644 --- a/vendor/laravel/framework/src/Illuminate/Container/Container.php +++ b/vendor/laravel/framework/src/Illuminate/Container/Container.php @@ -271,13 +271,28 @@ class Container implements ArrayAccess, ContainerContract /** * Bind a callback to resolve with Container::call. * - * @param string $method + * @param array|string $method * @param \Closure $callback * @return void */ public function bindMethod($method, $callback) { - $this->methodBindings[$method] = $callback; + $this->methodBindings[$this->parseBindMethod($method)] = $callback; + } + + /** + * Get the method to be bound in class@method format. + * + * @param array|string $method + * @return string + */ + protected function parseBindMethod($method) + { + if (is_array($method)) { + return $method[0].'@'.$method[1]; + } + + return $method; } /** @@ -1166,7 +1181,7 @@ class Container implements ArrayAccess, ContainerContract * Set the shared instance of the container. * * @param \Illuminate\Contracts\Container\Container|null $container - * @return static + * @return \Illuminate\Contracts\Container\Container|static */ public static function setInstance(ContainerContract $container = null) { diff --git a/vendor/laravel/framework/src/Illuminate/Container/composer.json b/vendor/laravel/framework/src/Illuminate/Container/composer.json index 7347da14a..b8c4aafc7 100644 --- a/vendor/laravel/framework/src/Illuminate/Container/composer.json +++ b/vendor/laravel/framework/src/Illuminate/Container/composer.json @@ -14,8 +14,8 @@ } ], "require": { - "php": ">=7.0", - "illuminate/contracts": "5.5.*", + "php": "^7.1.3", + "illuminate/contracts": "5.6.*", "psr/container": "~1.0" }, "autoload": { @@ -25,7 +25,7 @@ }, "extra": { "branch-alias": { - "dev-master": "5.5-dev" + "dev-master": "5.6-dev" } }, "config": { diff --git a/vendor/laravel/framework/src/Illuminate/Contracts/Broadcasting/Factory.php b/vendor/laravel/framework/src/Illuminate/Contracts/Broadcasting/Factory.php index 1d3a7374e..384c2d02d 100644 --- a/vendor/laravel/framework/src/Illuminate/Contracts/Broadcasting/Factory.php +++ b/vendor/laravel/framework/src/Illuminate/Contracts/Broadcasting/Factory.php @@ -7,7 +7,7 @@ interface Factory /** * Get a broadcaster implementation by name. * - * @param string $name + * @param string|null $name * @return void */ public function connection($name = null); diff --git a/vendor/laravel/framework/src/Illuminate/Contracts/Broadcasting/ShouldBroadcast.php b/vendor/laravel/framework/src/Illuminate/Contracts/Broadcasting/ShouldBroadcast.php index b051e3be3..a4802fe40 100644 --- a/vendor/laravel/framework/src/Illuminate/Contracts/Broadcasting/ShouldBroadcast.php +++ b/vendor/laravel/framework/src/Illuminate/Contracts/Broadcasting/ShouldBroadcast.php @@ -2,14 +2,12 @@ namespace Illuminate\Contracts\Broadcasting; -use Illuminate\Broadcasting\Channel; - interface ShouldBroadcast { /** * Get the channels the event should broadcast on. * - * @return Channel|Channel[] + * @return \Illuminate\Broadcasting\Channel|\Illuminate\Broadcasting\Channel[] */ public function broadcastOn(); } diff --git a/vendor/laravel/framework/src/Illuminate/Contracts/Bus/Dispatcher.php b/vendor/laravel/framework/src/Illuminate/Contracts/Bus/Dispatcher.php index 3370ad3da..12ed2226b 100644 --- a/vendor/laravel/framework/src/Illuminate/Contracts/Bus/Dispatcher.php +++ b/vendor/laravel/framework/src/Illuminate/Contracts/Bus/Dispatcher.php @@ -21,6 +21,22 @@ interface Dispatcher */ public function dispatchNow($command, $handler = null); + /** + * Determine if the given command has a handler. + * + * @param mixed $command + * @return bool + */ + public function hasCommandHandler($command); + + /** + * Retrieve the handler for a command. + * + * @param mixed $command + * @return bool|mixed + */ + public function getCommandHandler($command); + /** * Set the pipes commands should be piped through before dispatching. * @@ -28,4 +44,12 @@ interface Dispatcher * @return $this */ public function pipeThrough(array $pipes); + + /** + * Map a command to a handler. + * + * @param array $map + * @return $this + */ + public function map(array $map); } diff --git a/vendor/laravel/framework/src/Illuminate/Contracts/Console/Application.php b/vendor/laravel/framework/src/Illuminate/Contracts/Console/Application.php index a59e4312c..ba628c9f2 100644 --- a/vendor/laravel/framework/src/Illuminate/Contracts/Console/Application.php +++ b/vendor/laravel/framework/src/Illuminate/Contracts/Console/Application.php @@ -5,13 +5,14 @@ namespace Illuminate\Contracts\Console; interface Application { /** - * Call a console application command. + * Run an Artisan console command by name. * * @param string $command * @param array $parameters + * @param \Symfony\Component\Console\Output\OutputInterface|null $outputBuffer * @return int */ - public function call($command, array $parameters = []); + public function call($command, array $parameters = [], $outputBuffer = null); /** * Get the output from the last command. diff --git a/vendor/laravel/framework/src/Illuminate/Contracts/Console/Kernel.php b/vendor/laravel/framework/src/Illuminate/Contracts/Console/Kernel.php index 4cf798699..79889e6f6 100644 --- a/vendor/laravel/framework/src/Illuminate/Contracts/Console/Kernel.php +++ b/vendor/laravel/framework/src/Illuminate/Contracts/Console/Kernel.php @@ -8,7 +8,7 @@ interface Kernel * Handle an incoming console command. * * @param \Symfony\Component\Console\Input\InputInterface $input - * @param \Symfony\Component\Console\Output\OutputInterface $output + * @param \Symfony\Component\Console\Output\OutputInterface|null $output * @return int */ public function handle($input, $output = null); @@ -18,9 +18,10 @@ interface Kernel * * @param string $command * @param array $parameters + * @param \Symfony\Component\Console\Output\OutputInterface|null $outputBuffer * @return int */ - public function call($command, array $parameters = []); + public function call($command, array $parameters = [], $outputBuffer = null); /** * Queue an Artisan console command by name. diff --git a/vendor/laravel/framework/src/Illuminate/Contracts/Cookie/Factory.php b/vendor/laravel/framework/src/Illuminate/Contracts/Cookie/Factory.php index 612439765..0cf83ea7f 100644 --- a/vendor/laravel/framework/src/Illuminate/Contracts/Cookie/Factory.php +++ b/vendor/laravel/framework/src/Illuminate/Contracts/Cookie/Factory.php @@ -14,9 +14,11 @@ interface Factory * @param string $domain * @param bool $secure * @param bool $httpOnly + * @param bool $raw + * @param string|null $sameSite * @return \Symfony\Component\HttpFoundation\Cookie */ - public function make($name, $value, $minutes = 0, $path = null, $domain = null, $secure = false, $httpOnly = true); + public function make($name, $value, $minutes = 0, $path = null, $domain = null, $secure = false, $httpOnly = true, $raw = false, $sameSite = null); /** * Create a cookie that lasts "forever" (five years). @@ -27,9 +29,11 @@ interface Factory * @param string $domain * @param bool $secure * @param bool $httpOnly + * @param bool $raw + * @param string|null $sameSite * @return \Symfony\Component\HttpFoundation\Cookie */ - public function forever($name, $value, $path = null, $domain = null, $secure = false, $httpOnly = true); + public function forever($name, $value, $path = null, $domain = null, $secure = false, $httpOnly = true, $raw = false, $sameSite = null); /** * Expire the given cookie. diff --git a/vendor/laravel/framework/src/Illuminate/Contracts/Database/ModelIdentifier.php b/vendor/laravel/framework/src/Illuminate/Contracts/Database/ModelIdentifier.php index 587044a8d..9893d280e 100644 --- a/vendor/laravel/framework/src/Illuminate/Contracts/Database/ModelIdentifier.php +++ b/vendor/laravel/framework/src/Illuminate/Contracts/Database/ModelIdentifier.php @@ -20,6 +20,13 @@ class ModelIdentifier */ public $id; + /** + * The relationships loaded on the model. + * + * @var array + */ + public $relations; + /** * The connection name of the model. * @@ -32,13 +39,15 @@ class ModelIdentifier * * @param string $class * @param mixed $id + * @param array $relations * @param mixed $connection * @return void */ - public function __construct($class, $id, $connection) + public function __construct($class, $id, array $relations, $connection) { $this->id = $id; $this->class = $class; + $this->relations = $relations; $this->connection = $connection; } } diff --git a/vendor/laravel/framework/src/Illuminate/Contracts/Foundation/Application.php b/vendor/laravel/framework/src/Illuminate/Contracts/Foundation/Application.php index a7d643b15..810f929b4 100644 --- a/vendor/laravel/framework/src/Illuminate/Contracts/Foundation/Application.php +++ b/vendor/laravel/framework/src/Illuminate/Contracts/Foundation/Application.php @@ -28,12 +28,19 @@ interface Application extends Container public function environment(); /** - * Determine if we are running in the console. + * Determine if the application is running in the console. * * @return bool */ public function runningInConsole(); + /** + * Determine if the application is running unit tests. + * + * @return bool + */ + public function runningUnitTests(); + /** * Determine if the application is currently down for maintenance. * diff --git a/vendor/laravel/framework/src/Illuminate/Contracts/Hashing/Hasher.php b/vendor/laravel/framework/src/Illuminate/Contracts/Hashing/Hasher.php index 3310136e5..8771c7c6c 100644 --- a/vendor/laravel/framework/src/Illuminate/Contracts/Hashing/Hasher.php +++ b/vendor/laravel/framework/src/Illuminate/Contracts/Hashing/Hasher.php @@ -4,6 +4,14 @@ namespace Illuminate\Contracts\Hashing; interface Hasher { + /** + * Get information about the given hashed value. + * + * @param string $hashedValue + * @return array + */ + public function info($hashedValue); + /** * Hash the given value. * diff --git a/vendor/laravel/framework/src/Illuminate/Contracts/Logging/Log.php b/vendor/laravel/framework/src/Illuminate/Contracts/Logging/Log.php deleted file mode 100644 index 5ecb9f8bd..000000000 --- a/vendor/laravel/framework/src/Illuminate/Contracts/Logging/Log.php +++ /dev/null @@ -1,98 +0,0 @@ -=7.0", + "php": "^7.1.3", "psr/container": "~1.0", "psr/simple-cache": "~1.0" }, @@ -25,7 +25,7 @@ }, "extra": { "branch-alias": { - "dev-master": "5.5-dev" + "dev-master": "5.6-dev" } }, "config": { diff --git a/vendor/laravel/framework/src/Illuminate/Cookie/CookieJar.php b/vendor/laravel/framework/src/Illuminate/Cookie/CookieJar.php index b4c65df5a..f792a6c76 100644 --- a/vendor/laravel/framework/src/Illuminate/Cookie/CookieJar.php +++ b/vendor/laravel/framework/src/Illuminate/Cookie/CookieJar.php @@ -54,13 +54,13 @@ class CookieJar implements JarContract * @param int $minutes * @param string $path * @param string $domain - * @param bool $secure + * @param bool|null $secure * @param bool $httpOnly * @param bool $raw * @param string|null $sameSite * @return \Symfony\Component\HttpFoundation\Cookie */ - public function make($name, $value, $minutes = 0, $path = null, $domain = null, $secure = false, $httpOnly = true, $raw = false, $sameSite = null) + public function make($name, $value, $minutes = 0, $path = null, $domain = null, $secure = null, $httpOnly = true, $raw = false, $sameSite = null) { list($path, $domain, $secure, $sameSite) = $this->getPathAndDomain($path, $domain, $secure, $sameSite); @@ -76,13 +76,13 @@ class CookieJar implements JarContract * @param string $value * @param string $path * @param string $domain - * @param bool $secure + * @param bool|null $secure * @param bool $httpOnly * @param bool $raw * @param string|null $sameSite * @return \Symfony\Component\HttpFoundation\Cookie */ - public function forever($name, $value, $path = null, $domain = null, $secure = false, $httpOnly = true, $raw = false, $sameSite = null) + public function forever($name, $value, $path = null, $domain = null, $secure = null, $httpOnly = true, $raw = false, $sameSite = null) { return $this->make($name, $value, 2628000, $path, $domain, $secure, $httpOnly, $raw, $sameSite); } @@ -154,15 +154,15 @@ class CookieJar implements JarContract /** * Get the path and domain, or the default values. * - * @param string $path - * @param string $domain - * @param bool $secure - * @param string $sameSite + * @param string $path + * @param string $domain + * @param bool|null $secure + * @param string $sameSite * @return array */ - protected function getPathAndDomain($path, $domain, $secure = false, $sameSite = null) + protected function getPathAndDomain($path, $domain, $secure = null, $sameSite = null) { - return [$path ?: $this->path, $domain ?: $this->domain, $secure ?: $this->secure, $sameSite ?: $this->sameSite]; + return [$path ?: $this->path, $domain ?: $this->domain, is_bool($secure) ? $secure : $this->secure, $sameSite ?: $this->sameSite]; } /** diff --git a/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/EncryptCookies.php b/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/EncryptCookies.php index f7dfac679..5c289af0a 100644 --- a/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/EncryptCookies.php +++ b/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/EncryptCookies.php @@ -39,12 +39,12 @@ class EncryptCookies /** * Disable encryption for the given cookie name(s). * - * @param string|array $cookieName + * @param string|array $name * @return void */ - public function disableFor($cookieName) + public function disableFor($name) { - $this->except = array_merge($this->except, (array) $cookieName); + $this->except = array_merge($this->except, (array) $name); } /** @@ -52,7 +52,7 @@ class EncryptCookies * * @param \Illuminate\Http\Request $request * @param \Closure $next - * @return mixed + * @return \Symfony\Component\HttpFoundation\Response */ public function handle($request, Closure $next) { @@ -67,13 +67,13 @@ class EncryptCookies */ protected function decrypt(Request $request) { - foreach ($request->cookies as $key => $c) { + foreach ($request->cookies as $key => $cookie) { if ($this->isDisabled($key)) { continue; } try { - $request->cookies->set($key, $this->decryptCookie($c)); + $request->cookies->set($key, $this->decryptCookie($cookie)); } catch (DecryptException $e) { $request->cookies->set($key, null); } @@ -138,16 +138,16 @@ class EncryptCookies /** * Duplicate a cookie with a new value. * - * @param \Symfony\Component\HttpFoundation\Cookie $c + * @param \Symfony\Component\HttpFoundation\Cookie $cookie * @param mixed $value * @return \Symfony\Component\HttpFoundation\Cookie */ - protected function duplicate(Cookie $c, $value) + protected function duplicate(Cookie $cookie, $value) { return new Cookie( - $c->getName(), $value, $c->getExpiresTime(), $c->getPath(), - $c->getDomain(), $c->isSecure(), $c->isHttpOnly(), $c->isRaw(), - $c->getSameSite() + $cookie->getName(), $value, $cookie->getExpiresTime(), + $cookie->getPath(), $cookie->getDomain(), $cookie->isSecure(), + $cookie->isHttpOnly(), $cookie->isRaw(), $cookie->getSameSite() ); } diff --git a/vendor/laravel/framework/src/Illuminate/Cookie/composer.json b/vendor/laravel/framework/src/Illuminate/Cookie/composer.json index e9a85cd64..d46dd119b 100644 --- a/vendor/laravel/framework/src/Illuminate/Cookie/composer.json +++ b/vendor/laravel/framework/src/Illuminate/Cookie/composer.json @@ -14,11 +14,11 @@ } ], "require": { - "php": ">=7.0", - "illuminate/contracts": "5.5.*", - "illuminate/support": "5.5.*", - "symfony/http-foundation": "~3.3", - "symfony/http-kernel": "~3.3" + "php": "^7.1.3", + "illuminate/contracts": "5.6.*", + "illuminate/support": "5.6.*", + "symfony/http-foundation": "~4.0", + "symfony/http-kernel": "~4.0" }, "autoload": { "psr-4": { @@ -27,7 +27,7 @@ }, "extra": { "branch-alias": { - "dev-master": "5.5-dev" + "dev-master": "5.6-dev" } }, "config": { diff --git a/vendor/laravel/framework/src/Illuminate/Database/Concerns/ManagesTransactions.php b/vendor/laravel/framework/src/Illuminate/Database/Concerns/ManagesTransactions.php index ec979f4ed..1b7312426 100644 --- a/vendor/laravel/framework/src/Illuminate/Database/Concerns/ManagesTransactions.php +++ b/vendor/laravel/framework/src/Illuminate/Database/Concerns/ManagesTransactions.php @@ -129,7 +129,7 @@ trait ManagesTransactions /** * Handle an exception from a transaction beginning. * - * @param \Exception $e + * @param \Throwable $e * @return void * * @throws \Exception diff --git a/vendor/laravel/framework/src/Illuminate/Database/Connection.php b/vendor/laravel/framework/src/Illuminate/Database/Connection.php index a55776c69..ee73f0dd4 100644 --- a/vendor/laravel/framework/src/Illuminate/Database/Connection.php +++ b/vendor/laravel/framework/src/Illuminate/Database/Connection.php @@ -504,7 +504,7 @@ class Connection implements ConnectionInterface } $this->recordsHaveBeenModified( - $change = ($this->getPdo()->exec($query) === false ? false : true) + $change = $this->getPdo()->exec($query) !== false ); return $change; @@ -552,7 +552,7 @@ class Connection implements ConnectionInterface // Now we'll execute this callback and capture the result. Once it has been // executed we will restore the value of query logging and give back the - // value of hte callback so the original callers can have the results. + // value of the callback so the original callers can have the results. $result = $callback(); $this->loggingQueries = $loggingQueries; @@ -929,7 +929,7 @@ class Connection implements ConnectionInterface return $this->getPdo(); } - if ($this->getConfig('sticky') && $this->recordsModified) { + if ($this->recordsModified && $this->getConfig('sticky')) { return $this->getPdo(); } @@ -958,7 +958,7 @@ class Connection implements ConnectionInterface /** * Set the PDO connection used for reading. * - * @param \PDO||\Closure|null $pdo + * @param \PDO|\Closure|null $pdo * @return $this */ public function setReadPdo($pdo) @@ -1096,6 +1096,16 @@ class Connection implements ConnectionInterface $this->events = $events; } + /** + * Unset the event dispatcher for this connection. + * + * @return void + */ + public function unsetEventDispatcher() + { + $this->events = null; + } + /** * Determine if the connection in a "dry run". * diff --git a/vendor/laravel/framework/src/Illuminate/Database/Connectors/ConnectionFactory.php b/vendor/laravel/framework/src/Illuminate/Database/Connectors/ConnectionFactory.php index 0462c7b60..d998a4184 100644 --- a/vendor/laravel/framework/src/Illuminate/Database/Connectors/ConnectionFactory.php +++ b/vendor/laravel/framework/src/Illuminate/Database/Connectors/ConnectionFactory.php @@ -11,7 +11,6 @@ use Illuminate\Database\SQLiteConnection; use Illuminate\Database\PostgresConnection; use Illuminate\Database\SqlServerConnection; use Illuminate\Contracts\Container\Container; -use Illuminate\Contracts\Debug\ExceptionHandler; class ConnectionFactory { @@ -182,9 +181,7 @@ class ConnectionFactory try { return $this->createConnector($config)->connect($config); } catch (PDOException $e) { - if (count($hosts) - 1 === $key && $this->container->bound(ExceptionHandler::class)) { - $this->container->make(ExceptionHandler::class)->report($e); - } + continue; } } @@ -283,6 +280,6 @@ class ConnectionFactory return new SqlServerConnection($connection, $database, $prefix, $config); } - throw new InvalidArgumentException("Unsupported driver [$driver]"); + throw new InvalidArgumentException("Unsupported driver [{$driver}]"); } } diff --git a/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php b/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php index b772f5212..4a2c82fb1 100644 --- a/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php +++ b/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php @@ -4,6 +4,7 @@ namespace Illuminate\Database\Connectors; use PDO; use Exception; +use Throwable; use Doctrine\DBAL\Driver\PDOConnection; use Illuminate\Database\DetectsLostConnections; @@ -82,7 +83,7 @@ class Connector /** * Handle an exception that occurred during connect execution. * - * @param \Exception $e + * @param \Throwable $e * @param string $dsn * @param string $username * @param string $password @@ -91,7 +92,7 @@ class Connector * * @throws \Exception */ - protected function tryAgainIfCausedByLostConnection(Exception $e, $dsn, $username, $password, $options) + protected function tryAgainIfCausedByLostConnection(Throwable $e, $dsn, $username, $password, $options) { if ($this->causedByLostConnection($e)) { return $this->createPdoConnection($dsn, $username, $password, $options); diff --git a/vendor/laravel/framework/src/Illuminate/Database/Connectors/MySqlConnector.php b/vendor/laravel/framework/src/Illuminate/Database/Connectors/MySqlConnector.php index ed341aa45..9665172ec 100644 --- a/vendor/laravel/framework/src/Illuminate/Database/Connectors/MySqlConnector.php +++ b/vendor/laravel/framework/src/Illuminate/Database/Connectors/MySqlConnector.php @@ -172,7 +172,6 @@ class MySqlConnector extends Connector implements ConnectorInterface * Get the query to enable strict mode. * * @param \PDO $connection - * * @return string */ protected function strictMode(PDO $connection) diff --git a/vendor/laravel/framework/src/Illuminate/Database/Connectors/SQLiteConnector.php b/vendor/laravel/framework/src/Illuminate/Database/Connectors/SQLiteConnector.php index 28f90915b..ae8e4e766 100644 --- a/vendor/laravel/framework/src/Illuminate/Database/Connectors/SQLiteConnector.php +++ b/vendor/laravel/framework/src/Illuminate/Database/Connectors/SQLiteConnector.php @@ -31,7 +31,7 @@ class SQLiteConnector extends Connector implements ConnectorInterface // as the developer probably wants to know if the database exists and this // SQLite driver will not throw any exception if it does not by default. if ($path === false) { - throw new InvalidArgumentException("Database (${config['database']}) does not exist."); + throw new InvalidArgumentException("Database ({$config['database']}) does not exist."); } return $this->createConnection("sqlite:{$path}", $config, $options); diff --git a/vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/BaseCommand.php b/vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/BaseCommand.php index 81ca3cc75..6c4f25507 100644 --- a/vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/BaseCommand.php +++ b/vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/BaseCommand.php @@ -18,15 +18,27 @@ class BaseCommand extends Command // migrations may be run for any customized path from within the application. if ($this->input->hasOption('path') && $this->option('path')) { return collect($this->option('path'))->map(function ($path) { - return $this->laravel->basePath().'/'.$path; + return ! $this->usingRealPath() + ? $this->laravel->basePath().'/'.$path + : $path; })->all(); } return array_merge( - [$this->getMigrationPath()], $this->migrator->paths() + $this->migrator->paths(), [$this->getMigrationPath()] ); } + /** + * Determine if the given path(s) are pre-resolved "real" paths. + * + * @return bool + */ + protected function usingRealPath() + { + return $this->input->hasOption('realpath') && $this->option('realpath'); + } + /** * Get the path to the migration directory. * diff --git a/vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/FreshCommand.php b/vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/FreshCommand.php index a9779a795..f23d7654a 100644 --- a/vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/FreshCommand.php +++ b/vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/FreshCommand.php @@ -35,15 +35,22 @@ class FreshCommand extends Command return; } - $this->dropAllTables( - $database = $this->input->getOption('database') - ); + $database = $this->input->getOption('database'); + + if ($this->option('drop-views')) { + $this->dropAllViews($database); + + $this->info('Dropped all views successfully.'); + } + + $this->dropAllTables($database); $this->info('Dropped all tables successfully.'); $this->call('migrate', [ '--database' => $database, '--path' => $this->input->getOption('path'), + '--realpath' => $this->input->getOption('realpath'), '--force' => true, ]); @@ -65,6 +72,19 @@ class FreshCommand extends Command ->dropAllTables(); } + /** + * Drop all of the database views. + * + * @param string $database + * @return void + */ + protected function dropAllViews($database) + { + $this->laravel['db']->connection($database) + ->getSchemaBuilder() + ->dropAllViews(); + } + /** * Determine if the developer has requested database seeding. * @@ -100,9 +120,13 @@ class FreshCommand extends Command return [ ['database', null, InputOption::VALUE_OPTIONAL, 'The database connection to use.'], + ['drop-views', null, InputOption::VALUE_NONE, 'Drop all tables and views.'], + ['force', null, InputOption::VALUE_NONE, 'Force the operation to run when in production.'], - ['path', null, InputOption::VALUE_OPTIONAL, 'The path of migrations files to be executed.'], + ['path', null, InputOption::VALUE_OPTIONAL, 'The path to the migrations files to be executed.'], + + ['realpath', null, InputOption::VALUE_NONE, 'Indicate any provided migration file paths are pre-resolved absolute paths.'], ['seed', null, InputOption::VALUE_NONE, 'Indicates if the seed task should be re-run.'], diff --git a/vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/MigrateCommand.php b/vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/MigrateCommand.php index 12fe90af9..dbeaed418 100644 --- a/vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/MigrateCommand.php +++ b/vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/MigrateCommand.php @@ -16,7 +16,8 @@ class MigrateCommand extends BaseCommand */ protected $signature = 'migrate {--database= : The database connection to use.} {--force : Force the operation to run when in production.} - {--path= : The path of migrations files to be executed.} + {--path= : The path to the migrations files to be executed.} + {--realpath : Indicate any provided migration file paths are pre-resolved absolute paths.} {--pretend : Dump the SQL queries that would be run.} {--seed : Indicates if the seed task should be re-run.} {--step : Force the migrations to be run so they can be rolled back individually.}'; diff --git a/vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/MigrateMakeCommand.php b/vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/MigrateMakeCommand.php index 03995de99..cb6ff8232 100644 --- a/vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/MigrateMakeCommand.php +++ b/vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/MigrateMakeCommand.php @@ -16,7 +16,8 @@ class MigrateMakeCommand extends BaseCommand protected $signature = 'make:migration {name : The name of the migration.} {--create= : The table to be created.} {--table= : The table to migrate.} - {--path= : The location where the migration file should be created.}'; + {--path= : The location where the migration file should be created.} + {--realpath : Indicate any provided migration file paths are pre-resolved absolute paths.}'; /** * The console command description. @@ -83,11 +84,7 @@ class MigrateMakeCommand extends BaseCommand // "create" in the name. This will allow us to provide a convenient way // of creating migrations that create new tables for the application. if (! $table) { - if (preg_match('/^create_(\w+)_table$/', $name, $matches)) { - $table = $matches[1]; - - $create = true; - } + [$table, $create] = TableGuesser::guess($name); } // Now we are ready to write the migration out to disk. Once we've written @@ -123,9 +120,21 @@ class MigrateMakeCommand extends BaseCommand protected function getMigrationPath() { if (! is_null($targetPath = $this->input->getOption('path'))) { - return $this->laravel->basePath().'/'.$targetPath; + return ! $this->usingRealPath() + ? $this->laravel->basePath().'/'.$targetPath + : $targetPath; } return parent::getMigrationPath(); } + + /** + * Determine if the given path(s) are pre-resolved "real" paths. + * + * @return bool + */ + protected function usingRealPath() + { + return $this->input->hasOption('realpath') && $this->option('realpath'); + } } diff --git a/vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/RefreshCommand.php b/vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/RefreshCommand.php index dc89091c1..8041483ec 100644 --- a/vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/RefreshCommand.php +++ b/vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/RefreshCommand.php @@ -61,6 +61,7 @@ class RefreshCommand extends Command $this->call('migrate', [ '--database' => $database, '--path' => $path, + '--realpath' => $this->input->getOption('realpath'), '--force' => $force, ]); @@ -83,6 +84,7 @@ class RefreshCommand extends Command $this->call('migrate:rollback', [ '--database' => $database, '--path' => $path, + '--realpath' => $this->input->getOption('realpath'), '--step' => $step, '--force' => $force, ]); @@ -101,6 +103,7 @@ class RefreshCommand extends Command $this->call('migrate:reset', [ '--database' => $database, '--path' => $path, + '--realpath' => $this->input->getOption('realpath'), '--force' => $force, ]); } @@ -142,7 +145,9 @@ class RefreshCommand extends Command ['force', null, InputOption::VALUE_NONE, 'Force the operation to run when in production.'], - ['path', null, InputOption::VALUE_OPTIONAL, 'The path of migrations files to be executed.'], + ['path', null, InputOption::VALUE_OPTIONAL, 'The path to the migrations files to be executed.'], + + ['realpath', null, InputOption::VALUE_NONE, 'Indicate any provided migration file paths are pre-resolved absolute paths.'], ['seed', null, InputOption::VALUE_NONE, 'Indicates if the seed task should be re-run.'], diff --git a/vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/ResetCommand.php b/vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/ResetCommand.php index c2efdfa68..c887ac494 100644 --- a/vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/ResetCommand.php +++ b/vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/ResetCommand.php @@ -88,7 +88,9 @@ class ResetCommand extends BaseCommand ['force', null, InputOption::VALUE_NONE, 'Force the operation to run when in production.'], - ['path', null, InputOption::VALUE_OPTIONAL | InputOption::VALUE_IS_ARRAY, 'The path(s) of migrations files to be executed.'], + ['path', null, InputOption::VALUE_OPTIONAL | InputOption::VALUE_IS_ARRAY, 'The path(s) to the migrations files to be executed.'], + + ['realpath', null, InputOption::VALUE_NONE, 'Indicate any provided migration file paths are pre-resolved absolute paths.'], ['pretend', null, InputOption::VALUE_NONE, 'Dump the SQL queries that would be run.'], ]; diff --git a/vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/RollbackCommand.php b/vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/RollbackCommand.php index 3315d643a..eac23263c 100644 --- a/vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/RollbackCommand.php +++ b/vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/RollbackCommand.php @@ -84,7 +84,9 @@ class RollbackCommand extends BaseCommand ['force', null, InputOption::VALUE_NONE, 'Force the operation to run when in production.'], - ['path', null, InputOption::VALUE_OPTIONAL, 'The path of migrations files to be executed.'], + ['path', null, InputOption::VALUE_OPTIONAL, 'The path to the migrations files to be executed.'], + + ['realpath', null, InputOption::VALUE_NONE, 'Indicate any provided migration file paths are pre-resolved absolute paths.'], ['pretend', null, InputOption::VALUE_NONE, 'Dump the SQL queries that would be run.'], diff --git a/vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/StatusCommand.php b/vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/StatusCommand.php index df065423b..93ed51a7e 100644 --- a/vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/StatusCommand.php +++ b/vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/StatusCommand.php @@ -57,8 +57,10 @@ class StatusCommand extends BaseCommand $ran = $this->migrator->getRepository()->getRan(); - if (count($migrations = $this->getStatusFor($ran)) > 0) { - $this->table(['Ran?', 'Migration'], $migrations); + $batches = $this->migrator->getRepository()->getMigrationBatches(); + + if (count($migrations = $this->getStatusFor($ran, $batches)) > 0) { + $this->table(['Ran?', 'Migration', 'Batch'], $migrations); } else { $this->error('No migrations found'); } @@ -68,16 +70,17 @@ class StatusCommand extends BaseCommand * Get the status for the given ran migrations. * * @param array $ran + * @param array $batches * @return \Illuminate\Support\Collection */ - protected function getStatusFor(array $ran) + protected function getStatusFor(array $ran, array $batches) { return Collection::make($this->getAllMigrationFiles()) - ->map(function ($migration) use ($ran) { + ->map(function ($migration) use ($ran, $batches) { $migrationName = $this->migrator->getMigrationName($migration); return in_array($migrationName, $ran) - ? ['Y', $migrationName] + ? ['Y', $migrationName, $batches[$migrationName]] : ['N', $migrationName]; }); } @@ -102,7 +105,9 @@ class StatusCommand extends BaseCommand return [ ['database', null, InputOption::VALUE_OPTIONAL, 'The database connection to use.'], - ['path', null, InputOption::VALUE_OPTIONAL, 'The path of migrations files to use.'], + ['path', null, InputOption::VALUE_OPTIONAL, 'The path to the migrations files to use.'], + + ['realpath', null, InputOption::VALUE_NONE, 'Indicate any provided migration file paths are pre-resolved absolute paths.'], ]; } } diff --git a/vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/TableGuesser.php b/vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/TableGuesser.php new file mode 100644 index 000000000..edcd706ff --- /dev/null +++ b/vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/TableGuesser.php @@ -0,0 +1,23 @@ +app['config']['database.connections']; if (is_null($config = Arr::get($connections, $name))) { - throw new InvalidArgumentException("Database [$name] not configured."); + throw new InvalidArgumentException("Database [{$name}] not configured."); } return $config; diff --git a/vendor/laravel/framework/src/Illuminate/Database/DetectsLostConnections.php b/vendor/laravel/framework/src/Illuminate/Database/DetectsLostConnections.php index 2fa0c78b1..8e3ec7d10 100644 --- a/vendor/laravel/framework/src/Illuminate/Database/DetectsLostConnections.php +++ b/vendor/laravel/framework/src/Illuminate/Database/DetectsLostConnections.php @@ -2,7 +2,7 @@ namespace Illuminate\Database; -use Exception; +use Throwable; use Illuminate\Support\Str; trait DetectsLostConnections @@ -10,10 +10,10 @@ trait DetectsLostConnections /** * Determine if the given exception was caused by a lost connection. * - * @param \Exception $e + * @param \Throwable $e * @return bool */ - protected function causedByLostConnection(Exception $e) + protected function causedByLostConnection(Throwable $e) { $message = $e->getMessage(); diff --git a/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Builder.php b/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Builder.php index 442c4488d..f5a583cb0 100644 --- a/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Builder.php +++ b/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Builder.php @@ -68,7 +68,7 @@ class Builder */ protected $passthru = [ 'insert', 'insertGetId', 'getBindings', 'toSql', - 'exists', 'doesntExist', 'count', 'min', 'max', 'avg', 'sum', 'getConnection', + 'exists', 'doesntExist', 'count', 'min', 'max', 'avg', 'average', 'sum', 'getConnection', ]; /** @@ -211,8 +211,8 @@ class Builder * Add a basic where clause to the query. * * @param string|array|\Closure $column - * @param string $operator - * @param mixed $value + * @param mixed $operator + * @param mixed $value * @param string $boolean * @return $this */ @@ -233,14 +233,14 @@ class Builder * Add an "or where" clause to the query. * * @param \Closure|array|string $column - * @param string $operator + * @param mixed $operator * @param mixed $value * @return \Illuminate\Database\Eloquent\Builder|static */ public function orWhere($column, $operator = null, $value = null) { list($value, $operator) = $this->query->prepareValueAndOperator( - $value, $operator, func_num_args() == 2 + $value, $operator, func_num_args() === 2 ); return $this->where($column, $operator, $value, 'or'); @@ -321,7 +321,7 @@ class Builder $result = $this->find($id, $columns); if (is_array($id)) { - if (count($result) == count(array_unique($id))) { + if (count($result) === count(array_unique($id))) { return $result; } } elseif (! is_null($result)) { @@ -622,7 +622,7 @@ class Builder $alias = is_null($alias) ? $column : $alias; - $lastId = 0; + $lastId = null; do { $clone = clone $this; @@ -784,7 +784,7 @@ class Builder * Increment a column's value by a given amount. * * @param string $column - * @param int $amount + * @param float|int $amount * @param array $extra * @return int */ @@ -799,7 +799,7 @@ class Builder * Decrement a column's value by a given amount. * * @param string $column - * @param int $amount + * @param float|int $amount * @param array $extra * @return int */ @@ -1306,7 +1306,9 @@ class Builder } if (! isset(static::$macros[$method])) { - throw new BadMethodCallException("Method {$method} does not exist."); + throw new BadMethodCallException(sprintf( + 'Method %s::%s does not exist.', static::class, $method + )); } if (static::$macros[$method] instanceof Closure) { diff --git a/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Collection.php b/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Collection.php index bb2789a43..ad2a7a115 100644 --- a/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Collection.php +++ b/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Collection.php @@ -4,7 +4,9 @@ namespace Illuminate\Database\Eloquent; use LogicException; use Illuminate\Support\Arr; +use Illuminate\Support\Str; use Illuminate\Contracts\Support\Arrayable; +use Illuminate\Database\Eloquent\Relations\Pivot; use Illuminate\Contracts\Queue\QueueableCollection; use Illuminate\Support\Collection as BaseCollection; @@ -43,7 +45,7 @@ class Collection extends BaseCollection implements QueueableCollection /** * Load a set of relationships onto the collection. * - * @param mixed $relations + * @param array|string $relations * @return $this */ public function load($relations) @@ -61,6 +63,100 @@ class Collection extends BaseCollection implements QueueableCollection return $this; } + /** + * Load a set of relationships onto the collection if they are not already eager loaded. + * + * @param array|string $relations + * @return $this + */ + public function loadMissing($relations) + { + if (is_string($relations)) { + $relations = func_get_args(); + } + + foreach ($relations as $key => $value) { + if (is_numeric($key)) { + $key = $value; + } + + $segments = explode('.', explode(':', $key)[0]); + + if (Str::contains($key, ':')) { + $segments[count($segments) - 1] .= ':'.explode(':', $key)[1]; + } + + $path = array_combine($segments, $segments); + + if (is_callable($value)) { + $path[end($segments)] = $value; + } + + $this->loadMissingRelation($this, $path); + } + + return $this; + } + + /** + * Load a relationship path if it is not already eager loaded. + * + * @param \Illuminate\Database\Eloquent\Collection $models + * @param array $path + * @return void + */ + protected function loadMissingRelation(Collection $models, array $path) + { + $relation = array_splice($path, 0, 1); + + $name = explode(':', key($relation))[0]; + + if (is_string(reset($relation))) { + $relation = reset($relation); + } + + $models->filter(function ($model) use ($name) { + return ! is_null($model) && ! $model->relationLoaded($name); + })->load($relation); + + if (empty($path)) { + return; + } + + $models = $models->pluck($name); + + if ($models->first() instanceof BaseCollection) { + $models = $models->collapse(); + } + + $this->loadMissingRelation(new static($models), $path); + } + + /** + * Load a set of relationships onto the mixed relationship collection. + * + * @param string $relation + * @param array $relations + * @return $this + */ + public function loadMorph($relation, $relations) + { + $this->pluck($relation) + ->filter() + ->groupBy(function ($model) { + return get_class($model); + }) + ->filter(function ($models, $className) use ($relations) { + return Arr::has($relations, $className); + }) + ->each(function ($models, $className) use ($relations) { + $className::with($relations[$className]) + ->eagerLoadRelations($models->all()); + }); + + return $this; + } + /** * Add an item to the collection. * @@ -412,7 +508,23 @@ class Collection extends BaseCollection implements QueueableCollection */ public function getQueueableIds() { - return $this->modelKeys(); + if ($this->isEmpty()) { + return []; + } + + return $this->first() instanceof Pivot + ? $this->map->getQueueableId()->all() + : $this->modelKeys(); + } + + /** + * Get the relationships of the entities being queued. + * + * @return array + */ + public function getQueueableRelations() + { + return $this->isNotEmpty() ? $this->first()->getQueueableRelations() : []; } /** diff --git a/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Concerns/HasAttributes.php b/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Concerns/HasAttributes.php index 2893495cb..5067a5b52 100644 --- a/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Concerns/HasAttributes.php +++ b/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Concerns/HasAttributes.php @@ -189,6 +189,10 @@ trait HasAttributes ($value === 'date' || $value === 'datetime')) { $attributes[$key] = $this->serializeDate($attributes[$key]); } + + if ($attributes[$key] && $this->isCustomDateTimeCast($value)) { + $attributes[$key] = $attributes[$key]->format(explode(':', $value, 2)[1]); + } } return $attributes; @@ -407,7 +411,9 @@ trait HasAttributes $relation = $this->$method(); if (! $relation instanceof Relation) { - throw new LogicException(get_class($this).'::'.$method.' must return a relationship instance.'); + throw new LogicException(sprintf( + '%s::%s must return a relationship instance.', static::class, $method + )); } return tap($relation->getResults(), function ($results) use ($method) { @@ -488,6 +494,7 @@ trait HasAttributes case 'date': return $this->asDate($value); case 'datetime': + case 'custom_datetime': return $this->asDateTime($value); case 'timestamp': return $this->asTimestamp($value); @@ -504,15 +511,31 @@ trait HasAttributes */ protected function getCastType($key) { + if ($this->isCustomDateTimeCast($this->getCasts()[$key])) { + return 'custom_datetime'; + } + return trim(strtolower($this->getCasts()[$key])); } + /** + * Determine if the cast type is a custom date time cast. + * + * @param string $cast + * @return bool + */ + protected function isCustomDateTimeCast($cast) + { + return strncmp($cast, 'date:', 5) === 0 || + strncmp($cast, 'datetime:', 9) === 0; + } + /** * Set a given attribute on the model. * * @param string $key * @param mixed $value - * @return $this + * @return mixed */ public function setAttribute($key, $value) { @@ -520,9 +543,7 @@ trait HasAttributes // which simply lets the developers tweak the attribute as it is set on // the model, such as "json_encoding" an listing of data for storage. if ($this->hasSetMutator($key)) { - $method = 'set'.Str::studly($key).'Attribute'; - - return $this->{$method}($value); + return $this->setMutatedAttributeValue($key, $value); } // If an attribute is listed as a "date", we'll convert it from a DateTime @@ -559,6 +580,18 @@ trait HasAttributes return method_exists($this, 'set'.Str::studly($key).'Attribute'); } + /** + * Set the value of an attribute using its mutator. + * + * @param string $key + * @param mixed $value + * @return mixed + */ + protected function setMutatedAttributeValue($key, $value) + { + return $this->{'set'.Str::studly($key).'Attribute'}($value); + } + /** * Determine if the given attribute is a date or date castable. * @@ -781,7 +814,7 @@ trait HasAttributes * * @return string */ - protected function getDateFormat() + public function getDateFormat() { return $this->dateFormat ?: $this->getConnection()->getQueryGrammar()->getDateFormat(); } diff --git a/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Concerns/HasEvents.php b/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Concerns/HasEvents.php index 0972bd6fe..2f6def1ec 100644 --- a/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Concerns/HasEvents.php +++ b/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Concerns/HasEvents.php @@ -2,6 +2,7 @@ namespace Illuminate\Database\Eloquent\Concerns; +use Illuminate\Support\Arr; use Illuminate\Contracts\Events\Dispatcher; trait HasEvents @@ -25,21 +26,34 @@ trait HasEvents protected $observables = []; /** - * Register an observer with the Model. + * Register observers with the model. * - * @param object|string $class + * @param object|array|string $classes * @return void */ - public static function observe($class) + public static function observe($classes) { $instance = new static; + foreach (Arr::wrap($classes) as $class) { + $instance->registerObserver($class); + } + } + + /** + * Register a single observer with the model. + * + * @param object|string $class + * @return void + */ + protected function registerObserver($class) + { $className = is_string($class) ? $class : get_class($class); // When registering a model observer, we will spin through the possible events // and determine if this observer has that method. If it does, we will hook // it into the model's event system, making it convenient to watch these. - foreach ($instance->getObservableEvents() as $event) { + foreach ($this->getObservableEvents() as $event) { if (method_exists($class, $event)) { static::registerModelEvent($event, $className.'@'.$event); } @@ -55,9 +69,9 @@ trait HasEvents { return array_merge( [ - 'retrieved', 'creating', 'created', 'updating', - 'updated', 'deleting', 'deleted', 'saving', - 'saved', 'restoring', 'restored', + 'retrieved', 'creating', 'created', 'updating', 'updated', + 'saving', 'saved', 'restoring', 'restored', + 'deleting', 'deleted', 'forceDeleted', ], $this->observables ); diff --git a/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Concerns/HasRelationships.php b/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Concerns/HasRelationships.php index c6affcd36..53666b6eb 100644 --- a/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Concerns/HasRelationships.php +++ b/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Concerns/HasRelationships.php @@ -173,9 +173,10 @@ trait HasRelationships * @param string $name * @param string $type * @param string $id + * @param string $ownerKey * @return \Illuminate\Database\Eloquent\Relations\MorphTo */ - public function morphTo($name = null, $type = null, $id = null) + public function morphTo($name = null, $type = null, $id = null, $ownerKey = null) { // If no name is provided, we will use the backtrace to get the function name // since that is most likely the name of the polymorphic interface. We can @@ -190,8 +191,8 @@ trait HasRelationships // the relationship. In this case we'll just pass in a dummy query where we // need to remove any eager loads that may already be defined on a model. return empty($class = $this->{$type}) - ? $this->morphEagerTo($name, $type, $id) - : $this->morphInstanceTo($class, $name, $type, $id); + ? $this->morphEagerTo($name, $type, $id, $ownerKey) + : $this->morphInstanceTo($class, $name, $type, $id, $ownerKey); } /** @@ -200,12 +201,13 @@ trait HasRelationships * @param string $name * @param string $type * @param string $id + * @param string $ownerKey * @return \Illuminate\Database\Eloquent\Relations\MorphTo */ - protected function morphEagerTo($name, $type, $id) + protected function morphEagerTo($name, $type, $id, $ownerKey) { return $this->newMorphTo( - $this->newQuery()->setEagerLoads([]), $this, $id, null, $type, $name + $this->newQuery()->setEagerLoads([]), $this, $id, $ownerKey, $type, $name ); } @@ -216,16 +218,17 @@ trait HasRelationships * @param string $name * @param string $type * @param string $id + * @param string $ownerKey * @return \Illuminate\Database\Eloquent\Relations\MorphTo */ - protected function morphInstanceTo($target, $name, $type, $id) + protected function morphInstanceTo($target, $name, $type, $id, $ownerKey) { $instance = $this->newRelatedInstance( static::getActualClassNameForMorph($target) ); return $this->newMorphTo( - $instance->newQuery(), $this, $id, $instance->getKeyName(), $type, $name + $instance->newQuery(), $this, $id, $ownerKey ?? $instance->getKeyName(), $type, $name ); } @@ -492,7 +495,7 @@ trait HasRelationships } /** - * Instantiate a new HasManyThrough relationship. + * Instantiate a new MorphToMany relationship. * * @param \Illuminate\Database\Eloquent\Builder $query * @param \Illuminate\Database\Eloquent\Model $parent @@ -690,7 +693,7 @@ trait HasRelationships } /** - * Set the specific relationship in the model. + * Set the given relationship on the model. * * @param string $relation * @param mixed $value @@ -703,6 +706,19 @@ trait HasRelationships return $this; } + /** + * Unset a loaded relationship. + * + * @param string $relation + * @return $this + */ + public function unsetRelation($relation) + { + unset($this->relations[$relation]); + + return $this; + } + /** * Set the entire relations array on the model. * diff --git a/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Concerns/HasTimestamps.php b/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Concerns/HasTimestamps.php index ce3e0801d..8e3d488ed 100644 --- a/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Concerns/HasTimestamps.php +++ b/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Concerns/HasTimestamps.php @@ -42,7 +42,8 @@ trait HasTimestamps $this->setUpdatedAt($time); } - if (! $this->exists && ! $this->isDirty(static::CREATED_AT)) { + if (! $this->exists && ! is_null(static::CREATED_AT) && + ! $this->isDirty(static::CREATED_AT)) { $this->setCreatedAt($time); } } diff --git a/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Concerns/QueriesRelationships.php b/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Concerns/QueriesRelationships.php index 289770375..5f2ec2dab 100644 --- a/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Concerns/QueriesRelationships.php +++ b/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Concerns/QueriesRelationships.php @@ -210,14 +210,18 @@ trait QueriesRelationships $query->callScope($constraints); - $query->mergeConstraintsFrom($relation->getQuery()); + $query = $query->mergeConstraintsFrom($relation->getQuery())->toBase(); + + if (count($query->columns) > 1) { + $query->columns = [$query->columns[0]]; + } // Finally we will add the proper result column alias to the query and run the subselect // statement against the query builder. Then we will return the builder instance back // to the developer for further constraint chaining that needs to take place on it. $column = $alias ?? Str::snake($name.'_count'); - $this->selectSub($query->toBase(), $column); + $this->selectSub($query, $column); } return $this; diff --git a/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Factory.php b/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Factory.php index 8b6104c3d..82917ae38 100644 --- a/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Factory.php +++ b/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Factory.php @@ -22,6 +22,20 @@ class Factory implements ArrayAccess */ protected $states = []; + /** + * The registered after making callbacks. + * + * @var array + */ + protected $afterMaking = []; + + /** + * The registered after creating callbacks. + * + * @var array + */ + protected $afterCreating = []; + /** * The Faker instance for the builder. * @@ -97,6 +111,62 @@ class Factory implements ArrayAccess return $this; } + /** + * Define a callback to run after making a model. + * + * @param string $class + * @param callable $callback + * @param string $name + * @return $this + */ + public function afterMaking($class, callable $callback, $name = 'default') + { + $this->afterMaking[$class][$name][] = $callback; + + return $this; + } + + /** + * Define a callback to run after making a model with given state. + * + * @param string $class + * @param string $state + * @param callable $callback + * @return $this + */ + public function afterMakingState($class, $state, callable $callback) + { + return $this->afterMaking($class, $callback, $state); + } + + /** + * Define a callback to run after creating a model. + * + * @param string $class + * @param callable $callback + * @param string $name + * @return $this + */ + public function afterCreating($class, callable $callback, $name = 'default') + { + $this->afterCreating[$class][$name][] = $callback; + + return $this; + } + + /** + * Define a callback to run after creating a model with given state. + * + * @param string $class + * @param string $state + * @param callable $callback + * @return $this + */ + public function afterCreatingState($class, $state, callable $callback) + { + return $this->afterCreating($class, $callback, $state); + } + /** * Create an instance of the given model and persist it to the database. * @@ -184,7 +254,10 @@ class Factory implements ArrayAccess */ public function of($class, $name = 'default') { - return new FactoryBuilder($class, $name, $this->definitions, $this->states, $this->faker); + return new FactoryBuilder( + $class, $name, $this->definitions, $this->states, + $this->afterMaking, $this->afterCreating, $this->faker + ); } /** diff --git a/vendor/laravel/framework/src/Illuminate/Database/Eloquent/FactoryBuilder.php b/vendor/laravel/framework/src/Illuminate/Database/Eloquent/FactoryBuilder.php index 7a3b02306..150f2ef31 100644 --- a/vendor/laravel/framework/src/Illuminate/Database/Eloquent/FactoryBuilder.php +++ b/vendor/laravel/framework/src/Illuminate/Database/Eloquent/FactoryBuilder.php @@ -45,6 +45,20 @@ class FactoryBuilder */ protected $states; + /** + * The model after making callbacks. + * + * @var array + */ + protected $afterMaking = []; + + /** + * The model after creating callbacks. + * + * @var array + */ + protected $afterCreating = []; + /** * The states to apply. * @@ -73,16 +87,21 @@ class FactoryBuilder * @param string $name * @param array $definitions * @param array $states + * @param array $afterMaking + * @param array $afterCreating * @param \Faker\Generator $faker * @return void */ - public function __construct($class, $name, array $definitions, array $states, Faker $faker) + public function __construct($class, $name, array $definitions, array $states, + array $afterMaking, array $afterCreating, Faker $faker) { $this->name = $name; $this->class = $class; $this->faker = $faker; $this->states = $states; $this->definitions = $definitions; + $this->afterMaking = $afterMaking; + $this->afterCreating = $afterCreating; } /** @@ -98,6 +117,17 @@ class FactoryBuilder return $this; } + /** + * Set the state to be applied to the model. + * + * @param string $state + * @return $this + */ + public function state($state) + { + return $this->states([$state]); + } + /** * Set the states to be applied to the model. * @@ -149,8 +179,12 @@ class FactoryBuilder if ($results instanceof Model) { $this->store(collect([$results])); + + $this->callAfterCreating(collect([$results])); } else { $this->store($results); + + $this->callAfterCreating($results); } return $results; @@ -182,16 +216,22 @@ class FactoryBuilder public function make(array $attributes = []) { if ($this->amount === null) { - return $this->makeInstance($attributes); + return tap($this->makeInstance($attributes), function ($instance) { + $this->callAfterMaking(collect([$instance])); + }); } if ($this->amount < 1) { return (new $this->class)->newCollection(); } - return (new $this->class)->newCollection(array_map(function () use ($attributes) { + $instances = (new $this->class)->newCollection(array_map(function () use ($attributes) { return $this->makeInstance($attributes); }, range(1, $this->amount))); + + $this->callAfterMaking($instances); + + return $instances; } /** @@ -220,9 +260,15 @@ class FactoryBuilder * * @param array $attributes * @return mixed + * + * @throws \InvalidArgumentException */ protected function getRawAttributes(array $attributes = []) { + if (! isset($this->definitions[$this->class][$this->name])) { + throw new InvalidArgumentException("Unable to locate factory with name [{$this->name}] [{$this->class}]."); + } + $definition = call_user_func( $this->definitions[$this->class][$this->name], $this->faker, $attributes @@ -238,16 +284,10 @@ class FactoryBuilder * * @param array $attributes * @return \Illuminate\Database\Eloquent\Model - * - * @throws \InvalidArgumentException */ protected function makeInstance(array $attributes = []) { return Model::unguarded(function () use ($attributes) { - if (! isset($this->definitions[$this->class][$this->name])) { - throw new InvalidArgumentException("Unable to locate factory with name [{$this->name}] [{$this->class}]."); - } - $instance = new $this->class( $this->getRawAttributes($attributes) ); @@ -271,6 +311,10 @@ class FactoryBuilder { foreach ($this->activeStates as $state) { if (! isset($this->states[$this->class][$state])) { + if ($this->stateHasAfterCallback($state)) { + continue; + } + throw new InvalidArgumentException("Unable to locate [{$state}] state for [{$this->class}]."); } @@ -313,7 +357,7 @@ class FactoryBuilder protected function expandAttributes(array $attributes) { foreach ($attributes as &$attribute) { - if (is_callable($attribute) && ! is_string($attribute)) { + if (is_callable($attribute) && ! is_string($attribute) && ! is_array($attribute)) { $attribute = $attribute($attributes); } @@ -328,4 +372,75 @@ class FactoryBuilder return $attributes; } + + /** + * Run after making callbacks on a collection of models. + * + * @param \Illuminate\Support\Collection $models + * @return void + */ + public function callAfterMaking($models) + { + $this->callAfter($this->afterMaking, $models); + } + + /** + * Run after creating callbacks on a collection of models. + * + * @param \Illuminate\Support\Collection $models + * @return void + */ + public function callAfterCreating($models) + { + $this->callAfter($this->afterCreating, $models); + } + + /** + * Call after callbacks for each model and state. + * + * @param array $afterCallbacks + * @param \Illuminate\Support\Collection $models + * @return void + */ + protected function callAfter(array $afterCallbacks, $models) + { + $states = array_merge([$this->name], $this->activeStates); + + $models->each(function ($model) use ($states, $afterCallbacks) { + foreach ($states as $state) { + $this->callAfterCallbacks($afterCallbacks, $model, $state); + } + }); + } + + /** + * Call after callbacks for each model and state. + * + * @param array $afterCallbacks + * @param \Illuminate\Database\Eloquent\Model $model + * @param string $state + * @return void + */ + protected function callAfterCallbacks(array $afterCallbacks, $model, $state) + { + if (! isset($afterCallbacks[$this->class][$state])) { + return; + } + + foreach ($afterCallbacks[$this->class][$state] as $callback) { + $callback($model, $this->faker); + } + } + + /** + * Determine if the given state has an "after" callback. + * + * @param string $state + * @return bool + */ + protected function stateHasAfterCallback($state) + { + return isset($this->afterMaking[$this->class][$state]) || + isset($this->afterCreating[$this->class][$state]); + } } diff --git a/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php b/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php index 743b633b4..85a698158 100644 --- a/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php +++ b/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php @@ -12,6 +12,7 @@ use Illuminate\Contracts\Support\Arrayable; use Illuminate\Contracts\Routing\UrlRoutable; use Illuminate\Contracts\Queue\QueueableEntity; use Illuminate\Database\Eloquent\Relations\Pivot; +use Illuminate\Contracts\Queue\QueueableCollection; use Illuminate\Database\Query\Builder as QueryBuilder; use Illuminate\Database\ConnectionResolverInterface as Resolver; @@ -123,6 +124,13 @@ abstract class Model implements ArrayAccess, Arrayable, Jsonable, JsonSerializab */ protected static $globalScopes = []; + /** + * The list of models classes that should not be affected with touch. + * + * @var array + */ + protected static $ignoreOnTouch = []; + /** * The name of the "created at" column. * @@ -189,9 +197,15 @@ abstract class Model implements ArrayAccess, Arrayable, Jsonable, JsonSerializab { $class = static::class; + $booted = []; + foreach (class_uses_recursive($class) as $trait) { - if (method_exists($class, $method = 'boot'.class_basename($trait))) { + $method = 'boot'.class_basename($trait); + + if (method_exists($class, $method) && ! in_array($method, $booted)) { forward_static_call([$class, $method]); + + $booted[] = $method; } } } @@ -208,6 +222,54 @@ abstract class Model implements ArrayAccess, Arrayable, Jsonable, JsonSerializab static::$globalScopes = []; } + /** + * Disables relationship model touching for the current class during given callback scope. + * + * @param callable $callback + * @return void + */ + public static function withoutTouching(callable $callback) + { + static::withoutTouchingOn([static::class], $callback); + } + + /** + * Disables relationship model touching for the given model classes during given callback scope. + * + * @param array $models + * @param callable $callback + * @return void + */ + public static function withoutTouchingOn(array $models, callable $callback) + { + static::$ignoreOnTouch = array_values(array_merge(static::$ignoreOnTouch, $models)); + + try { + call_user_func($callback); + } finally { + static::$ignoreOnTouch = array_values(array_diff(static::$ignoreOnTouch, $models)); + } + } + + /** + * Determine if the given model is ignoring touches. + * + * @param string|null $class + * @return bool + */ + public static function isIgnoringTouch($class = null) + { + $class = $class ?: static::class; + + foreach (static::$ignoreOnTouch as $ignoredClass) { + if ($class === $ignoredClass || is_subclass_of($class, $ignoredClass)) { + return true; + } + } + + return false; + } + /** * Fill the model with an array of attributes. * @@ -229,7 +291,10 @@ abstract class Model implements ArrayAccess, Arrayable, Jsonable, JsonSerializab if ($this->isFillable($key)) { $this->setAttribute($key, $value); } elseif ($totallyGuarded) { - throw new MassAssignmentException($key); + throw new MassAssignmentException(sprintf( + 'Add [%s] to fillable property to allow mass assignment on [%s].', + $key, get_class($this) + )); } } @@ -401,16 +466,16 @@ abstract class Model implements ArrayAccess, Arrayable, Jsonable, JsonSerializab { $relations = is_string($relations) ? func_get_args() : $relations; - return $this->load(array_filter($relations, function ($relation) { - return ! $this->relationLoaded($relation); - })); + $this->newCollection([$this])->loadMissing($relations); + + return $this; } /** * Increment a column's value by a given amount. * * @param string $column - * @param int $amount + * @param float|int $amount * @param array $extra * @return int */ @@ -423,7 +488,7 @@ abstract class Model implements ArrayAccess, Arrayable, Jsonable, JsonSerializab * Decrement a column's value by a given amount. * * @param string $column - * @param int $amount + * @param float|int $amount * @param array $extra * @return int */ @@ -436,7 +501,7 @@ abstract class Model implements ArrayAccess, Arrayable, Jsonable, JsonSerializab * Run the increment or decrement method on the model. * * @param string $column - * @param int $amount + * @param float|int $amount * @param array $extra * @param string $method * @return int @@ -460,7 +525,7 @@ abstract class Model implements ArrayAccess, Arrayable, Jsonable, JsonSerializab * Increment the underlying attribute value and sync with original. * * @param string $column - * @param int $amount + * @param float|int $amount * @param array $extra * @param string $method * @return void @@ -895,9 +960,7 @@ abstract class Model implements ArrayAccess, Arrayable, Jsonable, JsonSerializab */ public function newQueryWithoutScope($scope) { - $builder = $this->newQuery(); - - return $builder->withoutGlobalScope($scope); + return $this->newQuery()->withoutGlobalScope($scope); } /** @@ -908,11 +971,9 @@ abstract class Model implements ArrayAccess, Arrayable, Jsonable, JsonSerializab */ public function newQueryForRestoration($ids) { - if (is_array($ids)) { - return $this->newQueryWithoutScopes()->whereIn($this->getQualifiedKeyName(), $ids); - } - - return $this->newQueryWithoutScopes()->whereKey($ids); + return is_array($ids) + ? $this->newQueryWithoutScopes()->whereIn($this->getQualifiedKeyName(), $ids) + : $this->newQueryWithoutScopes()->whereKey($ids); } /** @@ -1041,6 +1102,8 @@ abstract class Model implements ArrayAccess, Arrayable, Jsonable, JsonSerializab $this->load(collect($this->relations)->except('pivot')->keys()->toArray()); + $this->syncOriginal(); + return $this; } @@ -1297,6 +1360,36 @@ abstract class Model implements ArrayAccess, Arrayable, Jsonable, JsonSerializab return $this->getKey(); } + /** + * Get the queueable relationships for the entity. + * + * @return array + */ + public function getQueueableRelations() + { + $relations = []; + + foreach ($this->getRelations() as $key => $relation) { + if (method_exists($this, $key)) { + $relations[] = $key; + } + + if ($relation instanceof QueueableCollection) { + foreach ($relation->getQueueableRelations() as $collectionValue) { + $relations[] = $key.'.'.$collectionValue; + } + } + + if ($relation instanceof QueueableEntity) { + foreach ($relation->getQueueableRelations() as $entityKey => $entityValue) { + $relations[] = $key.'.'.$entityValue; + } + } + } + + return array_unique($relations); + } + /** * Get the queueable connection for the entity. * @@ -1345,7 +1438,7 @@ abstract class Model implements ArrayAccess, Arrayable, Jsonable, JsonSerializab */ public function getForeignKey() { - return Str::snake(class_basename($this)).'_'.$this->primaryKey; + return Str::snake(class_basename($this)).'_'.$this->getKeyName(); } /** diff --git a/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/BelongsToMany.php b/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/BelongsToMany.php index dd2863d20..f39e90591 100644 --- a/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/BelongsToMany.php +++ b/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/BelongsToMany.php @@ -3,6 +3,7 @@ namespace Illuminate\Database\Eloquent\Relations; use Illuminate\Support\Str; +use InvalidArgumentException; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Collection; @@ -75,6 +76,13 @@ class BelongsToMany extends Relation */ protected $pivotWhereIns = []; + /** + * The default values for the pivot columns. + * + * @var array + */ + protected $pivotValues = []; + /** * Indicates if timestamps are available on the pivot table. * @@ -266,6 +274,16 @@ class BelongsToMany extends Relation return $dictionary; } + /** + * Get the class being used for pivot models. + * + * @return string + */ + public function getPivotClass() + { + return $this->using ?? Pivot::class; + } + /** * Specify the custom pivot model to use for the relationship. * @@ -337,6 +355,34 @@ class BelongsToMany extends Relation return $this->wherePivot($column, $operator, $value, 'or'); } + /** + * Set a where clause for a pivot table column. + * + * In addition, new pivot records will receive this value. + * + * @param string $column + * @param mixed $value + * @return \Illuminate\Database\Eloquent\Relations\BelongsToMany + */ + public function withPivotValue($column, $value = null) + { + if (is_array($column)) { + foreach ($column as $name => $value) { + $this->withPivotValue($name, $value); + } + + return $this; + } + + if (is_null($value)) { + throw new InvalidArgumentException('The provided value may not be null.'); + } + + $this->pivotValues[] = compact('column', 'value'); + + return $this->wherePivot($column, '=', $value); + } + /** * Set an "or where in" clause for a pivot table column. * @@ -461,7 +507,7 @@ class BelongsToMany extends Relation $result = $this->find($id, $columns); if (is_array($id)) { - if (count($result) == count(array_unique($id))) { + if (count($result) === count(array_unique($id))) { return $result; } } elseif (! is_null($result)) { diff --git a/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/Concerns/InteractsWithPivotTable.php b/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/Concerns/InteractsWithPivotTable.php index 83da64e83..5c488aeec 100644 --- a/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/Concerns/InteractsWithPivotTable.php +++ b/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/Concerns/InteractsWithPivotTable.php @@ -188,7 +188,7 @@ trait InteractsWithPivotTable $attributes = $this->addTimestampsToAttachment($attributes, true); } - $updated = $this->newPivotStatementForId($id)->update( + $updated = $this->newPivotStatementForId($this->parseId($id))->update( $this->castAttributes($attributes) ); @@ -300,6 +300,10 @@ trait InteractsWithPivotTable $record = $this->addTimestampsToAttachment($record); } + foreach ($this->pivotValues as $value) { + $record[$value['column']] = $value['value']; + } + return $record; } @@ -314,6 +318,12 @@ trait InteractsWithPivotTable { $fresh = $this->parent->freshTimestamp(); + if ($this->using) { + $pivotModel = new $this->using; + + $fresh = $fresh->format($pivotModel->getDateFormat()); + } + if (! $exists && $this->hasPivotColumn($this->createdAt())) { $record[$this->createdAt()] = $fresh; } @@ -478,6 +488,17 @@ trait InteractsWithPivotTable return (array) $value; } + /** + * Get the ID from the given mixed value. + * + * @param mixed $value + * @return mixed + */ + protected function parseId($value) + { + return $value instanceof Model ? $value->getKey() : $value; + } + /** * Cast the given keys to integers if they are numeric and string otherwise. * diff --git a/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/Concerns/SupportsDefaultModels.php b/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/Concerns/SupportsDefaultModels.php index 00efd507e..74e758f58 100644 --- a/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/Concerns/SupportsDefaultModels.php +++ b/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/Concerns/SupportsDefaultModels.php @@ -51,7 +51,7 @@ trait SupportsDefaultModels $instance = $this->newRelatedInstanceFor($parent); if (is_callable($this->withDefault)) { - return call_user_func($this->withDefault, $instance) ?: $instance; + return call_user_func($this->withDefault, $instance, $parent) ?: $instance; } if (is_array($this->withDefault)) { diff --git a/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/HasManyThrough.php b/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/HasManyThrough.php index 408e42fc7..f75aa2601 100644 --- a/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/HasManyThrough.php +++ b/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/HasManyThrough.php @@ -135,9 +135,7 @@ class HasManyThrough extends Relation */ public function throughParentSoftDeletes() { - return in_array(SoftDeletes::class, class_uses_recursive( - get_class($this->throughParent) - )); + return in_array(SoftDeletes::class, class_uses_recursive($this->throughParent)); } /** @@ -326,7 +324,7 @@ class HasManyThrough extends Relation $result = $this->find($id, $columns); if (is_array($id)) { - if (count($result) == count(array_unique($id))) { + if (count($result) === count(array_unique($id))) { return $result; } } elseif (! is_null($result)) { @@ -354,16 +352,9 @@ class HasManyThrough extends Relation */ public function get($columns = ['*']) { - // First we'll add the proper select columns onto the query so it is run with - // the proper columns. Then, we will get the results and hydrate out pivot - // models with the result of those columns as a separate model relation. - $columns = $this->query->getQuery()->columns ? [] : $columns; + $builder = $this->prepareQueryBuilder($columns); - $builder = $this->query->applyScopes(); - - $models = $builder->addSelect( - $this->shouldSelect($columns) - )->getModels(); + $models = $builder->getModels(); // If we actually found models we will also eager load any relationships that // have been specified as needing to be eager loaded. This will solve the @@ -422,6 +413,49 @@ class HasManyThrough extends Relation return array_merge($columns, [$this->getQualifiedFirstKeyName()]); } + /** + * Chunk the results of the query. + * + * @param int $count + * @param callable $callback + * @return bool + */ + public function chunk($count, callable $callback) + { + return $this->prepareQueryBuilder()->chunk($count, $callback); + } + + /** + * Execute a callback over each item while chunking. + * + * @param callable $callback + * @param int $count + * @return bool + */ + public function each(callable $callback, $count = 1000) + { + return $this->chunk($count, function ($results) use ($callback) { + foreach ($results as $key => $value) { + if ($callback($value, $key) === false) { + return false; + } + } + }); + } + + /** + * Prepare the query builder for query execution. + * + * @param array $columns + * @return \Illuminate\Database\Eloquent\Builder + */ + protected function prepareQueryBuilder($columns = ['*']) + { + return $this->query->applyScopes()->addSelect( + $this->shouldSelect($this->query->getQuery()->columns ? [] : $columns) + ); + } + /** * Add the constraints for a relationship query. * diff --git a/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/HasOneOrMany.php b/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/HasOneOrMany.php index 54850fa33..20b2b4f7b 100644 --- a/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/HasOneOrMany.php +++ b/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/HasOneOrMany.php @@ -316,7 +316,7 @@ abstract class HasOneOrMany extends Relation */ public function update(array $attributes) { - if ($this->related->usesTimestamps()) { + if ($this->related->usesTimestamps() && ! is_null($this->relatedUpdatedAt())) { $attributes[$this->relatedUpdatedAt()] = $this->related->freshTimestampString(); } diff --git a/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/MorphPivot.php b/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/MorphPivot.php index b7a2f3419..a8a9210f0 100644 --- a/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/MorphPivot.php +++ b/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/MorphPivot.php @@ -2,6 +2,7 @@ namespace Illuminate\Database\Eloquent\Relations; +use Illuminate\Support\Str; use Illuminate\Database\Eloquent\Builder; class MorphPivot extends Pivot @@ -76,4 +77,74 @@ class MorphPivot extends Pivot return $this; } + + /** + * Get the queueable identity for the entity. + * + * @return mixed + */ + public function getQueueableId() + { + if (isset($this->attributes[$this->getKeyName()])) { + return $this->getKey(); + } + + return sprintf( + '%s:%s:%s:%s:%s:%s', + $this->foreignKey, $this->getAttribute($this->foreignKey), + $this->relatedKey, $this->getAttribute($this->relatedKey), + $this->morphType, $this->morphClass + ); + } + + /** + * Get a new query to restore one or more models by their queueable IDs. + * + * @param array|int $ids + * @return \Illuminate\Database\Eloquent\Builder + */ + public function newQueryForRestoration($ids) + { + if (is_array($ids)) { + return $this->newQueryForCollectionRestoration($ids); + } + + if (! Str::contains($ids, ':')) { + return parent::newQueryForRestoration($ids); + } + + $segments = explode(':', $ids); + + return $this->newQueryWithoutScopes() + ->where($segments[0], $segments[1]) + ->where($segments[2], $segments[3]) + ->where($segments[4], $segments[5]); + } + + /** + * Get a new query to restore multiple models by their queueable IDs. + * + * @param array|int $ids + * @return \Illuminate\Database\Eloquent\Builder + */ + protected function newQueryForCollectionRestoration(array $ids) + { + if (! Str::contains($ids[0], ':')) { + return parent::newQueryForRestoration($ids); + } + + $query = $this->newQueryWithoutScopes(); + + foreach ($ids as $id) { + $segments = explode(':', $id); + + $query->orWhere(function ($query) use ($segments) { + return $query->where($segments[0], $segments[1]) + ->where($segments[2], $segments[3]) + ->where($segments[4], $segments[5]); + }); + } + + return $query; + } } diff --git a/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/MorphTo.php b/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/MorphTo.php index 0b5375b32..46e7d8c7c 100644 --- a/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/MorphTo.php +++ b/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/MorphTo.php @@ -91,7 +91,7 @@ class MorphTo extends BelongsTo */ public function getResults() { - return $this->ownerKey ? $this->query->first() : null; + return $this->ownerKey ? parent::getResults() : null; } /** @@ -120,12 +120,14 @@ class MorphTo extends BelongsTo { $instance = $this->createModelByType($type); + $ownerKey = $this->ownerKey ?? $instance->getKeyName(); + $query = $this->replayMacros($instance->newQuery()) ->mergeConstraintsFrom($this->getQuery()) ->with($this->getQuery()->getEagerLoads()); return $query->whereIn( - $instance->getTable().'.'.$instance->getKeyName(), $this->gatherKeysByType($type) + $instance->getTable().'.'.$ownerKey, $this->gatherKeysByType($type) )->get(); } @@ -178,8 +180,10 @@ class MorphTo extends BelongsTo protected function matchToMorphParents($type, Collection $results) { foreach ($results as $result) { - if (isset($this->dictionary[$type][$result->getKey()])) { - foreach ($this->dictionary[$type][$result->getKey()] as $model) { + $ownerKey = ! is_null($this->ownerKey) ? $result->{$this->ownerKey} : $result->getKey(); + + if (isset($this->dictionary[$type][$ownerKey])) { + foreach ($this->dictionary[$type][$ownerKey] as $model) { $model->setRelation($this->relation, $result); } } diff --git a/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/MorphToMany.php b/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/MorphToMany.php index 15f5cfd02..f97c465dd 100644 --- a/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/MorphToMany.php +++ b/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/MorphToMany.php @@ -146,6 +146,22 @@ class MorphToMany extends BelongsToMany return $pivot; } + /** + * Get the pivot columns for the relation. + * + * "pivot_" is prefixed at each column for easy removal later. + * + * @return array + */ + protected function aliasedPivotColumns() + { + $defaults = [$this->foreignPivotKey, $this->relatedPivotKey, $this->morphType]; + + return collect(array_merge($defaults, $this->pivotColumns))->map(function ($column) { + return $this->table.'.'.$column.' as pivot_'.$column; + })->unique()->all(); + } + /** * Get the foreign key "type" name. * diff --git a/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/Pivot.php b/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/Pivot.php index f6950956c..dd7d35678 100644 --- a/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/Pivot.php +++ b/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/Pivot.php @@ -216,7 +216,9 @@ class Pivot extends Model */ public function getCreatedAtColumn() { - return $this->pivotParent->getCreatedAtColumn(); + return ($this->pivotParent) + ? $this->pivotParent->getCreatedAtColumn() + : parent::getCreatedAtColumn(); } /** @@ -226,6 +228,75 @@ class Pivot extends Model */ public function getUpdatedAtColumn() { - return $this->pivotParent->getUpdatedAtColumn(); + return ($this->pivotParent) + ? $this->pivotParent->getUpdatedAtColumn() + : parent::getUpdatedAtColumn(); + } + + /** + * Get the queueable identity for the entity. + * + * @return mixed + */ + public function getQueueableId() + { + if (isset($this->attributes[$this->getKeyName()])) { + return $this->getKey(); + } + + return sprintf( + '%s:%s:%s:%s', + $this->foreignKey, $this->getAttribute($this->foreignKey), + $this->relatedKey, $this->getAttribute($this->relatedKey) + ); + } + + /** + * Get a new query to restore one or more models by their queueable IDs. + * + * @param array|int $ids + * @return \Illuminate\Database\Eloquent\Builder + */ + public function newQueryForRestoration($ids) + { + if (is_array($ids)) { + return $this->newQueryForCollectionRestoration($ids); + } + + if (! Str::contains($ids, ':')) { + return parent::newQueryForRestoration($ids); + } + + $segments = explode(':', $ids); + + return $this->newQueryWithoutScopes() + ->where($segments[0], $segments[1]) + ->where($segments[2], $segments[3]); + } + + /** + * Get a new query to restore multiple models by their queueable IDs. + * + * @param array|int $ids + * @return \Illuminate\Database\Eloquent\Builder + */ + protected function newQueryForCollectionRestoration(array $ids) + { + if (! Str::contains($ids[0], ':')) { + return parent::newQueryForRestoration($ids); + } + + $query = $this->newQueryWithoutScopes(); + + foreach ($ids as $id) { + $segments = explode(':', $id); + + $query->orWhere(function ($query) use ($segments) { + return $query->where($segments[0], $segments[1]) + ->where($segments[2], $segments[3]); + }); + } + + return $query; } } diff --git a/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/Relation.php b/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/Relation.php index c46dc358c..ae6ddbf4a 100644 --- a/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/Relation.php +++ b/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/Relation.php @@ -161,9 +161,13 @@ abstract class Relation */ public function touch() { - $column = $this->getRelated()->getUpdatedAtColumn(); + $model = $this->getRelated(); - $this->rawUpdate([$column => $this->getRelated()->freshTimestampString()]); + if (! $model::isIgnoringTouch()) { + $this->rawUpdate([ + $model->getUpdatedAtColumn() => $model->freshTimestampString(), + ]); + } } /** @@ -346,9 +350,7 @@ abstract class Relation */ public static function getMorphedModel($alias) { - return array_key_exists($alias, self::$morphMap) - ? self::$morphMap[$alias] - : null; + return self::$morphMap[$alias] ?? null; } /** diff --git a/vendor/laravel/framework/src/Illuminate/Database/Eloquent/SoftDeletes.php b/vendor/laravel/framework/src/Illuminate/Database/Eloquent/SoftDeletes.php index a2c38c879..ab81a4d43 100644 --- a/vendor/laravel/framework/src/Illuminate/Database/Eloquent/SoftDeletes.php +++ b/vendor/laravel/framework/src/Illuminate/Database/Eloquent/SoftDeletes.php @@ -30,11 +30,13 @@ trait SoftDeletes { $this->forceDeleting = true; - $deleted = $this->delete(); + return tap($this->delete(), function ($deleted) { + $this->forceDeleting = false; - $this->forceDeleting = false; - - return $deleted; + if ($deleted) { + $this->fireModelEvent('forceDeleted', false); + } + }); } /** @@ -74,7 +76,9 @@ trait SoftDeletes $columns[$this->getUpdatedAtColumn()] = $this->fromDateTime($time); } - $query->update($columns); + if ($query->update($columns)) { + $this->syncOriginal(); + } } /** diff --git a/vendor/laravel/framework/src/Illuminate/Database/Grammar.php b/vendor/laravel/framework/src/Illuminate/Database/Grammar.php index 243f07c30..385256532 100644 --- a/vendor/laravel/framework/src/Illuminate/Database/Grammar.php +++ b/vendor/laravel/framework/src/Illuminate/Database/Grammar.php @@ -2,10 +2,13 @@ namespace Illuminate\Database; +use Illuminate\Support\Traits\Macroable; use Illuminate\Database\Query\Expression; abstract class Grammar { + use Macroable; + /** * The grammar table prefix. * @@ -53,9 +56,9 @@ abstract class Grammar } // If the value being wrapped has a column alias we will need to separate out - // the pieces so we can wrap each of the segments of the expression on it - // own, and then joins them both back together with the "as" connector. - if (strpos(strtolower($value), ' as ') !== false) { + // the pieces so we can wrap each of the segments of the expression on its + // own, and then join these both back together using the "as" connector. + if (stripos($value, ' as ') !== false) { return $this->wrapAliasedValue($value, $prefixAlias); } @@ -148,6 +151,21 @@ abstract class Grammar return $this->isExpression($value) ? $this->getValue($value) : '?'; } + /** + * Quote the given string literal. + * + * @param string|array $value + * @return string + */ + public function quoteString($value) + { + if (is_array($value)) { + return implode(', ', array_map([$this, __FUNCTION__], $value)); + } + + return "'$value'"; + } + /** * Determine if the given value is a raw expression. * diff --git a/vendor/laravel/framework/src/Illuminate/Database/Migrations/DatabaseMigrationRepository.php b/vendor/laravel/framework/src/Illuminate/Database/Migrations/DatabaseMigrationRepository.php index b1685ffa3..1ace1a6ff 100644 --- a/vendor/laravel/framework/src/Illuminate/Database/Migrations/DatabaseMigrationRepository.php +++ b/vendor/laravel/framework/src/Illuminate/Database/Migrations/DatabaseMigrationRepository.php @@ -41,7 +41,7 @@ class DatabaseMigrationRepository implements MigrationRepositoryInterface } /** - * Get the ran migrations. + * Get the completed migrations. * * @return array */ @@ -80,11 +80,24 @@ class DatabaseMigrationRepository implements MigrationRepositoryInterface return $query->orderBy('migration', 'desc')->get()->all(); } + /** + * Get the completed migrations with their batch numbers. + * + * @return array + */ + public function getMigrationBatches() + { + return $this->table() + ->orderBy('batch', 'asc') + ->orderBy('migration', 'asc') + ->pluck('batch', 'migration')->all(); + } + /** * Log that a migration was run. * * @param string $file - * @param int $batch + * @param int $batch * @return void */ public function log($file, $batch) diff --git a/vendor/laravel/framework/src/Illuminate/Database/Migrations/MigrationCreator.php b/vendor/laravel/framework/src/Illuminate/Database/Migrations/MigrationCreator.php index 719fbf106..685e03c64 100644 --- a/vendor/laravel/framework/src/Illuminate/Database/Migrations/MigrationCreator.php +++ b/vendor/laravel/framework/src/Illuminate/Database/Migrations/MigrationCreator.php @@ -61,7 +61,7 @@ class MigrationCreator // Next, we will fire any hooks that are supposed to fire after a migration is // created. Once that is done we'll be ready to return the full path to the // migration file so it can be used however it's needed by the developer. - $this->firePostCreateHooks(); + $this->firePostCreateHooks($table); return $path; } @@ -150,12 +150,13 @@ class MigrationCreator /** * Fire the registered post create hooks. * + * @param string $table * @return void */ - protected function firePostCreateHooks() + protected function firePostCreateHooks($table) { foreach ($this->postCreate as $callback) { - call_user_func($callback); + call_user_func($callback, $table); } } diff --git a/vendor/laravel/framework/src/Illuminate/Database/Migrations/MigrationRepositoryInterface.php b/vendor/laravel/framework/src/Illuminate/Database/Migrations/MigrationRepositoryInterface.php index 60bc921f8..410326a9b 100644 --- a/vendor/laravel/framework/src/Illuminate/Database/Migrations/MigrationRepositoryInterface.php +++ b/vendor/laravel/framework/src/Illuminate/Database/Migrations/MigrationRepositoryInterface.php @@ -5,7 +5,7 @@ namespace Illuminate\Database\Migrations; interface MigrationRepositoryInterface { /** - * Get the ran migrations for a given package. + * Get the completed migrations. * * @return array */ @@ -26,11 +26,18 @@ interface MigrationRepositoryInterface */ public function getLast(); + /** + * Get the completed migrations with their batch numbers. + * + * @return array + */ + public function getMigrationBatches(); + /** * Log that a migration was run. * * @param string $file - * @param int $batch + * @param int $batch * @return void */ public function log($file, $batch); diff --git a/vendor/laravel/framework/src/Illuminate/Database/Migrations/Migrator.php b/vendor/laravel/framework/src/Illuminate/Database/Migrations/Migrator.php index d55046dab..bed58b66e 100644 --- a/vendor/laravel/framework/src/Illuminate/Database/Migrations/Migrator.php +++ b/vendor/laravel/framework/src/Illuminate/Database/Migrations/Migrator.php @@ -124,7 +124,7 @@ class Migrator // First we will just make sure that there are any migrations to run. If there // aren't, we will just make a note of it to the developer so they're aware // that all of the migrations have been run against this database system. - if (count($migrations) == 0) { + if (count($migrations) === 0) { $this->note('Nothing to migrate.'); return; @@ -480,6 +480,16 @@ class Migrator return $this->paths; } + /** + * Get the default connection name. + * + * @return string + */ + public function getConnection() + { + return $this->connection; + } + /** * Set the default connection name. * diff --git a/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php b/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php index 82f351b1d..5420f4c65 100644 --- a/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php +++ b/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php @@ -52,6 +52,7 @@ class Builder */ public $bindings = [ 'select' => [], + 'from' => [], 'join' => [], 'where' => [], 'having' => [], @@ -222,6 +223,24 @@ class Builder return $this; } + /** + * Add a subselect expression to the query. + * + * @param \Closure|\Illuminate\Database\Query\Builder|string $query + * @param string $as + * @return \Illuminate\Database\Query\Builder|static + * + * @throws \InvalidArgumentException + */ + public function selectSub($query, $as) + { + list($query, $bindings) = $this->createSub($query); + + return $this->selectRaw( + '('.$query.') as '.$this->grammar->wrap($as), $bindings + ); + } + /** * Add a new "raw" select expression to the query. * @@ -241,7 +260,7 @@ class Builder } /** - * Add a subselect expression to the query. + * Makes "from" fetch from a subquery. * * @param \Closure|\Illuminate\Database\Query\Builder|string $query * @param string $as @@ -249,7 +268,36 @@ class Builder * * @throws \InvalidArgumentException */ - public function selectSub($query, $as) + public function fromSub($query, $as) + { + list($query, $bindings) = $this->createSub($query); + + return $this->fromRaw('('.$query.') as '.$this->grammar->wrap($as), $bindings); + } + + /** + * Add a raw from clause to the query. + * + * @param string $expression + * @param mixed $bindings + * @return \Illuminate\Database\Query\Builder|static + */ + public function fromRaw($expression, $bindings = []) + { + $this->from = new Expression($expression); + + $this->addBinding($bindings, 'from'); + + return $this; + } + + /** + * Creates a subquery and parse it. + * + * @param \Closure|\Illuminate\Database\Query\Builder|string $query + * @return array + */ + protected function createSub($query) { // If the given query is a Closure, we will execute it while passing in a new // query instance to the Closure. This will give the developer a chance to @@ -260,27 +308,18 @@ class Builder $callback($query = $this->forSubQuery()); } - // Here, we will parse this query into an SQL string and an array of bindings - // so we can add it to the query builder using the selectRaw method so the - // query is included in the real SQL generated by this builder instance. - list($query, $bindings) = $this->parseSubSelect($query); - - return $this->selectRaw( - '('.$query.') as '.$this->grammar->wrap($as), $bindings - ); + return $this->parseSub($query); } /** - * Parse the sub-select query into SQL and bindings. + * Parse the subquery into SQL and bindings. * * @param mixed $query * @return array */ - protected function parseSubSelect($query) + protected function parseSub($query) { - if ($query instanceof self) { - $query->columns = [$query->columns[0]]; - + if ($query instanceof self || $query instanceof EloquentBuilder) { return [$query->toSql(), $query->getBindings()]; } elseif (is_string($query)) { return [$query, []]; @@ -384,6 +423,31 @@ class Builder return $this->join($table, $first, $operator, $second, $type, true); } + /** + * Add a subquery join clause to the query. + * + * @param \Closure|\Illuminate\Database\Query\Builder|string $query + * @param string $as + * @param string $first + * @param string|null $operator + * @param string|null $second + * @param string $type + * @param bool $where + * @return \Illuminate\Database\Query\Builder|static + * + * @throws \InvalidArgumentException + */ + public function joinSub($query, $as, $first, $operator = null, $second = null, $type = 'inner', $where = false) + { + list($query, $bindings) = $this->createSub($query); + + $expression = '('.$query.') as '.$this->grammar->wrap($as); + + $this->addBinding($bindings, 'join'); + + return $this->join(new Expression($expression), $first, $operator, $second, $type, $where); + } + /** * Add a left join to the query. * @@ -412,6 +476,21 @@ class Builder return $this->joinWhere($table, $first, $operator, $second, 'left'); } + /** + * Add a subquery left join to the query. + * + * @param \Closure|\Illuminate\Database\Query\Builder|string $query + * @param string $as + * @param string $first + * @param string|null $operator + * @param string|null $second + * @return \Illuminate\Database\Query\Builder|static + */ + public function leftJoinSub($query, $as, $first, $operator = null, $second = null) + { + return $this->joinSub($query, $as, $first, $operator, $second, 'left'); + } + /** * Add a right join to the query. * @@ -440,6 +519,21 @@ class Builder return $this->joinWhere($table, $first, $operator, $second, 'right'); } + /** + * Add a subquery right join to the query. + * + * @param \Closure|\Illuminate\Database\Query\Builder|string $query + * @param string $as + * @param string $first + * @param string|null $operator + * @param string|null $second + * @return \Illuminate\Database\Query\Builder|static + */ + public function rightJoinSub($query, $as, $first, $operator = null, $second = null) + { + return $this->joinSub($query, $as, $first, $operator, $second, 'right'); + } + /** * Add a "cross join" clause to the query. * @@ -498,7 +592,7 @@ class Builder // passed to the method, we will assume that the operator is an equals sign // and keep going. Otherwise, we'll require the operator to be passed in. list($value, $operator) = $this->prepareValueAndOperator( - $value, $operator, func_num_args() == 2 + $value, $operator, func_num_args() === 2 ); // If the columns is actually a Closure instance, we will assume the developer @@ -625,14 +719,14 @@ class Builder * Add an "or where" clause to the query. * * @param string|array|\Closure $column - * @param string|null $operator - * @param mixed $value + * @param mixed $operator + * @param mixed $value * @return \Illuminate\Database\Query\Builder|static */ public function orWhere($column, $operator = null, $value = null) { list($value, $operator) = $this->prepareValueAndOperator( - $value, $operator, func_num_args() == 2 + $value, $operator, func_num_args() === 2 ); return $this->where($column, $operator, $value, 'or'); @@ -906,9 +1000,9 @@ class Builder { $type = 'between'; - $this->wheres[] = compact('column', 'type', 'boolean', 'not'); + $this->wheres[] = compact('type', 'column', 'values', 'boolean', 'not'); - $this->addBinding($values, 'where'); + $this->addBinding($this->cleanBindings($values), 'where'); return $this; } @@ -973,7 +1067,7 @@ class Builder public function whereDate($column, $operator, $value = null, $boolean = 'and') { list($value, $operator) = $this->prepareValueAndOperator( - $value, $operator, func_num_args() == 2 + $value, $operator, func_num_args() === 2 ); return $this->addDateBasedWhere('Date', $column, $operator, $value, $boolean); @@ -984,13 +1078,13 @@ class Builder * * @param string $column * @param string $operator - * @param string $value + * @param mixed $value * @return \Illuminate\Database\Query\Builder|static */ - public function orWhereDate($column, $operator, $value) + public function orWhereDate($column, $operator, $value = null) { list($value, $operator) = $this->prepareValueAndOperator( - $value, $operator, func_num_args() == 2 + $value, $operator, func_num_args() === 2 ); return $this->whereDate($column, $operator, $value, 'or'); @@ -1001,12 +1095,16 @@ class Builder * * @param string $column * @param string $operator - * @param int $value + * @param mixed $value * @param string $boolean * @return \Illuminate\Database\Query\Builder|static */ - public function whereTime($column, $operator, $value, $boolean = 'and') + public function whereTime($column, $operator, $value = null, $boolean = 'and') { + list($value, $operator) = $this->prepareValueAndOperator( + $value, $operator, func_num_args() === 2 + ); + return $this->addDateBasedWhere('Time', $column, $operator, $value, $boolean); } @@ -1015,13 +1113,13 @@ class Builder * * @param string $column * @param string $operator - * @param int $value + * @param mixed $value * @return \Illuminate\Database\Query\Builder|static */ - public function orWhereTime($column, $operator, $value) + public function orWhereTime($column, $operator, $value = null) { list($value, $operator) = $this->prepareValueAndOperator( - $value, $operator, func_num_args() == 2 + $value, $operator, func_num_args() === 2 ); return $this->whereTime($column, $operator, $value, 'or'); @@ -1039,12 +1137,29 @@ class Builder public function whereDay($column, $operator, $value = null, $boolean = 'and') { list($value, $operator) = $this->prepareValueAndOperator( - $value, $operator, func_num_args() == 2 + $value, $operator, func_num_args() === 2 ); return $this->addDateBasedWhere('Day', $column, $operator, $value, $boolean); } + /** + * Add an "or where day" statement to the query. + * + * @param string $column + * @param string $operator + * @param mixed $value + * @return \Illuminate\Database\Query\Builder|static + */ + public function orWhereDay($column, $operator, $value = null) + { + list($value, $operator) = $this->prepareValueAndOperator( + $value, $operator, func_num_args() === 2 + ); + + return $this->addDateBasedWhere('Day', $column, $operator, $value, 'or'); + } + /** * Add a "where month" statement to the query. * @@ -1057,12 +1172,29 @@ class Builder public function whereMonth($column, $operator, $value = null, $boolean = 'and') { list($value, $operator) = $this->prepareValueAndOperator( - $value, $operator, func_num_args() == 2 + $value, $operator, func_num_args() === 2 ); return $this->addDateBasedWhere('Month', $column, $operator, $value, $boolean); } + /** + * Add an "or where month" statement to the query. + * + * @param string $column + * @param string $operator + * @param mixed $value + * @return \Illuminate\Database\Query\Builder|static + */ + public function orWhereMonth($column, $operator, $value = null) + { + list($value, $operator) = $this->prepareValueAndOperator( + $value, $operator, func_num_args() === 2 + ); + + return $this->addDateBasedWhere('Month', $column, $operator, $value, 'or'); + } + /** * Add a "where year" statement to the query. * @@ -1075,19 +1207,36 @@ class Builder public function whereYear($column, $operator, $value = null, $boolean = 'and') { list($value, $operator) = $this->prepareValueAndOperator( - $value, $operator, func_num_args() == 2 + $value, $operator, func_num_args() === 2 ); return $this->addDateBasedWhere('Year', $column, $operator, $value, $boolean); } + /** + * Add an "or where year" statement to the query. + * + * @param string $column + * @param string $operator + * @param mixed $value + * @return \Illuminate\Database\Query\Builder|static + */ + public function orWhereYear($column, $operator, $value = null) + { + list($value, $operator) = $this->prepareValueAndOperator( + $value, $operator, func_num_args() === 2 + ); + + return $this->addDateBasedWhere('Year', $column, $operator, $value, 'or'); + } + /** * Add a date based (year, month, day, time) statement to the query. * * @param string $type * @param string $column * @param string $operator - * @param int $value + * @param mixed $value * @param string $boolean * @return $this */ @@ -1140,7 +1289,7 @@ class Builder $this->wheres[] = compact('type', 'query', 'boolean'); - $this->addBinding($query->getBindings(), 'where'); + $this->addBinding($query->getRawBindings()['where'], 'where'); } return $this; @@ -1247,6 +1396,102 @@ class Builder return $this; } + /** + * Adds a where condition using row values. + * + * @param array $columns + * @param string $operator + * @param array $values + * @param string $boolean + * @return $this + */ + public function whereRowValues($columns, $operator, $values, $boolean = 'and') + { + if (count($columns) !== count($values)) { + throw new InvalidArgumentException('The number of columns must match the number of values'); + } + + $type = 'RowValues'; + + $this->wheres[] = compact('type', 'columns', 'operator', 'values', 'boolean'); + + $this->addBinding($values); + + return $this; + } + + /** + * Adds a or where condition using row values. + * + * @param array $columns + * @param string $operator + * @param array $values + * @return $this + */ + public function orWhereRowValues($columns, $operator, $values) + { + return $this->whereRowValues($columns, $operator, $values, 'or'); + } + + /** + * Add a "where JSON contains" clause to the query. + * + * @param string $column + * @param mixed $value + * @param string $boolean + * @param bool $not + * @return $this + */ + public function whereJsonContains($column, $value, $boolean = 'and', $not = false) + { + $type = 'JsonContains'; + + $this->wheres[] = compact('type', 'column', 'value', 'boolean', 'not'); + + if (! $value instanceof Expression) { + $this->addBinding($this->grammar->prepareBindingForJsonContains($value)); + } + + return $this; + } + + /** + * Add a "or where JSON contains" clause to the query. + * + * @param string $column + * @param mixed $value + * @return $this + */ + public function orWhereJsonContains($column, $value) + { + return $this->whereJsonContains($column, $value, 'or'); + } + + /** + * Add a "where JSON not contains" clause to the query. + * + * @param string $column + * @param mixed $value + * @param string $boolean + * @return $this + */ + public function whereJsonDoesntContain($column, $value, $boolean = 'and') + { + return $this->whereJsonContains($column, $value, $boolean, true); + } + + /** + * Add a "or where JSON not contains" clause to the query. + * + * @param string $column + * @param mixed $value + * @return $this + */ + public function orWhereJsonDoesntContain($column, $value) + { + return $this->whereJsonDoesntContain($column, $value, 'or'); + } + /** * Handles dynamic "where" clauses to the query. * @@ -1344,7 +1589,7 @@ class Builder // passed to the method, we will assume that the operator is an equals sign // and keep going. Otherwise, we'll require the operator to be passed in. list($value, $operator) = $this->prepareValueAndOperator( - $value, $operator, func_num_args() == 2 + $value, $operator, func_num_args() === 2 ); // If the given operator is not found in the list of valid operators we will @@ -1373,6 +1618,10 @@ class Builder */ public function orHaving($column, $operator = null, $value = null) { + list($value, $operator) = $this->prepareValueAndOperator( + $value, $operator, func_num_args() === 2 + ); + return $this->having($column, $operator, $value, 'or'); } @@ -1556,7 +1805,7 @@ class Builder * Constrain the query to the next "page" of results after a given ID. * * @param int $perPage - * @param int $lastId + * @param int|null $lastId * @param string $column * @return \Illuminate\Database\Query\Builder|static */ @@ -1564,8 +1813,11 @@ class Builder { $this->orders = $this->removeExistingOrdersFor($column); - return $this->where($column, '>', $lastId) - ->orderBy($column, 'asc') + if (! is_null($lastId)) { + $this->where($column, '>', $lastId); + } + + return $this->orderBy($column, 'asc') ->take($perPage); } @@ -1695,17 +1947,9 @@ class Builder */ public function get($columns = ['*']) { - $original = $this->columns; - - if (is_null($original)) { - $this->columns = $columns; - } - - $results = $this->processor->processSelect($this, $this->runSelect()); - - $this->columns = $original; - - return collect($results); + return collect($this->onceWithColumns($columns, function () { + return $this->processor->processSelect($this, $this->runSelect()); + })); } /** @@ -1813,7 +2057,7 @@ class Builder protected function withoutSelectAliases(array $columns) { return array_map(function ($column) { - return is_string($column) && ($aliasPosition = strpos(strtolower($column), ' as ')) !== false + return is_string($column) && ($aliasPosition = stripos($column, ' as ')) !== false ? substr($column, 0, $aliasPosition) : $column; }, $columns); } @@ -1847,7 +2091,7 @@ class Builder { $alias = $alias ?: $column; - $lastId = 0; + $lastId = null; do { $clone = clone $this; @@ -1901,15 +2145,32 @@ class Builder */ public function pluck($column, $key = null) { - $results = $this->get(is_null($key) ? [$column] : [$column, $key]); + // First, we will need to select the results of the query accounting for the + // given columns / key. Once we have the results, we will be able to take + // the results and get the exact data that was requested for the query. + $queryResult = $this->onceWithColumns( + is_null($key) ? [$column] : [$column, $key], + function () { + return $this->processor->processSelect( + $this, $this->runSelect() + ); + } + ); + + if (empty($queryResult)) { + return collect(); + } // If the columns are qualified with a table or have an alias, we cannot use // those directly in the "pluck" operations since the results from the DB // are only keyed by the column itself. We'll strip the table out here. - return $results->pluck( - $this->stripTableForPluck($column), - $this->stripTableForPluck($key) - ); + $column = $this->stripTableForPluck($column); + + $key = $this->stripTableForPluck($key); + + return is_array($queryResult[0]) + ? $this->pluckFromArrayColumn($queryResult, $column, $key) + : $this->pluckFromObjectColumn($queryResult, $column, $key); } /** @@ -1923,6 +2184,56 @@ class Builder return is_null($column) ? $column : last(preg_split('~\.| ~', $column)); } + /** + * Retrieve column values from rows represented as objects. + * + * @param array $queryResult + * @param string $column + * @param string $key + * @return \Illuminate\Support\Collection + */ + protected function pluckFromObjectColumn($queryResult, $column, $key) + { + $results = []; + + if (is_null($key)) { + foreach ($queryResult as $row) { + $results[] = $row->$column; + } + } else { + foreach ($queryResult as $row) { + $results[$row->$key] = $row->$column; + } + } + + return collect($results); + } + + /** + * Retrieve column values from rows represented as arrays. + * + * @param array $queryResult + * @param string $column + * @param string $key + * @return \Illuminate\Support\Collection + */ + protected function pluckFromArrayColumn($queryResult, $column, $key) + { + $results = []; + + if (is_null($key)) { + foreach ($queryResult as $row) { + $results[] = $row[$column]; + } + } else { + foreach ($queryResult as $row) { + $results[$row[$key]] = $row[$column]; + } + } + + return collect($results); + } + /** * Concatenate values of a given column as a string. * @@ -2104,6 +2415,30 @@ class Builder return $this; } + /** + * Execute the given callback while selecting the given columns. + * + * After running the callback, the columns are reset to the original value. + * + * @param array $columns + * @param callable $callback + * @return mixed + */ + protected function onceWithColumns($columns, $callback) + { + $original = $this->columns; + + if (is_null($original)) { + $this->columns = $columns; + } + + $result = $callback(); + + $this->columns = $original; + + return $result; + } + /** * Insert a new record into the database. * @@ -2194,7 +2529,7 @@ class Builder * Increment a column's value by a given amount. * * @param string $column - * @param int $amount + * @param float|int $amount * @param array $extra * @return int */ @@ -2215,7 +2550,7 @@ class Builder * Decrement a column's value by a given amount. * * @param string $column - * @param int $amount + * @param float|int $amount * @param array $extra * @return int */ @@ -2478,8 +2813,8 @@ class Builder return $this->dynamicWhere($method, $parameters); } - $className = static::class; - - throw new BadMethodCallException("Call to undefined method {$className}::{$method}()"); + throw new BadMethodCallException(sprintf( + 'Method %s::%s does not exist.', static::class, $method + )); } } diff --git a/vendor/laravel/framework/src/Illuminate/Database/Query/Grammars/Grammar.php b/vendor/laravel/framework/src/Illuminate/Database/Query/Grammars/Grammar.php index 63770ce87..b9e002b2b 100644 --- a/vendor/laravel/framework/src/Illuminate/Database/Query/Grammars/Grammar.php +++ b/vendor/laravel/framework/src/Illuminate/Database/Query/Grammars/Grammar.php @@ -2,7 +2,9 @@ namespace Illuminate\Database\Query\Grammars; +use RuntimeException; use Illuminate\Support\Arr; +use Illuminate\Support\Str; use Illuminate\Database\Query\Builder; use Illuminate\Database\Query\JoinClause; use Illuminate\Database\Grammar as BaseGrammar; @@ -152,10 +154,12 @@ class Grammar extends BaseGrammar */ protected function compileJoins(Builder $query, $joins) { - return collect($joins)->map(function ($join) { + return collect($joins)->map(function ($join) use ($query) { $table = $this->wrapTable($join->table); - return trim("{$join->type} join {$table} {$this->compileWheres($join)}"); + $nestedJoins = is_null($join->joins) ? '' : ' '.$this->compileJoins($query, $join->joins); + + return trim("{$join->type} join {$table}{$nestedJoins} {$this->compileWheres($join)}"); })->implode(' '); } @@ -328,7 +332,11 @@ class Grammar extends BaseGrammar { $between = $where['not'] ? 'not between' : 'between'; - return $this->wrap($where['column']).' '.$between.' ? and ?'; + $min = $this->parameter(reset($where['values'])); + + $max = $this->parameter(end($where['values'])); + + return $this->wrap($where['column']).' '.$between.' '.$min.' and '.$max; } /** @@ -473,6 +481,60 @@ class Grammar extends BaseGrammar return 'not exists ('.$this->compileSelect($where['query']).')'; } + /** + * Compile a where row values condition. + * + * @param \Illuminate\Database\Query\Builder $query + * @param array $where + * @return string + */ + protected function whereRowValues(Builder $query, $where) + { + $values = $this->parameterize($where['values']); + + return '('.implode(', ', $where['columns']).') '.$where['operator'].' ('.$values.')'; + } + + /** + * Compile a "where JSON contains" clause. + * + * @param \Illuminate\Database\Query\Builder $query + * @param array $where + * @return string + */ + protected function whereJsonContains(Builder $query, $where) + { + $not = $where['not'] ? 'not ' : ''; + + return $not.$this->compileJsonContains( + $where['column'], $this->parameter($where['value']) + ); + } + + /** + * Compile a "JSON contains" statement into SQL. + * + * @param string $column + * @param string $value + * @return string + * @throws \RuntimeException + */ + protected function compileJsonContains($column, $value) + { + throw new RuntimeException('This database engine does not support JSON contains operations.'); + } + + /** + * Prepare the binding for a "JSON contains" statement. + * + * @param mixed $binding + * @return string + */ + public function prepareBindingForJsonContains($binding) + { + return json_encode($binding); + } + /** * Compile the "group by" portions of the query. * @@ -636,9 +698,9 @@ class Grammar extends BaseGrammar */ protected function compileUnion(array $union) { - $conjuction = $union['all'] ? ' union all ' : ' union '; + $conjunction = $union['all'] ? ' union all ' : ' union '; - return $conjuction.$union['query']->toSql(); + return $conjunction.$union['query']->toSql(); } /** @@ -827,6 +889,58 @@ class Grammar extends BaseGrammar return 'ROLLBACK TO SAVEPOINT '.$name; } + /** + * Wrap a value in keyword identifiers. + * + * @param \Illuminate\Database\Query\Expression|string $value + * @param bool $prefixAlias + * @return string + */ + public function wrap($value, $prefixAlias = false) + { + if ($this->isExpression($value)) { + return $this->getValue($value); + } + + // If the value being wrapped has a column alias we will need to separate out + // the pieces so we can wrap each of the segments of the expression on its + // own, and then join these both back together using the "as" connector. + if (stripos($value, ' as ') !== false) { + return $this->wrapAliasedValue($value, $prefixAlias); + } + + // If the given value is a JSON selector we will wrap it differently than a + // traditional value. We will need to split this path and wrap each part + // wrapped, etc. Otherwise, we will simply wrap the value as a string. + if ($this->isJsonSelector($value)) { + return $this->wrapJsonSelector($value); + } + + return $this->wrapSegments(explode('.', $value)); + } + + /** + * Wrap the given JSON selector. + * + * @param string $value + * @return string + */ + protected function wrapJsonSelector($value) + { + throw new RuntimeException('This database engine does not support JSON operations.'); + } + + /** + * Determine if the given string is a JSON selector. + * + * @param string $value + * @return bool + */ + protected function isJsonSelector($value) + { + return Str::contains($value, '->'); + } + /** * Concatenate an array of segments, removing empties. * diff --git a/vendor/laravel/framework/src/Illuminate/Database/Query/Grammars/MySqlGrammar.php b/vendor/laravel/framework/src/Illuminate/Database/Query/Grammars/MySqlGrammar.php index 8dff604ae..38ac9cb3b 100644 --- a/vendor/laravel/framework/src/Illuminate/Database/Query/Grammars/MySqlGrammar.php +++ b/vendor/laravel/framework/src/Illuminate/Database/Query/Grammars/MySqlGrammar.php @@ -3,12 +3,18 @@ namespace Illuminate\Database\Query\Grammars; use Illuminate\Support\Arr; -use Illuminate\Support\Str; use Illuminate\Database\Query\Builder; use Illuminate\Database\Query\JsonExpression; class MySqlGrammar extends Grammar { + /** + * The grammar specific operators. + * + * @var array + */ + protected $operators = ['sounds like']; + /** * The components that make up a select clause. * @@ -45,6 +51,18 @@ class MySqlGrammar extends Grammar return $sql; } + /** + * Compile a "JSON contains" statement into SQL. + * + * @param string $column + * @param string $value + * @return string + */ + protected function compileJsonContains($column, $value) + { + return 'json_contains('.$this->wrap($column).', '.$value.')'; + } + /** * Compile a single union statement. * @@ -53,9 +71,9 @@ class MySqlGrammar extends Grammar */ protected function compileUnion(array $union) { - $conjuction = $union['all'] ? ' union all ' : ' union '; + $conjunction = $union['all'] ? ' union all ' : ' union '; - return $conjuction.'('.$union['query']->toSql().')'; + return $conjunction.'('.$union['query']->toSql().')'; } /** @@ -258,7 +276,7 @@ class MySqlGrammar extends Grammar { $joins = ' '.$this->compileJoins($query, $query->joins); - $alias = strpos(strtolower($table), ' as ') !== false + $alias = stripos($table, ' as ') !== false ? explode(' as ', $table)[1] : $table; return trim("delete {$alias} from {$table}{$joins} {$where}"); @@ -272,18 +290,7 @@ class MySqlGrammar extends Grammar */ protected function wrapValue($value) { - if ($value === '*') { - return $value; - } - - // If the given value is a JSON selector we will wrap it differently than a - // traditional value. We will need to split this path and wrap each part - // wrapped, etc. Otherwise, we will simply wrap the value as a string. - if ($this->isJsonSelector($value)) { - return $this->wrapJsonSelector($value); - } - - return '`'.str_replace('`', '``', $value).'`'; + return $value === '*' ? $value : '`'.str_replace('`', '``', $value).'`'; } /** @@ -294,23 +301,16 @@ class MySqlGrammar extends Grammar */ protected function wrapJsonSelector($value) { - $path = explode('->', $value); + $delimiter = str_contains($value, '->>') + ? '->>' + : '->'; - $field = $this->wrapValue(array_shift($path)); + $path = explode($delimiter, $value); - return sprintf('%s->\'$.%s\'', $field, collect($path)->map(function ($part) { + $field = $this->wrapSegments(explode('.', array_shift($path))); + + return sprintf('%s'.$delimiter.'\'$.%s\'', $field, collect($path)->map(function ($part) { return '"'.$part.'"'; })->implode('.')); } - - /** - * Determine if the given string is a JSON selector. - * - * @param string $value - * @return bool - */ - protected function isJsonSelector($value) - { - return Str::contains($value, '->'); - } } diff --git a/vendor/laravel/framework/src/Illuminate/Database/Query/Grammars/PostgresGrammar.php b/vendor/laravel/framework/src/Illuminate/Database/Query/Grammars/PostgresGrammar.php index 564bbfb92..b41299a5d 100644 --- a/vendor/laravel/framework/src/Illuminate/Database/Query/Grammars/PostgresGrammar.php +++ b/vendor/laravel/framework/src/Illuminate/Database/Query/Grammars/PostgresGrammar.php @@ -3,7 +3,6 @@ namespace Illuminate\Database\Query\Grammars; use Illuminate\Support\Arr; -use Illuminate\Support\Str; use Illuminate\Database\Query\Builder; class PostgresGrammar extends Grammar @@ -15,9 +14,10 @@ class PostgresGrammar extends Grammar */ protected $operators = [ '=', '<', '>', '<=', '>=', '<>', '!=', - 'like', 'not like', 'between', 'ilike', + 'like', 'not like', 'between', 'ilike', 'not ilike', '~', '&', '|', '#', '<<', '>>', '<<=', '>>=', - '&&', '@>', '<@', '?', '?|', '?&', '||', '-', '+', '#-', + '&&', '@>', '<@', '?', '?|', '?&', '||', '-', '-', '#-', + 'is distinct from', 'is not distinct from', ]; /** @@ -63,6 +63,20 @@ class PostgresGrammar extends Grammar return 'extract('.$type.' from '.$this->wrap($where['column']).') '.$where['operator'].' '.$value; } + /** + * Compile a "JSON contains" statement into SQL. + * + * @param string $column + * @param string $value + * @return string + */ + protected function compileJsonContains($column, $value) + { + $column = str_replace('->>', '->', $this->wrap($column)); + + return '('.$column.')::jsonb @> '.$value; + } + /** * Compile the lock into SQL. * @@ -260,7 +274,6 @@ class PostgresGrammar extends Grammar * * @param \Illuminate\Database\Query\Builder $query * @param string $table - * @param array $where * @return string */ protected function compileDeleteWithJoins($query, $table) @@ -285,28 +298,6 @@ class PostgresGrammar extends Grammar return ['truncate '.$this->wrapTable($query->from).' restart identity' => []]; } - /** - * Wrap a single string in keyword identifiers. - * - * @param string $value - * @return string - */ - protected function wrapValue($value) - { - if ($value === '*') { - return $value; - } - - // If the given value is a JSON selector we will wrap it differently than a - // traditional value. We will need to split this path and wrap each part - // wrapped, etc. Otherwise, we will simply wrap the value as a string. - if (Str::contains($value, '->')) { - return $this->wrapJsonSelector($value); - } - - return '"'.str_replace('"', '""', $value).'"'; - } - /** * Wrap the given JSON selector. * @@ -317,7 +308,7 @@ class PostgresGrammar extends Grammar { $path = explode('->', $value); - $field = $this->wrapValue(array_shift($path)); + $field = $this->wrapSegments(explode('.', array_shift($path))); $wrappedPath = $this->wrapJsonPathAttributes($path); diff --git a/vendor/laravel/framework/src/Illuminate/Database/Query/Grammars/SQLiteGrammar.php b/vendor/laravel/framework/src/Illuminate/Database/Query/Grammars/SQLiteGrammar.php index cd57081d0..60973ae65 100644 --- a/vendor/laravel/framework/src/Illuminate/Database/Query/Grammars/SQLiteGrammar.php +++ b/vendor/laravel/framework/src/Illuminate/Database/Query/Grammars/SQLiteGrammar.php @@ -2,6 +2,8 @@ namespace Illuminate\Database\Query\Grammars; +use Illuminate\Support\Arr; +use Illuminate\Support\Str; use Illuminate\Database\Query\Builder; class SQLiteGrammar extends Grammar @@ -61,9 +63,9 @@ class SQLiteGrammar extends Grammar */ protected function compileUnion(array $union) { - $conjuction = $union['all'] ? ' union all ' : ' union '; + $conjunction = $union['all'] ? ' union all ' : ' union '; - return $conjuction.'select * from ('.$union['query']->toSql().')'; + return $conjunction.'select * from ('.$union['query']->toSql().')'; } /** @@ -136,11 +138,9 @@ class SQLiteGrammar extends Grammar */ protected function dateBasedWhere($type, Builder $query, $where) { - $value = str_pad($where['value'], 2, '0', STR_PAD_LEFT); + $value = $this->parameter($where['value']); - $value = $this->parameter($value); - - return "strftime('{$type}', {$this->wrap($where['column'])}) {$where['operator']} {$value}"; + return "strftime('{$type}', {$this->wrap($where['column'])}) {$where['operator']} cast({$value} as text)"; } /** @@ -164,7 +164,7 @@ class SQLiteGrammar extends Grammar // If there is only one record being inserted, we will just use the usual query // grammar insert builder because no special syntax is needed for the single // row inserts in SQLite. However, if there are multiples, we'll continue. - if (count($values) == 1) { + if (count($values) === 1) { return empty(reset($values)) ? "insert into $table default values" : parent::compileInsert($query, reset($values)); @@ -186,6 +186,80 @@ class SQLiteGrammar extends Grammar return "insert into $table ($names) select ".implode(' union all select ', $columns); } + /** + * Compile an update statement into SQL. + * + * @param \Illuminate\Database\Query\Builder $query + * @param array $values + * @return string + */ + public function compileUpdate(Builder $query, $values) + { + $table = $this->wrapTable($query->from); + + $columns = collect($values)->map(function ($value, $key) use ($query) { + return $this->wrap(Str::after($key, $query->from.'.')).' = '.$this->parameter($value); + })->implode(', '); + + if (isset($query->joins) || isset($query->limit)) { + $selectSql = parent::compileSelect($query->select("{$query->from}.rowid")); + + return "update {$table} set $columns where {$this->wrap('rowid')} in ({$selectSql})"; + } + + return trim("update {$table} set {$columns} {$this->compileWheres($query)}"); + } + + /** + * Prepare the bindings for an update statement. + * + * @param array $bindings + * @param array $values + * @return array + */ + public function prepareBindingsForUpdate(array $bindings, array $values) + { + $cleanBindings = Arr::except($bindings, ['select', 'join']); + + return array_values( + array_merge($values, $bindings['join'], Arr::flatten($cleanBindings)) + ); + } + + /** + * Compile a delete statement into SQL. + * + * @param \Illuminate\Database\Query\Builder $query + * @return string + */ + public function compileDelete(Builder $query) + { + if (isset($query->joins) || isset($query->limit)) { + $selectSql = parent::compileSelect($query->select("{$query->from}.rowid")); + + return "delete from {$this->wrapTable($query->from)} where {$this->wrap('rowid')} in ({$selectSql})"; + } + + $wheres = is_array($query->wheres) ? $this->compileWheres($query) : ''; + + return trim("delete from {$this->wrapTable($query->from)} $wheres"); + } + + /** + * Prepare the bindings for a delete statement. + * + * @param array $bindings + * @return array + */ + public function prepareBindingsForDelete(array $bindings) + { + $cleanBindings = Arr::except($bindings, ['select', 'join']); + + return array_values( + array_merge($bindings['join'], Arr::flatten($cleanBindings)) + ); + } + /** * Compile a truncate table statement into SQL. * diff --git a/vendor/laravel/framework/src/Illuminate/Database/Query/Grammars/SqlServerGrammar.php b/vendor/laravel/framework/src/Illuminate/Database/Query/Grammars/SqlServerGrammar.php index dfefda3a2..c47fb99ee 100644 --- a/vendor/laravel/framework/src/Illuminate/Database/Query/Grammars/SqlServerGrammar.php +++ b/vendor/laravel/framework/src/Illuminate/Database/Query/Grammars/SqlServerGrammar.php @@ -103,6 +103,35 @@ class SqlServerGrammar extends Grammar return 'cast('.$this->wrap($where['column']).' as date) '.$where['operator'].' '.$value; } + /** + * Compile a "JSON contains" statement into SQL. + * + * @param string $column + * @param string $value + * @return string + */ + protected function compileJsonContains($column, $value) + { + $parts = explode('->', $column, 2); + + $field = $this->wrap($parts[0]); + + $path = count($parts) > 1 ? ', '.$this->wrapJsonPath($parts[1]) : ''; + + return $value.' in (select [value] from openjson('.$field.$path.'))'; + } + + /** + * Prepare the binding for a "JSON contains" statement. + * + * @param mixed $binding + * @return string + */ + public function prepareBindingForJsonContains($binding) + { + return is_bool($binding) ? json_encode($binding) : $binding; + } + /** * Create a full ANSI offset clause for the query. * @@ -269,7 +298,7 @@ class SqlServerGrammar extends Grammar { $joins = ' '.$this->compileJoins($query, $query->joins); - $alias = strpos(strtolower($table), ' as ') !== false + $alias = stripos($table, ' as ') !== false ? explode(' as ', $table)[1] : $table; return trim("delete {$alias} from {$table}{$joins} {$where}"); @@ -335,7 +364,7 @@ class SqlServerGrammar extends Grammar { $table = $alias = $this->wrapTable($table); - if (strpos(strtolower($table), '] as [') !== false) { + if (stripos($table, '] as [') !== false) { $alias = '['.explode('] as [', $table)[1]; } @@ -414,6 +443,32 @@ class SqlServerGrammar extends Grammar return $value === '*' ? $value : '['.str_replace(']', ']]', $value).']'; } + /** + * Wrap the given JSON selector. + * + * @param string $value + * @return string + */ + protected function wrapJsonSelector($value) + { + $parts = explode('->', $value, 2); + + $field = $this->wrapSegments(explode('.', array_shift($parts))); + + return 'json_value('.$field.', '.$this->wrapJsonPath($parts[0]).')'; + } + + /** + * Wrap the given JSON path. + * + * @param string $value + * @return string + */ + protected function wrapJsonPath($value) + { + return '\'$."'.str_replace('->', '"."', $value).'"\''; + } + /** * Wrap a table in keyword identifiers. * diff --git a/vendor/laravel/framework/src/Illuminate/Database/Query/JsonExpression.php b/vendor/laravel/framework/src/Illuminate/Database/Query/JsonExpression.php index 12635ffca..5171cf61c 100644 --- a/vendor/laravel/framework/src/Illuminate/Database/Query/JsonExpression.php +++ b/vendor/laravel/framework/src/Illuminate/Database/Query/JsonExpression.php @@ -40,6 +40,6 @@ class JsonExpression extends Expression return '?'; } - throw new InvalidArgumentException('JSON value is of illegal type: '.$type); + throw new InvalidArgumentException("JSON value is of illegal type: {$type}"); } } diff --git a/vendor/laravel/framework/src/Illuminate/Database/Schema/Blueprint.php b/vendor/laravel/framework/src/Illuminate/Database/Schema/Blueprint.php index 2342cec2a..05fba8f16 100644 --- a/vendor/laravel/framework/src/Illuminate/Database/Schema/Blueprint.php +++ b/vendor/laravel/framework/src/Illuminate/Database/Schema/Blueprint.php @@ -3,9 +3,11 @@ namespace Illuminate\Database\Schema; use Closure; +use BadMethodCallException; use Illuminate\Support\Fluent; use Illuminate\Database\Connection; use Illuminate\Support\Traits\Macroable; +use Illuminate\Database\SQLiteConnection; use Illuminate\Database\Schema\Grammars\Grammar; class Blueprint @@ -96,13 +98,15 @@ class Blueprint */ public function toSql(Connection $connection, Grammar $grammar) { - $this->addImpliedCommands(); + $this->addImpliedCommands($grammar); $statements = []; // Each type of command has a corresponding compiler function on the schema // grammar which is used to build the necessary SQL statements to build // the blueprint element, so we'll just call that compilers function. + $this->ensureCommandsAreValid($connection); + foreach ($this->commands as $command) { $method = 'compile'.ucfirst($command->name); @@ -117,11 +121,41 @@ class Blueprint } /** - * Add the commands that are implied by the blueprint's state. + * Ensure the commands on the blueprint are valid for the connection type. * + * @param \Illuminate\Database\Connection $connection * @return void */ - protected function addImpliedCommands() + protected function ensureCommandsAreValid(Connection $connection) + { + if ($connection instanceof SQLiteConnection && + $this->commandsNamed(['dropColumn', 'renameColumn'])->count() > 1) { + throw new BadMethodCallException( + "SQLite doesn't support multiple calls to dropColumn / renameColumn in a single modification." + ); + } + } + + /** + * Get all of the commands matching the given names. + * + * @param array $names + * @return \Illuminate\Support\Collection + */ + protected function commandsNamed(array $names) + { + return collect($this->commands)->filter(function ($command) use ($names) { + return in_array($command->name, $names); + }); + } + + /** + * Add the commands that are implied by the blueprint's state. + * + * @param \Illuminate\Database\Schema\Grammars\Grammar $grammar + * @return void + */ + protected function addImpliedCommands(Grammar $grammar) { if (count($this->getAddedColumns()) > 0 && ! $this->creating()) { array_unshift($this->commands, $this->createCommand('add')); @@ -132,6 +166,8 @@ class Blueprint } $this->addFluentIndexes(); + + $this->addFluentCommands($grammar); } /** @@ -164,6 +200,31 @@ class Blueprint } } + /** + * Add the fluent commands specified on any columns. + * + * @param \Illuminate\Database\Schema\Grammars\Grammar $grammar + * @return void + */ + public function addFluentCommands(Grammar $grammar) + { + foreach ($this->columns as $column) { + foreach ($grammar->getFluentCommands() as $commandName) { + $attributeName = lcfirst($commandName); + + if (! isset($column->{$attributeName})) { + continue; + } + + $value = $column->{$attributeName}; + + $this->addCommand( + $commandName, compact('value', 'column') + ); + } + } + } + /** * Determine if the blueprint has a create command. * @@ -296,6 +357,18 @@ class Blueprint return $this->dropIndexCommand('dropForeign', 'foreign', $index); } + /** + * Indicate that the given indexes should be renamed. + * + * @param string $from + * @param string $to + * @return \Illuminate\Support\Fluent + */ + public function renameIndex($from, $to) + { + return $this->addCommand('renameIndex', compact('from', 'to')); + } + /** * Indicate that the timestamp columns should be dropped. * @@ -346,6 +419,20 @@ class Blueprint $this->dropColumn('remember_token'); } + /** + * Indicate that the polymorphic columns should be dropped. + * + * @param string $name + * @param string|null $indexName + * @return void + */ + public function dropMorphs($name, $indexName = null) + { + $this->dropIndex($indexName ?: $this->createIndexName('index', ["{$name}_type", "{$name}_id"])); + + $this->dropColumn("{$name}_type", "{$name}_id"); + } + /** * Rename the table to a given name. * @@ -975,11 +1062,12 @@ class Blueprint * Create a new point column on the table. * * @param string $column + * @param null|int $srid * @return \Illuminate\Support\Fluent */ - public function point($column) + public function point($column, $srid = null) { - return $this->addColumn('point', $column); + return $this->addColumn('point', $column, compact('srid')); } /** @@ -1057,11 +1145,11 @@ class Blueprint */ public function morphs($name, $indexName = null) { - $this->unsignedInteger("{$name}_id"); - $this->string("{$name}_type"); - $this->index(["{$name}_id", "{$name}_type"], $indexName); + $this->unsignedBigInteger("{$name}_id"); + + $this->index(["{$name}_type", "{$name}_id"], $indexName); } /** @@ -1073,11 +1161,11 @@ class Blueprint */ public function nullableMorphs($name, $indexName = null) { - $this->unsignedInteger("{$name}_id")->nullable(); - $this->string("{$name}_type")->nullable(); - $this->index(["{$name}_id", "{$name}_type"], $indexName); + $this->unsignedBigInteger("{$name}_id")->nullable(); + + $this->index(["{$name}_type", "{$name}_id"], $indexName); } /** diff --git a/vendor/laravel/framework/src/Illuminate/Database/Schema/Builder.php b/vendor/laravel/framework/src/Illuminate/Database/Schema/Builder.php index 822011538..db9dc9651 100644 --- a/vendor/laravel/framework/src/Illuminate/Database/Schema/Builder.php +++ b/vendor/laravel/framework/src/Illuminate/Database/Schema/Builder.php @@ -203,6 +203,18 @@ class Builder throw new LogicException('This database driver does not support dropping all tables.'); } + /** + * Drop all views from the database. + * + * @return void + * + * @throws \LogicException + */ + public function dropAllViews() + { + throw new LogicException('This database driver does not support dropping all views.'); + } + /** * Rename a table on the schema. * diff --git a/vendor/laravel/framework/src/Illuminate/Database/Schema/Grammars/Grammar.php b/vendor/laravel/framework/src/Illuminate/Database/Schema/Grammars/Grammar.php index ddd383857..1ea4dabc8 100644 --- a/vendor/laravel/framework/src/Illuminate/Database/Schema/Grammars/Grammar.php +++ b/vendor/laravel/framework/src/Illuminate/Database/Schema/Grammars/Grammar.php @@ -19,6 +19,13 @@ abstract class Grammar extends BaseGrammar */ protected $transactions = false; + /** + * The commands to be executed outside of create or alter command. + * + * @var array + */ + protected $fluentCommands = []; + /** * Compile a rename column command. * @@ -243,6 +250,16 @@ abstract class Grammar extends BaseGrammar }); } + /** + * Get the fluent commands for the grammar. + * + * @return array + */ + public function getFluentCommands() + { + return $this->fluentCommands; + } + /** * Check if this Grammar supports schema changes wrapped in a transaction. * diff --git a/vendor/laravel/framework/src/Illuminate/Database/Schema/Grammars/MySqlGrammar.php b/vendor/laravel/framework/src/Illuminate/Database/Schema/Grammars/MySqlGrammar.php index 149f300a2..2e5ec247d 100644 --- a/vendor/laravel/framework/src/Illuminate/Database/Schema/Grammars/MySqlGrammar.php +++ b/vendor/laravel/framework/src/Illuminate/Database/Schema/Grammars/MySqlGrammar.php @@ -15,7 +15,7 @@ class MySqlGrammar extends Grammar */ protected $modifiers = [ 'Unsigned', 'VirtualAs', 'StoredAs', 'Charset', 'Collate', 'Nullable', - 'Default', 'Increment', 'Comment', 'After', 'First', + 'Default', 'Increment', 'Comment', 'After', 'First', 'Srid', ]; /** @@ -114,9 +114,9 @@ class MySqlGrammar extends Grammar // added to either this create table blueprint or the configuration for this // connection that the query is targeting. We'll add it to this SQL query. if (isset($blueprint->collation)) { - $sql .= ' collate '.$blueprint->collation; + $sql .= " collate '{$blueprint->collation}'"; } elseif (! is_null($collation = $connection->getConfig('collation'))) { - $sql .= ' collate '.$collation; + $sql .= " collate '{$collation}'"; } return $sql; @@ -342,6 +342,22 @@ class MySqlGrammar extends Grammar return "rename table {$from} to ".$this->wrapTable($command->to); } + /** + * Compile a rename index command. + * + * @param \Illuminate\Database\Schema\Blueprint $blueprint + * @param \Illuminate\Support\Fluent $command + * @return string + */ + public function compileRenameIndex(Blueprint $blueprint, Fluent $command) + { + return sprintf('alter table %s rename index %s to %s', + $this->wrapTable($blueprint), + $this->wrap($command->from), + $this->wrap($command->to) + ); + } + /** * Compile the SQL needed to drop all tables. * @@ -353,6 +369,17 @@ class MySqlGrammar extends Grammar return 'drop table '.implode(',', $this->wrapArray($tables)); } + /** + * Compile the SQL needed to drop all views. + * + * @param array $views + * @return string + */ + public function compileDropAllViews($views) + { + return 'drop view '.implode(',', $this->wrapArray($views)); + } + /** * Compile the SQL needed to retrieve all table names. * @@ -363,6 +390,16 @@ class MySqlGrammar extends Grammar return 'SHOW FULL TABLES WHERE table_type = \'BASE TABLE\''; } + /** + * Compile the SQL needed to retrieve all view names. + * + * @return string + */ + public function compileGetAllViews() + { + return 'SHOW FULL TABLES WHERE table_type = \'VIEW\''; + } + /** * Compile the command to enable foreign key constraints. * @@ -542,14 +579,14 @@ class MySqlGrammar extends Grammar } /** - * Create the column definition for an enum type. + * Create the column definition for an enumeration type. * * @param \Illuminate\Support\Fluent $column * @return string */ protected function typeEnum(Fluent $column) { - return "enum('".implode("', '", $column->allowed)."')"; + return sprintf('enum(%s)', $this->quoteString($column->allowed)); } /** @@ -862,7 +899,7 @@ class MySqlGrammar extends Grammar protected function modifyCollate(Blueprint $blueprint, Fluent $column) { if (! is_null($column->collation)) { - return ' collate '.$column->collation; + return " collate '{$column->collation}'"; } } @@ -950,6 +987,20 @@ class MySqlGrammar extends Grammar } } + /** + * Get the SQL for a SRID column modifier. + * + * @param \Illuminate\Database\Schema\Blueprint $blueprint + * @param \Illuminate\Support\Fluent $column + * @return string|null + */ + protected function modifySrid(Blueprint $blueprint, Fluent $column) + { + if (! is_null($column->srid) && is_int($column->srid) && $column->srid > 0) { + return ' srid '.$column->srid; + } + } + /** * Wrap a single string in keyword identifiers. * diff --git a/vendor/laravel/framework/src/Illuminate/Database/Schema/Grammars/PostgresGrammar.php b/vendor/laravel/framework/src/Illuminate/Database/Schema/Grammars/PostgresGrammar.php index 5eed79cdc..c69ee0f8f 100644 --- a/vendor/laravel/framework/src/Illuminate/Database/Schema/Grammars/PostgresGrammar.php +++ b/vendor/laravel/framework/src/Illuminate/Database/Schema/Grammars/PostgresGrammar.php @@ -29,6 +29,13 @@ class PostgresGrammar extends Grammar */ protected $serials = ['bigInteger', 'integer', 'mediumInteger', 'smallInteger', 'tinyInteger']; + /** + * The commands to be executed outside of create or alter command. + * + * @var array + */ + protected $fluentCommands = ['Comment']; + /** * Compile the query to determine if a table exists. * @@ -198,6 +205,17 @@ class PostgresGrammar extends Grammar return 'drop table "'.implode('","', $tables).'" cascade'; } + /** + * Compile the SQL needed to drop all views. + * + * @param string $views + * @return string + */ + public function compileDropAllViews($views) + { + return 'drop view "'.implode('","', $views).'" cascade'; + } + /** * Compile the SQL needed to retrieve all table names. * @@ -209,6 +227,17 @@ class PostgresGrammar extends Grammar return "select tablename from pg_catalog.pg_tables where schemaname = '{$schema}'"; } + /** + * Compile the SQL needed to retrieve all view names. + * + * @param string $schema + * @return string + */ + public function compileGetAllViews($schema) + { + return "select viewname from pg_catalog.pg_views where schemaname = '{$schema}'"; + } + /** * Compile a drop column command. * @@ -303,6 +332,21 @@ class PostgresGrammar extends Grammar return "alter table {$from} rename to ".$this->wrapTable($command->to); } + /** + * Compile a rename index command. + * + * @param \Illuminate\Database\Schema\Blueprint $blueprint + * @param \Illuminate\Support\Fluent $command + * @return string + */ + public function compileRenameIndex(Blueprint $blueprint, Fluent $command) + { + return sprintf('alter index %s rename to %s', + $this->wrap($command->from), + $this->wrap($command->to) + ); + } + /** * Compile the command to enable foreign key constraints. * @@ -323,6 +367,22 @@ class PostgresGrammar extends Grammar return 'SET CONSTRAINTS ALL DEFERRED;'; } + /** + * Compile a comment command. + * + * @param \Illuminate\Database\Schema\Blueprint $blueprint + * @param \Illuminate\Support\Fluent $command + * @return string + */ + public function compileComment(Blueprint $blueprint, Fluent $command) + { + return sprintf('comment on column %s.%s is %s', + $this->wrapTable($blueprint), + $this->wrap($command->column->name), + "'".str_replace("'", "''", $command->value)."'" + ); + } + /** * Create the column definition for a char type. * @@ -489,18 +549,18 @@ class PostgresGrammar extends Grammar } /** - * Create the column definition for an enum type. + * Create the column definition for an enumeration type. * * @param \Illuminate\Support\Fluent $column * @return string */ protected function typeEnum(Fluent $column) { - $allowed = array_map(function ($a) { - return "'{$a}'"; - }, $column->allowed); - - return "varchar(255) check (\"{$column->name}\" in (".implode(', ', $allowed).'))'; + return sprintf( + 'varchar(255) check ("%s" in (%s))', + $column->name, + $this->quoteString($column->allowed) + ); } /** diff --git a/vendor/laravel/framework/src/Illuminate/Database/Schema/Grammars/SQLiteGrammar.php b/vendor/laravel/framework/src/Illuminate/Database/Schema/Grammars/SQLiteGrammar.php index 27e372d5d..a83869b2f 100644 --- a/vendor/laravel/framework/src/Illuminate/Database/Schema/Grammars/SQLiteGrammar.php +++ b/vendor/laravel/framework/src/Illuminate/Database/Schema/Grammars/SQLiteGrammar.php @@ -4,6 +4,7 @@ namespace Illuminate\Database\Schema\Grammars; use RuntimeException; use Illuminate\Support\Fluent; +use Doctrine\DBAL\Schema\Index; use Illuminate\Database\Connection; use Illuminate\Database\Schema\Blueprint; @@ -84,7 +85,7 @@ class SQLiteGrammar extends Grammar // If this foreign key specifies the action to be taken on update we will add // that to the statement here. We'll append it to this SQL and then return - // the SQL so we can keep adding any other foreign consraints onto this. + // the SQL so we can keep adding any other foreign constraints onto this. if (! is_null($foreign->onUpdate)) { $sql .= " on update {$foreign->onUpdate}"; } @@ -230,6 +231,16 @@ class SQLiteGrammar extends Grammar return "delete from sqlite_master where type in ('table', 'index', 'trigger')"; } + /** + * Compile the SQL needed to drop all views. + * + * @return string + */ + public function compileDropAllViews() + { + return "delete from sqlite_master where type in ('view')"; + } + /** * Compile a drop column command. * @@ -307,6 +318,39 @@ class SQLiteGrammar extends Grammar return "alter table {$from} rename to ".$this->wrapTable($command->to); } + /** + * Compile a rename index command. + * + * @param \Illuminate\Database\Schema\Blueprint $blueprint + * @param \Illuminate\Support\Fluent $command + * @param \Illuminate\Database\Connection $connection + * @return array + */ + public function compileRenameIndex(Blueprint $blueprint, Fluent $command, Connection $connection) + { + $schemaManager = $connection->getDoctrineSchemaManager(); + + $indexes = $schemaManager->listTableIndexes($this->getTablePrefix().$blueprint->getTable()); + + $index = array_get($indexes, $command->from); + + if (! $index) { + throw new RuntimeException("Index [{$command->from}] does not exist."); + } + + $newIndex = new Index( + $command->to, $index->getColumns(), $index->isUnique(), + $index->isPrimary(), $index->getFlags(), $index->getOptions() + ); + + $platform = $schemaManager->getDatabasePlatform(); + + return [ + $platform->getDropIndexSQL($command->from, $this->getTablePrefix().$blueprint->getTable()), + $platform->getCreateIndexSQL($newIndex, $this->getTablePrefix().$blueprint->getTable()), + ]; + } + /** * Compile the command to enable foreign key constraints. * @@ -502,14 +546,18 @@ class SQLiteGrammar extends Grammar } /** - * Create the column definition for an enum type. + * Create the column definition for an enumeration type. * * @param \Illuminate\Support\Fluent $column * @return string */ protected function typeEnum(Fluent $column) { - return 'varchar'; + return sprintf( + 'varchar check ("%s" in (%s))', + $column->name, + $this->quoteString($column->allowed) + ); } /** diff --git a/vendor/laravel/framework/src/Illuminate/Database/Schema/Grammars/SqlServerGrammar.php b/vendor/laravel/framework/src/Illuminate/Database/Schema/Grammars/SqlServerGrammar.php index 40a21c1d5..38f55fcf5 100644 --- a/vendor/laravel/framework/src/Illuminate/Database/Schema/Grammars/SqlServerGrammar.php +++ b/vendor/laravel/framework/src/Illuminate/Database/Schema/Grammars/SqlServerGrammar.php @@ -277,6 +277,21 @@ class SqlServerGrammar extends Grammar return "sp_rename {$from}, ".$this->wrapTable($command->to); } + /** + * Compile a rename index command. + * + * @param \Illuminate\Database\Schema\Blueprint $blueprint + * @param \Illuminate\Support\Fluent $command + * @return string + */ + public function compileRenameIndex(Blueprint $blueprint, Fluent $command) + { + return sprintf("sp_rename N'%s', %s, N'INDEX'", + $this->wrap($blueprint->getTable().'.'.$command->from), + $this->wrap($command->to) + ); + } + /** * Compile the command to enable foreign key constraints. * @@ -452,14 +467,18 @@ class SqlServerGrammar extends Grammar } /** - * Create the column definition for an enum type. + * Create the column definition for an enumeration type. * * @param \Illuminate\Support\Fluent $column * @return string */ protected function typeEnum(Fluent $column) { - return 'nvarchar(255)'; + return sprintf( + 'nvarchar(255) check ("%s" in (%s))', + $column->name, + $this->quoteString($column->allowed) + ); } /** diff --git a/vendor/laravel/framework/src/Illuminate/Database/Schema/MySqlBuilder.php b/vendor/laravel/framework/src/Illuminate/Database/Schema/MySqlBuilder.php index 7e4c6d2bc..85f3e92c2 100644 --- a/vendor/laravel/framework/src/Illuminate/Database/Schema/MySqlBuilder.php +++ b/vendor/laravel/framework/src/Illuminate/Database/Schema/MySqlBuilder.php @@ -64,6 +64,30 @@ class MySqlBuilder extends Builder $this->enableForeignKeyConstraints(); } + /** + * Drop all views from the database. + * + * @return void + */ + public function dropAllViews() + { + $views = []; + + foreach ($this->getAllViews() as $row) { + $row = (array) $row; + + $views[] = reset($row); + } + + if (empty($views)) { + return; + } + + $this->connection->statement( + $this->grammar->compileDropAllViews($views) + ); + } + /** * Get all of the table names for the database. * @@ -75,4 +99,16 @@ class MySqlBuilder extends Builder $this->grammar->compileGetAllTables() ); } + + /** + * Get all of the view names for the database. + * + * @return array + */ + protected function getAllViews() + { + return $this->connection->select( + $this->grammar->compileGetAllViews() + ); + } } diff --git a/vendor/laravel/framework/src/Illuminate/Database/Schema/PostgresBuilder.php b/vendor/laravel/framework/src/Illuminate/Database/Schema/PostgresBuilder.php index 8fa0a2c19..aa2255ed6 100644 --- a/vendor/laravel/framework/src/Illuminate/Database/Schema/PostgresBuilder.php +++ b/vendor/laravel/framework/src/Illuminate/Database/Schema/PostgresBuilder.php @@ -51,6 +51,30 @@ class PostgresBuilder extends Builder ); } + /** + * Drop all views from the database. + * + * @return void + */ + public function dropAllViews() + { + $views = []; + + foreach ($this->getAllViews() as $row) { + $row = (array) $row; + + $views[] = reset($row); + } + + if (empty($views)) { + return; + } + + $this->connection->statement( + $this->grammar->compileDropAllViews($views) + ); + } + /** * Get all of the table names for the database. * @@ -63,6 +87,18 @@ class PostgresBuilder extends Builder ); } + /** + * Get all of the view names for the database. + * + * @return array + */ + protected function getAllViews() + { + return $this->connection->select( + $this->grammar->compileGetAllViews($this->connection->getConfig('schema')) + ); + } + /** * Get the column listing for a given table. * diff --git a/vendor/laravel/framework/src/Illuminate/Database/Schema/SQLiteBuilder.php b/vendor/laravel/framework/src/Illuminate/Database/Schema/SQLiteBuilder.php index 8cfacc114..0f13dd2ee 100644 --- a/vendor/laravel/framework/src/Illuminate/Database/Schema/SQLiteBuilder.php +++ b/vendor/laravel/framework/src/Illuminate/Database/Schema/SQLiteBuilder.php @@ -22,6 +22,20 @@ class SQLiteBuilder extends Builder $this->connection->select($this->grammar->compileDisableWriteableSchema()); } + /** + * Drop all views from the database. + * + * @return void + */ + public function dropAllViews() + { + $this->connection->select($this->grammar->compileEnableWriteableSchema()); + + $this->connection->select($this->grammar->compileDropAllViews()); + + $this->connection->select($this->grammar->compileDisableWriteableSchema()); + } + /** * Empty the database file. * diff --git a/vendor/laravel/framework/src/Illuminate/Database/composer.json b/vendor/laravel/framework/src/Illuminate/Database/composer.json index 153abad64..652ac174a 100644 --- a/vendor/laravel/framework/src/Illuminate/Database/composer.json +++ b/vendor/laravel/framework/src/Illuminate/Database/composer.json @@ -15,10 +15,10 @@ } ], "require": { - "php": ">=7.0", - "illuminate/container": "5.5.*", - "illuminate/contracts": "5.5.*", - "illuminate/support": "5.5.*" + "php": "^7.1.3", + "illuminate/container": "5.6.*", + "illuminate/contracts": "5.6.*", + "illuminate/support": "5.6.*" }, "autoload": { "psr-4": { @@ -27,16 +27,16 @@ }, "extra": { "branch-alias": { - "dev-master": "5.5-dev" + "dev-master": "5.6-dev" } }, "suggest": { - "doctrine/dbal": "Required to rename columns and drop SQLite columns (~2.5).", + "doctrine/dbal": "Required to rename columns and drop SQLite columns (~2.6).", "fzaninotto/faker": "Required to use the eloquent factory builder (~1.4).", - "illuminate/console": "Required to use the database commands (5.5.*).", - "illuminate/events": "Required to use the observers with Eloquent (5.5.*).", - "illuminate/filesystem": "Required to use the migrations (5.5.*).", - "illuminate/pagination": "Required to paginate the result set (5.5.*)." + "illuminate/console": "Required to use the database commands (5.6.*).", + "illuminate/events": "Required to use the observers with Eloquent (5.6.*).", + "illuminate/filesystem": "Required to use the migrations (5.6.*).", + "illuminate/pagination": "Required to paginate the result set (5.6.*)." }, "config": { "sort-packages": true diff --git a/vendor/laravel/framework/src/Illuminate/Encryption/Encrypter.php b/vendor/laravel/framework/src/Illuminate/Encryption/Encrypter.php index df89e48f0..5f80599a4 100644 --- a/vendor/laravel/framework/src/Illuminate/Encryption/Encrypter.php +++ b/vendor/laravel/framework/src/Illuminate/Encryption/Encrypter.php @@ -125,7 +125,7 @@ class Encrypter implements EncrypterContract * * @param mixed $payload * @param bool $unserialize - * @return string + * @return mixed * * @throws \Illuminate\Contracts\Encryption\DecryptException */ diff --git a/vendor/laravel/framework/src/Illuminate/Encryption/composer.json b/vendor/laravel/framework/src/Illuminate/Encryption/composer.json index 0887e6fa1..73486abab 100644 --- a/vendor/laravel/framework/src/Illuminate/Encryption/composer.json +++ b/vendor/laravel/framework/src/Illuminate/Encryption/composer.json @@ -14,11 +14,11 @@ } ], "require": { - "php": ">=7.0", + "php": "^7.1.3", "ext-mbstring": "*", "ext-openssl": "*", - "illuminate/contracts": "5.5.*", - "illuminate/support": "5.5.*" + "illuminate/contracts": "5.6.*", + "illuminate/support": "5.6.*" }, "autoload": { "psr-4": { @@ -27,7 +27,7 @@ }, "extra": { "branch-alias": { - "dev-master": "5.5-dev" + "dev-master": "5.6-dev" } }, "config": { diff --git a/vendor/laravel/framework/src/Illuminate/Events/CallQueuedListener.php b/vendor/laravel/framework/src/Illuminate/Events/CallQueuedListener.php index a66b4f996..be0fee3ae 100644 --- a/vendor/laravel/framework/src/Illuminate/Events/CallQueuedListener.php +++ b/vendor/laravel/framework/src/Illuminate/Events/CallQueuedListener.php @@ -96,7 +96,7 @@ class CallQueuedListener implements ShouldQueue */ protected function setJobInstanceIfNecessary(Job $job, $instance) { - if (in_array(InteractsWithQueue::class, class_uses_recursive(get_class($instance)))) { + if (in_array(InteractsWithQueue::class, class_uses_recursive($instance))) { $instance->setJob($job); } diff --git a/vendor/laravel/framework/src/Illuminate/Events/Dispatcher.php b/vendor/laravel/framework/src/Illuminate/Events/Dispatcher.php index d99031cf0..be3561b5c 100644 --- a/vendor/laravel/framework/src/Illuminate/Events/Dispatcher.php +++ b/vendor/laravel/framework/src/Illuminate/Events/Dispatcher.php @@ -36,6 +36,13 @@ class Dispatcher implements DispatcherContract */ protected $wildcards = []; + /** + * The cached wildcard listeners. + * + * @var array + */ + protected $wildcardsCache = []; + /** * The queue resolver instance. * @@ -82,6 +89,8 @@ class Dispatcher implements DispatcherContract protected function setupWildcardListen($event, $listener) { $this->wildcards[$event][] = $this->makeListener($listener, true); + + $this->wildcardsCache = []; } /** @@ -282,7 +291,8 @@ class Dispatcher implements DispatcherContract $listeners = $this->listeners[$eventName] ?? []; $listeners = array_merge( - $listeners, $this->getWildcardListeners($eventName) + $listeners, + $this->wildcardsCache[$eventName] ?? $this->getWildcardListeners($eventName) ); return class_exists($eventName, false) @@ -306,7 +316,7 @@ class Dispatcher implements DispatcherContract } } - return $wildcards; + return $this->wildcardsCache[$eventName] = $wildcards; } /** diff --git a/vendor/laravel/framework/src/Illuminate/Events/composer.json b/vendor/laravel/framework/src/Illuminate/Events/composer.json index 772cab000..ceca48505 100644 --- a/vendor/laravel/framework/src/Illuminate/Events/composer.json +++ b/vendor/laravel/framework/src/Illuminate/Events/composer.json @@ -14,10 +14,10 @@ } ], "require": { - "php": ">=7.0", - "illuminate/container": "5.5.*", - "illuminate/contracts": "5.5.*", - "illuminate/support": "5.5.*" + "php": "^7.1.3", + "illuminate/container": "5.6.*", + "illuminate/contracts": "5.6.*", + "illuminate/support": "5.6.*" }, "autoload": { "psr-4": { @@ -26,7 +26,7 @@ }, "extra": { "branch-alias": { - "dev-master": "5.5-dev" + "dev-master": "5.6-dev" } }, "config": { diff --git a/vendor/laravel/framework/src/Illuminate/Filesystem/Filesystem.php b/vendor/laravel/framework/src/Illuminate/Filesystem/Filesystem.php index 75ce9d08e..65bd61ba4 100644 --- a/vendor/laravel/framework/src/Illuminate/Filesystem/Filesystem.php +++ b/vendor/laravel/framework/src/Illuminate/Filesystem/Filesystem.php @@ -387,7 +387,7 @@ class Filesystem public function files($directory, $hidden = false) { return iterator_to_array( - Finder::create()->files()->ignoreDotFiles(! $hidden)->in($directory)->depth(0), + Finder::create()->files()->ignoreDotFiles(! $hidden)->in($directory)->depth(0)->sortByName(), false ); } @@ -402,7 +402,7 @@ class Filesystem public function allFiles($directory, $hidden = false) { return iterator_to_array( - Finder::create()->files()->ignoreDotFiles(! $hidden)->in($directory), + Finder::create()->files()->ignoreDotFiles(! $hidden)->in($directory)->sortByName(), false ); } @@ -417,7 +417,7 @@ class Filesystem { $directories = []; - foreach (Finder::create()->in($directory)->directories()->depth(0) as $dir) { + foreach (Finder::create()->in($directory)->directories()->depth(0)->sortByName() as $dir) { $directories[] = $dir->getPathname(); } diff --git a/vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemAdapter.php b/vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemAdapter.php index 81653450e..40024f21a 100644 --- a/vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemAdapter.php +++ b/vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemAdapter.php @@ -204,7 +204,7 @@ class FilesystemAdapter implements FilesystemContract, CloudFilesystemContract */ public function putFileAs($path, $file, $name, $options = []) { - $stream = fopen($file->getRealPath(), 'r+'); + $stream = fopen($file->getRealPath(), 'r'); // Next, we will format the path of the file and store the file using a stream since // they provide better performance than alternatives. Once we write the file this @@ -379,6 +379,8 @@ class FilesystemAdapter implements FilesystemContract, CloudFilesystemContract if (method_exists($adapter, 'getUrl')) { return $adapter->getUrl($path); + } elseif (method_exists($this->driver, 'getUrl')) { + return $this->driver->getUrl($path); } elseif ($adapter instanceof AwsS3Adapter) { return $this->getAwsUrl($adapter, $path); } elseif ($adapter instanceof RackspaceAdapter) { @@ -665,7 +667,7 @@ class FilesystemAdapter implements FilesystemContract, CloudFilesystemContract return AdapterInterface::VISIBILITY_PRIVATE; } - throw new InvalidArgumentException('Unknown visibility: '.$visibility); + throw new InvalidArgumentException("Unknown visibility: {$visibility}"); } /** diff --git a/vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemManager.php b/vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemManager.php index 04c1bac53..7897352c8 100644 --- a/vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemManager.php +++ b/vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemManager.php @@ -8,6 +8,7 @@ use OpenCloud\Rackspace; use Illuminate\Support\Arr; use InvalidArgumentException; use League\Flysystem\AdapterInterface; +use League\Flysystem\Sftp\SftpAdapter; use League\Flysystem\FilesystemInterface; use League\Flysystem\Cached\CachedAdapter; use League\Flysystem\Filesystem as Flysystem; @@ -176,6 +177,19 @@ class FilesystemManager implements FactoryContract )); } + /** + * Create an instance of the sftp driver. + * + * @param array $config + * @return \Illuminate\Contracts\Filesystem\Filesystem + */ + public function createSftpDriver(array $config) + { + return $this->adapt($this->createFlysystem( + new SftpAdapter($config), $config + )); + } + /** * Create an instance of the Amazon S3 driver. * @@ -206,7 +220,7 @@ class FilesystemManager implements FactoryContract $config += ['version' => 'latest']; if ($config['key'] && $config['secret']) { - $config['credentials'] = Arr::only($config, ['key', 'secret']); + $config['credentials'] = Arr::only($config, ['key', 'secret', 'token']); } return $config; @@ -222,7 +236,7 @@ class FilesystemManager implements FactoryContract { $client = new Rackspace($config['endpoint'], [ 'username' => $config['username'], 'apiKey' => $config['key'], - ]); + ], $config['options'] ?? []); $root = $config['root'] ?? null; @@ -304,11 +318,13 @@ class FilesystemManager implements FactoryContract * * @param string $name * @param mixed $disk - * @return void + * @return $this */ public function set($name, $disk) { $this->disks[$name] = $disk; + + return $this; } /** @@ -342,6 +358,21 @@ class FilesystemManager implements FactoryContract return $this->app['config']['filesystems.cloud']; } + /** + * Unset the given disk instances. + * + * @param array|string $disk + * @return $this + */ + public function forgetDisk($disk) + { + foreach ((array) $disk as $diskName) { + unset($this->disks[$diskName]); + } + + return $this; + } + /** * Register a custom driver creator Closure. * diff --git a/vendor/laravel/framework/src/Illuminate/Filesystem/composer.json b/vendor/laravel/framework/src/Illuminate/Filesystem/composer.json index 3f0919427..041413abd 100644 --- a/vendor/laravel/framework/src/Illuminate/Filesystem/composer.json +++ b/vendor/laravel/framework/src/Illuminate/Filesystem/composer.json @@ -14,10 +14,10 @@ } ], "require": { - "php": ">=7.0", - "illuminate/contracts": "5.5.*", - "illuminate/support": "5.5.*", - "symfony/finder": "~3.3" + "php": "^7.1.3", + "illuminate/contracts": "5.6.*", + "illuminate/support": "5.6.*", + "symfony/finder": "~4.0" }, "autoload": { "psr-4": { @@ -26,13 +26,15 @@ }, "extra": { "branch-alias": { - "dev-master": "5.5-dev" + "dev-master": "5.6-dev" } }, "suggest": { "league/flysystem": "Required to use the Flysystem local and FTP drivers (~1.0).", "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (~1.0).", - "league/flysystem-rackspace": "Required to use the Flysystem Rackspace driver (~1.0)." + "league/flysystem-cached-adapter": "Required to use the Flysystem cache (~1.0).", + "league/flysystem-rackspace": "Required to use the Flysystem Rackspace driver (~1.0).", + "league/flysystem-sftp": "Required to use the Flysystem SFTP driver (~1.0)." }, "config": { "sort-packages": true diff --git a/vendor/laravel/framework/src/Illuminate/Foundation/Application.php b/vendor/laravel/framework/src/Illuminate/Foundation/Application.php index b1526339d..d4eecf85f 100644 --- a/vendor/laravel/framework/src/Illuminate/Foundation/Application.php +++ b/vendor/laravel/framework/src/Illuminate/Foundation/Application.php @@ -29,7 +29,7 @@ class Application extends Container implements ApplicationContract, HttpKernelIn * * @var string */ - const VERSION = '5.5.41'; + const VERSION = '5.6.29'; /** * The base path for the Laravel installation. @@ -94,13 +94,6 @@ class Application extends Container implements ApplicationContract, HttpKernelIn */ protected $deferredServices = []; - /** - * A custom callback used to configure Monolog. - * - * @var callable|null - */ - protected $monologConfigurator; - /** * The custom database path defined by the developer. * @@ -475,7 +468,7 @@ class Application extends Container implements ApplicationContract, HttpKernelIn */ public function environmentFilePath() { - return $this->environmentPath().'/'.$this->environmentFile(); + return $this->environmentPath().DIRECTORY_SEPARATOR.$this->environmentFile(); } /** @@ -488,13 +481,7 @@ class Application extends Container implements ApplicationContract, HttpKernelIn if (func_num_args() > 0) { $patterns = is_array(func_get_arg(0)) ? func_get_arg(0) : func_get_args(); - foreach ($patterns as $pattern) { - if (Str::is($pattern, $this['env'])) { - return true; - } - } - - return false; + return Str::is($patterns, $this['env']); } return $this['env']; @@ -524,23 +511,23 @@ class Application extends Container implements ApplicationContract, HttpKernelIn } /** - * Determine if we are running in the console. + * Determine if the application is running in the console. * * @return bool */ public function runningInConsole() { - return php_sapi_name() == 'cli' || php_sapi_name() == 'phpdbg'; + return php_sapi_name() === 'cli' || php_sapi_name() === 'phpdbg'; } /** - * Determine if we are running unit tests. + * Determine if the application is running unit tests. * * @return bool */ public function runningUnitTests() { - return $this['env'] == 'testing'; + return $this['env'] === 'testing'; } /** @@ -586,6 +573,21 @@ class Application extends Container implements ApplicationContract, HttpKernelIn $provider->register(); } + // If there are bindings / singletons set as properties on the provider we + // will spin through them and register them with the application, which + // serves as a convenience layer while registering a lot of bindings. + if (property_exists($provider, 'bindings')) { + foreach ($provider->bindings as $key => $value) { + $this->bind($key, $value); + } + } + + if (property_exists($provider, 'singletons')) { + foreach ($provider->singletons as $key => $value) { + $this->singleton($key, $value); + } + } + $this->markAsRegistered($provider); // If the application has already booted, we will call this boot method on @@ -1029,39 +1031,6 @@ class Application extends Container implements ApplicationContract, HttpKernelIn AliasLoader::setFacadeNamespace($namespace); } - /** - * Define a callback to be used to configure Monolog. - * - * @param callable $callback - * @return $this - */ - public function configureMonologUsing(callable $callback) - { - $this->monologConfigurator = $callback; - - return $this; - } - - /** - * Determine if the application has a custom Monolog configurator. - * - * @return bool - */ - public function hasMonologConfigurator() - { - return ! is_null($this->monologConfigurator); - } - - /** - * Get the custom Monolog configurator for the application. - * - * @return callable - */ - public function getMonologConfigurator() - { - return $this->monologConfigurator; - } - /** * Get the current application locale. * @@ -1122,9 +1091,10 @@ class Application extends Container implements ApplicationContract, HttpKernelIn 'filesystem' => [\Illuminate\Filesystem\FilesystemManager::class, \Illuminate\Contracts\Filesystem\Factory::class], 'filesystem.disk' => [\Illuminate\Contracts\Filesystem\Filesystem::class], 'filesystem.cloud' => [\Illuminate\Contracts\Filesystem\Cloud::class], - 'hash' => [\Illuminate\Contracts\Hashing\Hasher::class], + 'hash' => [\Illuminate\Hashing\HashManager::class], + 'hash.driver' => [\Illuminate\Contracts\Hashing\Hasher::class], 'translator' => [\Illuminate\Translation\Translator::class, \Illuminate\Contracts\Translation\Translator::class], - 'log' => [\Illuminate\Log\Writer::class, \Illuminate\Contracts\Logging\Log::class, \Psr\Log\LoggerInterface::class], + 'log' => [\Illuminate\Log\LogManager::class, \Psr\Log\LoggerInterface::class], 'mailer' => [\Illuminate\Mail\Mailer::class, \Illuminate\Contracts\Mail\Mailer::class, \Illuminate\Contracts\Mail\MailQueue::class], 'auth.password' => [\Illuminate\Auth\Passwords\PasswordBrokerManager::class, \Illuminate\Contracts\Auth\PasswordBrokerFactory::class], 'auth.password.broker' => [\Illuminate\Auth\Passwords\PasswordBroker::class, \Illuminate\Contracts\Auth\PasswordBroker::class], diff --git a/vendor/laravel/framework/src/Illuminate/Foundation/Auth/AuthenticatesUsers.php b/vendor/laravel/framework/src/Illuminate/Foundation/Auth/AuthenticatesUsers.php index 00712c13e..5e4e43de7 100644 --- a/vendor/laravel/framework/src/Illuminate/Foundation/Auth/AuthenticatesUsers.php +++ b/vendor/laravel/framework/src/Illuminate/Foundation/Auth/AuthenticatesUsers.php @@ -25,6 +25,8 @@ trait AuthenticatesUsers * * @param \Illuminate\Http\Request $request * @return \Illuminate\Http\RedirectResponse|\Illuminate\Http\Response|\Illuminate\Http\JsonResponse + * + * @throws \Illuminate\Validation\ValidationException */ public function login(Request $request) { @@ -123,7 +125,7 @@ trait AuthenticatesUsers * @param \Illuminate\Http\Request $request * @return \Symfony\Component\HttpFoundation\Response * - * @throws ValidationException + * @throws \Illuminate\Validation\ValidationException */ protected function sendFailedLoginResponse(Request $request) { @@ -154,7 +156,18 @@ trait AuthenticatesUsers $request->session()->invalidate(); - return redirect('/'); + return $this->loggedOut($request) ?: redirect('/'); + } + + /** + * The user has logged out of the application. + * + * @param \Illuminate\Http\Request $request + * @return mixed + */ + protected function loggedOut(Request $request) + { + // } /** diff --git a/vendor/laravel/framework/src/Illuminate/Foundation/Auth/SendsPasswordResetEmails.php b/vendor/laravel/framework/src/Illuminate/Foundation/Auth/SendsPasswordResetEmails.php index edab2112e..fd946ca95 100644 --- a/vendor/laravel/framework/src/Illuminate/Foundation/Auth/SendsPasswordResetEmails.php +++ b/vendor/laravel/framework/src/Illuminate/Foundation/Auth/SendsPasswordResetEmails.php @@ -70,9 +70,9 @@ trait SendsPasswordResetEmails */ protected function sendResetLinkFailedResponse(Request $request, $response) { - return back()->withErrors( - ['email' => trans($response)] - ); + return back() + ->withInput($request->only('email')) + ->withErrors(['email' => trans($response)]); } /** diff --git a/vendor/laravel/framework/src/Illuminate/Foundation/Auth/ThrottlesLogins.php b/vendor/laravel/framework/src/Illuminate/Foundation/Auth/ThrottlesLogins.php index 8ba6e2896..fc50720f7 100644 --- a/vendor/laravel/framework/src/Illuminate/Foundation/Auth/ThrottlesLogins.php +++ b/vendor/laravel/framework/src/Illuminate/Foundation/Auth/ThrottlesLogins.php @@ -20,7 +20,7 @@ trait ThrottlesLogins protected function hasTooManyLoginAttempts(Request $request) { return $this->limiter()->tooManyAttempts( - $this->throttleKey($request), $this->maxAttempts(), $this->decayMinutes() + $this->throttleKey($request), $this->maxAttempts() ); } @@ -52,7 +52,7 @@ trait ThrottlesLogins throw ValidationException::withMessages([ $this->username() => [Lang::get('auth.throttle', ['seconds' => $seconds])], - ])->status(423); + ])->status(429); } /** diff --git a/vendor/laravel/framework/src/Illuminate/Foundation/Bootstrap/LoadEnvironmentVariables.php b/vendor/laravel/framework/src/Illuminate/Foundation/Bootstrap/LoadEnvironmentVariables.php index cc9196dcf..599c474c1 100644 --- a/vendor/laravel/framework/src/Illuminate/Foundation/Bootstrap/LoadEnvironmentVariables.php +++ b/vendor/laravel/framework/src/Illuminate/Foundation/Bootstrap/LoadEnvironmentVariables.php @@ -3,6 +3,7 @@ namespace Illuminate\Foundation\Bootstrap; use Dotenv\Dotenv; +use Dotenv\Exception\InvalidFileException; use Dotenv\Exception\InvalidPathException; use Symfony\Component\Console\Input\ArgvInput; use Illuminate\Contracts\Foundation\Application; @@ -27,6 +28,8 @@ class LoadEnvironmentVariables (new Dotenv($app->environmentPath(), $app->environmentFile()))->load(); } catch (InvalidPathException $e) { // + } catch (InvalidFileException $e) { + die('The environment file is invalid: '.$e->getMessage()); } } diff --git a/vendor/laravel/framework/src/Illuminate/Foundation/Bus/Dispatchable.php b/vendor/laravel/framework/src/Illuminate/Foundation/Bus/Dispatchable.php index 62c465fe7..bd509a96b 100644 --- a/vendor/laravel/framework/src/Illuminate/Foundation/Bus/Dispatchable.php +++ b/vendor/laravel/framework/src/Illuminate/Foundation/Bus/Dispatchable.php @@ -2,6 +2,8 @@ namespace Illuminate\Foundation\Bus; +use Illuminate\Contracts\Bus\Dispatcher; + trait Dispatchable { /** @@ -14,6 +16,16 @@ trait Dispatchable return new PendingDispatch(new static(...func_get_args())); } + /** + * Dispatch a command to its appropriate handler in the current process. + * + * @return mixed + */ + public static function dispatchNow() + { + return app(Dispatcher::class)->dispatchNow(new static(...func_get_args())); + } + /** * Set the jobs that should run if this job is successful. * diff --git a/vendor/laravel/framework/src/Illuminate/Foundation/Console/ChannelMakeCommand.php b/vendor/laravel/framework/src/Illuminate/Foundation/Console/ChannelMakeCommand.php new file mode 100644 index 000000000..8cfb3da8b --- /dev/null +++ b/vendor/laravel/framework/src/Illuminate/Foundation/Console/ChannelMakeCommand.php @@ -0,0 +1,65 @@ +info('The compiled services & packages files have been removed.'); + $this->info('Compiled services and packages files removed!'); } } diff --git a/vendor/laravel/framework/src/Illuminate/Foundation/Console/ConfigCacheCommand.php b/vendor/laravel/framework/src/Illuminate/Foundation/Console/ConfigCacheCommand.php index edd85ee53..275b672d5 100644 --- a/vendor/laravel/framework/src/Illuminate/Foundation/Console/ConfigCacheCommand.php +++ b/vendor/laravel/framework/src/Illuminate/Foundation/Console/ConfigCacheCommand.php @@ -2,6 +2,8 @@ namespace Illuminate\Foundation\Console; +use Throwable; +use LogicException; use Illuminate\Console\Command; use Illuminate\Filesystem\Filesystem; use Illuminate\Contracts\Console\Kernel as ConsoleKernelContract; @@ -52,11 +54,20 @@ class ConfigCacheCommand extends Command $this->call('config:clear'); $config = $this->getFreshConfiguration(); + $configPath = $this->laravel->getCachedConfigPath(); $this->files->put( - $this->laravel->getCachedConfigPath(), 'files->delete($configPath); + + throw new LogicException('Your configuration files are not serializable.', 0, $e); + } + $this->info('Configuration cached successfully!'); } diff --git a/vendor/laravel/framework/src/Illuminate/Foundation/Console/DownCommand.php b/vendor/laravel/framework/src/Illuminate/Foundation/Console/DownCommand.php index 0cd685e59..4382ccc2e 100644 --- a/vendor/laravel/framework/src/Illuminate/Foundation/Console/DownCommand.php +++ b/vendor/laravel/framework/src/Illuminate/Foundation/Console/DownCommand.php @@ -15,7 +15,8 @@ class DownCommand extends Command * @var string */ protected $signature = 'down {--message= : The message for the maintenance mode. } - {--retry= : The number of seconds after which the request may be retried.}'; + {--retry= : The number of seconds after which the request may be retried.} + {--allow=* : IP or networks allowed to access the application while in maintenance mode.}'; /** * The console command description. @@ -50,6 +51,7 @@ class DownCommand extends Command 'time' => $this->currentTime(), 'message' => $this->option('message'), 'retry' => $this->getRetryTime(), + 'allowed' => $this->option('allow'), ]; } diff --git a/vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php b/vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php index fd3925373..4d933a280 100644 --- a/vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php +++ b/vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php @@ -6,6 +6,7 @@ use Closure; use Exception; use Throwable; use ReflectionClass; +use Illuminate\Support\Arr; use Illuminate\Support\Str; use Illuminate\Console\Command; use Symfony\Component\Finder\Finder; @@ -195,7 +196,7 @@ class Kernel implements KernelContract */ protected function load($paths) { - $paths = array_unique(is_array($paths) ? $paths : (array) $paths); + $paths = array_unique(Arr::wrap($paths)); $paths = array_filter($paths, function ($path) { return is_dir($path); diff --git a/vendor/laravel/framework/src/Illuminate/Foundation/Console/ModelMakeCommand.php b/vendor/laravel/framework/src/Illuminate/Foundation/Console/ModelMakeCommand.php index 96427b81c..071b52883 100644 --- a/vendor/laravel/framework/src/Illuminate/Foundation/Console/ModelMakeCommand.php +++ b/vendor/laravel/framework/src/Illuminate/Foundation/Console/ModelMakeCommand.php @@ -67,8 +67,10 @@ class ModelMakeCommand extends GeneratorCommand */ protected function createFactory() { + $factory = Str::studly(class_basename($this->argument('name'))); + $this->call('make:factory', [ - 'name' => $this->argument('name').'Factory', + 'name' => "{$factory}Factory", '--model' => $this->argument('name'), ]); } diff --git a/vendor/laravel/framework/src/Illuminate/Foundation/Console/ObserverMakeCommand.php b/vendor/laravel/framework/src/Illuminate/Foundation/Console/ObserverMakeCommand.php new file mode 100644 index 000000000..77a816264 --- /dev/null +++ b/vendor/laravel/framework/src/Illuminate/Foundation/Console/ObserverMakeCommand.php @@ -0,0 +1,113 @@ +option('model'); + + return $model ? $this->replaceModel($stub, $model) : $stub; + } + + /** + * Get the stub file for the generator. + * + * @return string + */ + protected function getStub() + { + return $this->option('model') + ? __DIR__.'/stubs/observer.stub' + : __DIR__.'/stubs/observer.plain.stub'; + } + + /** + * Replace the model for the given stub. + * + * @param string $stub + * @param string $model + * @return string + */ + protected function replaceModel($stub, $model) + { + $model = str_replace('/', '\\', $model); + + $namespaceModel = $this->laravel->getNamespace().$model; + + if (Str::startsWith($model, '\\')) { + $stub = str_replace('NamespacedDummyModel', trim($model, '\\'), $stub); + } else { + $stub = str_replace('NamespacedDummyModel', $namespaceModel, $stub); + } + + $stub = str_replace( + "use {$namespaceModel};\nuse {$namespaceModel};", "use {$namespaceModel};", $stub + ); + + $model = class_basename(trim($model, '\\')); + + $stub = str_replace('DocDummyModel', Str::snake($model, ' '), $stub); + + $stub = str_replace('DummyModel', $model, $stub); + + return str_replace('dummyModel', Str::camel($model), $stub); + } + + /** + * Get the default namespace for the class. + * + * @param string $rootNamespace + * @return string + */ + protected function getDefaultNamespace($rootNamespace) + { + return $rootNamespace.'\Observers'; + } + + /** + * Get the console command arguments. + * + * @return array + */ + protected function getOptions() + { + return [ + ['model', 'm', InputOption::VALUE_OPTIONAL, 'The model that the observer applies to.'], + ]; + } +} diff --git a/vendor/laravel/framework/src/Illuminate/Foundation/Console/OptimizeCommand.php b/vendor/laravel/framework/src/Illuminate/Foundation/Console/OptimizeCommand.php deleted file mode 100644 index 1694d5833..000000000 --- a/vendor/laravel/framework/src/Illuminate/Foundation/Console/OptimizeCommand.php +++ /dev/null @@ -1,47 +0,0 @@ -build(); foreach (array_keys($manifest->manifest) as $package) { - $this->line("Discovered Package: {$package}"); + $this->line("Discovered Package: {$package}"); } $this->info('Package manifest generated successfully.'); diff --git a/vendor/laravel/framework/src/Illuminate/Foundation/Console/PolicyMakeCommand.php b/vendor/laravel/framework/src/Illuminate/Foundation/Console/PolicyMakeCommand.php index 3f31ab4ca..c360d0f39 100644 --- a/vendor/laravel/framework/src/Illuminate/Foundation/Console/PolicyMakeCommand.php +++ b/vendor/laravel/framework/src/Illuminate/Foundation/Console/PolicyMakeCommand.php @@ -92,15 +92,17 @@ class PolicyMakeCommand extends GeneratorCommand $dummyUser = class_basename(config('auth.providers.users.model')); - $dummyModel = Str::camel($model) === 'user' ? 'model' : Str::camel($model); + $dummyModel = Str::camel($model) === 'user' ? 'model' : $model; + + $stub = str_replace('DocDummyModel', Str::snake($dummyModel, ' '), $stub); $stub = str_replace('DummyModel', $model, $stub); - $stub = str_replace('dummyModel', $dummyModel, $stub); + $stub = str_replace('dummyModel', Str::camel($dummyModel), $stub); $stub = str_replace('DummyUser', $dummyUser, $stub); - return str_replace('dummyPluralModel', Str::plural($dummyModel), $stub); + return str_replace('DocDummyPluralModel', Str::snake(Str::plural($dummyModel), ' '), $stub); } /** diff --git a/vendor/laravel/framework/src/Illuminate/Foundation/Console/Presets/Bootstrap.php b/vendor/laravel/framework/src/Illuminate/Foundation/Console/Presets/Bootstrap.php index 36004f0d2..93c561828 100644 --- a/vendor/laravel/framework/src/Illuminate/Foundation/Console/Presets/Bootstrap.php +++ b/vendor/laravel/framework/src/Illuminate/Foundation/Console/Presets/Bootstrap.php @@ -25,8 +25,9 @@ class Bootstrap extends Preset protected static function updatePackageArray(array $packages) { return [ - 'bootstrap-sass' => '^3.3.7', - 'jquery' => '^3.1.1', + 'bootstrap' => '^4.0.0', + 'jquery' => '^3.2', + 'popper.js' => '^1.12', ] + $packages; } diff --git a/vendor/laravel/framework/src/Illuminate/Foundation/Console/Presets/None.php b/vendor/laravel/framework/src/Illuminate/Foundation/Console/Presets/None.php index 750c3b45a..77d7f5b7f 100644 --- a/vendor/laravel/framework/src/Illuminate/Foundation/Console/Presets/None.php +++ b/vendor/laravel/framework/src/Illuminate/Foundation/Console/Presets/None.php @@ -34,8 +34,9 @@ class None extends Preset protected static function updatePackageArray(array $packages) { unset( - $packages['bootstrap-sass'], + $packages['bootstrap'], $packages['jquery'], + $packages['popper.js'], $packages['vue'], $packages['babel-preset-react'], $packages['react'], diff --git a/vendor/laravel/framework/src/Illuminate/Foundation/Console/Presets/Preset.php b/vendor/laravel/framework/src/Illuminate/Foundation/Console/Presets/Preset.php index acea75c22..e837cffe0 100644 --- a/vendor/laravel/framework/src/Illuminate/Foundation/Console/Presets/Preset.php +++ b/vendor/laravel/framework/src/Illuminate/Foundation/Console/Presets/Preset.php @@ -23,21 +23,24 @@ class Preset /** * Update the "package.json" file. * + * @param bool $dev * @return void */ - protected static function updatePackages() + protected static function updatePackages($dev = true) { if (! file_exists(base_path('package.json'))) { return; } + $configurationKey = $dev ? 'devDependencies' : 'dependencies'; + $packages = json_decode(file_get_contents(base_path('package.json')), true); - $packages['devDependencies'] = static::updatePackageArray( - $packages['devDependencies'] + $packages[$configurationKey] = static::updatePackageArray( + array_key_exists($configurationKey, $packages) ? $packages[$configurationKey] : [] ); - ksort($packages['devDependencies']); + ksort($packages[$configurationKey]); file_put_contents( base_path('package.json'), diff --git a/vendor/laravel/framework/src/Illuminate/Foundation/Console/Presets/React.php b/vendor/laravel/framework/src/Illuminate/Foundation/Console/Presets/React.php index 8ecdeeada..347de5fa1 100644 --- a/vendor/laravel/framework/src/Illuminate/Foundation/Console/Presets/React.php +++ b/vendor/laravel/framework/src/Illuminate/Foundation/Console/Presets/React.php @@ -32,8 +32,8 @@ class React extends Preset { return [ 'babel-preset-react' => '^6.23.0', - 'react' => '^15.4.2', - 'react-dom' => '^15.4.2', + 'react' => '^16.2.0', + 'react-dom' => '^16.2.0', ] + Arr::except($packages, ['vue']); } diff --git a/vendor/laravel/framework/src/Illuminate/Foundation/Console/Presets/bootstrap-stubs/_variables.scss b/vendor/laravel/framework/src/Illuminate/Foundation/Console/Presets/bootstrap-stubs/_variables.scss index 53202ac15..70ecfdb39 100644 --- a/vendor/laravel/framework/src/Illuminate/Foundation/Console/Presets/bootstrap-stubs/_variables.scss +++ b/vendor/laravel/framework/src/Illuminate/Foundation/Console/Presets/bootstrap-stubs/_variables.scss @@ -2,37 +2,7 @@ // Body $body-bg: #f5f8fa; -// Borders -$laravel-border-color: darken($body-bg, 10%); -$list-group-border: $laravel-border-color; -$navbar-default-border: $laravel-border-color; -$panel-default-border: $laravel-border-color; -$panel-inner-border: $laravel-border-color; - -// Brands -$brand-primary: #3097D1; -$brand-info: #8eb4cb; -$brand-success: #2ab27b; -$brand-warning: #cbb956; -$brand-danger: #bf5329; - // Typography -$icon-font-path: "~bootstrap-sass/assets/fonts/bootstrap/"; $font-family-sans-serif: "Raleway", sans-serif; -$font-size-base: 14px; +$font-size-base: 0.9rem; $line-height-base: 1.6; -$text-color: #636b6f; - -// Navbar -$navbar-default-bg: #fff; - -// Buttons -$btn-default-color: $text-color; - -// Inputs -$input-border: lighten($text-color, 40%); -$input-border-focus: lighten($brand-primary, 25%); -$input-color-placeholder: lighten($text-color, 30%); - -// Panels -$panel-default-heading-bg: #fff; diff --git a/vendor/laravel/framework/src/Illuminate/Foundation/Console/Presets/bootstrap-stubs/app.scss b/vendor/laravel/framework/src/Illuminate/Foundation/Console/Presets/bootstrap-stubs/app.scss index 1bbc55086..0077cb141 100644 --- a/vendor/laravel/framework/src/Illuminate/Foundation/Console/Presets/bootstrap-stubs/app.scss +++ b/vendor/laravel/framework/src/Illuminate/Foundation/Console/Presets/bootstrap-stubs/app.scss @@ -6,4 +6,9 @@ @import "variables"; // Bootstrap -@import "~bootstrap-sass/assets/stylesheets/bootstrap"; +@import '~bootstrap/scss/bootstrap'; + +.navbar-laravel { + background-color: #fff; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.04); +} diff --git a/vendor/laravel/framework/src/Illuminate/Foundation/Console/Presets/react-stubs/Example.js b/vendor/laravel/framework/src/Illuminate/Foundation/Console/Presets/react-stubs/Example.js index 21f77f240..937bb985d 100644 --- a/vendor/laravel/framework/src/Illuminate/Foundation/Console/Presets/react-stubs/Example.js +++ b/vendor/laravel/framework/src/Illuminate/Foundation/Console/Presets/react-stubs/Example.js @@ -5,12 +5,12 @@ export default class Example extends Component { render() { return (
-
-
-
-
Example Component
+
+
+
+
Example Component
-
+
I'm an example component!
diff --git a/vendor/laravel/framework/src/Illuminate/Foundation/Console/Presets/vue-stubs/ExampleComponent.vue b/vendor/laravel/framework/src/Illuminate/Foundation/Console/Presets/vue-stubs/ExampleComponent.vue index 601e61cf8..3fb9f9aa7 100644 --- a/vendor/laravel/framework/src/Illuminate/Foundation/Console/Presets/vue-stubs/ExampleComponent.vue +++ b/vendor/laravel/framework/src/Illuminate/Foundation/Console/Presets/vue-stubs/ExampleComponent.vue @@ -1,12 +1,12 @@