From 47b444a7425c43b8ba8fe242c5496bfccad61e8f Mon Sep 17 00:00:00 2001 From: Andy Miller Date: Tue, 16 Nov 2021 19:57:34 -0700 Subject: [PATCH 01/83] pimple fix --- composer.json | 4 ++-- composer.lock | 43 +++++++++++++++++++------------------------ 2 files changed, 21 insertions(+), 26 deletions(-) diff --git a/composer.json b/composer.json index 42535abb0b..81c357c1fa 100644 --- a/composer.json +++ b/composer.json @@ -27,7 +27,7 @@ "psr/simple-cache": "^1.0", "psr/http-message": "^1.0", "psr/http-server-middleware": "^1.0", - "psr/container": "~1.0.0", + "psr/container": "~1.1.0", "nyholm/psr7-server": "^1.0", "nyholm/psr7": "^1.3", "twig/twig": "~1.44", @@ -48,7 +48,7 @@ "getgrav/image": "^3.0", "getgrav/cache": "^2.0", "donatj/phpuseragentparser": "~1.1", - "pimple/pimple": "~3.3.0", + "pimple/pimple": "~3.5.0", "rockettheme/toolbox": "~1.5", "maximebf/debugbar": "~1.16", "league/climate": "^3.6", diff --git a/composer.lock b/composer.lock index 3b66c8a462..d540f4cff0 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "072f00e1bf64b4ef43f7125fe80b15a7", + "content-hash": "7ba41a056515b00db8475d26c7fff546", "packages": [ { "name": "antoligy/dom-string-iterators", @@ -1561,29 +1561,29 @@ }, { "name": "pimple/pimple", - "version": "v3.3.1", + "version": "v3.5.0", "source": { "type": "git", "url": "https://github.com/silexphp/Pimple.git", - "reference": "21e45061c3429b1e06233475cc0e1f6fc774d5b0" + "reference": "a94b3a4db7fb774b3d78dad2315ddc07629e1bed" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/silexphp/Pimple/zipball/21e45061c3429b1e06233475cc0e1f6fc774d5b0", - "reference": "21e45061c3429b1e06233475cc0e1f6fc774d5b0", + "url": "https://api.github.com/repos/silexphp/Pimple/zipball/a94b3a4db7fb774b3d78dad2315ddc07629e1bed", + "reference": "a94b3a4db7fb774b3d78dad2315ddc07629e1bed", "shasum": "" }, "require": { "php": ">=7.2.5", - "psr/container": "^1.0" + "psr/container": "^1.1 || ^2.0" }, "require-dev": { - "symfony/phpunit-bridge": "^5.0" + "symfony/phpunit-bridge": "^5.4@dev" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.3.x-dev" + "dev-master": "3.4.x-dev" } }, "autoload": { @@ -1608,9 +1608,9 @@ "dependency injection" ], "support": { - "source": "https://github.com/silexphp/Pimple/tree/v3.3.1" + "source": "https://github.com/silexphp/Pimple/tree/v3.5.0" }, - "time": "2020-11-24T20:35:42+00:00" + "time": "2021-10-28T11:13:42+00:00" }, { "name": "psr/cache", @@ -1663,27 +1663,22 @@ }, { "name": "psr/container", - "version": "1.0.0", + "version": "1.1.1", "source": { "type": "git", "url": "https://github.com/php-fig/container.git", - "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f" + "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f", - "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f", + "url": "https://api.github.com/repos/php-fig/container/zipball/8622567409010282b7aeebe4bb841fe98b58dcaf", + "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf", "shasum": "" }, "require": { - "php": ">=5.3.0" + "php": ">=7.2.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, "autoload": { "psr-4": { "Psr\\Container\\": "src/" @@ -1696,7 +1691,7 @@ "authors": [ { "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "homepage": "https://www.php-fig.org/" } ], "description": "Common Container Interface (PHP FIG PSR-11)", @@ -1710,9 +1705,9 @@ ], "support": { "issues": "https://github.com/php-fig/container/issues", - "source": "https://github.com/php-fig/container/tree/master" + "source": "https://github.com/php-fig/container/tree/1.1.1" }, - "time": "2017-02-14T16:28:37+00:00" + "time": "2021-03-05T17:36:06+00:00" }, { "name": "psr/http-factory", @@ -6698,5 +6693,5 @@ "platform-overrides": { "php": "7.3.6" }, - "plugin-api-version": "2.0.0" + "plugin-api-version": "2.1.0" } From 193475a0b64ce4b97a6f1be1e5d757a665dc28c1 Mon Sep 17 00:00:00 2001 From: Matias Griese Date: Wed, 17 Nov 2021 10:49:39 +0200 Subject: [PATCH 02/83] Made `Grav::redirect()` to accept `Route` class --- CHANGELOG.md | 6 ++++ system/src/Grav/Common/Grav.php | 58 ++++++++++++++++++--------------- 2 files changed, 38 insertions(+), 26 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b0c0eb3e8e..78b967d61c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +# v1.7.26 +## mm/dd/2021 + +1. [](#new) + * Made `Grav::redirect()` to accept `Route` class + # v1.7.25 ## 11/16/2021 diff --git a/system/src/Grav/Common/Grav.php b/system/src/Grav/Common/Grav.php index 2398c116c0..df0fc301e5 100644 --- a/system/src/Grav/Common/Grav.php +++ b/system/src/Grav/Common/Grav.php @@ -49,6 +49,7 @@ use Grav\Framework\DI\Container; use Grav\Framework\Psr7\Response; use Grav\Framework\RequestHandler\RequestHandler; +use Grav\Framework\Route\Route; use Grav\Framework\Session\Messages; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; @@ -62,6 +63,7 @@ use function in_array; use function is_callable; use function is_int; +use function is_string; use function strlen; /** @@ -408,7 +410,7 @@ public function exit(ResponseInterface $response): void * * Please use this method instead of calling `header("Location: {$url}", true, 302); exit();`. * - * @param string $route Internal route. + * @param Route|string $route Internal route. * @param int|null $code Redirection code (30x) * @return void */ @@ -422,7 +424,7 @@ public function redirect($route, $code = null): void /** * Returns redirect response object from Grav. * - * @param string $route Internal route. + * @param Route|string $route Internal route. * @param int|null $code Redirection code (30x) * @return ResponseInterface */ @@ -431,37 +433,41 @@ public function getRedirectResponse($route, $code = null): ResponseInterface /** @var Uri $uri */ $uri = $this['uri']; - // Clean route for redirect - $route = preg_replace("#^\/[\\\/]+\/#", '/', $route); + if (is_string($route)) { + // Clean route for redirect + $route = preg_replace("#^\/[\\\/]+\/#", '/', $route); + + if (null === $code) { + // Check for redirect code in the route: e.g. /new/[301], /new[301]/route or /new[301].html + $regex = '/.*(\[(30[1-7])\])(.\w+|\/.*?)?$/'; + preg_match($regex, $route, $matches); + if ($matches) { + $route = str_replace($matches[1], '', $matches[0]); + $code = $matches[2]; + } + } - if ($code < 300 || $code > 399) { - $code = null; - } + if ($uri::isExternal($route)) { + $url = $route; + } else { + $url = rtrim($uri->rootUrl(), '/') . '/'; - if (null === $code) { - // Check for redirect code in the route: e.g. /new/[301], /new[301]/route or /new[301].html - $regex = '/.*(\[(30[1-7])\])(.\w+|\/.*?)?$/'; - preg_match($regex, $route, $matches); - if ($matches) { - $route = str_replace($matches[1], '', $matches[0]); - $code = $matches[2]; + if ($this['config']->get('system.pages.redirect_trailing_slash', true)) { + $url .= trim($route, '/'); // Remove trailing slash + } else { + $url .= ltrim($route, '/'); // Support trailing slash default routes + } } + } elseif ($route instanceof Route) { + $url = $route->toString(true); } - if ($code === null) { - $code = $this['config']->get('system.pages.redirect_default_code', 302); + if ($code < 300 || $code > 399) { + $code = null; } - if ($uri::isExternal($route)) { - $url = $route; - } else { - $url = rtrim($uri->rootUrl(), '/') . '/'; - - if ($this['config']->get('system.pages.redirect_trailing_slash', true)) { - $url .= trim($route, '/'); // Remove trailing slash - } else { - $url .= ltrim($route, '/'); // Support trailing slash default routes - } + if ($code === null) { + $code = $this['config']->get('system.pages.redirect_default_code', 302); } if ($uri->extension() === 'json') { From 6e9f6e8f7af92db1c2cfa3e3502c5c811e710548 Mon Sep 17 00:00:00 2001 From: Andy Miller Date: Wed, 17 Nov 2021 10:40:38 -0700 Subject: [PATCH 03/83] php 8.1 compatibility --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 78b967d61c..7146dc2fd4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,8 @@ 1. [](#new) * Made `Grav::redirect()` to accept `Route` class +2. [](#improved) + * Upgraded vendor libs for PHP 8.1 compatibility # v1.7.25 ## 11/16/2021 From a8d292a0d94b7ca5cc16db2651f05e50ccb677a5 Mon Sep 17 00:00:00 2001 From: Matias Griese Date: Thu, 25 Nov 2021 11:07:20 +0200 Subject: [PATCH 04/83] Added third `$name` parameter to `Blueprint::flattenData()` method, useful for flattening repeating data --- CHANGELOG.md | 1 + system/src/Grav/Common/Data/Blueprint.php | 9 +++++---- .../src/Grav/Common/Data/BlueprintSchema.php | 18 ++++++++++++------ 3 files changed, 18 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7146dc2fd4..2b270d807d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ * Made `Grav::redirect()` to accept `Route` class 2. [](#improved) * Upgraded vendor libs for PHP 8.1 compatibility + * Added third `$name` parameter to `Blueprint::flattenData()` method, useful for flattening repeating data # v1.7.25 ## 11/16/2021 diff --git a/system/src/Grav/Common/Data/Blueprint.php b/system/src/Grav/Common/Data/Blueprint.php index 287819939f..df434267f0 100644 --- a/system/src/Grav/Common/Data/Blueprint.php +++ b/system/src/Grav/Common/Data/Blueprint.php @@ -293,15 +293,16 @@ public function filter(array $data, bool $missingValuesAsNull = false, bool $kee /** * Flatten data by using blueprints. * - * @param array $data - * @param bool $includeAll + * @param array $data Data to be flattened. + * @param bool $includeAll True if undefined properties should also be included. + * @param string $name Property which will be flattened, useful for flattening repeating data. * @return array */ - public function flattenData(array $data, bool $includeAll = false) + public function flattenData(array $data, bool $includeAll = false, string $name = '') { $this->initInternals(); - return $this->blueprintSchema->flattenData($data, $includeAll); + return $this->blueprintSchema->flattenData($data, $includeAll, $name); } diff --git a/system/src/Grav/Common/Data/BlueprintSchema.php b/system/src/Grav/Common/Data/BlueprintSchema.php index db5e6af7d0..c28ed7a8de 100644 --- a/system/src/Grav/Common/Data/BlueprintSchema.php +++ b/system/src/Grav/Common/Data/BlueprintSchema.php @@ -115,23 +115,29 @@ public function filter(array $data, $missingValuesAsNull = false, $keepEmptyValu /** * Flatten data by using blueprints. * - * @param array $data Data to be flattened. - * @param bool $includeAll + * @param array $data Data to be flattened. + * @param bool $includeAll True if undefined properties should also be included. + * @param string $name Property which will be flattened, useful for flattening repeating data. * @return array */ - public function flattenData(array $data, bool $includeAll = false) + public function flattenData(array $data, bool $includeAll = false, string $name = '') { + $prefix = $name !== '' ? $name . '.' : ''; + $list = []; if ($includeAll) { - foreach ($this->items as $key => $rules) { + $items = $name !== '' ? $this->getProperty($name)['fields'] ?? [] : $this->items; + foreach ($items as $key => $rules) { $type = $rules['type'] ?? ''; if (!str_starts_with($type, '_') && !str_contains($key, '*')) { - $list[$key] = null; + $list[$prefix . $key] = null; } } } - return array_replace($list, $this->flattenArray($data, $this->nested, '')); + $nested = $this->getNestedRules($name); + + return array_replace($list, $this->flattenArray($data, $nested, $prefix)); } /** From 664c95e95a35c8aa5eddacbc30ebde83eae50e65 Mon Sep 17 00:00:00 2001 From: Matias Griese Date: Thu, 25 Nov 2021 11:28:25 +0200 Subject: [PATCH 05/83] Composer update --- composer.lock | 130 +++++++++++++++++++++++++------------------------- 1 file changed, 65 insertions(+), 65 deletions(-) diff --git a/composer.lock b/composer.lock index d540f4cff0..b08f93f244 100644 --- a/composer.lock +++ b/composer.lock @@ -2234,16 +2234,16 @@ }, { "name": "symfony/console", - "version": "v4.4.33", + "version": "v4.4.34", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "8dbd23ef7a8884051482183ddee8d9061b5feed0" + "reference": "329b3a75cc6b16d435ba1b1a41df54a53382a3f0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/8dbd23ef7a8884051482183ddee8d9061b5feed0", - "reference": "8dbd23ef7a8884051482183ddee8d9061b5feed0", + "url": "https://api.github.com/repos/symfony/console/zipball/329b3a75cc6b16d435ba1b1a41df54a53382a3f0", + "reference": "329b3a75cc6b16d435ba1b1a41df54a53382a3f0", "shasum": "" }, "require": { @@ -2304,7 +2304,7 @@ "description": "Eases the creation of beautiful and testable command line interfaces", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/console/tree/v4.4.33" + "source": "https://github.com/symfony/console/tree/v4.4.34" }, "funding": [ { @@ -2320,25 +2320,25 @@ "type": "tidelift" } ], - "time": "2021-10-25T16:36:08+00:00" + "time": "2021-11-04T12:23:33+00:00" }, { "name": "symfony/contracts", - "version": "v1.1.10", + "version": "v1.1.11", "source": { "type": "git", "url": "https://github.com/symfony/contracts.git", - "reference": "011c20407c4b99d454f44021d023fb39ce23b73d" + "reference": "cf2984f7a99bfae197f9c96f5a16a4041ff6ffb1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/contracts/zipball/011c20407c4b99d454f44021d023fb39ce23b73d", - "reference": "011c20407c4b99d454f44021d023fb39ce23b73d", + "url": "https://api.github.com/repos/symfony/contracts/zipball/cf2984f7a99bfae197f9c96f5a16a4041ff6ffb1", + "reference": "cf2984f7a99bfae197f9c96f5a16a4041ff6ffb1", "shasum": "" }, "require": { "php": ">=7.1.3", - "psr/cache": "^1.0", + "psr/cache": "^1.0|^2.0|^3.0", "psr/container": "^1.0" }, "replace": { @@ -2362,7 +2362,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.1-dev" + "dev-main": "1.1-dev" } }, "autoload": { @@ -2398,7 +2398,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/contracts/tree/v1.1.10" + "source": "https://github.com/symfony/contracts/tree/v1.1.11" }, "funding": [ { @@ -2414,20 +2414,20 @@ "type": "tidelift" } ], - "time": "2020-09-02T16:08:58+00:00" + "time": "2021-11-04T13:32:43+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v4.4.30", + "version": "v4.4.34", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "2fe81680070043c4c80e7cedceb797e34f377bac" + "reference": "1a024b45369c9d55d76b6b8a241bd20c9ea1cbd8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/2fe81680070043c4c80e7cedceb797e34f377bac", - "reference": "2fe81680070043c4c80e7cedceb797e34f377bac", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/1a024b45369c9d55d76b6b8a241bd20c9ea1cbd8", + "reference": "1a024b45369c9d55d76b6b8a241bd20c9ea1cbd8", "shasum": "" }, "require": { @@ -2482,7 +2482,7 @@ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v4.4.30" + "source": "https://github.com/symfony/event-dispatcher/tree/v4.4.34" }, "funding": [ { @@ -2498,20 +2498,20 @@ "type": "tidelift" } ], - "time": "2021-08-04T20:31:23+00:00" + "time": "2021-11-15T14:42:25+00:00" }, { "name": "symfony/http-client", - "version": "v4.4.33", + "version": "v4.4.35", "source": { "type": "git", "url": "https://github.com/symfony/http-client.git", - "reference": "9a5fdf129b522a06a46d13400500d326c41d8a73" + "reference": "6ed0c02fdc21a76966f19b9000de18e688d9ca68" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client/zipball/9a5fdf129b522a06a46d13400500d326c41d8a73", - "reference": "9a5fdf129b522a06a46d13400500d326c41d8a73", + "url": "https://api.github.com/repos/symfony/http-client/zipball/6ed0c02fdc21a76966f19b9000de18e688d9ca68", + "reference": "6ed0c02fdc21a76966f19b9000de18e688d9ca68", "shasum": "" }, "require": { @@ -2563,7 +2563,7 @@ "description": "Provides powerful methods to fetch HTTP resources synchronously or asynchronously", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-client/tree/v4.4.33" + "source": "https://github.com/symfony/http-client/tree/v4.4.35" }, "funding": [ { @@ -2579,7 +2579,7 @@ "type": "tidelift" } ], - "time": "2021-10-18T16:39:13+00:00" + "time": "2021-11-22T21:43:45+00:00" }, { "name": "symfony/polyfill-ctype", @@ -3064,16 +3064,16 @@ }, { "name": "symfony/process", - "version": "v4.4.30", + "version": "v4.4.35", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "13d3161ef63a8ec21eeccaaf9a4d7f784a87a97d" + "reference": "c2098705326addae6e6742151dfade47ac71da1b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/13d3161ef63a8ec21eeccaaf9a4d7f784a87a97d", - "reference": "13d3161ef63a8ec21eeccaaf9a4d7f784a87a97d", + "url": "https://api.github.com/repos/symfony/process/zipball/c2098705326addae6e6742151dfade47ac71da1b", + "reference": "c2098705326addae6e6742151dfade47ac71da1b", "shasum": "" }, "require": { @@ -3106,7 +3106,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v4.4.30" + "source": "https://github.com/symfony/process/tree/v4.4.35" }, "funding": [ { @@ -3122,20 +3122,20 @@ "type": "tidelift" } ], - "time": "2021-08-04T20:31:23+00:00" + "time": "2021-11-22T22:36:24+00:00" }, { "name": "symfony/var-dumper", - "version": "v4.4.33", + "version": "v4.4.34", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "50286e2b7189bfb4f419c0731e86632cddf7c5ee" + "reference": "2d0c056b2faaa3d785bdbd5adecc593a5be9c16e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/50286e2b7189bfb4f419c0731e86632cddf7c5ee", - "reference": "50286e2b7189bfb4f419c0731e86632cddf7c5ee", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/2d0c056b2faaa3d785bdbd5adecc593a5be9c16e", + "reference": "2d0c056b2faaa3d785bdbd5adecc593a5be9c16e", "shasum": "" }, "require": { @@ -3195,7 +3195,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v4.4.33" + "source": "https://github.com/symfony/var-dumper/tree/v4.4.34" }, "funding": [ { @@ -3211,20 +3211,20 @@ "type": "tidelift" } ], - "time": "2021-10-25T20:24:58+00:00" + "time": "2021-11-12T10:50:54+00:00" }, { "name": "symfony/yaml", - "version": "v4.4.29", + "version": "v4.4.34", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "3abcc4db06d4e776825eaa3ed8ad924d5bc7432a" + "reference": "2c309e258adeb9970229042be39b360d34986fad" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/3abcc4db06d4e776825eaa3ed8ad924d5bc7432a", - "reference": "3abcc4db06d4e776825eaa3ed8ad924d5bc7432a", + "url": "https://api.github.com/repos/symfony/yaml/zipball/2c309e258adeb9970229042be39b360d34986fad", + "reference": "2c309e258adeb9970229042be39b360d34986fad", "shasum": "" }, "require": { @@ -3266,7 +3266,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v4.4.29" + "source": "https://github.com/symfony/yaml/tree/v4.4.34" }, "funding": [ { @@ -3282,7 +3282,7 @@ "type": "tidelift" } ], - "time": "2021-07-27T16:19:30+00:00" + "time": "2021-11-18T18:49:23+00:00" }, { "name": "twig/twig", @@ -4675,16 +4675,16 @@ }, { "name": "phpstan/phpstan", - "version": "1.1.2", + "version": "1.2.0", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "bcea0ae85868a89d5789c75f012c93129f842934" + "reference": "cbe085f9fdead5b6d62e4c022ca52dc9427a10ee" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/bcea0ae85868a89d5789c75f012c93129f842934", - "reference": "bcea0ae85868a89d5789c75f012c93129f842934", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/cbe085f9fdead5b6d62e4c022ca52dc9427a10ee", + "reference": "cbe085f9fdead5b6d62e4c022ca52dc9427a10ee", "shasum": "" }, "require": { @@ -4700,7 +4700,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0-dev" + "dev-master": "1.2-dev" } }, "autoload": { @@ -4715,7 +4715,7 @@ "description": "PHPStan - PHP Static Analysis Tool", "support": { "issues": "https://github.com/phpstan/phpstan/issues", - "source": "https://github.com/phpstan/phpstan/tree/1.1.2" + "source": "https://github.com/phpstan/phpstan/tree/1.2.0" }, "funding": [ { @@ -4735,7 +4735,7 @@ "type": "tidelift" } ], - "time": "2021-11-09T12:41:09+00:00" + "time": "2021-11-18T14:09:01+00:00" }, { "name": "phpstan/phpstan-deprecation-rules", @@ -4789,16 +4789,16 @@ }, { "name": "phpunit/php-code-coverage", - "version": "9.2.8", + "version": "9.2.9", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "cf04e88a2e3c56fc1a65488afd493325b4c1bc3e" + "reference": "f301eb1453c9e7a1bc912ee8b0ea9db22c60223b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/cf04e88a2e3c56fc1a65488afd493325b4c1bc3e", - "reference": "cf04e88a2e3c56fc1a65488afd493325b4c1bc3e", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/f301eb1453c9e7a1bc912ee8b0ea9db22c60223b", + "reference": "f301eb1453c9e7a1bc912ee8b0ea9db22c60223b", "shasum": "" }, "require": { @@ -4854,7 +4854,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.8" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.9" }, "funding": [ { @@ -4862,7 +4862,7 @@ "type": "github" } ], - "time": "2021-10-30T08:01:38+00:00" + "time": "2021-11-19T15:21:02+00:00" }, { "name": "phpunit/php-file-iterator", @@ -6364,16 +6364,16 @@ }, { "name": "symfony/deprecation-contracts", - "version": "v2.4.0", + "version": "v2.5.0", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "5f38c8804a9e97d23e0c8d63341088cd8a22d627" + "reference": "6f981ee24cf69ee7ce9736146d1c57c2780598a8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/5f38c8804a9e97d23e0c8d63341088cd8a22d627", - "reference": "5f38c8804a9e97d23e0c8d63341088cd8a22d627", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/6f981ee24cf69ee7ce9736146d1c57c2780598a8", + "reference": "6f981ee24cf69ee7ce9736146d1c57c2780598a8", "shasum": "" }, "require": { @@ -6382,7 +6382,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "2.4-dev" + "dev-main": "2.5-dev" }, "thanks": { "name": "symfony/contracts", @@ -6411,7 +6411,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v2.4.0" + "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.0" }, "funding": [ { @@ -6427,7 +6427,7 @@ "type": "tidelift" } ], - "time": "2021-03-23T23:28:01+00:00" + "time": "2021-07-12T14:48:14+00:00" }, { "name": "symfony/dom-crawler", @@ -6693,5 +6693,5 @@ "platform-overrides": { "php": "7.3.6" }, - "plugin-api-version": "2.1.0" + "plugin-api-version": "2.0.0" } From b7ab1df4e317332e4911ca157704bc3862e387a2 Mon Sep 17 00:00:00 2001 From: Matias Griese Date: Thu, 25 Nov 2021 21:57:04 +0200 Subject: [PATCH 06/83] Toolbox update --- composer.lock | 32 +++++++++++++++++--------------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/composer.lock b/composer.lock index b08f93f244..8b83cf31ee 100644 --- a/composer.lock +++ b/composer.lock @@ -2123,16 +2123,16 @@ }, { "name": "rockettheme/toolbox", - "version": "1.5.10", + "version": "1.5.11", "source": { "type": "git", "url": "https://github.com/rockettheme/toolbox.git", - "reference": "d9738de013fa12df77754a0f11dded220b246efb" + "reference": "ea23368c1bf635981c7b33babd842a6236befd86" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/rockettheme/toolbox/zipball/d9738de013fa12df77754a0f11dded220b246efb", - "reference": "d9738de013fa12df77754a0f11dded220b246efb", + "url": "https://api.github.com/repos/rockettheme/toolbox/zipball/ea23368c1bf635981c7b33babd842a6236befd86", + "reference": "ea23368c1bf635981c7b33babd842a6236befd86", "shasum": "" }, "require": { @@ -2140,12 +2140,14 @@ "php": ">=5.6.0", "pimple/pimple": "~3.0", "symfony/event-dispatcher": "^3.4|^4.0", + "symfony/polyfill-php80": "^1.23", + "symfony/polyfill-php81": "^1.23", "symfony/yaml": "^3.4|^4.0" }, "require-dev": { - "phpstan/phpstan": "^0.12", - "phpstan/phpstan-deprecation-rules": "^0.12", - "phpunit/phpunit": "~7.0" + "phpstan/phpstan": "^1.0", + "phpstan/phpstan-deprecation-rules": "^1.0", + "phpunit/phpunit": "~8.0" }, "type": "library", "autoload": { @@ -2173,9 +2175,9 @@ ], "support": { "issues": "https://github.com/rockettheme/toolbox/issues", - "source": "https://github.com/rockettheme/toolbox/tree/1.5.10" + "source": "https://github.com/rockettheme/toolbox/tree/1.5.11" }, - "time": "2021-09-29T16:50:13+00:00" + "time": "2021-11-25T19:43:12+00:00" }, { "name": "seld/cli-prompt", @@ -3286,16 +3288,16 @@ }, { "name": "twig/twig", - "version": "v1.44.5", + "version": "v1.44.6", "source": { "type": "git", "url": "https://github.com/twigphp/Twig.git", - "reference": "dd4353357c5a116322e92a00d16043a31881a81e" + "reference": "ae39480f010ef88adc7938503c9b02d3baf2f3b3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/dd4353357c5a116322e92a00d16043a31881a81e", - "reference": "dd4353357c5a116322e92a00d16043a31881a81e", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/ae39480f010ef88adc7938503c9b02d3baf2f3b3", + "reference": "ae39480f010ef88adc7938503c9b02d3baf2f3b3", "shasum": "" }, "require": { @@ -3348,7 +3350,7 @@ ], "support": { "issues": "https://github.com/twigphp/Twig/issues", - "source": "https://github.com/twigphp/Twig/tree/v1.44.5" + "source": "https://github.com/twigphp/Twig/tree/v1.44.6" }, "funding": [ { @@ -3360,7 +3362,7 @@ "type": "tidelift" } ], - "time": "2021-09-17T08:35:19+00:00" + "time": "2021-11-25T13:31:46+00:00" }, { "name": "willdurand/negotiation", From 8d04330dc5f183c01092503fc91ce2dc481350e3 Mon Sep 17 00:00:00 2001 From: Matias Griese Date: Tue, 30 Nov 2021 13:56:36 +0200 Subject: [PATCH 07/83] Upgraded --- CHANGELOG.md | 1 + bin/composer.phar | Bin 2205196 -> 2291189 bytes 2 files changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2b270d807d..4b8e2b1838 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ * Made `Grav::redirect()` to accept `Route` class 2. [](#improved) * Upgraded vendor libs for PHP 8.1 compatibility + * Upgraded to **composer v2.1.14** for PHP 8.1 compatibility * Added third `$name` parameter to `Blueprint::flattenData()` method, useful for flattening repeating data # v1.7.25 diff --git a/bin/composer.phar b/bin/composer.phar index 3791ce36ed26e033e485226ed288050ead25032b..f0461904b59bf1fb3f0991c4b79bb066828338dc 100755 GIT binary patch delta 132308 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 delta 85578 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 Date: Tue, 30 Nov 2021 14:09:14 +0200 Subject: [PATCH 08/83] Fixed phpstan issue --- system/src/Grav/Common/Grav.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/system/src/Grav/Common/Grav.php b/system/src/Grav/Common/Grav.php index df0fc301e5..773bfd2274 100644 --- a/system/src/Grav/Common/Grav.php +++ b/system/src/Grav/Common/Grav.php @@ -51,6 +51,7 @@ use Grav\Framework\RequestHandler\RequestHandler; use Grav\Framework\Route\Route; use Grav\Framework\Session\Messages; +use InvalidArgumentException; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use RocketTheme\Toolbox\Event\Event; @@ -460,6 +461,8 @@ public function getRedirectResponse($route, $code = null): ResponseInterface } } elseif ($route instanceof Route) { $url = $route->toString(true); + } else { + throw new InvalidArgumentException('Bad $route'); } if ($code < 300 || $code > 399) { From 8256af5cfab6235fa609f91013026b6e86cbd89b Mon Sep 17 00:00:00 2001 From: Matias Griese Date: Tue, 30 Nov 2021 14:49:50 +0200 Subject: [PATCH 09/83] Fix some phpstan level 2 errors --- system/src/Grav/Common/Flex/Types/Pages/PageCollection.php | 1 + system/src/Grav/Common/Flex/Types/Pages/PageIndex.php | 1 + system/src/Grav/Common/Page/Collection.php | 1 + .../Grav/Common/Page/Interfaces/PageCollectionInterface.php | 5 +++++ 4 files changed, 8 insertions(+) diff --git a/system/src/Grav/Common/Flex/Types/Pages/PageCollection.php b/system/src/Grav/Common/Flex/Types/Pages/PageCollection.php index 7503653b8e..38b964edb1 100644 --- a/system/src/Grav/Common/Flex/Types/Pages/PageCollection.php +++ b/system/src/Grav/Common/Flex/Types/Pages/PageCollection.php @@ -35,6 +35,7 @@ * @package Grav\Plugin\FlexObjects\Types\GravPages * * @extends FlexPageCollection + * @implements PageCollectionInterface * * Incompatibilities with Grav\Common\Page\Collection: * $page = $collection->key() will not work at all diff --git a/system/src/Grav/Common/Flex/Types/Pages/PageIndex.php b/system/src/Grav/Common/Flex/Types/Pages/PageIndex.php index 5a7d773a47..98dd3e79a6 100644 --- a/system/src/Grav/Common/Flex/Types/Pages/PageIndex.php +++ b/system/src/Grav/Common/Flex/Types/Pages/PageIndex.php @@ -40,6 +40,7 @@ * @package Grav\Plugin\FlexObjects\Types\GravPages * * @extends FlexPageIndex + * @implements PageCollectionInterface * * @method PageIndex withModules(bool $bool = true) * @method PageIndex withPages(bool $bool = true) diff --git a/system/src/Grav/Common/Page/Collection.php b/system/src/Grav/Common/Page/Collection.php index 930aeda2bf..9b2fa6afee 100644 --- a/system/src/Grav/Common/Page/Collection.php +++ b/system/src/Grav/Common/Page/Collection.php @@ -27,6 +27,7 @@ /** * Class Collection * @package Grav\Common\Page + * @implements PageCollectionInterface */ class Collection extends Iterator implements PageCollectionInterface { diff --git a/system/src/Grav/Common/Page/Interfaces/PageCollectionInterface.php b/system/src/Grav/Common/Page/Interfaces/PageCollectionInterface.php index 50029118fb..3e7e29b4e9 100644 --- a/system/src/Grav/Common/Page/Interfaces/PageCollectionInterface.php +++ b/system/src/Grav/Common/Page/Interfaces/PageCollectionInterface.php @@ -19,6 +19,11 @@ /** * Interface PageCollectionInterface * @package Grav\Common\Page\Interfaces + * + * @template TKey of array-key + * @template T + * @extends Traversable + * @extends ArrayAccess */ interface PageCollectionInterface extends Traversable, ArrayAccess, Countable, Serializable { From a57c18f63fd0be2870aabde5d31286b34faa4d25 Mon Sep 17 00:00:00 2001 From: Matias Griese Date: Tue, 30 Nov 2021 15:26:21 +0200 Subject: [PATCH 10/83] Fixed some phpstan errors --- .../src/Grav/Common/Flex/Types/Pages/PageCollection.php | 8 ++++---- system/src/Grav/Common/Flex/Types/Pages/PageIndex.php | 2 ++ system/src/Grav/Common/Twig/Twig.php | 7 +++++-- system/src/Grav/Framework/Flex/FlexIndex.php | 1 - .../Twig/DeferredExtension/DeferredNodeVisitorCompat.php | 8 ++++++-- tests/phpstan/phpstan.neon | 1 - 6 files changed, 17 insertions(+), 10 deletions(-) diff --git a/system/src/Grav/Common/Flex/Types/Pages/PageCollection.php b/system/src/Grav/Common/Flex/Types/Pages/PageCollection.php index 38b964edb1..efa8321e56 100644 --- a/system/src/Grav/Common/Flex/Types/Pages/PageCollection.php +++ b/system/src/Grav/Common/Flex/Types/Pages/PageCollection.php @@ -47,10 +47,10 @@ * $collection->prev() does not rewind the internal pointer * AND most methods are immutable; they do not update the current collection, but return updated one * - * @method static shuffle() - * @method static select(array $keys) - * @method static unselect(array $keys) - * @method static createFrom(array $elements, string $keyField = null) + * @method PageCollection shuffle() + * @method PageCollection select(array $keys) + * @method PageCollection unselect(array $keys) + * @method PageCollection createFrom(array $elements, string $keyField = null) * @method PageIndex getIndex() */ class PageCollection extends FlexPageCollection implements PageCollectionInterface diff --git a/system/src/Grav/Common/Flex/Types/Pages/PageIndex.php b/system/src/Grav/Common/Flex/Types/Pages/PageIndex.php index 98dd3e79a6..d4ceb5ceb8 100644 --- a/system/src/Grav/Common/Flex/Types/Pages/PageIndex.php +++ b/system/src/Grav/Common/Flex/Types/Pages/PageIndex.php @@ -118,6 +118,8 @@ public function get($key) $element = $element->getTranslation(ltrim($params, '.')); } + \assert($element instanceof PageObject); + return $element; } diff --git a/system/src/Grav/Common/Twig/Twig.php b/system/src/Grav/Common/Twig/Twig.php index 19bad01b1c..1416dac853 100644 --- a/system/src/Grav/Common/Twig/Twig.php +++ b/system/src/Grav/Common/Twig/Twig.php @@ -33,6 +33,7 @@ use Twig\Extension\StringLoaderExtension; use Twig\Loader\ArrayLoader; use Twig\Loader\ChainLoader; +use Twig\Loader\ExistsLoaderInterface; use Twig\Loader\FilesystemLoader; use Twig\Profiler\Profile; use Twig\TwigFilter; @@ -160,7 +161,7 @@ public function init() $this->twig = new TwigEnvironment($loader_chain, $params); - $this->twig->registerUndefinedFunctionCallback(function ($name) use ($config) { + $this->twig->registerUndefinedFunctionCallback(function (string $name) use ($config) { $allowed = $config->get('system.twig.safe_functions'); if (is_array($allowed) && in_array($name, $allowed, true) && function_exists($name)) { return new TwigFunction($name, $name); @@ -184,7 +185,7 @@ public function init() return false; }); - $this->twig->registerUndefinedFilterCallback(function ($name) use ($config) { + $this->twig->registerUndefinedFilterCallback(function (string $name) use ($config) { $allowed = $config->get('system.twig.safe_filters'); if (is_array($allowed) && in_array($name, $allowed, true) && function_exists($name)) { return new TwigFilter($name, $name); @@ -514,6 +515,8 @@ public function getPageTwigTemplate($page, &$format = null) $twig_extension = $extension ? '.'. $extension .TWIG_EXT : TEMPLATE_EXT; $template_file = $this->template($page->template() . $twig_extension); + // TODO: no longer needed in Twig 3. + /** @var ExistsLoaderInterface $loader */ $loader = $this->twig->getLoader(); if ($loader->exists($template_file)) { // template.xxx.twig diff --git a/system/src/Grav/Framework/Flex/FlexIndex.php b/system/src/Grav/Framework/Flex/FlexIndex.php index 3ce0a46c48..333b499f00 100644 --- a/system/src/Grav/Framework/Flex/FlexIndex.php +++ b/system/src/Grav/Framework/Flex/FlexIndex.php @@ -164,7 +164,6 @@ public function sort(array $orderings) return $this->orderBy($orderings); } - /** * {@inheritdoc} * @see FlexCollectionInterface::filterBy() diff --git a/system/src/Twig/DeferredExtension/DeferredNodeVisitorCompat.php b/system/src/Twig/DeferredExtension/DeferredNodeVisitorCompat.php index 8c441bb9a4..da5ff1add0 100644 --- a/system/src/Twig/DeferredExtension/DeferredNodeVisitorCompat.php +++ b/system/src/Twig/DeferredExtension/DeferredNodeVisitorCompat.php @@ -22,16 +22,18 @@ final class DeferredNodeVisitorCompat implements NodeVisitorInterface { private $hasDeferred = false; - public function enterNode(\Twig_NodeInterface $node, Environment $env) : Node + public function enterNode(\Twig_NodeInterface $node, Environment $env): Node { if (!$this->hasDeferred && $node instanceof DeferredBlockNode) { $this->hasDeferred = true; } + \assert($node instanceof Node); + return $node; } - public function leaveNode(\Twig_NodeInterface $node, Environment $env) : ?Node + public function leaveNode(\Twig_NodeInterface $node, Environment $env): ?Node { if ($this->hasDeferred && $node instanceof ModuleNode) { $node->setNode('constructor_end', new Node([new DeferredExtensionNode(), $node->getNode('constructor_end')])); @@ -39,6 +41,8 @@ public function leaveNode(\Twig_NodeInterface $node, Environment $env) : ?Node $this->hasDeferred = false; } + \assert($node instanceof Node); + return $node; } diff --git a/tests/phpstan/phpstan.neon b/tests/phpstan/phpstan.neon index 12dc402a2a..aec8c4657d 100644 --- a/tests/phpstan/phpstan.neon +++ b/tests/phpstan/phpstan.neon @@ -57,7 +57,6 @@ parameters: - message: '#Cannot call method path\(\) on string#' path: '*/system/src/Grav/Common/Page/Media.php' - - '"FlexCollectionInterface::filterBy\(\) invoked with 2 parameters"' # TODO: system.twig.umask_fix will not work with Twig 2 anymore - From d4a23c1fbe5fbef9dcf2c2bf4740babc3272da44 Mon Sep 17 00:00:00 2001 From: Matias Griese Date: Tue, 30 Nov 2021 18:54:03 +0200 Subject: [PATCH 11/83] Fixed assert --- system/src/Grav/Common/Flex/Types/Pages/PageIndex.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/src/Grav/Common/Flex/Types/Pages/PageIndex.php b/system/src/Grav/Common/Flex/Types/Pages/PageIndex.php index d4ceb5ceb8..cfb8295ccb 100644 --- a/system/src/Grav/Common/Flex/Types/Pages/PageIndex.php +++ b/system/src/Grav/Common/Flex/Types/Pages/PageIndex.php @@ -118,7 +118,7 @@ public function get($key) $element = $element->getTranslation(ltrim($params, '.')); } - \assert($element instanceof PageObject); + \assert(null === $element || $element instanceof PageObject); return $element; } From d220812f5e999a2f6ada59625226916f3b831394 Mon Sep 17 00:00:00 2001 From: Matias Griese Date: Tue, 30 Nov 2021 18:59:44 +0200 Subject: [PATCH 12/83] Minor code improvements --- system/src/Grav/Common/Helpers/LogViewer.php | 2 +- .../src/Grav/Framework/Acl/PermissionsReader.php | 10 ++++++---- .../src/Grav/Framework/Cache/Adapter/FileCache.php | 2 +- system/src/Grav/Framework/File/AbstractFile.php | 2 +- .../Grav/Framework/File/Formatter/IniFormatter.php | 3 ++- .../Framework/File/Formatter/MarkdownFormatter.php | 5 +++-- system/src/Grav/Framework/Flex/FlexCollection.php | 2 +- .../Flex/Interfaces/FlexCollectionInterface.php | 2 +- .../Flex/Interfaces/FlexFormInterface.php | 5 +++++ system/src/Grav/Framework/Form/FormFlashFile.php | 3 ++- .../Media/Interfaces/MediaCollectionInterface.php | 6 +++++- .../Object/Base/ObjectCollectionTrait.php | 4 +++- .../Object/Collection/ObjectExpressionVisitor.php | 5 +++-- system/src/Grav/Framework/Psr7/ServerRequest.php | 14 ++------------ system/src/Grav/Framework/Route/Route.php | 3 ++- .../DeferredNodeVisitorCompat.php | 13 +++++++++++++ 16 files changed, 51 insertions(+), 30 deletions(-) diff --git a/system/src/Grav/Common/Helpers/LogViewer.php b/system/src/Grav/Common/Helpers/LogViewer.php index 187828ae31..f2d7d43de1 100644 --- a/system/src/Grav/Common/Helpers/LogViewer.php +++ b/system/src/Grav/Common/Helpers/LogViewer.php @@ -145,7 +145,7 @@ public function parse($line) 'logger' => $data['logger'], 'level' => $data['level'], 'message' => $data['message'], - 'trace' => isset($data['trace']) ? $this->parseTrace($data['trace']) : null, + 'trace' => isset($data['trace']) ? self::parseTrace($data['trace']) : null, 'context' => json_decode($data['context'], true), 'extra' => json_decode($data['extra'], true) ]; diff --git a/system/src/Grav/Framework/Acl/PermissionsReader.php b/system/src/Grav/Framework/Acl/PermissionsReader.php index b157a5d3bd..8820502167 100644 --- a/system/src/Grav/Framework/Acl/PermissionsReader.php +++ b/system/src/Grav/Framework/Acl/PermissionsReader.php @@ -62,12 +62,14 @@ public static function read(array $actions, string $prefix = ''): array { $list = []; foreach ($actions as $name => $action) { - $prefixNname = $prefix . $name; - $list[$prefixNname] = null; + $prefixName = $prefix . $name; + $list[$prefixName] = null; // Support nested sets of actions. if (isset($action['actions']) && is_array($action['actions'])) { - $list += static::read($action['actions'], "{$prefixNname}."); + $innerList = static::read($action['actions'], "{$prefixName}."); + + $list += $innerList; } unset($action['actions']); @@ -76,7 +78,7 @@ public static function read(array $actions, string $prefix = ''): array $action = static::addDefaults($action); // Build flat list of actions. - $list[$prefixNname] = $action; + $list[$prefixName] = $action; } return $list; diff --git a/system/src/Grav/Framework/Cache/Adapter/FileCache.php b/system/src/Grav/Framework/Cache/Adapter/FileCache.php index 1995e159da..dc28afcff2 100644 --- a/system/src/Grav/Framework/Cache/Adapter/FileCache.php +++ b/system/src/Grav/Framework/Cache/Adapter/FileCache.php @@ -156,7 +156,7 @@ protected function getFile($key, $mkdir = false) */ protected function initFileCache($namespace, $directory) { - if (!isset($directory[0])) { + if ($directory === '') { $directory = sys_get_temp_dir() . '/grav-cache'; } else { $directory = realpath($directory) ?: $directory; diff --git a/system/src/Grav/Framework/File/AbstractFile.php b/system/src/Grav/Framework/File/AbstractFile.php index b82bb33d2f..0c78dd3035 100644 --- a/system/src/Grav/Framework/File/AbstractFile.php +++ b/system/src/Grav/Framework/File/AbstractFile.php @@ -199,7 +199,7 @@ public function lock(bool $block = true): bool $lock = $block ? LOCK_EX : LOCK_EX | LOCK_NB; // Some filesystems do not support file locks, only fail if another process holds the lock. - $this->locked = flock($this->handle, $lock, $wouldblock) || !$wouldblock; + $this->locked = flock($this->handle, $lock, $wouldBlock) || !$wouldBlock; return $this->locked; } diff --git a/system/src/Grav/Framework/File/Formatter/IniFormatter.php b/system/src/Grav/Framework/File/Formatter/IniFormatter.php index ec169598e6..2e7404b9c2 100644 --- a/system/src/Grav/Framework/File/Formatter/IniFormatter.php +++ b/system/src/Grav/Framework/File/Formatter/IniFormatter.php @@ -12,6 +12,7 @@ namespace Grav\Framework\File\Formatter; use Grav\Framework\File\Interfaces\FileFormatterInterface; +use RuntimeException; /** * Class IniFormatter @@ -59,7 +60,7 @@ public function decode($data): array $decoded = @parse_ini_string($data); if ($decoded === false) { - throw new \RuntimeException('Decoding INI failed'); + throw new RuntimeException('Decoding INI failed'); } return $decoded; diff --git a/system/src/Grav/Framework/File/Formatter/MarkdownFormatter.php b/system/src/Grav/Framework/File/Formatter/MarkdownFormatter.php index 8a624df557..a30d7a906a 100644 --- a/system/src/Grav/Framework/File/Formatter/MarkdownFormatter.php +++ b/system/src/Grav/Framework/File/Formatter/MarkdownFormatter.php @@ -12,6 +12,7 @@ namespace Grav\Framework\File\Formatter; use Grav\Framework\File\Interfaces\FileFormatterInterface; +use RuntimeException; /** * Class MarkdownFormatter @@ -99,7 +100,7 @@ public function encode($data): string // Normalize line endings to Unix style. $encoded = preg_replace("/(\r\n|\r)/u", "\n", $encoded); if (null === $encoded) { - throw new \RuntimeException('Encoding markdown failed'); + throw new RuntimeException('Encoding markdown failed'); } return $encoded; @@ -126,7 +127,7 @@ public function decode($data): array // Normalize line endings to Unix style. $data = preg_replace("/(\r\n|\r)/u", "\n", $data); if (null === $data) { - throw new \RuntimeException('Decoding markdown failed'); + throw new RuntimeException('Decoding markdown failed'); } // Parse header. diff --git a/system/src/Grav/Framework/Flex/FlexCollection.php b/system/src/Grav/Framework/Flex/FlexCollection.php index 54e06654a9..c76c3061b5 100644 --- a/system/src/Grav/Framework/Flex/FlexCollection.php +++ b/system/src/Grav/Framework/Flex/FlexCollection.php @@ -460,7 +460,7 @@ public function setFlexDirectory(FlexDirectory $type) * @param string $key * @return array */ - public function getMetaData(string $key): array + public function getMetaData($key): array { $object = $this->get($key); diff --git a/system/src/Grav/Framework/Flex/Interfaces/FlexCollectionInterface.php b/system/src/Grav/Framework/Flex/Interfaces/FlexCollectionInterface.php index 16be3d5d6a..2510e5de7a 100644 --- a/system/src/Grav/Framework/Flex/Interfaces/FlexCollectionInterface.php +++ b/system/src/Grav/Framework/Flex/Interfaces/FlexCollectionInterface.php @@ -140,5 +140,5 @@ public function getCollection(); * @param string $key Key. * @return array */ - public function getMetaData(string $key): array; + public function getMetaData($key): array; } diff --git a/system/src/Grav/Framework/Flex/Interfaces/FlexFormInterface.php b/system/src/Grav/Framework/Flex/Interfaces/FlexFormInterface.php index 32dab19680..eaafaf01c7 100644 --- a/system/src/Grav/Framework/Flex/Interfaces/FlexFormInterface.php +++ b/system/src/Grav/Framework/Flex/Interfaces/FlexFormInterface.php @@ -43,4 +43,9 @@ public function getFileUploadAjaxRoute(); * @return Route|null Returns Route object or null if file uploads are not enabled. */ public function getFileDeleteAjaxRoute($field, $filename); + +// /** +// * @return FlexObjectInterface +// */ +// public function getObject(); } diff --git a/system/src/Grav/Framework/Form/FormFlashFile.php b/system/src/Grav/Framework/Form/FormFlashFile.php index dc510e28f9..51c318346e 100644 --- a/system/src/Grav/Framework/Form/FormFlashFile.php +++ b/system/src/Grav/Framework/Form/FormFlashFile.php @@ -11,6 +11,7 @@ use Grav\Framework\Psr7\Stream; use InvalidArgumentException; +use JsonSerializable; use Psr\Http\Message\StreamInterface; use Psr\Http\Message\UploadedFileInterface; use RuntimeException; @@ -23,7 +24,7 @@ * Class FormFlashFile * @package Grav\Framework\Form */ -class FormFlashFile implements UploadedFileInterface, \JsonSerializable +class FormFlashFile implements UploadedFileInterface, JsonSerializable { /** @var string */ private $field; diff --git a/system/src/Grav/Framework/Media/Interfaces/MediaCollectionInterface.php b/system/src/Grav/Framework/Media/Interfaces/MediaCollectionInterface.php index a3587d8cb0..e763f42d27 100644 --- a/system/src/Grav/Framework/Media/Interfaces/MediaCollectionInterface.php +++ b/system/src/Grav/Framework/Media/Interfaces/MediaCollectionInterface.php @@ -9,9 +9,13 @@ namespace Grav\Framework\Media\Interfaces; +use ArrayAccess; +use Countable; +use Iterator; + /** * Class implements media collection interface. */ -interface MediaCollectionInterface extends \ArrayAccess, \Countable, \Iterator +interface MediaCollectionInterface extends ArrayAccess, Countable, Iterator { } diff --git a/system/src/Grav/Framework/Object/Base/ObjectCollectionTrait.php b/system/src/Grav/Framework/Object/Base/ObjectCollectionTrait.php index 3c172fecd4..c4c4705394 100644 --- a/system/src/Grav/Framework/Object/Base/ObjectCollectionTrait.php +++ b/system/src/Grav/Framework/Object/Base/ObjectCollectionTrait.php @@ -11,6 +11,7 @@ use Grav\Framework\Compat\Serializable; use Grav\Framework\Object\Interfaces\ObjectInterface; +use InvalidArgumentException; use function call_user_func_array; use function get_class; use function is_callable; @@ -51,6 +52,7 @@ public function getType($prefix = true) } $class = get_class($this); + return $type . strtolower(substr($class, strrpos($class, '\\') + 1)); } @@ -167,7 +169,7 @@ protected function doSerialize() protected function doUnserialize(array $data) { if (!isset($data['key'], $data['type'], $data['elements']) || $data['type'] !== $this->getType()) { - throw new \InvalidArgumentException("Cannot unserialize '{$this->getType()}': Bad data"); + throw new InvalidArgumentException("Cannot unserialize '{$this->getType()}': Bad data"); } $this->setKey($data['key']); diff --git a/system/src/Grav/Framework/Object/Collection/ObjectExpressionVisitor.php b/system/src/Grav/Framework/Object/Collection/ObjectExpressionVisitor.php index d8f152431a..eaf589d867 100644 --- a/system/src/Grav/Framework/Object/Collection/ObjectExpressionVisitor.php +++ b/system/src/Grav/Framework/Object/Collection/ObjectExpressionVisitor.php @@ -9,6 +9,7 @@ namespace Grav\Framework\Object\Collection; +use ArrayAccess; use Closure; use Doctrine\Common\Collections\Expr\ClosureExpressionVisitor; use Doctrine\Common\Collections\Expr\Comparison; @@ -42,7 +43,7 @@ public static function getObjectFieldValue($object, $field) $field = rtrim($field, ')'); } - if (isset($object[$field])) { + if ($object instanceof ArrayAccess && isset($object[$field])) { $value = $object[$field]; } else { $accessors = array('', 'get', 'is'); @@ -233,7 +234,7 @@ public function walkComparison(Comparison $comparison) }; default: - throw new RuntimeException("Unknown comparison operator: " . $comparison->getOperator()); + throw new RuntimeException('Unknown comparison operator: ' . $comparison->getOperator()); } } } diff --git a/system/src/Grav/Framework/Psr7/ServerRequest.php b/system/src/Grav/Framework/Psr7/ServerRequest.php index 40848345bf..692e891a41 100644 --- a/system/src/Grav/Framework/Psr7/ServerRequest.php +++ b/system/src/Grav/Framework/Psr7/ServerRequest.php @@ -98,13 +98,8 @@ public function getContentLength(): ?int public function getCookieParam($key, $default = null) { $cookies = $this->getRequest()->getCookieParams(); - $result = $default; - - if (isset($cookies[$key])) { - $result = $cookies[$key]; - } - return $result; + return $cookies[$key] ?? $default; } /** @@ -238,13 +233,8 @@ public function getParsedBodyParam($key, $default = null) public function getQueryParam($key, $default = null) { $getParams = $this->getQueryParams(); - $result = $default; - if (isset($getParams[$key])) { - $result = $getParams[$key]; - } - - return $result; + return $getParams[$key] ?? $default; } /** diff --git a/system/src/Grav/Framework/Route/Route.php b/system/src/Grav/Framework/Route/Route.php index f9a7fa7222..078c091580 100644 --- a/system/src/Grav/Framework/Route/Route.php +++ b/system/src/Grav/Framework/Route/Route.php @@ -9,6 +9,7 @@ namespace Grav\Framework\Route; +use Grav\Framework\Uri\Uri; use Grav\Framework\Uri\UriFactory; use InvalidArgumentException; use function array_slice; @@ -318,7 +319,7 @@ public function withoutQueryParams() } /** - * @return \Grav\Framework\Uri\Uri + * @return Uri */ public function getUri() { diff --git a/system/src/Twig/DeferredExtension/DeferredNodeVisitorCompat.php b/system/src/Twig/DeferredExtension/DeferredNodeVisitorCompat.php index da5ff1add0..1ff7fd421d 100644 --- a/system/src/Twig/DeferredExtension/DeferredNodeVisitorCompat.php +++ b/system/src/Twig/DeferredExtension/DeferredNodeVisitorCompat.php @@ -22,6 +22,11 @@ final class DeferredNodeVisitorCompat implements NodeVisitorInterface { private $hasDeferred = false; + /** + * @param \Twig_NodeInterface $node + * @param Environment $env + * @return Node + */ public function enterNode(\Twig_NodeInterface $node, Environment $env): Node { if (!$this->hasDeferred && $node instanceof DeferredBlockNode) { @@ -33,6 +38,11 @@ public function enterNode(\Twig_NodeInterface $node, Environment $env): Node return $node; } + /** + * @param \Twig_NodeInterface $node + * @param Environment $env + * @return Node|null + */ public function leaveNode(\Twig_NodeInterface $node, Environment $env): ?Node { if ($this->hasDeferred && $node instanceof ModuleNode) { @@ -46,6 +56,9 @@ public function leaveNode(\Twig_NodeInterface $node, Environment $env): ?Node return $node; } + /** + * @return int + */ public function getPriority() : int { return 0; From e4f79dbfce825c7de1ed9ab27363a67ddd6d8769 Mon Sep 17 00:00:00 2001 From: Matias Griese Date: Tue, 30 Nov 2021 19:02:42 +0200 Subject: [PATCH 13/83] Minor fixes --- system/src/Grav/Common/Assets/Pipeline.php | 2 +- system/src/Grav/Common/Backup/Backups.php | 2 +- system/src/Grav/Common/Data/Blueprint.php | 2 +- system/src/Grav/Common/Data/Validation.php | 2 +- system/src/Grav/Common/Filesystem/Folder.php | 5 +++-- .../Collection/AbstractIndexCollection.php | 14 ++++++++------ system/src/Grav/Framework/File/AbstractFile.php | 3 ++- .../Framework/File/Formatter/YamlFormatter.php | 4 +++- 8 files changed, 20 insertions(+), 14 deletions(-) diff --git a/system/src/Grav/Common/Assets/Pipeline.php b/system/src/Grav/Common/Assets/Pipeline.php index 948104ab94..0135e89bd0 100644 --- a/system/src/Grav/Common/Assets/Pipeline.php +++ b/system/src/Grav/Common/Assets/Pipeline.php @@ -122,7 +122,7 @@ public function renderCss($assets, $group, $attributes = []) // Compute uid based on assets and timestamp $json_assets = json_encode($assets); - $uid = md5($json_assets . $this->css_minify . $this->css_rewrite . $group); + $uid = md5($json_assets . (int)$this->css_minify . (int)$this->css_rewrite . $group); $file = $uid . '.css'; $relative_path = "{$this->base_url}{$this->assets_url}/{$file}"; diff --git a/system/src/Grav/Common/Backup/Backups.php b/system/src/Grav/Common/Backup/Backups.php index 4680f85462..158e12e2fa 100644 --- a/system/src/Grav/Common/Backup/Backups.php +++ b/system/src/Grav/Common/Backup/Backups.php @@ -145,7 +145,7 @@ public static function getTotalBackupsSize() { $backups = static::getAvailableBackups(); - return array_sum(array_column($backups, 'size')); + return $backups ? array_sum(array_column($backups, 'size')) : 0; } /** diff --git a/system/src/Grav/Common/Data/Blueprint.php b/system/src/Grav/Common/Data/Blueprint.php index df434267f0..e4f841921c 100644 --- a/system/src/Grav/Common/Data/Blueprint.php +++ b/system/src/Grav/Common/Data/Blueprint.php @@ -99,7 +99,7 @@ public function setTypes(array $types) */ public function getDefaultValue(string $name) { - $path = explode('.', $name) ?: []; + $path = explode('.', $name); $current = $this->getDefaults(); foreach ($path as $field) { diff --git a/system/src/Grav/Common/Data/Validation.php b/system/src/Grav/Common/Data/Validation.php index bfb40578db..9c23f81c23 100644 --- a/system/src/Grav/Common/Data/Validation.php +++ b/system/src/Grav/Common/Data/Validation.php @@ -816,7 +816,7 @@ protected static function filterFlatten_array($value, $params, $field) { $value = static::filterArray($value, $params, $field); - return Utils::arrayUnflattenDotNotation($value); + return is_array($value) ? Utils::arrayUnflattenDotNotation($value) : null; } /** diff --git a/system/src/Grav/Common/Filesystem/Folder.php b/system/src/Grav/Common/Filesystem/Folder.php index ecbc6ceac1..6edd8e2e30 100644 --- a/system/src/Grav/Common/Filesystem/Folder.php +++ b/system/src/Grav/Common/Filesystem/Folder.php @@ -513,7 +513,7 @@ public static function countChildren($directory) } $directories = glob($directory . '/*', GLOB_ONLYDIR); - return count($directories); + return $directories ? count($directories) : false; } /** @@ -530,7 +530,8 @@ protected static function doDelete($folder, $include_target = true) } // Go through all items in filesystem and recursively remove everything. - $files = array_diff(scandir($folder, SCANDIR_SORT_NONE), array('.', '..')); + $files = scandir($folder, SCANDIR_SORT_NONE); + $files = $files ? array_diff($files, ['.', '..']) : []; foreach ($files as $file) { $path = "{$folder}/{$file}"; is_dir($path) ? self::doDelete($path) : @unlink($path); diff --git a/system/src/Grav/Framework/Collection/AbstractIndexCollection.php b/system/src/Grav/Framework/Collection/AbstractIndexCollection.php index 25d8672c0c..4974a3acfd 100644 --- a/system/src/Grav/Framework/Collection/AbstractIndexCollection.php +++ b/system/src/Grav/Framework/Collection/AbstractIndexCollection.php @@ -131,7 +131,7 @@ public function removeElement($element) { $key = $this->isAllowedElement($element) ? $this->getCurrentKey($element) : null; - if (!$key || !isset($this->entries[$key])) { + if (null !== $key || !isset($this->entries[$key])) { return false; } @@ -148,7 +148,7 @@ public function removeElement($element) #[\ReturnTypeWillChange] public function offsetExists($offset) { - return $this->containsKey($offset); + return $offset !== null ? $this->containsKey($offset) : false; } /** @@ -159,7 +159,7 @@ public function offsetExists($offset) #[\ReturnTypeWillChange] public function offsetGet($offset) { - return $this->get($offset); + return $offset !== null ? $this->get($offset) : null; } /** @@ -172,9 +172,9 @@ public function offsetSet($offset, $value) { if (null === $offset) { $this->add($value); + } else { + $this->set($offset, $value); } - - $this->set($offset, $value); } /** @@ -185,7 +185,9 @@ public function offsetSet($offset, $value) #[\ReturnTypeWillChange] public function offsetUnset($offset) { - $this->remove($offset); + if ($offset !== null) { + $this->remove($offset); + } } /** diff --git a/system/src/Grav/Framework/File/AbstractFile.php b/system/src/Grav/Framework/File/AbstractFile.php index 0c78dd3035..af9209c684 100644 --- a/system/src/Grav/Framework/File/AbstractFile.php +++ b/system/src/Grav/Framework/File/AbstractFile.php @@ -191,8 +191,9 @@ public function lock(bool $block = true): bool $this->handle = @fopen($this->filepath, 'cb+') ?: null; if (!$this->handle) { $error = error_get_last(); + $message = $error['message'] ?? 'Unknown error'; - throw new RuntimeException("Opening file for writing failed on error {$error['message']}"); + throw new RuntimeException("Opening file for writing failed on error {$message}"); } } diff --git a/system/src/Grav/Framework/File/Formatter/YamlFormatter.php b/system/src/Grav/Framework/File/Formatter/YamlFormatter.php index 32d4d296ae..3909f6e85a 100644 --- a/system/src/Grav/Framework/File/Formatter/YamlFormatter.php +++ b/system/src/Grav/Framework/File/Formatter/YamlFormatter.php @@ -107,7 +107,9 @@ public function decode($data): array $saved = @ini_get('yaml.decode_php'); @ini_set('yaml.decode_php', '0'); $decoded = @yaml_parse($data); - @ini_set('yaml.decode_php', $saved); + if ($saved !== false) { + @ini_set('yaml.decode_php', $saved); + } if ($decoded !== false) { return (array) $decoded; From c220b6e0c22c60cf5fcdf0cd39d566029c2c4bdb Mon Sep 17 00:00:00 2001 From: Matias Griese Date: Tue, 30 Nov 2021 19:08:49 +0200 Subject: [PATCH 14/83] `ControllerResponseTrait`: Redirect response should be json if the extension is .json --- .../Framework/Controller/Traits/ControllerResponseTrait.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/system/src/Grav/Framework/Controller/Traits/ControllerResponseTrait.php b/system/src/Grav/Framework/Controller/Traits/ControllerResponseTrait.php index afa08aa42e..36f5411af4 100644 --- a/system/src/Grav/Framework/Controller/Traits/ControllerResponseTrait.php +++ b/system/src/Grav/Framework/Controller/Traits/ControllerResponseTrait.php @@ -140,9 +140,9 @@ protected function createRedirectResponse(string $url, int $code = null): Respon $code = (int)$this->getConfig()->get('system.pages.redirect_default_code', 302); } + $ext = pathinfo($url, PATHINFO_EXTENSION); $accept = $this->getAccept(['application/json', 'text/html']); - - if ($accept === 'application/json') { + if ($ext === 'json' || $accept === 'application/json') { return $this->createJsonResponse(['code' => $code, 'status' => 'redirect', 'redirect' => $url]); } @@ -217,6 +217,7 @@ protected function getErrorJson(Throwable $e): array 'code' => $code, 'status' => 'error', 'message' => $message, + 'redirect' => null, 'error' => [ 'code' => $code, 'message' => $message From 4c3daf6e6f131fdf4ce6b019bfdd7f6c17f83d7a Mon Sep 17 00:00:00 2001 From: Matias Griese Date: Tue, 30 Nov 2021 21:20:17 +0200 Subject: [PATCH 15/83] PHP 8.1 return type fixes --- system/src/Grav/Common/Assets/BaseAsset.php | 1 + system/src/Grav/Common/Data/Data.php | 1 + .../Types/Users/Traits/UserObjectLegacyTrait.php | 1 + system/src/Grav/Common/GPM/Remote/Package.php | 1 + system/src/Grav/Common/Getters.php | 1 + system/src/Grav/Common/Page/Header.php | 1 + system/src/Grav/Common/Page/Medium/Link.php | 2 +- system/src/Grav/Common/Page/Page.php | 2 +- system/src/Grav/Common/User/DataUser/User.php | 1 + system/src/Grav/Framework/Acl/Permissions.php | 1 + .../Framework/Collection/AbstractIndexCollection.php | 3 +++ .../Framework/Collection/AbstractLazyCollection.php | 1 + .../Grav/Framework/Collection/ArrayCollection.php | 1 + system/src/Grav/Framework/Flex/FlexCollection.php | 1 + system/src/Grav/Framework/Flex/FlexObject.php | 1 + system/src/Grav/Framework/Form/FormFlashFile.php | 1 + .../Framework/Object/Base/ObjectCollectionTrait.php | 1 + .../src/Grav/Framework/Object/Base/ObjectTrait.php | 1 + .../Grav/Framework/Pagination/AbstractPagination.php | 1 + system/src/Grav/Framework/Session/Session.php | 1 + .../src/Grav/Framework/Session/SessionInterface.php | 1 + tests/phpstan/phpstan.neon | 12 ++++-------- 22 files changed, 27 insertions(+), 10 deletions(-) diff --git a/system/src/Grav/Common/Assets/BaseAsset.php b/system/src/Grav/Common/Assets/BaseAsset.php index a115ce9ec0..a80d9c6d9d 100644 --- a/system/src/Grav/Common/Assets/BaseAsset.php +++ b/system/src/Grav/Common/Assets/BaseAsset.php @@ -248,6 +248,7 @@ protected function buildLocalLink($asset) * * @return array */ + #[\ReturnTypeWillChange] public function jsonSerialize() { return ['type' => $this->getType(), 'elements' => $this->getElements()]; diff --git a/system/src/Grav/Common/Data/Data.php b/system/src/Grav/Common/Data/Data.php index 4de437dcb7..60ee9534d6 100644 --- a/system/src/Grav/Common/Data/Data.php +++ b/system/src/Grav/Common/Data/Data.php @@ -335,6 +335,7 @@ public function file(FileInterface $storage = null) /** * @return array */ + #[\ReturnTypeWillChange] public function jsonSerialize() { return $this->items; diff --git a/system/src/Grav/Common/Flex/Types/Users/Traits/UserObjectLegacyTrait.php b/system/src/Grav/Common/Flex/Types/Users/Traits/UserObjectLegacyTrait.php index b0fc0c4ca7..e2f87f7169 100644 --- a/system/src/Grav/Common/Flex/Types/Users/Traits/UserObjectLegacyTrait.php +++ b/system/src/Grav/Common/Flex/Types/Users/Traits/UserObjectLegacyTrait.php @@ -84,6 +84,7 @@ public function authorise($action) * @return int * @deprecated 1.6 Method makes no sense for user account. */ + #[\ReturnTypeWillChange] public function count() { user_error(__CLASS__ . '::' . __FUNCTION__ . '() is deprecated since Grav 1.6', E_USER_DEPRECATED); diff --git a/system/src/Grav/Common/GPM/Remote/Package.php b/system/src/Grav/Common/GPM/Remote/Package.php index c37d6a00d8..1e838053dc 100644 --- a/system/src/Grav/Common/GPM/Remote/Package.php +++ b/system/src/Grav/Common/GPM/Remote/Package.php @@ -32,6 +32,7 @@ public function __construct($package, $package_type = null) /** * @return array */ + #[\ReturnTypeWillChange] public function jsonSerialize() { return $this->data->toArray(); diff --git a/system/src/Grav/Common/Getters.php b/system/src/Grav/Common/Getters.php index 916d5249a2..10f4fdb7af 100644 --- a/system/src/Grav/Common/Getters.php +++ b/system/src/Grav/Common/Getters.php @@ -129,6 +129,7 @@ public function offsetUnset($offset) /** * @return int */ + #[\ReturnTypeWillChange] public function count() { if ($this->gettersVariable) { diff --git a/system/src/Grav/Common/Page/Header.php b/system/src/Grav/Common/Page/Header.php index 71c7b16c38..0ab9af4075 100644 --- a/system/src/Grav/Common/Page/Header.php +++ b/system/src/Grav/Common/Page/Header.php @@ -30,6 +30,7 @@ class Header implements ArrayAccess, ExportInterface, JsonSerializable /** * @return array */ + #[\ReturnTypeWillChange] public function jsonSerialize() { return $this->toArray(); diff --git a/system/src/Grav/Common/Page/Medium/Link.php b/system/src/Grav/Common/Page/Medium/Link.php index d576875739..e3c98a853e 100644 --- a/system/src/Grav/Common/Page/Medium/Link.php +++ b/system/src/Grav/Common/Page/Medium/Link.php @@ -28,7 +28,7 @@ class Link implements RenderableInterface, MediaLinkInterface /** @var array */ protected $attributes = []; - /** @var MediaObjectInterface */ + /** @var MediaObjectInterface|MediaLinkInterface */ protected $source; /** diff --git a/system/src/Grav/Common/Page/Page.php b/system/src/Grav/Common/Page/Page.php index 9e68a44f8f..f67212aeb4 100644 --- a/system/src/Grav/Common/Page/Page.php +++ b/system/src/Grav/Common/Page/Page.php @@ -84,7 +84,7 @@ class Page implements PageInterface protected $unpublish_date; /** @var string */ protected $slug; - /** @var string */ + /** @var string|null */ protected $route; /** @var string|null */ protected $raw_route; diff --git a/system/src/Grav/Common/User/DataUser/User.php b/system/src/Grav/Common/User/DataUser/User.php index 8fcdbbbd6d..0b8a53b9e3 100644 --- a/system/src/Grav/Common/User/DataUser/User.php +++ b/system/src/Grav/Common/User/DataUser/User.php @@ -295,6 +295,7 @@ public function authorise($action) * @return int * @deprecated 1.6 Method makes no sense for user account. */ + #[\ReturnTypeWillChange] public function count() { user_error(__CLASS__ . '::' . __FUNCTION__ . '() is deprecated since Grav 1.6', E_USER_DEPRECATED); diff --git a/system/src/Grav/Framework/Acl/Permissions.php b/system/src/Grav/Framework/Acl/Permissions.php index 037571675f..8372f725d0 100644 --- a/system/src/Grav/Framework/Acl/Permissions.php +++ b/system/src/Grav/Framework/Acl/Permissions.php @@ -206,6 +206,7 @@ public function count(): int /** * @return ArrayIterator|Traversable */ + #[\ReturnTypeWillChange] public function getIterator() { return new ArrayIterator($this->actions); diff --git a/system/src/Grav/Framework/Collection/AbstractIndexCollection.php b/system/src/Grav/Framework/Collection/AbstractIndexCollection.php index 4974a3acfd..c2f57f2c1a 100644 --- a/system/src/Grav/Framework/Collection/AbstractIndexCollection.php +++ b/system/src/Grav/Framework/Collection/AbstractIndexCollection.php @@ -257,6 +257,7 @@ public function getValues() /** * {@inheritDoc} */ + #[\ReturnTypeWillChange] public function count() { return count($this->entries); @@ -301,6 +302,7 @@ public function isEmpty() * * {@inheritDoc} */ + #[\ReturnTypeWillChange] public function getIterator() { return new ArrayIterator($this->loadElements()); @@ -468,6 +470,7 @@ public function __unserialize(array $data): void * * @return array */ + #[\ReturnTypeWillChange] public function jsonSerialize() { return $this->loadCollection()->jsonSerialize(); diff --git a/system/src/Grav/Framework/Collection/AbstractLazyCollection.php b/system/src/Grav/Framework/Collection/AbstractLazyCollection.php index 9afaab1315..d7e6f3191b 100644 --- a/system/src/Grav/Framework/Collection/AbstractLazyCollection.php +++ b/system/src/Grav/Framework/Collection/AbstractLazyCollection.php @@ -78,6 +78,7 @@ public function unselect(array $keys) /** * @return array */ + #[\ReturnTypeWillChange] public function jsonSerialize() { $this->initialize(); diff --git a/system/src/Grav/Framework/Collection/ArrayCollection.php b/system/src/Grav/Framework/Collection/ArrayCollection.php index d76aa05dc6..4a54b3cb97 100644 --- a/system/src/Grav/Framework/Collection/ArrayCollection.php +++ b/system/src/Grav/Framework/Collection/ArrayCollection.php @@ -97,6 +97,7 @@ public function unselect(array $keys) * * @return array */ + #[\ReturnTypeWillChange] public function jsonSerialize() { return $this->toArray(); diff --git a/system/src/Grav/Framework/Flex/FlexCollection.php b/system/src/Grav/Framework/Flex/FlexCollection.php index c76c3061b5..dfba12cb9c 100644 --- a/system/src/Grav/Framework/Flex/FlexCollection.php +++ b/system/src/Grav/Framework/Flex/FlexCollection.php @@ -520,6 +520,7 @@ public function find($value, $field = 'id') /** * @return array */ + #[\ReturnTypeWillChange] public function jsonSerialize() { $elements = []; diff --git a/system/src/Grav/Framework/Flex/FlexObject.php b/system/src/Grav/Framework/Flex/FlexObject.php index ac51b3461d..41f8255122 100644 --- a/system/src/Grav/Framework/Flex/FlexObject.php +++ b/system/src/Grav/Framework/Flex/FlexObject.php @@ -656,6 +656,7 @@ public function render(string $layout = null, array $context = []) /** * @return array */ + #[\ReturnTypeWillChange] public function jsonSerialize() { return $this->getElements(); diff --git a/system/src/Grav/Framework/Form/FormFlashFile.php b/system/src/Grav/Framework/Form/FormFlashFile.php index 51c318346e..2db2bd9a28 100644 --- a/system/src/Grav/Framework/Form/FormFlashFile.php +++ b/system/src/Grav/Framework/Form/FormFlashFile.php @@ -176,6 +176,7 @@ public function getDestination() /** * @return array */ + #[\ReturnTypeWillChange] public function jsonSerialize() { return $this->upload; diff --git a/system/src/Grav/Framework/Object/Base/ObjectCollectionTrait.php b/system/src/Grav/Framework/Object/Base/ObjectCollectionTrait.php index c4c4705394..ba7c2d4eea 100644 --- a/system/src/Grav/Framework/Object/Base/ObjectCollectionTrait.php +++ b/system/src/Grav/Framework/Object/Base/ObjectCollectionTrait.php @@ -181,6 +181,7 @@ protected function doUnserialize(array $data) * * @return array */ + #[\ReturnTypeWillChange] public function jsonSerialize() { return $this->doSerialize(); diff --git a/system/src/Grav/Framework/Object/Base/ObjectTrait.php b/system/src/Grav/Framework/Object/Base/ObjectTrait.php index d4e324b465..9b13328f96 100644 --- a/system/src/Grav/Framework/Object/Base/ObjectTrait.php +++ b/system/src/Grav/Framework/Object/Base/ObjectTrait.php @@ -172,6 +172,7 @@ protected function doUnserialize(array $serialized) * * @return array */ + #[\ReturnTypeWillChange] public function jsonSerialize() { return $this->doSerialize(); diff --git a/system/src/Grav/Framework/Pagination/AbstractPagination.php b/system/src/Grav/Framework/Pagination/AbstractPagination.php index 0be21ec3bd..2e6f815f82 100644 --- a/system/src/Grav/Framework/Pagination/AbstractPagination.php +++ b/system/src/Grav/Framework/Pagination/AbstractPagination.php @@ -235,6 +235,7 @@ public function count(): int /** * @return ArrayIterator */ + #[\ReturnTypeWillChange] public function getIterator() { $this->loadItems(); diff --git a/system/src/Grav/Framework/Session/Session.php b/system/src/Grav/Framework/Session/Session.php index 3feae5a2a5..dc6ce8292a 100644 --- a/system/src/Grav/Framework/Session/Session.php +++ b/system/src/Grav/Framework/Session/Session.php @@ -392,6 +392,7 @@ public function getAll() /** * @inheritdoc */ + #[\ReturnTypeWillChange] public function getIterator() { return new ArrayIterator($_SESSION); diff --git a/system/src/Grav/Framework/Session/SessionInterface.php b/system/src/Grav/Framework/Session/SessionInterface.php index 43ca40fd99..fcf5061fbb 100644 --- a/system/src/Grav/Framework/Session/SessionInterface.php +++ b/system/src/Grav/Framework/Session/SessionInterface.php @@ -108,6 +108,7 @@ public function getAll(); * * @return ArrayIterator Return an ArrayIterator of $_SESSION */ + #[\ReturnTypeWillChange] public function getIterator(); /** diff --git a/tests/phpstan/phpstan.neon b/tests/phpstan/phpstan.neon index aec8c4657d..3c99f24c46 100644 --- a/tests/phpstan/phpstan.neon +++ b/tests/phpstan/phpstan.neon @@ -33,13 +33,9 @@ parameters: dynamicConstantNames: - GRAV_CLI ignoreErrors: - # New in phpstan 0.12, ignore them for now. + # New in phpstan 1, ignore them for now. - '#Unsafe usage of new static\(\)#' - '#Cannot instantiate interface Grav\\Framework\\#' - # TODO: phpstan bug #3875 (fixed, test if can be removed) - - - message: '#Unreachable statement - code above always terminates#' - path: '*/system/src/Grav/Common/Flex/Types/Pages/Storage/PageStorage.php' # FIXME: Bugs that need to be fixed # FIXME: PHP 7.3 bug workaround @@ -84,12 +80,12 @@ parameters: - message: '#unknown class Grav\\Plugin\\Admin#' path: '*/system/src/Grav/Common/Flex/Pages/PageObject.php' - - - message: '#unknown class Grav\\Common\\Grav\\Plugin\\Form\\Forms#' - path: '*/system/src/Grav/Common/Session.php' - message: '#unknown class Grav\\Plugin\\Admin\\Admin#' path: '*/system/src/Grav/Common/Flex/Types/Pages/PageObject.php' + - + message: '#unknown class Grav\\Plugin\\Form\\Forms#' + path: '*/system/src/Grav/Common/Processors/PagesProcessor.php' # Can be ignored, after fopen there's always an $http_response_header locally available - From d59a4c63db918d8500c2175dbac5e30cb2a30759 Mon Sep 17 00:00:00 2001 From: Matias Griese Date: Wed, 1 Dec 2021 14:57:27 +0200 Subject: [PATCH 16/83] Added `translated()` method to `PageTranslateInterface` --- CHANGELOG.md | 1 + .../Grav/Common/Flex/Types/Pages/PageObject.php | 15 ++++++--------- .../Page/Interfaces/PageTranslateInterface.php | 5 +++++ .../Flex/Pages/Traits/PageTranslateTrait.php | 8 ++++++++ 4 files changed, 20 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4b8e2b1838..49a9d18827 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ 1. [](#new) * Made `Grav::redirect()` to accept `Route` class + * Added `translated()` method to `PageTranslateInterface` 2. [](#improved) * Upgraded vendor libs for PHP 8.1 compatibility * Upgraded to **composer v2.1.14** for PHP 8.1 compatibility diff --git a/system/src/Grav/Common/Flex/Types/Pages/PageObject.php b/system/src/Grav/Common/Flex/Types/Pages/PageObject.php index 4c83f959b2..9d8e1b62ee 100644 --- a/system/src/Grav/Common/Flex/Types/Pages/PageObject.php +++ b/system/src/Grav/Common/Flex/Types/Pages/PageObject.php @@ -25,9 +25,9 @@ use Grav\Common\User\Interfaces\UserInterface; use Grav\Common\Utils; use Grav\Framework\Filesystem\Filesystem; -use Grav\Framework\Flex\FlexObject; use Grav\Framework\Flex\Interfaces\FlexObjectInterface; use Grav\Framework\Flex\Pages\FlexPageObject; +use Grav\Framework\Object\ObjectCollection; use Grav\Framework\Route\Route; use Grav\Framework\Route\RouteFactory; use Grav\Plugin\Admin\Admin; @@ -93,11 +93,6 @@ public function initialize(): void } } - public function translated(): bool - { - return $this->translatedLanguages(true) ? true : false; - } - /** * @param string|array $query * @return Route|null @@ -282,7 +277,7 @@ public function check(UserInterface $user = null): void /** * @param array|bool $reorder - * @return FlexObject|FlexObjectInterface + * @return static */ public function save($reorder = true) { @@ -317,7 +312,7 @@ public function save($reorder = true) } /** - * @return PageObject + * @return static */ public function delete() { @@ -466,7 +461,9 @@ protected function reorderSiblings(array $ordering) if ($isMoved && $this->order() !== false) { $parentKey = $this->getProperty('parent_key'); if ($parentKey === '') { - $newParent = $this->getFlexDirectory()->getIndex()->getRoot(); + /** @var PageIndex $index */ + $index = $this->getFlexDirectory()->getIndex(); + $newParent = $index->getRoot(); } else { $newParent = $this->getFlexDirectory()->getObject($parentKey, 'storage_key'); if (!$newParent instanceof PageInterface) { diff --git a/system/src/Grav/Common/Page/Interfaces/PageTranslateInterface.php b/system/src/Grav/Common/Page/Interfaces/PageTranslateInterface.php index be7ba15dec..5fba7512cd 100644 --- a/system/src/Grav/Common/Page/Interfaces/PageTranslateInterface.php +++ b/system/src/Grav/Common/Page/Interfaces/PageTranslateInterface.php @@ -7,6 +7,11 @@ */ interface PageTranslateInterface { + /** + * @return bool + */ + public function translated(): bool; + /** * Return an array with the routes of other translated languages * diff --git a/system/src/Grav/Framework/Flex/Pages/Traits/PageTranslateTrait.php b/system/src/Grav/Framework/Flex/Pages/Traits/PageTranslateTrait.php index 877fec10e9..0ce0d7308e 100644 --- a/system/src/Grav/Framework/Flex/Pages/Traits/PageTranslateTrait.php +++ b/system/src/Grav/Framework/Flex/Pages/Traits/PageTranslateTrait.php @@ -26,6 +26,14 @@ trait PageTranslateTrait /** @var PageInterface[] */ private $_translations = []; + /** + * @return bool + */ + public function translated(): bool + { + return (bool)$this->translatedLanguages(true); + } + /** * @param string|null $languageCode * @param bool|null $fallback From 179dec4c3b1fdd47c9722a84672eb6601dbddc74 Mon Sep 17 00:00:00 2001 From: Matias Griese Date: Wed, 1 Dec 2021 14:59:22 +0200 Subject: [PATCH 17/83] More phpstan fixes --- .../Flex/Types/Pages/PageCollection.php | 46 +++++++++++++------ .../Common/Flex/Types/Pages/PageIndex.php | 39 ++++++++++++++-- .../Common/Flex/Types/Pages/PageObject.php | 1 + .../Common/Flex/Types/Users/UserObject.php | 4 +- .../Interfaces/PageCollectionInterface.php | 22 +++++++++ .../Grav/Framework/Flex/FlexCollection.php | 6 ++- system/src/Grav/Framework/Flex/FlexIndex.php | 11 ++++- .../Flex/Pages/Traits/PageLegacyTrait.php | 2 - 8 files changed, 107 insertions(+), 24 deletions(-) diff --git a/system/src/Grav/Common/Flex/Types/Pages/PageCollection.php b/system/src/Grav/Common/Flex/Types/Pages/PageCollection.php index efa8321e56..c6a642da38 100644 --- a/system/src/Grav/Common/Flex/Types/Pages/PageCollection.php +++ b/system/src/Grav/Common/Flex/Types/Pages/PageCollection.php @@ -34,8 +34,9 @@ * Class GravPageCollection * @package Grav\Plugin\FlexObjects\Types\GravPages * - * @extends FlexPageCollection - * @implements PageCollectionInterface + * @template T as PageObject + * @extends FlexPageCollection + * @implements PageCollectionInterface * * Incompatibilities with Grav\Common\Page\Collection: * $page = $collection->key() will not work at all @@ -47,10 +48,6 @@ * $collection->prev() does not rewind the internal pointer * AND most methods are immutable; they do not update the current collection, but return updated one * - * @method PageCollection shuffle() - * @method PageCollection select(array $keys) - * @method PageCollection unselect(array $keys) - * @method PageCollection createFrom(array $elements, string $keyField = null) * @method PageIndex getIndex() */ class PageCollection extends FlexPageCollection implements PageCollectionInterface @@ -109,13 +106,11 @@ public static function getCachedMethods(): array } /** - * @return PageObject + * @return PageInterface */ public function getRoot() { - $index = $this->getIndex(); - - return $index->getRoot(); + return $this->getIndex()->getRoot(); } /** @@ -155,7 +150,7 @@ public function params(): array * Add a single page to a collection * * @param PageInterface $page - * @return static + * @return $this */ public function addPage(PageInterface $page) { @@ -175,6 +170,7 @@ public function addPage(PageInterface $page) * * @param PageCollectionInterface $collection * @return static + * @phpstan-return static */ public function merge(PageCollectionInterface $collection) { @@ -186,6 +182,7 @@ public function merge(PageCollectionInterface $collection) * * @param PageCollectionInterface $collection * @return static + * @phpstan-return static */ public function intersect(PageCollectionInterface $collection) { @@ -204,7 +201,7 @@ public function setCurrent(string $path): void * Return previous item. * * @return PageInterface|false - * @phpstan-return PageObject|false + * @phpstan-return T|false */ public function prev() { @@ -219,7 +216,7 @@ public function prev() * Return nth item. * @param int $key * @return PageInterface|bool - * @phpstan-return PageObject|false + * @phpstan-return T|false */ public function nth($key) { @@ -231,6 +228,7 @@ public function nth($key) * * @param int $num Specifies how many entries should be picked. * @return static + * @phpstan-return static */ public function random($num = 1) { @@ -242,6 +240,7 @@ public function random($num = 1) * * @param array $items Items to be appended. Existing keys will be overridden with the new values. * @return static + * @phpstan-return static */ public function append($items) { @@ -253,6 +252,7 @@ public function append($items) * * @param int $size * @return static[] + * @phpstan-return static[] */ public function batch($size): array { @@ -274,6 +274,7 @@ public function batch($size): array * @param array|null $manual * @param int|null $sort_flags * @return static + * @phpstan-return static */ public function order($by, $dir = 'asc', $manual = null, $sort_flags = null) { @@ -442,6 +443,7 @@ public function all() * @param string|null $endDate * @param string|null $field * @return static + * @phpstan-return static * @throws Exception */ public function dateRange($startDate = null, $endDate = null, $field = null) @@ -469,6 +471,7 @@ public function dateRange($startDate = null, $endDate = null, $field = null) * Creates new collection with only visible pages * * @return static The collection with only visible pages + * @phpstan-return static */ public function visible() { @@ -486,6 +489,7 @@ public function visible() * Creates new collection with only non-visible pages * * @return static The collection with only non-visible pages + * @phpstan-return static */ public function nonVisible() { @@ -503,6 +507,7 @@ public function nonVisible() * Creates new collection with only pages * * @return static The collection with only pages + * @phpstan-return static */ public function pages() { @@ -524,6 +529,7 @@ public function pages() * Creates new collection with only modules * * @return static The collection with only modules + * @phpstan-return static */ public function modules() { @@ -545,6 +551,7 @@ public function modules() * Alias of modules() * * @return static + * @phpstan-return static */ public function modular() { @@ -555,6 +562,7 @@ public function modular() * Alias of pages() * * @return static + * @phpstan-return static */ public function nonModular() { @@ -565,6 +573,7 @@ public function nonModular() * Creates new collection with only published pages * * @return static The collection with only published pages + * @phpstan-return static */ public function published() { @@ -582,6 +591,7 @@ public function published() * Creates new collection with only non-published pages * * @return static The collection with only non-published pages + * @phpstan-return static */ public function nonPublished() { @@ -599,6 +609,7 @@ public function nonPublished() * Creates new collection with only routable pages * * @return static The collection with only routable pages + * @phpstan-return static */ public function routable() { @@ -616,6 +627,7 @@ public function routable() * Creates new collection with only non-routable pages * * @return static The collection with only non-routable pages + * @phpstan-return static */ public function nonRoutable() { @@ -634,6 +646,7 @@ public function nonRoutable() * * @param string $type * @return static The collection + * @phpstan-return static */ public function ofType($type) { @@ -652,6 +665,7 @@ public function ofType($type) * * @param string[] $types * @return static The collection + * @phpstan-return static */ public function ofOneOfTheseTypes($types) { @@ -670,6 +684,7 @@ public function ofOneOfTheseTypes($types) * * @param array $accessLevels * @return static The collection + * @phpstan-return static */ public function ofOneOfTheseAccessLevels($accessLevels) { @@ -711,6 +726,7 @@ public function ofOneOfTheseAccessLevels($accessLevels) /** * @param bool $bool * @return static + * @phpstan-return static */ public function withOrdered(bool $bool = true) { @@ -722,6 +738,7 @@ public function withOrdered(bool $bool = true) /** * @param bool $bool * @return static + * @phpstan-return static */ public function withModules(bool $bool = true) { @@ -733,6 +750,7 @@ public function withModules(bool $bool = true) /** * @param bool $bool * @return static + * @phpstan-return static */ public function withPages(bool $bool = true) { @@ -746,6 +764,7 @@ public function withPages(bool $bool = true) * @param string|null $languageCode * @param bool|null $fallback * @return static + * @phpstan-return static */ public function withTranslation(bool $bool = true, string $languageCode = null, bool $fallback = null) { @@ -779,6 +798,7 @@ public function withTranslated(string $languageCode = null, bool $fallback = nul * @param array $filters * @param bool $recursive * @return static + * @phpstan-return static */ public function filterBy(array $filters, bool $recursive = false) { diff --git a/system/src/Grav/Common/Flex/Types/Pages/PageIndex.php b/system/src/Grav/Common/Flex/Types/Pages/PageIndex.php index cfb8295ccb..71b407bb4b 100644 --- a/system/src/Grav/Common/Flex/Types/Pages/PageIndex.php +++ b/system/src/Grav/Common/Flex/Types/Pages/PageIndex.php @@ -39,8 +39,10 @@ * Class GravPageObject * @package Grav\Plugin\FlexObjects\Types\GravPages * - * @extends FlexPageIndex - * @implements PageCollectionInterface + * @template T of PageObject + * @template C of PageCollection + * @extends FlexPageIndex + * @implements PageCollectionInterface * * @method PageIndex withModules(bool $bool = true) * @method PageIndex withPages(bool $bool = true) @@ -102,6 +104,7 @@ public static function loadEntriesFromStorage(FlexStorageInterface $storage): ar /** * @param string $key * @return PageObject|null + * @phpstan-return T|null */ public function get($key) { @@ -124,7 +127,7 @@ public function get($key) } /** - * @return PageObject + * @return PageInterface */ public function getRoot() { @@ -175,7 +178,8 @@ public function getRoot() /** * @param string|null $languageCode * @param bool|null $fallback - * @return PageIndex + * @return static + * @phpstan-return static */ public function withTranslated(string $languageCode = null, bool $fallback = null) { @@ -279,6 +283,7 @@ public function getCacheKey(): string * @param array $filters * @param bool $recursive * @return static + * @phpstan-return static */ public function filterBy(array $filters, bool $recursive = false) { @@ -335,6 +340,7 @@ public function filterBy(array $filters, bool $recursive = false) /** * @param array $filters * @return static + * @phpstan-return static */ protected function filterByParent(array $filters) { @@ -405,6 +411,7 @@ public function getLevelListing(array $options): array * @param array $entries * @param string|null $keyField * @return static + * @phpstan-return static */ protected function createFrom(array $entries, string $keyField = null) { @@ -790,6 +797,7 @@ private function jsDate(int $timestamp = null): ?string * * @param PageInterface $page * @return PageCollection + * @phpstan-return C */ public function addPage(PageInterface $page) { @@ -801,6 +809,7 @@ public function addPage(PageInterface $page) * Create a copy of this collection * * @return static + * @phpstan-return static */ public function copy() { @@ -813,6 +822,7 @@ public function copy() * * @param PageCollectionInterface $collection * @return PageCollection + * @phpstan-return C */ public function merge(PageCollectionInterface $collection) { @@ -825,6 +835,7 @@ public function merge(PageCollectionInterface $collection) * * @param PageCollectionInterface $collection * @return PageCollection + * @phpstan-return C */ public function intersect(PageCollectionInterface $collection) { @@ -836,6 +847,7 @@ public function intersect(PageCollectionInterface $collection) * * @param int $size * @return PageCollection[] + * @phpstan-return C[] */ public function batch($size) { @@ -847,6 +859,7 @@ public function batch($size) * * @param string $key * @return PageObject|null + * @phpstan-return T|null * @throws InvalidArgumentException */ public function remove($key) @@ -862,6 +875,7 @@ public function remove($key) * @param array $manual * @param string $sort_flags * @return static + * @phpstan-return static */ public function order($by, $dir = 'asc', $manual = null, $sort_flags = null) { @@ -905,6 +919,7 @@ public function isLast($path): bool * * @param string $path * @return PageObject|null The previous item. + * @phpstan-return T|null */ public function prevSibling($path) { @@ -919,6 +934,7 @@ public function prevSibling($path) * * @param string $path * @return PageObject|null The next item. + * @phpstan-return T|null */ public function nextSibling($path) { @@ -934,6 +950,7 @@ public function nextSibling($path) * @param string $path * @param int $direction either -1 or +1 * @return PageObject|false The sibling item. + * @phpstan-return T|false */ public function adjacentSibling($path, $direction = 1) { @@ -967,6 +984,7 @@ public function currentPosition($path): ?int * @param string|null $endDate * @param string|null $field * @return static + * @phpstan-return static * @throws Exception */ public function dateRange($startDate = null, $endDate = null, $field = null) @@ -991,6 +1009,7 @@ public function all() * Creates new collection with only visible pages * * @return static The collection with only visible pages + * @phpstan-return static */ public function visible() { @@ -1003,6 +1022,7 @@ public function visible() * Creates new collection with only non-visible pages * * @return static The collection with only non-visible pages + * @phpstan-return static */ public function nonVisible() { @@ -1015,6 +1035,7 @@ public function nonVisible() * Creates new collection with only non-modular pages * * @return static The collection with only non-modular pages + * @phpstan-return static */ public function pages() { @@ -1027,6 +1048,7 @@ public function pages() * Creates new collection with only modular pages * * @return static The collection with only modular pages + * @phpstan-return static */ public function modules() { @@ -1039,6 +1061,7 @@ public function modules() * Creates new collection with only modular pages * * @return static The collection with only modular pages + * @phpstan-return static */ public function modular() { @@ -1049,6 +1072,7 @@ public function modular() * Creates new collection with only non-modular pages * * @return static The collection with only non-modular pages + * @phpstan-return static */ public function nonModular() { @@ -1059,6 +1083,7 @@ public function nonModular() * Creates new collection with only published pages * * @return static The collection with only published pages + * @phpstan-return static */ public function published() { @@ -1071,6 +1096,7 @@ public function published() * Creates new collection with only non-published pages * * @return static The collection with only non-published pages + * @phpstan-return static */ public function nonPublished() { @@ -1083,6 +1109,7 @@ public function nonPublished() * Creates new collection with only routable pages * * @return static The collection with only routable pages + * @phpstan-return static */ public function routable() { @@ -1095,6 +1122,7 @@ public function routable() * Creates new collection with only non-routable pages * * @return static The collection with only non-routable pages + * @phpstan-return static */ public function nonRoutable() { @@ -1108,6 +1136,7 @@ public function nonRoutable() * * @param string $type * @return static The collection + * @phpstan-return static */ public function ofType($type) { @@ -1121,6 +1150,7 @@ public function ofType($type) * * @param string[] $types * @return static The collection + * @phpstan-return static */ public function ofOneOfTheseTypes($types) { @@ -1134,6 +1164,7 @@ public function ofOneOfTheseTypes($types) * * @param array $accessLevels * @return static The collection + * @phpstan-return static */ public function ofOneOfTheseAccessLevels($accessLevels) { diff --git a/system/src/Grav/Common/Flex/Types/Pages/PageObject.php b/system/src/Grav/Common/Flex/Types/Pages/PageObject.php index 9d8e1b62ee..7f39d3b3be 100644 --- a/system/src/Grav/Common/Flex/Types/Pages/PageObject.php +++ b/system/src/Grav/Common/Flex/Types/Pages/PageObject.php @@ -386,6 +386,7 @@ protected function isMoved(): bool /** * @param array $ordering * @return PageCollection|null + * @phpstan-return ObjectCollection|null */ protected function reorderSiblings(array $ordering) { diff --git a/system/src/Grav/Common/Flex/Types/Users/UserObject.php b/system/src/Grav/Common/Flex/Types/Users/UserObject.php index 424e5ebefb..14f477c5a3 100644 --- a/system/src/Grav/Common/Flex/Types/Users/UserObject.php +++ b/system/src/Grav/Common/Flex/Types/Users/UserObject.php @@ -898,7 +898,9 @@ protected function getUserGroups() protected function getGroups() { if (null === $this->_groups) { - $this->_groups = $this->getUserGroups()->select((array)$this->getProperty('groups')); + /** @var UserGroupIndex $groups */ + $groups = $this->getUserGroups()->select((array)$this->getProperty('groups')); + $this->_groups = $groups; } return $this->_groups; diff --git a/system/src/Grav/Common/Page/Interfaces/PageCollectionInterface.php b/system/src/Grav/Common/Page/Interfaces/PageCollectionInterface.php index 3e7e29b4e9..88968e5b53 100644 --- a/system/src/Grav/Common/Page/Interfaces/PageCollectionInterface.php +++ b/system/src/Grav/Common/Page/Interfaces/PageCollectionInterface.php @@ -73,6 +73,7 @@ public function copy(); * * @param PageCollectionInterface $collection * @return PageCollectionInterface + * @phpstan-return PageCollectionInterface */ public function merge(PageCollectionInterface $collection); @@ -81,6 +82,7 @@ public function merge(PageCollectionInterface $collection); * * @param PageCollectionInterface $collection * @return PageCollectionInterface + * @phpstan-return PageCollectionInterface */ public function intersect(PageCollectionInterface $collection); @@ -89,6 +91,7 @@ public function intersect(PageCollectionInterface $collection); * * @param int $size * @return PageCollectionInterface[] + * @phpstan-return array> */ public function batch($size); @@ -97,6 +100,7 @@ public function batch($size); * * @param PageInterface|string|null $key * @return PageCollectionInterface + * @phpstan-return PageCollectionInterface * @throws InvalidArgumentException */ //public function remove($key = null); @@ -109,6 +113,7 @@ public function batch($size); * @param array|null $manual * @param string|null $sort_flags * @return PageCollectionInterface + * @phpstan-return PageCollectionInterface */ public function order($by, $dir = 'asc', $manual = null, $sort_flags = null); @@ -133,6 +138,7 @@ public function isLast($path): bool; * * @param string $path * @return PageInterface The previous item. + * @phpstan-return T */ public function prevSibling($path); @@ -141,6 +147,7 @@ public function prevSibling($path); * * @param string $path * @return PageInterface The next item. + * @phpstan-return T */ public function nextSibling($path); @@ -150,6 +157,7 @@ public function nextSibling($path); * @param string $path * @param int $direction either -1 or +1 * @return PageInterface|PageCollectionInterface|false The sibling item. + * @phpstan-return T|false */ public function adjacentSibling($path, $direction = 1); @@ -171,6 +179,7 @@ public function currentPosition($path): ?int; * @param string|null $endDate * @param string|null $field * @return PageCollectionInterface + * @phpstan-return PageCollectionInterface * @throws Exception */ public function dateRange($startDate = null, $endDate = null, $field = null); @@ -179,6 +188,7 @@ public function dateRange($startDate = null, $endDate = null, $field = null); * Creates new collection with only visible pages * * @return PageCollectionInterface The collection with only visible pages + * @phpstan-return PageCollectionInterface */ public function visible(); @@ -186,6 +196,7 @@ public function visible(); * Creates new collection with only non-visible pages * * @return PageCollectionInterface The collection with only non-visible pages + * @phpstan-return PageCollectionInterface */ public function nonVisible(); @@ -193,6 +204,7 @@ public function nonVisible(); * Creates new collection with only pages * * @return PageCollectionInterface The collection with only pages + * @phpstan-return PageCollectionInterface */ public function pages(); @@ -200,6 +212,7 @@ public function pages(); * Creates new collection with only modules * * @return PageCollectionInterface The collection with only modules + * @phpstan-return PageCollectionInterface */ public function modules(); @@ -207,6 +220,7 @@ public function modules(); * Creates new collection with only modules * * @return PageCollectionInterface The collection with only modules + * @phpstan-return PageCollectionInterface * @deprecated 1.7 Use $this->modules() instead */ public function modular(); @@ -215,6 +229,7 @@ public function modular(); * Creates new collection with only non-module pages * * @return PageCollectionInterface The collection with only non-module pages + * @phpstan-return PageCollectionInterface * @deprecated 1.7 Use $this->pages() instead */ public function nonModular(); @@ -223,6 +238,7 @@ public function nonModular(); * Creates new collection with only published pages * * @return PageCollectionInterface The collection with only published pages + * @phpstan-return PageCollectionInterface */ public function published(); @@ -230,6 +246,7 @@ public function published(); * Creates new collection with only non-published pages * * @return PageCollectionInterface The collection with only non-published pages + * @phpstan-return PageCollectionInterface */ public function nonPublished(); @@ -237,6 +254,7 @@ public function nonPublished(); * Creates new collection with only routable pages * * @return PageCollectionInterface The collection with only routable pages + * @phpstan-return PageCollectionInterface */ public function routable(); @@ -244,6 +262,7 @@ public function routable(); * Creates new collection with only non-routable pages * * @return PageCollectionInterface The collection with only non-routable pages + * @phpstan-return PageCollectionInterface */ public function nonRoutable(); @@ -252,6 +271,7 @@ public function nonRoutable(); * * @param string $type * @return PageCollectionInterface The collection + * @phpstan-return PageCollectionInterface */ public function ofType($type); @@ -260,6 +280,7 @@ public function ofType($type); * * @param string[] $types * @return PageCollectionInterface The collection + * @phpstan-return PageCollectionInterface */ public function ofOneOfTheseTypes($types); @@ -268,6 +289,7 @@ public function ofOneOfTheseTypes($types); * * @param array $accessLevels * @return PageCollectionInterface The collection + * @phpstan-return PageCollectionInterface */ public function ofOneOfTheseAccessLevels($accessLevels); diff --git a/system/src/Grav/Framework/Flex/FlexCollection.php b/system/src/Grav/Framework/Flex/FlexCollection.php index dfba12cb9c..d5607d53e5 100644 --- a/system/src/Grav/Framework/Flex/FlexCollection.php +++ b/system/src/Grav/Framework/Flex/FlexCollection.php @@ -171,7 +171,8 @@ public function sort(array $order) /** * @param array $filters - * @return FlexCollectionInterface|Collection + * @return static + * @phpstan-return static */ public function filterBy(array $filters) { @@ -502,7 +503,8 @@ public function isAuthorized(string $action, string $scope = null, UserInterface /** * @param string $value * @param string $field - * @return T|null + * @return FlexObjectInterface|null + * @phpstan-return T|null */ public function find($value, $field = 'id') { diff --git a/system/src/Grav/Framework/Flex/FlexIndex.php b/system/src/Grav/Framework/Flex/FlexIndex.php index 333b499f00..9341c617cf 100644 --- a/system/src/Grav/Framework/Flex/FlexIndex.php +++ b/system/src/Grav/Framework/Flex/FlexIndex.php @@ -11,6 +11,7 @@ use Exception; use Grav\Common\Debugger; +use Grav\Common\File\CompiledJsonFile; use Grav\Common\File\CompiledYamlFile; use Grav\Common\Grav; use Grav\Common\Inflector; @@ -606,9 +607,11 @@ protected function getTypePrefix() * @param string $key * @param mixed $value * @return ObjectInterface|null + * @phpstan-return T|null */ protected function loadElement($key, $value): ?ObjectInterface { + /** @phpstan-var T[] $objects */ $objects = $this->getFlexDirectory()->loadObjects([$key => $value]); return $objects ? reset($objects): null; @@ -617,10 +620,14 @@ protected function loadElement($key, $value): ?ObjectInterface /** * @param array|null $entries * @return ObjectInterface[] + * @phpstan-return T[] */ protected function loadElements(array $entries = null): array { - return $this->getFlexDirectory()->loadObjects($entries ?? $this->getEntries()); + /** @phpstan-var T[] $objects */ + $objects = $this->getFlexDirectory()->loadObjects($entries ?? $this->getEntries()); + + return $objects; } /** @@ -823,7 +830,7 @@ protected static function loadEntriesFromIndex(FlexStorageInterface $storage) /** * @param FlexStorageInterface $storage - * @return CompiledYamlFile|null + * @return CompiledYamlFile|CompiledJsonFile|null */ protected static function getIndexFile(FlexStorageInterface $storage) { diff --git a/system/src/Grav/Framework/Flex/Pages/Traits/PageLegacyTrait.php b/system/src/Grav/Framework/Flex/Pages/Traits/PageLegacyTrait.php index 6453bcf5e3..26c66d8be6 100644 --- a/system/src/Grav/Framework/Flex/Pages/Traits/PageLegacyTrait.php +++ b/system/src/Grav/Framework/Flex/Pages/Traits/PageLegacyTrait.php @@ -17,11 +17,9 @@ use Grav\Common\Page\Pages; use Grav\Common\Utils; use Grav\Common\Yaml; -use Grav\Framework\Cache\CacheInterface; use Grav\Framework\File\Formatter\MarkdownFormatter; use Grav\Framework\File\Formatter\YamlFormatter; use Grav\Framework\Filesystem\Filesystem; -use Grav\Framework\Flex\FlexDirectory; use Grav\Framework\Flex\Interfaces\FlexCollectionInterface; use Grav\Framework\Flex\Interfaces\FlexIndexInterface; use Grav\Framework\Flex\Pages\FlexPageIndex; From 5c6fd0453b8e79cb4f724d416fe67eb577586fd7 Mon Sep 17 00:00:00 2001 From: Matias Griese Date: Wed, 1 Dec 2021 15:02:27 +0200 Subject: [PATCH 18/83] Changelog update --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 49a9d18827..9690daf928 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ * Upgraded vendor libs for PHP 8.1 compatibility * Upgraded to **composer v2.1.14** for PHP 8.1 compatibility * Added third `$name` parameter to `Blueprint::flattenData()` method, useful for flattening repeating data + * `ControllerResponseTrait`: Redirect response should be json if the extension is .json # v1.7.25 ## 11/16/2021 From 3321f4925388445a9f6437f5cc0416514878b4cd Mon Sep 17 00:00:00 2001 From: Matias Griese Date: Wed, 1 Dec 2021 15:46:36 +0200 Subject: [PATCH 19/83] Interface fixes --- system/src/Grav/Common/Flex/Types/Users/UserIndex.php | 2 +- .../src/Grav/Common/Flex/Types/Users/UserObject.php | 3 ++- .../Common/Page/Interfaces/PageContentInterface.php | 9 +++++++++ system/src/Grav/Common/Page/Page.php | 11 +++++++++++ 4 files changed, 23 insertions(+), 2 deletions(-) diff --git a/system/src/Grav/Common/Flex/Types/Users/UserIndex.php b/system/src/Grav/Common/Flex/Types/Users/UserIndex.php index 6e0bc65fe1..0cbbf2dc7e 100644 --- a/system/src/Grav/Common/Flex/Types/Users/UserIndex.php +++ b/system/src/Grav/Common/Flex/Types/Users/UserIndex.php @@ -164,7 +164,7 @@ public function find($query, $fields = ['username', 'email']): UserInterface */ protected static function filterUsername(string $key, FlexStorageInterface $storage): string { - return $storage->normalizeKey($key); + return method_exists($storage, 'normalizeKey') ? $storage->normalizeKey($key) : $key; } /** diff --git a/system/src/Grav/Common/Flex/Types/Users/UserObject.php b/system/src/Grav/Common/Flex/Types/Users/UserObject.php index 14f477c5a3..6c6d965f78 100644 --- a/system/src/Grav/Common/Flex/Types/Users/UserObject.php +++ b/system/src/Grav/Common/Flex/Types/Users/UserObject.php @@ -123,7 +123,8 @@ public function __construct(array $elements, $key, FlexDirectory $directory, boo // Define username if it's not set. if (!isset($elements['username'])) { $storageKey = $elements['__META']['storage_key'] ?? null; - if (null !== $storageKey && $key === $directory->getStorage()->normalizeKey($storageKey)) { + $storage = $directory->getStorage(); + if (null !== $storageKey && method_exists($storage, 'normalizeKey') && $key === $storage->normalizeKey($storageKey)) { $elements['username'] = $storageKey; } else { $elements['username'] = $key; diff --git a/system/src/Grav/Common/Page/Interfaces/PageContentInterface.php b/system/src/Grav/Common/Page/Interfaces/PageContentInterface.php index d9d3105b6b..30db89d667 100644 --- a/system/src/Grav/Common/Page/Interfaces/PageContentInterface.php +++ b/system/src/Grav/Common/Page/Interfaces/PageContentInterface.php @@ -9,6 +9,7 @@ namespace Grav\Common\Page\Interfaces; +use Grav\Common\Data\Blueprint; use Grav\Common\Media\Interfaces\MediaCollectionInterface; /** @@ -254,4 +255,12 @@ public function isDir(); * @return bool */ public function exists(); + + /** + * Returns the blueprint from the page. + * + * @param string $name Name of the Blueprint form. Used by flex only. + * @return Blueprint Returns a Blueprint. + */ + public function getBlueprint(string $name = ''); } diff --git a/system/src/Grav/Common/Page/Page.php b/system/src/Grav/Common/Page/Page.php index f67212aeb4..9ede85fe91 100644 --- a/system/src/Grav/Common/Page/Page.php +++ b/system/src/Grav/Common/Page/Page.php @@ -1246,6 +1246,17 @@ public function blueprints() return $blueprint; } + /** + * Returns the blueprint from the page. + * + * @param string $name Not used. + * @return Blueprint Returns a Blueprint. + */ + public function getBlueprint(string $name = '') + { + return $this->blueprints(); + } + /** * Get the blueprint name for this page. Use the blueprint form field if set * From fb4bce36cbb2061c25be5a8af5c7c0f9b77f0abb Mon Sep 17 00:00:00 2001 From: Matias Griese Date: Wed, 1 Dec 2021 16:25:39 +0200 Subject: [PATCH 20/83] Grav::close() never returns (typehint) --- system/src/Grav/Common/Grav.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/src/Grav/Common/Grav.php b/system/src/Grav/Common/Grav.php index 773bfd2274..4a81392430 100644 --- a/system/src/Grav/Common/Grav.php +++ b/system/src/Grav/Common/Grav.php @@ -346,7 +346,7 @@ public function process(): void * Please use this method instead of calling `die();` or `exit();`. Note that you need to create a response object. * * @param ResponseInterface $response - * @return void + * @return never-return */ public function close(ResponseInterface $response): void { From 6aebbc2be49bc20c287154a7322159896006e8ac Mon Sep 17 00:00:00 2001 From: Matias Griese Date: Wed, 1 Dec 2021 16:45:45 +0200 Subject: [PATCH 21/83] Also Grav::exit() and Grav::redirect() never returns (typehint) --- system/src/Grav/Common/Grav.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/system/src/Grav/Common/Grav.php b/system/src/Grav/Common/Grav.php index 4a81392430..78827acf4a 100644 --- a/system/src/Grav/Common/Grav.php +++ b/system/src/Grav/Common/Grav.php @@ -398,7 +398,7 @@ public function close(ResponseInterface $response): void /** * @param ResponseInterface $response - * @return void + * @return never-return * @deprecated 1.7 Do not use */ public function exit(ResponseInterface $response): void @@ -413,7 +413,7 @@ public function exit(ResponseInterface $response): void * * @param Route|string $route Internal route. * @param int|null $code Redirection code (30x) - * @return void + * @return never-return */ public function redirect($route, $code = null): void { From 589f75b60d19dadc8990f1f2ba1a3051eb9b091b Mon Sep 17 00:00:00 2001 From: Matias Griese Date: Wed, 1 Dec 2021 17:03:41 +0200 Subject: [PATCH 22/83] Phpstan test updates --- tests/phpstan/phpstan.neon | 24 +----------------------- tests/phpstan/plugins.neon | 4 ++-- 2 files changed, 3 insertions(+), 25 deletions(-) diff --git a/tests/phpstan/phpstan.neon b/tests/phpstan/phpstan.neon index 3c99f24c46..7980103366 100644 --- a/tests/phpstan/phpstan.neon +++ b/tests/phpstan/phpstan.neon @@ -16,7 +16,7 @@ parameters: reportUnmatchedIgnoredErrors: false treatPhpDocTypesAsCertain: false - # These checks are new in phpstan 0.12, ignore them for now. + # These checks are new in phpstan 1, ignore them for now. checkMissingIterableValueType: false checkGenericClassInNonGenericObjectType: false @@ -35,21 +35,12 @@ parameters: ignoreErrors: # New in phpstan 1, ignore them for now. - '#Unsafe usage of new static\(\)#' - - '#Cannot instantiate interface Grav\\Framework\\#' - - # FIXME: Bugs that need to be fixed - # FIXME: PHP 7.3 bug workaround - - - message: '#If condition is always false.#' - path: '*/system/src/Grav/Framework/Session/Session.php' # TODO: Errors that needs some more thinking (bad design?) - '#Access to an undefined property RocketTheme\\Toolbox\\Event\\Event::#' - '#Instantiation of deprecated class RocketTheme\\Toolbox\\Event\\Event#' - '#extends deprecated class RocketTheme\\Toolbox\\Event\\Event#' - - '#implements deprecated interface RocketTheme\\Toolbox\\Event\\EventSubscriberInterface#' - '#Access to an undefined property Grav\\Common\\Data\\Blueprint::#' - - '#Access to an undefined property Grav\\Common\\Media\\Interfaces\\MediaObjectInterface::#' - message: '#Cannot call method path\(\) on string#' path: '*/system/src/Grav/Common/Page/Media.php' @@ -59,11 +50,6 @@ parameters: message: '#Call to deprecated method writeCacheFile\(\) of class Twig\\Environment#' path: '*/system/src/Grav/Common/Twig/WriteCacheFileTrait.php' - # Needed: full coverage (probably with admin plugin...) then redesign constructor - - - message: '#Grav\\Common\\GPM\\Remote\\GravCore::__construct\(\) does not call parent constructor from Grav\\Common\\GPM\\Remote\\AbstractPackageCollection#' - path: '*/system/src/Grav/Common/GPM/Remote/GravCore.php' - # PSR-16 Exception interfaces do not extend \Throwable - '#PHPDoc tag \@throws with type Psr\\SimpleCache\\(CacheException|InvalidArgumentException) is not subtype of Throwable#' @@ -87,11 +73,6 @@ parameters: message: '#unknown class Grav\\Plugin\\Form\\Forms#' path: '*/system/src/Grav/Common/Processors/PagesProcessor.php' - # Can be ignored, after fopen there's always an $http_response_header locally available - - - message: '#Variable \$http_response_header in isset\(\) always exists and is not nullable#' - path: '*/system/src/Grav/Common/GPM/Response.php' - # Clockwork does not define functions for __call() call - message: '#Call to an undefined method Clockwork\\Clockwork::(info|userData|addEvent|alert)\(\)#' @@ -136,9 +117,6 @@ parameters: - message: '#Call to deprecated method getLegacyFiles\(\)#' path: '*/system/src/Grav/Common/Session.php' - - - message: '#Call to deprecated method getType\(\) of class#' - path: '*/system/src/Grav/Framework/Object/Base/ObjectTrait.php' - message: '#Call to deprecated method \w+\(\) of class Grav\\Framework\\Flex\\FlexObject#' path: '*/system/src/Grav/Framework/Flex/FlexObject.php' diff --git a/tests/phpstan/plugins.neon b/tests/phpstan/plugins.neon index ae257f80e2..7c0e8cb265 100644 --- a/tests/phpstan/plugins.neon +++ b/tests/phpstan/plugins.neon @@ -14,7 +14,7 @@ parameters: inferPrivatePropertyTypeFromConstructor: true reportUnmatchedIgnoredErrors: false - # These checks are new in phpstan 0.12, ignore them for now. + # These checks are new in phpstan 1, ignore them for now. checkMissingIterableValueType: false checkGenericClassInNonGenericObjectType: false @@ -37,7 +37,7 @@ parameters: - GANTRY5_PLATFORM - GANTRY5_ROOT ignoreErrors: - # New in phpstan 0.12, ignore them for now. + # New in phpstan 1, ignore them for now. - '#Unsafe usage of new static\(\)#' - '#Cannot instantiate interface Grav\\Framework\\#' From 2355d799f26830265b6615231e9058f48b8d8778 Mon Sep 17 00:00:00 2001 From: Matias Griese Date: Thu, 2 Dec 2021 12:05:41 +0200 Subject: [PATCH 23/83] PHP 8.1 fixes --- composer.lock | 77 ++++++++++--------- system/src/Grav/Common/GPM/Common/Package.php | 4 + system/src/Grav/Common/GPM/GPM.php | 2 + system/src/Grav/Common/Getters.php | 4 + system/src/Grav/Common/Grav.php | 1 + system/src/Grav/Common/Iterator.php | 3 + system/src/Grav/Common/Language/Language.php | 1 + .../Common/Markdown/ParsedownGravTrait.php | 1 + .../Media/Interfaces/MediaObjectInterface.php | 1 + .../Common/Media/Traits/MediaObjectTrait.php | 2 + system/src/Grav/Common/Page/Collection.php | 2 + .../Grav/Common/Page/Medium/AbstractMedia.php | 1 + .../src/Grav/Common/Page/Medium/ImageFile.php | 1 + .../Grav/Common/Page/Medium/ImageMedium.php | 32 ++++++-- system/src/Grav/Common/Page/Medium/Link.php | 1 + system/src/Grav/Common/Page/Medium/Medium.php | 2 + system/src/Grav/Common/Page/Page.php | 1 + .../Common/Twig/Exception/TwigException.php | 4 +- system/src/Grav/Common/Uri.php | 1 + system/src/Grav/Framework/Acl/Permissions.php | 1 + .../Framework/Acl/RecursiveActionIterator.php | 1 + .../Framework/Cache/Adapter/FileCache.php | 1 + .../Collection/AbstractIndexCollection.php | 4 + .../Framework/ContentBlock/ContentBlock.php | 1 + .../src/Grav/Framework/File/AbstractFile.php | 2 + .../Grav/Framework/Flex/FlexCollection.php | 1 + .../Grav/Framework/Flex/FlexDirectoryForm.php | 4 + system/src/Grav/Framework/Flex/FlexForm.php | 4 + system/src/Grav/Framework/Flex/FlexIndex.php | 2 + system/src/Grav/Framework/Flex/FlexObject.php | 3 + .../Framework/Flex/Pages/FlexPageObject.php | 1 + .../Framework/Flex/Traits/FlexMediaTrait.php | 1 + .../src/Grav/Framework/Form/FormFlashFile.php | 1 + .../Object/Access/OverloadedPropertyTrait.php | 4 + .../Object/Base/ObjectCollectionTrait.php | 1 + .../Framework/Object/Base/ObjectTrait.php | 1 + .../src/Grav/Framework/Object/ObjectIndex.php | 1 + .../src/Grav/Framework/Psr7/AbstractUri.php | 1 + .../Psr7/Traits/StreamDecoratorTrait.php | 1 + system/src/Grav/Framework/Route/Route.php | 1 + system/src/Grav/Framework/Session/Session.php | 4 + .../Framework/Session/SessionInterface.php | 4 + system/src/Grav/Installer/Install.php | 1 + 43 files changed, 141 insertions(+), 46 deletions(-) diff --git a/composer.lock b/composer.lock index 8b83cf31ee..c376351d43 100644 --- a/composer.lock +++ b/composer.lock @@ -4283,16 +4283,16 @@ }, { "name": "nikic/php-parser", - "version": "v4.13.1", + "version": "v4.13.2", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "63a79e8daa781cac14e5195e63ed8ae231dd10fd" + "reference": "210577fe3cf7badcc5814d99455df46564f3c077" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/63a79e8daa781cac14e5195e63ed8ae231dd10fd", - "reference": "63a79e8daa781cac14e5195e63ed8ae231dd10fd", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/210577fe3cf7badcc5814d99455df46564f3c077", + "reference": "210577fe3cf7badcc5814d99455df46564f3c077", "shasum": "" }, "require": { @@ -4333,9 +4333,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.13.1" + "source": "https://github.com/nikic/PHP-Parser/tree/v4.13.2" }, - "time": "2021-11-03T20:52:16+00:00" + "time": "2021-11-30T19:35:32+00:00" }, { "name": "phar-io/manifest", @@ -6228,28 +6228,28 @@ }, { "name": "symfony/browser-kit", - "version": "v5.3.4", + "version": "v5.4.0", "source": { "type": "git", "url": "https://github.com/symfony/browser-kit.git", - "reference": "c1e3f64fcc631c96e2c5843b666db66679ced11c" + "reference": "d250db364a35ba5d60626b2a6f10f2eaf2073bde" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/browser-kit/zipball/c1e3f64fcc631c96e2c5843b666db66679ced11c", - "reference": "c1e3f64fcc631c96e2c5843b666db66679ced11c", + "url": "https://api.github.com/repos/symfony/browser-kit/zipball/d250db364a35ba5d60626b2a6f10f2eaf2073bde", + "reference": "d250db364a35ba5d60626b2a6f10f2eaf2073bde", "shasum": "" }, "require": { "php": ">=7.2.5", - "symfony/dom-crawler": "^4.4|^5.0", + "symfony/dom-crawler": "^4.4|^5.0|^6.0", "symfony/polyfill-php80": "^1.16" }, "require-dev": { - "symfony/css-selector": "^4.4|^5.0", - "symfony/http-client": "^4.4|^5.0", - "symfony/mime": "^4.4|^5.0", - "symfony/process": "^4.4|^5.0" + "symfony/css-selector": "^4.4|^5.0|^6.0", + "symfony/http-client": "^4.4|^5.0|^6.0", + "symfony/mime": "^4.4|^5.0|^6.0", + "symfony/process": "^4.4|^5.0|^6.0" }, "suggest": { "symfony/process": "" @@ -6280,7 +6280,7 @@ "description": "Simulates the behavior of a web browser, allowing you to make requests, click on links and submit forms programmatically", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/browser-kit/tree/v5.3.4" + "source": "https://github.com/symfony/browser-kit/tree/v5.4.0" }, "funding": [ { @@ -6296,20 +6296,20 @@ "type": "tidelift" } ], - "time": "2021-07-21T12:40:44+00:00" + "time": "2021-10-26T22:29:18+00:00" }, { "name": "symfony/css-selector", - "version": "v5.3.4", + "version": "v5.4.0", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "7fb120adc7f600a59027775b224c13a33530dd90" + "reference": "44b933f98bb4b5220d10bed9ce5662f8c2d13dcc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/7fb120adc7f600a59027775b224c13a33530dd90", - "reference": "7fb120adc7f600a59027775b224c13a33530dd90", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/44b933f98bb4b5220d10bed9ce5662f8c2d13dcc", + "reference": "44b933f98bb4b5220d10bed9ce5662f8c2d13dcc", "shasum": "" }, "require": { @@ -6346,7 +6346,7 @@ "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/css-selector/tree/v5.3.4" + "source": "https://github.com/symfony/css-selector/tree/v5.4.0" }, "funding": [ { @@ -6362,7 +6362,7 @@ "type": "tidelift" } ], - "time": "2021-07-21T12:38:00+00:00" + "time": "2021-09-09T08:06:01+00:00" }, { "name": "symfony/deprecation-contracts", @@ -6433,21 +6433,21 @@ }, { "name": "symfony/dom-crawler", - "version": "v5.3.7", + "version": "v5.4.0", "source": { "type": "git", "url": "https://github.com/symfony/dom-crawler.git", - "reference": "c7eef3a60ccfdd8eafe07f81652e769ac9c7146c" + "reference": "5b06626e940a3ad54e573511d64d4e00dc8d0fd8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/c7eef3a60ccfdd8eafe07f81652e769ac9c7146c", - "reference": "c7eef3a60ccfdd8eafe07f81652e769ac9c7146c", + "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/5b06626e940a3ad54e573511d64d4e00dc8d0fd8", + "reference": "5b06626e940a3ad54e573511d64d4e00dc8d0fd8", "shasum": "" }, "require": { "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1", + "symfony/deprecation-contracts": "^2.1|^3", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-mbstring": "~1.0", "symfony/polyfill-php80": "^1.16" @@ -6457,7 +6457,7 @@ }, "require-dev": { "masterminds/html5": "^2.6", - "symfony/css-selector": "^4.4|^5.0" + "symfony/css-selector": "^4.4|^5.0|^6.0" }, "suggest": { "symfony/css-selector": "" @@ -6488,7 +6488,7 @@ "description": "Eases DOM navigation for HTML and XML documents", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dom-crawler/tree/v5.3.7" + "source": "https://github.com/symfony/dom-crawler/tree/v5.4.0" }, "funding": [ { @@ -6504,24 +6504,25 @@ "type": "tidelift" } ], - "time": "2021-08-29T19:32:13+00:00" + "time": "2021-11-23T10:19:22+00:00" }, { "name": "symfony/finder", - "version": "v5.3.7", + "version": "v5.4.0", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "a10000ada1e600d109a6c7632e9ac42e8bf2fb93" + "reference": "d2f29dac98e96a98be467627bd49c2efb1bc2590" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/a10000ada1e600d109a6c7632e9ac42e8bf2fb93", - "reference": "a10000ada1e600d109a6c7632e9ac42e8bf2fb93", + "url": "https://api.github.com/repos/symfony/finder/zipball/d2f29dac98e96a98be467627bd49c2efb1bc2590", + "reference": "d2f29dac98e96a98be467627bd49c2efb1bc2590", "shasum": "" }, "require": { "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", "symfony/polyfill-php80": "^1.16" }, "type": "library", @@ -6550,7 +6551,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v5.3.7" + "source": "https://github.com/symfony/finder/tree/v5.4.0" }, "funding": [ { @@ -6566,7 +6567,7 @@ "type": "tidelift" } ], - "time": "2021-08-04T21:20:46+00:00" + "time": "2021-11-28T15:25:38+00:00" }, { "name": "theseer/tokenizer", @@ -6695,5 +6696,5 @@ "platform-overrides": { "php": "7.3.6" }, - "plugin-api-version": "2.0.0" + "plugin-api-version": "2.1.0" } diff --git a/system/src/Grav/Common/GPM/Common/Package.php b/system/src/Grav/Common/GPM/Common/Package.php index e06ebb60db..88f1304dd7 100644 --- a/system/src/Grav/Common/GPM/Common/Package.php +++ b/system/src/Grav/Common/GPM/Common/Package.php @@ -45,6 +45,7 @@ public function getData() * @param string $key * @return mixed */ + #[\ReturnTypeWillChange] public function __get($key) { return $this->data->get($key); @@ -55,6 +56,7 @@ public function __get($key) * @param mixed $value * @return void */ + #[\ReturnTypeWillChange] public function __set($key, $value) { $this->data->set($key, $value); @@ -64,6 +66,7 @@ public function __set($key, $value) * @param string $key * @return bool */ + #[\ReturnTypeWillChange] public function __isset($key) { return isset($this->data->{$key}); @@ -72,6 +75,7 @@ public function __isset($key) /** * @return string */ + #[\ReturnTypeWillChange] public function __toString() { return $this->toJson(); diff --git a/system/src/Grav/Common/GPM/GPM.php b/system/src/Grav/Common/GPM/GPM.php index 450569632b..8abbd3dc30 100644 --- a/system/src/Grav/Common/GPM/GPM.php +++ b/system/src/Grav/Common/GPM/GPM.php @@ -74,6 +74,7 @@ public function __construct($refresh = false, $callback = null) * @param string $offset Asset name value * @return mixed Asset value */ + #[\ReturnTypeWillChange] public function __get($offset) { switch ($offset) { @@ -90,6 +91,7 @@ public function __get($offset) * @param string $offset Asset name value * @return bool True if the value is set */ + #[\ReturnTypeWillChange] public function __isset($offset) { switch ($offset) { diff --git a/system/src/Grav/Common/Getters.php b/system/src/Grav/Common/Getters.php index 10f4fdb7af..babd516294 100644 --- a/system/src/Grav/Common/Getters.php +++ b/system/src/Grav/Common/Getters.php @@ -28,6 +28,7 @@ abstract class Getters implements ArrayAccess, Countable * @param int|string $offset Medium name value * @param mixed $value Medium value */ + #[\ReturnTypeWillChange] public function __set($offset, $value) { $this->offsetSet($offset, $value); @@ -39,6 +40,7 @@ public function __set($offset, $value) * @param int|string $offset Medium name value * @return mixed Medium value */ + #[\ReturnTypeWillChange] public function __get($offset) { return $this->offsetGet($offset); @@ -50,6 +52,7 @@ public function __get($offset) * @param int|string $offset Medium name value * @return boolean True if the value is set */ + #[\ReturnTypeWillChange] public function __isset($offset) { return $this->offsetExists($offset); @@ -60,6 +63,7 @@ public function __isset($offset) * * @param int|string $offset The name value to unset */ + #[\ReturnTypeWillChange] public function __unset($offset) { $this->offsetUnset($offset); diff --git a/system/src/Grav/Common/Grav.php b/system/src/Grav/Common/Grav.php index 78827acf4a..2f58940710 100644 --- a/system/src/Grav/Common/Grav.php +++ b/system/src/Grav/Common/Grav.php @@ -652,6 +652,7 @@ public function shutdown(): void * @param array $args * @return mixed|null */ + #[\ReturnTypeWillChange] public function __call($method, $args) { $closure = $this->{$method} ?? null; diff --git a/system/src/Grav/Common/Iterator.php b/system/src/Grav/Common/Iterator.php index 6e80b947e4..d6a629a16c 100644 --- a/system/src/Grav/Common/Iterator.php +++ b/system/src/Grav/Common/Iterator.php @@ -38,6 +38,7 @@ class Iterator implements \ArrayAccess, \Iterator, \Countable, \Serializable * @param mixed $args * @return mixed */ + #[\ReturnTypeWillChange] public function __call($key, $args) { return $this->items[$key] ?? null; @@ -46,6 +47,7 @@ public function __call($key, $args) /** * Clone the iterator. */ + #[\ReturnTypeWillChange] public function __clone() { foreach ($this as $key => $value) { @@ -60,6 +62,7 @@ public function __clone() * * @return string */ + #[\ReturnTypeWillChange] public function __toString() { return implode(',', $this->items); diff --git a/system/src/Grav/Common/Language/Language.php b/system/src/Grav/Common/Language/Language.php index 670975424e..c17382b690 100644 --- a/system/src/Grav/Common/Language/Language.php +++ b/system/src/Grav/Common/Language/Language.php @@ -636,6 +636,7 @@ public function getLanguageCode($code, $type = 'name') /** * @return array */ + #[\ReturnTypeWillChange] public function __debugInfo() { $vars = get_object_vars($this); diff --git a/system/src/Grav/Common/Markdown/ParsedownGravTrait.php b/system/src/Grav/Common/Markdown/ParsedownGravTrait.php index 7c2b0d667c..95a8f5f234 100644 --- a/system/src/Grav/Common/Markdown/ParsedownGravTrait.php +++ b/system/src/Grav/Common/Markdown/ParsedownGravTrait.php @@ -289,6 +289,7 @@ protected function inlineLink($excerpt) * @param array $args * @return mixed|null */ + #[\ReturnTypeWillChange] public function __call($method, $args) { if (isset($this->{$method}) === true) { diff --git a/system/src/Grav/Common/Media/Interfaces/MediaObjectInterface.php b/system/src/Grav/Common/Media/Interfaces/MediaObjectInterface.php index 64388817a8..90c8914813 100644 --- a/system/src/Grav/Common/Media/Interfaces/MediaObjectInterface.php +++ b/system/src/Grav/Common/Media/Interfaces/MediaObjectInterface.php @@ -208,6 +208,7 @@ public function style($style); * @param mixed $args * @return $this */ + #[\ReturnTypeWillChange] public function __call($method, $args); /** diff --git a/system/src/Grav/Common/Media/Traits/MediaObjectTrait.php b/system/src/Grav/Common/Media/Traits/MediaObjectTrait.php index 3c2a38baf5..705d3c83f0 100644 --- a/system/src/Grav/Common/Media/Traits/MediaObjectTrait.php +++ b/system/src/Grav/Common/Media/Traits/MediaObjectTrait.php @@ -138,6 +138,7 @@ public function addAlternative($ratio, MediaObjectInterface $alternative) * * @return string */ + #[\ReturnTypeWillChange] abstract public function __toString(); /** @@ -478,6 +479,7 @@ public function style($style) * @param array $args * @return $this */ + #[\ReturnTypeWillChange] public function __call($method, $args) { $count = count($args); diff --git a/system/src/Grav/Common/Page/Collection.php b/system/src/Grav/Common/Page/Collection.php index 9b2fa6afee..a2fee1b7e8 100644 --- a/system/src/Grav/Common/Page/Collection.php +++ b/system/src/Grav/Common/Page/Collection.php @@ -163,6 +163,7 @@ public function setCurrent(string $path): void * * @return PageInterface */ + #[\ReturnTypeWillChange] public function current() { $current = parent::key(); @@ -175,6 +176,7 @@ public function current() * * @return mixed */ + #[\ReturnTypeWillChange] public function key() { $current = parent::current(); diff --git a/system/src/Grav/Common/Page/Medium/AbstractMedia.php b/system/src/Grav/Common/Page/Medium/AbstractMedia.php index db81ddd4a9..4ba532749c 100644 --- a/system/src/Grav/Common/Page/Medium/AbstractMedia.php +++ b/system/src/Grav/Common/Page/Medium/AbstractMedia.php @@ -90,6 +90,7 @@ public function get($filename) * @param string $filename * @return mixed */ + #[\ReturnTypeWillChange] public function __invoke($filename) { return $this->offsetGet($filename); diff --git a/system/src/Grav/Common/Page/Medium/ImageFile.php b/system/src/Grav/Common/Page/Medium/ImageFile.php index bd853bfc03..9879187146 100644 --- a/system/src/Grav/Common/Page/Medium/ImageFile.php +++ b/system/src/Grav/Common/Page/Medium/ImageFile.php @@ -34,6 +34,7 @@ class ImageFile extends Image /** * Destruct also image object. */ + #[\ReturnTypeWillChange] public function __destruct() { $adapter = $this->adapter; diff --git a/system/src/Grav/Common/Page/Medium/ImageMedium.php b/system/src/Grav/Common/Page/Medium/ImageMedium.php index 46c832ee95..6d1e9043d1 100644 --- a/system/src/Grav/Common/Page/Medium/ImageMedium.php +++ b/system/src/Grav/Common/Page/Medium/ImageMedium.php @@ -89,6 +89,7 @@ public function getMeta(): array /** * Also unset the image on destruct. */ + #[\ReturnTypeWillChange] public function __destruct() { unset($this->image); @@ -97,6 +98,7 @@ public function __destruct() /** * Also clone image. */ + #[\ReturnTypeWillChange] public function __clone() { if ($this->image) { @@ -303,29 +305,45 @@ public function lightbox($width = null, $height = null, $reset = true) return parent::lightbox($width, $height, $reset); } + /** + * @param string $enabled + * @return $this + */ public function autoSizes($enabled = 'true') { - $enabled = $enabled === 'true' ?: false; - $this->auto_sizes = $enabled; + $this->auto_sizes = $enabled === 'true' ?: false; return $this; } + /** + * @param string $enabled + * @return $this + */ public function aspectRatio($enabled = 'true') { - $enabled = $enabled === 'true' ?: false; - $this->aspect_ratio = $enabled; + $this->aspect_ratio = $enabled === 'true' ?: false; return $this; } + /** + * @param int $scale + * @return $this + */ public function retinaScale($scale = 1) { - $this->retina_scale = intval($scale); + $this->retina_scale = (int)$scale; return $this; } + /** + * @param string|null $image + * @param string|null $position + * @param int|float|null $scale + * @return $this + */ public function watermark($image = null, $position = null, $scale = null) { $grav = $this->getGrav(); @@ -406,7 +424,7 @@ public function cropZoom() */ public function addFrame(int $border = 10, string $color = '0x000000') { - if(is_int(intval($border)) && $border>0 && preg_match('/^0x[a-f0-9]{6}$/i', $color)) { // $border must be an integer and bigger than 0; $color must be formatted as an HEX value (0x??????). + if($border > 0 && preg_match('/^0x[a-f0-9]{6}$/i', $color)) { // $border must be an integer and bigger than 0; $color must be formatted as an HEX value (0x??????). $image = ImageFile::open($this->path()); } else { @@ -437,7 +455,7 @@ public function addFrame(int $border = 10, string $color = '0x000000') * @param mixed $args * @return $this|mixed */ - + #[\ReturnTypeWillChange] public function __call($method, $args) { if (!in_array($method, static::$magic_actions, true)) { diff --git a/system/src/Grav/Common/Page/Medium/Link.php b/system/src/Grav/Common/Page/Medium/Link.php index e3c98a853e..03c15e5cbd 100644 --- a/system/src/Grav/Common/Page/Medium/Link.php +++ b/system/src/Grav/Common/Page/Medium/Link.php @@ -79,6 +79,7 @@ public function parsedownElement($title = null, $alt = null, $class = null, $id * @param mixed $args * @return mixed */ + #[\ReturnTypeWillChange] public function __call($method, $args) { $object = $this->source; diff --git a/system/src/Grav/Common/Page/Medium/Medium.php b/system/src/Grav/Common/Page/Medium/Medium.php index 87009ac806..c94cf9fd0e 100644 --- a/system/src/Grav/Common/Page/Medium/Medium.php +++ b/system/src/Grav/Common/Page/Medium/Medium.php @@ -57,6 +57,7 @@ public function __construct($items = [], Blueprint $blueprint = null) /** * Clone medium. */ + #[\ReturnTypeWillChange] public function __clone() { // Allows future compatibility as parent::__clone() works. @@ -90,6 +91,7 @@ public function getMeta(): array * * @return string */ + #[\ReturnTypeWillChange] public function __toString() { return $this->html(); diff --git a/system/src/Grav/Common/Page/Page.php b/system/src/Grav/Common/Page/Page.php index 9ede85fe91..9929262488 100644 --- a/system/src/Grav/Common/Page/Page.php +++ b/system/src/Grav/Common/Page/Page.php @@ -218,6 +218,7 @@ public function init(SplFileInfo $file, $extension = null) return $this; } + #[\ReturnTypeWillChange] public function __clone() { $this->initialized = false; diff --git a/system/src/Grav/Common/Twig/Exception/TwigException.php b/system/src/Grav/Common/Twig/Exception/TwigException.php index 8f543dcc1e..bc023afd72 100644 --- a/system/src/Grav/Common/Twig/Exception/TwigException.php +++ b/system/src/Grav/Common/Twig/Exception/TwigException.php @@ -9,11 +9,13 @@ namespace Grav\Common\Twig\Exception; +use RuntimeException; + /** * TwigException gets thrown when you use {% throw code message %} in twig. * * This allows Grav to catch 401, 403 and 404 exceptions and display proper error page. */ -class TwigException extends \RuntimeException +class TwigException extends RuntimeException { } diff --git a/system/src/Grav/Common/Uri.php b/system/src/Grav/Common/Uri.php index 7bef097594..0a72f37e9e 100644 --- a/system/src/Grav/Common/Uri.php +++ b/system/src/Grav/Common/Uri.php @@ -623,6 +623,7 @@ public function referrer($default = null, $attributes = null, bool $withoutBaseR /** * @return string */ + #[\ReturnTypeWillChange] public function __toString() { return static::buildUrl($this->toArray()); diff --git a/system/src/Grav/Framework/Acl/Permissions.php b/system/src/Grav/Framework/Acl/Permissions.php index 8372f725d0..fddc1a0585 100644 --- a/system/src/Grav/Framework/Acl/Permissions.php +++ b/system/src/Grav/Framework/Acl/Permissions.php @@ -215,6 +215,7 @@ public function getIterator() /** * @return array */ + #[\ReturnTypeWillChange] public function __debugInfo() { return [ diff --git a/system/src/Grav/Framework/Acl/RecursiveActionIterator.php b/system/src/Grav/Framework/Acl/RecursiveActionIterator.php index ac219da385..d37f491b01 100644 --- a/system/src/Grav/Framework/Acl/RecursiveActionIterator.php +++ b/system/src/Grav/Framework/Acl/RecursiveActionIterator.php @@ -26,6 +26,7 @@ class RecursiveActionIterator implements RecursiveIterator, \Countable * @see \Iterator::key() * @return string */ + #[\ReturnTypeWillChange] public function key() { /** @var Action $current */ diff --git a/system/src/Grav/Framework/Cache/Adapter/FileCache.php b/system/src/Grav/Framework/Cache/Adapter/FileCache.php index dc28afcff2..940a7ae60c 100644 --- a/system/src/Grav/Framework/Cache/Adapter/FileCache.php +++ b/system/src/Grav/Framework/Cache/Adapter/FileCache.php @@ -246,6 +246,7 @@ public static function throwError($type, $message, $file, $line) /** * @return void */ + #[\ReturnTypeWillChange] public function __destruct() { if ($this->tmp !== null && file_exists($this->tmp)) { diff --git a/system/src/Grav/Framework/Collection/AbstractIndexCollection.php b/system/src/Grav/Framework/Collection/AbstractIndexCollection.php index c2f57f2c1a..79052ddcb4 100644 --- a/system/src/Grav/Framework/Collection/AbstractIndexCollection.php +++ b/system/src/Grav/Framework/Collection/AbstractIndexCollection.php @@ -79,6 +79,7 @@ public function last() /** * {@inheritDoc} */ + #[\ReturnTypeWillChange] public function key() { /** @phpstan-var TKey $key */ @@ -90,6 +91,7 @@ public function key() /** * {@inheritDoc} */ + #[\ReturnTypeWillChange] public function next() { $value = next($this->entries); @@ -101,6 +103,7 @@ public function next() /** * {@inheritDoc} */ + #[\ReturnTypeWillChange] public function current() { $value = current($this->entries); @@ -345,6 +348,7 @@ public function partition(Closure $p) * * @return string */ + #[\ReturnTypeWillChange] public function __toString() { return __CLASS__ . '@' . spl_object_hash($this); diff --git a/system/src/Grav/Framework/ContentBlock/ContentBlock.php b/system/src/Grav/Framework/ContentBlock/ContentBlock.php index efcd5f3fd7..95d11fd253 100644 --- a/system/src/Grav/Framework/ContentBlock/ContentBlock.php +++ b/system/src/Grav/Framework/ContentBlock/ContentBlock.php @@ -161,6 +161,7 @@ public function toString() /** * @return string */ + #[\ReturnTypeWillChange] public function __toString() { try { diff --git a/system/src/Grav/Framework/File/AbstractFile.php b/system/src/Grav/Framework/File/AbstractFile.php index af9209c684..a49d79fc93 100644 --- a/system/src/Grav/Framework/File/AbstractFile.php +++ b/system/src/Grav/Framework/File/AbstractFile.php @@ -55,6 +55,7 @@ public function __construct(string $filepath, Filesystem $filesystem = null) /** * Unlock file when the object gets destroyed. */ + #[\ReturnTypeWillChange] public function __destruct() { if ($this->isLocked()) { @@ -65,6 +66,7 @@ public function __destruct() /** * @return void */ + #[\ReturnTypeWillChange] public function __clone() { $this->handle = null; diff --git a/system/src/Grav/Framework/Flex/FlexCollection.php b/system/src/Grav/Framework/Flex/FlexCollection.php index d5607d53e5..acacd73234 100644 --- a/system/src/Grav/Framework/Flex/FlexCollection.php +++ b/system/src/Grav/Framework/Flex/FlexCollection.php @@ -541,6 +541,7 @@ public function jsonSerialize() /** * @return array */ + #[\ReturnTypeWillChange] public function __debugInfo() { return [ diff --git a/system/src/Grav/Framework/Flex/FlexDirectoryForm.php b/system/src/Grav/Framework/Flex/FlexDirectoryForm.php index 8d608fdf82..e1b5c47704 100644 --- a/system/src/Grav/Framework/Flex/FlexDirectoryForm.php +++ b/system/src/Grav/Framework/Flex/FlexDirectoryForm.php @@ -358,6 +358,7 @@ public function getMediaTaskRoute(array $params = [], string $extension = null): * @param string $name * @return mixed|null */ + #[\ReturnTypeWillChange] public function __get($name) { $method = "get{$name}"; @@ -375,6 +376,7 @@ public function __get($name) * @param mixed $value * @return void */ + #[\ReturnTypeWillChange] public function __set($name, $value) { $method = "set{$name}"; @@ -387,6 +389,7 @@ public function __set($name, $value) * @param string $name * @return bool */ + #[\ReturnTypeWillChange] public function __isset($name) { $method = "get{$name}"; @@ -403,6 +406,7 @@ public function __isset($name) * @param string $name * @return void */ + #[\ReturnTypeWillChange] public function __unset($name) { } diff --git a/system/src/Grav/Framework/Flex/FlexForm.php b/system/src/Grav/Framework/Flex/FlexForm.php index d25cefc408..313745c550 100644 --- a/system/src/Grav/Framework/Flex/FlexForm.php +++ b/system/src/Grav/Framework/Flex/FlexForm.php @@ -444,6 +444,7 @@ public function getMediaTaskRoute(array $params = [], string $extension = null): * @param string $name * @return mixed|null */ + #[\ReturnTypeWillChange] public function __get($name) { $method = "get{$name}"; @@ -461,6 +462,7 @@ public function __get($name) * @param mixed $value * @return void */ + #[\ReturnTypeWillChange] public function __set($name, $value) { $method = "set{$name}"; @@ -473,6 +475,7 @@ public function __set($name, $value) * @param string $name * @return bool */ + #[\ReturnTypeWillChange] public function __isset($name) { $method = "get{$name}"; @@ -489,6 +492,7 @@ public function __isset($name) * @param string $name * @return void */ + #[\ReturnTypeWillChange] public function __unset($name) { } diff --git a/system/src/Grav/Framework/Flex/FlexIndex.php b/system/src/Grav/Framework/Flex/FlexIndex.php index 9341c617cf..6786172591 100644 --- a/system/src/Grav/Framework/Flex/FlexIndex.php +++ b/system/src/Grav/Framework/Flex/FlexIndex.php @@ -432,6 +432,7 @@ public function call($method, array $arguments = []) * @param array $arguments * @return mixed */ + #[\ReturnTypeWillChange] public function __call($name, $arguments) { /** @var Debugger $debugger */ @@ -522,6 +523,7 @@ public function __unserialize(array $data): void /** * @return array */ + #[\ReturnTypeWillChange] public function __debugInfo() { return [ diff --git a/system/src/Grav/Framework/Flex/FlexObject.php b/system/src/Grav/Framework/Flex/FlexObject.php index 41f8255122..5eccc8f5e0 100644 --- a/system/src/Grav/Framework/Flex/FlexObject.php +++ b/system/src/Grav/Framework/Flex/FlexObject.php @@ -951,6 +951,7 @@ public function setFlexDirectory(FlexDirectory $directory): void * * @return string */ + #[\ReturnTypeWillChange] public function __toString() { return $this->getFlexKey(); @@ -959,6 +960,7 @@ public function __toString() /** * @return array */ + #[\ReturnTypeWillChange] public function __debugInfo() { return [ @@ -974,6 +976,7 @@ public function __debugInfo() /** * Clone object. */ + #[\ReturnTypeWillChange] public function __clone() { // Allows future compatibility as parent::__clone() works. diff --git a/system/src/Grav/Framework/Flex/Pages/FlexPageObject.php b/system/src/Grav/Framework/Flex/Pages/FlexPageObject.php index ebc26b45a1..c2a2d6008f 100644 --- a/system/src/Grav/Framework/Flex/Pages/FlexPageObject.php +++ b/system/src/Grav/Framework/Flex/Pages/FlexPageObject.php @@ -55,6 +55,7 @@ class FlexPageObject extends FlexObject implements PageInterface, FlexTranslateI /** * Clone page. */ + #[\ReturnTypeWillChange] public function __clone() { parent::__clone(); diff --git a/system/src/Grav/Framework/Flex/Traits/FlexMediaTrait.php b/system/src/Grav/Framework/Flex/Traits/FlexMediaTrait.php index dabfe17b78..62894c2eca 100644 --- a/system/src/Grav/Framework/Flex/Traits/FlexMediaTrait.php +++ b/system/src/Grav/Framework/Flex/Traits/FlexMediaTrait.php @@ -286,6 +286,7 @@ public function deleteMediaFile(string $filename): void /** * @return array */ + #[\ReturnTypeWillChange] public function __debugInfo() { return parent::__debugInfo() + [ diff --git a/system/src/Grav/Framework/Form/FormFlashFile.php b/system/src/Grav/Framework/Form/FormFlashFile.php index 2db2bd9a28..800d7c3a86 100644 --- a/system/src/Grav/Framework/Form/FormFlashFile.php +++ b/system/src/Grav/Framework/Form/FormFlashFile.php @@ -201,6 +201,7 @@ public function getTmpFile(): ?string /** * @return array */ + #[\ReturnTypeWillChange] public function __debugInfo() { return [ diff --git a/system/src/Grav/Framework/Object/Access/OverloadedPropertyTrait.php b/system/src/Grav/Framework/Object/Access/OverloadedPropertyTrait.php index 0f0f89f00b..d4dd049a84 100644 --- a/system/src/Grav/Framework/Object/Access/OverloadedPropertyTrait.php +++ b/system/src/Grav/Framework/Object/Access/OverloadedPropertyTrait.php @@ -21,6 +21,7 @@ trait OverloadedPropertyTrait * @param mixed $offset An offset to check for. * @return bool Returns TRUE on success or FALSE on failure. */ + #[\ReturnTypeWillChange] public function __isset($offset) { return $this->hasProperty($offset); @@ -32,6 +33,7 @@ public function __isset($offset) * @param mixed $offset The offset to retrieve. * @return mixed Can return all value types. */ + #[\ReturnTypeWillChange] public function __get($offset) { return $this->getProperty($offset); @@ -44,6 +46,7 @@ public function __get($offset) * @param mixed $value The value to set. * @return void */ + #[\ReturnTypeWillChange] public function __set($offset, $value) { $this->setProperty($offset, $value); @@ -55,6 +58,7 @@ public function __set($offset, $value) * @param mixed $offset The name value to unset * @return void */ + #[\ReturnTypeWillChange] public function __unset($offset) { $this->unsetProperty($offset); diff --git a/system/src/Grav/Framework/Object/Base/ObjectCollectionTrait.php b/system/src/Grav/Framework/Object/Base/ObjectCollectionTrait.php index ba7c2d4eea..b39ebaa16c 100644 --- a/system/src/Grav/Framework/Object/Base/ObjectCollectionTrait.php +++ b/system/src/Grav/Framework/Object/Base/ObjectCollectionTrait.php @@ -192,6 +192,7 @@ public function jsonSerialize() * * @return string */ + #[\ReturnTypeWillChange] public function __toString() { return $this->getKey(); diff --git a/system/src/Grav/Framework/Object/Base/ObjectTrait.php b/system/src/Grav/Framework/Object/Base/ObjectTrait.php index 9b13328f96..7b218c1b48 100644 --- a/system/src/Grav/Framework/Object/Base/ObjectTrait.php +++ b/system/src/Grav/Framework/Object/Base/ObjectTrait.php @@ -183,6 +183,7 @@ public function jsonSerialize() * * @return string */ + #[\ReturnTypeWillChange] public function __toString() { return $this->getKey(); diff --git a/system/src/Grav/Framework/Object/ObjectIndex.php b/system/src/Grav/Framework/Object/ObjectIndex.php index 50ac4271be..b9b4973f7b 100644 --- a/system/src/Grav/Framework/Object/ObjectIndex.php +++ b/system/src/Grav/Framework/Object/ObjectIndex.php @@ -254,6 +254,7 @@ public function matching(Criteria $criteria) * @param array $arguments * @return mixed */ + #[\ReturnTypeWillChange] abstract public function __call($name, $arguments); /** diff --git a/system/src/Grav/Framework/Psr7/AbstractUri.php b/system/src/Grav/Framework/Psr7/AbstractUri.php index 85d802f646..771899578f 100644 --- a/system/src/Grav/Framework/Psr7/AbstractUri.php +++ b/system/src/Grav/Framework/Psr7/AbstractUri.php @@ -263,6 +263,7 @@ public function withFragment($fragment) /** * @return string */ + #[\ReturnTypeWillChange] public function __toString() { return $this->getUrl(); diff --git a/system/src/Grav/Framework/Psr7/Traits/StreamDecoratorTrait.php b/system/src/Grav/Framework/Psr7/Traits/StreamDecoratorTrait.php index db1e746d43..358f18b476 100644 --- a/system/src/Grav/Framework/Psr7/Traits/StreamDecoratorTrait.php +++ b/system/src/Grav/Framework/Psr7/Traits/StreamDecoratorTrait.php @@ -33,6 +33,7 @@ public function __toString(): string /** * @return void */ + #[\ReturnTypeWillChange] public function __destruct() { $this->stream->close(); diff --git a/system/src/Grav/Framework/Route/Route.php b/system/src/Grav/Framework/Route/Route.php index 078c091580..68cd6c2b30 100644 --- a/system/src/Grav/Framework/Route/Route.php +++ b/system/src/Grav/Framework/Route/Route.php @@ -345,6 +345,7 @@ public function toString(bool $includeRoot = false) * @return string * @deprecated 1.6 Use ->toString(true) or ->getUri() instead. */ + #[\ReturnTypeWillChange] public function __toString() { user_error(__CLASS__ . '::' . __FUNCTION__ . '() will change in the future to return route, not relative url: use ->toString(true) or ->getUri() instead.', E_USER_DEPRECATED); diff --git a/system/src/Grav/Framework/Session/Session.php b/system/src/Grav/Framework/Session/Session.php index dc6ce8292a..344c67f12d 100644 --- a/system/src/Grav/Framework/Session/Session.php +++ b/system/src/Grav/Framework/Session/Session.php @@ -409,6 +409,7 @@ public function isStarted() /** * @inheritdoc */ + #[\ReturnTypeWillChange] public function __isset($name) { return isset($_SESSION[$name]); @@ -417,6 +418,7 @@ public function __isset($name) /** * @inheritdoc */ + #[\ReturnTypeWillChange] public function __get($name) { return $_SESSION[$name] ?? null; @@ -425,6 +427,7 @@ public function __get($name) /** * @inheritdoc */ + #[\ReturnTypeWillChange] public function __set($name, $value) { $_SESSION[$name] = $value; @@ -433,6 +436,7 @@ public function __set($name, $value) /** * @inheritdoc */ + #[\ReturnTypeWillChange] public function __unset($name) { unset($_SESSION[$name]); diff --git a/system/src/Grav/Framework/Session/SessionInterface.php b/system/src/Grav/Framework/Session/SessionInterface.php index fcf5061fbb..113e94ccfd 100644 --- a/system/src/Grav/Framework/Session/SessionInterface.php +++ b/system/src/Grav/Framework/Session/SessionInterface.php @@ -124,6 +124,7 @@ public function isStarted(); * @param string $name * @return bool */ + #[\ReturnTypeWillChange] public function __isset($name); /** @@ -132,6 +133,7 @@ public function __isset($name); * @param string $name * @return mixed */ + #[\ReturnTypeWillChange] public function __get($name); /** @@ -141,6 +143,7 @@ public function __get($name); * @param mixed $value * @return void */ + #[\ReturnTypeWillChange] public function __set($name, $value); /** @@ -149,5 +152,6 @@ public function __set($name, $value); * @param string $name * @return void */ + #[\ReturnTypeWillChange] public function __unset($name); } diff --git a/system/src/Grav/Installer/Install.php b/system/src/Grav/Installer/Install.php index 4df9dcd560..b28b00e104 100644 --- a/system/src/Grav/Installer/Install.php +++ b/system/src/Grav/Installer/Install.php @@ -151,6 +151,7 @@ public function setZip(?string $zip) * @param string|null $zip * @return void */ + #[\ReturnTypeWillChange] public function __invoke(?string $zip) { $this->zip = $zip; From ecb2d31df0adff5f8805fc5afea5b22bcf81ae91 Mon Sep 17 00:00:00 2001 From: Matias Griese Date: Thu, 2 Dec 2021 13:52:51 +0200 Subject: [PATCH 24/83] PHP 8.1 --- composer.json | 4 ++-- system/src/Grav/Framework/Acl/Action.php | 1 + tests/phpstan/phpstan.neon | 11 +++++++++++ tests/phpstan/plugins.neon | 11 +++++++++++ 4 files changed, 25 insertions(+), 2 deletions(-) diff --git a/composer.json b/composer.json index 81c357c1fa..c1c4db6fd5 100644 --- a/composer.json +++ b/composer.json @@ -64,8 +64,8 @@ }, "require-dev": { "codeception/codeception": "^4.1", - "phpstan/phpstan": "^1.0", - "phpstan/phpstan-deprecation-rules": "^1.0", + "phpstan/phpstan": "^1.2", + "phpstan/phpstan-deprecation-rules": "^1.2", "phpunit/php-code-coverage": "~9.2", "getgrav/markdowndocs": "^2.0", "codeception/module-asserts": "^1.3", diff --git a/system/src/Grav/Framework/Acl/Action.php b/system/src/Grav/Framework/Acl/Action.php index 1f883a054f..f5a6f6b4d2 100644 --- a/system/src/Grav/Framework/Acl/Action.php +++ b/system/src/Grav/Framework/Acl/Action.php @@ -190,6 +190,7 @@ public function count(): int /** * @return array */ + #[\ReturnTypeWillChange] public function __debugInfo() { return [ diff --git a/tests/phpstan/phpstan.neon b/tests/phpstan/phpstan.neon index 7980103366..f40fec4135 100644 --- a/tests/phpstan/phpstan.neon +++ b/tests/phpstan/phpstan.neon @@ -11,6 +11,17 @@ parameters: excludePaths: - */system/src/Grav/Common/Errors/Resources/layout.html.php - */system/src/Twig/DeferredExtension/DeferredNodeVisitor.php + # Ignore vendor dev dependencies and tests + - */vendor/*/*/tests + - */vendor/behat + - */vendor/codeception + - */vendor/phpstan + - */vendor/phpunit + - */vendor/phpspec + - */vendor/phpdocumentor + - */vendor/sebastian + - */vendor/theseer + - */vendor/webmozart inferPrivatePropertyTypeFromConstructor: true reportUnmatchedIgnoredErrors: false diff --git a/tests/phpstan/plugins.neon b/tests/phpstan/plugins.neon index 7c0e8cb265..6cf9e93c89 100644 --- a/tests/phpstan/plugins.neon +++ b/tests/phpstan/plugins.neon @@ -9,6 +9,17 @@ parameters: - %currentWorkingDirectory%/user/plugins/*/tests/* - %currentWorkingDirectory%/user/plugins/gantry5/src/platforms - %currentWorkingDirectory%/user/plugins/gantry5/src/classes/Gantry/Framework/Services/ErrorServiceProvider.php + # Ignore vendor dev dependencies and tests + - */vendor/*/*/tests + - */vendor/behat + - */vendor/codeception + - */vendor/phpstan + - */vendor/phpunit + - */vendor/phpspec + - */vendor/phpdocumentor + - */vendor/sebastian + - */vendor/theseer + - */vendor/webmozart bootstrapFiles: - plugins-bootstrap.php inferPrivatePropertyTypeFromConstructor: true From ae74f29b6921e78ae430f6f0357f57c48c0e564e Mon Sep 17 00:00:00 2001 From: Matias Griese Date: Thu, 2 Dec 2021 14:32:06 +0200 Subject: [PATCH 25/83] Minor fixes for Grav updater --- system/src/Grav/Installer/Install.php | 15 +++++++++++---- system/src/Grav/Installer/VersionUpdate.php | 2 +- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/system/src/Grav/Installer/Install.php b/system/src/Grav/Installer/Install.php index b28b00e104..889b1d5e6c 100644 --- a/system/src/Grav/Installer/Install.php +++ b/system/src/Grav/Installer/Install.php @@ -36,9 +36,11 @@ final class Install 'php' => [ 'name' => 'PHP', 'versions' => [ - '7.4' => '7.4.0', + '8.1' => '8.1.0', + '8.0' => '8.0.0', + '7.4' => '7.4.1', '7.3' => '7.3.6', - '' => '7.4.12' + '' => '8.0.13' ] ], 'grav' => [ @@ -114,7 +116,7 @@ final class Install /** @var string|null */ private $location; - /** @var VersionUpdater */ + /** @var VersionUpdater|null */ private $updater; /** @var static */ @@ -250,6 +252,11 @@ public function install(): void } try { + if (null === $this->updater) { + $versions = Versions::instance(USER_DIR . 'config/versions.yaml'); + $this->updater = new VersionUpdater('core/grav', __DIR__ . '/updates', $this->getVersion(), $versions); + } + // Update user/config/version.yaml before copying the files to avoid frontend from setting the version schema. $this->updater->install(); @@ -280,7 +287,7 @@ public function install(): void public function finalize(): void { // Finalize can be run without installing Grav first. - if (!$this->updater) { + if (null === $this->updater) { $versions = Versions::instance(USER_DIR . 'config/versions.yaml'); $this->updater = new VersionUpdater('core/grav', __DIR__ . '/updates', GRAV_VERSION, $versions); $this->updater->install(); diff --git a/system/src/Grav/Installer/VersionUpdate.php b/system/src/Grav/Installer/VersionUpdate.php index faaf2a2d90..3efca1f313 100644 --- a/system/src/Grav/Installer/VersionUpdate.php +++ b/system/src/Grav/Installer/VersionUpdate.php @@ -50,7 +50,7 @@ public function getDate(): string public function getPatch(): string { - return $this->date; + return $this->patch; } public function getUpdater(): VersionUpdater From da3e32f9451bb67aa1e2fc083ada0c65a050bfd8 Mon Sep 17 00:00:00 2001 From: Matias Griese Date: Thu, 2 Dec 2021 15:05:29 +0200 Subject: [PATCH 26/83] PHP 8.1: Use strict parameters in `Session` class --- system/src/Grav/Framework/Session/Session.php | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/system/src/Grav/Framework/Session/Session.php b/system/src/Grav/Framework/Session/Session.php index 344c67f12d..f356b20535 100644 --- a/system/src/Grav/Framework/Session/Session.php +++ b/system/src/Grav/Framework/Session/Session.php @@ -189,7 +189,12 @@ public function start($readonly = false) return $this; } - $sessionName = session_name(); + $sessionName = $this->getName(); + $sessionId = $this->getId(); + if (null === $sessionName || null === $sessionId) { + return $this; + } + $sessionExists = isset($_COOKIE[$sessionName]); // Protection against invalid session cookie names throwing exception: http://php.net/manual/en/function.session-id.php#116836 @@ -341,7 +346,7 @@ public function invalidate() $this->removeCookie(); setcookie( - session_name(), + $name, '', $this->getCookieOptions(-42000) ); @@ -483,9 +488,15 @@ protected function setCookie(): void { $this->removeCookie(); + $sessionName = $this->getName(); + $sessionId = $this->getId(); + if (null === $sessionName || null === $sessionId) { + return; + } + setcookie( - session_name(), - session_id(), + $sessionName, + $sessionId, $this->getCookieOptions() ); } From 512c2e5d9df074f8aa8e531cd4629b08d24dd763 Mon Sep 17 00:00:00 2001 From: Matias Griese Date: Thu, 2 Dec 2021 21:22:10 +0200 Subject: [PATCH 27/83] Better typehints for Framework classes --- system/src/Grav/Framework/Acl/Access.php | 3 +- system/src/Grav/Framework/Acl/Action.php | 3 +- system/src/Grav/Framework/Acl/Permissions.php | 12 ++++++-- .../Framework/Acl/RecursiveActionIterator.php | 1 + .../Collection/AbstractFileCollection.php | 4 ++- .../Collection/AbstractIndexCollection.php | 13 +++++--- .../Collection/AbstractLazyCollection.php | 11 ++++++- .../Framework/Collection/ArrayCollection.php | 22 ++++++++++---- .../Collection/CollectionInterface.php | 1 + .../Framework/File/Formatter/CsvFormatter.php | 1 + .../File/Formatter/JsonFormatter.php | 1 + .../Grav/Framework/Filesystem/Filesystem.php | 2 ++ .../Interfaces/FilesystemInterface.php | 2 ++ system/src/Grav/Framework/Flex/Flex.php | 2 ++ .../Grav/Framework/Flex/FlexCollection.php | 15 ++++++++-- .../src/Grav/Framework/Flex/FlexDirectory.php | 30 ++++++++++++------- .../Grav/Framework/Flex/FlexDirectoryForm.php | 1 + system/src/Grav/Framework/Flex/FlexForm.php | 1 + system/src/Grav/Framework/Flex/FlexIndex.php | 2 +- system/src/Grav/Framework/Flex/FlexObject.php | 10 +++---- .../Interfaces/FlexDirectoryInterface.php | 5 ++++ .../Flex/Interfaces/FlexInterface.php | 2 ++ .../Flex/Interfaces/FlexObjectInterface.php | 1 + .../Flex/Pages/FlexPageCollection.php | 9 +++++- .../Flex/Pages/Traits/PageContentTrait.php | 6 ++-- .../Framework/Flex/Storage/SimpleStorage.php | 2 +- .../Framework/Flex/Traits/FlexMediaTrait.php | 5 +++- .../Grav/Framework/Form/Traits/FormTrait.php | 8 +++-- .../Interfaces/MediaCollectionInterface.php | 2 ++ .../src/Grav/Framework/Object/ArrayObject.php | 1 + .../Object/Base/ObjectCollectionTrait.php | 10 ++++++- .../src/Grav/Framework/Object/LazyObject.php | 1 + .../Framework/Object/ObjectCollection.php | 13 ++++---- .../src/Grav/Framework/Object/ObjectIndex.php | 18 +++++++++-- .../Grav/Framework/Object/PropertyObject.php | 2 ++ .../Pagination/AbstractPagination.php | 1 + .../Interfaces/PaginationInterface.php | 1 + system/src/Grav/Framework/Psr7/Response.php | 1 + .../Framework/Session/SessionInterface.php | 2 ++ 39 files changed, 174 insertions(+), 53 deletions(-) diff --git a/system/src/Grav/Framework/Acl/Access.php b/system/src/Grav/Framework/Acl/Access.php index ccc22cf1fb..771d58e2f7 100644 --- a/system/src/Grav/Framework/Acl/Access.php +++ b/system/src/Grav/Framework/Acl/Access.php @@ -25,6 +25,7 @@ /** * Class Access * @package Grav\Framework\Acl + * @implements IteratorAggregate */ class Access implements JsonSerializable, IteratorAggregate, Countable { @@ -34,7 +35,7 @@ class Access implements JsonSerializable, IteratorAggregate, Countable private $rules; /** @var array */ private $ops; - /** @var array */ + /** @var array */ private $acl = []; /** @var array */ private $inherited = []; diff --git a/system/src/Grav/Framework/Acl/Action.php b/system/src/Grav/Framework/Acl/Action.php index f5a6f6b4d2..704f61e0d8 100644 --- a/system/src/Grav/Framework/Acl/Action.php +++ b/system/src/Grav/Framework/Acl/Action.php @@ -21,6 +21,7 @@ /** * Class Action * @package Grav\Framework\Acl + * @implements IteratorAggregate */ class Action implements IteratorAggregate, Countable { @@ -37,7 +38,7 @@ class Action implements IteratorAggregate, Countable /** @var Action|null */ protected $parent; - /** @var Action[] */ + /** @var array */ protected $children = []; /** diff --git a/system/src/Grav/Framework/Acl/Permissions.php b/system/src/Grav/Framework/Acl/Permissions.php index fddc1a0585..1494b10e13 100644 --- a/system/src/Grav/Framework/Acl/Permissions.php +++ b/system/src/Grav/Framework/Acl/Permissions.php @@ -9,20 +9,26 @@ namespace Grav\Framework\Acl; +use ArrayAccess; use ArrayIterator; +use Countable; +use IteratorAggregate; use RecursiveIteratorIterator; use RuntimeException; use Traversable; +use function count; /** * Class Permissions * @package Grav\Framework\Acl + * @implements ArrayAccess + * @implements IteratorAggregate */ -class Permissions implements \ArrayAccess, \Countable, \IteratorAggregate +class Permissions implements ArrayAccess, Countable, IteratorAggregate { - /** @var Action[] */ + /** @var array */ protected $instances = []; - /** @var Action[] */ + /** @var array */ protected $actions = []; /** @var array */ protected $nested = []; diff --git a/system/src/Grav/Framework/Acl/RecursiveActionIterator.php b/system/src/Grav/Framework/Acl/RecursiveActionIterator.php index d37f491b01..3b0e822cd3 100644 --- a/system/src/Grav/Framework/Acl/RecursiveActionIterator.php +++ b/system/src/Grav/Framework/Acl/RecursiveActionIterator.php @@ -17,6 +17,7 @@ /** * Class Action * @package Grav\Framework\Acl + * @implements RecursiveIterator */ class RecursiveActionIterator implements RecursiveIterator, \Countable { diff --git a/system/src/Grav/Framework/Collection/AbstractFileCollection.php b/system/src/Grav/Framework/Collection/AbstractFileCollection.php index 1be8d129a9..77b3247f0a 100644 --- a/system/src/Grav/Framework/Collection/AbstractFileCollection.php +++ b/system/src/Grav/Framework/Collection/AbstractFileCollection.php @@ -68,6 +68,7 @@ public function getPath() /** * @param Criteria $criteria * @return ArrayCollection + * @phpstan-return ArrayCollection * @todo Implement lazy matching */ public function matching(Criteria $criteria) @@ -93,6 +94,7 @@ public function matching(Criteria $criteria) foreach (array_reverse($orderings) as $field => $ordering) { $next = ClosureExpressionVisitor::sortByField($field, $ordering === Criteria::DESC ? -1 : 1, $next); } + /** @phpstan-ignore-next-line */ if (null === $next) { throw new RuntimeException('Criteria is missing orderings'); } @@ -162,6 +164,7 @@ protected function doInitialize() * @param SeekableIterator $iterator * @param int $nestingLimit * @return array + * @phpstan-param SeekableIterator $iterator */ protected function doInitializeByIterator(SeekableIterator $iterator, $nestingLimit) { @@ -211,7 +214,6 @@ protected function doInitializeByIterator(SeekableIterator $iterator, $nestingLi protected function doInitializeChildren(array $children, $nestingLimit) { $objects = []; - foreach ($children as $iterator) { $objects += $this->doInitializeByIterator($iterator, $nestingLimit); } diff --git a/system/src/Grav/Framework/Collection/AbstractIndexCollection.php b/system/src/Grav/Framework/Collection/AbstractIndexCollection.php index 79052ddcb4..341c2e078f 100644 --- a/system/src/Grav/Framework/Collection/AbstractIndexCollection.php +++ b/system/src/Grav/Framework/Collection/AbstractIndexCollection.php @@ -14,6 +14,7 @@ use Grav\Framework\Compat\Serializable; use Grav\Framework\Flex\Interfaces\FlexObjectInterface; use InvalidArgumentException; +use Iterator; use function array_key_exists; use function array_slice; use function count; @@ -82,10 +83,8 @@ public function last() #[\ReturnTypeWillChange] public function key() { - /** @phpstan-var TKey $key */ - $key = (string)key($this->entries); - - return $key; + /** @phpstan-var TKey */ + return (string)key($this->entries); } /** @@ -147,6 +146,7 @@ public function removeElement($element) * Required by interface ArrayAccess. * * {@inheritDoc} + * @phpstan-param TKey|null $offset */ #[\ReturnTypeWillChange] public function offsetExists($offset) @@ -158,6 +158,7 @@ public function offsetExists($offset) * Required by interface ArrayAccess. * * {@inheritDoc} + * @phpstan-param TKey|null $offset */ #[\ReturnTypeWillChange] public function offsetGet($offset) @@ -169,6 +170,7 @@ public function offsetGet($offset) * Required by interface ArrayAccess. * * {@inheritDoc} + * @phpstan-param TKey|null $offset */ #[\ReturnTypeWillChange] public function offsetSet($offset, $value) @@ -184,6 +186,7 @@ public function offsetSet($offset, $value) * Required by interface ArrayAccess. * * {@inheritDoc} + * @phpstan-param TKey|null $offset */ #[\ReturnTypeWillChange] public function offsetUnset($offset) @@ -304,6 +307,7 @@ public function isEmpty() * Required by interface IteratorAggregate. * * {@inheritDoc} + * @phpstan-return Iterator */ #[\ReturnTypeWillChange] public function getIterator() @@ -444,6 +448,7 @@ public function unselect(array $keys) * * @param int $size Size of each chunk. * @return array + * @phpstan-return array> */ public function chunk($size) { diff --git a/system/src/Grav/Framework/Collection/AbstractLazyCollection.php b/system/src/Grav/Framework/Collection/AbstractLazyCollection.php index d7e6f3191b..5f7ad1b12e 100644 --- a/system/src/Grav/Framework/Collection/AbstractLazyCollection.php +++ b/system/src/Grav/Framework/Collection/AbstractLazyCollection.php @@ -22,11 +22,15 @@ */ abstract class AbstractLazyCollection extends BaseAbstractLazyCollection implements CollectionInterface { - /** @var ArrayCollection The backed collection to use */ + /** + * @par ArrayCollection + * @phpstan-var ArrayCollection + */ protected $collection; /** * {@inheritDoc} + * @phpstan-return ArrayCollection */ public function reverse() { @@ -37,6 +41,7 @@ public function reverse() /** * {@inheritDoc} + * @phpstan-return ArrayCollection */ public function shuffle() { @@ -57,6 +62,8 @@ public function chunk($size) /** * {@inheritDoc} + * @phpstan-param array $keys + * @phpstan-return ArrayCollection */ public function select(array $keys) { @@ -67,6 +74,8 @@ public function select(array $keys) /** * {@inheritDoc} + * @phpstan-param array $keys + * @phpstan-return ArrayCollection */ public function unselect(array $keys) { diff --git a/system/src/Grav/Framework/Collection/ArrayCollection.php b/system/src/Grav/Framework/Collection/ArrayCollection.php index 4a54b3cb97..892cfcb5a6 100644 --- a/system/src/Grav/Framework/Collection/ArrayCollection.php +++ b/system/src/Grav/Framework/Collection/ArrayCollection.php @@ -30,7 +30,10 @@ class ArrayCollection extends BaseArrayCollection implements CollectionInterface */ public function reverse() { - return $this->createFrom(array_reverse($this->toArray())); + $keys = array_reverse($this->toArray()); + + /** @phpstan-var static */ + return $this->createFrom($keys); } /** @@ -43,8 +46,10 @@ public function shuffle() { $keys = $this->getKeys(); shuffle($keys); + $keys = array_replace(array_flip($keys), $this->toArray()); - return $this->createFrom(array_replace(array_flip($keys), $this->toArray()) ?? []); + /** @phpstan-var static */ + return $this->createFrom($keys); } /** @@ -52,9 +57,11 @@ public function shuffle() * * @param int $size Size of each chunk. * @return array + * @phpstan-return array> */ public function chunk($size) { + /** @phpstan-var array> */ return array_chunk($this->toArray(), $size, true); } @@ -63,9 +70,9 @@ public function chunk($size) * * Collection is returned in the order of $keys given to the function. * - * @param array $keys + * @param array $keys * @return static - * @phpstan-param array $keys + * @phpstan-param TKey[] $keys * @phpstan-return static */ public function select(array $keys) @@ -77,6 +84,7 @@ public function select(array $keys) } } + /** @phpstan-var static */ return $this->createFrom($list); } @@ -85,11 +93,15 @@ public function select(array $keys) * * @param array $keys * @return static + * @phpstan-param TKey[] $keys * @phpstan-return static */ public function unselect(array $keys) { - return $this->select(array_diff($this->getKeys(), $keys)); + $list = array_diff($this->getKeys(), $keys); + + /** @phpstan-var static */ + return $this->select($list); } /** diff --git a/system/src/Grav/Framework/Collection/CollectionInterface.php b/system/src/Grav/Framework/Collection/CollectionInterface.php index 0739109ba0..def9427a12 100644 --- a/system/src/Grav/Framework/Collection/CollectionInterface.php +++ b/system/src/Grav/Framework/Collection/CollectionInterface.php @@ -43,6 +43,7 @@ public function shuffle(); * * @param int $size Size of each chunk. * @return array + * @phpstan-return array> */ public function chunk($size); diff --git a/system/src/Grav/Framework/File/Formatter/CsvFormatter.php b/system/src/Grav/Framework/File/Formatter/CsvFormatter.php index 9d0a9a882e..072de1211d 100644 --- a/system/src/Grav/Framework/File/Formatter/CsvFormatter.php +++ b/system/src/Grav/Framework/File/Formatter/CsvFormatter.php @@ -16,6 +16,7 @@ use JsonSerializable; use RuntimeException; use stdClass; +use function count; use function is_array; use function is_object; use function is_scalar; diff --git a/system/src/Grav/Framework/File/Formatter/JsonFormatter.php b/system/src/Grav/Framework/File/Formatter/JsonFormatter.php index 6b19690c32..c76864533c 100644 --- a/system/src/Grav/Framework/File/Formatter/JsonFormatter.php +++ b/system/src/Grav/Framework/File/Formatter/JsonFormatter.php @@ -117,6 +117,7 @@ public function getDecodeOptions(): int * Returns recursion depth used in decode() function. * * @return int + * @phpstan-return positive-int */ public function getDecodeDepth(): int { diff --git a/system/src/Grav/Framework/Filesystem/Filesystem.php b/system/src/Grav/Framework/Filesystem/Filesystem.php index 9b077d7801..d93f4c22ad 100644 --- a/system/src/Grav/Framework/Filesystem/Filesystem.php +++ b/system/src/Grav/Framework/Filesystem/Filesystem.php @@ -176,6 +176,7 @@ public function dirname(string $path, int $levels = 1): string * @param string $path * @param int $levels * @return string + * @phpstan-param positive-int $levels */ public function pathname(string $path, int $levels = 1): string { @@ -204,6 +205,7 @@ public function pathinfo(string $path, ?int $options = null) * @param string $path * @param int $levels * @return array + * @phpstan-param positive-int $levels */ protected function dirnameInternal(?string $scheme, string $path, int $levels = 1): array { diff --git a/system/src/Grav/Framework/Filesystem/Interfaces/FilesystemInterface.php b/system/src/Grav/Framework/Filesystem/Interfaces/FilesystemInterface.php index 0e280a837d..f80b772444 100644 --- a/system/src/Grav/Framework/Filesystem/Interfaces/FilesystemInterface.php +++ b/system/src/Grav/Framework/Filesystem/Interfaces/FilesystemInterface.php @@ -31,6 +31,7 @@ interface FilesystemInterface * @param int $levels The number of parent directories to go up (>= 1). * @return string Returns parent path. * @throws RuntimeException + * @phpstan-param positive-int $levels * @api */ public function parent(string $path, int $levels = 1): string; @@ -64,6 +65,7 @@ public function basename(string $path, ?string $suffix = null): string; * @param int $levels The number of parent directories to go up (>= 1). * @return string Returns path to the directory. * @throws RuntimeException + * @phpstan-param positive-int $levels * @api */ public function dirname(string $path, int $levels = 1): string; diff --git a/system/src/Grav/Framework/Flex/Flex.php b/system/src/Grav/Framework/Flex/Flex.php index ce285215cf..e60dc50e16 100644 --- a/system/src/Grav/Framework/Flex/Flex.php +++ b/system/src/Grav/Framework/Flex/Flex.php @@ -123,6 +123,7 @@ public function getDirectory(string $type): ?FlexDirectory * @param array|null $keys * @param string|null $keyField * @return FlexCollectionInterface|null + * @phpstan-return FlexCollectionInterface|null */ public function getCollection(string $type, array $keys = null, string $keyField = null): ?FlexCollectionInterface { @@ -137,6 +138,7 @@ public function getCollection(string $type, array $keys = null, string $keyField * collection_class: Class to be used to create the collection. Defaults to ObjectCollection. * @return FlexCollectionInterface * @throws RuntimeException + * @phpstan-return FlexCollectionInterface */ public function getMixedCollection(array $keys, array $options = []): FlexCollectionInterface { diff --git a/system/src/Grav/Framework/Flex/FlexCollection.php b/system/src/Grav/Framework/Flex/FlexCollection.php index acacd73234..48d18ef0f6 100644 --- a/system/src/Grav/Framework/Flex/FlexCollection.php +++ b/system/src/Grav/Framework/Flex/FlexCollection.php @@ -152,7 +152,11 @@ public function search(string $search, $properties = null, array $options = null arsort($matching, SORT_NUMERIC); } - return $this->select(array_keys($matching)); + /** @var string[] $array */ + $array = array_keys($matching); + + /** @phpstan-var static */ + return $this->select($array); } /** @@ -163,7 +167,7 @@ public function sort(array $order) { $criteria = Criteria::create()->orderBy($order); - /** @var FlexCollectionInterface $matching */ + /** @phpstan-var FlexCollectionInterface $matching */ $matching = $this->matching($criteria); return $matching; @@ -183,6 +187,7 @@ public function filterBy(array $filters) $criteria->andWhere($expr->eq($key, $value)); } + /** @phpstan-var static */ return $this->matching($criteria); } @@ -497,7 +502,11 @@ public function isAuthorized(string $action, string $scope = null, UserInterface $list = $this->call('isAuthorized', [$action, $scope, $user]); $list = array_filter($list); - return $this->select(array_keys($list)); + /** @var string[] $keys */ + $keys = array_keys($list); + + /** @phpstan-var static */ + return $this->select($keys); } /** diff --git a/system/src/Grav/Framework/Flex/FlexDirectory.php b/system/src/Grav/Framework/Flex/FlexDirectory.php index 29f1490f82..c84e3d1858 100644 --- a/system/src/Grav/Framework/Flex/FlexDirectory.php +++ b/system/src/Grav/Framework/Flex/FlexDirectory.php @@ -45,7 +45,6 @@ /** * Class FlexDirectory * @package Grav\Framework\Flex - * @template T */ class FlexDirectory implements FlexDirectoryInterface { @@ -57,9 +56,15 @@ class FlexDirectory implements FlexDirectoryInterface protected $blueprint_file; /** @var Blueprint[] */ protected $blueprints; - /** @var FlexIndexInterface[] */ + /** + * @var FlexIndexInterface[] + * @phpstan-var FlexIndexInterface[] + */ protected $indexes = []; - /** @var FlexCollectionInterface|null */ + /** + * @var FlexCollectionInterface|null + * @phpstan-var FlexCollectionInterface|null + */ protected $collection; /** @var bool */ protected $enabled; @@ -318,7 +323,7 @@ public function getBlueprintFile(string $view = ''): string * @param array|null $keys Array of keys. * @param string|null $keyField Field to be used as the key. * @return FlexCollectionInterface - * @phpstan-return FlexCollectionInterface + * @phpstan-return FlexCollectionInterface */ public function getCollection(array $keys = null, string $keyField = null): FlexCollectionInterface { @@ -345,6 +350,7 @@ public function getCollection(array $keys = null, string $keyField = null): Flex * @param array|null $keys Array of keys. * @param string|null $keyField Field to be used as the key. * @return FlexIndexInterface + * @phpstan-return FlexIndexInterface */ public function getIndex(array $keys = null, string $keyField = null): FlexIndexInterface { @@ -353,7 +359,7 @@ public function getIndex(array $keys = null, string $keyField = null): FlexIndex $index = clone $index; if (null !== $keys) { - /** @var FlexIndexInterface $index */ + /** @var FlexIndexInterface $index */ $index = $index->select($keys); } @@ -487,7 +493,7 @@ public function getStorage(): FlexStorageInterface */ public function createObject(array $data, string $key = '', bool $validate = false): FlexObjectInterface { - /** @var string|FlexObjectInterface $className */ + /** @phpstan-var class-string $className */ $className = $this->objectClassName ?: $this->getObjectClass(); return new $className($data, $key, $this, $validate); @@ -497,10 +503,11 @@ public function createObject(array $data, string $key = '', bool $validate = fal * @param array $entries * @param string|null $keyField * @return FlexCollectionInterface + * @phpstan-return FlexCollectionInterface */ public function createCollection(array $entries, string $keyField = null): FlexCollectionInterface { - /** @var string|FlexCollectionInterface $className */ + /** phpstan-var class-string $className */ $className = $this->collectionClassName ?: $this->getCollectionClass(); return $className::createFromArray($entries, $this, $keyField); @@ -510,10 +517,11 @@ public function createCollection(array $entries, string $keyField = null): FlexC * @param array $entries * @param string|null $keyField * @return FlexIndexInterface + * @phpstan-return FlexIndexInterface */ public function createIndex(array $entries, string $keyField = null): FlexIndexInterface { - /** @var string|FlexIndexInterface $className */ + /** @phpstan-var class-string $className */ $className = $this->indexClassName ?: $this->getIndexClass(); return $className::createFromArray($entries, $this, $keyField); @@ -560,6 +568,7 @@ public function getIndexClass(): string * @param array $entries * @param string|null $keyField * @return FlexCollectionInterface + * @phpstan-return FlexCollectionInterface */ public function loadCollection(array $entries, string $keyField = null): FlexCollectionInterface { @@ -895,6 +904,7 @@ protected function createStorage(): FlexStorageInterface /** * @param string $keyField * @return FlexIndexInterface + * @phpstan-return FlexIndexInterface */ protected function loadIndex(string $keyField): FlexIndexInterface { @@ -924,7 +934,7 @@ protected function loadIndex(string $keyField): FlexIndexInterface } if (!is_array($keys)) { - /** @var string|FlexIndexInterface $className */ + /** @phpstan-var class-string $className */ $className = $this->getIndexClass(); $keys = $className::loadEntriesFromStorage($storage); if (!$cache instanceof MemoryCache) { @@ -946,7 +956,7 @@ protected function loadIndex(string $keyField): FlexIndexInterface // We need to do this in two steps as orderBy() calls loadIndex() again and we do not want infinite loop. $this->indexes['storage_key'] = $index = $this->createIndex($keys, 'storage_key'); if ($ordering) { - /** @var FlexCollectionInterface $collection */ + /** @var FlexCollectionInterface $collection */ $collection = $this->indexes['storage_key']->orderBy($ordering); $this->indexes['storage_key'] = $index = $collection->getIndex(); } diff --git a/system/src/Grav/Framework/Flex/FlexDirectoryForm.php b/system/src/Grav/Framework/Flex/FlexDirectoryForm.php index e1b5c47704..693ef120b5 100644 --- a/system/src/Grav/Framework/Flex/FlexDirectoryForm.php +++ b/system/src/Grav/Framework/Flex/FlexDirectoryForm.php @@ -497,6 +497,7 @@ protected function doUnserialize(array $data): void * Filter validated data. * * @param ArrayAccess|Data|null $data + * @phpstan-param ArrayAccess|Data|null $data */ protected function filterData($data = null): void { diff --git a/system/src/Grav/Framework/Flex/FlexForm.php b/system/src/Grav/Framework/Flex/FlexForm.php index 313745c550..5d7221847c 100644 --- a/system/src/Grav/Framework/Flex/FlexForm.php +++ b/system/src/Grav/Framework/Flex/FlexForm.php @@ -598,6 +598,7 @@ protected function doUnserialize(array $data): void * * @param ArrayAccess|Data|null $data * @return void + * @phpstan-param ArrayAccess|Data|null $data */ protected function filterData($data = null): void { diff --git a/system/src/Grav/Framework/Flex/FlexIndex.php b/system/src/Grav/Framework/Flex/FlexIndex.php index 6786172591..98b26679ff 100644 --- a/system/src/Grav/Framework/Flex/FlexIndex.php +++ b/system/src/Grav/Framework/Flex/FlexIndex.php @@ -438,7 +438,7 @@ public function __call($name, $arguments) /** @var Debugger $debugger */ $debugger = Grav::instance()['debugger']; - /** @var FlexCollection $className */ + /** @phpstan-var class-string $className */ $className = $this->getFlexDirectory()->getCollectionClass(); $cachedMethods = $className::getCachedMethods(); diff --git a/system/src/Grav/Framework/Flex/FlexObject.php b/system/src/Grav/Framework/Flex/FlexObject.php index 5eccc8f5e0..f770592256 100644 --- a/system/src/Grav/Framework/Flex/FlexObject.php +++ b/system/src/Grav/Framework/Flex/FlexObject.php @@ -69,13 +69,13 @@ class FlexObject implements FlexObjectInterface, FlexAuthorizeInterface private $_forms = []; /** @var Blueprint[] */ private $_blueprint = []; - /** @var array */ + /** @var array|null */ private $_meta; - /** @var array */ + /** @var array|null */ protected $_original; - /** @var string */ + /** @var string|null */ protected $storage_key; - /** @var int */ + /** @var int|null */ protected $storage_timestamp; /** @@ -776,7 +776,7 @@ public function save() $value = reset($result); $meta = $value['__META'] ?? null; if ($meta) { - /** @var FlexIndex $indexClass */ + /** @phpstan-var class-string $indexClass */ $indexClass = $this->getFlexDirectory()->getIndexClass(); $indexClass::updateObjectMeta($meta, $value, $storage); $this->_meta = $meta; diff --git a/system/src/Grav/Framework/Flex/Interfaces/FlexDirectoryInterface.php b/system/src/Grav/Framework/Flex/Interfaces/FlexDirectoryInterface.php index 07eab014a3..1d95657452 100644 --- a/system/src/Grav/Framework/Flex/Interfaces/FlexDirectoryInterface.php +++ b/system/src/Grav/Framework/Flex/Interfaces/FlexDirectoryInterface.php @@ -105,6 +105,7 @@ public function getBlueprintFile(string $view = ''): string; * @param array|null $keys Array of keys. * @param string|null $keyField Field to be used as the key. * @return FlexCollectionInterface + * @phpstan-return FlexCollectionInterface */ public function getCollection(array $keys = null, string $keyField = null): FlexCollectionInterface; @@ -116,6 +117,7 @@ public function getCollection(array $keys = null, string $keyField = null): Flex * @param array|null $keys Array of keys. * @param string|null $keyField Field to be used as the key. * @return FlexIndexInterface + * @phpstan-return FlexIndexInterface */ public function getIndex(array $keys = null, string $keyField = null): FlexIndexInterface; @@ -170,6 +172,7 @@ public function createObject(array $data, string $key = '', bool $validate = fal * @param array $entries * @param string|null $keyField * @return FlexCollectionInterface + * @phpstan-return FlexCollectionInterface */ public function createCollection(array $entries, string $keyField = null): FlexCollectionInterface; @@ -177,6 +180,7 @@ public function createCollection(array $entries, string $keyField = null): FlexC * @param array $entries * @param string|null $keyField * @return FlexIndexInterface + * @phpstan-return FlexIndexInterface */ public function createIndex(array $entries, string $keyField = null): FlexIndexInterface; @@ -199,6 +203,7 @@ public function getIndexClass(): string; * @param array $entries * @param string|null $keyField * @return FlexCollectionInterface + * @phpstan-return FlexCollectionInterface */ public function loadCollection(array $entries, string $keyField = null): FlexCollectionInterface; diff --git a/system/src/Grav/Framework/Flex/Interfaces/FlexInterface.php b/system/src/Grav/Framework/Flex/Interfaces/FlexInterface.php index 3c5a103d23..cbd440bd22 100644 --- a/system/src/Grav/Framework/Flex/Interfaces/FlexInterface.php +++ b/system/src/Grav/Framework/Flex/Interfaces/FlexInterface.php @@ -59,6 +59,7 @@ public function getDirectory(string $type): ?FlexDirectory; * @param array|null $keys * @param string|null $keyField * @return FlexCollectionInterface|null + * @phpstan-return FlexCollectionInterface|null */ public function getCollection(string $type, array $keys = null, string $keyField = null): ?FlexCollectionInterface; @@ -68,6 +69,7 @@ public function getCollection(string $type, array $keys = null, string $keyField * collection_class: Class to be used to create the collection. Defaults to ObjectCollection. * @return FlexCollectionInterface * @throws RuntimeException + * @phpstan-return FlexCollectionInterface */ public function getMixedCollection(array $keys, array $options = []): FlexCollectionInterface; diff --git a/system/src/Grav/Framework/Flex/Interfaces/FlexObjectInterface.php b/system/src/Grav/Framework/Flex/Interfaces/FlexObjectInterface.php index a1e3e3b922..a0f30c6e94 100644 --- a/system/src/Grav/Framework/Flex/Interfaces/FlexObjectInterface.php +++ b/system/src/Grav/Framework/Flex/Interfaces/FlexObjectInterface.php @@ -23,6 +23,7 @@ /** * Defines Flex Objects. * + * @extends ArrayAccess * @used-by \Grav\Framework\Flex\FlexObject * @since 1.6 */ diff --git a/system/src/Grav/Framework/Flex/Pages/FlexPageCollection.php b/system/src/Grav/Framework/Flex/Pages/FlexPageCollection.php index 94825681c6..d273218274 100644 --- a/system/src/Grav/Framework/Flex/Pages/FlexPageCollection.php +++ b/system/src/Grav/Framework/Flex/Pages/FlexPageCollection.php @@ -13,6 +13,7 @@ use Grav\Common\Page\Interfaces\PageInterface; use Grav\Framework\Flex\FlexCollection; +use Grav\Framework\Flex\Interfaces\FlexObjectInterface; use function array_search; use function assert; use function is_int; @@ -20,7 +21,7 @@ /** * Class FlexPageCollection * @package Grav\Plugin\FlexObjects\Types\FlexPages - * @template T of \Grav\Framework\Flex\Interfaces\FlexObjectInterface + * @template T of FlexObjectInterface * @extends FlexCollection */ class FlexPageCollection extends FlexCollection @@ -56,8 +57,10 @@ public static function getCachedMethods(): array */ public function withPublished(bool $bool = true) { + /** @var string[] $list */ $list = array_keys(array_filter($this->call('isPublished', [$bool]))); + /** @phpstan-var static */ return $this->select($list); } @@ -68,8 +71,10 @@ public function withPublished(bool $bool = true) */ public function withVisible(bool $bool = true) { + /** @var string[] $list */ $list = array_keys(array_filter($this->call('isVisible', [$bool]))); + /** @phpstan-var static */ return $this->select($list); } @@ -80,8 +85,10 @@ public function withVisible(bool $bool = true) */ public function withRoutable(bool $bool = true) { + /** @var string[] $list */ $list = array_keys(array_filter($this->call('isRoutable', [$bool]))); + /** @phpstan-var static */ return $this->select($list); } diff --git a/system/src/Grav/Framework/Flex/Pages/Traits/PageContentTrait.php b/system/src/Grav/Framework/Flex/Pages/Traits/PageContentTrait.php index 6aff732777..f534c132c0 100644 --- a/system/src/Grav/Framework/Flex/Pages/Traits/PageContentTrait.php +++ b/system/src/Grav/Framework/Flex/Pages/Traits/PageContentTrait.php @@ -75,13 +75,13 @@ trait PageContentTrait 'template' => 'template', ]; - /** @var object */ + /** @var object|null */ protected $header; - /** @var string */ + /** @var string|null */ protected $_summary; - /** @var string */ + /** @var string|null */ protected $_content; /** diff --git a/system/src/Grav/Framework/Flex/Storage/SimpleStorage.php b/system/src/Grav/Framework/Flex/Storage/SimpleStorage.php index 6faac9d846..78a4ad2063 100644 --- a/system/src/Grav/Framework/Flex/Storage/SimpleStorage.php +++ b/system/src/Grav/Framework/Flex/Storage/SimpleStorage.php @@ -30,7 +30,7 @@ class SimpleStorage extends AbstractFilesystemStorage protected $dataFolder; /** @var string */ protected $dataPattern; - /** @var string */ + /** @var string|null */ protected $prefix; /** @var array|null */ protected $data; diff --git a/system/src/Grav/Framework/Flex/Traits/FlexMediaTrait.php b/system/src/Grav/Framework/Flex/Traits/FlexMediaTrait.php index 62894c2eca..66c868852f 100644 --- a/system/src/Grav/Framework/Flex/Traits/FlexMediaTrait.php +++ b/system/src/Grav/Framework/Flex/Traits/FlexMediaTrait.php @@ -165,6 +165,9 @@ protected function getMediaFieldSettings(string $field): array return $settings + ['accept' => '*', 'limit' => 1000, 'self' => true]; } + /** + * @return array + */ protected function getMediaFields(): array { // Load settings for the field. @@ -398,7 +401,7 @@ protected function addUpdatedMedia(MediaCollectionInterface $media): void } /** - * @return array + * @return array */ protected function getUpdatedMedia(): array { diff --git a/system/src/Grav/Framework/Form/Traits/FormTrait.php b/system/src/Grav/Framework/Form/Traits/FormTrait.php index d77a402747..32df48037f 100644 --- a/system/src/Grav/Framework/Form/Traits/FormTrait.php +++ b/system/src/Grav/Framework/Form/Traits/FormTrait.php @@ -65,10 +65,10 @@ trait FormTrait private $sessionid; /** @var bool */ private $submitted; - /** @var ArrayAccess|Data|null */ + /** @var ArrayAccess|Data|null */ private $data; - /** @var array|UploadedFileInterface[] */ - private $files; + /** @var UploadedFileInterface[] */ + private $files = []; /** @var FormFlashInterface|null */ private $flash; /** @var string */ @@ -721,6 +721,7 @@ protected function parseRequest(ServerRequestInterface $request): array * @param ArrayAccess|Data|null $data * @return void * @throws ValidationException + * @phpstan-param ArrayAccess|Data|null $data * @throws Exception */ protected function validateData($data = null): void @@ -735,6 +736,7 @@ protected function validateData($data = null): void * * @param ArrayAccess|Data|null $data * @return void + * @phpstan-param ArrayAccess|Data|null $data */ protected function filterData($data = null): void { diff --git a/system/src/Grav/Framework/Media/Interfaces/MediaCollectionInterface.php b/system/src/Grav/Framework/Media/Interfaces/MediaCollectionInterface.php index e763f42d27..b3985f3085 100644 --- a/system/src/Grav/Framework/Media/Interfaces/MediaCollectionInterface.php +++ b/system/src/Grav/Framework/Media/Interfaces/MediaCollectionInterface.php @@ -15,6 +15,8 @@ /** * Class implements media collection interface. + * @extends ArrayAccess + * @extends Iterator */ interface MediaCollectionInterface extends ArrayAccess, Countable, Iterator { diff --git a/system/src/Grav/Framework/Object/ArrayObject.php b/system/src/Grav/Framework/Object/ArrayObject.php index 2bbe937814..57b65261df 100644 --- a/system/src/Grav/Framework/Object/ArrayObject.php +++ b/system/src/Grav/Framework/Object/ArrayObject.php @@ -19,6 +19,7 @@ /** * Array Objects keep the data in private array property. + * @implements ArrayAccess */ class ArrayObject implements NestedObjectInterface, ArrayAccess { diff --git a/system/src/Grav/Framework/Object/Base/ObjectCollectionTrait.php b/system/src/Grav/Framework/Object/Base/ObjectCollectionTrait.php index b39ebaa16c..b110c5b571 100644 --- a/system/src/Grav/Framework/Object/Base/ObjectCollectionTrait.php +++ b/system/src/Grav/Framework/Object/Base/ObjectCollectionTrait.php @@ -20,6 +20,9 @@ /** * ObjectCollection Trait * @package Grav\Framework\Object + * + * @template TKey as array-key + * @template T as object */ trait ObjectCollectionTrait { @@ -211,14 +214,18 @@ public function setKey($key) /** * Create a copy from this collection by cloning all objects in the collection. + * + * @return static */ public function copy() { $list = []; foreach ($this->getIterator() as $key => $value) { + /** @phpstan-ignore-next-line */ $list[$key] = is_object($value) ? clone $value : $value; } + /** @phpstan-var static */ return $this->createFrom($list); } @@ -334,6 +341,7 @@ public function call($method, array $arguments = []) * * @param string $property * @return array + * @phpstan-return array */ public function group($property) { @@ -352,12 +360,12 @@ public function group($property) * * @param string $property * @return static[] + * @phpstan-return array> */ public function collectionGroup($property) { $collections = []; foreach ($this->group($property) as $id => $elements) { - /** @var static $collection */ $collection = $this->createFrom($elements); $collections[$id] = $collection; diff --git a/system/src/Grav/Framework/Object/LazyObject.php b/system/src/Grav/Framework/Object/LazyObject.php index 309c0d6f65..752c5b2d7f 100644 --- a/system/src/Grav/Framework/Object/LazyObject.php +++ b/system/src/Grav/Framework/Object/LazyObject.php @@ -22,6 +22,7 @@ * not exist or is not initialized. * * @package Grav\Framework\Object + * @implements ArrayAccess */ class LazyObject implements NestedObjectInterface, ArrayAccess { diff --git a/system/src/Grav/Framework/Object/ObjectCollection.php b/system/src/Grav/Framework/Object/ObjectCollection.php index 3fdebce91b..af861c2cef 100644 --- a/system/src/Grav/Framework/Object/ObjectCollection.php +++ b/system/src/Grav/Framework/Object/ObjectCollection.php @@ -22,12 +22,13 @@ * Class contains a collection of objects. * * @template TKey of array-key - * @template T + * @template T of object * @extends ArrayCollection * @implements NestedObjectCollectionInterface */ class ObjectCollection extends ArrayCollection implements NestedObjectCollectionInterface { + /** @phpstan-use ObjectCollectionTrait */ use ObjectCollectionTrait; use NestedPropertyCollectionTrait { NestedPropertyCollectionTrait::group insteadof ObjectCollectionTrait; @@ -65,6 +66,7 @@ public function orderBy(array $ordering) */ public function limit($start, $limit = null) { + /** @phpstan-var static */ return $this->createFrom($this->slice($start, $limit)); } @@ -86,14 +88,11 @@ public function matching(Criteria $criteria) if ($orderings = $criteria->getOrderings()) { $next = null; - /** - * @var string $field - * @var string $ordering - */ foreach (array_reverse($orderings) as $field => $ordering) { $next = ObjectExpressionVisitor::sortByField($field, $ordering === Criteria::DESC ? -1 : 1, $next); } + /** @phpstan-ignore-next-line */ if ($next) { uasort($filtered, $next); } @@ -106,11 +105,13 @@ public function matching(Criteria $criteria) $filtered = array_slice($filtered, (int)$offset, $length); } + /** @phpstan-var static */ return $this->createFrom($filtered); } /** * @return array + * @phpstan-return array */ protected function getElements() { @@ -120,9 +121,11 @@ protected function getElements() /** * @param array $elements * @return array + * @phpstan-return array */ protected function setElements(array $elements) { + /** @phpstan-var array */ return $elements; } } diff --git a/system/src/Grav/Framework/Object/ObjectIndex.php b/system/src/Grav/Framework/Object/ObjectIndex.php index b9b4973f7b..bc1fad248d 100644 --- a/system/src/Grav/Framework/Object/ObjectIndex.php +++ b/system/src/Grav/Framework/Object/ObjectIndex.php @@ -25,7 +25,7 @@ * * @template TKey of array-key * @template T of \Grav\Framework\Object\Interfaces\ObjectInterface - * @template C of \Grav\Framework\Collection\CollectionInterface + * @template C of ObjectCollectionInterface * @extends AbstractIndexCollection * @implements NestedObjectCollectionInterface */ @@ -95,6 +95,7 @@ public function getProperty($property, $default = null) * @param string $property Object property to be updated. * @param string $value New value. * @return ObjectCollectionInterface + * @phpstan-return C */ public function setProperty($property, $value) { @@ -105,6 +106,7 @@ public function setProperty($property, $value) * @param string $property Object property to be defined. * @param mixed $default Default value. * @return ObjectCollectionInterface + * @phpstan-return C */ public function defProperty($property, $default) { @@ -114,6 +116,7 @@ public function defProperty($property, $default) /** * @param string $property Object property to be unset. * @return ObjectCollectionInterface + * @phpstan-return C */ public function unsetProperty($property) { @@ -146,6 +149,7 @@ public function getNestedProperty($property, $default = null, $separator = null) * @param mixed $value New value. * @param string|null $separator Separator, defaults to '.' * @return ObjectCollectionInterface + * @phpstan-return C */ public function setNestedProperty($property, $value, $separator = null) { @@ -157,6 +161,7 @@ public function setNestedProperty($property, $value, $separator = null) * @param mixed $default Default value. * @param string|null $separator Separator, defaults to '.' * @return ObjectCollectionInterface + * @phpstan-return C */ public function defNestedProperty($property, $default, $separator = null) { @@ -167,6 +172,7 @@ public function defNestedProperty($property, $default, $separator = null) * @param string $property Object property to be unset. * @param string|null $separator Separator, defaults to '.' * @return ObjectCollectionInterface + * @phpstan-return C */ public function unsetNestedProperty($property, $separator = null) { @@ -183,9 +189,11 @@ public function copy() { $list = []; foreach ($this->getIterator() as $key => $value) { + /** @phpstan-ignore-next-line */ $list[$key] = is_object($value) ? clone $value : $value; } + /** @phpstan-var static */ return $this->createFrom($list); } @@ -200,6 +208,7 @@ public function getObjectKeys() /** * @param array $ordering * @return ObjectCollectionInterface + * @phpstan-return C */ public function orderBy(array $ordering) { @@ -232,6 +241,7 @@ public function group($property) * * @param string $property * @return ObjectCollectionInterface[] + * @phpstan-return C[] */ public function collectionGroup($property) { @@ -239,13 +249,15 @@ public function collectionGroup($property) } /** - * {@inheritDoc} + * @param Criteria $criteria + * @return ObjectCollectionInterface + * @phpstan-return C */ public function matching(Criteria $criteria) { - /** @var ObjectCollectionInterface $collection */ $collection = $this->loadCollection($this->getEntries()); + /** @phpstan-var C */ return $collection->matching($criteria); } diff --git a/system/src/Grav/Framework/Object/PropertyObject.php b/system/src/Grav/Framework/Object/PropertyObject.php index dbeb5c4328..fcd364c6c5 100644 --- a/system/src/Grav/Framework/Object/PropertyObject.php +++ b/system/src/Grav/Framework/Object/PropertyObject.php @@ -19,6 +19,8 @@ /** * Property Objects keep their data in protected object properties. + * + * @implements ArrayAccess */ class PropertyObject implements NestedObjectInterface, ArrayAccess { diff --git a/system/src/Grav/Framework/Pagination/AbstractPagination.php b/system/src/Grav/Framework/Pagination/AbstractPagination.php index 2e6f815f82..392bb77107 100644 --- a/system/src/Grav/Framework/Pagination/AbstractPagination.php +++ b/system/src/Grav/Framework/Pagination/AbstractPagination.php @@ -234,6 +234,7 @@ public function count(): int /** * @return ArrayIterator + * @phpstan-return ArrayIterator */ #[\ReturnTypeWillChange] public function getIterator() diff --git a/system/src/Grav/Framework/Pagination/Interfaces/PaginationInterface.php b/system/src/Grav/Framework/Pagination/Interfaces/PaginationInterface.php index 56d3361953..b2f5c352b6 100644 --- a/system/src/Grav/Framework/Pagination/Interfaces/PaginationInterface.php +++ b/system/src/Grav/Framework/Pagination/Interfaces/PaginationInterface.php @@ -16,6 +16,7 @@ /** * Interface PaginationInterface * @package Grav\Framework\Pagination\Interfaces + * @extends IteratorAggregate */ interface PaginationInterface extends Countable, IteratorAggregate { diff --git a/system/src/Grav/Framework/Psr7/Response.php b/system/src/Grav/Framework/Psr7/Response.php index 6cb67e0e88..a5c2c8a8a5 100644 --- a/system/src/Grav/Framework/Psr7/Response.php +++ b/system/src/Grav/Framework/Psr7/Response.php @@ -53,6 +53,7 @@ public function __construct(int $status = 200, array $headers = [], $body = null * @param int $options Json encoding options * @param int $depth Json encoding max depth * @return static + * @phpstan-param positive-int $depth */ public function withJson($data, int $status = null, int $options = 0, int $depth = 512): ResponseInterface { diff --git a/system/src/Grav/Framework/Session/SessionInterface.php b/system/src/Grav/Framework/Session/SessionInterface.php index 113e94ccfd..a441791bd3 100644 --- a/system/src/Grav/Framework/Session/SessionInterface.php +++ b/system/src/Grav/Framework/Session/SessionInterface.php @@ -16,6 +16,7 @@ /** * Class Session * @package Grav\Framework\Session + * @extends IteratorAggregate */ interface SessionInterface extends IteratorAggregate { @@ -107,6 +108,7 @@ public function getAll(); * Retrieve an external iterator * * @return ArrayIterator Return an ArrayIterator of $_SESSION + * @phpstan-return ArrayIterator */ #[\ReturnTypeWillChange] public function getIterator(); From 5fd4f5f3eba6625d3041ac8c51c1c915a96ac8e0 Mon Sep 17 00:00:00 2001 From: Matias Griese Date: Fri, 3 Dec 2021 13:12:25 +0200 Subject: [PATCH 28/83] Composer update --- composer.json | 2 +- composer.lock | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/composer.json b/composer.json index c1c4db6fd5..9b3f1d7c7a 100644 --- a/composer.json +++ b/composer.json @@ -65,7 +65,7 @@ "require-dev": { "codeception/codeception": "^4.1", "phpstan/phpstan": "^1.2", - "phpstan/phpstan-deprecation-rules": "^1.2", + "phpstan/phpstan-deprecation-rules": "^1.0", "phpunit/php-code-coverage": "~9.2", "getgrav/markdowndocs": "^2.0", "codeception/module-asserts": "^1.3", diff --git a/composer.lock b/composer.lock index c376351d43..e2c77d8565 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "7ba41a056515b00db8475d26c7fff546", + "content-hash": "92a5ae30e259e38cfbaea87cf7cfbdcf", "packages": [ { "name": "antoligy/dom-string-iterators", @@ -4868,16 +4868,16 @@ }, { "name": "phpunit/php-file-iterator", - "version": "3.0.5", + "version": "3.0.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "aa4be8575f26070b100fccb67faabb28f21f66f8" + "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/aa4be8575f26070b100fccb67faabb28f21f66f8", - "reference": "aa4be8575f26070b100fccb67faabb28f21f66f8", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", + "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", "shasum": "" }, "require": { @@ -4916,7 +4916,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", - "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.5" + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.6" }, "funding": [ { @@ -4924,7 +4924,7 @@ "type": "github" } ], - "time": "2020-09-28T05:57:25+00:00" + "time": "2021-12-02T12:48:52+00:00" }, { "name": "phpunit/php-invoker", From f04f13723d2f363673aab517abae39fc7ce01ed8 Mon Sep 17 00:00:00 2001 From: Matias Griese Date: Fri, 3 Dec 2021 14:52:52 +0200 Subject: [PATCH 29/83] Silence PHP 8.1 deprecation notices for Twig 1 --- composer.json | 6 +++--- composer.lock | 2 +- system/src/Grav/Common/Debugger.php | 4 ++++ system/src/Grav/Common/Uri.php | 6 +++--- tests/phpstan/phpstan.neon | 3 ++- 5 files changed, 13 insertions(+), 8 deletions(-) diff --git a/composer.json b/composer.json index 9b3f1d7c7a..f7be6fe53a 100644 --- a/composer.json +++ b/composer.json @@ -19,7 +19,7 @@ "ext-zip": "*", "ext-dom": "*", "ext-libxml": "*", - "symfony/polyfill-mbstring": "~1.20", + "symfony/polyfill-mbstring": "~1.23", "symfony/polyfill-iconv": "^1.23", "symfony/polyfill-php74": "^1.23", "symfony/polyfill-php80": "^1.23", @@ -30,7 +30,7 @@ "psr/container": "~1.1.0", "nyholm/psr7-server": "^1.0", "nyholm/psr7": "^1.3", - "twig/twig": "~1.44", + "twig/twig": "~v1.44", "erusev/parsedown": "^1.7", "erusev/parsedown-extra": "~0.8", "symfony/contracts": "~1.1", @@ -108,7 +108,7 @@ "scripts": { "api-17": "vendor/bin/phpdoc-md generate system/src > user/pages/14.api/default.17.md", "post-create-project-cmd": "bin/grav install", - "phpstan": "vendor/bin/phpstan analyse -l 1 -c ./tests/phpstan/phpstan.neon --memory-limit=520M system/src", + "phpstan": "vendor/bin/phpstan analyse -l 1 -c ./tests/phpstan/phpstan.neon --memory-limit=720M system/src", "phpstan-framework": "vendor/bin/phpstan analyse -l 3 -c ./tests/phpstan/phpstan.neon --memory-limit=480M system/src/Grav/Framework system/src/Grav/Events system/src/Grav/Installer", "phpstan-plugins": "vendor/bin/phpstan analyse -l 1 -c ./tests/phpstan/plugins.neon --memory-limit=400M user/plugins", "test": "vendor/bin/codecept run unit", diff --git a/composer.lock b/composer.lock index e2c77d8565..52947b9489 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "92a5ae30e259e38cfbaea87cf7cfbdcf", + "content-hash": "209e1ceeafd2ef97fbf90bf4b1ec5dd4", "packages": [ { "name": "antoligy/dom-string-iterators", diff --git a/system/src/Grav/Common/Debugger.php b/system/src/Grav/Common/Debugger.php index b8143f68bc..15c704b44a 100644 --- a/system/src/Grav/Common/Debugger.php +++ b/system/src/Grav/Common/Debugger.php @@ -856,6 +856,10 @@ public function deprecatedErrorHandler($errno, $errstr, $errfile, $errline) $scope = 'grav'; } elseif (strpos($errfile, '/twig/') !== false) { $scope = 'twig'; + // TODO: remove when upgrading to Twig 2+ + if (str_contains($errstr, '#[\ReturnTypeWillChange]') || str_contains($errstr, 'Passing null to parameter')) { + return true; + } } elseif (stripos($errfile, '/yaml/') !== false) { $scope = 'yaml'; } elseif (strpos($errfile, '/vendor/') !== false) { diff --git a/system/src/Grav/Common/Uri.php b/system/src/Grav/Common/Uri.php index 0a72f37e9e..908d99f8ff 100644 --- a/system/src/Grav/Common/Uri.php +++ b/system/src/Grav/Common/Uri.php @@ -165,7 +165,7 @@ public function init() } // Handle custom base - $custom_base = rtrim($grav['config']->get('system.custom_base_url'), '/'); + $custom_base = rtrim($grav['config']->get('system.custom_base_url', ''), '/'); if ($custom_base) { $custom_parts = parse_url($custom_base); if ($custom_parts === false) { @@ -1273,9 +1273,9 @@ protected function createFromEnvironment(array $env) $this->path = rawurldecode(parse_url('http://example.com' . $request_uri, PHP_URL_PATH)); // Build query string. - $this->query = $env['QUERY_STRING'] ?? ''; + $this->query = $env['QUERY_STRING'] ?? ''; if ($this->query === '') { - $this->query = parse_url('http://example.com' . $request_uri, PHP_URL_QUERY); + $this->query = parse_url('http://example.com' . $request_uri, PHP_URL_QUERY) ?? ''; } // Support ngnix routes. diff --git a/tests/phpstan/phpstan.neon b/tests/phpstan/phpstan.neon index f40fec4135..448f0019f6 100644 --- a/tests/phpstan/phpstan.neon +++ b/tests/phpstan/phpstan.neon @@ -10,7 +10,8 @@ parameters: - phpstan-bootstrap.php excludePaths: - */system/src/Grav/Common/Errors/Resources/layout.html.php - - */system/src/Twig/DeferredExtension/DeferredNodeVisitor.php + - */system/src/Twig/DeferredExtension/DeferredNodeVisitorCompat.php # Twig 1 + - */system/src/Twig/DeferredExtension/DeferredNodeVisitor.php # Twig 2+3 # Ignore vendor dev dependencies and tests - */vendor/*/*/tests - */vendor/behat From cf6159ffe3807806bea48343b9b9dea3389ef7ae Mon Sep 17 00:00:00 2001 From: Matias Griese Date: Tue, 7 Dec 2021 12:43:40 +0200 Subject: [PATCH 30/83] Fixed PHP 8.1 deprecated warning --- system/src/Grav/Common/Grav.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/src/Grav/Common/Grav.php b/system/src/Grav/Common/Grav.php index 2f58940710..8d05aedf4c 100644 --- a/system/src/Grav/Common/Grav.php +++ b/system/src/Grav/Common/Grav.php @@ -737,7 +737,7 @@ public function fallbackUrl($path) /** @var Config $config */ $config = $this['config']; - $uri_extension = strtolower($uri->extension()); + $uri_extension = strtolower($uri->extension() ?? ''); $fallback_types = $config->get('system.media.allowed_fallback_types', null); $supported_types = $config->get('media.types'); From 1c148ab6fb964c24d137b0fd042379a63f255911 Mon Sep 17 00:00:00 2001 From: Matias Griese Date: Tue, 7 Dec 2021 12:43:54 +0200 Subject: [PATCH 31/83] Composer update --- composer.lock | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/composer.lock b/composer.lock index 52947b9489..6e33c96264 100644 --- a/composer.lock +++ b/composer.lock @@ -4017,16 +4017,16 @@ }, { "name": "guzzlehttp/guzzle", - "version": "7.4.0", + "version": "7.4.1", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "868b3571a039f0ebc11ac8f344f4080babe2cb94" + "reference": "ee0a041b1760e6a53d2a39c8c34115adc2af2c79" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/868b3571a039f0ebc11ac8f344f4080babe2cb94", - "reference": "868b3571a039f0ebc11ac8f344f4080babe2cb94", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/ee0a041b1760e6a53d2a39c8c34115adc2af2c79", + "reference": "ee0a041b1760e6a53d2a39c8c34115adc2af2c79", "shasum": "" }, "require": { @@ -4035,7 +4035,7 @@ "guzzlehttp/psr7": "^1.8.3 || ^2.1", "php": "^7.2.5 || ^8.0", "psr/http-client": "^1.0", - "symfony/deprecation-contracts": "^2.2" + "symfony/deprecation-contracts": "^2.2 || ^3.0" }, "provide": { "psr/http-client-implementation": "1.0" @@ -4121,7 +4121,7 @@ ], "support": { "issues": "https://github.com/guzzle/guzzle/issues", - "source": "https://github.com/guzzle/guzzle/tree/7.4.0" + "source": "https://github.com/guzzle/guzzle/tree/7.4.1" }, "funding": [ { @@ -4137,7 +4137,7 @@ "type": "tidelift" } ], - "time": "2021-10-18T09:52:00+00:00" + "time": "2021-12-06T18:43:05+00:00" }, { "name": "guzzlehttp/promises", @@ -4791,16 +4791,16 @@ }, { "name": "phpunit/php-code-coverage", - "version": "9.2.9", + "version": "9.2.10", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "f301eb1453c9e7a1bc912ee8b0ea9db22c60223b" + "reference": "d5850aaf931743067f4bfc1ae4cbd06468400687" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/f301eb1453c9e7a1bc912ee8b0ea9db22c60223b", - "reference": "f301eb1453c9e7a1bc912ee8b0ea9db22c60223b", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/d5850aaf931743067f4bfc1ae4cbd06468400687", + "reference": "d5850aaf931743067f4bfc1ae4cbd06468400687", "shasum": "" }, "require": { @@ -4856,7 +4856,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.9" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.10" }, "funding": [ { @@ -4864,7 +4864,7 @@ "type": "github" } ], - "time": "2021-11-19T15:21:02+00:00" + "time": "2021-12-05T09:12:13+00:00" }, { "name": "phpunit/php-file-iterator", From b2cfc4ef5f1712e4abee19867653ca484364faff Mon Sep 17 00:00:00 2001 From: Matias Griese Date: Tue, 7 Dec 2021 12:47:09 +0200 Subject: [PATCH 32/83] Fixed bad key lookup in `FlexRelatedDirectoryTrait::getCollectionByProperty()` --- CHANGELOG.md | 2 ++ .../Grav/Framework/Flex/Traits/FlexRelatedDirectoryTrait.php | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9690daf928..3d9c734685 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,8 @@ * Upgraded to **composer v2.1.14** for PHP 8.1 compatibility * Added third `$name` parameter to `Blueprint::flattenData()` method, useful for flattening repeating data * `ControllerResponseTrait`: Redirect response should be json if the extension is .json +3. [](#bugfix) + * Fixed bad key lookup in `FlexRelatedDirectoryTrait::getCollectionByProperty()` # v1.7.25 ## 11/16/2021 diff --git a/system/src/Grav/Framework/Flex/Traits/FlexRelatedDirectoryTrait.php b/system/src/Grav/Framework/Flex/Traits/FlexRelatedDirectoryTrait.php index 9f7380c03d..37a0070ddc 100644 --- a/system/src/Grav/Framework/Flex/Traits/FlexRelatedDirectoryTrait.php +++ b/system/src/Grav/Framework/Flex/Traits/FlexRelatedDirectoryTrait.php @@ -36,7 +36,7 @@ protected function getCollectionByProperty($type, $property) /** @var FlexCollection $collection */ $collection = $collection->filter(static function ($object) use ($list) { - return in_array($object->id, $list, true); + return in_array($object->getKey(), $list, true); }); return $collection; From 042d4a4603f16d359f34fabb7c7768c8acbed156 Mon Sep 17 00:00:00 2001 From: Matias Griese Date: Tue, 7 Dec 2021 12:50:59 +0200 Subject: [PATCH 33/83] Improved ACL classes --- system/src/Grav/Framework/Acl/Access.php | 8 +------- system/src/Grav/Framework/Acl/Action.php | 15 +++++++-------- system/src/Grav/Framework/Acl/Permissions.php | 3 --- .../src/Grav/Framework/Acl/PermissionsReader.php | 3 --- 4 files changed, 8 insertions(+), 21 deletions(-) diff --git a/system/src/Grav/Framework/Acl/Access.php b/system/src/Grav/Framework/Acl/Access.php index 771d58e2f7..0a6bb41022 100644 --- a/system/src/Grav/Framework/Acl/Access.php +++ b/system/src/Grav/Framework/Acl/Access.php @@ -14,7 +14,6 @@ use Grav\Common\Utils; use IteratorAggregate; use JsonSerializable; -use RuntimeException; use Traversable; use function count; use function is_array; @@ -79,12 +78,7 @@ public function inherit(Access $parent, string $name = null) $inherited = array_diff_key($parent->getAllActions(), $acl); $this->inherited += $parent->inherited + array_fill_keys(array_keys($inherited), $name ?? $parent->getName()); - $acl = array_replace($acl, $inherited); - if (null === $acl) { - throw new RuntimeException('Internal error'); - } - - $this->acl = $acl; + $this->acl = array_replace($acl, $inherited); } /** diff --git a/system/src/Grav/Framework/Acl/Action.php b/system/src/Grav/Framework/Acl/Action.php index 704f61e0d8..ee46f55f98 100644 --- a/system/src/Grav/Framework/Acl/Action.php +++ b/system/src/Grav/Framework/Acl/Action.php @@ -16,7 +16,6 @@ use RuntimeException; use Traversable; use function count; -use function strlen; /** * Class Action @@ -49,8 +48,8 @@ public function __construct(string $name, array $action = []) { $label = $action['label'] ?? null; if (!$label) { - if ($pos = strrpos($name, '.')) { - $label = substr($name, $pos + 1); + if ($pos = mb_strrpos($name, '.')) { + $label = mb_substr($name, $pos + 1); } else { $label = $name; } @@ -115,9 +114,9 @@ public function setParent(?Action $parent): void */ public function getScope(): string { - $pos = strpos($this->name, '.'); + $pos = mb_strpos($this->name, '.'); if ($pos) { - return substr($this->name, 0, $pos); + return mb_substr($this->name, 0, $pos); } return $this->name; @@ -128,7 +127,7 @@ public function getScope(): string */ public function getLevels(): int { - return substr_count($this->name, '.'); + return mb_substr_count($this->name, '.'); } /** @@ -162,12 +161,12 @@ public function getChild(string $name): ?Action */ public function addChild(Action $child): void { - if (strpos($child->name, "{$this->name}.") !== 0) { + if (mb_strpos($child->name, "{$this->name}.") !== 0) { throw new RuntimeException('Bad child'); } $child->setParent($this); - $name = substr($child->name, strlen($this->name) + 1); + $name = mb_substr($child->name, mb_strlen($this->name) + 1); $this->children[$name] = $child; } diff --git a/system/src/Grav/Framework/Acl/Permissions.php b/system/src/Grav/Framework/Acl/Permissions.php index 1494b10e13..83c6179ea4 100644 --- a/system/src/Grav/Framework/Acl/Permissions.php +++ b/system/src/Grav/Framework/Acl/Permissions.php @@ -148,9 +148,6 @@ public function getTypes(): array public function addTypes(array $types): void { $types = array_replace($this->types, $types); - if (null === $types) { - throw new RuntimeException('Internal error'); - } $this->types = $types; } diff --git a/system/src/Grav/Framework/Acl/PermissionsReader.php b/system/src/Grav/Framework/Acl/PermissionsReader.php index 8820502167..5e8e892bb6 100644 --- a/system/src/Grav/Framework/Acl/PermissionsReader.php +++ b/system/src/Grav/Framework/Acl/PermissionsReader.php @@ -174,9 +174,6 @@ protected static function addDefaults(array $action): array $scopes[] = $action; $action = array_replace_recursive(...$scopes); - if (null === $action) { - throw new RuntimeException('Internal error'); - } $newType = $defaults['type'] ?? null; if ($newType && $newType !== $type) { From 627a1510dcdbef486e5b02a259631cd525be89d3 Mon Sep 17 00:00:00 2001 From: Matias Griese Date: Tue, 7 Dec 2021 12:52:42 +0200 Subject: [PATCH 34/83] Simplify exception handling for Framework Cache classses --- .../Grav/Framework/Cache/Adapter/ChainCache.php | 8 ++++++-- .../Framework/Cache/Adapter/DoctrineCache.php | 8 ++++++-- .../Grav/Framework/Cache/Adapter/FileCache.php | 16 +++++++++++++--- 3 files changed, 25 insertions(+), 7 deletions(-) diff --git a/system/src/Grav/Framework/Cache/Adapter/ChainCache.php b/system/src/Grav/Framework/Cache/Adapter/ChainCache.php index 76f518541a..a5f2f582ec 100644 --- a/system/src/Grav/Framework/Cache/Adapter/ChainCache.php +++ b/system/src/Grav/Framework/Cache/Adapter/ChainCache.php @@ -33,11 +33,15 @@ class ChainCache extends AbstractCache * Chain Cache constructor. * @param array $caches * @param null|int|DateInterval $defaultLifetime - * @throws \Psr\SimpleCache\InvalidArgumentException|InvalidArgumentException + * @throws InvalidArgumentException */ public function __construct(array $caches, $defaultLifetime = null) { - parent::__construct('', $defaultLifetime); + try { + parent::__construct('', $defaultLifetime); + } catch (\Psr\SimpleCache\InvalidArgumentException $e) { + throw new InvalidArgumentException($e->getMessage(), $e->getCode(), $e); + } if (!$caches) { throw new InvalidArgumentException('At least one cache must be specified'); diff --git a/system/src/Grav/Framework/Cache/Adapter/DoctrineCache.php b/system/src/Grav/Framework/Cache/Adapter/DoctrineCache.php index 29e9e3b523..26819d89b1 100644 --- a/system/src/Grav/Framework/Cache/Adapter/DoctrineCache.php +++ b/system/src/Grav/Framework/Cache/Adapter/DoctrineCache.php @@ -29,12 +29,16 @@ class DoctrineCache extends AbstractCache * @param CacheProvider $doctrineCache * @param string $namespace * @param null|int|DateInterval $defaultLifetime - * @throws \Psr\SimpleCache\InvalidArgumentException|InvalidArgumentException + * @throws InvalidArgumentException */ public function __construct(CacheProvider $doctrineCache, $namespace = '', $defaultLifetime = null) { // Do not use $namespace or $defaultLifetime directly, store them with constructor and fetch with methods. - parent::__construct($namespace, $defaultLifetime); + try { + parent::__construct($namespace, $defaultLifetime); + } catch (\Psr\SimpleCache\InvalidArgumentException $e) { + throw new InvalidArgumentException($e->getMessage(), $e->getCode(), $e); + } // Set namespace to Doctrine Cache provider if it was given. $namespace = $this->getNamespace(); diff --git a/system/src/Grav/Framework/Cache/Adapter/FileCache.php b/system/src/Grav/Framework/Cache/Adapter/FileCache.php index 940a7ae60c..69a1127721 100644 --- a/system/src/Grav/Framework/Cache/Adapter/FileCache.php +++ b/system/src/Grav/Framework/Cache/Adapter/FileCache.php @@ -42,9 +42,13 @@ class FileCache extends AbstractCache */ public function __construct($namespace = '', $defaultLifetime = null, $folder = null) { - parent::__construct($namespace, $defaultLifetime ?: 31557600); // = 1 year + try { + parent::__construct($namespace, $defaultLifetime ?: 31557600); // = 1 year - $this->initFileCache($namespace, $folder ?? ''); + $this->initFileCache($namespace, $folder ?? ''); + } catch (\Psr\SimpleCache\InvalidArgumentException $e) { + throw new InvalidArgumentException($e->getMessage(), $e->getCode(), $e); + } } /** @@ -103,7 +107,13 @@ public function doDelete($key) { $file = $this->getFile($key); - return (!file_exists($file) || @unlink($file) || !file_exists($file)); + $result = false; + if (file_exists($file)) { + $result = @unlink($file); + $result &= !file_exists($file); + } + + return $result; } /** From 3ad68d6d5a8fe90cef9663b50b61102547b0881f Mon Sep 17 00:00:00 2001 From: Matias Griese Date: Tue, 7 Dec 2021 13:03:09 +0200 Subject: [PATCH 35/83] Improve flex classes --- .../Framework/Collection/AbstractIndexCollection.php | 2 +- system/src/Grav/Framework/Flex/Flex.php | 6 +++--- system/src/Grav/Framework/Flex/FlexCollection.php | 4 ++-- system/src/Grav/Framework/Flex/FlexDirectory.php | 9 +++++++++ system/src/Grav/Framework/Flex/FlexIndex.php | 8 ++++---- system/src/Grav/Framework/Flex/FlexObject.php | 4 ++-- .../Framework/Flex/Pages/Traits/PageContentTrait.php | 8 +++----- .../Framework/Flex/Storage/AbstractFilesystemStorage.php | 4 ++++ system/src/Grav/Framework/Flex/Traits/FlexMediaTrait.php | 6 +++--- 9 files changed, 31 insertions(+), 20 deletions(-) diff --git a/system/src/Grav/Framework/Collection/AbstractIndexCollection.php b/system/src/Grav/Framework/Collection/AbstractIndexCollection.php index 341c2e078f..9d7d6bb3d4 100644 --- a/system/src/Grav/Framework/Collection/AbstractIndexCollection.php +++ b/system/src/Grav/Framework/Collection/AbstractIndexCollection.php @@ -407,7 +407,7 @@ public function shuffle() $keys = $this->getKeys(); shuffle($keys); - return $this->createFrom(array_replace(array_flip($keys), $this->entries) ?? []); + return $this->createFrom(array_replace(array_flip($keys), $this->entries)); } /** diff --git a/system/src/Grav/Framework/Flex/Flex.php b/system/src/Grav/Framework/Flex/Flex.php index e60dc50e16..28dc943459 100644 --- a/system/src/Grav/Framework/Flex/Flex.php +++ b/system/src/Grav/Framework/Flex/Flex.php @@ -62,7 +62,7 @@ public function __construct(array $types, array $config) */ public function addDirectoryType(string $type, string $blueprint, array $config = []) { - $config = array_replace_recursive(['enabled' => true], $this->config ?? [], $config); + $config = array_replace_recursive(['enabled' => true], $this->config, $config); $this->types[$type] = new FlexDirectory($type, $blueprint, $config); @@ -143,7 +143,7 @@ public function getCollection(string $type, array $keys = null, string $keyField public function getMixedCollection(array $keys, array $options = []): FlexCollectionInterface { $collectionClass = $options['collection_class'] ?? ObjectCollection::class; - if (!class_exists($collectionClass)) { + if (!is_a($collectionClass, FlexCollectionInterface::class, true)) { throw new RuntimeException(sprintf('Cannot create collection: Class %s does not exist', $collectionClass)); } @@ -233,7 +233,7 @@ public function getObjects(array $keys, array $options = []): array // Use the original key ordering. if (!$guessed) { - $list = array_replace(array_fill_keys($keys, null), $list) ?? []; + $list = array_replace(array_fill_keys($keys, null), $list); } else { // We have mixed keys, we need to map flex keys back to storage keys. $results = []; diff --git a/system/src/Grav/Framework/Flex/FlexCollection.php b/system/src/Grav/Framework/Flex/FlexCollection.php index 48d18ef0f6..2a8a167120 100644 --- a/system/src/Grav/Framework/Flex/FlexCollection.php +++ b/system/src/Grav/Framework/Flex/FlexCollection.php @@ -47,7 +47,7 @@ class FlexCollection extends ObjectCollection implements FlexCollectionInterface private $_flexDirectory; /** @var string */ - private $_keyField; + private $_keyField = 'storage_key'; /** * Get list of cached methods. @@ -487,7 +487,7 @@ public function getCache(string $namespace = null) */ public function getKeyField(): string { - return $this->_keyField ?? 'storage_key'; + return $this->_keyField; } /** diff --git a/system/src/Grav/Framework/Flex/FlexDirectory.php b/system/src/Grav/Framework/Flex/FlexDirectory.php index c84e3d1858..a96ff6beda 100644 --- a/system/src/Grav/Framework/Flex/FlexDirectory.php +++ b/system/src/Grav/Framework/Flex/FlexDirectory.php @@ -495,6 +495,9 @@ public function createObject(array $data, string $key = '', bool $validate = fal { /** @phpstan-var class-string $className */ $className = $this->objectClassName ?: $this->getObjectClass(); + if (!is_a($className, FlexObjectInterface::class, true)) { + throw new \RuntimeException('Bad object class: ' . $className); + } return new $className($data, $key, $this, $validate); } @@ -509,6 +512,9 @@ public function createCollection(array $entries, string $keyField = null): FlexC { /** phpstan-var class-string $className */ $className = $this->collectionClassName ?: $this->getCollectionClass(); + if (!is_a($className, FlexCollectionInterface::class, true)) { + throw new \RuntimeException('Bad collection class: ' . $className); + } return $className::createFromArray($entries, $this, $keyField); } @@ -523,6 +529,9 @@ public function createIndex(array $entries, string $keyField = null): FlexIndexI { /** @phpstan-var class-string $className */ $className = $this->indexClassName ?: $this->getIndexClass(); + if (!is_a($className, FlexIndexInterface::class, true)) { + throw new \RuntimeException('Bad index class: ' . $className); + } return $className::createFromArray($entries, $this, $keyField); } diff --git a/system/src/Grav/Framework/Flex/FlexIndex.php b/system/src/Grav/Framework/Flex/FlexIndex.php index 98b26679ff..14a48f5a45 100644 --- a/system/src/Grav/Framework/Flex/FlexIndex.php +++ b/system/src/Grav/Framework/Flex/FlexIndex.php @@ -40,14 +40,14 @@ * @implements FlexIndexInterface * @mixin C */ -class FlexIndex extends ObjectIndex implements FlexCollectionInterface, FlexIndexInterface +class FlexIndex extends ObjectIndex implements FlexIndexInterface { const VERSION = 1; /** @var FlexDirectory|null */ private $_flexDirectory; /** @var string */ - private $_keyField; + private $_keyField = 'storage_key'; /** @var array */ private $_indexKeys; @@ -353,7 +353,7 @@ public function getMetaData($key): array */ public function getKeyField(): string { - return $this->_keyField ?? 'storage_key'; + return $this->_keyField; } /** @@ -416,7 +416,7 @@ public function orderBy(array $orderings) $previous = $search; } - return $this->createFrom(array_replace($previous ?? [], $this->getEntries()) ?? []); + return $this->createFrom(array_replace($previous ?? [], $this->getEntries())); } /** diff --git a/system/src/Grav/Framework/Flex/FlexObject.php b/system/src/Grav/Framework/Flex/FlexObject.php index f770592256..f4987a43c8 100644 --- a/system/src/Grav/Framework/Flex/FlexObject.php +++ b/system/src/Grav/Framework/Flex/FlexObject.php @@ -888,8 +888,8 @@ public function getForm(string $name = '', array $options = null) public function getDefaultValue(string $name, string $separator = null) { $separator = $separator ?: '.'; - $path = explode($separator, $name) ?: []; - $offset = array_shift($path) ?? ''; + $path = explode($separator, $name); + $offset = array_shift($path); $current = $this->getDefaultValues(); diff --git a/system/src/Grav/Framework/Flex/Pages/Traits/PageContentTrait.php b/system/src/Grav/Framework/Flex/Pages/Traits/PageContentTrait.php index f534c132c0..0fac6d608e 100644 --- a/system/src/Grav/Framework/Flex/Pages/Traits/PageContentTrait.php +++ b/system/src/Grav/Framework/Flex/Pages/Traits/PageContentTrait.php @@ -288,7 +288,7 @@ public function process($var = null): array 'process', $var, function ($value) { - $value = array_replace(Grav::instance()['config']->get('system.pages.process', []), is_array($value) ? $value : []) ?? []; + $value = array_replace(Grav::instance()['config']->get('system.pages.process', []), is_array($value) ? $value : []); foreach ($value as $process => $status) { $value[$process] = (bool)$status; } @@ -664,6 +664,7 @@ protected function processSummary($size = null, $textOnly = false): string */ protected function processContent($content): string { + $content = is_string($content) ? $content : ''; $grav = Grav::instance(); /** @var Config $config */ @@ -676,7 +677,6 @@ protected function processContent($content): string $twig_first = $this->getNestedProperty('header.twig_first') ?? $config->get('system.pages.twig_first', false); $never_cache_twig = $this->getNestedProperty('header.never_cache_twig') ?? $config->get('system.pages.never_cache_twig', false); - $cached = null; if ($cache_enable) { $cache = $this->getCache('render'); $key = md5($this->getCacheKey() . '-content'); @@ -688,12 +688,10 @@ protected function processContent($content): string if ($process_twig && $never_cache_twig) { $this->_content = $this->processTwig($this->_content); } - } else { - $cached = null; } } - if (!$cached) { + if (null === $this->_content) { $markdown_options = []; if ($process_markdown) { // Build markdown options. diff --git a/system/src/Grav/Framework/Flex/Storage/AbstractFilesystemStorage.php b/system/src/Grav/Framework/Flex/Storage/AbstractFilesystemStorage.php index 1934f50cfc..2e3132146a 100644 --- a/system/src/Grav/Framework/Flex/Storage/AbstractFilesystemStorage.php +++ b/system/src/Grav/Framework/Flex/Storage/AbstractFilesystemStorage.php @@ -127,6 +127,10 @@ protected function initDataFormatter($formatter): void $formatterClassName = $formatter['class'] ?? JsonFormatter::class; $formatterOptions = $formatter['options'] ?? []; + if (!is_a($formatterClassName, FileFormatterInterface::class, true)) { + throw new \InvalidArgumentException('Bad Data Formatter'); + } + $this->dataFormatter = new $formatterClassName($formatterOptions); } diff --git a/system/src/Grav/Framework/Flex/Traits/FlexMediaTrait.php b/system/src/Grav/Framework/Flex/Traits/FlexMediaTrait.php index 66c868852f..c2bc66891f 100644 --- a/system/src/Grav/Framework/Flex/Traits/FlexMediaTrait.php +++ b/system/src/Grav/Framework/Flex/Traits/FlexMediaTrait.php @@ -44,7 +44,7 @@ trait FlexMediaTrait } /** @var array */ - protected $_uploads; + protected $_uploads = []; /** * @return string|null @@ -119,7 +119,7 @@ public function getFieldSettings(string $field): ?array // Load settings for the field. $schema = $this->getBlueprint()->schema(); - $settings = $field && is_object($schema) ? (array)$schema->getProperty($field) : null; + $settings = (array)$schema->getProperty($field); if (!is_array($settings)) { return null; } @@ -405,7 +405,7 @@ protected function addUpdatedMedia(MediaCollectionInterface $media): void */ protected function getUpdatedMedia(): array { - return $this->_uploads ?? []; + return $this->_uploads; } /** From 5b84213fce5ebdc54e45b860f0f38c0d854cbab7 Mon Sep 17 00:00:00 2001 From: Matias Griese Date: Tue, 7 Dec 2021 13:08:05 +0200 Subject: [PATCH 36/83] Improved Framework File classes --- system/src/Grav/Framework/File/CsvFile.php | 9 +++++++++ system/src/Grav/Framework/File/File.php | 9 --------- .../Framework/File/Formatter/JsonFormatter.php | 16 ++++++++++------ system/src/Grav/Framework/File/IniFile.php | 9 +++++++++ system/src/Grav/Framework/File/MarkdownFile.php | 9 +++++++++ system/src/Grav/Framework/File/YamlFile.php | 9 +++++++++ .../src/Grav/Framework/Filesystem/Filesystem.php | 2 +- 7 files changed, 47 insertions(+), 16 deletions(-) diff --git a/system/src/Grav/Framework/File/CsvFile.php b/system/src/Grav/Framework/File/CsvFile.php index 999f88a52d..7be6879b7b 100644 --- a/system/src/Grav/Framework/File/CsvFile.php +++ b/system/src/Grav/Framework/File/CsvFile.php @@ -28,4 +28,13 @@ public function __construct($filepath, CsvFormatter $formatter) { parent::__construct($filepath, $formatter); } + + /** + * @return array + */ + public function load(): array + { + /** @var array */ + return parent::load(); + } } diff --git a/system/src/Grav/Framework/File/File.php b/system/src/Grav/Framework/File/File.php index 1d4055aec8..a6a8f3c9c3 100644 --- a/system/src/Grav/Framework/File/File.php +++ b/system/src/Grav/Framework/File/File.php @@ -20,15 +20,6 @@ */ class File extends AbstractFile { - /** - * {@inheritdoc} - * @see FileInterface::load() - */ - public function load() - { - return parent::load(); - } - /** * {@inheritdoc} * @see FileInterface::save() diff --git a/system/src/Grav/Framework/File/Formatter/JsonFormatter.php b/system/src/Grav/Framework/File/Formatter/JsonFormatter.php index c76864533c..3957667184 100644 --- a/system/src/Grav/Framework/File/Formatter/JsonFormatter.php +++ b/system/src/Grav/Framework/File/Formatter/JsonFormatter.php @@ -75,9 +75,11 @@ public function getEncodeOptions(): int if (is_string($options)) { $list = preg_split('/[\s,|]+/', $options); $options = 0; - foreach ($list as $option) { - if (isset($this->encodeOptions[$option])) { - $options += $this->encodeOptions[$option]; + if ($list) { + foreach ($list as $option) { + if (isset($this->encodeOptions[$option])) { + $options += $this->encodeOptions[$option]; + } } } } else { @@ -100,9 +102,11 @@ public function getDecodeOptions(): int if (is_string($options)) { $list = preg_split('/[\s,|]+/', $options); $options = 0; - foreach ($list as $option) { - if (isset($this->decodeOptions[$option])) { - $options += $this->decodeOptions[$option]; + if ($list) { + foreach ($list as $option) { + if (isset($this->decodeOptions[$option])) { + $options += $this->decodeOptions[$option]; + } } } } else { diff --git a/system/src/Grav/Framework/File/IniFile.php b/system/src/Grav/Framework/File/IniFile.php index 6cda6096c7..64214998dc 100644 --- a/system/src/Grav/Framework/File/IniFile.php +++ b/system/src/Grav/Framework/File/IniFile.php @@ -28,4 +28,13 @@ public function __construct($filepath, IniFormatter $formatter) { parent::__construct($filepath, $formatter); } + + /** + * @return array + */ + public function load(): array + { + /** @var array */ + return parent::load(); + } } diff --git a/system/src/Grav/Framework/File/MarkdownFile.php b/system/src/Grav/Framework/File/MarkdownFile.php index 4ae3aa0de9..881862b785 100644 --- a/system/src/Grav/Framework/File/MarkdownFile.php +++ b/system/src/Grav/Framework/File/MarkdownFile.php @@ -28,4 +28,13 @@ public function __construct($filepath, MarkdownFormatter $formatter) { parent::__construct($filepath, $formatter); } + + /** + * @return array + */ + public function load(): array + { + /** @var array */ + return parent::load(); + } } diff --git a/system/src/Grav/Framework/File/YamlFile.php b/system/src/Grav/Framework/File/YamlFile.php index 29224ce788..d191e3cf9c 100644 --- a/system/src/Grav/Framework/File/YamlFile.php +++ b/system/src/Grav/Framework/File/YamlFile.php @@ -28,4 +28,13 @@ public function __construct($filepath, YamlFormatter $formatter) { parent::__construct($filepath, $formatter); } + + /** + * @return array + */ + public function load(): array + { + /** @var array */ + return parent::load(); + } } diff --git a/system/src/Grav/Framework/Filesystem/Filesystem.php b/system/src/Grav/Framework/Filesystem/Filesystem.php index d93f4c22ad..d323618f71 100644 --- a/system/src/Grav/Framework/Filesystem/Filesystem.php +++ b/system/src/Grav/Framework/Filesystem/Filesystem.php @@ -239,7 +239,7 @@ protected function pathinfoInternal(?string $scheme, string $path, ?int $options if (null !== $scheme) { $info['scheme'] = $scheme; - $dirname = isset($info['dirname']) && $info['dirname'] !== '.' ? $info['dirname'] : null; + $dirname = $info['dirname'] !== '.' ? $info['dirname'] : null; if (null !== $dirname) { // In Windows dirname may be using backslashes, fix that. From 70c0dc641997bd3eb6a505bf92f7d1803e304c64 Mon Sep 17 00:00:00 2001 From: Matias Griese Date: Tue, 7 Dec 2021 13:10:19 +0200 Subject: [PATCH 37/83] Improve Framework code --- system/src/Grav/Framework/Form/Traits/FormTrait.php | 12 +++++------- .../Framework/Object/Access/NestedPropertyTrait.php | 12 ++++++------ .../Framework/Object/Property/ArrayPropertyTrait.php | 2 +- .../Framework/Object/Property/LazyPropertyTrait.php | 3 +-- .../Framework/Pagination/AbstractPaginationPage.php | 2 +- system/src/Grav/Framework/Psr7/Response.php | 2 +- system/src/Grav/Framework/Psr7/Uri.php | 3 --- tests/phpstan/phpstan.neon | 2 +- 8 files changed, 16 insertions(+), 22 deletions(-) diff --git a/system/src/Grav/Framework/Form/Traits/FormTrait.php b/system/src/Grav/Framework/Form/Traits/FormTrait.php index 32df48037f..3c368d97bf 100644 --- a/system/src/Grav/Framework/Form/Traits/FormTrait.php +++ b/system/src/Grav/Framework/Form/Traits/FormTrait.php @@ -203,7 +203,7 @@ public function getData(string $name = null) */ public function getFiles(): array { - return $this->files ?? []; + return $this->files; } /** @@ -221,8 +221,8 @@ public function getValue(string $name) */ public function getDefaultValue(string $name) { - $path = explode('.', $name) ?: []; - $offset = array_shift($path) ?? ''; + $path = explode('.', $name); + $offset = array_shift($path); $current = $this->getDefaultValues(); @@ -692,7 +692,7 @@ protected function parseRequest(ServerRequestInterface $request): array throw new RuntimeException(sprintf('FlexForm: Bad HTTP method %s', $method)); } - $body = $request->getParsedBody(); + $body = (array)$request->getParsedBody(); $data = isset($body['data']) ? $this->decodeData($body['data']) : null; $flash = $this->getFlash(); @@ -799,9 +799,7 @@ protected function decodeData($data): array // Decode JSON encoded fields and merge them to data. if (isset($data['_json'])) { $data = array_replace_recursive($data, $this->jsonDecode($data['_json'])); - if (null === $data) { - throw new RuntimeException(__METHOD__ . '(): Unexpected error'); - } + unset($data['_json']); } diff --git a/system/src/Grav/Framework/Object/Access/NestedPropertyTrait.php b/system/src/Grav/Framework/Object/Access/NestedPropertyTrait.php index 7409f4c9ea..40395cbb02 100644 --- a/system/src/Grav/Framework/Object/Access/NestedPropertyTrait.php +++ b/system/src/Grav/Framework/Object/Access/NestedPropertyTrait.php @@ -42,8 +42,8 @@ public function hasNestedProperty($property, $separator = null) public function getNestedProperty($property, $default = null, $separator = null) { $separator = $separator ?: '.'; - $path = explode($separator, $property) ?: []; - $offset = array_shift($path) ?? ''; + $path = explode($separator, $property); + $offset = array_shift($path); if (!$this->hasProperty($offset)) { return $default; @@ -85,8 +85,8 @@ public function getNestedProperty($property, $default = null, $separator = null) public function setNestedProperty($property, $value, $separator = null) { $separator = $separator ?: '.'; - $path = explode($separator, $property) ?: []; - $offset = array_shift($path) ?? ''; + $path = explode($separator, $property); + $offset = array_shift($path); if (!$path) { $this->setProperty($offset, $value); @@ -127,8 +127,8 @@ public function setNestedProperty($property, $value, $separator = null) public function unsetNestedProperty($property, $separator = null) { $separator = $separator ?: '.'; - $path = explode($separator, $property) ?: []; - $offset = array_shift($path) ?? ''; + $path = explode($separator, $property); + $offset = array_shift($path); if (!$path) { $this->unsetProperty($offset); diff --git a/system/src/Grav/Framework/Object/Property/ArrayPropertyTrait.php b/system/src/Grav/Framework/Object/Property/ArrayPropertyTrait.php index fa3fed1d35..6f935fe979 100644 --- a/system/src/Grav/Framework/Object/Property/ArrayPropertyTrait.php +++ b/system/src/Grav/Framework/Object/Property/ArrayPropertyTrait.php @@ -97,7 +97,7 @@ protected function getElement($property, $default = null) */ protected function getElements() { - return array_filter($this->_elements, function ($val) { + return array_filter($this->_elements, static function ($val) { return $val !== null; }); } diff --git a/system/src/Grav/Framework/Object/Property/LazyPropertyTrait.php b/system/src/Grav/Framework/Object/Property/LazyPropertyTrait.php index d5baddbee1..99ad446ea4 100644 --- a/system/src/Grav/Framework/Object/Property/LazyPropertyTrait.php +++ b/system/src/Grav/Framework/Object/Property/LazyPropertyTrait.php @@ -87,8 +87,7 @@ protected function doSetProperty($property, $value) */ protected function doUnsetProperty($property) { - $this->hasObjectProperty($property) ? - $this->unsetObjectProperty($property) : $this->unsetArrayProperty($property); + $this->hasObjectProperty($property) ? $this->unsetObjectProperty($property) : $this->unsetArrayProperty($property); } /** diff --git a/system/src/Grav/Framework/Pagination/AbstractPaginationPage.php b/system/src/Grav/Framework/Pagination/AbstractPaginationPage.php index 95ff8af357..9461395892 100644 --- a/system/src/Grav/Framework/Pagination/AbstractPaginationPage.php +++ b/system/src/Grav/Framework/Pagination/AbstractPaginationPage.php @@ -41,7 +41,7 @@ public function isEnabled(): bool */ public function getOptions(): array { - return $this->options ?? []; + return $this->options; } /** diff --git a/system/src/Grav/Framework/Psr7/Response.php b/system/src/Grav/Framework/Psr7/Response.php index a5c2c8a8a5..6d8e68f683 100644 --- a/system/src/Grav/Framework/Psr7/Response.php +++ b/system/src/Grav/Framework/Psr7/Response.php @@ -258,7 +258,7 @@ public function __toString(): string } $output .= self::EOL; - $output .= (string) $response->getBody(); + $output .= $response->getBody(); return $output; } diff --git a/system/src/Grav/Framework/Psr7/Uri.php b/system/src/Grav/Framework/Psr7/Uri.php index c920b3373e..bb88e937db 100644 --- a/system/src/Grav/Framework/Psr7/Uri.php +++ b/system/src/Grav/Framework/Psr7/Uri.php @@ -24,9 +24,6 @@ class Uri implements UriInterface { use UriDecorationTrait; - /** @var array Array of Uri query. */ - private $queryParams; - public function __construct(string $uri = '') { $this->uri = new \Nyholm\Psr7\Uri($uri); diff --git a/tests/phpstan/phpstan.neon b/tests/phpstan/phpstan.neon index 448f0019f6..546e2f088b 100644 --- a/tests/phpstan/phpstan.neon +++ b/tests/phpstan/phpstan.neon @@ -30,7 +30,7 @@ parameters: # These checks are new in phpstan 1, ignore them for now. checkMissingIterableValueType: false - checkGenericClassInNonGenericObjectType: false + #checkGenericClassInNonGenericObjectType: false universalObjectCratesClasses: - Grav\Common\Config\Config From 8f2f5e3373cd90c4ad5e87df45724a7261ebd37a Mon Sep 17 00:00:00 2001 From: Matias Griese Date: Tue, 7 Dec 2021 13:13:35 +0200 Subject: [PATCH 38/83] Fixed RequestHandlers `NotFoundException` having empty request --- .../RequestHandler/Exception/NotFoundException.php | 8 -------- .../Framework/RequestHandler/RequestHandler.php | 14 ++++++++++++-- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/system/src/Grav/Framework/RequestHandler/Exception/NotFoundException.php b/system/src/Grav/Framework/RequestHandler/Exception/NotFoundException.php index 28a226a4ef..40c9e0a814 100644 --- a/system/src/Grav/Framework/RequestHandler/Exception/NotFoundException.php +++ b/system/src/Grav/Framework/RequestHandler/Exception/NotFoundException.php @@ -21,9 +21,6 @@ */ class NotFoundException extends RequestException { - /** @var ServerRequestInterface */ - private $request; - /** * NotFoundException constructor. * @param ServerRequestInterface $request @@ -37,9 +34,4 @@ public function __construct(ServerRequestInterface $request, Throwable $previous parent::__construct($request, 'Not Found', 404, $previous); } } - - public function getRequest(): ServerRequestInterface - { - return $this->request; - } } diff --git a/system/src/Grav/Framework/RequestHandler/RequestHandler.php b/system/src/Grav/Framework/RequestHandler/RequestHandler.php index 5b03805835..edd3178ff0 100644 --- a/system/src/Grav/Framework/RequestHandler/RequestHandler.php +++ b/system/src/Grav/Framework/RequestHandler/RequestHandler.php @@ -12,9 +12,11 @@ namespace Grav\Framework\RequestHandler; use Grav\Framework\RequestHandler\Traits\RequestHandlerTrait; +use Pimple\Container; use Psr\Container\ContainerInterface; use Psr\Http\Server\MiddlewareInterface; use Psr\Http\Server\RequestHandlerInterface; +use function assert; /** * Class RequestHandler @@ -47,7 +49,11 @@ public function __construct(array $middleware, callable $default, ContainerInter */ public function addCallable(string $name, callable $callable): self { - $this->container[$name] = $callable; + if (null !== $this->container) { + assert($this->container instanceof Container); + $this->container[$name] = $callable; + } + array_unshift($this->middleware, $name); return $this; @@ -62,7 +68,11 @@ public function addCallable(string $name, callable $callable): self */ public function addMiddleware(string $name, MiddlewareInterface $middleware): self { - $this->container[$name] = $middleware; + if (null !== $this->container) { + assert($this->container instanceof Container); + $this->container[$name] = $middleware; + } + array_unshift($this->middleware, $name); return $this; From f3789bb17ec42760ffb8377eec15faeaef403755 Mon Sep 17 00:00:00 2001 From: Matias Griese Date: Tue, 7 Dec 2021 13:14:07 +0200 Subject: [PATCH 39/83] Changelog update --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3d9c734685..dc2dbf8435 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ * `ControllerResponseTrait`: Redirect response should be json if the extension is .json 3. [](#bugfix) * Fixed bad key lookup in `FlexRelatedDirectoryTrait::getCollectionByProperty()` + * Fixed RequestHandlers `NotFoundException` having empty request # v1.7.25 ## 11/16/2021 From 2165743810172eb39553b3ec2532b0d6719ff547 Mon Sep 17 00:00:00 2001 From: Matias Griese Date: Tue, 7 Dec 2021 13:20:57 +0200 Subject: [PATCH 40/83] Fixed phpstan level 2 issues in Framework --- system/src/Grav/Framework/Flex/FlexDirectory.php | 4 +++- system/src/Grav/Framework/Flex/Pages/FlexPageCollection.php | 4 ++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/system/src/Grav/Framework/Flex/FlexDirectory.php b/system/src/Grav/Framework/Flex/FlexDirectory.php index a96ff6beda..594c34c3fa 100644 --- a/system/src/Grav/Framework/Flex/FlexDirectory.php +++ b/system/src/Grav/Framework/Flex/FlexDirectory.php @@ -1054,7 +1054,9 @@ public function update(array $data, string $key = null): FlexObjectInterface $newKey = $object->getStorageKey(); if ($oldKey !== $newKey) { - $object->triggerEvent('move'); + if (method_exists($object, 'triggerEvent')) { + $object->triggerEvent('move'); + } $storage->renameRow($oldKey, $newKey); // TODO: media support. } diff --git a/system/src/Grav/Framework/Flex/Pages/FlexPageCollection.php b/system/src/Grav/Framework/Flex/Pages/FlexPageCollection.php index d273218274..fe7a221070 100644 --- a/system/src/Grav/Framework/Flex/Pages/FlexPageCollection.php +++ b/system/src/Grav/Framework/Flex/Pages/FlexPageCollection.php @@ -191,7 +191,6 @@ public function getNextOrder() $keys = $collection->getStorageKeys(); // Assign next free order. - /** @var FlexPageObject|null $last */ $last = null; $order = 0; foreach ($keys as $folder => $key) { @@ -203,8 +202,9 @@ public function getNextOrder() } } + /** @var FlexPageObject|null $last */ $last = $collection[$last]; - return sprintf('%d.', $last ? $last->value('order') + 1 : 1); + return sprintf('%d.', $last ? $last->getFormValue('order') + 1 : 1); } } From ad1e20abb74cc743d4d0bd9ce5fb25f266a39065 Mon Sep 17 00:00:00 2001 From: Matias Griese Date: Tue, 7 Dec 2021 13:34:36 +0200 Subject: [PATCH 41/83] Fixed phpstan level 4 issues in Framework --- composer.json | 2 +- .../Grav/Framework/Collection/AbstractIndexCollection.php | 1 + system/src/Grav/Framework/Flex/FlexCollection.php | 2 ++ system/src/Grav/Framework/Object/ObjectCollection.php | 2 +- system/src/Grav/Framework/Object/ObjectIndex.php | 6 ++++-- 5 files changed, 9 insertions(+), 4 deletions(-) diff --git a/composer.json b/composer.json index f7be6fe53a..6a7455b9d8 100644 --- a/composer.json +++ b/composer.json @@ -109,7 +109,7 @@ "api-17": "vendor/bin/phpdoc-md generate system/src > user/pages/14.api/default.17.md", "post-create-project-cmd": "bin/grav install", "phpstan": "vendor/bin/phpstan analyse -l 1 -c ./tests/phpstan/phpstan.neon --memory-limit=720M system/src", - "phpstan-framework": "vendor/bin/phpstan analyse -l 3 -c ./tests/phpstan/phpstan.neon --memory-limit=480M system/src/Grav/Framework system/src/Grav/Events system/src/Grav/Installer", + "phpstan-framework": "vendor/bin/phpstan analyse -l 4 -c ./tests/phpstan/phpstan.neon --memory-limit=480M system/src/Grav/Framework system/src/Grav/Events system/src/Grav/Installer", "phpstan-plugins": "vendor/bin/phpstan analyse -l 1 -c ./tests/phpstan/plugins.neon --memory-limit=400M user/plugins", "test": "vendor/bin/codecept run unit", "test-windows": "vendor\\bin\\codecept run unit" diff --git a/system/src/Grav/Framework/Collection/AbstractIndexCollection.php b/system/src/Grav/Framework/Collection/AbstractIndexCollection.php index 9d7d6bb3d4..8c98a81111 100644 --- a/system/src/Grav/Framework/Collection/AbstractIndexCollection.php +++ b/system/src/Grav/Framework/Collection/AbstractIndexCollection.php @@ -452,6 +452,7 @@ public function unselect(array $keys) */ public function chunk($size) { + /** @phpstan-var array> */ return $this->loadCollection($this->entries)->chunk($size); } diff --git a/system/src/Grav/Framework/Flex/FlexCollection.php b/system/src/Grav/Framework/Flex/FlexCollection.php index 2a8a167120..8ad78f06af 100644 --- a/system/src/Grav/Framework/Flex/FlexCollection.php +++ b/system/src/Grav/Framework/Flex/FlexCollection.php @@ -19,6 +19,7 @@ use Grav\Common\Utils; use Grav\Framework\Cache\CacheInterface; use Grav\Framework\ContentBlock\HtmlBlock; +use Grav\Framework\Flex\Interfaces\FlexIndexInterface; use Grav\Framework\Flex\Interfaces\FlexObjectInterface; use Grav\Framework\Object\ObjectCollection; use Grav\Framework\Flex\Interfaces\FlexCollectionInterface; @@ -342,6 +343,7 @@ public function withKeyField(string $keyField = null) */ public function getIndex() { + /** @phpstan-var FlexIndexInterface */ return $this->getFlexDirectory()->getIndex($this->getKeys(), $this->getKeyField()); } diff --git a/system/src/Grav/Framework/Object/ObjectCollection.php b/system/src/Grav/Framework/Object/ObjectCollection.php index af861c2cef..40774fc5d9 100644 --- a/system/src/Grav/Framework/Object/ObjectCollection.php +++ b/system/src/Grav/Framework/Object/ObjectCollection.php @@ -125,7 +125,7 @@ protected function getElements() */ protected function setElements(array $elements) { - /** @phpstan-var array */ + /** @phpstan-var array $elements */ return $elements; } } diff --git a/system/src/Grav/Framework/Object/ObjectIndex.php b/system/src/Grav/Framework/Object/ObjectIndex.php index bc1fad248d..e09c0dd95f 100644 --- a/system/src/Grav/Framework/Object/ObjectIndex.php +++ b/system/src/Grav/Framework/Object/ObjectIndex.php @@ -257,8 +257,10 @@ public function matching(Criteria $criteria) { $collection = $this->loadCollection($this->getEntries()); - /** @phpstan-var C */ - return $collection->matching($criteria); + /** @phpstan-var C $matching */ + $matching = $collection->matching($criteria); + + return $matching; } /** From 86cfba3bc9efa684ab9d5d9b562a3c8b76e86c34 Mon Sep 17 00:00:00 2001 From: Matias Griese Date: Tue, 7 Dec 2021 13:47:35 +0200 Subject: [PATCH 42/83] Minor fix --- system/src/Grav/Framework/Filesystem/Filesystem.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/src/Grav/Framework/Filesystem/Filesystem.php b/system/src/Grav/Framework/Filesystem/Filesystem.php index d323618f71..d93f4c22ad 100644 --- a/system/src/Grav/Framework/Filesystem/Filesystem.php +++ b/system/src/Grav/Framework/Filesystem/Filesystem.php @@ -239,7 +239,7 @@ protected function pathinfoInternal(?string $scheme, string $path, ?int $options if (null !== $scheme) { $info['scheme'] = $scheme; - $dirname = $info['dirname'] !== '.' ? $info['dirname'] : null; + $dirname = isset($info['dirname']) && $info['dirname'] !== '.' ? $info['dirname'] : null; if (null !== $dirname) { // In Windows dirname may be using backslashes, fix that. From 878de339e53a1dc1d5fcd3c933ce7711e0a157bd Mon Sep 17 00:00:00 2001 From: Matias Griese Date: Tue, 7 Dec 2021 13:56:19 +0200 Subject: [PATCH 43/83] Improved FileSystem::pathinfoInternal() --- system/src/Grav/Framework/Filesystem/Filesystem.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/system/src/Grav/Framework/Filesystem/Filesystem.php b/system/src/Grav/Framework/Filesystem/Filesystem.php index d93f4c22ad..2f66e54c63 100644 --- a/system/src/Grav/Framework/Filesystem/Filesystem.php +++ b/system/src/Grav/Framework/Filesystem/Filesystem.php @@ -239,12 +239,12 @@ protected function pathinfoInternal(?string $scheme, string $path, ?int $options if (null !== $scheme) { $info['scheme'] = $scheme; - $dirname = isset($info['dirname']) && $info['dirname'] !== '.' ? $info['dirname'] : null; + $dirname = $info['dirname'] ?? '.'; - if (null !== $dirname) { + if ('' !== $dirname && '.' !== $dirname) { // In Windows dirname may be using backslashes, fix that. if (DIRECTORY_SEPARATOR !== '/') { - $dirname = str_replace('\\', '/', $dirname); + $dirname = str_replace(DIRECTORY_SEPARATOR, '/', $dirname); } $info['dirname'] = $scheme . '://' . $dirname; From c2f394de17a7cd8e729aedec1f75961de6dd76c4 Mon Sep 17 00:00:00 2001 From: Matias Griese Date: Tue, 7 Dec 2021 16:46:42 +0200 Subject: [PATCH 44/83] Minor fix --- system/src/Grav/Framework/Session/Session.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/system/src/Grav/Framework/Session/Session.php b/system/src/Grav/Framework/Session/Session.php index f356b20535..53f3313317 100644 --- a/system/src/Grav/Framework/Session/Session.php +++ b/system/src/Grav/Framework/Session/Session.php @@ -190,8 +190,7 @@ public function start($readonly = false) } $sessionName = $this->getName(); - $sessionId = $this->getId(); - if (null === $sessionName || null === $sessionId) { + if (null === $sessionName) { return $this; } From a56453cf0a98c34bfa7df1b0f37e67fe82ae1640 Mon Sep 17 00:00:00 2001 From: Matias Griese Date: Wed, 8 Dec 2021 10:15:26 +0200 Subject: [PATCH 45/83] Update clockwork --- composer.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/composer.lock b/composer.lock index 6e33c96264..2bc68f592b 100644 --- a/composer.lock +++ b/composer.lock @@ -888,16 +888,16 @@ }, { "name": "itsgoingd/clockwork", - "version": "v5.1.1", + "version": "v5.1.2", "source": { "type": "git", "url": "https://github.com/itsgoingd/clockwork.git", - "reference": "2daf30fa6dfc5a1ccfdb2142df59243a72c473d8" + "reference": "4f46a69b123635ba2910a3ca8d100edfadc924e1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/itsgoingd/clockwork/zipball/2daf30fa6dfc5a1ccfdb2142df59243a72c473d8", - "reference": "2daf30fa6dfc5a1ccfdb2142df59243a72c473d8", + "url": "https://api.github.com/repos/itsgoingd/clockwork/zipball/4f46a69b123635ba2910a3ca8d100edfadc924e1", + "reference": "4f46a69b123635ba2910a3ca8d100edfadc924e1", "shasum": "" }, "require": { @@ -945,7 +945,7 @@ ], "support": { "issues": "https://github.com/itsgoingd/clockwork/issues", - "source": "https://github.com/itsgoingd/clockwork/tree/v5.1.1" + "source": "https://github.com/itsgoingd/clockwork/tree/v5.1.2" }, "funding": [ { @@ -953,7 +953,7 @@ "type": "github" } ], - "time": "2021-11-01T17:38:35+00:00" + "time": "2021-12-07T18:24:19+00:00" }, { "name": "league/climate", From 6079562c902a4761a1d8abb577812de7b8e33186 Mon Sep 17 00:00:00 2001 From: Matias Griese Date: Wed, 8 Dec 2021 10:58:38 +0200 Subject: [PATCH 46/83] More minor fixes for PHP 8.1 --- .../Collection/AbstractIndexCollection.php | 17 +++++++++++++---- .../Grav/Framework/Filesystem/Filesystem.php | 2 ++ .../src/Grav/Framework/Flex/FlexCollection.php | 1 + .../src/Grav/Framework/Flex/FlexDirectory.php | 4 ++++ system/src/Grav/Framework/Flex/FlexIndex.php | 1 + system/src/Grav/Framework/Flex/FlexObject.php | 1 + .../Framework/Flex/Pages/FlexPageCollection.php | 5 +++-- 7 files changed, 25 insertions(+), 6 deletions(-) diff --git a/system/src/Grav/Framework/Collection/AbstractIndexCollection.php b/system/src/Grav/Framework/Collection/AbstractIndexCollection.php index 8c98a81111..a4392c144b 100644 --- a/system/src/Grav/Framework/Collection/AbstractIndexCollection.php +++ b/system/src/Grav/Framework/Collection/AbstractIndexCollection.php @@ -145,31 +145,37 @@ public function removeElement($element) /** * Required by interface ArrayAccess. * - * {@inheritDoc} + * @param string|int|null $offset + * @return bool * @phpstan-param TKey|null $offset */ #[\ReturnTypeWillChange] public function offsetExists($offset) { + /** @phpstan-ignore-next-line phpstan bug? */ return $offset !== null ? $this->containsKey($offset) : false; } /** * Required by interface ArrayAccess. * - * {@inheritDoc} + * @param string|int|null $offset + * @return mixed * @phpstan-param TKey|null $offset */ #[\ReturnTypeWillChange] public function offsetGet($offset) { + /** @phpstan-ignore-next-line phpstan bug? */ return $offset !== null ? $this->get($offset) : null; } /** * Required by interface ArrayAccess. * - * {@inheritDoc} + * @param string|int|null $offset + * @param mixed $value + * @return void * @phpstan-param TKey|null $offset */ #[\ReturnTypeWillChange] @@ -178,6 +184,7 @@ public function offsetSet($offset, $value) if (null === $offset) { $this->add($value); } else { + /** @phpstan-ignore-next-line phpstan bug? */ $this->set($offset, $value); } } @@ -185,13 +192,15 @@ public function offsetSet($offset, $value) /** * Required by interface ArrayAccess. * - * {@inheritDoc} + * @param string|int|null $offset + * @return void * @phpstan-param TKey|null $offset */ #[\ReturnTypeWillChange] public function offsetUnset($offset) { if ($offset !== null) { + /** @phpstan-ignore-next-line phpstan bug? */ $this->remove($offset); } } diff --git a/system/src/Grav/Framework/Filesystem/Filesystem.php b/system/src/Grav/Framework/Filesystem/Filesystem.php index 2f66e54c63..f4e753e083 100644 --- a/system/src/Grav/Framework/Filesystem/Filesystem.php +++ b/system/src/Grav/Framework/Filesystem/Filesystem.php @@ -239,6 +239,8 @@ protected function pathinfoInternal(?string $scheme, string $path, ?int $options if (null !== $scheme) { $info['scheme'] = $scheme; + + /** @phpstan-ignore-next-line because pathinfo('') doesn't have dirname */ $dirname = $info['dirname'] ?? '.'; if ('' !== $dirname && '.' !== $dirname) { diff --git a/system/src/Grav/Framework/Flex/FlexCollection.php b/system/src/Grav/Framework/Flex/FlexCollection.php index 8ad78f06af..17c557ae01 100644 --- a/system/src/Grav/Framework/Flex/FlexCollection.php +++ b/system/src/Grav/Framework/Flex/FlexCollection.php @@ -125,6 +125,7 @@ public function hasFlexFeature(string $name): bool */ public function getFlexFeatures(): array { + /** @var array $implements */ $implements = class_implements($this); $list = []; diff --git a/system/src/Grav/Framework/Flex/FlexDirectory.php b/system/src/Grav/Framework/Flex/FlexDirectory.php index 594c34c3fa..21965fce90 100644 --- a/system/src/Grav/Framework/Flex/FlexDirectory.php +++ b/system/src/Grav/Framework/Flex/FlexDirectory.php @@ -907,6 +907,10 @@ protected function createStorage(): FlexStorageInterface $className = $storage['class'] ?? SimpleStorage::class; $options = $storage['options'] ?? []; + if (!is_a($className, FlexStorageInterface::class, true)) { + throw new \RuntimeException('Bad storage class: ' . $className); + } + return new $className($options); } diff --git a/system/src/Grav/Framework/Flex/FlexIndex.php b/system/src/Grav/Framework/Flex/FlexIndex.php index 14a48f5a45..1dae57d81a 100644 --- a/system/src/Grav/Framework/Flex/FlexIndex.php +++ b/system/src/Grav/Framework/Flex/FlexIndex.php @@ -133,6 +133,7 @@ public function hasFlexFeature(string $name): bool */ public function getFlexFeatures(): array { + /** @var array $implements */ $implements = class_implements($this->getFlexDirectory()->getCollectionClass()); $list = []; diff --git a/system/src/Grav/Framework/Flex/FlexObject.php b/system/src/Grav/Framework/Flex/FlexObject.php index f4987a43c8..87773470a6 100644 --- a/system/src/Grav/Framework/Flex/FlexObject.php +++ b/system/src/Grav/Framework/Flex/FlexObject.php @@ -163,6 +163,7 @@ public function hasFlexFeature(string $name): bool */ public function getFlexFeatures(): array { + /** @var array $implements */ $implements = class_implements($this); $list = []; diff --git a/system/src/Grav/Framework/Flex/Pages/FlexPageCollection.php b/system/src/Grav/Framework/Flex/Pages/FlexPageCollection.php index fe7a221070..d206921e58 100644 --- a/system/src/Grav/Framework/Flex/Pages/FlexPageCollection.php +++ b/system/src/Grav/Framework/Flex/Pages/FlexPageCollection.php @@ -155,9 +155,10 @@ public function nextSibling($path) public function adjacentSibling($path, $direction = 1) { $keys = $this->getKeys(); + $direction = (int)$direction; $pos = array_search($path, $keys, true); - if ($pos !== false) { + if (is_int($pos)) { $pos += $direction; if (isset($keys[$pos])) { return $this[$keys[$pos]]; @@ -177,7 +178,7 @@ public function currentPosition($path): ?int { $pos = array_search($path, $this->getKeys(), true); - return $pos !== false ? $pos : null; + return is_int($pos) ? $pos : null; } /** From 5552ea2d705bca4faeefdd1d92dccd609092359b Mon Sep 17 00:00:00 2001 From: Matias Griese Date: Wed, 8 Dec 2021 12:34:54 +0200 Subject: [PATCH 47/83] Replace unmaintained DOMIterators by our own versions (fixes PHP 8.1 warnings) --- composer.json | 5 +- composer.lock | 50 +-------- system/src/DOMLettersIterator.php | 165 ++++++++++++++++++++++++++++++ system/src/DOMWordsIterator.php | 158 ++++++++++++++++++++++++++++ 4 files changed, 327 insertions(+), 51 deletions(-) create mode 100644 system/src/DOMLettersIterator.php create mode 100644 system/src/DOMWordsIterator.php diff --git a/composer.json b/composer.json index 6a7455b9d8..8e5924a6c9 100644 --- a/composer.json +++ b/composer.json @@ -52,7 +52,6 @@ "rockettheme/toolbox": "~1.5", "maximebf/debugbar": "~1.16", "league/climate": "^3.6", - "antoligy/dom-string-iterators": "^1.0", "miljar/php-exif": "^0.6", "composer/ca-bundle": "^1.2", "dragonmantank/cron-expression": "^1.2", @@ -97,7 +96,9 @@ "Twig\\": "system/src/Twig" }, "files": [ - "system/defines.php" + "system/defines.php", + "system/src/DOMLettersIterator.php", + "system/src/DOMWordsIterator.php" ] }, "archive": { diff --git a/composer.lock b/composer.lock index 2bc68f592b..2c4c4ea443 100644 --- a/composer.lock +++ b/composer.lock @@ -4,56 +4,8 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "209e1ceeafd2ef97fbf90bf4b1ec5dd4", + "content-hash": "1067938388862c52927c6450e8a36df0", "packages": [ - { - "name": "antoligy/dom-string-iterators", - "version": "v1.0.1", - "source": { - "type": "git", - "url": "https://github.com/antoligy/dom-string-iterators.git", - "reference": "fae88f66e1970d68c5585fc42db44f1217bf74e6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/antoligy/dom-string-iterators/zipball/fae88f66e1970d68c5585fc42db44f1217bf74e6", - "reference": "fae88f66e1970d68c5585fc42db44f1217bf74e6", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "CC0-1.0" - ], - "authors": [ - { - "name": "Alex Wilson", - "email": "a@ax.gy" - }, - { - "name": "Kornel Lesinski", - "email": "pornel@pornel.net" - }, - { - "name": "Patrick Galbraith", - "email": "patrick.j.galbraith@gmail.com" - } - ], - "description": "Composer package for DOMWordsIterator and DOMLettersIterator", - "support": { - "issues": "https://github.com/antoligy/dom-string-iterators/issues", - "source": "https://github.com/antoligy/dom-string-iterators/tree/v1.0.1" - }, - "time": "2018-02-03T16:01:11+00:00" - }, { "name": "composer/ca-bundle", "version": "1.3.1", diff --git a/system/src/DOMLettersIterator.php b/system/src/DOMLettersIterator.php new file mode 100644 index 0000000000..3ebe20e4f4 --- /dev/null +++ b/system/src/DOMLettersIterator.php @@ -0,0 +1,165 @@ +load('example.xml'); + * foreach(new DOMLettersIterator($doc) as $letter) echo $letter; + * + * NB: If you only need characters without their position + * in the document, use DOMNode->textContent instead. + * + * @author porneL http://pornel.net + * @license Public Domain + * @url https://github.com/antoligy/dom-string-iterators + * + * @implements Iterator + */ +final class DOMLettersIterator implements Iterator +{ + /** @var DOMElement */ + private $start; + /** @var DOMElement|null */ + private $current; + /** @var int */ + private $offset = -1; + /** @var int|null */ + private $key; + /** @var array|null */ + private $letters; + + /** + * expects DOMElement or DOMDocument (see DOMDocument::load and DOMDocument::loadHTML) + * + * @param DOMNode $el + */ + public function __construct(DOMNode $el) + { + if ($el instanceof DOMDocument) { + $el = $el->documentElement; + } + + if (!$el instanceof DOMElement) { + throw new InvalidArgumentException('Invalid arguments, expected DOMElement or DOMDocument'); + } + + $this->start = $el; + } + + /** + * Returns position in text as DOMText node and character offset. + * (it's NOT a byte offset, you must use mb_substr() or similar to use this offset properly). + * node may be NULL if iterator has finished. + * + * @return array + */ + public function currentTextPosition(): array + { + return [$this->current, $this->offset]; + } + + /** + * Returns DOMElement that is currently being iterated or NULL if iterator has finished. + * + * @return DOMElement|null + */ + public function currentElement(): ?DOMElement + { + return $this->current ? $this->current->parentNode : null; + } + + // Implementation of Iterator interface + + /** + * @return int|null + */ + public function key(): ?int + { + return $this->key; + } + + /** + * @return void + */ + public function next(): void + { + if (null === $this->current) { + return; + } + + if ($this->current->nodeType === XML_TEXT_NODE || $this->current->nodeType === XML_CDATA_SECTION_NODE) { + if ($this->offset === -1) { + preg_match_all('/./us', $this->current->textContent, $m); + $this->letters = $m[0]; + } + + $this->offset++; + $this->key++; + if ($this->letters && $this->offset < count($this->letters)) { + return; + } + + $this->offset = -1; + } + + while ($this->current->nodeType === XML_ELEMENT_NODE && $this->current->firstChild) { + $this->current = $this->current->firstChild; + if ($this->current->nodeType === XML_TEXT_NODE || $this->current->nodeType === XML_CDATA_SECTION_NODE) { + $this->next(); + return; + } + } + + while (!$this->current->nextSibling && $this->current->parentNode) { + $this->current = $this->current->parentNode; + if ($this->current === $this->start) { + $this->current = null; + return; + } + } + + $this->current = $this->current->nextSibling; + + $this->next(); + } + + /** + * Return the current element + * @link https://php.net/manual/en/iterator.current.php + * + * @return string|null + */ + public function current(): ?string + { + return $this->letters ? $this->letters[$this->offset] : null; + } + + /** + * Checks if current position is valid + * @link https://php.net/manual/en/iterator.valid.php + * + * @return bool + */ + public function valid(): bool + { + return (bool)$this->current; + } + + /** + * @return void + */ + public function rewind(): void + { + $this->current = $this->start; + $this->offset = -1; + $this->key = -1; + $this->letters = []; + + $this->next(); + } +} + diff --git a/system/src/DOMWordsIterator.php b/system/src/DOMWordsIterator.php new file mode 100644 index 0000000000..31ca90fe9d --- /dev/null +++ b/system/src/DOMWordsIterator.php @@ -0,0 +1,158 @@ +load('example.xml'); + * foreach(new DOMWordsIterator($doc) as $word) echo $word; + * + * @author pjgalbraith http://www.pjgalbraith.com + * @author porneL http://pornel.net (based on DOMLettersIterator available at http://pornel.net/source/domlettersiterator.php) + * @license Public Domain + * @url https://github.com/antoligy/dom-string-iterators + * + * @implements Iterator + */ + +final class DOMWordsIterator implements Iterator +{ + /** @var DOMElement */ + private $start; + /** @var DOMElement|null */ + private $current; + /** @var int */ + private $offset = -1; + /** @var int|null */ + private $key; + /** @var array|null */ + private $words; + + /** + * expects DOMElement or DOMDocument (see DOMDocument::load and DOMDocument::loadHTML) + * + * @param DOMNode $el + */ + public function __construct(DOMNode $el) + { + if ($el instanceof DOMDocument) { + $el = $el->documentElement; + } + + if (!$el instanceof DOMElement) { + throw new InvalidArgumentException('Invalid arguments, expected DOMElement or DOMDocument'); + } + + $this->start = $el; + } + + /** + * Returns position in text as DOMText node and character offset. + * (it's NOT a byte offset, you must use mb_substr() or similar to use this offset properly). + * node may be NULL if iterator has finished. + * + * @return array + */ + public function currentWordPosition(): array + { + return [$this->current, $this->offset, $this->words]; + } + + /** + * Returns DOMElement that is currently being iterated or NULL if iterator has finished. + * + * @return DOMElement|null + */ + public function currentElement(): ?DOMElement + { + return $this->current ? $this->current->parentNode : null; + } + + // Implementation of Iterator interface + + /** + * Return the key of the current element + * @link https://php.net/manual/en/iterator.key.php + * @return int|null + */ + public function key(): ?int + { + return $this->key; + } + + /** + * @return void + */ + public function next(): void + { + if (null === $this->current) { + return; + } + + if ($this->current->nodeType === XML_TEXT_NODE || $this->current->nodeType === XML_CDATA_SECTION_NODE) { + if ($this->offset === -1) { + $this->words = preg_split("/[\n\r\t ]+/u", $this->current->textContent, -1, PREG_SPLIT_NO_EMPTY) ?: []; + } + $this->offset++; + + if ($this->words && $this->offset < count($this->words)) { + $this->key++; + return; + } + $this->offset = -1; + } + + while ($this->current->nodeType === XML_ELEMENT_NODE && $this->current->firstChild) { + $this->current = $this->current->firstChild; + if ($this->current->nodeType === XML_TEXT_NODE || $this->current->nodeType === XML_CDATA_SECTION_NODE) { + $this->next(); + return; + } + } + + while (!$this->current->nextSibling && $this->current->parentNode) { + $this->current = $this->current->parentNode; + if ($this->current === $this->start) { + $this->current = null; + return; + } + } + + $this->current = $this->current->nextSibling; + + $this->next(); + } + + /** + * Return the current element + * @link https://php.net/manual/en/iterator.current.php + * @return string|null + */ + public function current(): ?string + { + return $this->words ? $this->words[$this->offset] : null; + } + + /** + * Checks if current position is valid + * @link https://php.net/manual/en/iterator.valid.php + * @return bool + */ + public function valid(): bool + { + return (bool)$this->current; + } + + public function rewind(): void + { + $this->current = $this->start; + $this->offset = -1; + $this->key = -1; + $this->words = []; + + $this->next(); + } +} From 9df7b35c658c6ecbb5a5788d3d1b2c03c2dc6f6d Mon Sep 17 00:00:00 2001 From: Matias Griese Date: Wed, 8 Dec 2021 12:49:13 +0200 Subject: [PATCH 48/83] DomIterator keys were off-by-one --- system/src/DOMLettersIterator.php | 2 +- system/src/DOMWordsIterator.php | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/system/src/DOMLettersIterator.php b/system/src/DOMLettersIterator.php index 3ebe20e4f4..e3c2c4ad96 100644 --- a/system/src/DOMLettersIterator.php +++ b/system/src/DOMLettersIterator.php @@ -156,7 +156,7 @@ public function rewind(): void { $this->current = $this->start; $this->offset = -1; - $this->key = -1; + $this->key = 0; $this->letters = []; $this->next(); diff --git a/system/src/DOMWordsIterator.php b/system/src/DOMWordsIterator.php index 31ca90fe9d..fb7c2e3748 100644 --- a/system/src/DOMWordsIterator.php +++ b/system/src/DOMWordsIterator.php @@ -28,7 +28,7 @@ final class DOMWordsIterator implements Iterator private $offset = -1; /** @var int|null */ private $key; - /** @var array|null */ + /** @var array>|null */ private $words; /** @@ -94,7 +94,7 @@ public function next(): void if ($this->current->nodeType === XML_TEXT_NODE || $this->current->nodeType === XML_CDATA_SECTION_NODE) { if ($this->offset === -1) { - $this->words = preg_split("/[\n\r\t ]+/u", $this->current->textContent, -1, PREG_SPLIT_NO_EMPTY) ?: []; + $this->words = preg_split("/[\n\r\t ]+/", $this->current->textContent, -1, PREG_SPLIT_NO_EMPTY|PREG_SPLIT_OFFSET_CAPTURE) ?: []; } $this->offset++; @@ -133,7 +133,7 @@ public function next(): void */ public function current(): ?string { - return $this->words ? $this->words[$this->offset] : null; + return $this->words ? (string)$this->words[$this->offset][0] : null; } /** @@ -150,7 +150,7 @@ public function rewind(): void { $this->current = $this->start; $this->offset = -1; - $this->key = -1; + $this->key = 0; $this->words = []; $this->next(); From 6c7064db9358336ff119e1387176026340abeea9 Mon Sep 17 00:00:00 2001 From: Matias Griese Date: Wed, 8 Dec 2021 14:34:38 +0200 Subject: [PATCH 49/83] Fix phpstan issues --- .../Grav/Framework/Flex/Pages/Traits/PageContentTrait.php | 3 +++ .../Grav/Framework/Flex/Pages/Traits/PageLegacyTrait.php | 4 +++- .../Framework/Flex/Traits/FlexRelatedDirectoryTrait.php | 6 +++--- .../Grav/Framework/Object/Base/ObjectCollectionTrait.php | 3 ++- system/src/Grav/Framework/Object/ObjectCollection.php | 2 +- system/src/Grav/Framework/Uri/UriFactory.php | 2 +- 6 files changed, 13 insertions(+), 7 deletions(-) diff --git a/system/src/Grav/Framework/Flex/Pages/Traits/PageContentTrait.php b/system/src/Grav/Framework/Flex/Pages/Traits/PageContentTrait.php index 0fac6d608e..c3bbb405e4 100644 --- a/system/src/Grav/Framework/Flex/Pages/Traits/PageContentTrait.php +++ b/system/src/Grav/Framework/Flex/Pages/Traits/PageContentTrait.php @@ -744,6 +744,7 @@ protected function processContent($content): string } if ($process_twig) { + \assert(is_string($this->_content)); $this->_content = $this->processTwig($this->_content); } } @@ -753,6 +754,8 @@ protected function processContent($content): string } } + \assert(is_string($this->_content)); + // Handle summary divider $delimiter = $config->get('site.summary.delimiter', '==='); $divider_pos = mb_strpos($this->_content, "

{$delimiter}

"); diff --git a/system/src/Grav/Framework/Flex/Pages/Traits/PageLegacyTrait.php b/system/src/Grav/Framework/Flex/Pages/Traits/PageLegacyTrait.php index 26c66d8be6..ae2a6bc9ce 100644 --- a/system/src/Grav/Framework/Flex/Pages/Traits/PageLegacyTrait.php +++ b/system/src/Grav/Framework/Flex/Pages/Traits/PageLegacyTrait.php @@ -22,6 +22,7 @@ use Grav\Framework\Filesystem\Filesystem; use Grav\Framework\Flex\Interfaces\FlexCollectionInterface; use Grav\Framework\Flex\Interfaces\FlexIndexInterface; +use Grav\Framework\Flex\Pages\FlexPageCollection; use Grav\Framework\Flex\Pages\FlexPageIndex; use Grav\Framework\Flex\Pages\FlexPageObject; use InvalidArgumentException; @@ -298,7 +299,7 @@ public function copy(PageInterface $parent = null) $parentStorageKey = ltrim($filesystem->dirname("/{$this->getMasterKey()}"), '/'); - /** @var FlexPageIndex $index */ + /** @var FlexPageIndex> $index */ $index = $this->getFlexDirectory()->getIndex(); if ($parent) { @@ -321,6 +322,7 @@ public function copy(PageInterface $parent = null) if ($this instanceof FlexPageObject) { $key = trim($parentKey . '/' . $this->folder(), '/'); $key = preg_replace(static::PAGE_ORDER_PREFIX_REGEX, '', $key); + \assert(is_string($key)); } else { $key = trim($parentKey . '/' . basename($this->getKey()), '/'); } diff --git a/system/src/Grav/Framework/Flex/Traits/FlexRelatedDirectoryTrait.php b/system/src/Grav/Framework/Flex/Traits/FlexRelatedDirectoryTrait.php index 37a0070ddc..bafcb1ed31 100644 --- a/system/src/Grav/Framework/Flex/Traits/FlexRelatedDirectoryTrait.php +++ b/system/src/Grav/Framework/Flex/Traits/FlexRelatedDirectoryTrait.php @@ -11,9 +11,9 @@ namespace Grav\Framework\Flex\Traits; -use Grav\Framework\Flex\FlexCollection; use Grav\Framework\Flex\FlexDirectory; use Grav\Framework\Flex\Interfaces\FlexCollectionInterface; +use Grav\Framework\Flex\Interfaces\FlexObjectInterface; use RuntimeException; use function in_array; @@ -26,7 +26,7 @@ trait FlexRelatedDirectoryTrait /** * @param string $type * @param string $property - * @return FlexCollectionInterface + * @return FlexCollectionInterface */ protected function getCollectionByProperty($type, $property) { @@ -34,7 +34,7 @@ protected function getCollectionByProperty($type, $property) $collection = $directory->getCollection(); $list = $this->getNestedProperty($property) ?: []; - /** @var FlexCollection $collection */ + /** @var FlexCollectionInterface $collection */ $collection = $collection->filter(static function ($object) use ($list) { return in_array($object->getKey(), $list, true); }); diff --git a/system/src/Grav/Framework/Object/Base/ObjectCollectionTrait.php b/system/src/Grav/Framework/Object/Base/ObjectCollectionTrait.php index b110c5b571..e3c2164923 100644 --- a/system/src/Grav/Framework/Object/Base/ObjectCollectionTrait.php +++ b/system/src/Grav/Framework/Object/Base/ObjectCollectionTrait.php @@ -22,7 +22,7 @@ * @package Grav\Framework\Object * * @template TKey as array-key - * @template T as object + * @template T as ObjectInterface */ trait ObjectCollectionTrait { @@ -366,6 +366,7 @@ public function collectionGroup($property) { $collections = []; foreach ($this->group($property) as $id => $elements) { + /** @phpstan-var static $collection */ $collection = $this->createFrom($elements); $collections[$id] = $collection; diff --git a/system/src/Grav/Framework/Object/ObjectCollection.php b/system/src/Grav/Framework/Object/ObjectCollection.php index 40774fc5d9..4d23aa2cd0 100644 --- a/system/src/Grav/Framework/Object/ObjectCollection.php +++ b/system/src/Grav/Framework/Object/ObjectCollection.php @@ -22,7 +22,7 @@ * Class contains a collection of objects. * * @template TKey of array-key - * @template T of object + * @template T of \Grav\Framework\Object\Interfaces\ObjectInterface * @extends ArrayCollection * @implements NestedObjectCollectionInterface */ diff --git a/system/src/Grav/Framework/Uri/UriFactory.php b/system/src/Grav/Framework/Uri/UriFactory.php index f7724b78d2..6b4e7afc54 100644 --- a/system/src/Grav/Framework/Uri/UriFactory.php +++ b/system/src/Grav/Framework/Uri/UriFactory.php @@ -125,7 +125,7 @@ public static function parseUrl($url) $encodedUrl = preg_replace_callback( '%[^:/@?&=#]+%u', - function ($matches) { + static function ($matches) { return rawurlencode($matches[0]); }, $url From 1f3f1828c2da742723a1c2a2d51284cad7f094f8 Mon Sep 17 00:00:00 2001 From: Matias Griese Date: Wed, 8 Dec 2021 15:07:42 +0200 Subject: [PATCH 50/83] Block `.json` files in web server configs --- .htaccess | 4 ++-- CHANGELOG.md | 1 + webserver-configs/htaccess.txt | 4 ++-- webserver-configs/lighttpd.conf | 2 +- webserver-configs/nginx.conf | 4 ++-- webserver-configs/web.config | 6 +++--- 6 files changed, 11 insertions(+), 10 deletions(-) diff --git a/.htaccess b/.htaccess index 83063ae2ea..098c582445 100644 --- a/.htaccess +++ b/.htaccess @@ -59,9 +59,9 @@ RewriteRule .* index.php [L] # Block all direct access for these folders RewriteRule ^(\.git|cache|bin|logs|backup|webserver-configs|tests)/(.*) error [F] # Block access to specific file types for these system folders -RewriteRule ^(system|vendor)/(.*)\.(txt|xml|md|html|yaml|yml|php|pl|py|cgi|twig|sh|bat)$ error [F] +RewriteRule ^(system|vendor)/(.*)\.(txt|xml|md|html|json|yaml|yml|php|pl|py|cgi|twig|sh|bat)$ error [F] # Block access to specific file types for these user folders -RewriteRule ^(user)/(.*)\.(txt|md|yaml|yml|php|pl|py|cgi|twig|sh|bat)$ error [F] +RewriteRule ^(user)/(.*)\.(txt|md|json|yaml|yml|php|pl|py|cgi|twig|sh|bat)$ error [F] # Block all direct access to .md files: RewriteRule \.md$ error [F] # Block all direct access to files and folders beginning with a dot diff --git a/CHANGELOG.md b/CHANGELOG.md index dc2dbf8435..e5202a3833 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ 3. [](#bugfix) * Fixed bad key lookup in `FlexRelatedDirectoryTrait::getCollectionByProperty()` * Fixed RequestHandlers `NotFoundException` having empty request + * Block `.json` files in web server configs # v1.7.25 ## 11/16/2021 diff --git a/webserver-configs/htaccess.txt b/webserver-configs/htaccess.txt index 83063ae2ea..098c582445 100644 --- a/webserver-configs/htaccess.txt +++ b/webserver-configs/htaccess.txt @@ -59,9 +59,9 @@ RewriteRule .* index.php [L] # Block all direct access for these folders RewriteRule ^(\.git|cache|bin|logs|backup|webserver-configs|tests)/(.*) error [F] # Block access to specific file types for these system folders -RewriteRule ^(system|vendor)/(.*)\.(txt|xml|md|html|yaml|yml|php|pl|py|cgi|twig|sh|bat)$ error [F] +RewriteRule ^(system|vendor)/(.*)\.(txt|xml|md|html|json|yaml|yml|php|pl|py|cgi|twig|sh|bat)$ error [F] # Block access to specific file types for these user folders -RewriteRule ^(user)/(.*)\.(txt|md|yaml|yml|php|pl|py|cgi|twig|sh|bat)$ error [F] +RewriteRule ^(user)/(.*)\.(txt|md|json|yaml|yml|php|pl|py|cgi|twig|sh|bat)$ error [F] # Block all direct access to .md files: RewriteRule \.md$ error [F] # Block all direct access to files and folders beginning with a dot diff --git a/webserver-configs/lighttpd.conf b/webserver-configs/lighttpd.conf index 512362fd18..f14c5a8b9b 100644 --- a/webserver-configs/lighttpd.conf +++ b/webserver-configs/lighttpd.conf @@ -33,7 +33,7 @@ $HTTP["url"] =~ "^/grav_path/(LICENSE\.txt|composer\.json|composer\.lock|nginx\. $HTTP["url"] =~ "^/grav_path/(\.git|cache|bin|logs|backup|tests)/(.*)" { url.access-deny = ("") } -$HTTP["url"] =~ "^/grav_path/(system|user|vendor)/(.*)\.(txt|md|html|yaml|yml|php|twig|sh|bat)$" { +$HTTP["url"] =~ "^/grav_path/(system|user|vendor)/(.*)\.(txt|md|html|json|yaml|yml|php|twig|sh|bat)$" { url.access-deny = ("") } $HTTP["url"] =~ "^/grav_path/(\.(.*))" { diff --git a/webserver-configs/nginx.conf b/webserver-configs/nginx.conf index bbca7d32db..fc7d06b49b 100644 --- a/webserver-configs/nginx.conf +++ b/webserver-configs/nginx.conf @@ -20,9 +20,9 @@ server { # deny all direct access for these folders location ~* /(\.git|cache|bin|logs|backup|tests)/.*$ { return 403; } # deny running scripts inside core system folders - location ~* /(system|vendor)/.*\.(txt|xml|md|html|yaml|yml|php|pl|py|cgi|twig|sh|bat)$ { return 403; } + location ~* /(system|vendor)/.*\.(txt|xml|md|html|json|yaml|yml|php|pl|py|cgi|twig|sh|bat)$ { return 403; } # deny running scripts inside user folder - location ~* /user/.*\.(txt|md|yaml|yml|php|pl|py|cgi|twig|sh|bat)$ { return 403; } + location ~* /user/.*\.(txt|md|json|yaml|yml|php|pl|py|cgi|twig|sh|bat)$ { return 403; } # deny access to specific files in the root folder location ~ /(LICENSE\.txt|composer\.lock|composer\.json|nginx\.conf|web\.config|htaccess\.txt|\.htaccess) { return 403; } ## End - Security diff --git a/webserver-configs/web.config b/webserver-configs/web.config index 892ce9282a..1c351a3b31 100644 --- a/webserver-configs/web.config +++ b/webserver-configs/web.config @@ -18,7 +18,7 @@ - + @@ -26,11 +26,11 @@ - + - + From 3bfbb1a4efd5d26531dad9f5ae1606a68e375341 Mon Sep 17 00:00:00 2001 From: Matias Griese Date: Wed, 8 Dec 2021 15:17:28 +0200 Subject: [PATCH 51/83] Composer 2 checks for minimum PHP version, remove duplicated checks --- bin/gpm | 4 ---- bin/grav | 4 ---- bin/plugin | 4 ---- index.php | 4 ---- system/router.php | 4 ++-- tests/phpstan/plugins-bootstrap.php | 4 ---- 6 files changed, 2 insertions(+), 22 deletions(-) diff --git a/bin/gpm b/bin/gpm index a2eebc68c2..ba2fad110a 100755 --- a/bin/gpm +++ b/bin/gpm @@ -25,10 +25,6 @@ if (!file_exists(__DIR__ . '/../vendor/autoload.php')){ $autoload = require __DIR__ . '/../vendor/autoload.php'; -if (version_compare($ver = PHP_VERSION, $req = GRAV_PHP_MIN, '<')) { - exit(sprintf("You are running PHP %s, but Grav needs at least PHP %s to run.\n", $ver, $req)); -} - if (!ini_get('date.timezone')) { date_default_timezone_set('UTC'); } diff --git a/bin/grav b/bin/grav index f3f77efe89..4d0e80c8d3 100755 --- a/bin/grav +++ b/bin/grav @@ -25,10 +25,6 @@ if (!file_exists(__DIR__ . '/../vendor/autoload.php')){ $autoload = require __DIR__ . '/../vendor/autoload.php'; -if (version_compare($ver = PHP_VERSION, $req = GRAV_PHP_MIN, '<')) { - exit(sprintf("You are running PHP %s, but Grav needs at least PHP %s to run.\n", $ver, $req)); -} - if (!ini_get('date.timezone')) { date_default_timezone_set('UTC'); } diff --git a/bin/plugin b/bin/plugin index b401c03572..0f2a647201 100755 --- a/bin/plugin +++ b/bin/plugin @@ -25,10 +25,6 @@ if (!file_exists(__DIR__ . '/../vendor/autoload.php')){ $autoload = require __DIR__ . '/../vendor/autoload.php'; -if (version_compare($ver = PHP_VERSION, $req = GRAV_PHP_MIN, '<')) { - exit(sprintf("You are running PHP %s, but Grav needs at least PHP %s to run.\n", $ver, $req)); -} - if (!ini_get('date.timezone')) { date_default_timezone_set('UTC'); } diff --git a/index.php b/index.php index 091e9a8249..66e2deeb96 100644 --- a/index.php +++ b/index.php @@ -12,10 +12,6 @@ \define('GRAV_REQUEST_TIME', microtime(true)); \define('GRAV_PHP_MIN', '7.3.6'); -if (version_compare($ver = PHP_VERSION, $req = GRAV_PHP_MIN, '<')) { - die(sprintf('You are running PHP %s, but Grav needs at least PHP %s to run.', $ver, $req)); -} - if (PHP_SAPI === 'cli-server') { $symfony_server = stripos(getenv('_'), 'symfony') !== false || stripos($_SERVER['SERVER_SOFTWARE'] ?? '', 'symfony') !== false || stripos($_ENV['SERVER_SOFTWARE'] ?? '', 'symfony') !== false; diff --git a/system/router.php b/system/router.php index d58609c836..b43ea5d38f 100644 --- a/system/router.php +++ b/system/router.php @@ -22,9 +22,9 @@ // Block all direct access for these folders || preg_match('`^/(\.git|cache|bin|logs|backup|webserver-configs|tests)/`ui', $path) // Block access to specific file types for these system folders - || preg_match('`^/(system|vendor)/(.*)\.(txt|xml|md|html|yaml|yml|php|pl|py|cgi|twig|sh|bat)$`ui', $path) + || preg_match('`^/(system|vendor)/(.*)\.(txt|xml|md|html|json|yaml|yml|php|pl|py|cgi|twig|sh|bat)$`ui', $path) // Block access to specific file types for these user folders - || preg_match('`^/(user)/(.*)\.(txt|md|yaml|yml|php|pl|py|cgi|twig|sh|bat)$`ui', $path) + || preg_match('`^/(user)/(.*)\.(txt|md|json|yaml|yml|php|pl|py|cgi|twig|sh|bat)$`ui', $path) // Block all direct access to .md files || preg_match('`\.md$`ui', $path) // Block access to specific files in the root folder diff --git a/tests/phpstan/plugins-bootstrap.php b/tests/phpstan/plugins-bootstrap.php index c28f2ab8a5..1c18280339 100644 --- a/tests/phpstan/plugins-bootstrap.php +++ b/tests/phpstan/plugins-bootstrap.php @@ -10,10 +10,6 @@ $autoload = require __DIR__ . '/../../vendor/autoload.php'; -if (version_compare($ver = PHP_VERSION, $req = GRAV_PHP_MIN, '<')) { - exit(sprintf("You are running PHP %s, but Grav needs at least PHP %s to run.\n", $ver, $req)); -} - if (!ini_get('date.timezone')) { date_default_timezone_set('UTC'); } From 90f5ff7c74525d1f5d15141cf5080def8bf1693b Mon Sep 17 00:00:00 2001 From: Matias Griese Date: Wed, 8 Dec 2021 17:38:16 +0200 Subject: [PATCH 52/83] Use secure session cookies in HTTPS by default (`system.session.secure_https: true`) --- CHANGELOG.md | 1 + system/config/system.yaml | 1 + system/src/Grav/Common/Service/SessionServiceProvider.php | 3 ++- 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e5202a3833..f482808442 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ 1. [](#new) * Made `Grav::redirect()` to accept `Route` class * Added `translated()` method to `PageTranslateInterface` + * Use secure session cookies in HTTPS by default (`system.session.secure_https: true`) 2. [](#improved) * Upgraded vendor libs for PHP 8.1 compatibility * Upgraded to **composer v2.1.14** for PHP 8.1 compatibility diff --git a/system/config/system.yaml b/system/config/system.yaml index 652910d863..60abcee340 100644 --- a/system/config/system.yaml +++ b/system/config/system.yaml @@ -182,6 +182,7 @@ session: name: grav-site # Name prefix of the session cookie. Use alphanumeric, dashes or underscores only. Do not use dots in the session name uniqueness: path # Should sessions be `path` based or `security.salt` based secure: false # Set session secure. If true, indicates that communication for this cookie must be over an encrypted transmission. Enable this only on sites that run exclusively on HTTPS + secure_https: true # Set session secure on HTTPS but not on HTTP. Has no effect if you have `session.secure: true`. Set to false if your site jumps between HTTP and HTTPS. httponly: true # Set session HTTP only. If true, indicates that cookies should be used only over HTTP, and JavaScript modification is not allowed. samesite: Lax # Set session SameSite. Possible values are Lax, Strict and None. See https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite split: true # Sessions should be independent between site and plugins (such as admin) diff --git a/system/src/Grav/Common/Service/SessionServiceProvider.php b/system/src/Grav/Common/Service/SessionServiceProvider.php index 88c833f269..502007c7d4 100644 --- a/system/src/Grav/Common/Service/SessionServiceProvider.php +++ b/system/src/Grav/Common/Service/SessionServiceProvider.php @@ -40,7 +40,8 @@ public function register(Container $container) // Get session options. $enabled = (bool)$config->get('system.session.enabled', false); - $cookie_secure = (bool)$config->get('system.session.secure', false); + $cookie_secure = $config->get('system.session.secure', false) + || ($config->get('system.session.secure_https', true) && $uri->scheme(true) === 'https'); $cookie_httponly = (bool)$config->get('system.session.httponly', true); $cookie_lifetime = (int)$config->get('system.session.timeout', 1800); $cookie_domain = $config->get('system.session.domain'); From bc70c9b93c26d4e04dbded25d15f7ff66cda1503 Mon Sep 17 00:00:00 2001 From: Matias Griese Date: Wed, 8 Dec 2021 17:40:30 +0200 Subject: [PATCH 53/83] Added `session.secure_https` to system blueprint --- system/blueprints/config/system.yaml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/system/blueprints/config/system.yaml b/system/blueprints/config/system.yaml index 1aeaf2bf21..aff54b46c2 100644 --- a/system/blueprints/config/system.yaml +++ b/system/blueprints/config/system.yaml @@ -1394,6 +1394,18 @@ form: validate: type: bool + session.secure_https: + type: toggle + label: PLUGIN_ADMIN.SESSION_SECURE_HTTPS + help: PLUGIN_ADMIN.SESSION_SECURE_HTTPS_HELP + highlight: 1 + options: + 1: PLUGIN_ADMIN.YES + 0: PLUGIN_ADMIN.NO + default: true + validate: + type: bool + session.httponly: type: toggle label: PLUGIN_ADMIN.SESSION_HTTPONLY From 3f3503e0f3f68bd6bd2213ec04a6d41a20516e33 Mon Sep 17 00:00:00 2001 From: dani <10264696+dani-ooo@users.noreply.github.com> Date: Thu, 9 Dec 2021 00:27:38 -0500 Subject: [PATCH 54/83] Update external.yaml (#3493) --- system/blueprints/pages/external.yaml | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/system/blueprints/pages/external.yaml b/system/blueprints/pages/external.yaml index df1d7b0aad..d3bb57ac95 100644 --- a/system/blueprints/pages/external.yaml +++ b/system/blueprints/pages/external.yaml @@ -1,7 +1,7 @@ -title: PLUGIN_ADMIN:EXTERNAL +title: PLUGIN_ADMIN.EXTERNAL extends@: - type: default - context: blueprints://pages + type: default + context: blueprints://pages form: validation: loose @@ -29,16 +29,16 @@ form: unset@: true header.external_url: - type: text - label: PLUGIN_ADMIN.EXTERNAL_URL - placeholder: https://getgrav.org - validate: - required: true + type: text + label: PLUGIN_ADMIN.EXTERNAL_URL + placeholder: https://getgrav.org + validate: + required: true + options: fields: publishing: - fields: header.date: From 236c068d704c3cb7b9f51f0487926127bb2c8749 Mon Sep 17 00:00:00 2001 From: Matias Griese Date: Thu, 9 Dec 2021 14:06:58 +0200 Subject: [PATCH 55/83] Improve typehints --- composer.json | 5 ++ composer.lock | 12 ++--- system/src/Grav/Common/Page/Medium/Medium.php | 5 ++ system/src/Grav/Common/Uri.php | 6 +-- .../UniformResourceLocatorExtension.php | 51 +++++++++++++++++++ tests/phpstan/extension.neon | 5 ++ tests/phpstan/phpstan.neon | 1 + tests/phpstan/plugins.neon | 1 + 8 files changed, 77 insertions(+), 9 deletions(-) create mode 100644 tests/phpstan/classes/Toolbox/UniformResourceLocatorExtension.php create mode 100644 tests/phpstan/extension.neon diff --git a/composer.json b/composer.json index 8e5924a6c9..2c82dd72dc 100644 --- a/composer.json +++ b/composer.json @@ -101,6 +101,11 @@ "system/src/DOMWordsIterator.php" ] }, + "autoload-dev": { + "psr-4": { + "PHPStan\\": "tests/phpstan/classes" + } + }, "archive": { "exclude": [ "VERSION" diff --git a/composer.lock b/composer.lock index 2c4c4ea443..f26fa2439b 100644 --- a/composer.lock +++ b/composer.lock @@ -4562,16 +4562,16 @@ }, { "name": "phpspec/prophecy", - "version": "1.14.0", + "version": "v1.15.0", "source": { "type": "git", "url": "https://github.com/phpspec/prophecy.git", - "reference": "d86dfc2e2a3cd366cee475e52c6bb3bbc371aa0e" + "reference": "bbcd7380b0ebf3961ee21409db7b38bc31d69a13" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/d86dfc2e2a3cd366cee475e52c6bb3bbc371aa0e", - "reference": "d86dfc2e2a3cd366cee475e52c6bb3bbc371aa0e", + "url": "https://api.github.com/repos/phpspec/prophecy/zipball/bbcd7380b0ebf3961ee21409db7b38bc31d69a13", + "reference": "bbcd7380b0ebf3961ee21409db7b38bc31d69a13", "shasum": "" }, "require": { @@ -4623,9 +4623,9 @@ ], "support": { "issues": "https://github.com/phpspec/prophecy/issues", - "source": "https://github.com/phpspec/prophecy/tree/1.14.0" + "source": "https://github.com/phpspec/prophecy/tree/v1.15.0" }, - "time": "2021-09-10T09:02:12+00:00" + "time": "2021-12-08T12:19:24+00:00" }, { "name": "phpstan/phpstan", diff --git a/system/src/Grav/Common/Page/Medium/Medium.php b/system/src/Grav/Common/Page/Medium/Medium.php index c94cf9fd0e..15263bd8f1 100644 --- a/system/src/Grav/Common/Page/Medium/Medium.php +++ b/system/src/Grav/Common/Page/Medium/Medium.php @@ -22,7 +22,12 @@ * Class Medium * @package Grav\Common\Page\Medium * + * @property string $filepath * @property string $mime + * @property int $size + * @property int $modified + * @property array $metadata + * @property int|string $timestamp */ class Medium extends Data implements RenderableInterface, MediaFileInterface { diff --git a/system/src/Grav/Common/Uri.php b/system/src/Grav/Common/Uri.php index 908d99f8ff..7491068c09 100644 --- a/system/src/Grav/Common/Uri.php +++ b/system/src/Grav/Common/Uri.php @@ -337,9 +337,9 @@ public function params($id = null, $array = false) /** * Get URI parameter. * - * @param string|null $id - * @param string|bool|null $default - * @return bool|string + * @param string $id + * @param string|false|null $default + * @return string|false|null */ public function param($id, $default = false) { diff --git a/tests/phpstan/classes/Toolbox/UniformResourceLocatorExtension.php b/tests/phpstan/classes/Toolbox/UniformResourceLocatorExtension.php new file mode 100644 index 0000000000..98bbca8a9f --- /dev/null +++ b/tests/phpstan/classes/Toolbox/UniformResourceLocatorExtension.php @@ -0,0 +1,51 @@ +getName() === 'findResource'; + } + + /** + * @param MethodReflection $methodReflection + * @param MethodCall $methodCall + * @param Scope $scope + * @return Type + */ + public function getTypeFromMethodCall(MethodReflection $methodReflection, MethodCall $methodCall, Scope $scope): Type + { + $first = $methodCall->getArgs()[2] ?? false; + if ($first) { + return new StringType(); + } + + return ParametersAcceptorSelector::selectSingle($methodReflection->getVariants())->getReturnType(); + } +} diff --git a/tests/phpstan/extension.neon b/tests/phpstan/extension.neon new file mode 100644 index 0000000000..ef44d0b415 --- /dev/null +++ b/tests/phpstan/extension.neon @@ -0,0 +1,5 @@ +services: + - + class: PHPStan\Toolbox\UniformResourceLocatorExtension + tags: + - phpstan.broker.dynamicMethodReturnTypeExtension diff --git a/tests/phpstan/phpstan.neon b/tests/phpstan/phpstan.neon index 546e2f088b..ef7a598de6 100644 --- a/tests/phpstan/phpstan.neon +++ b/tests/phpstan/phpstan.neon @@ -2,6 +2,7 @@ includes: #- '../../vendor/phpstan/phpstan-strict-rules/rules.neon' - '../../vendor/phpstan/phpstan-deprecation-rules/rules.neon' + - 'extension.neon' parameters: fileExtensions: - php diff --git a/tests/phpstan/plugins.neon b/tests/phpstan/plugins.neon index 6cf9e93c89..d6d037a218 100644 --- a/tests/phpstan/plugins.neon +++ b/tests/phpstan/plugins.neon @@ -1,6 +1,7 @@ includes: #- '../../vendor/phpstan/phpstan-strict-rules/rules.neon' - '../../vendor/phpstan/phpstan-deprecation-rules/rules.neon' + - 'extension.neon' parameters: fileExtensions: - php From 432f0eb9e57cb38f022f121495728215fc4a998b Mon Sep 17 00:00:00 2001 From: Matias Griese Date: Thu, 9 Dec 2021 15:07:37 +0200 Subject: [PATCH 56/83] Fixed some deprecation notices in flex --- system/src/Grav/Framework/Flex/FlexIndex.php | 8 ++++++++ system/src/Grav/Framework/Object/ObjectIndex.php | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/system/src/Grav/Framework/Flex/FlexIndex.php b/system/src/Grav/Framework/Flex/FlexIndex.php index 1dae57d81a..d3759787d6 100644 --- a/system/src/Grav/Framework/Flex/FlexIndex.php +++ b/system/src/Grav/Framework/Flex/FlexIndex.php @@ -118,6 +118,14 @@ public function __construct(array $entries = [], FlexDirectory $directory = null $this->setKeyField(null); } + /** + * @return string + */ + public function getKey() + { + return $this->_key ?: $this->getFlexType() . '@@' . spl_object_hash($this); + } + /** * {@inheritdoc} * @see FlexCommonInterface::hasFlexFeature() diff --git a/system/src/Grav/Framework/Object/ObjectIndex.php b/system/src/Grav/Framework/Object/ObjectIndex.php index e09c0dd95f..1237233459 100644 --- a/system/src/Grav/Framework/Object/ObjectIndex.php +++ b/system/src/Grav/Framework/Object/ObjectIndex.php @@ -35,7 +35,7 @@ abstract class ObjectIndex extends AbstractIndexCollection implements NestedObje protected static $type; /** @var string */ - private $_key; + protected $_key; /** * @param bool $prefix From 6ed453890d4c98de6c38587ab6240d1d8aaf4609 Mon Sep 17 00:00:00 2001 From: Matias Griese Date: Thu, 9 Dec 2021 15:45:25 +0200 Subject: [PATCH 57/83] Disabled pretty debug info for Flex as it slows down Twig rendering --- CHANGELOG.md | 1 + system/src/Grav/Common/Flex/Types/Pages/PageObject.php | 6 ++++-- system/src/Grav/Framework/Flex/FlexCollection.php | 6 ++++-- system/src/Grav/Framework/Flex/FlexIndex.php | 6 ++++-- system/src/Grav/Framework/Flex/FlexObject.php | 6 ++++-- system/src/Grav/Framework/Flex/Traits/FlexMediaTrait.php | 6 ++++-- 6 files changed, 21 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f482808442..01bd21b819 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ * Fixed bad key lookup in `FlexRelatedDirectoryTrait::getCollectionByProperty()` * Fixed RequestHandlers `NotFoundException` having empty request * Block `.json` files in web server configs + * Disabled pretty debug info for Flex as it slows down Twig rendering # v1.7.25 ## 11/16/2021 diff --git a/system/src/Grav/Common/Flex/Types/Pages/PageObject.php b/system/src/Grav/Common/Flex/Types/Pages/PageObject.php index 7f39d3b3be..143a4ab4ba 100644 --- a/system/src/Grav/Common/Flex/Types/Pages/PageObject.php +++ b/system/src/Grav/Common/Flex/Types/Pages/PageObject.php @@ -641,9 +641,10 @@ public function exists(): bool return $this->root ?: parent::exists(); } - /** + // TODO: Disabled because this slows down exception handling on missing Twig template files + /* * * @return array - */ + * / public function __debugInfo(): array { $list = parent::__debugInfo(); @@ -653,6 +654,7 @@ public function __debugInfo(): array '_content:private' => $this->getRawContent() ]; } + */ /** * @param array $elements diff --git a/system/src/Grav/Framework/Flex/FlexCollection.php b/system/src/Grav/Framework/Flex/FlexCollection.php index 17c557ae01..afab91d0d5 100644 --- a/system/src/Grav/Framework/Flex/FlexCollection.php +++ b/system/src/Grav/Framework/Flex/FlexCollection.php @@ -550,9 +550,10 @@ public function jsonSerialize() return $elements; } - /** + // TODO: Disabled because this slows down exception handling on missing Twig template files + /* * * @return array - */ + * / #[\ReturnTypeWillChange] public function __debugInfo() { @@ -563,6 +564,7 @@ public function __debugInfo() 'objects:private' => $this->getElements() ]; } + */ /** * Creates a new instance from the specified elements. diff --git a/system/src/Grav/Framework/Flex/FlexIndex.php b/system/src/Grav/Framework/Flex/FlexIndex.php index d3759787d6..da23aef765 100644 --- a/system/src/Grav/Framework/Flex/FlexIndex.php +++ b/system/src/Grav/Framework/Flex/FlexIndex.php @@ -529,9 +529,10 @@ public function __unserialize(array $data): void $this->setEntries($data['entries']); } - /** + // TODO: Disabled because this slows down exception handling on missing Twig template files + /* * * @return array - */ + * / #[\ReturnTypeWillChange] public function __debugInfo() { @@ -542,6 +543,7 @@ public function __debugInfo() 'entries:private' => $this->getEntries() ]; } + */ /** * @param array $entries diff --git a/system/src/Grav/Framework/Flex/FlexObject.php b/system/src/Grav/Framework/Flex/FlexObject.php index 87773470a6..631629e6d8 100644 --- a/system/src/Grav/Framework/Flex/FlexObject.php +++ b/system/src/Grav/Framework/Flex/FlexObject.php @@ -958,9 +958,10 @@ public function __toString() return $this->getFlexKey(); } - /** + // TODO: Disabled because this slows down exception handling on missing Twig template files + /* * * @return array - */ + * / #[\ReturnTypeWillChange] public function __debugInfo() { @@ -973,6 +974,7 @@ public function __debugInfo() 'storage:private' => $this->getMetaData() ]; } + */ /** * Clone object. diff --git a/system/src/Grav/Framework/Flex/Traits/FlexMediaTrait.php b/system/src/Grav/Framework/Flex/Traits/FlexMediaTrait.php index c2bc66891f..dfbc5b7376 100644 --- a/system/src/Grav/Framework/Flex/Traits/FlexMediaTrait.php +++ b/system/src/Grav/Framework/Flex/Traits/FlexMediaTrait.php @@ -286,9 +286,10 @@ public function deleteMediaFile(string $filename): void $this->clearMediaCache(); } - /** + // TODO: Disabled because this slows down exception handling on missing Twig template files + /* * * @return array - */ + * / #[\ReturnTypeWillChange] public function __debugInfo() { @@ -296,6 +297,7 @@ public function __debugInfo() 'uploads:private' => $this->getUpdatedMedia() ]; } + */ /** * @param array $files From 491252476d79f8f358852d6d69c4dd0ad6088e45 Mon Sep 17 00:00:00 2001 From: Matias Griese Date: Thu, 9 Dec 2021 21:09:23 +0200 Subject: [PATCH 58/83] Fixed Twig being very slow when templates do not exist --- CHANGELOG.md | 1 + .../src/Grav/Common/Twig/TwigEnvironment.php | 37 +++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 01bd21b819..8360e6be96 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ * Fixed RequestHandlers `NotFoundException` having empty request * Block `.json` files in web server configs * Disabled pretty debug info for Flex as it slows down Twig rendering + * Fixed Twig being very slow when templates do not exist # v1.7.25 ## 11/16/2021 diff --git a/system/src/Grav/Common/Twig/TwigEnvironment.php b/system/src/Grav/Common/Twig/TwigEnvironment.php index bebbdf16ec..357e94bce9 100644 --- a/system/src/Grav/Common/Twig/TwigEnvironment.php +++ b/system/src/Grav/Common/Twig/TwigEnvironment.php @@ -10,6 +10,9 @@ namespace Grav\Common\Twig; use Twig\Environment; +use Twig\Error\LoaderError; +use Twig\Template; +use Twig\TemplateWrapper; /** * Class TwigEnvironment @@ -18,4 +21,38 @@ class TwigEnvironment extends Environment { use WriteCacheFileTrait; + + /** + * @inheritDoc + */ + public function resolveTemplate($names) + { + if (!\is_array($names)) { + $names = [$names]; + } + + $count = \count($names); + foreach ($names as $name) { + if ($name instanceof Template) { + return $name; + } + if ($name instanceof TemplateWrapper) { + return $name; + } + + if (1 !== $count && !$this->getLoader()->exists($name)) { + continue; + } + + try { + return $this->loadTemplate($name); + } catch (LoaderError $e) { + if (1 === $count) { + throw $e; + } + } + } + + throw new LoaderError(sprintf('Unable to find one of the following templates: "%s".', implode('", "', $names))); + } } From f2a78339336646480ae7b6c3c7fef70ae0100a5a Mon Sep 17 00:00:00 2001 From: Matias Griese Date: Thu, 9 Dec 2021 21:12:47 +0200 Subject: [PATCH 59/83] Restore debug info for flex --- system/src/Grav/Framework/Flex/FlexCollection.php | 6 ++---- system/src/Grav/Framework/Flex/FlexIndex.php | 6 ++---- system/src/Grav/Framework/Flex/FlexObject.php | 6 ++---- 3 files changed, 6 insertions(+), 12 deletions(-) diff --git a/system/src/Grav/Framework/Flex/FlexCollection.php b/system/src/Grav/Framework/Flex/FlexCollection.php index afab91d0d5..17c557ae01 100644 --- a/system/src/Grav/Framework/Flex/FlexCollection.php +++ b/system/src/Grav/Framework/Flex/FlexCollection.php @@ -550,10 +550,9 @@ public function jsonSerialize() return $elements; } - // TODO: Disabled because this slows down exception handling on missing Twig template files - /* * + /** * @return array - * / + */ #[\ReturnTypeWillChange] public function __debugInfo() { @@ -564,7 +563,6 @@ public function __debugInfo() 'objects:private' => $this->getElements() ]; } - */ /** * Creates a new instance from the specified elements. diff --git a/system/src/Grav/Framework/Flex/FlexIndex.php b/system/src/Grav/Framework/Flex/FlexIndex.php index da23aef765..d3759787d6 100644 --- a/system/src/Grav/Framework/Flex/FlexIndex.php +++ b/system/src/Grav/Framework/Flex/FlexIndex.php @@ -529,10 +529,9 @@ public function __unserialize(array $data): void $this->setEntries($data['entries']); } - // TODO: Disabled because this slows down exception handling on missing Twig template files - /* * + /** * @return array - * / + */ #[\ReturnTypeWillChange] public function __debugInfo() { @@ -543,7 +542,6 @@ public function __debugInfo() 'entries:private' => $this->getEntries() ]; } - */ /** * @param array $entries diff --git a/system/src/Grav/Framework/Flex/FlexObject.php b/system/src/Grav/Framework/Flex/FlexObject.php index 631629e6d8..87773470a6 100644 --- a/system/src/Grav/Framework/Flex/FlexObject.php +++ b/system/src/Grav/Framework/Flex/FlexObject.php @@ -958,10 +958,9 @@ public function __toString() return $this->getFlexKey(); } - // TODO: Disabled because this slows down exception handling on missing Twig template files - /* * + /** * @return array - * / + */ #[\ReturnTypeWillChange] public function __debugInfo() { @@ -974,7 +973,6 @@ public function __debugInfo() 'storage:private' => $this->getMetaData() ]; } - */ /** * Clone object. From 420a4e3566739064b63133a8efcc96d16761cd71 Mon Sep 17 00:00:00 2001 From: Matias Griese Date: Thu, 9 Dec 2021 21:18:10 +0200 Subject: [PATCH 60/83] Add comment into TwigEnvironment --- system/src/Grav/Common/Twig/TwigEnvironment.php | 1 + 1 file changed, 1 insertion(+) diff --git a/system/src/Grav/Common/Twig/TwigEnvironment.php b/system/src/Grav/Common/Twig/TwigEnvironment.php index 357e94bce9..6709ae3342 100644 --- a/system/src/Grav/Common/Twig/TwigEnvironment.php +++ b/system/src/Grav/Common/Twig/TwigEnvironment.php @@ -40,6 +40,7 @@ public function resolveTemplate($names) return $name; } + // Avoid throwing an exception as it is really slow to handle. if (1 !== $count && !$this->getLoader()->exists($name)) { continue; } From 945b90fa46693006675fc0268044979b6e852fe8 Mon Sep 17 00:00:00 2001 From: Matias Griese Date: Fri, 10 Dec 2021 12:46:55 +0200 Subject: [PATCH 61/83] Changelog update --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8360e6be96..7fa7a8c052 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,7 +15,7 @@ * Fixed RequestHandlers `NotFoundException` having empty request * Block `.json` files in web server configs * Disabled pretty debug info for Flex as it slows down Twig rendering - * Fixed Twig being very slow when templates do not exist + * Fixed Twig being very slow when template overrides do not exist # v1.7.25 ## 11/16/2021 From 25bc1edf3115e9495ebdbb83b3e350613918d843 Mon Sep 17 00:00:00 2001 From: Matias Griese Date: Fri, 10 Dec 2021 16:20:19 +0200 Subject: [PATCH 62/83] Update Twig optimization to reflect upstream code --- system/src/Grav/Common/Twig/TwigEnvironment.php | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/system/src/Grav/Common/Twig/TwigEnvironment.php b/system/src/Grav/Common/Twig/TwigEnvironment.php index 6709ae3342..f7e7c15bdb 100644 --- a/system/src/Grav/Common/Twig/TwigEnvironment.php +++ b/system/src/Grav/Common/Twig/TwigEnvironment.php @@ -40,18 +40,13 @@ public function resolveTemplate($names) return $name; } - // Avoid throwing an exception as it is really slow to handle. + // Optimization: Avoid throwing an exception when it would be ignored anyway. if (1 !== $count && !$this->getLoader()->exists($name)) { continue; } - try { - return $this->loadTemplate($name); - } catch (LoaderError $e) { - if (1 === $count) { - throw $e; - } - } + // Throws LoaderError: Unable to find template "%s". + return $this->loadTemplate($name); } throw new LoaderError(sprintf('Unable to find one of the following templates: "%s".', implode('", "', $names))); From fae431bc39e5ad833642e80637278c550b98bc69 Mon Sep 17 00:00:00 2001 From: Matias Griese Date: Tue, 14 Dec 2021 17:13:55 +0200 Subject: [PATCH 63/83] Composer update --- composer.lock | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/composer.lock b/composer.lock index f26fa2439b..b525308266 100644 --- a/composer.lock +++ b/composer.lock @@ -3439,16 +3439,16 @@ }, { "name": "codeception/codeception", - "version": "4.1.22", + "version": "4.1.23", "source": { "type": "git", "url": "https://github.com/Codeception/Codeception.git", - "reference": "9777ec3690ceedc4bce2ed13af7af4ca4ee3088f" + "reference": "27d18cd5d5a1d77d3f1b01ea776238676faf5dcc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Codeception/Codeception/zipball/9777ec3690ceedc4bce2ed13af7af4ca4ee3088f", - "reference": "9777ec3690ceedc4bce2ed13af7af4ca4ee3088f", + "url": "https://api.github.com/repos/Codeception/Codeception/zipball/27d18cd5d5a1d77d3f1b01ea776238676faf5dcc", + "reference": "27d18cd5d5a1d77d3f1b01ea776238676faf5dcc", "shasum": "" }, "require": { @@ -3498,7 +3498,10 @@ "psr-4": { "Codeception\\": "src/Codeception", "Codeception\\Extension\\": "ext" - } + }, + "files": [ + "functions.php" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -3522,7 +3525,7 @@ ], "support": { "issues": "https://github.com/Codeception/Codeception/issues", - "source": "https://github.com/Codeception/Codeception/tree/4.1.22" + "source": "https://github.com/Codeception/Codeception/tree/4.1.23" }, "funding": [ { @@ -3530,7 +3533,7 @@ "type": "open_collective" } ], - "time": "2021-08-06T17:15:34+00:00" + "time": "2021-12-11T18:05:26+00:00" }, { "name": "codeception/lib-asserts", From def62ec2a2b4da347ba6e5f7868d9e1943d973ba Mon Sep 17 00:00:00 2001 From: Matias Griese Date: Wed, 15 Dec 2021 12:48:02 +0200 Subject: [PATCH 64/83] Fixed message about user groups not being cached --- .../Grav/Common/Flex/Types/UserGroups/UserGroupCollection.php | 2 +- .../src/Grav/Common/Flex/Types/UserGroups/UserGroupObject.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/system/src/Grav/Common/Flex/Types/UserGroups/UserGroupCollection.php b/system/src/Grav/Common/Flex/Types/UserGroups/UserGroupCollection.php index 93abbf8869..b2c176d71d 100644 --- a/system/src/Grav/Common/Flex/Types/UserGroups/UserGroupCollection.php +++ b/system/src/Grav/Common/Flex/Types/UserGroups/UserGroupCollection.php @@ -27,7 +27,7 @@ class UserGroupCollection extends FlexCollection public static function getCachedMethods(): array { return [ - 'authorize' => 'session', + 'authorize' => false, ] + parent::getCachedMethods(); } diff --git a/system/src/Grav/Common/Flex/Types/UserGroups/UserGroupObject.php b/system/src/Grav/Common/Flex/Types/UserGroups/UserGroupObject.php index ea68fa1bf8..e341ce9aa4 100644 --- a/system/src/Grav/Common/Flex/Types/UserGroups/UserGroupObject.php +++ b/system/src/Grav/Common/Flex/Types/UserGroups/UserGroupObject.php @@ -37,7 +37,7 @@ class UserGroupObject extends FlexObject implements UserGroupInterface public static function getCachedMethods(): array { return [ - 'authorize' => 'session', + 'authorize' => false, ] + parent::getCachedMethods(); } From 484a41e42a9d8717c33c4b011977b03084182506 Mon Sep 17 00:00:00 2001 From: Matias Griese Date: Wed, 15 Dec 2021 13:28:03 +0200 Subject: [PATCH 65/83] Added second parameter to `UserObject::isMyself()` method --- CHANGELOG.md | 1 + .../src/Grav/Common/Flex/Types/Users/UserObject.php | 12 +++++++++--- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7fa7a8c052..822d9a6cc3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ 1. [](#new) * Made `Grav::redirect()` to accept `Route` class * Added `translated()` method to `PageTranslateInterface` + * Added second parameter to `UserObject::isMyself()` method * Use secure session cookies in HTTPS by default (`system.session.secure_https: true`) 2. [](#improved) * Upgraded vendor libs for PHP 8.1 compatibility diff --git a/system/src/Grav/Common/Flex/Types/Users/UserObject.php b/system/src/Grav/Common/Flex/Types/Users/UserObject.php index 6c6d965f78..b89997ac7d 100644 --- a/system/src/Grav/Common/Flex/Types/Users/UserObject.php +++ b/system/src/Grav/Common/Flex/Types/Users/UserObject.php @@ -232,13 +232,19 @@ public function def($name, $default = null, $separator = null) } /** + * @param UserInterface|null $user * @return bool */ - public function isMyself(): bool + public function isMyself(?UserInterface $user = null): bool { - $me = $this->getActiveUser(); + if (null === $user) { + $user = $this->getActiveUser(); + if ($user && !$user->authenticated) { + $user = null; + } + } - return $me && $me->authenticated && $this->username === $me->username; + return $user && $this->username === $user->username; } /** From a4beb9b8bdc6f5233d6944404e5977036ecf8eb9 Mon Sep 17 00:00:00 2001 From: Matias Griese Date: Wed, 15 Dec 2021 18:00:27 +0200 Subject: [PATCH 66/83] Fixed `UserObject::$authorizeCallable` binding to the user object --- CHANGELOG.md | 1 + system/src/Grav/Common/Flex/Types/Users/UserObject.php | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 822d9a6cc3..1736bc1534 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,7 @@ * Block `.json` files in web server configs * Disabled pretty debug info for Flex as it slows down Twig rendering * Fixed Twig being very slow when template overrides do not exist + * Fixed `UserObject::$authorizeCallable` binding to the user object # v1.7.25 ## 11/16/2021 diff --git a/system/src/Grav/Common/Flex/Types/Users/UserObject.php b/system/src/Grav/Common/Flex/Types/Users/UserObject.php index b89997ac7d..77d49528ca 100644 --- a/system/src/Grav/Common/Flex/Types/Users/UserObject.php +++ b/system/src/Grav/Common/Flex/Types/Users/UserObject.php @@ -284,8 +284,8 @@ public function authorize(string $action, string $scope = null): ?bool // Check custom application access. $authorizeCallable = static::$authorizeCallable; if ($authorizeCallable instanceof Closure) { - $authorizeCallable->bindTo($this); - $authorized = $authorizeCallable($action, $scope); + $callable = $authorizeCallable->bindTo($this, $this); + $authorized = $callable($action, $scope); if (is_bool($authorized)) { return $authorized; } From 1c51bf8a66756ed8d8a8c069ae8366975bb37edd Mon Sep 17 00:00:00 2001 From: Matias Griese Date: Wed, 15 Dec 2021 18:00:50 +0200 Subject: [PATCH 67/83] Added `UserObject::$isAuthorizedCallable` to allow `$user->isAuthorized()` customization --- CHANGELOG.md | 1 + .../src/Grav/Common/Flex/Types/Users/UserObject.php | 12 ++++++++++++ 2 files changed, 13 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1736bc1534..6dc12acd24 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ * Made `Grav::redirect()` to accept `Route` class * Added `translated()` method to `PageTranslateInterface` * Added second parameter to `UserObject::isMyself()` method + * Added `UserObject::$isAuthorizedCallable` to allow `$user->isAuthorized()` customization * Use secure session cookies in HTTPS by default (`system.session.secure_https: true`) 2. [](#improved) * Upgraded vendor libs for PHP 8.1 compatibility diff --git a/system/src/Grav/Common/Flex/Types/Users/UserObject.php b/system/src/Grav/Common/Flex/Types/Users/UserObject.php index 77d49528ca..8891e7f873 100644 --- a/system/src/Grav/Common/Flex/Types/Users/UserObject.php +++ b/system/src/Grav/Common/Flex/Types/Users/UserObject.php @@ -79,6 +79,8 @@ class UserObject extends FlexObject implements UserInterface, Countable /** @var Closure|null */ static public $authorizeCallable; + /** @var Closure|null */ + static public $isAuthorizedCallable; /** @var array|null */ protected $_uploads_original; @@ -690,6 +692,16 @@ protected function doGetBlueprint(string $name = ''): Blueprint */ protected function isAuthorizedOverride(UserInterface $user, string $action, string $scope, bool $isMe = false): ?bool { + // Check custom application access. + $isAuthorizedCallable = static::$isAuthorizedCallable; + if ($isAuthorizedCallable instanceof Closure) { + $callable = $isAuthorizedCallable->bindTo($this, $this); + $authorized = $callable($user, $action, $scope, $isMe); + if (is_bool($authorized)) { + return $authorized; + } + } + if ($user instanceof self && $user->getStorageKey() === $this->getStorageKey()) { // User cannot delete his own account, otherwise he has full access. return $action !== 'delete'; From 74096e836f6a3c886aad09f93a663769f94ee35c Mon Sep 17 00:00:00 2001 From: Djamil Legato Date: Wed, 15 Dec 2021 12:19:01 -0800 Subject: [PATCH 68/83] Updated OpenCollective tiers --- README.md | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 31a4a7e4bc..5f0e679a92 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ [![PHPStan](https://img.shields.io/badge/PHPStan-enabled-brightgreen.svg?style=flat)](https://github.com/phpstan/phpstan) [![Discord](https://img.shields.io/discord/501836936584101899.svg?logo=discord&colorB=728ADA&label=Discord%20Chat)](https://chat.getgrav.org) - [![PHP Tests](https://github.com/getgrav/grav/workflows/PHP%20Tests/badge.svg?branch=develop)](https://github.com/getgrav/grav/actions?query=workflow%3A%22PHP+Tests%22) [![OpenCollective](https://opencollective.com/grav/backers/badge.svg)](#backers) [![OpenCollective](https://opencollective.com/grav/sponsors/badge.svg)](#sponsors) + [![PHP Tests](https://github.com/getgrav/grav/workflows/PHP%20Tests/badge.svg?branch=develop)](https://github.com/getgrav/grav/actions?query=workflow%3A%22PHP+Tests%22) [![OpenCollective](https://opencollective.com/grav/tiers/backers/badge.svg?label=Backers&color=brightgreen)](#backers) [![OpenCollective](https://opencollective.com/grav/tiers/supporters/badge.svg?label=Supporters&color=brightgreen)](#supporters) [![OpenCollective](https://opencollective.com/grav/tiers/sponsors/badge.svg?label=Sponsors&color=brightgreen)](#sponsors) Grav is a **Fast**, **Simple**, and **Flexible**, file-based Web-platform. There is **Zero** installation required. Just extract the ZIP archive, and you are already up and running. It follows similar principles to other flat-file CMS platforms, but has a different design philosophy than most. Grav comes with a powerful **Package Management System** to allow for simple installation and upgrading of plugins and themes, as well as simple updating of Grav itself. @@ -117,12 +117,19 @@ If you discover a possible security issue related to Grav or one of its plugins, * More [Awesome Grav Stuff](https://github.com/getgrav/awesome-grav) # Backers -Support Grav with a monthly donation to help us continue development. [[Become a backer](https://opencollective.com/grav#backer)] +Support Grav with a monthly donation to help us continue development. [[Become a backer](https://opencollective.com/grav/contribute)] + +# Supporters +Support Grav with a monthly donation to help us continue development. [[Become a supporter](https://opencollective.com/grav/contribute)] + + + + # Sponsors -Become a sponsor and get your logo on our README on Github with a link to your site. [[Become a sponsor](https://opencollective.com/grav#sponsor)] +Support Grav with a yearly donation to help us continue development. [[Become a sponsor](https://opencollective.com/grav/contribute)] From 4ccbdafe8a63e326899e60eb23da3334b85b6329 Mon Sep 17 00:00:00 2001 From: Matias Griese Date: Thu, 16 Dec 2021 08:49:45 +0200 Subject: [PATCH 69/83] Update Toolbox library for PHP 8.1 support --- composer.lock | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/composer.lock b/composer.lock index b525308266..25fad88cc6 100644 --- a/composer.lock +++ b/composer.lock @@ -2075,16 +2075,16 @@ }, { "name": "rockettheme/toolbox", - "version": "1.5.11", + "version": "1.6.0", "source": { "type": "git", "url": "https://github.com/rockettheme/toolbox.git", - "reference": "ea23368c1bf635981c7b33babd842a6236befd86" + "reference": "a0eb328b9c416e526c8264b48ccbc1a7519e8618" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/rockettheme/toolbox/zipball/ea23368c1bf635981c7b33babd842a6236befd86", - "reference": "ea23368c1bf635981c7b33babd842a6236befd86", + "url": "https://api.github.com/repos/rockettheme/toolbox/zipball/a0eb328b9c416e526c8264b48ccbc1a7519e8618", + "reference": "a0eb328b9c416e526c8264b48ccbc1a7519e8618", "shasum": "" }, "require": { @@ -2097,9 +2097,9 @@ "symfony/yaml": "^3.4|^4.0" }, "require-dev": { - "phpstan/phpstan": "^1.0", + "phpstan/phpstan": "^1.2", "phpstan/phpstan-deprecation-rules": "^1.0", - "phpunit/phpunit": "~8.0" + "phpunit/phpunit": "^8.0" }, "type": "library", "autoload": { @@ -2113,7 +2113,10 @@ "RocketTheme\\Toolbox\\ResourceLocator\\": "ResourceLocator/src", "RocketTheme\\Toolbox\\Session\\": "Session/src", "RocketTheme\\Toolbox\\StreamWrapper\\": "StreamWrapper/src" - } + }, + "exclude-from-classmap": [ + "**/tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -2127,9 +2130,9 @@ ], "support": { "issues": "https://github.com/rockettheme/toolbox/issues", - "source": "https://github.com/rockettheme/toolbox/tree/1.5.11" + "source": "https://github.com/rockettheme/toolbox/tree/1.6.0" }, - "time": "2021-11-25T19:43:12+00:00" + "time": "2021-12-15T19:20:00+00:00" }, { "name": "seld/cli-prompt", From 89acc59ac31293a65966b00d0654bb305305c2f7 Mon Sep 17 00:00:00 2001 From: Matias Griese Date: Thu, 16 Dec 2021 10:57:10 +0200 Subject: [PATCH 70/83] Improved UserObject cloning --- system/src/Grav/Common/Flex/Types/Users/UserObject.php | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/system/src/Grav/Common/Flex/Types/Users/UserObject.php b/system/src/Grav/Common/Flex/Types/Users/UserObject.php index 8891e7f873..3a7e2c2cb6 100644 --- a/system/src/Grav/Common/Flex/Types/Users/UserObject.php +++ b/system/src/Grav/Common/Flex/Types/Users/UserObject.php @@ -141,6 +141,14 @@ public function __construct(array $elements, $key, FlexDirectory $directory, boo parent::__construct($elements, $key, $directory, $validate); } + public function __clone() + { + $this->_access = null; + $this->_groups = null; + + parent::__clone(); + } + /** * @return void */ From c7700c2e16324eb3bebc75feef0cba67ba60abbb Mon Sep 17 00:00:00 2001 From: dani <10264696+daniurx@users.noreply.github.com> Date: Wed, 15 Dec 2021 12:38:41 -0500 Subject: [PATCH 71/83] Update es.yaml missing accents --- system/languages/es.yaml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/system/languages/es.yaml b/system/languages/es.yaml index 95827ee2bd..a8a47aa382 100644 --- a/system/languages/es.yaml +++ b/system/languages/es.yaml @@ -44,7 +44,7 @@ GRAV: WK: sem MO: mes YR: año - DEC: dic + DEC: déc SECOND_PLURAL: segundos MINUTE_PLURAL: minutos HOUR_PLURAL: horas @@ -64,7 +64,7 @@ GRAV: VALIDATION_FAIL: 'Falló la validación: ' INVALID_INPUT: 'Dato inválido en: ' MISSING_REQUIRED_FIELD: 'Falta el campo requerido: ' - XSS_ISSUES: "Se detectaron problemas XSS potenciales en el campo '%s'" + XSS_ISSUES: "Se detectaron potenciales problemas XSS en el campo '%s'" MONTHS_OF_THE_YEAR: - 'Enero' - 'Febrero' @@ -86,7 +86,7 @@ GRAV: - 'Viernes' - 'Sábado' - 'Domingo' - YES: "Si" + YES: "Sí" NO: "No" CRON: EVERY: cada @@ -96,12 +96,12 @@ GRAV: EVERY_DAY_OF_MONTH: cada día del mes EVERY_MONTH: cada mes TEXT_PERIOD: Cada - TEXT_MINS: ' a minuto(s) despues de la hora' + TEXT_MINS: ' a minuto(s) después de la hora' TEXT_TIME: ' a :' TEXT_DOW: ' en ' TEXT_MONTH: ' de' TEXT_DOM: ' en' - ERROR1: La etiqueta %s no está soportada! - ERROR2: El número de elementos es erroneo + ERROR1: '¡La etiqueta %s no está soportada!' + ERROR2: El número de elementos es erróneo ERROR3: El jquery_element debería establecerse en la configuración del jqCron ERROR4: Expresión no reconocida From 530e6a4399c6a37cbd56c673e95a08ca522f0b2c Mon Sep 17 00:00:00 2001 From: dani <10264696+daniurx@users.noreply.github.com> Date: Wed, 15 Dec 2021 12:40:19 -0500 Subject: [PATCH 72/83] Update pages.yaml i believe this is a mistake, the unclosed `` tag is rendering the entire form this way. --- system/blueprints/flex/pages.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/blueprints/flex/pages.yaml b/system/blueprints/flex/pages.yaml index 5c6ed8eb5e..89dab6a56b 100644 --- a/system/blueprints/flex/pages.yaml +++ b/system/blueprints/flex/pages.yaml @@ -104,7 +104,7 @@ config: edit: title: - template: "{% if object.root %}Root ( <root> ){% else %}{{ (form.value('header.title') ?? form.value('folder'))|e }} ( {{ (object.getRoute().toString(false) ?: '/')|e }} ){% endif %}" + template: "{% if object.root %}Root ( <root> ){% else %}{{ (form.value('header.title') ?? form.value('folder'))|e }} ( {{ (object.getRoute().toString(false) ?: '/')|e }} ){% endif %}" # TODO: not used yet buttons: From 0f85b831b528c7e70c6ff9bd2e7bd95b66208d57 Mon Sep 17 00:00:00 2001 From: Matias Griese Date: Thu, 16 Dec 2021 13:55:36 +0200 Subject: [PATCH 73/83] Minor fixes --- system/src/Grav/Common/Flex/Types/Pages/PageObject.php | 4 +--- .../src/Grav/Common/Page/Interfaces/PageContentInterface.php | 3 ++- system/src/Grav/Common/Page/Page.php | 2 +- .../src/Grav/Framework/Flex/Pages/Traits/PageContentTrait.php | 1 + system/src/Grav/Framework/Flex/Traits/FlexMediaTrait.php | 4 +--- tests/phpstan/plugins.neon | 1 + 6 files changed, 7 insertions(+), 8 deletions(-) diff --git a/system/src/Grav/Common/Flex/Types/Pages/PageObject.php b/system/src/Grav/Common/Flex/Types/Pages/PageObject.php index 143a4ab4ba..2ff5ed8d26 100644 --- a/system/src/Grav/Common/Flex/Types/Pages/PageObject.php +++ b/system/src/Grav/Common/Flex/Types/Pages/PageObject.php @@ -641,8 +641,7 @@ public function exists(): bool return $this->root ?: parent::exists(); } - // TODO: Disabled because this slows down exception handling on missing Twig template files - /* * + /** * @return array * / public function __debugInfo(): array @@ -654,7 +653,6 @@ public function __debugInfo(): array '_content:private' => $this->getRawContent() ]; } - */ /** * @param array $elements diff --git a/system/src/Grav/Common/Page/Interfaces/PageContentInterface.php b/system/src/Grav/Common/Page/Interfaces/PageContentInterface.php index 30db89d667..69bf8bf0d8 100644 --- a/system/src/Grav/Common/Page/Interfaces/PageContentInterface.php +++ b/system/src/Grav/Common/Page/Interfaces/PageContentInterface.php @@ -11,6 +11,7 @@ use Grav\Common\Data\Blueprint; use Grav\Common\Media\Interfaces\MediaCollectionInterface; +use Grav\Common\Page\Header; /** * Methods currently implemented in Flex Page emulation layer. @@ -21,7 +22,7 @@ interface PageContentInterface * Gets and Sets the header based on the YAML configuration at the top of the .md file * * @param object|array|null $var a YAML object representing the configuration for the file - * @return object the current YAML configuration + * @return \stdClass|Header The current YAML configuration */ public function header($var = null); diff --git a/system/src/Grav/Common/Page/Page.php b/system/src/Grav/Common/Page/Page.php index 9929262488..31dfe1ffda 100644 --- a/system/src/Grav/Common/Page/Page.php +++ b/system/src/Grav/Common/Page/Page.php @@ -388,7 +388,7 @@ public function frontmatter($var = null) * Gets and Sets the header based on the YAML configuration at the top of the .md file * * @param object|array|null $var a YAML object representing the configuration for the file - * @return object the current YAML configuration + * @return \stdClass the current YAML configuration */ public function header($var = null) { diff --git a/system/src/Grav/Framework/Flex/Pages/Traits/PageContentTrait.php b/system/src/Grav/Framework/Flex/Pages/Traits/PageContentTrait.php index c3bbb405e4..bbf5e1b043 100644 --- a/system/src/Grav/Framework/Flex/Pages/Traits/PageContentTrait.php +++ b/system/src/Grav/Framework/Flex/Pages/Traits/PageContentTrait.php @@ -100,6 +100,7 @@ public static function normalizeRoute($route): string /** * @inheritdoc + * @return Header */ public function header($var = null) { diff --git a/system/src/Grav/Framework/Flex/Traits/FlexMediaTrait.php b/system/src/Grav/Framework/Flex/Traits/FlexMediaTrait.php index dfbc5b7376..d34b391442 100644 --- a/system/src/Grav/Framework/Flex/Traits/FlexMediaTrait.php +++ b/system/src/Grav/Framework/Flex/Traits/FlexMediaTrait.php @@ -286,8 +286,7 @@ public function deleteMediaFile(string $filename): void $this->clearMediaCache(); } - // TODO: Disabled because this slows down exception handling on missing Twig template files - /* * + /** * @return array * / #[\ReturnTypeWillChange] @@ -297,7 +296,6 @@ public function __debugInfo() 'uploads:private' => $this->getUpdatedMedia() ]; } - */ /** * @param array $files diff --git a/tests/phpstan/plugins.neon b/tests/phpstan/plugins.neon index d6d037a218..82570cca56 100644 --- a/tests/phpstan/plugins.neon +++ b/tests/phpstan/plugins.neon @@ -38,6 +38,7 @@ parameters: - Grav\Common\GPM\Common\Package - Grav\Common\GPM\Local\Package - Grav\Common\GPM\Remote\Package + - Grav\Common\Page\Header - Grav\Common\Session - Gantry\Component\Config\Config dynamicConstantNames: From a6fb0a14f03c046e779ab3e92fc2a0eda2515b45 Mon Sep 17 00:00:00 2001 From: Matias Griese Date: Thu, 16 Dec 2021 13:59:13 +0200 Subject: [PATCH 74/83] Fix bad docblocks --- system/src/Grav/Common/Flex/Types/Pages/PageObject.php | 2 +- system/src/Grav/Framework/Flex/Traits/FlexMediaTrait.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/system/src/Grav/Common/Flex/Types/Pages/PageObject.php b/system/src/Grav/Common/Flex/Types/Pages/PageObject.php index 2ff5ed8d26..7f39d3b3be 100644 --- a/system/src/Grav/Common/Flex/Types/Pages/PageObject.php +++ b/system/src/Grav/Common/Flex/Types/Pages/PageObject.php @@ -643,7 +643,7 @@ public function exists(): bool /** * @return array - * / + */ public function __debugInfo(): array { $list = parent::__debugInfo(); diff --git a/system/src/Grav/Framework/Flex/Traits/FlexMediaTrait.php b/system/src/Grav/Framework/Flex/Traits/FlexMediaTrait.php index d34b391442..c2bc66891f 100644 --- a/system/src/Grav/Framework/Flex/Traits/FlexMediaTrait.php +++ b/system/src/Grav/Framework/Flex/Traits/FlexMediaTrait.php @@ -288,7 +288,7 @@ public function deleteMediaFile(string $filename): void /** * @return array - * / + */ #[\ReturnTypeWillChange] public function __debugInfo() { From 5bec5db5e13ae63b84df59c1c5c8305abe558120 Mon Sep 17 00:00:00 2001 From: Matias Griese Date: Thu, 16 Dec 2021 14:25:51 +0200 Subject: [PATCH 75/83] Fixed Plugin::config() returning null in some cases --- system/src/Grav/Common/Plugin.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/src/Grav/Common/Plugin.php b/system/src/Grav/Common/Plugin.php index 3b0d3fb14e..ac5a3c4742 100644 --- a/system/src/Grav/Common/Plugin.php +++ b/system/src/Grav/Common/Plugin.php @@ -118,7 +118,7 @@ public function setConfig(Config $config) */ public function config() { - return null !== $this->config ? $this->config["plugins.{$this->name}"] : []; + return $this->config["plugins.{$this->name}"] ?? []; } /** From 290a28109e3fea7bbaf7957f81653adaa315f65f Mon Sep 17 00:00:00 2001 From: Matias Griese Date: Fri, 17 Dec 2021 19:42:02 +0200 Subject: [PATCH 76/83] When symlinking Grav install, include also tests --- CHANGELOG.md | 1 + system/src/Grav/Console/Cli/SandboxCommand.php | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6dc12acd24..8e1a6cd4eb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ * Upgraded to **composer v2.1.14** for PHP 8.1 compatibility * Added third `$name` parameter to `Blueprint::flattenData()` method, useful for flattening repeating data * `ControllerResponseTrait`: Redirect response should be json if the extension is .json + * When symlinking Grav install, include also tests 3. [](#bugfix) * Fixed bad key lookup in `FlexRelatedDirectoryTrait::getCollectionByProperty()` * Fixed RequestHandlers `NotFoundException` having empty request diff --git a/system/src/Grav/Console/Cli/SandboxCommand.php b/system/src/Grav/Console/Cli/SandboxCommand.php index d865b4ae70..995812c1f5 100644 --- a/system/src/Grav/Console/Cli/SandboxCommand.php +++ b/system/src/Grav/Console/Cli/SandboxCommand.php @@ -200,6 +200,10 @@ private function symlink(): int $io->newLine(); $io->writeln('Resetting Symbolic Links'); + // Symlink also tests if using git. + if (is_dir($this->source . '/tests')) { + $this->mappings['/tests'] = '/tests'; + } foreach ($this->mappings as $source => $target) { if ((string)(int)$source === (string)$source) { From 8343cfb27812753f2919226c51d75460116784da Mon Sep 17 00:00:00 2001 From: Andy Miller Date: Sat, 18 Dec 2021 17:46:55 -0700 Subject: [PATCH 77/83] new Plugin::upstreamConfigVar --- CHANGELOG.md | 1 + system/src/Grav/Common/Plugin.php | 24 ++++++++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6dc12acd24..d422c7c62c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ * Added second parameter to `UserObject::isMyself()` method * Added `UserObject::$isAuthorizedCallable` to allow `$user->isAuthorized()` customization * Use secure session cookies in HTTPS by default (`system.session.secure_https: true`) + * Added new `Plugin::upstreamConfigVar()` function to access plugin specific functions for page overrides 2. [](#improved) * Upgraded vendor libs for PHP 8.1 compatibility * Upgraded to **composer v2.1.14** for PHP 8.1 compatibility diff --git a/system/src/Grav/Common/Plugin.php b/system/src/Grav/Common/Plugin.php index ac5a3c4742..bd245d7612 100644 --- a/system/src/Grav/Common/Plugin.php +++ b/system/src/Grav/Common/Plugin.php @@ -414,6 +414,30 @@ public static function saveConfig($name) return true; } + public static function upstreamConfigVar(string $plugin, string $var, PageInterface $page = null, $default = null) + { + if (Utils::isAdminPlugin()) { + $page = Grav::instance()['admin']->page() ?? null; + } else { + $page = $page ?? Grav::instance()['page'] ?? null; + } + + // Try to find var in the page headers + if ($page instanceof PageInterface && $page->exists()) { + // Loop over pages and look for header vars + while ($page && !$page->root()) { + $header = new Data((array)$page->header()); + $value = $header->get("$plugin.$var"); + if (isset($value)) { + return $value; + } + $page = $page->parent(); + } + } + + return Grav::instance()['config']->get("plugins.$plugin.$var", $default); + } + /** * Simpler getter for the plugin blueprint * From bfc9e26f2650c8bcbd3daf4aa55c53d44ad96d1f Mon Sep 17 00:00:00 2001 From: Andy Miller Date: Sat, 18 Dec 2021 17:53:19 -0700 Subject: [PATCH 78/83] renamed method --- CHANGELOG.md | 2 +- system/src/Grav/Common/Plugin.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2e4b5f8996..f3efb28ba3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,7 +7,7 @@ * Added second parameter to `UserObject::isMyself()` method * Added `UserObject::$isAuthorizedCallable` to allow `$user->isAuthorized()` customization * Use secure session cookies in HTTPS by default (`system.session.secure_https: true`) - * Added new `Plugin::upstreamConfigVar()` function to access plugin specific functions for page overrides + * Added new `Plugin::inheritedConfigOption()` function to access plugin specific functions for page overrides 2. [](#improved) * Upgraded vendor libs for PHP 8.1 compatibility * Upgraded to **composer v2.1.14** for PHP 8.1 compatibility diff --git a/system/src/Grav/Common/Plugin.php b/system/src/Grav/Common/Plugin.php index bd245d7612..3510b53ec7 100644 --- a/system/src/Grav/Common/Plugin.php +++ b/system/src/Grav/Common/Plugin.php @@ -414,7 +414,7 @@ public static function saveConfig($name) return true; } - public static function upstreamConfigVar(string $plugin, string $var, PageInterface $page = null, $default = null) + public static function inheritedConfigOption(string $plugin, string $var, PageInterface $page = null, $default = null) { if (Utils::isAdminPlugin()) { $page = Grav::instance()['admin']->page() ?? null; From 26295d5cf28177d3e3ef0f3de9541e4cdbcd8200 Mon Sep 17 00:00:00 2001 From: Matias Griese Date: Mon, 20 Dec 2021 14:46:20 +0200 Subject: [PATCH 79/83] Fixed `FlexIndex::call()` to return null instead of failing to call undefined method --- CHANGELOG.md | 1 + system/src/Grav/Framework/Flex/FlexIndex.php | 10 +++++++--- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f3efb28ba3..724b617dfa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,7 @@ * Disabled pretty debug info for Flex as it slows down Twig rendering * Fixed Twig being very slow when template overrides do not exist * Fixed `UserObject::$authorizeCallable` binding to the user object + * Fixed `FlexIndex::call()` to return null instead of failing to call undefined method # v1.7.25 ## 11/16/2021 diff --git a/system/src/Grav/Framework/Flex/FlexIndex.php b/system/src/Grav/Framework/Flex/FlexIndex.php index d3759787d6..c433a080b0 100644 --- a/system/src/Grav/Framework/Flex/FlexIndex.php +++ b/system/src/Grav/Framework/Flex/FlexIndex.php @@ -502,9 +502,13 @@ public function __call($name, $arguments) } } else { $collection = $this->loadCollection(); - $result = $collection->{$name}(...$arguments); - if (!isset($cachedMethods[$name])) { - $debugger->addMessage("Call '{$flexType}:{$name}()' isn't cached", 'debug'); + if (\is_callable([$collection, $name])) { + $result = $collection->{$name}(...$arguments); + if (!isset($cachedMethods[$name])) { + $debugger->addMessage("Call '{$flexType}:{$name}()' isn't cached", 'debug'); + } + } else { + $result = null; } } From 4519971a762175b61c24e2f9c4c07d3113f282f4 Mon Sep 17 00:00:00 2001 From: Matias Griese Date: Wed, 22 Dec 2021 21:28:26 +0200 Subject: [PATCH 80/83] Fixed Flex directory configuration creating environment configuration when it should not --- CHANGELOG.md | 1 + system/src/Grav/Framework/Flex/FlexDirectory.php | 15 ++++++++++++--- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 724b617dfa..f487b4cb11 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,7 @@ * Fixed Twig being very slow when template overrides do not exist * Fixed `UserObject::$authorizeCallable` binding to the user object * Fixed `FlexIndex::call()` to return null instead of failing to call undefined method + * Fixed Flex directory configuration creating environment configuration when it should not # v1.7.25 ## 11/16/2021 diff --git a/system/src/Grav/Framework/Flex/FlexDirectory.php b/system/src/Grav/Framework/Flex/FlexDirectory.php index 21965fce90..57a0a4c467 100644 --- a/system/src/Grav/Framework/Flex/FlexDirectory.php +++ b/system/src/Grav/Framework/Flex/FlexDirectory.php @@ -21,7 +21,7 @@ use Grav\Framework\Cache\Adapter\DoctrineCache; use Grav\Framework\Cache\Adapter\MemoryCache; use Grav\Framework\Cache\CacheInterface; -use Grav\Framework\Flex\Interfaces\FlexAuthorizeInterface; +use Grav\Framework\Filesystem\Filesystem; use Grav\Framework\Flex\Interfaces\FlexCollectionInterface; use Grav\Framework\Flex\Interfaces\FlexDirectoryInterface; use Grav\Framework\Flex\Interfaces\FlexFormInterface; @@ -218,8 +218,17 @@ public function saveDirectoryConfig(string $name, array $data) /** @var UniformResourceLocator $locator */ $locator = $grav['locator']; - /** @var string $filename Filename is always string */ - $filename = $locator->findResource($this->getDirectoryConfigUri($name), true, true); + + $filename = $this->getDirectoryConfigUri($name); + if (file_exists($filename)) { + $filename = $locator->findResource($filename, true); + } else { + $filesystem = Filesystem::getInstance(); + $dirname = $filesystem->dirname($filename); + $basename = $filesystem->basename($filename); + $dirname = $locator->findResource($dirname, true) ?: $locator->findResource($dirname, true, true); + $filename = "{$dirname}/{$basename}"; + } $file = YamlFile::instance($filename); if (!empty($data)) { From 6af1ee48a5feaa5a0d4baf375dcad1c57d145cc9 Mon Sep 17 00:00:00 2001 From: Matias Griese Date: Mon, 3 Jan 2022 16:38:11 +0200 Subject: [PATCH 81/83] Fixed PHP 8.1 issue in Media, minor optimization --- system/src/Grav/Common/Page/Media.php | 17 ++++++++++++----- .../src/Grav/Common/Page/Medium/ImageMedium.php | 8 ++++---- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/system/src/Grav/Common/Page/Media.php b/system/src/Grav/Common/Page/Media.php index e18201420c..b9936850cb 100644 --- a/system/src/Grav/Common/Page/Media.php +++ b/system/src/Grav/Common/Page/Media.php @@ -10,6 +10,7 @@ namespace Grav\Common\Page; use FilesystemIterator; +use Grav\Common\Config\Config; use Grav\Common\Grav; use Grav\Common\Media\Interfaces\MediaObjectInterface; use Grav\Common\Yaml; @@ -86,11 +87,6 @@ public function offsetGet($offset) */ protected function init() { - /** @var UniformResourceLocator $locator */ - $locator = Grav::instance()['locator']; - $config = Grav::instance()['config']; - $exif_reader = isset(Grav::instance()['exif']) ? Grav::instance()['exif']->getReader() : false; - $media_types = array_keys(Grav::instance()['config']->get('media.types')); $path = $this->getPath(); // Handle special cases where page doesn't exist in filesystem. @@ -98,6 +94,17 @@ protected function init() return; } + $grav = Grav::instance(); + + /** @var UniformResourceLocator $locator */ + $locator = $grav['locator']; + + /** @var Config $config */ + $config = $grav['config']; + + $exif_reader = isset($grav['exif']) ? $grav['exif']->getReader() : null; + $media_types = array_keys($config->get('media.types', [])); + $iterator = new FilesystemIterator($path, FilesystemIterator::UNIX_PATHS | FilesystemIterator::SKIP_DOTS); $media = []; diff --git a/system/src/Grav/Common/Page/Medium/ImageMedium.php b/system/src/Grav/Common/Page/Medium/ImageMedium.php index 6d1e9043d1..7bb5b46c25 100644 --- a/system/src/Grav/Common/Page/Medium/ImageMedium.php +++ b/system/src/Grav/Common/Page/Medium/ImageMedium.php @@ -249,12 +249,12 @@ public function sourceParsedownElement(array $attributes, $reset = true) if ($this->saved_image_path && $this->auto_sizes) { if (!array_key_exists('height', $this->attributes) && !array_key_exists('width', $this->attributes)) { $info = getimagesize($this->saved_image_path); - $width = intval($info[0]); - $height = intval($info[1]); + $width = (int)$info[0]; + $height = (int)$info[1]; $scaling_factor = $this->retina_scale > 0 ? $this->retina_scale : 1; - $attributes['width'] = intval($width / $scaling_factor); - $attributes['height'] = intval($height / $scaling_factor); + $attributes['width'] = (int)($width / $scaling_factor); + $attributes['height'] = (int)($height / $scaling_factor); if ($this->aspect_ratio) { $style = ($attributes['style'] ?? ' ') . "--aspect-ratio: $width/$height;"; From 3b7921b698fb8e4409958e68b7650bdbbb8588d6 Mon Sep 17 00:00:00 2001 From: Andy Miller Date: Mon, 3 Jan 2022 09:14:00 -0700 Subject: [PATCH 82/83] updated copyright year --- CHANGELOG.md | 1 + assets/.gitkeep | 2 +- backup/.gitkeep | 2 +- bin/gpm | 2 +- bin/grav | 2 +- bin/plugin | 2 +- cache/.gitkeep | 2 +- images/.gitkeep | 2 +- index.php | 2 +- logs/.gitkeep | 2 +- system/defines.php | 2 +- system/install.php | 2 +- system/router.php | 2 +- system/src/Grav/Common/Assets.php | 2 +- system/src/Grav/Common/Assets/BaseAsset.php | 2 +- system/src/Grav/Common/Assets/Css.php | 2 +- system/src/Grav/Common/Assets/InlineCss.php | 2 +- system/src/Grav/Common/Assets/InlineJs.php | 2 +- system/src/Grav/Common/Assets/Js.php | 2 +- system/src/Grav/Common/Assets/Pipeline.php | 2 +- system/src/Grav/Common/Assets/Traits/AssetUtilsTrait.php | 2 +- system/src/Grav/Common/Assets/Traits/LegacyAssetsTrait.php | 2 +- system/src/Grav/Common/Assets/Traits/TestingAssetsTrait.php | 2 +- system/src/Grav/Common/Backup/Backups.php | 2 +- system/src/Grav/Common/Browser.php | 2 +- system/src/Grav/Common/Cache.php | 2 +- system/src/Grav/Common/Composer.php | 2 +- system/src/Grav/Common/Config/CompiledBase.php | 2 +- system/src/Grav/Common/Config/CompiledBlueprints.php | 2 +- system/src/Grav/Common/Config/CompiledConfig.php | 2 +- system/src/Grav/Common/Config/CompiledLanguages.php | 2 +- system/src/Grav/Common/Config/Config.php | 2 +- system/src/Grav/Common/Config/ConfigFileFinder.php | 2 +- system/src/Grav/Common/Config/Languages.php | 2 +- system/src/Grav/Common/Config/Setup.php | 2 +- system/src/Grav/Common/Data/Blueprint.php | 2 +- system/src/Grav/Common/Data/BlueprintSchema.php | 2 +- system/src/Grav/Common/Data/Blueprints.php | 2 +- system/src/Grav/Common/Data/Data.php | 2 +- system/src/Grav/Common/Data/DataInterface.php | 2 +- system/src/Grav/Common/Data/Validation.php | 2 +- system/src/Grav/Common/Data/ValidationException.php | 2 +- system/src/Grav/Common/Debugger.php | 2 +- system/src/Grav/Common/Errors/BareHandler.php | 2 +- system/src/Grav/Common/Errors/Errors.php | 2 +- system/src/Grav/Common/Errors/SimplePageHandler.php | 2 +- system/src/Grav/Common/Errors/SystemFacade.php | 2 +- system/src/Grav/Common/File/CompiledFile.php | 2 +- system/src/Grav/Common/File/CompiledJsonFile.php | 2 +- system/src/Grav/Common/File/CompiledMarkdownFile.php | 2 +- system/src/Grav/Common/File/CompiledYamlFile.php | 2 +- system/src/Grav/Common/Filesystem/Archiver.php | 2 +- system/src/Grav/Common/Filesystem/Folder.php | 2 +- .../Common/Filesystem/RecursiveDirectoryFilterIterator.php | 2 +- .../Common/Filesystem/RecursiveFolderFilterIterator.php | 2 +- system/src/Grav/Common/Filesystem/ZipArchiver.php | 2 +- system/src/Grav/Common/Flex/FlexCollection.php | 2 +- system/src/Grav/Common/Flex/FlexIndex.php | 2 +- system/src/Grav/Common/Flex/FlexObject.php | 2 +- system/src/Grav/Common/Flex/Traits/FlexCollectionTrait.php | 2 +- system/src/Grav/Common/Flex/Traits/FlexCommonTrait.php | 2 +- system/src/Grav/Common/Flex/Traits/FlexGravTrait.php | 2 +- system/src/Grav/Common/Flex/Traits/FlexIndexTrait.php | 2 +- system/src/Grav/Common/Flex/Traits/FlexObjectTrait.php | 2 +- .../Grav/Common/Flex/Types/Generic/GenericCollection.php | 2 +- system/src/Grav/Common/Flex/Types/Generic/GenericIndex.php | 2 +- system/src/Grav/Common/Flex/Types/Generic/GenericObject.php | 2 +- system/src/Grav/Common/Flex/Types/Pages/PageCollection.php | 2 +- system/src/Grav/Common/Flex/Types/Pages/PageIndex.php | 2 +- system/src/Grav/Common/Flex/Types/Pages/PageObject.php | 2 +- .../Grav/Common/Flex/Types/Pages/Storage/PageStorage.php | 2 +- .../Common/Flex/Types/Pages/Traits/PageContentTrait.php | 2 +- .../Grav/Common/Flex/Types/Pages/Traits/PageLegacyTrait.php | 2 +- .../Common/Flex/Types/Pages/Traits/PageRoutableTrait.php | 2 +- .../Common/Flex/Types/Pages/Traits/PageTranslateTrait.php | 2 +- .../Common/Flex/Types/UserGroups/UserGroupCollection.php | 2 +- .../Grav/Common/Flex/Types/UserGroups/UserGroupIndex.php | 2 +- .../Grav/Common/Flex/Types/UserGroups/UserGroupObject.php | 2 +- .../Common/Flex/Types/Users/Storage/UserFileStorage.php | 2 +- .../Common/Flex/Types/Users/Storage/UserFolderStorage.php | 2 +- .../Flex/Types/Users/Traits/UserObjectLegacyTrait.php | 2 +- system/src/Grav/Common/Flex/Types/Users/UserCollection.php | 2 +- system/src/Grav/Common/Flex/Types/Users/UserIndex.php | 2 +- system/src/Grav/Common/Flex/Types/Users/UserObject.php | 2 +- system/src/Grav/Common/Form/FormFlash.php | 2 +- system/src/Grav/Common/GPM/AbstractCollection.php | 2 +- .../Grav/Common/GPM/Common/AbstractPackageCollection.php | 2 +- system/src/Grav/Common/GPM/Common/CachedCollection.php | 2 +- system/src/Grav/Common/GPM/Common/Package.php | 2 +- system/src/Grav/Common/GPM/GPM.php | 2 +- system/src/Grav/Common/GPM/Installer.php | 2 +- system/src/Grav/Common/GPM/Licenses.php | 2 +- .../src/Grav/Common/GPM/Local/AbstractPackageCollection.php | 2 +- system/src/Grav/Common/GPM/Local/Package.php | 2 +- system/src/Grav/Common/GPM/Local/Packages.php | 2 +- system/src/Grav/Common/GPM/Local/Plugins.php | 2 +- system/src/Grav/Common/GPM/Local/Themes.php | 2 +- .../Grav/Common/GPM/Remote/AbstractPackageCollection.php | 2 +- system/src/Grav/Common/GPM/Remote/GravCore.php | 2 +- system/src/Grav/Common/GPM/Remote/Package.php | 2 +- system/src/Grav/Common/GPM/Remote/Packages.php | 2 +- system/src/Grav/Common/GPM/Remote/Plugins.php | 2 +- system/src/Grav/Common/GPM/Remote/Themes.php | 2 +- system/src/Grav/Common/GPM/Upgrader.php | 2 +- system/src/Grav/Common/Getters.php | 2 +- system/src/Grav/Common/Grav.php | 2 +- system/src/Grav/Common/GravTrait.php | 2 +- system/src/Grav/Common/HTTP/Client.php | 2 +- system/src/Grav/Common/HTTP/Response.php | 2 +- system/src/Grav/Common/Helpers/Base32.php | 2 +- system/src/Grav/Common/Helpers/Excerpts.php | 2 +- system/src/Grav/Common/Helpers/Exif.php | 2 +- system/src/Grav/Common/Helpers/LogViewer.php | 2 +- system/src/Grav/Common/Helpers/Truncator.php | 2 +- system/src/Grav/Common/Helpers/YamlLinter.php | 2 +- system/src/Grav/Common/Inflector.php | 2 +- system/src/Grav/Common/Iterator.php | 2 +- system/src/Grav/Common/Language/Language.php | 2 +- system/src/Grav/Common/Language/LanguageCodes.php | 6 +++--- system/src/Grav/Common/Markdown/Parsedown.php | 2 +- system/src/Grav/Common/Markdown/ParsedownExtra.php | 2 +- system/src/Grav/Common/Markdown/ParsedownGravTrait.php | 2 +- .../Grav/Common/Media/Interfaces/AudioMediaInterface.php | 2 +- .../Common/Media/Interfaces/ImageManipulateInterface.php | 2 +- .../Grav/Common/Media/Interfaces/ImageMediaInterface.php | 2 +- .../Common/Media/Interfaces/MediaCollectionInterface.php | 2 +- .../src/Grav/Common/Media/Interfaces/MediaFileInterface.php | 2 +- system/src/Grav/Common/Media/Interfaces/MediaInterface.php | 2 +- .../src/Grav/Common/Media/Interfaces/MediaLinkInterface.php | 2 +- .../Grav/Common/Media/Interfaces/MediaObjectInterface.php | 2 +- .../Grav/Common/Media/Interfaces/MediaPlayerInterface.php | 2 +- .../Grav/Common/Media/Interfaces/MediaUploadInterface.php | 2 +- .../Grav/Common/Media/Interfaces/VideoMediaInterface.php | 2 +- system/src/Grav/Common/Media/Traits/AudioMediaTrait.php | 2 +- system/src/Grav/Common/Media/Traits/ImageLoadingTrait.php | 2 +- system/src/Grav/Common/Media/Traits/ImageMediaTrait.php | 2 +- system/src/Grav/Common/Media/Traits/MediaFileTrait.php | 2 +- system/src/Grav/Common/Media/Traits/MediaObjectTrait.php | 2 +- system/src/Grav/Common/Media/Traits/MediaPlayerTrait.php | 2 +- system/src/Grav/Common/Media/Traits/MediaTrait.php | 2 +- system/src/Grav/Common/Media/Traits/MediaUploadTrait.php | 2 +- system/src/Grav/Common/Media/Traits/StaticResizeTrait.php | 2 +- system/src/Grav/Common/Media/Traits/ThumbnailMediaTrait.php | 2 +- system/src/Grav/Common/Media/Traits/VideoMediaTrait.php | 2 +- system/src/Grav/Common/Page/Collection.php | 2 +- system/src/Grav/Common/Page/Header.php | 2 +- .../Grav/Common/Page/Interfaces/PageCollectionInterface.php | 2 +- .../Grav/Common/Page/Interfaces/PageContentInterface.php | 2 +- system/src/Grav/Common/Page/Interfaces/PageInterface.php | 2 +- .../Grav/Common/Page/Interfaces/PagesSourceInterface.php | 2 +- system/src/Grav/Common/Page/Markdown/Excerpts.php | 2 +- system/src/Grav/Common/Page/Media.php | 2 +- system/src/Grav/Common/Page/Medium/AbstractMedia.php | 2 +- system/src/Grav/Common/Page/Medium/AudioMedium.php | 2 +- system/src/Grav/Common/Page/Medium/GlobalMedia.php | 2 +- system/src/Grav/Common/Page/Medium/ImageFile.php | 2 +- system/src/Grav/Common/Page/Medium/ImageMedium.php | 2 +- system/src/Grav/Common/Page/Medium/Link.php | 2 +- system/src/Grav/Common/Page/Medium/Medium.php | 2 +- system/src/Grav/Common/Page/Medium/MediumFactory.php | 2 +- system/src/Grav/Common/Page/Medium/ParsedownHtmlTrait.php | 2 +- system/src/Grav/Common/Page/Medium/RenderableInterface.php | 2 +- system/src/Grav/Common/Page/Medium/StaticImageMedium.php | 2 +- system/src/Grav/Common/Page/Medium/StaticResizeTrait.php | 2 +- system/src/Grav/Common/Page/Medium/ThumbnailImageMedium.php | 2 +- system/src/Grav/Common/Page/Medium/VideoMedium.php | 2 +- system/src/Grav/Common/Page/Page.php | 2 +- system/src/Grav/Common/Page/Pages.php | 2 +- system/src/Grav/Common/Page/Types.php | 2 +- system/src/Grav/Common/Plugin.php | 2 +- system/src/Grav/Common/Plugins.php | 2 +- system/src/Grav/Common/Processors/AssetsProcessor.php | 2 +- system/src/Grav/Common/Processors/BackupsProcessor.php | 2 +- .../src/Grav/Common/Processors/DebuggerAssetsProcessor.php | 2 +- .../Grav/Common/Processors/Events/RequestHandlerEvent.php | 2 +- system/src/Grav/Common/Processors/InitializeProcessor.php | 2 +- system/src/Grav/Common/Processors/PagesProcessor.php | 2 +- system/src/Grav/Common/Processors/PluginsProcessor.php | 2 +- system/src/Grav/Common/Processors/ProcessorBase.php | 2 +- system/src/Grav/Common/Processors/ProcessorInterface.php | 2 +- system/src/Grav/Common/Processors/RenderProcessor.php | 2 +- system/src/Grav/Common/Processors/RequestProcessor.php | 2 +- system/src/Grav/Common/Processors/SchedulerProcessor.php | 2 +- system/src/Grav/Common/Processors/TasksProcessor.php | 2 +- system/src/Grav/Common/Processors/ThemesProcessor.php | 2 +- system/src/Grav/Common/Processors/TwigProcessor.php | 2 +- system/src/Grav/Common/Scheduler/Cron.php | 2 +- system/src/Grav/Common/Scheduler/IntervalTrait.php | 2 +- system/src/Grav/Common/Scheduler/Job.php | 2 +- system/src/Grav/Common/Scheduler/Scheduler.php | 2 +- system/src/Grav/Common/Security.php | 2 +- system/src/Grav/Common/Service/AccountsServiceProvider.php | 2 +- system/src/Grav/Common/Service/AssetsServiceProvider.php | 2 +- system/src/Grav/Common/Service/BackupsServiceProvider.php | 2 +- system/src/Grav/Common/Service/ConfigServiceProvider.php | 2 +- system/src/Grav/Common/Service/ErrorServiceProvider.php | 2 +- .../src/Grav/Common/Service/FilesystemServiceProvider.php | 2 +- system/src/Grav/Common/Service/FlexServiceProvider.php | 2 +- system/src/Grav/Common/Service/InflectorServiceProvider.php | 2 +- system/src/Grav/Common/Service/LoggerServiceProvider.php | 2 +- system/src/Grav/Common/Service/OutputServiceProvider.php | 2 +- system/src/Grav/Common/Service/PagesServiceProvider.php | 2 +- system/src/Grav/Common/Service/RequestServiceProvider.php | 2 +- system/src/Grav/Common/Service/SchedulerServiceProvider.php | 2 +- system/src/Grav/Common/Service/SessionServiceProvider.php | 2 +- system/src/Grav/Common/Service/StreamsServiceProvider.php | 2 +- system/src/Grav/Common/Service/TaskServiceProvider.php | 2 +- system/src/Grav/Common/Session.php | 2 +- system/src/Grav/Common/Taxonomy.php | 2 +- system/src/Grav/Common/Theme.php | 2 +- system/src/Grav/Common/Themes.php | 2 +- system/src/Grav/Common/Twig/Exception/TwigException.php | 2 +- .../src/Grav/Common/Twig/Extension/FilesystemExtension.php | 2 +- system/src/Grav/Common/Twig/Extension/GravExtension.php | 2 +- system/src/Grav/Common/Twig/Node/TwigNodeCache.php | 2 +- system/src/Grav/Common/Twig/Node/TwigNodeMarkdown.php | 2 +- system/src/Grav/Common/Twig/Node/TwigNodeRender.php | 2 +- system/src/Grav/Common/Twig/Node/TwigNodeScript.php | 2 +- system/src/Grav/Common/Twig/Node/TwigNodeStyle.php | 2 +- system/src/Grav/Common/Twig/Node/TwigNodeSwitch.php | 2 +- system/src/Grav/Common/Twig/Node/TwigNodeThrow.php | 2 +- system/src/Grav/Common/Twig/Node/TwigNodeTryCatch.php | 2 +- .../Grav/Common/Twig/TokenParser/TwigTokenParserCache.php | 2 +- .../Common/Twig/TokenParser/TwigTokenParserMarkdown.php | 2 +- .../Grav/Common/Twig/TokenParser/TwigTokenParserRender.php | 2 +- .../Grav/Common/Twig/TokenParser/TwigTokenParserScript.php | 2 +- .../Grav/Common/Twig/TokenParser/TwigTokenParserStyle.php | 2 +- .../Grav/Common/Twig/TokenParser/TwigTokenParserSwitch.php | 2 +- .../Grav/Common/Twig/TokenParser/TwigTokenParserThrow.php | 2 +- .../Common/Twig/TokenParser/TwigTokenParserTryCatch.php | 2 +- system/src/Grav/Common/Twig/Twig.php | 2 +- system/src/Grav/Common/Twig/TwigClockworkDataSource.php | 2 +- system/src/Grav/Common/Twig/TwigClockworkDumper.php | 2 +- system/src/Grav/Common/Twig/TwigEnvironment.php | 2 +- system/src/Grav/Common/Twig/TwigExtension.php | 2 +- system/src/Grav/Common/Twig/WriteCacheFileTrait.php | 2 +- system/src/Grav/Common/Uri.php | 2 +- system/src/Grav/Common/User/Access.php | 2 +- system/src/Grav/Common/User/Authentication.php | 2 +- system/src/Grav/Common/User/DataUser/User.php | 2 +- system/src/Grav/Common/User/DataUser/UserCollection.php | 2 +- system/src/Grav/Common/User/Group.php | 2 +- .../src/Grav/Common/User/Interfaces/AuthorizeInterface.php | 2 +- .../Grav/Common/User/Interfaces/UserCollectionInterface.php | 2 +- .../src/Grav/Common/User/Interfaces/UserGroupInterface.php | 2 +- system/src/Grav/Common/User/Interfaces/UserInterface.php | 2 +- system/src/Grav/Common/User/Traits/UserTrait.php | 2 +- system/src/Grav/Common/User/User.php | 2 +- system/src/Grav/Common/Utils.php | 2 +- system/src/Grav/Common/Yaml.php | 2 +- system/src/Grav/Console/Application/Application.php | 2 +- .../Application/CommandLoader/PluginCommandLoader.php | 2 +- system/src/Grav/Console/Application/GpmApplication.php | 2 +- system/src/Grav/Console/Application/GravApplication.php | 2 +- system/src/Grav/Console/Application/PluginApplication.php | 2 +- system/src/Grav/Console/Cli/BackupCommand.php | 2 +- system/src/Grav/Console/Cli/CleanCommand.php | 2 +- system/src/Grav/Console/Cli/ClearCacheCommand.php | 2 +- system/src/Grav/Console/Cli/ComposerCommand.php | 2 +- system/src/Grav/Console/Cli/InstallCommand.php | 2 +- system/src/Grav/Console/Cli/LogViewerCommand.php | 2 +- system/src/Grav/Console/Cli/NewProjectCommand.php | 2 +- system/src/Grav/Console/Cli/PageSystemValidatorCommand.php | 2 +- system/src/Grav/Console/Cli/SandboxCommand.php | 2 +- system/src/Grav/Console/Cli/SchedulerCommand.php | 2 +- system/src/Grav/Console/Cli/SecurityCommand.php | 2 +- system/src/Grav/Console/Cli/ServerCommand.php | 2 +- system/src/Grav/Console/Cli/YamlLinterCommand.php | 2 +- system/src/Grav/Console/ConsoleCommand.php | 2 +- system/src/Grav/Console/ConsoleTrait.php | 2 +- system/src/Grav/Console/Gpm/DirectInstallCommand.php | 2 +- system/src/Grav/Console/Gpm/IndexCommand.php | 2 +- system/src/Grav/Console/Gpm/InfoCommand.php | 2 +- system/src/Grav/Console/Gpm/InstallCommand.php | 2 +- system/src/Grav/Console/Gpm/SelfupgradeCommand.php | 2 +- system/src/Grav/Console/Gpm/UninstallCommand.php | 2 +- system/src/Grav/Console/Gpm/UpdateCommand.php | 2 +- system/src/Grav/Console/Gpm/VersionCommand.php | 2 +- system/src/Grav/Console/GpmCommand.php | 2 +- system/src/Grav/Console/GravCommand.php | 2 +- system/src/Grav/Console/Plugin/PluginListCommand.php | 2 +- system/src/Grav/Console/TerminalObjects/Table.php | 2 +- system/src/Grav/Events/FlexRegisterEvent.php | 2 +- system/src/Grav/Events/PermissionsRegisterEvent.php | 2 +- system/src/Grav/Events/PluginsLoadedEvent.php | 2 +- system/src/Grav/Events/SessionStartEvent.php | 2 +- system/src/Grav/Framework/Acl/Access.php | 2 +- system/src/Grav/Framework/Acl/Action.php | 2 +- system/src/Grav/Framework/Acl/Permissions.php | 2 +- system/src/Grav/Framework/Acl/PermissionsReader.php | 2 +- system/src/Grav/Framework/Acl/RecursiveActionIterator.php | 2 +- system/src/Grav/Framework/Cache/AbstractCache.php | 2 +- system/src/Grav/Framework/Cache/Adapter/ChainCache.php | 2 +- system/src/Grav/Framework/Cache/Adapter/DoctrineCache.php | 2 +- system/src/Grav/Framework/Cache/Adapter/FileCache.php | 2 +- system/src/Grav/Framework/Cache/Adapter/MemoryCache.php | 2 +- system/src/Grav/Framework/Cache/Adapter/SessionCache.php | 2 +- system/src/Grav/Framework/Cache/CacheInterface.php | 2 +- system/src/Grav/Framework/Cache/CacheTrait.php | 2 +- .../src/Grav/Framework/Cache/Exception/CacheException.php | 2 +- .../Framework/Cache/Exception/InvalidArgumentException.php | 2 +- .../Grav/Framework/Collection/AbstractFileCollection.php | 2 +- .../Grav/Framework/Collection/AbstractIndexCollection.php | 2 +- .../Grav/Framework/Collection/AbstractLazyCollection.php | 2 +- system/src/Grav/Framework/Collection/ArrayCollection.php | 2 +- .../src/Grav/Framework/Collection/CollectionInterface.php | 2 +- system/src/Grav/Framework/Collection/FileCollection.php | 2 +- .../Grav/Framework/Collection/FileCollectionInterface.php | 2 +- system/src/Grav/Framework/Compat/Serializable.php | 2 +- system/src/Grav/Framework/ContentBlock/ContentBlock.php | 2 +- .../Grav/Framework/ContentBlock/ContentBlockInterface.php | 2 +- system/src/Grav/Framework/ContentBlock/HtmlBlock.php | 2 +- .../src/Grav/Framework/ContentBlock/HtmlBlockInterface.php | 2 +- .../Framework/Controller/Traits/ControllerResponseTrait.php | 2 +- system/src/Grav/Framework/DI/Container.php | 2 +- system/src/Grav/Framework/File/AbstractFile.php | 2 +- system/src/Grav/Framework/File/CsvFile.php | 2 +- system/src/Grav/Framework/File/DataFile.php | 2 +- system/src/Grav/Framework/File/File.php | 2 +- .../src/Grav/Framework/File/Formatter/AbstractFormatter.php | 2 +- system/src/Grav/Framework/File/Formatter/CsvFormatter.php | 2 +- system/src/Grav/Framework/File/Formatter/IniFormatter.php | 2 +- system/src/Grav/Framework/File/Formatter/JsonFormatter.php | 2 +- .../src/Grav/Framework/File/Formatter/MarkdownFormatter.php | 2 +- .../Grav/Framework/File/Formatter/SerializeFormatter.php | 2 +- system/src/Grav/Framework/File/Formatter/YamlFormatter.php | 2 +- system/src/Grav/Framework/File/IniFile.php | 2 +- .../Framework/File/Interfaces/FileFormatterInterface.php | 2 +- system/src/Grav/Framework/File/Interfaces/FileInterface.php | 2 +- system/src/Grav/Framework/File/JsonFile.php | 2 +- system/src/Grav/Framework/File/MarkdownFile.php | 2 +- system/src/Grav/Framework/File/YamlFile.php | 2 +- system/src/Grav/Framework/Filesystem/Filesystem.php | 2 +- .../Framework/Filesystem/Interfaces/FilesystemInterface.php | 2 +- system/src/Grav/Framework/Flex/Flex.php | 2 +- system/src/Grav/Framework/Flex/FlexCollection.php | 2 +- system/src/Grav/Framework/Flex/FlexDirectory.php | 2 +- system/src/Grav/Framework/Flex/FlexDirectoryForm.php | 2 +- system/src/Grav/Framework/Flex/FlexForm.php | 2 +- system/src/Grav/Framework/Flex/FlexFormFlash.php | 2 +- system/src/Grav/Framework/Flex/FlexIndex.php | 2 +- system/src/Grav/Framework/Flex/FlexObject.php | 2 +- .../Framework/Flex/Interfaces/FlexAuthorizeInterface.php | 2 +- .../Framework/Flex/Interfaces/FlexCollectionInterface.php | 2 +- .../Grav/Framework/Flex/Interfaces/FlexCommonInterface.php | 2 +- .../Flex/Interfaces/FlexDirectoryFormInterface.php | 2 +- .../Framework/Flex/Interfaces/FlexDirectoryInterface.php | 2 +- .../Grav/Framework/Flex/Interfaces/FlexFormInterface.php | 2 +- .../Grav/Framework/Flex/Interfaces/FlexIndexInterface.php | 2 +- system/src/Grav/Framework/Flex/Interfaces/FlexInterface.php | 2 +- .../Framework/Flex/Interfaces/FlexObjectFormInterface.php | 2 +- .../Grav/Framework/Flex/Interfaces/FlexObjectInterface.php | 2 +- .../Grav/Framework/Flex/Interfaces/FlexStorageInterface.php | 2 +- .../Framework/Flex/Interfaces/FlexTranslateInterface.php | 2 +- system/src/Grav/Framework/Flex/Pages/FlexPageCollection.php | 2 +- system/src/Grav/Framework/Flex/Pages/FlexPageIndex.php | 2 +- system/src/Grav/Framework/Flex/Pages/FlexPageObject.php | 2 +- .../Grav/Framework/Flex/Pages/Traits/PageAuthorsTrait.php | 2 +- .../Grav/Framework/Flex/Pages/Traits/PageContentTrait.php | 2 +- .../Grav/Framework/Flex/Pages/Traits/PageLegacyTrait.php | 2 +- .../Grav/Framework/Flex/Pages/Traits/PageRoutableTrait.php | 2 +- .../Grav/Framework/Flex/Pages/Traits/PageTranslateTrait.php | 2 +- .../Framework/Flex/Storage/AbstractFilesystemStorage.php | 2 +- system/src/Grav/Framework/Flex/Storage/FileStorage.php | 2 +- system/src/Grav/Framework/Flex/Storage/FolderStorage.php | 2 +- system/src/Grav/Framework/Flex/Storage/SimpleStorage.php | 2 +- .../src/Grav/Framework/Flex/Traits/FlexAuthorizeTrait.php | 2 +- system/src/Grav/Framework/Flex/Traits/FlexMediaTrait.php | 2 +- .../Framework/Flex/Traits/FlexRelatedDirectoryTrait.php | 2 +- system/src/Grav/Framework/Form/FormFlash.php | 2 +- system/src/Grav/Framework/Form/FormFlashFile.php | 2 +- .../Grav/Framework/Form/Interfaces/FormFactoryInterface.php | 2 +- .../Grav/Framework/Form/Interfaces/FormFlashInterface.php | 2 +- system/src/Grav/Framework/Form/Interfaces/FormInterface.php | 2 +- system/src/Grav/Framework/Form/Traits/FormTrait.php | 2 +- system/src/Grav/Framework/Interfaces/RenderInterface.php | 2 +- .../src/Grav/Framework/Logger/Processors/UserProcessor.php | 2 +- .../Framework/Media/Interfaces/MediaCollectionInterface.php | 2 +- .../src/Grav/Framework/Media/Interfaces/MediaInterface.php | 2 +- .../Media/Interfaces/MediaManipulationInterface.php | 2 +- .../Framework/Media/Interfaces/MediaObjectInterface.php | 2 +- system/src/Grav/Framework/Mime/MimeTypes.php | 2 +- .../src/Grav/Framework/Object/Access/ArrayAccessTrait.php | 2 +- .../Grav/Framework/Object/Access/NestedArrayAccessTrait.php | 2 +- .../Object/Access/NestedPropertyCollectionTrait.php | 2 +- .../Grav/Framework/Object/Access/NestedPropertyTrait.php | 2 +- .../Framework/Object/Access/OverloadedPropertyTrait.php | 2 +- system/src/Grav/Framework/Object/ArrayObject.php | 2 +- .../Grav/Framework/Object/Base/ObjectCollectionTrait.php | 2 +- system/src/Grav/Framework/Object/Base/ObjectTrait.php | 2 +- .../Framework/Object/Collection/ObjectExpressionVisitor.php | 2 +- .../Object/Interfaces/NestedObjectCollectionInterface.php | 2 +- .../Framework/Object/Interfaces/NestedObjectInterface.php | 2 +- .../Object/Interfaces/ObjectCollectionInterface.php | 2 +- .../Grav/Framework/Object/Interfaces/ObjectInterface.php | 2 +- system/src/Grav/Framework/Object/LazyObject.php | 2 +- system/src/Grav/Framework/Object/ObjectCollection.php | 2 +- system/src/Grav/Framework/Object/ObjectIndex.php | 2 +- .../Grav/Framework/Object/Property/ArrayPropertyTrait.php | 2 +- .../Grav/Framework/Object/Property/LazyPropertyTrait.php | 2 +- .../Grav/Framework/Object/Property/MixedPropertyTrait.php | 2 +- .../Grav/Framework/Object/Property/ObjectPropertyTrait.php | 2 +- system/src/Grav/Framework/Object/PropertyObject.php | 2 +- system/src/Grav/Framework/Pagination/AbstractPagination.php | 2 +- .../Grav/Framework/Pagination/AbstractPaginationPage.php | 2 +- .../Framework/Pagination/Interfaces/PaginationInterface.php | 2 +- .../Pagination/Interfaces/PaginationPageInterface.php | 2 +- system/src/Grav/Framework/Pagination/Pagination.php | 2 +- system/src/Grav/Framework/Pagination/PaginationPage.php | 2 +- system/src/Grav/Framework/Psr7/AbstractUri.php | 2 +- system/src/Grav/Framework/Psr7/Request.php | 2 +- system/src/Grav/Framework/Psr7/Response.php | 2 +- system/src/Grav/Framework/Psr7/ServerRequest.php | 2 +- system/src/Grav/Framework/Psr7/Stream.php | 2 +- .../Grav/Framework/Psr7/Traits/MessageDecoratorTrait.php | 2 +- .../Grav/Framework/Psr7/Traits/RequestDecoratorTrait.php | 2 +- .../Grav/Framework/Psr7/Traits/ResponseDecoratorTrait.php | 2 +- .../Framework/Psr7/Traits/ServerRequestDecoratorTrait.php | 2 +- .../src/Grav/Framework/Psr7/Traits/StreamDecoratorTrait.php | 2 +- .../Framework/Psr7/Traits/UploadedFileDecoratorTrait.php | 2 +- .../src/Grav/Framework/Psr7/Traits/UriDecorationTrait.php | 2 +- system/src/Grav/Framework/Psr7/UploadedFile.php | 2 +- system/src/Grav/Framework/Psr7/Uri.php | 2 +- .../RequestHandler/Exception/InvalidArgumentException.php | 2 +- .../RequestHandler/Exception/NotFoundException.php | 2 +- .../RequestHandler/Exception/NotHandledException.php | 2 +- .../RequestHandler/Exception/PageExpiredException.php | 2 +- .../Framework/RequestHandler/Exception/RequestException.php | 2 +- .../Framework/RequestHandler/Middlewares/Exceptions.php | 2 +- system/src/Grav/Framework/RequestHandler/RequestHandler.php | 2 +- .../Framework/RequestHandler/Traits/RequestHandlerTrait.php | 2 +- system/src/Grav/Framework/Route/Route.php | 2 +- system/src/Grav/Framework/Route/RouteFactory.php | 2 +- .../Grav/Framework/Session/Exceptions/SessionException.php | 2 +- system/src/Grav/Framework/Session/Messages.php | 2 +- system/src/Grav/Framework/Session/Session.php | 2 +- system/src/Grav/Framework/Session/SessionInterface.php | 2 +- system/src/Grav/Framework/Uri/Uri.php | 2 +- system/src/Grav/Framework/Uri/UriFactory.php | 2 +- system/src/Grav/Framework/Uri/UriPartsFilter.php | 2 +- system/src/Grav/Installer/Install.php | 2 +- system/src/Grav/Installer/InstallException.php | 2 +- system/src/Grav/Installer/Versions.php | 2 +- system/src/Grav/Installer/YamlUpdater.php | 2 +- tmp/.gitkeep | 2 +- user/accounts/.gitkeep | 2 +- user/data/.gitkeep | 2 +- user/plugins/.gitkeep | 2 +- user/themes/.gitkeep | 2 +- 449 files changed, 451 insertions(+), 450 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f487b4cb11..485dbe3c81 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ * Added third `$name` parameter to `Blueprint::flattenData()` method, useful for flattening repeating data * `ControllerResponseTrait`: Redirect response should be json if the extension is .json * When symlinking Grav install, include also tests + * Updated copyright year to `2022` 3. [](#bugfix) * Fixed bad key lookup in `FlexRelatedDirectoryTrait::getCollectionByProperty()` * Fixed RequestHandlers `NotFoundException` having empty request diff --git a/assets/.gitkeep b/assets/.gitkeep index 33a9aed719..8efbf1f12e 100644 --- a/assets/.gitkeep +++ b/assets/.gitkeep @@ -1 +1 @@ -/* @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. */ +/* @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. */ diff --git a/backup/.gitkeep b/backup/.gitkeep index 33a9aed719..8efbf1f12e 100644 --- a/backup/.gitkeep +++ b/backup/.gitkeep @@ -1 +1 @@ -/* @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. */ +/* @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. */ diff --git a/bin/gpm b/bin/gpm index ba2fad110a..9e58706f69 100755 --- a/bin/gpm +++ b/bin/gpm @@ -2,7 +2,7 @@ [ 'name' => 'Latin', 'nativeName' => 'Latina' ], 'lb' => [ 'name' => 'Luxembourgish', 'nativeName' => 'Lëtzebuergesch' ], 'lg' => [ 'name' => 'Luganda', 'nativeName' => 'Luganda' ], - 'lo' => [ 'name' => 'Lao', 'nativeName' => 'Lao' ], + 'lo' => [ 'name' => 'Lao', 'nativeName' => 'Lao' ], 'lt' => [ 'name' => 'Lithuanian', 'nativeName' => 'Lietuvių' ], 'lv' => [ 'name' => 'Latvian', 'nativeName' => 'Latviešu' ], 'mai' => [ 'name' => 'Maithili', 'nativeName' => 'मैथिली মৈথিলী' ], @@ -103,7 +103,7 @@ class LanguageCodes 'ml' => [ 'name' => 'Malayalam', 'nativeName' => 'മലയാളം' ], 'mn' => [ 'name' => 'Mongolian', 'nativeName' => 'Монгол' ], 'mr' => [ 'name' => 'Marathi', 'nativeName' => 'मराठी' ], - 'my' => [ 'name' => 'Myanmar (Burmese)', 'nativeName' => 'ဗမာी' ], + 'my' => [ 'name' => 'Myanmar (Burmese)', 'nativeName' => 'ဗမာी' ], 'no' => [ 'name' => 'Norwegian', 'nativeName' => 'Norsk' ], 'nb' => [ 'name' => 'Norwegian', 'nativeName' => 'Norsk' ], 'nb-NO' => [ 'name' => 'Norwegian (Bokmål)', 'nativeName' => 'Norsk bokmål' ], diff --git a/system/src/Grav/Common/Markdown/Parsedown.php b/system/src/Grav/Common/Markdown/Parsedown.php index bdc5bdcd23..f0d8a48ff8 100644 --- a/system/src/Grav/Common/Markdown/Parsedown.php +++ b/system/src/Grav/Common/Markdown/Parsedown.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Markdown * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Markdown/ParsedownExtra.php b/system/src/Grav/Common/Markdown/ParsedownExtra.php index b8e760efd3..ef450feaf4 100644 --- a/system/src/Grav/Common/Markdown/ParsedownExtra.php +++ b/system/src/Grav/Common/Markdown/ParsedownExtra.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Markdown * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Markdown/ParsedownGravTrait.php b/system/src/Grav/Common/Markdown/ParsedownGravTrait.php index 95a8f5f234..a593dd749b 100644 --- a/system/src/Grav/Common/Markdown/ParsedownGravTrait.php +++ b/system/src/Grav/Common/Markdown/ParsedownGravTrait.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Markdown * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Media/Interfaces/AudioMediaInterface.php b/system/src/Grav/Common/Media/Interfaces/AudioMediaInterface.php index d9c69d281e..6465d6b9ca 100644 --- a/system/src/Grav/Common/Media/Interfaces/AudioMediaInterface.php +++ b/system/src/Grav/Common/Media/Interfaces/AudioMediaInterface.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Media * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Media/Interfaces/ImageManipulateInterface.php b/system/src/Grav/Common/Media/Interfaces/ImageManipulateInterface.php index 702cfda9be..eb38ea83bc 100644 --- a/system/src/Grav/Common/Media/Interfaces/ImageManipulateInterface.php +++ b/system/src/Grav/Common/Media/Interfaces/ImageManipulateInterface.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Media * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Media/Interfaces/ImageMediaInterface.php b/system/src/Grav/Common/Media/Interfaces/ImageMediaInterface.php index 377258c9ec..cbf8f1de30 100644 --- a/system/src/Grav/Common/Media/Interfaces/ImageMediaInterface.php +++ b/system/src/Grav/Common/Media/Interfaces/ImageMediaInterface.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Media * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Media/Interfaces/MediaCollectionInterface.php b/system/src/Grav/Common/Media/Interfaces/MediaCollectionInterface.php index ad9fe96c3c..62c531c89f 100644 --- a/system/src/Grav/Common/Media/Interfaces/MediaCollectionInterface.php +++ b/system/src/Grav/Common/Media/Interfaces/MediaCollectionInterface.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Media * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Media/Interfaces/MediaFileInterface.php b/system/src/Grav/Common/Media/Interfaces/MediaFileInterface.php index 07a5c26dfe..c20e4de99d 100644 --- a/system/src/Grav/Common/Media/Interfaces/MediaFileInterface.php +++ b/system/src/Grav/Common/Media/Interfaces/MediaFileInterface.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Media * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Media/Interfaces/MediaInterface.php b/system/src/Grav/Common/Media/Interfaces/MediaInterface.php index 436fe16811..273556a6d3 100644 --- a/system/src/Grav/Common/Media/Interfaces/MediaInterface.php +++ b/system/src/Grav/Common/Media/Interfaces/MediaInterface.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Media * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Media/Interfaces/MediaLinkInterface.php b/system/src/Grav/Common/Media/Interfaces/MediaLinkInterface.php index 4f229c2b5f..41747be673 100644 --- a/system/src/Grav/Common/Media/Interfaces/MediaLinkInterface.php +++ b/system/src/Grav/Common/Media/Interfaces/MediaLinkInterface.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Media * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Media/Interfaces/MediaObjectInterface.php b/system/src/Grav/Common/Media/Interfaces/MediaObjectInterface.php index 90c8914813..c46dd38c75 100644 --- a/system/src/Grav/Common/Media/Interfaces/MediaObjectInterface.php +++ b/system/src/Grav/Common/Media/Interfaces/MediaObjectInterface.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Media * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Media/Interfaces/MediaPlayerInterface.php b/system/src/Grav/Common/Media/Interfaces/MediaPlayerInterface.php index 9307915c4e..fbe6f656fa 100644 --- a/system/src/Grav/Common/Media/Interfaces/MediaPlayerInterface.php +++ b/system/src/Grav/Common/Media/Interfaces/MediaPlayerInterface.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Media * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Media/Interfaces/MediaUploadInterface.php b/system/src/Grav/Common/Media/Interfaces/MediaUploadInterface.php index 8bfef845e4..73625999a7 100644 --- a/system/src/Grav/Common/Media/Interfaces/MediaUploadInterface.php +++ b/system/src/Grav/Common/Media/Interfaces/MediaUploadInterface.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Media * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Media/Interfaces/VideoMediaInterface.php b/system/src/Grav/Common/Media/Interfaces/VideoMediaInterface.php index ff0655a62e..6d42feff26 100644 --- a/system/src/Grav/Common/Media/Interfaces/VideoMediaInterface.php +++ b/system/src/Grav/Common/Media/Interfaces/VideoMediaInterface.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Media * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Media/Traits/AudioMediaTrait.php b/system/src/Grav/Common/Media/Traits/AudioMediaTrait.php index 160837decf..a0834721db 100644 --- a/system/src/Grav/Common/Media/Traits/AudioMediaTrait.php +++ b/system/src/Grav/Common/Media/Traits/AudioMediaTrait.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Media * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Media/Traits/ImageLoadingTrait.php b/system/src/Grav/Common/Media/Traits/ImageLoadingTrait.php index c0237638ee..75e23cab8d 100644 --- a/system/src/Grav/Common/Media/Traits/ImageLoadingTrait.php +++ b/system/src/Grav/Common/Media/Traits/ImageLoadingTrait.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Media * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Media/Traits/ImageMediaTrait.php b/system/src/Grav/Common/Media/Traits/ImageMediaTrait.php index f6e22224ec..c1c46dc94a 100644 --- a/system/src/Grav/Common/Media/Traits/ImageMediaTrait.php +++ b/system/src/Grav/Common/Media/Traits/ImageMediaTrait.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Media * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Media/Traits/MediaFileTrait.php b/system/src/Grav/Common/Media/Traits/MediaFileTrait.php index 71981331de..63906fc4a3 100644 --- a/system/src/Grav/Common/Media/Traits/MediaFileTrait.php +++ b/system/src/Grav/Common/Media/Traits/MediaFileTrait.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Media * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Media/Traits/MediaObjectTrait.php b/system/src/Grav/Common/Media/Traits/MediaObjectTrait.php index 705d3c83f0..492b3af85c 100644 --- a/system/src/Grav/Common/Media/Traits/MediaObjectTrait.php +++ b/system/src/Grav/Common/Media/Traits/MediaObjectTrait.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Media * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Media/Traits/MediaPlayerTrait.php b/system/src/Grav/Common/Media/Traits/MediaPlayerTrait.php index 66e9f47d9d..06cb99ad98 100644 --- a/system/src/Grav/Common/Media/Traits/MediaPlayerTrait.php +++ b/system/src/Grav/Common/Media/Traits/MediaPlayerTrait.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Media * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Media/Traits/MediaTrait.php b/system/src/Grav/Common/Media/Traits/MediaTrait.php index 5faba826b7..14bfa90725 100644 --- a/system/src/Grav/Common/Media/Traits/MediaTrait.php +++ b/system/src/Grav/Common/Media/Traits/MediaTrait.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Media * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Media/Traits/MediaUploadTrait.php b/system/src/Grav/Common/Media/Traits/MediaUploadTrait.php index 7a1f55d6ee..98885e06cd 100644 --- a/system/src/Grav/Common/Media/Traits/MediaUploadTrait.php +++ b/system/src/Grav/Common/Media/Traits/MediaUploadTrait.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Media * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Media/Traits/StaticResizeTrait.php b/system/src/Grav/Common/Media/Traits/StaticResizeTrait.php index 49d75be670..d8a4b08315 100644 --- a/system/src/Grav/Common/Media/Traits/StaticResizeTrait.php +++ b/system/src/Grav/Common/Media/Traits/StaticResizeTrait.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Media * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Media/Traits/ThumbnailMediaTrait.php b/system/src/Grav/Common/Media/Traits/ThumbnailMediaTrait.php index eab732004f..100b5321cc 100644 --- a/system/src/Grav/Common/Media/Traits/ThumbnailMediaTrait.php +++ b/system/src/Grav/Common/Media/Traits/ThumbnailMediaTrait.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Media * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Media/Traits/VideoMediaTrait.php b/system/src/Grav/Common/Media/Traits/VideoMediaTrait.php index e03fbbd81f..b16bb53c70 100644 --- a/system/src/Grav/Common/Media/Traits/VideoMediaTrait.php +++ b/system/src/Grav/Common/Media/Traits/VideoMediaTrait.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Media * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Page/Collection.php b/system/src/Grav/Common/Page/Collection.php index a2fee1b7e8..987b8d9317 100644 --- a/system/src/Grav/Common/Page/Collection.php +++ b/system/src/Grav/Common/Page/Collection.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Page * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Page/Header.php b/system/src/Grav/Common/Page/Header.php index 0ab9af4075..c18b58d378 100644 --- a/system/src/Grav/Common/Page/Header.php +++ b/system/src/Grav/Common/Page/Header.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Page * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Page/Interfaces/PageCollectionInterface.php b/system/src/Grav/Common/Page/Interfaces/PageCollectionInterface.php index 88968e5b53..493ab43985 100644 --- a/system/src/Grav/Common/Page/Interfaces/PageCollectionInterface.php +++ b/system/src/Grav/Common/Page/Interfaces/PageCollectionInterface.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Page * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Page/Interfaces/PageContentInterface.php b/system/src/Grav/Common/Page/Interfaces/PageContentInterface.php index 69bf8bf0d8..a80972b6bc 100644 --- a/system/src/Grav/Common/Page/Interfaces/PageContentInterface.php +++ b/system/src/Grav/Common/Page/Interfaces/PageContentInterface.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Page * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Page/Interfaces/PageInterface.php b/system/src/Grav/Common/Page/Interfaces/PageInterface.php index e5ea20c4f5..56fc891b98 100644 --- a/system/src/Grav/Common/Page/Interfaces/PageInterface.php +++ b/system/src/Grav/Common/Page/Interfaces/PageInterface.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Page * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Page/Interfaces/PagesSourceInterface.php b/system/src/Grav/Common/Page/Interfaces/PagesSourceInterface.php index ef5cfba112..ff4ebdae31 100644 --- a/system/src/Grav/Common/Page/Interfaces/PagesSourceInterface.php +++ b/system/src/Grav/Common/Page/Interfaces/PagesSourceInterface.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Page * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Page/Markdown/Excerpts.php b/system/src/Grav/Common/Page/Markdown/Excerpts.php index 9b0b9963c3..f500f4abed 100644 --- a/system/src/Grav/Common/Page/Markdown/Excerpts.php +++ b/system/src/Grav/Common/Page/Markdown/Excerpts.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Page * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Page/Media.php b/system/src/Grav/Common/Page/Media.php index b9936850cb..24bc2a6c34 100644 --- a/system/src/Grav/Common/Page/Media.php +++ b/system/src/Grav/Common/Page/Media.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Page * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Page/Medium/AbstractMedia.php b/system/src/Grav/Common/Page/Medium/AbstractMedia.php index 4ba532749c..9b3650b8dc 100644 --- a/system/src/Grav/Common/Page/Medium/AbstractMedia.php +++ b/system/src/Grav/Common/Page/Medium/AbstractMedia.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Page * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Page/Medium/AudioMedium.php b/system/src/Grav/Common/Page/Medium/AudioMedium.php index f34f0a9c24..cc53f8198f 100644 --- a/system/src/Grav/Common/Page/Medium/AudioMedium.php +++ b/system/src/Grav/Common/Page/Medium/AudioMedium.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Page * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Page/Medium/GlobalMedia.php b/system/src/Grav/Common/Page/Medium/GlobalMedia.php index 50d69c747a..af8ee841e1 100644 --- a/system/src/Grav/Common/Page/Medium/GlobalMedia.php +++ b/system/src/Grav/Common/Page/Medium/GlobalMedia.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Page * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Page/Medium/ImageFile.php b/system/src/Grav/Common/Page/Medium/ImageFile.php index 9879187146..1aae7eeb67 100644 --- a/system/src/Grav/Common/Page/Medium/ImageFile.php +++ b/system/src/Grav/Common/Page/Medium/ImageFile.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Page * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Page/Medium/ImageMedium.php b/system/src/Grav/Common/Page/Medium/ImageMedium.php index 7bb5b46c25..42d8f0e755 100644 --- a/system/src/Grav/Common/Page/Medium/ImageMedium.php +++ b/system/src/Grav/Common/Page/Medium/ImageMedium.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Page * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Page/Medium/Link.php b/system/src/Grav/Common/Page/Medium/Link.php index 03c15e5cbd..c76d8c191d 100644 --- a/system/src/Grav/Common/Page/Medium/Link.php +++ b/system/src/Grav/Common/Page/Medium/Link.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Page * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Page/Medium/Medium.php b/system/src/Grav/Common/Page/Medium/Medium.php index 15263bd8f1..1fe882e985 100644 --- a/system/src/Grav/Common/Page/Medium/Medium.php +++ b/system/src/Grav/Common/Page/Medium/Medium.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Page * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Page/Medium/MediumFactory.php b/system/src/Grav/Common/Page/Medium/MediumFactory.php index 7dee4ea182..cf25f22cf2 100644 --- a/system/src/Grav/Common/Page/Medium/MediumFactory.php +++ b/system/src/Grav/Common/Page/Medium/MediumFactory.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Page * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Page/Medium/ParsedownHtmlTrait.php b/system/src/Grav/Common/Page/Medium/ParsedownHtmlTrait.php index 44ab952921..4ab2fb58f3 100644 --- a/system/src/Grav/Common/Page/Medium/ParsedownHtmlTrait.php +++ b/system/src/Grav/Common/Page/Medium/ParsedownHtmlTrait.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Page * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Page/Medium/RenderableInterface.php b/system/src/Grav/Common/Page/Medium/RenderableInterface.php index ac72447008..1ee6a96602 100644 --- a/system/src/Grav/Common/Page/Medium/RenderableInterface.php +++ b/system/src/Grav/Common/Page/Medium/RenderableInterface.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Page * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Page/Medium/StaticImageMedium.php b/system/src/Grav/Common/Page/Medium/StaticImageMedium.php index ba92fa1cac..5c5bf8c73f 100644 --- a/system/src/Grav/Common/Page/Medium/StaticImageMedium.php +++ b/system/src/Grav/Common/Page/Medium/StaticImageMedium.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Page * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Page/Medium/StaticResizeTrait.php b/system/src/Grav/Common/Page/Medium/StaticResizeTrait.php index d95b2d634f..caaa7e2d6a 100644 --- a/system/src/Grav/Common/Page/Medium/StaticResizeTrait.php +++ b/system/src/Grav/Common/Page/Medium/StaticResizeTrait.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Page * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Page/Medium/ThumbnailImageMedium.php b/system/src/Grav/Common/Page/Medium/ThumbnailImageMedium.php index a56a20d15d..1e4d862f91 100644 --- a/system/src/Grav/Common/Page/Medium/ThumbnailImageMedium.php +++ b/system/src/Grav/Common/Page/Medium/ThumbnailImageMedium.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Page * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Page/Medium/VideoMedium.php b/system/src/Grav/Common/Page/Medium/VideoMedium.php index bfcf550c42..0e629dc89e 100644 --- a/system/src/Grav/Common/Page/Medium/VideoMedium.php +++ b/system/src/Grav/Common/Page/Medium/VideoMedium.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Page * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Page/Page.php b/system/src/Grav/Common/Page/Page.php index 31dfe1ffda..abda49bfec 100644 --- a/system/src/Grav/Common/Page/Page.php +++ b/system/src/Grav/Common/Page/Page.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Page * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Page/Pages.php b/system/src/Grav/Common/Page/Pages.php index 9e5d47db09..c4029fe9f1 100644 --- a/system/src/Grav/Common/Page/Pages.php +++ b/system/src/Grav/Common/Page/Pages.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Page * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Page/Types.php b/system/src/Grav/Common/Page/Types.php index c7183680ec..43fe0fb648 100644 --- a/system/src/Grav/Common/Page/Types.php +++ b/system/src/Grav/Common/Page/Types.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Page * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Plugin.php b/system/src/Grav/Common/Plugin.php index 3510b53ec7..30e5344f6a 100644 --- a/system/src/Grav/Common/Plugin.php +++ b/system/src/Grav/Common/Plugin.php @@ -3,7 +3,7 @@ /** * @package Grav\Common * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Plugins.php b/system/src/Grav/Common/Plugins.php index 88b5e524e5..42b1593c2d 100644 --- a/system/src/Grav/Common/Plugins.php +++ b/system/src/Grav/Common/Plugins.php @@ -3,7 +3,7 @@ /** * @package Grav\Common * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Processors/AssetsProcessor.php b/system/src/Grav/Common/Processors/AssetsProcessor.php index 66bb5e3ff1..e460fb0023 100644 --- a/system/src/Grav/Common/Processors/AssetsProcessor.php +++ b/system/src/Grav/Common/Processors/AssetsProcessor.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Processors * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Processors/BackupsProcessor.php b/system/src/Grav/Common/Processors/BackupsProcessor.php index 6e960b4930..83e8a0c212 100644 --- a/system/src/Grav/Common/Processors/BackupsProcessor.php +++ b/system/src/Grav/Common/Processors/BackupsProcessor.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Processors * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Processors/DebuggerAssetsProcessor.php b/system/src/Grav/Common/Processors/DebuggerAssetsProcessor.php index de7cafcfca..a3d5a51521 100644 --- a/system/src/Grav/Common/Processors/DebuggerAssetsProcessor.php +++ b/system/src/Grav/Common/Processors/DebuggerAssetsProcessor.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Processors * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Processors/Events/RequestHandlerEvent.php b/system/src/Grav/Common/Processors/Events/RequestHandlerEvent.php index 32908bad7c..30f6195b6f 100644 --- a/system/src/Grav/Common/Processors/Events/RequestHandlerEvent.php +++ b/system/src/Grav/Common/Processors/Events/RequestHandlerEvent.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Processors * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Processors/InitializeProcessor.php b/system/src/Grav/Common/Processors/InitializeProcessor.php index b31530e803..04e06edf32 100644 --- a/system/src/Grav/Common/Processors/InitializeProcessor.php +++ b/system/src/Grav/Common/Processors/InitializeProcessor.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Processors * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Processors/PagesProcessor.php b/system/src/Grav/Common/Processors/PagesProcessor.php index 36f6718d22..3338e0c632 100644 --- a/system/src/Grav/Common/Processors/PagesProcessor.php +++ b/system/src/Grav/Common/Processors/PagesProcessor.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Processors * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Processors/PluginsProcessor.php b/system/src/Grav/Common/Processors/PluginsProcessor.php index 485578e492..ae8790104c 100644 --- a/system/src/Grav/Common/Processors/PluginsProcessor.php +++ b/system/src/Grav/Common/Processors/PluginsProcessor.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Processors * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Processors/ProcessorBase.php b/system/src/Grav/Common/Processors/ProcessorBase.php index a3506f5990..9353391448 100644 --- a/system/src/Grav/Common/Processors/ProcessorBase.php +++ b/system/src/Grav/Common/Processors/ProcessorBase.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Processors * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Processors/ProcessorInterface.php b/system/src/Grav/Common/Processors/ProcessorInterface.php index 8a6edbe188..0aed195044 100644 --- a/system/src/Grav/Common/Processors/ProcessorInterface.php +++ b/system/src/Grav/Common/Processors/ProcessorInterface.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Processors * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Processors/RenderProcessor.php b/system/src/Grav/Common/Processors/RenderProcessor.php index 329da22a33..e12cc45a37 100644 --- a/system/src/Grav/Common/Processors/RenderProcessor.php +++ b/system/src/Grav/Common/Processors/RenderProcessor.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Processors * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Processors/RequestProcessor.php b/system/src/Grav/Common/Processors/RequestProcessor.php index 971fb67479..358e81b42c 100644 --- a/system/src/Grav/Common/Processors/RequestProcessor.php +++ b/system/src/Grav/Common/Processors/RequestProcessor.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Processors * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Processors/SchedulerProcessor.php b/system/src/Grav/Common/Processors/SchedulerProcessor.php index 69cc163859..722bfcc92e 100644 --- a/system/src/Grav/Common/Processors/SchedulerProcessor.php +++ b/system/src/Grav/Common/Processors/SchedulerProcessor.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Processors * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Processors/TasksProcessor.php b/system/src/Grav/Common/Processors/TasksProcessor.php index 07e0934afc..29f3458eec 100644 --- a/system/src/Grav/Common/Processors/TasksProcessor.php +++ b/system/src/Grav/Common/Processors/TasksProcessor.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Processors * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Processors/ThemesProcessor.php b/system/src/Grav/Common/Processors/ThemesProcessor.php index 951dc79e54..60d089e8be 100644 --- a/system/src/Grav/Common/Processors/ThemesProcessor.php +++ b/system/src/Grav/Common/Processors/ThemesProcessor.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Processors * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Processors/TwigProcessor.php b/system/src/Grav/Common/Processors/TwigProcessor.php index 6604b5c052..ffc1032eac 100644 --- a/system/src/Grav/Common/Processors/TwigProcessor.php +++ b/system/src/Grav/Common/Processors/TwigProcessor.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Processors * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Scheduler/Cron.php b/system/src/Grav/Common/Scheduler/Cron.php index 5127a997f6..0103839d35 100644 --- a/system/src/Grav/Common/Scheduler/Cron.php +++ b/system/src/Grav/Common/Scheduler/Cron.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Scheduler * @author Originally based on jqCron by Arnaud Buathier modified for Grav integration - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Scheduler/IntervalTrait.php b/system/src/Grav/Common/Scheduler/IntervalTrait.php index cc5c1654ca..5f7406b8e6 100644 --- a/system/src/Grav/Common/Scheduler/IntervalTrait.php +++ b/system/src/Grav/Common/Scheduler/IntervalTrait.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Scheduler * @author Originally based on peppeocchi/php-cron-scheduler modified for Grav integration - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Scheduler/Job.php b/system/src/Grav/Common/Scheduler/Job.php index 13059a572e..41561192ec 100644 --- a/system/src/Grav/Common/Scheduler/Job.php +++ b/system/src/Grav/Common/Scheduler/Job.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Scheduler * @author Originally based on peppeocchi/php-cron-scheduler modified for Grav integration - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Scheduler/Scheduler.php b/system/src/Grav/Common/Scheduler/Scheduler.php index 73a071225f..19eb9eac38 100644 --- a/system/src/Grav/Common/Scheduler/Scheduler.php +++ b/system/src/Grav/Common/Scheduler/Scheduler.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Scheduler * @author Originally based on peppeocchi/php-cron-scheduler modified for Grav integration - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Security.php b/system/src/Grav/Common/Security.php index fe259d8ba9..a3ca3bb626 100644 --- a/system/src/Grav/Common/Security.php +++ b/system/src/Grav/Common/Security.php @@ -3,7 +3,7 @@ /** * @package Grav\Common * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Service/AccountsServiceProvider.php b/system/src/Grav/Common/Service/AccountsServiceProvider.php index 8b158c93ce..60f26e5b02 100644 --- a/system/src/Grav/Common/Service/AccountsServiceProvider.php +++ b/system/src/Grav/Common/Service/AccountsServiceProvider.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Service * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Service/AssetsServiceProvider.php b/system/src/Grav/Common/Service/AssetsServiceProvider.php index 1e4e647ca4..54a44a1c83 100644 --- a/system/src/Grav/Common/Service/AssetsServiceProvider.php +++ b/system/src/Grav/Common/Service/AssetsServiceProvider.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Service * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Service/BackupsServiceProvider.php b/system/src/Grav/Common/Service/BackupsServiceProvider.php index 00fa9631ab..58f5021a3a 100644 --- a/system/src/Grav/Common/Service/BackupsServiceProvider.php +++ b/system/src/Grav/Common/Service/BackupsServiceProvider.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Service * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Service/ConfigServiceProvider.php b/system/src/Grav/Common/Service/ConfigServiceProvider.php index 3a5c2e27b3..e65e228509 100644 --- a/system/src/Grav/Common/Service/ConfigServiceProvider.php +++ b/system/src/Grav/Common/Service/ConfigServiceProvider.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Service * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Service/ErrorServiceProvider.php b/system/src/Grav/Common/Service/ErrorServiceProvider.php index 322736584f..02d38c9306 100644 --- a/system/src/Grav/Common/Service/ErrorServiceProvider.php +++ b/system/src/Grav/Common/Service/ErrorServiceProvider.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Service * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Service/FilesystemServiceProvider.php b/system/src/Grav/Common/Service/FilesystemServiceProvider.php index 62dad5d81d..1dde5b3e5f 100644 --- a/system/src/Grav/Common/Service/FilesystemServiceProvider.php +++ b/system/src/Grav/Common/Service/FilesystemServiceProvider.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Service * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Service/FlexServiceProvider.php b/system/src/Grav/Common/Service/FlexServiceProvider.php index 9c8cd49b1b..e7b283ab06 100644 --- a/system/src/Grav/Common/Service/FlexServiceProvider.php +++ b/system/src/Grav/Common/Service/FlexServiceProvider.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Service * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Service/InflectorServiceProvider.php b/system/src/Grav/Common/Service/InflectorServiceProvider.php index 861a69e043..f43a4461d1 100644 --- a/system/src/Grav/Common/Service/InflectorServiceProvider.php +++ b/system/src/Grav/Common/Service/InflectorServiceProvider.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Service * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Service/LoggerServiceProvider.php b/system/src/Grav/Common/Service/LoggerServiceProvider.php index 5043cfbd07..43a67cadfb 100644 --- a/system/src/Grav/Common/Service/LoggerServiceProvider.php +++ b/system/src/Grav/Common/Service/LoggerServiceProvider.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Service * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Service/OutputServiceProvider.php b/system/src/Grav/Common/Service/OutputServiceProvider.php index 9a49185a8f..2dbd3436f1 100644 --- a/system/src/Grav/Common/Service/OutputServiceProvider.php +++ b/system/src/Grav/Common/Service/OutputServiceProvider.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Service * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Service/PagesServiceProvider.php b/system/src/Grav/Common/Service/PagesServiceProvider.php index 55f6a450dd..bec635ac83 100644 --- a/system/src/Grav/Common/Service/PagesServiceProvider.php +++ b/system/src/Grav/Common/Service/PagesServiceProvider.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Service * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Service/RequestServiceProvider.php b/system/src/Grav/Common/Service/RequestServiceProvider.php index 17b3149e5d..a44c735640 100644 --- a/system/src/Grav/Common/Service/RequestServiceProvider.php +++ b/system/src/Grav/Common/Service/RequestServiceProvider.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Service * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Service/SchedulerServiceProvider.php b/system/src/Grav/Common/Service/SchedulerServiceProvider.php index a952725448..13918fbc2e 100644 --- a/system/src/Grav/Common/Service/SchedulerServiceProvider.php +++ b/system/src/Grav/Common/Service/SchedulerServiceProvider.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Service * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Service/SessionServiceProvider.php b/system/src/Grav/Common/Service/SessionServiceProvider.php index 502007c7d4..80e24b4c78 100644 --- a/system/src/Grav/Common/Service/SessionServiceProvider.php +++ b/system/src/Grav/Common/Service/SessionServiceProvider.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Service * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Service/StreamsServiceProvider.php b/system/src/Grav/Common/Service/StreamsServiceProvider.php index edde09ad59..f501b49038 100644 --- a/system/src/Grav/Common/Service/StreamsServiceProvider.php +++ b/system/src/Grav/Common/Service/StreamsServiceProvider.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Service * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Service/TaskServiceProvider.php b/system/src/Grav/Common/Service/TaskServiceProvider.php index 49ce147e9b..2989e9d275 100644 --- a/system/src/Grav/Common/Service/TaskServiceProvider.php +++ b/system/src/Grav/Common/Service/TaskServiceProvider.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Service * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Session.php b/system/src/Grav/Common/Session.php index 322162705e..513143e097 100644 --- a/system/src/Grav/Common/Session.php +++ b/system/src/Grav/Common/Session.php @@ -3,7 +3,7 @@ /** * @package Grav\Common * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Taxonomy.php b/system/src/Grav/Common/Taxonomy.php index 0d0a450b0e..5079a2572b 100644 --- a/system/src/Grav/Common/Taxonomy.php +++ b/system/src/Grav/Common/Taxonomy.php @@ -3,7 +3,7 @@ /** * @package Grav\Common * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Theme.php b/system/src/Grav/Common/Theme.php index a5006a215a..60131292a9 100644 --- a/system/src/Grav/Common/Theme.php +++ b/system/src/Grav/Common/Theme.php @@ -3,7 +3,7 @@ /** * @package Grav\Common * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Themes.php b/system/src/Grav/Common/Themes.php index 6126841cf3..3567ccadd6 100644 --- a/system/src/Grav/Common/Themes.php +++ b/system/src/Grav/Common/Themes.php @@ -3,7 +3,7 @@ /** * @package Grav\Common * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Twig/Exception/TwigException.php b/system/src/Grav/Common/Twig/Exception/TwigException.php index bc023afd72..7605de4c47 100644 --- a/system/src/Grav/Common/Twig/Exception/TwigException.php +++ b/system/src/Grav/Common/Twig/Exception/TwigException.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Twig\Exception * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Twig/Extension/FilesystemExtension.php b/system/src/Grav/Common/Twig/Extension/FilesystemExtension.php index dfd5fdd90d..f60fa12c22 100644 --- a/system/src/Grav/Common/Twig/Extension/FilesystemExtension.php +++ b/system/src/Grav/Common/Twig/Extension/FilesystemExtension.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Twig * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Twig/Extension/GravExtension.php b/system/src/Grav/Common/Twig/Extension/GravExtension.php index 4c0d9fe469..b6f30906b2 100644 --- a/system/src/Grav/Common/Twig/Extension/GravExtension.php +++ b/system/src/Grav/Common/Twig/Extension/GravExtension.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Twig * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Twig/Node/TwigNodeCache.php b/system/src/Grav/Common/Twig/Node/TwigNodeCache.php index 0ed1fff0c0..e05e372485 100644 --- a/system/src/Grav/Common/Twig/Node/TwigNodeCache.php +++ b/system/src/Grav/Common/Twig/Node/TwigNodeCache.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Twig * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Twig/Node/TwigNodeMarkdown.php b/system/src/Grav/Common/Twig/Node/TwigNodeMarkdown.php index 81cecaeaf3..4637db7748 100644 --- a/system/src/Grav/Common/Twig/Node/TwigNodeMarkdown.php +++ b/system/src/Grav/Common/Twig/Node/TwigNodeMarkdown.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Twig * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Twig/Node/TwigNodeRender.php b/system/src/Grav/Common/Twig/Node/TwigNodeRender.php index 798c6baa6b..1aeb616b18 100644 --- a/system/src/Grav/Common/Twig/Node/TwigNodeRender.php +++ b/system/src/Grav/Common/Twig/Node/TwigNodeRender.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Twig * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Twig/Node/TwigNodeScript.php b/system/src/Grav/Common/Twig/Node/TwigNodeScript.php index 46a08703bb..d7b4ae79fe 100644 --- a/system/src/Grav/Common/Twig/Node/TwigNodeScript.php +++ b/system/src/Grav/Common/Twig/Node/TwigNodeScript.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Twig * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Twig/Node/TwigNodeStyle.php b/system/src/Grav/Common/Twig/Node/TwigNodeStyle.php index 05355f904f..8710bf531f 100644 --- a/system/src/Grav/Common/Twig/Node/TwigNodeStyle.php +++ b/system/src/Grav/Common/Twig/Node/TwigNodeStyle.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Twig * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Twig/Node/TwigNodeSwitch.php b/system/src/Grav/Common/Twig/Node/TwigNodeSwitch.php index 43ae56f187..7bd368e6df 100644 --- a/system/src/Grav/Common/Twig/Node/TwigNodeSwitch.php +++ b/system/src/Grav/Common/Twig/Node/TwigNodeSwitch.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Twig * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Twig/Node/TwigNodeThrow.php b/system/src/Grav/Common/Twig/Node/TwigNodeThrow.php index 3bfe6124e1..41ca15dc20 100644 --- a/system/src/Grav/Common/Twig/Node/TwigNodeThrow.php +++ b/system/src/Grav/Common/Twig/Node/TwigNodeThrow.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Twig * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Twig/Node/TwigNodeTryCatch.php b/system/src/Grav/Common/Twig/Node/TwigNodeTryCatch.php index 40e9240f38..1213b7c643 100644 --- a/system/src/Grav/Common/Twig/Node/TwigNodeTryCatch.php +++ b/system/src/Grav/Common/Twig/Node/TwigNodeTryCatch.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Twig * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Twig/TokenParser/TwigTokenParserCache.php b/system/src/Grav/Common/Twig/TokenParser/TwigTokenParserCache.php index 371e89ae69..1cf21918b1 100644 --- a/system/src/Grav/Common/Twig/TokenParser/TwigTokenParserCache.php +++ b/system/src/Grav/Common/Twig/TokenParser/TwigTokenParserCache.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Twig * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Twig/TokenParser/TwigTokenParserMarkdown.php b/system/src/Grav/Common/Twig/TokenParser/TwigTokenParserMarkdown.php index 9dab4ae5c1..49e34e693c 100644 --- a/system/src/Grav/Common/Twig/TokenParser/TwigTokenParserMarkdown.php +++ b/system/src/Grav/Common/Twig/TokenParser/TwigTokenParserMarkdown.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Twig * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Twig/TokenParser/TwigTokenParserRender.php b/system/src/Grav/Common/Twig/TokenParser/TwigTokenParserRender.php index ab2bdde0f6..de16266b05 100644 --- a/system/src/Grav/Common/Twig/TokenParser/TwigTokenParserRender.php +++ b/system/src/Grav/Common/Twig/TokenParser/TwigTokenParserRender.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Twig * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Twig/TokenParser/TwigTokenParserScript.php b/system/src/Grav/Common/Twig/TokenParser/TwigTokenParserScript.php index b860631651..e98365b94b 100644 --- a/system/src/Grav/Common/Twig/TokenParser/TwigTokenParserScript.php +++ b/system/src/Grav/Common/Twig/TokenParser/TwigTokenParserScript.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Twig * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Twig/TokenParser/TwigTokenParserStyle.php b/system/src/Grav/Common/Twig/TokenParser/TwigTokenParserStyle.php index c8d9544cec..0687395adc 100644 --- a/system/src/Grav/Common/Twig/TokenParser/TwigTokenParserStyle.php +++ b/system/src/Grav/Common/Twig/TokenParser/TwigTokenParserStyle.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Twig * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Twig/TokenParser/TwigTokenParserSwitch.php b/system/src/Grav/Common/Twig/TokenParser/TwigTokenParserSwitch.php index 4540bbf7e2..c63fe95651 100644 --- a/system/src/Grav/Common/Twig/TokenParser/TwigTokenParserSwitch.php +++ b/system/src/Grav/Common/Twig/TokenParser/TwigTokenParserSwitch.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Twig * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. * @origin https://gist.github.com/maxgalbu/9409182 */ diff --git a/system/src/Grav/Common/Twig/TokenParser/TwigTokenParserThrow.php b/system/src/Grav/Common/Twig/TokenParser/TwigTokenParserThrow.php index bd4adab97f..41f415d2a4 100644 --- a/system/src/Grav/Common/Twig/TokenParser/TwigTokenParserThrow.php +++ b/system/src/Grav/Common/Twig/TokenParser/TwigTokenParserThrow.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Twig * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Twig/TokenParser/TwigTokenParserTryCatch.php b/system/src/Grav/Common/Twig/TokenParser/TwigTokenParserTryCatch.php index 46af1767a1..9930632836 100644 --- a/system/src/Grav/Common/Twig/TokenParser/TwigTokenParserTryCatch.php +++ b/system/src/Grav/Common/Twig/TokenParser/TwigTokenParserTryCatch.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Twig * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Twig/Twig.php b/system/src/Grav/Common/Twig/Twig.php index 1416dac853..39ae3c6f6c 100644 --- a/system/src/Grav/Common/Twig/Twig.php +++ b/system/src/Grav/Common/Twig/Twig.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Twig * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Twig/TwigClockworkDataSource.php b/system/src/Grav/Common/Twig/TwigClockworkDataSource.php index 11127b87c7..407a05ef4d 100644 --- a/system/src/Grav/Common/Twig/TwigClockworkDataSource.php +++ b/system/src/Grav/Common/Twig/TwigClockworkDataSource.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Twig * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Twig/TwigClockworkDumper.php b/system/src/Grav/Common/Twig/TwigClockworkDumper.php index 2c1f4be021..c960cf2cdd 100644 --- a/system/src/Grav/Common/Twig/TwigClockworkDumper.php +++ b/system/src/Grav/Common/Twig/TwigClockworkDumper.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Twig * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Twig/TwigEnvironment.php b/system/src/Grav/Common/Twig/TwigEnvironment.php index f7e7c15bdb..6b2a86befa 100644 --- a/system/src/Grav/Common/Twig/TwigEnvironment.php +++ b/system/src/Grav/Common/Twig/TwigEnvironment.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Twig * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Twig/TwigExtension.php b/system/src/Grav/Common/Twig/TwigExtension.php index 698858b56e..07c442e8e9 100644 --- a/system/src/Grav/Common/Twig/TwigExtension.php +++ b/system/src/Grav/Common/Twig/TwigExtension.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Twig * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Twig/WriteCacheFileTrait.php b/system/src/Grav/Common/Twig/WriteCacheFileTrait.php index edab8e5b8a..575a281630 100644 --- a/system/src/Grav/Common/Twig/WriteCacheFileTrait.php +++ b/system/src/Grav/Common/Twig/WriteCacheFileTrait.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Twig * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Uri.php b/system/src/Grav/Common/Uri.php index 7491068c09..cd339d3d60 100644 --- a/system/src/Grav/Common/Uri.php +++ b/system/src/Grav/Common/Uri.php @@ -3,7 +3,7 @@ /** * @package Grav\Common * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/User/Access.php b/system/src/Grav/Common/User/Access.php index 6503c891f3..96f4d96d6f 100644 --- a/system/src/Grav/Common/User/Access.php +++ b/system/src/Grav/Common/User/Access.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\User * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/User/Authentication.php b/system/src/Grav/Common/User/Authentication.php index 6ff95e7bfc..c32fd62e67 100644 --- a/system/src/Grav/Common/User/Authentication.php +++ b/system/src/Grav/Common/User/Authentication.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\User * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/User/DataUser/User.php b/system/src/Grav/Common/User/DataUser/User.php index 0b8a53b9e3..b442cc3e55 100644 --- a/system/src/Grav/Common/User/DataUser/User.php +++ b/system/src/Grav/Common/User/DataUser/User.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\User * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/User/DataUser/UserCollection.php b/system/src/Grav/Common/User/DataUser/UserCollection.php index 3da7e2dde1..9f35e37e69 100644 --- a/system/src/Grav/Common/User/DataUser/UserCollection.php +++ b/system/src/Grav/Common/User/DataUser/UserCollection.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\User * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/User/Group.php b/system/src/Grav/Common/User/Group.php index 7dd6d650cb..9be619a1ca 100644 --- a/system/src/Grav/Common/User/Group.php +++ b/system/src/Grav/Common/User/Group.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\User * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/User/Interfaces/AuthorizeInterface.php b/system/src/Grav/Common/User/Interfaces/AuthorizeInterface.php index 3ad8d2cc51..1aeb004e6e 100644 --- a/system/src/Grav/Common/User/Interfaces/AuthorizeInterface.php +++ b/system/src/Grav/Common/User/Interfaces/AuthorizeInterface.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\User * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/User/Interfaces/UserCollectionInterface.php b/system/src/Grav/Common/User/Interfaces/UserCollectionInterface.php index d892e820f0..5bcfbc0f2b 100644 --- a/system/src/Grav/Common/User/Interfaces/UserCollectionInterface.php +++ b/system/src/Grav/Common/User/Interfaces/UserCollectionInterface.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\User * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/User/Interfaces/UserGroupInterface.php b/system/src/Grav/Common/User/Interfaces/UserGroupInterface.php index c345c4b381..c18388ce9c 100644 --- a/system/src/Grav/Common/User/Interfaces/UserGroupInterface.php +++ b/system/src/Grav/Common/User/Interfaces/UserGroupInterface.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\User * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/User/Interfaces/UserInterface.php b/system/src/Grav/Common/User/Interfaces/UserInterface.php index 02827e37c2..dcd014c88a 100644 --- a/system/src/Grav/Common/User/Interfaces/UserInterface.php +++ b/system/src/Grav/Common/User/Interfaces/UserInterface.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\User * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/User/Traits/UserTrait.php b/system/src/Grav/Common/User/Traits/UserTrait.php index 5a6b749384..0608caf5ec 100644 --- a/system/src/Grav/Common/User/Traits/UserTrait.php +++ b/system/src/Grav/Common/User/Traits/UserTrait.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\User * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/User/User.php b/system/src/Grav/Common/User/User.php index 4b2319fc5e..b38c72e261 100644 --- a/system/src/Grav/Common/User/User.php +++ b/system/src/Grav/Common/User/User.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\User * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Utils.php b/system/src/Grav/Common/Utils.php index 5295a64007..72cd1ceaea 100644 --- a/system/src/Grav/Common/Utils.php +++ b/system/src/Grav/Common/Utils.php @@ -3,7 +3,7 @@ /** * @package Grav\Common * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Common/Yaml.php b/system/src/Grav/Common/Yaml.php index 330b6c383e..0758599dc0 100644 --- a/system/src/Grav/Common/Yaml.php +++ b/system/src/Grav/Common/Yaml.php @@ -3,7 +3,7 @@ /** * @package Grav\Common * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Console/Application/Application.php b/system/src/Grav/Console/Application/Application.php index 21cea87301..29c18f3f11 100644 --- a/system/src/Grav/Console/Application/Application.php +++ b/system/src/Grav/Console/Application/Application.php @@ -3,7 +3,7 @@ /** * @package Grav\Console * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Console/Application/CommandLoader/PluginCommandLoader.php b/system/src/Grav/Console/Application/CommandLoader/PluginCommandLoader.php index 9b7b568d9f..adf6447307 100644 --- a/system/src/Grav/Console/Application/CommandLoader/PluginCommandLoader.php +++ b/system/src/Grav/Console/Application/CommandLoader/PluginCommandLoader.php @@ -3,7 +3,7 @@ /** * @package Grav\Console * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Console/Application/GpmApplication.php b/system/src/Grav/Console/Application/GpmApplication.php index df383f2d2b..f9e6b616e6 100644 --- a/system/src/Grav/Console/Application/GpmApplication.php +++ b/system/src/Grav/Console/Application/GpmApplication.php @@ -3,7 +3,7 @@ /** * @package Grav\Console * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Console/Application/GravApplication.php b/system/src/Grav/Console/Application/GravApplication.php index 739ca396bc..f06dae650d 100644 --- a/system/src/Grav/Console/Application/GravApplication.php +++ b/system/src/Grav/Console/Application/GravApplication.php @@ -3,7 +3,7 @@ /** * @package Grav\Console * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Console/Application/PluginApplication.php b/system/src/Grav/Console/Application/PluginApplication.php index 75e9eb7045..e365b1e082 100644 --- a/system/src/Grav/Console/Application/PluginApplication.php +++ b/system/src/Grav/Console/Application/PluginApplication.php @@ -3,7 +3,7 @@ /** * @package Grav\Console * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Console/Cli/BackupCommand.php b/system/src/Grav/Console/Cli/BackupCommand.php index a8a025d2ab..1fe84ea01d 100644 --- a/system/src/Grav/Console/Cli/BackupCommand.php +++ b/system/src/Grav/Console/Cli/BackupCommand.php @@ -3,7 +3,7 @@ /** * @package Grav\Console\Cli * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Console/Cli/CleanCommand.php b/system/src/Grav/Console/Cli/CleanCommand.php index 84b46d6cc0..e6b8f9875e 100644 --- a/system/src/Grav/Console/Cli/CleanCommand.php +++ b/system/src/Grav/Console/Cli/CleanCommand.php @@ -3,7 +3,7 @@ /** * @package Grav\Console\Cli * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Console/Cli/ClearCacheCommand.php b/system/src/Grav/Console/Cli/ClearCacheCommand.php index daed2a533e..7550dd938c 100644 --- a/system/src/Grav/Console/Cli/ClearCacheCommand.php +++ b/system/src/Grav/Console/Cli/ClearCacheCommand.php @@ -3,7 +3,7 @@ /** * @package Grav\Console\Cli * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Console/Cli/ComposerCommand.php b/system/src/Grav/Console/Cli/ComposerCommand.php index 5075d1d0fb..0dc9bcd156 100644 --- a/system/src/Grav/Console/Cli/ComposerCommand.php +++ b/system/src/Grav/Console/Cli/ComposerCommand.php @@ -3,7 +3,7 @@ /** * @package Grav\Console\Cli * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Console/Cli/InstallCommand.php b/system/src/Grav/Console/Cli/InstallCommand.php index 22258beb34..33198cb5f8 100644 --- a/system/src/Grav/Console/Cli/InstallCommand.php +++ b/system/src/Grav/Console/Cli/InstallCommand.php @@ -3,7 +3,7 @@ /** * @package Grav\Console\Cli * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Console/Cli/LogViewerCommand.php b/system/src/Grav/Console/Cli/LogViewerCommand.php index d3924f88ca..d7e127e5fa 100644 --- a/system/src/Grav/Console/Cli/LogViewerCommand.php +++ b/system/src/Grav/Console/Cli/LogViewerCommand.php @@ -3,7 +3,7 @@ /** * @package Grav\Console\Cli * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Console/Cli/NewProjectCommand.php b/system/src/Grav/Console/Cli/NewProjectCommand.php index d67cb1c8db..7abbc4ed33 100644 --- a/system/src/Grav/Console/Cli/NewProjectCommand.php +++ b/system/src/Grav/Console/Cli/NewProjectCommand.php @@ -3,7 +3,7 @@ /** * @package Grav\Console\Cli * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Console/Cli/PageSystemValidatorCommand.php b/system/src/Grav/Console/Cli/PageSystemValidatorCommand.php index 4d234d75d8..3a6960077d 100644 --- a/system/src/Grav/Console/Cli/PageSystemValidatorCommand.php +++ b/system/src/Grav/Console/Cli/PageSystemValidatorCommand.php @@ -3,7 +3,7 @@ /** * @package Grav\Console\Cli * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Console/Cli/SandboxCommand.php b/system/src/Grav/Console/Cli/SandboxCommand.php index 995812c1f5..2ba562542c 100644 --- a/system/src/Grav/Console/Cli/SandboxCommand.php +++ b/system/src/Grav/Console/Cli/SandboxCommand.php @@ -3,7 +3,7 @@ /** * @package Grav\Console\Cli * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Console/Cli/SchedulerCommand.php b/system/src/Grav/Console/Cli/SchedulerCommand.php index c5385aad22..8b8470a4c6 100644 --- a/system/src/Grav/Console/Cli/SchedulerCommand.php +++ b/system/src/Grav/Console/Cli/SchedulerCommand.php @@ -3,7 +3,7 @@ /** * @package Grav\Console\Cli * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Console/Cli/SecurityCommand.php b/system/src/Grav/Console/Cli/SecurityCommand.php index 7f728b69ff..b6cb662e0b 100644 --- a/system/src/Grav/Console/Cli/SecurityCommand.php +++ b/system/src/Grav/Console/Cli/SecurityCommand.php @@ -3,7 +3,7 @@ /** * @package Grav\Console\Cli * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Console/Cli/ServerCommand.php b/system/src/Grav/Console/Cli/ServerCommand.php index 77bce8b1d6..29b423ecd7 100644 --- a/system/src/Grav/Console/Cli/ServerCommand.php +++ b/system/src/Grav/Console/Cli/ServerCommand.php @@ -3,7 +3,7 @@ /** * @package Grav\Console\Cli * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Console/Cli/YamlLinterCommand.php b/system/src/Grav/Console/Cli/YamlLinterCommand.php index a9628cdd1f..75a75594f5 100644 --- a/system/src/Grav/Console/Cli/YamlLinterCommand.php +++ b/system/src/Grav/Console/Cli/YamlLinterCommand.php @@ -3,7 +3,7 @@ /** * @package Grav\Console\Cli * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Console/ConsoleCommand.php b/system/src/Grav/Console/ConsoleCommand.php index 044f1b0ff3..c522c88b32 100644 --- a/system/src/Grav/Console/ConsoleCommand.php +++ b/system/src/Grav/Console/ConsoleCommand.php @@ -3,7 +3,7 @@ /** * @package Grav\Console * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Console/ConsoleTrait.php b/system/src/Grav/Console/ConsoleTrait.php index feb10d32e7..0af4075abe 100644 --- a/system/src/Grav/Console/ConsoleTrait.php +++ b/system/src/Grav/Console/ConsoleTrait.php @@ -3,7 +3,7 @@ /** * @package Grav\Console * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Console/Gpm/DirectInstallCommand.php b/system/src/Grav/Console/Gpm/DirectInstallCommand.php index e5c662bccd..fbb02207cc 100644 --- a/system/src/Grav/Console/Gpm/DirectInstallCommand.php +++ b/system/src/Grav/Console/Gpm/DirectInstallCommand.php @@ -3,7 +3,7 @@ /** * @package Grav\Console\Gpm * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Console/Gpm/IndexCommand.php b/system/src/Grav/Console/Gpm/IndexCommand.php index ecc91feb03..367322bb92 100644 --- a/system/src/Grav/Console/Gpm/IndexCommand.php +++ b/system/src/Grav/Console/Gpm/IndexCommand.php @@ -3,7 +3,7 @@ /** * @package Grav\Console\Gpm * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Console/Gpm/InfoCommand.php b/system/src/Grav/Console/Gpm/InfoCommand.php index 5dddd32b5d..c6f855208c 100644 --- a/system/src/Grav/Console/Gpm/InfoCommand.php +++ b/system/src/Grav/Console/Gpm/InfoCommand.php @@ -3,7 +3,7 @@ /** * @package Grav\Console\Gpm * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Console/Gpm/InstallCommand.php b/system/src/Grav/Console/Gpm/InstallCommand.php index 92c8e07d76..1df7803f6b 100644 --- a/system/src/Grav/Console/Gpm/InstallCommand.php +++ b/system/src/Grav/Console/Gpm/InstallCommand.php @@ -3,7 +3,7 @@ /** * @package Grav\Console\Gpm * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Console/Gpm/SelfupgradeCommand.php b/system/src/Grav/Console/Gpm/SelfupgradeCommand.php index b840016989..a3d53ffee1 100644 --- a/system/src/Grav/Console/Gpm/SelfupgradeCommand.php +++ b/system/src/Grav/Console/Gpm/SelfupgradeCommand.php @@ -3,7 +3,7 @@ /** * @package Grav\Console\Gpm * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Console/Gpm/UninstallCommand.php b/system/src/Grav/Console/Gpm/UninstallCommand.php index cb14c65524..a3db657097 100644 --- a/system/src/Grav/Console/Gpm/UninstallCommand.php +++ b/system/src/Grav/Console/Gpm/UninstallCommand.php @@ -3,7 +3,7 @@ /** * @package Grav\Console\Gpm * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Console/Gpm/UpdateCommand.php b/system/src/Grav/Console/Gpm/UpdateCommand.php index 300fe61d85..73c5c9e42b 100644 --- a/system/src/Grav/Console/Gpm/UpdateCommand.php +++ b/system/src/Grav/Console/Gpm/UpdateCommand.php @@ -3,7 +3,7 @@ /** * @package Grav\Console\Gpm * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Console/Gpm/VersionCommand.php b/system/src/Grav/Console/Gpm/VersionCommand.php index 124aad3c06..862919648e 100644 --- a/system/src/Grav/Console/Gpm/VersionCommand.php +++ b/system/src/Grav/Console/Gpm/VersionCommand.php @@ -3,7 +3,7 @@ /** * @package Grav\Console\Gpm * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Console/GpmCommand.php b/system/src/Grav/Console/GpmCommand.php index 816e872234..a14eb4717a 100644 --- a/system/src/Grav/Console/GpmCommand.php +++ b/system/src/Grav/Console/GpmCommand.php @@ -3,7 +3,7 @@ /** * @package Grav\Console * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Console/GravCommand.php b/system/src/Grav/Console/GravCommand.php index 0249f1427a..7db18e219e 100644 --- a/system/src/Grav/Console/GravCommand.php +++ b/system/src/Grav/Console/GravCommand.php @@ -3,7 +3,7 @@ /** * @package Grav\Console * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Console/Plugin/PluginListCommand.php b/system/src/Grav/Console/Plugin/PluginListCommand.php index 81041c0e5a..022661452c 100644 --- a/system/src/Grav/Console/Plugin/PluginListCommand.php +++ b/system/src/Grav/Console/Plugin/PluginListCommand.php @@ -3,7 +3,7 @@ /** * @package Grav\Console\Plugin * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Console/TerminalObjects/Table.php b/system/src/Grav/Console/TerminalObjects/Table.php index a71d7c0c8f..153993dcde 100644 --- a/system/src/Grav/Console/TerminalObjects/Table.php +++ b/system/src/Grav/Console/TerminalObjects/Table.php @@ -3,7 +3,7 @@ /** * @package Grav\Console\TerminalObjects * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Events/FlexRegisterEvent.php b/system/src/Grav/Events/FlexRegisterEvent.php index 13aebf386b..b02ed1dae1 100644 --- a/system/src/Grav/Events/FlexRegisterEvent.php +++ b/system/src/Grav/Events/FlexRegisterEvent.php @@ -3,7 +3,7 @@ /** * @package Grav\Events * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Events/PermissionsRegisterEvent.php b/system/src/Grav/Events/PermissionsRegisterEvent.php index 5e63c85ab2..434dcfaf2d 100644 --- a/system/src/Grav/Events/PermissionsRegisterEvent.php +++ b/system/src/Grav/Events/PermissionsRegisterEvent.php @@ -3,7 +3,7 @@ /** * @package Grav\Events * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Events/PluginsLoadedEvent.php b/system/src/Grav/Events/PluginsLoadedEvent.php index 9dfd18b4af..13e22264d9 100644 --- a/system/src/Grav/Events/PluginsLoadedEvent.php +++ b/system/src/Grav/Events/PluginsLoadedEvent.php @@ -3,7 +3,7 @@ /** * @package Grav\Events * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Events/SessionStartEvent.php b/system/src/Grav/Events/SessionStartEvent.php index e724a09223..fc4f3649c1 100644 --- a/system/src/Grav/Events/SessionStartEvent.php +++ b/system/src/Grav/Events/SessionStartEvent.php @@ -3,7 +3,7 @@ /** * @package Grav\Events * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Acl/Access.php b/system/src/Grav/Framework/Acl/Access.php index 0a6bb41022..45cf2bf9bb 100644 --- a/system/src/Grav/Framework/Acl/Access.php +++ b/system/src/Grav/Framework/Acl/Access.php @@ -3,7 +3,7 @@ /** * @package Grav\Framework\Acl * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Acl/Action.php b/system/src/Grav/Framework/Acl/Action.php index ee46f55f98..6251c3c89a 100644 --- a/system/src/Grav/Framework/Acl/Action.php +++ b/system/src/Grav/Framework/Acl/Action.php @@ -3,7 +3,7 @@ /** * @package Grav\Framework\Acl * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Acl/Permissions.php b/system/src/Grav/Framework/Acl/Permissions.php index 83c6179ea4..e54590a0d7 100644 --- a/system/src/Grav/Framework/Acl/Permissions.php +++ b/system/src/Grav/Framework/Acl/Permissions.php @@ -3,7 +3,7 @@ /** * @package Grav\Framework\Acl * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Acl/PermissionsReader.php b/system/src/Grav/Framework/Acl/PermissionsReader.php index 5e8e892bb6..350fc967a3 100644 --- a/system/src/Grav/Framework/Acl/PermissionsReader.php +++ b/system/src/Grav/Framework/Acl/PermissionsReader.php @@ -3,7 +3,7 @@ /** * @package Grav\Framework\Acl * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Acl/RecursiveActionIterator.php b/system/src/Grav/Framework/Acl/RecursiveActionIterator.php index 3b0e822cd3..1fb9a60bae 100644 --- a/system/src/Grav/Framework/Acl/RecursiveActionIterator.php +++ b/system/src/Grav/Framework/Acl/RecursiveActionIterator.php @@ -3,7 +3,7 @@ /** * @package Grav\Framework\Acl * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Cache/AbstractCache.php b/system/src/Grav/Framework/Cache/AbstractCache.php index bfb5125ec6..b6d00a3b8a 100644 --- a/system/src/Grav/Framework/Cache/AbstractCache.php +++ b/system/src/Grav/Framework/Cache/AbstractCache.php @@ -3,7 +3,7 @@ /** * @package Grav\Framework\Cache * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Cache/Adapter/ChainCache.php b/system/src/Grav/Framework/Cache/Adapter/ChainCache.php index a5f2f582ec..bca940fa03 100644 --- a/system/src/Grav/Framework/Cache/Adapter/ChainCache.php +++ b/system/src/Grav/Framework/Cache/Adapter/ChainCache.php @@ -3,7 +3,7 @@ /** * @package Grav\Framework\Cache * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Cache/Adapter/DoctrineCache.php b/system/src/Grav/Framework/Cache/Adapter/DoctrineCache.php index 26819d89b1..15afed3802 100644 --- a/system/src/Grav/Framework/Cache/Adapter/DoctrineCache.php +++ b/system/src/Grav/Framework/Cache/Adapter/DoctrineCache.php @@ -3,7 +3,7 @@ /** * @package Grav\Framework\Cache * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Cache/Adapter/FileCache.php b/system/src/Grav/Framework/Cache/Adapter/FileCache.php index 69a1127721..7f1d5e7b08 100644 --- a/system/src/Grav/Framework/Cache/Adapter/FileCache.php +++ b/system/src/Grav/Framework/Cache/Adapter/FileCache.php @@ -3,7 +3,7 @@ /** * @package Grav\Framework\Cache * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Cache/Adapter/MemoryCache.php b/system/src/Grav/Framework/Cache/Adapter/MemoryCache.php index c043bf9e6a..21cd89c1c6 100644 --- a/system/src/Grav/Framework/Cache/Adapter/MemoryCache.php +++ b/system/src/Grav/Framework/Cache/Adapter/MemoryCache.php @@ -3,7 +3,7 @@ /** * @package Grav\Framework\Cache * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Cache/Adapter/SessionCache.php b/system/src/Grav/Framework/Cache/Adapter/SessionCache.php index e189e3e7e3..02fe7c9e3c 100644 --- a/system/src/Grav/Framework/Cache/Adapter/SessionCache.php +++ b/system/src/Grav/Framework/Cache/Adapter/SessionCache.php @@ -3,7 +3,7 @@ /** * @package Grav\Framework\Cache * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Cache/CacheInterface.php b/system/src/Grav/Framework/Cache/CacheInterface.php index efd9d31225..03dfa7a14b 100644 --- a/system/src/Grav/Framework/Cache/CacheInterface.php +++ b/system/src/Grav/Framework/Cache/CacheInterface.php @@ -3,7 +3,7 @@ /** * @package Grav\Framework\Cache * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Cache/CacheTrait.php b/system/src/Grav/Framework/Cache/CacheTrait.php index 287f92462d..37dd6c955d 100644 --- a/system/src/Grav/Framework/Cache/CacheTrait.php +++ b/system/src/Grav/Framework/Cache/CacheTrait.php @@ -3,7 +3,7 @@ /** * @package Grav\Framework\Cache * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Cache/Exception/CacheException.php b/system/src/Grav/Framework/Cache/Exception/CacheException.php index 1db325694b..db33883b0e 100644 --- a/system/src/Grav/Framework/Cache/Exception/CacheException.php +++ b/system/src/Grav/Framework/Cache/Exception/CacheException.php @@ -3,7 +3,7 @@ /** * @package Grav\Framework\Cache * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Cache/Exception/InvalidArgumentException.php b/system/src/Grav/Framework/Cache/Exception/InvalidArgumentException.php index 08a3435043..70c041885e 100644 --- a/system/src/Grav/Framework/Cache/Exception/InvalidArgumentException.php +++ b/system/src/Grav/Framework/Cache/Exception/InvalidArgumentException.php @@ -3,7 +3,7 @@ /** * @package Grav\Framework\Cache * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Collection/AbstractFileCollection.php b/system/src/Grav/Framework/Collection/AbstractFileCollection.php index 77b3247f0a..500aea8e48 100644 --- a/system/src/Grav/Framework/Collection/AbstractFileCollection.php +++ b/system/src/Grav/Framework/Collection/AbstractFileCollection.php @@ -3,7 +3,7 @@ /** * @package Grav\Framework\Collection * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Collection/AbstractIndexCollection.php b/system/src/Grav/Framework/Collection/AbstractIndexCollection.php index a4392c144b..02916d9097 100644 --- a/system/src/Grav/Framework/Collection/AbstractIndexCollection.php +++ b/system/src/Grav/Framework/Collection/AbstractIndexCollection.php @@ -3,7 +3,7 @@ /** * @package Grav\Framework\Collection * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Collection/AbstractLazyCollection.php b/system/src/Grav/Framework/Collection/AbstractLazyCollection.php index 5f7ad1b12e..b0a93f514b 100644 --- a/system/src/Grav/Framework/Collection/AbstractLazyCollection.php +++ b/system/src/Grav/Framework/Collection/AbstractLazyCollection.php @@ -3,7 +3,7 @@ /** * @package Grav\Framework\Collection * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Collection/ArrayCollection.php b/system/src/Grav/Framework/Collection/ArrayCollection.php index 892cfcb5a6..cad02f26d2 100644 --- a/system/src/Grav/Framework/Collection/ArrayCollection.php +++ b/system/src/Grav/Framework/Collection/ArrayCollection.php @@ -3,7 +3,7 @@ /** * @package Grav\Framework\Collection * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Collection/CollectionInterface.php b/system/src/Grav/Framework/Collection/CollectionInterface.php index def9427a12..e098dd6a13 100644 --- a/system/src/Grav/Framework/Collection/CollectionInterface.php +++ b/system/src/Grav/Framework/Collection/CollectionInterface.php @@ -3,7 +3,7 @@ /** * @package Grav\Framework\Collection * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Collection/FileCollection.php b/system/src/Grav/Framework/Collection/FileCollection.php index f7b4f258b9..bae0e7b2ff 100644 --- a/system/src/Grav/Framework/Collection/FileCollection.php +++ b/system/src/Grav/Framework/Collection/FileCollection.php @@ -3,7 +3,7 @@ /** * @package Grav\Framework\Collection * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Collection/FileCollectionInterface.php b/system/src/Grav/Framework/Collection/FileCollectionInterface.php index 45c446c637..1b56da953e 100644 --- a/system/src/Grav/Framework/Collection/FileCollectionInterface.php +++ b/system/src/Grav/Framework/Collection/FileCollectionInterface.php @@ -3,7 +3,7 @@ /** * @package Grav\Framework\Collection * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Compat/Serializable.php b/system/src/Grav/Framework/Compat/Serializable.php index 3c9bf6a081..22e4648d8b 100644 --- a/system/src/Grav/Framework/Compat/Serializable.php +++ b/system/src/Grav/Framework/Compat/Serializable.php @@ -3,7 +3,7 @@ /** * @package Grav\Framework\Compat * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/ContentBlock/ContentBlock.php b/system/src/Grav/Framework/ContentBlock/ContentBlock.php index 95d11fd253..7259df0907 100644 --- a/system/src/Grav/Framework/ContentBlock/ContentBlock.php +++ b/system/src/Grav/Framework/ContentBlock/ContentBlock.php @@ -3,7 +3,7 @@ /** * @package Grav\Framework\ContentBlock * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/ContentBlock/ContentBlockInterface.php b/system/src/Grav/Framework/ContentBlock/ContentBlockInterface.php index fb445a398b..bb0e46f8f6 100644 --- a/system/src/Grav/Framework/ContentBlock/ContentBlockInterface.php +++ b/system/src/Grav/Framework/ContentBlock/ContentBlockInterface.php @@ -3,7 +3,7 @@ /** * @package Grav\Framework\ContentBlock * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/ContentBlock/HtmlBlock.php b/system/src/Grav/Framework/ContentBlock/HtmlBlock.php index 5c5eb4342e..734d5077fd 100644 --- a/system/src/Grav/Framework/ContentBlock/HtmlBlock.php +++ b/system/src/Grav/Framework/ContentBlock/HtmlBlock.php @@ -3,7 +3,7 @@ /** * @package Grav\Framework\ContentBlock * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/ContentBlock/HtmlBlockInterface.php b/system/src/Grav/Framework/ContentBlock/HtmlBlockInterface.php index 616e4a2cc0..686127f45a 100644 --- a/system/src/Grav/Framework/ContentBlock/HtmlBlockInterface.php +++ b/system/src/Grav/Framework/ContentBlock/HtmlBlockInterface.php @@ -3,7 +3,7 @@ /** * @package Grav\Framework\ContentBlock * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Controller/Traits/ControllerResponseTrait.php b/system/src/Grav/Framework/Controller/Traits/ControllerResponseTrait.php index 36f5411af4..efd9c7dbd0 100644 --- a/system/src/Grav/Framework/Controller/Traits/ControllerResponseTrait.php +++ b/system/src/Grav/Framework/Controller/Traits/ControllerResponseTrait.php @@ -3,7 +3,7 @@ /** * @package Grav\Framework\Controller * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/DI/Container.php b/system/src/Grav/Framework/DI/Container.php index 76434a36a6..dde0da3ca5 100644 --- a/system/src/Grav/Framework/DI/Container.php +++ b/system/src/Grav/Framework/DI/Container.php @@ -3,7 +3,7 @@ /** * @package Grav\Framework\DI * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/File/AbstractFile.php b/system/src/Grav/Framework/File/AbstractFile.php index a49d79fc93..b216ea6c80 100644 --- a/system/src/Grav/Framework/File/AbstractFile.php +++ b/system/src/Grav/Framework/File/AbstractFile.php @@ -5,7 +5,7 @@ /** * @package Grav\Framework\File * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/File/CsvFile.php b/system/src/Grav/Framework/File/CsvFile.php index 7be6879b7b..7eba91e88d 100644 --- a/system/src/Grav/Framework/File/CsvFile.php +++ b/system/src/Grav/Framework/File/CsvFile.php @@ -5,7 +5,7 @@ /** * @package Grav\Framework\File * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/File/DataFile.php b/system/src/Grav/Framework/File/DataFile.php index 114146f949..189db53de8 100644 --- a/system/src/Grav/Framework/File/DataFile.php +++ b/system/src/Grav/Framework/File/DataFile.php @@ -5,7 +5,7 @@ /** * @package Grav\Framework\File * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/File/File.php b/system/src/Grav/Framework/File/File.php index a6a8f3c9c3..b1a1c4f674 100644 --- a/system/src/Grav/Framework/File/File.php +++ b/system/src/Grav/Framework/File/File.php @@ -5,7 +5,7 @@ /** * @package Grav\Framework\File * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/File/Formatter/AbstractFormatter.php b/system/src/Grav/Framework/File/Formatter/AbstractFormatter.php index f5ff3f24a9..6a6981bc04 100644 --- a/system/src/Grav/Framework/File/Formatter/AbstractFormatter.php +++ b/system/src/Grav/Framework/File/Formatter/AbstractFormatter.php @@ -5,7 +5,7 @@ /** * @package Grav\Framework\File\Formatter * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/File/Formatter/CsvFormatter.php b/system/src/Grav/Framework/File/Formatter/CsvFormatter.php index 072de1211d..37ab5bb257 100644 --- a/system/src/Grav/Framework/File/Formatter/CsvFormatter.php +++ b/system/src/Grav/Framework/File/Formatter/CsvFormatter.php @@ -5,7 +5,7 @@ /** * @package Grav\Framework\File\Formatter * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/File/Formatter/IniFormatter.php b/system/src/Grav/Framework/File/Formatter/IniFormatter.php index 2e7404b9c2..ecf67d1f2c 100644 --- a/system/src/Grav/Framework/File/Formatter/IniFormatter.php +++ b/system/src/Grav/Framework/File/Formatter/IniFormatter.php @@ -5,7 +5,7 @@ /** * @package Grav\Framework\File\Formatter * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/File/Formatter/JsonFormatter.php b/system/src/Grav/Framework/File/Formatter/JsonFormatter.php index 3957667184..2bd6c79ad5 100644 --- a/system/src/Grav/Framework/File/Formatter/JsonFormatter.php +++ b/system/src/Grav/Framework/File/Formatter/JsonFormatter.php @@ -5,7 +5,7 @@ /** * @package Grav\Framework\File\Formatter * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/File/Formatter/MarkdownFormatter.php b/system/src/Grav/Framework/File/Formatter/MarkdownFormatter.php index a30d7a906a..e36276a81e 100644 --- a/system/src/Grav/Framework/File/Formatter/MarkdownFormatter.php +++ b/system/src/Grav/Framework/File/Formatter/MarkdownFormatter.php @@ -5,7 +5,7 @@ /** * @package Grav\Framework\File\Formatter * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/File/Formatter/SerializeFormatter.php b/system/src/Grav/Framework/File/Formatter/SerializeFormatter.php index f045d71e38..25aee813b0 100644 --- a/system/src/Grav/Framework/File/Formatter/SerializeFormatter.php +++ b/system/src/Grav/Framework/File/Formatter/SerializeFormatter.php @@ -5,7 +5,7 @@ /** * @package Grav\Framework\File\Formatter * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/File/Formatter/YamlFormatter.php b/system/src/Grav/Framework/File/Formatter/YamlFormatter.php index 3909f6e85a..31aff2c674 100644 --- a/system/src/Grav/Framework/File/Formatter/YamlFormatter.php +++ b/system/src/Grav/Framework/File/Formatter/YamlFormatter.php @@ -5,7 +5,7 @@ /** * @package Grav\Framework\File\Formatter * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/File/IniFile.php b/system/src/Grav/Framework/File/IniFile.php index 64214998dc..0807ee3c2c 100644 --- a/system/src/Grav/Framework/File/IniFile.php +++ b/system/src/Grav/Framework/File/IniFile.php @@ -5,7 +5,7 @@ /** * @package Grav\Framework\File * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/File/Interfaces/FileFormatterInterface.php b/system/src/Grav/Framework/File/Interfaces/FileFormatterInterface.php index 49eda4f1de..78714af7ef 100644 --- a/system/src/Grav/Framework/File/Interfaces/FileFormatterInterface.php +++ b/system/src/Grav/Framework/File/Interfaces/FileFormatterInterface.php @@ -5,7 +5,7 @@ /** * @package Grav\Framework\File * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/File/Interfaces/FileInterface.php b/system/src/Grav/Framework/File/Interfaces/FileInterface.php index 015b1ada2e..f2cc288a94 100644 --- a/system/src/Grav/Framework/File/Interfaces/FileInterface.php +++ b/system/src/Grav/Framework/File/Interfaces/FileInterface.php @@ -5,7 +5,7 @@ /** * @package Grav\Framework\File * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/File/JsonFile.php b/system/src/Grav/Framework/File/JsonFile.php index f3b0902c86..7751e84d60 100644 --- a/system/src/Grav/Framework/File/JsonFile.php +++ b/system/src/Grav/Framework/File/JsonFile.php @@ -5,7 +5,7 @@ /** * @package Grav\Framework\File * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/File/MarkdownFile.php b/system/src/Grav/Framework/File/MarkdownFile.php index 881862b785..a79d5ce77d 100644 --- a/system/src/Grav/Framework/File/MarkdownFile.php +++ b/system/src/Grav/Framework/File/MarkdownFile.php @@ -5,7 +5,7 @@ /** * @package Grav\Framework\File * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/File/YamlFile.php b/system/src/Grav/Framework/File/YamlFile.php index d191e3cf9c..c4300ade59 100644 --- a/system/src/Grav/Framework/File/YamlFile.php +++ b/system/src/Grav/Framework/File/YamlFile.php @@ -5,7 +5,7 @@ /** * @package Grav\Framework\File * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Filesystem/Filesystem.php b/system/src/Grav/Framework/Filesystem/Filesystem.php index f4e753e083..5000b69962 100644 --- a/system/src/Grav/Framework/Filesystem/Filesystem.php +++ b/system/src/Grav/Framework/Filesystem/Filesystem.php @@ -5,7 +5,7 @@ /** * @package Grav\Framework\Filesystem * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Filesystem/Interfaces/FilesystemInterface.php b/system/src/Grav/Framework/Filesystem/Interfaces/FilesystemInterface.php index f80b772444..fa1000941e 100644 --- a/system/src/Grav/Framework/Filesystem/Interfaces/FilesystemInterface.php +++ b/system/src/Grav/Framework/Filesystem/Interfaces/FilesystemInterface.php @@ -5,7 +5,7 @@ /** * @package Grav\Framework\Filesystem * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Flex/Flex.php b/system/src/Grav/Framework/Flex/Flex.php index 28dc943459..4d662d1929 100644 --- a/system/src/Grav/Framework/Flex/Flex.php +++ b/system/src/Grav/Framework/Flex/Flex.php @@ -5,7 +5,7 @@ /** * @package Grav\Framework\Flex * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Flex/FlexCollection.php b/system/src/Grav/Framework/Flex/FlexCollection.php index 17c557ae01..186c60abc9 100644 --- a/system/src/Grav/Framework/Flex/FlexCollection.php +++ b/system/src/Grav/Framework/Flex/FlexCollection.php @@ -3,7 +3,7 @@ /** * @package Grav\Framework\Flex * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Flex/FlexDirectory.php b/system/src/Grav/Framework/Flex/FlexDirectory.php index 57a0a4c467..f96633b31a 100644 --- a/system/src/Grav/Framework/Flex/FlexDirectory.php +++ b/system/src/Grav/Framework/Flex/FlexDirectory.php @@ -3,7 +3,7 @@ /** * @package Grav\Framework\Flex * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Flex/FlexDirectoryForm.php b/system/src/Grav/Framework/Flex/FlexDirectoryForm.php index 693ef120b5..709f418919 100644 --- a/system/src/Grav/Framework/Flex/FlexDirectoryForm.php +++ b/system/src/Grav/Framework/Flex/FlexDirectoryForm.php @@ -3,7 +3,7 @@ /** * @package Grav\Framework\Flex * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Flex/FlexForm.php b/system/src/Grav/Framework/Flex/FlexForm.php index 5d7221847c..a1263f67ff 100644 --- a/system/src/Grav/Framework/Flex/FlexForm.php +++ b/system/src/Grav/Framework/Flex/FlexForm.php @@ -3,7 +3,7 @@ /** * @package Grav\Framework\Flex * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Flex/FlexFormFlash.php b/system/src/Grav/Framework/Flex/FlexFormFlash.php index feb7a9ee99..3f52cdb6f0 100644 --- a/system/src/Grav/Framework/Flex/FlexFormFlash.php +++ b/system/src/Grav/Framework/Flex/FlexFormFlash.php @@ -3,7 +3,7 @@ /** * @package Grav\Common\Flex * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Flex/FlexIndex.php b/system/src/Grav/Framework/Flex/FlexIndex.php index c433a080b0..54438af511 100644 --- a/system/src/Grav/Framework/Flex/FlexIndex.php +++ b/system/src/Grav/Framework/Flex/FlexIndex.php @@ -3,7 +3,7 @@ /** * @package Grav\Framework\Flex * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Flex/FlexObject.php b/system/src/Grav/Framework/Flex/FlexObject.php index 87773470a6..afc656c04f 100644 --- a/system/src/Grav/Framework/Flex/FlexObject.php +++ b/system/src/Grav/Framework/Flex/FlexObject.php @@ -3,7 +3,7 @@ /** * @package Grav\Framework\Flex * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Flex/Interfaces/FlexAuthorizeInterface.php b/system/src/Grav/Framework/Flex/Interfaces/FlexAuthorizeInterface.php index 102dbf4a79..c1025a4b73 100644 --- a/system/src/Grav/Framework/Flex/Interfaces/FlexAuthorizeInterface.php +++ b/system/src/Grav/Framework/Flex/Interfaces/FlexAuthorizeInterface.php @@ -5,7 +5,7 @@ /** * @package Grav\Framework\Flex * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Flex/Interfaces/FlexCollectionInterface.php b/system/src/Grav/Framework/Flex/Interfaces/FlexCollectionInterface.php index 2510e5de7a..d14b69f40e 100644 --- a/system/src/Grav/Framework/Flex/Interfaces/FlexCollectionInterface.php +++ b/system/src/Grav/Framework/Flex/Interfaces/FlexCollectionInterface.php @@ -5,7 +5,7 @@ /** * @package Grav\Framework\Flex * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Flex/Interfaces/FlexCommonInterface.php b/system/src/Grav/Framework/Flex/Interfaces/FlexCommonInterface.php index ed045e25f0..7c1975f212 100644 --- a/system/src/Grav/Framework/Flex/Interfaces/FlexCommonInterface.php +++ b/system/src/Grav/Framework/Flex/Interfaces/FlexCommonInterface.php @@ -5,7 +5,7 @@ /** * @package Grav\Framework\Flex * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Flex/Interfaces/FlexDirectoryFormInterface.php b/system/src/Grav/Framework/Flex/Interfaces/FlexDirectoryFormInterface.php index df6f7d6a65..203c76603b 100644 --- a/system/src/Grav/Framework/Flex/Interfaces/FlexDirectoryFormInterface.php +++ b/system/src/Grav/Framework/Flex/Interfaces/FlexDirectoryFormInterface.php @@ -3,7 +3,7 @@ /** * @package Grav\Framework\Flex * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Flex/Interfaces/FlexDirectoryInterface.php b/system/src/Grav/Framework/Flex/Interfaces/FlexDirectoryInterface.php index 1d95657452..a77df958fa 100644 --- a/system/src/Grav/Framework/Flex/Interfaces/FlexDirectoryInterface.php +++ b/system/src/Grav/Framework/Flex/Interfaces/FlexDirectoryInterface.php @@ -3,7 +3,7 @@ /** * @package Grav\Framework\Flex * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Flex/Interfaces/FlexFormInterface.php b/system/src/Grav/Framework/Flex/Interfaces/FlexFormInterface.php index eaafaf01c7..ba9996afc8 100644 --- a/system/src/Grav/Framework/Flex/Interfaces/FlexFormInterface.php +++ b/system/src/Grav/Framework/Flex/Interfaces/FlexFormInterface.php @@ -3,7 +3,7 @@ /** * @package Grav\Framework\Flex * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Flex/Interfaces/FlexIndexInterface.php b/system/src/Grav/Framework/Flex/Interfaces/FlexIndexInterface.php index 71dd72770f..d8f8ba3c99 100644 --- a/system/src/Grav/Framework/Flex/Interfaces/FlexIndexInterface.php +++ b/system/src/Grav/Framework/Flex/Interfaces/FlexIndexInterface.php @@ -5,7 +5,7 @@ /** * @package Grav\Framework\Flex * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Flex/Interfaces/FlexInterface.php b/system/src/Grav/Framework/Flex/Interfaces/FlexInterface.php index cbd440bd22..f1376a5891 100644 --- a/system/src/Grav/Framework/Flex/Interfaces/FlexInterface.php +++ b/system/src/Grav/Framework/Flex/Interfaces/FlexInterface.php @@ -5,7 +5,7 @@ /** * @package Grav\Framework\Flex * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Flex/Interfaces/FlexObjectFormInterface.php b/system/src/Grav/Framework/Flex/Interfaces/FlexObjectFormInterface.php index 044ee612d3..190a9634ab 100644 --- a/system/src/Grav/Framework/Flex/Interfaces/FlexObjectFormInterface.php +++ b/system/src/Grav/Framework/Flex/Interfaces/FlexObjectFormInterface.php @@ -3,7 +3,7 @@ /** * @package Grav\Framework\Flex * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Flex/Interfaces/FlexObjectInterface.php b/system/src/Grav/Framework/Flex/Interfaces/FlexObjectInterface.php index a0f30c6e94..d02bc8b30e 100644 --- a/system/src/Grav/Framework/Flex/Interfaces/FlexObjectInterface.php +++ b/system/src/Grav/Framework/Flex/Interfaces/FlexObjectInterface.php @@ -5,7 +5,7 @@ /** * @package Grav\Framework\Flex * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Flex/Interfaces/FlexStorageInterface.php b/system/src/Grav/Framework/Flex/Interfaces/FlexStorageInterface.php index 08c4335966..4209924727 100644 --- a/system/src/Grav/Framework/Flex/Interfaces/FlexStorageInterface.php +++ b/system/src/Grav/Framework/Flex/Interfaces/FlexStorageInterface.php @@ -5,7 +5,7 @@ /** * @package Grav\Framework\Flex * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Flex/Interfaces/FlexTranslateInterface.php b/system/src/Grav/Framework/Flex/Interfaces/FlexTranslateInterface.php index 28e488860b..8df11fa23a 100644 --- a/system/src/Grav/Framework/Flex/Interfaces/FlexTranslateInterface.php +++ b/system/src/Grav/Framework/Flex/Interfaces/FlexTranslateInterface.php @@ -5,7 +5,7 @@ /** * @package Grav\Framework\Flex * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Flex/Pages/FlexPageCollection.php b/system/src/Grav/Framework/Flex/Pages/FlexPageCollection.php index d206921e58..5901557d7a 100644 --- a/system/src/Grav/Framework/Flex/Pages/FlexPageCollection.php +++ b/system/src/Grav/Framework/Flex/Pages/FlexPageCollection.php @@ -5,7 +5,7 @@ /** * @package Grav\Framework\Flex * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Flex/Pages/FlexPageIndex.php b/system/src/Grav/Framework/Flex/Pages/FlexPageIndex.php index 904d1f6da3..5bb5517971 100644 --- a/system/src/Grav/Framework/Flex/Pages/FlexPageIndex.php +++ b/system/src/Grav/Framework/Flex/Pages/FlexPageIndex.php @@ -5,7 +5,7 @@ /** * @package Grav\Framework\Flex * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Flex/Pages/FlexPageObject.php b/system/src/Grav/Framework/Flex/Pages/FlexPageObject.php index c2a2d6008f..e700424b99 100644 --- a/system/src/Grav/Framework/Flex/Pages/FlexPageObject.php +++ b/system/src/Grav/Framework/Flex/Pages/FlexPageObject.php @@ -3,7 +3,7 @@ /** * @package Grav\Framework\Flex * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Flex/Pages/Traits/PageAuthorsTrait.php b/system/src/Grav/Framework/Flex/Pages/Traits/PageAuthorsTrait.php index 5d3e96803e..d0934e12c0 100644 --- a/system/src/Grav/Framework/Flex/Pages/Traits/PageAuthorsTrait.php +++ b/system/src/Grav/Framework/Flex/Pages/Traits/PageAuthorsTrait.php @@ -5,7 +5,7 @@ /** * @package Grav\Framework\Flex * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Flex/Pages/Traits/PageContentTrait.php b/system/src/Grav/Framework/Flex/Pages/Traits/PageContentTrait.php index bbf5e1b043..43dfee1163 100644 --- a/system/src/Grav/Framework/Flex/Pages/Traits/PageContentTrait.php +++ b/system/src/Grav/Framework/Flex/Pages/Traits/PageContentTrait.php @@ -3,7 +3,7 @@ /** * @package Grav\Framework\Flex * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Flex/Pages/Traits/PageLegacyTrait.php b/system/src/Grav/Framework/Flex/Pages/Traits/PageLegacyTrait.php index ae2a6bc9ce..539b84c994 100644 --- a/system/src/Grav/Framework/Flex/Pages/Traits/PageLegacyTrait.php +++ b/system/src/Grav/Framework/Flex/Pages/Traits/PageLegacyTrait.php @@ -3,7 +3,7 @@ /** * @package Grav\Framework\Flex * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Flex/Pages/Traits/PageRoutableTrait.php b/system/src/Grav/Framework/Flex/Pages/Traits/PageRoutableTrait.php index 90773cddaf..421cbec8c8 100644 --- a/system/src/Grav/Framework/Flex/Pages/Traits/PageRoutableTrait.php +++ b/system/src/Grav/Framework/Flex/Pages/Traits/PageRoutableTrait.php @@ -3,7 +3,7 @@ /** * @package Grav\Framework\Flex * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Flex/Pages/Traits/PageTranslateTrait.php b/system/src/Grav/Framework/Flex/Pages/Traits/PageTranslateTrait.php index 0ce0d7308e..4bec685b45 100644 --- a/system/src/Grav/Framework/Flex/Pages/Traits/PageTranslateTrait.php +++ b/system/src/Grav/Framework/Flex/Pages/Traits/PageTranslateTrait.php @@ -3,7 +3,7 @@ /** * @package Grav\Framework\Flex * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Flex/Storage/AbstractFilesystemStorage.php b/system/src/Grav/Framework/Flex/Storage/AbstractFilesystemStorage.php index 2e3132146a..ee04c519d2 100644 --- a/system/src/Grav/Framework/Flex/Storage/AbstractFilesystemStorage.php +++ b/system/src/Grav/Framework/Flex/Storage/AbstractFilesystemStorage.php @@ -5,7 +5,7 @@ /** * @package Grav\Framework\Flex * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Flex/Storage/FileStorage.php b/system/src/Grav/Framework/Flex/Storage/FileStorage.php index eabd658fe2..7a1764692f 100644 --- a/system/src/Grav/Framework/Flex/Storage/FileStorage.php +++ b/system/src/Grav/Framework/Flex/Storage/FileStorage.php @@ -5,7 +5,7 @@ /** * @package Grav\Framework\Flex * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Flex/Storage/FolderStorage.php b/system/src/Grav/Framework/Flex/Storage/FolderStorage.php index b2b9533a26..4da59d73c5 100644 --- a/system/src/Grav/Framework/Flex/Storage/FolderStorage.php +++ b/system/src/Grav/Framework/Flex/Storage/FolderStorage.php @@ -5,7 +5,7 @@ /** * @package Grav\Framework\Flex * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Flex/Storage/SimpleStorage.php b/system/src/Grav/Framework/Flex/Storage/SimpleStorage.php index 78a4ad2063..30da11e198 100644 --- a/system/src/Grav/Framework/Flex/Storage/SimpleStorage.php +++ b/system/src/Grav/Framework/Flex/Storage/SimpleStorage.php @@ -5,7 +5,7 @@ /** * @package Grav\Framework\Flex * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Flex/Traits/FlexAuthorizeTrait.php b/system/src/Grav/Framework/Flex/Traits/FlexAuthorizeTrait.php index 8cbd1d542b..ef4c433a2b 100644 --- a/system/src/Grav/Framework/Flex/Traits/FlexAuthorizeTrait.php +++ b/system/src/Grav/Framework/Flex/Traits/FlexAuthorizeTrait.php @@ -5,7 +5,7 @@ /** * @package Grav\Framework\Flex * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Flex/Traits/FlexMediaTrait.php b/system/src/Grav/Framework/Flex/Traits/FlexMediaTrait.php index c2bc66891f..05e3a44337 100644 --- a/system/src/Grav/Framework/Flex/Traits/FlexMediaTrait.php +++ b/system/src/Grav/Framework/Flex/Traits/FlexMediaTrait.php @@ -5,7 +5,7 @@ /** * @package Grav\Framework\Flex * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Flex/Traits/FlexRelatedDirectoryTrait.php b/system/src/Grav/Framework/Flex/Traits/FlexRelatedDirectoryTrait.php index bafcb1ed31..de98359e7c 100644 --- a/system/src/Grav/Framework/Flex/Traits/FlexRelatedDirectoryTrait.php +++ b/system/src/Grav/Framework/Flex/Traits/FlexRelatedDirectoryTrait.php @@ -5,7 +5,7 @@ /** * @package Grav\Common\Flex * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Form/FormFlash.php b/system/src/Grav/Framework/Form/FormFlash.php index 864e992f39..06cc2eeead 100644 --- a/system/src/Grav/Framework/Form/FormFlash.php +++ b/system/src/Grav/Framework/Form/FormFlash.php @@ -3,7 +3,7 @@ /** * @package Grav\Framework\Form * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Form/FormFlashFile.php b/system/src/Grav/Framework/Form/FormFlashFile.php index 800d7c3a86..6c995993eb 100644 --- a/system/src/Grav/Framework/Form/FormFlashFile.php +++ b/system/src/Grav/Framework/Form/FormFlashFile.php @@ -3,7 +3,7 @@ /** * @package Grav\Framework\Form * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Form/Interfaces/FormFactoryInterface.php b/system/src/Grav/Framework/Form/Interfaces/FormFactoryInterface.php index d21d4aa055..6a85f668c7 100644 --- a/system/src/Grav/Framework/Form/Interfaces/FormFactoryInterface.php +++ b/system/src/Grav/Framework/Form/Interfaces/FormFactoryInterface.php @@ -5,7 +5,7 @@ /** * @package Grav\Framework\Form * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Form/Interfaces/FormFlashInterface.php b/system/src/Grav/Framework/Form/Interfaces/FormFlashInterface.php index d51bd8d9eb..44bee025c4 100644 --- a/system/src/Grav/Framework/Form/Interfaces/FormFlashInterface.php +++ b/system/src/Grav/Framework/Form/Interfaces/FormFlashInterface.php @@ -3,7 +3,7 @@ /** * @package Grav\Framework\Form * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Form/Interfaces/FormInterface.php b/system/src/Grav/Framework/Form/Interfaces/FormInterface.php index 98156469d5..0edfc42a9d 100644 --- a/system/src/Grav/Framework/Form/Interfaces/FormInterface.php +++ b/system/src/Grav/Framework/Form/Interfaces/FormInterface.php @@ -3,7 +3,7 @@ /** * @package Grav\Framework\Form * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Form/Traits/FormTrait.php b/system/src/Grav/Framework/Form/Traits/FormTrait.php index 3c368d97bf..f4be9e7aaf 100644 --- a/system/src/Grav/Framework/Form/Traits/FormTrait.php +++ b/system/src/Grav/Framework/Form/Traits/FormTrait.php @@ -3,7 +3,7 @@ /** * @package Grav\Framework\Form * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Interfaces/RenderInterface.php b/system/src/Grav/Framework/Interfaces/RenderInterface.php index 7a7d9d3676..5bc6e58358 100644 --- a/system/src/Grav/Framework/Interfaces/RenderInterface.php +++ b/system/src/Grav/Framework/Interfaces/RenderInterface.php @@ -5,7 +5,7 @@ /** * @package Grav\Framework\Interfaces * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Logger/Processors/UserProcessor.php b/system/src/Grav/Framework/Logger/Processors/UserProcessor.php index 885b4f0a83..f0ebef10cd 100644 --- a/system/src/Grav/Framework/Logger/Processors/UserProcessor.php +++ b/system/src/Grav/Framework/Logger/Processors/UserProcessor.php @@ -3,7 +3,7 @@ /** * @package Grav\Framework\Logger * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Media/Interfaces/MediaCollectionInterface.php b/system/src/Grav/Framework/Media/Interfaces/MediaCollectionInterface.php index b3985f3085..2bac98f153 100644 --- a/system/src/Grav/Framework/Media/Interfaces/MediaCollectionInterface.php +++ b/system/src/Grav/Framework/Media/Interfaces/MediaCollectionInterface.php @@ -3,7 +3,7 @@ /** * @package Grav\Framework\Media * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Media/Interfaces/MediaInterface.php b/system/src/Grav/Framework/Media/Interfaces/MediaInterface.php index 2c5a4b3741..8688ad1c39 100644 --- a/system/src/Grav/Framework/Media/Interfaces/MediaInterface.php +++ b/system/src/Grav/Framework/Media/Interfaces/MediaInterface.php @@ -3,7 +3,7 @@ /** * @package Grav\Framework\Media * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Media/Interfaces/MediaManipulationInterface.php b/system/src/Grav/Framework/Media/Interfaces/MediaManipulationInterface.php index fef475f8b4..bca9a228d4 100644 --- a/system/src/Grav/Framework/Media/Interfaces/MediaManipulationInterface.php +++ b/system/src/Grav/Framework/Media/Interfaces/MediaManipulationInterface.php @@ -5,7 +5,7 @@ /** * @package Grav\Framework\Media * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Media/Interfaces/MediaObjectInterface.php b/system/src/Grav/Framework/Media/Interfaces/MediaObjectInterface.php index dc7f1481dc..f4409c5c98 100644 --- a/system/src/Grav/Framework/Media/Interfaces/MediaObjectInterface.php +++ b/system/src/Grav/Framework/Media/Interfaces/MediaObjectInterface.php @@ -3,7 +3,7 @@ /** * @package Grav\Framework\Media * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Mime/MimeTypes.php b/system/src/Grav/Framework/Mime/MimeTypes.php index dadcddf7aa..e3a5ea8ca1 100644 --- a/system/src/Grav/Framework/Mime/MimeTypes.php +++ b/system/src/Grav/Framework/Mime/MimeTypes.php @@ -3,7 +3,7 @@ /** * @package Grav\Framework\Mime * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Object/Access/ArrayAccessTrait.php b/system/src/Grav/Framework/Object/Access/ArrayAccessTrait.php index affff03b0d..4b67599fb5 100644 --- a/system/src/Grav/Framework/Object/Access/ArrayAccessTrait.php +++ b/system/src/Grav/Framework/Object/Access/ArrayAccessTrait.php @@ -3,7 +3,7 @@ /** * @package Grav\Framework\Object * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Object/Access/NestedArrayAccessTrait.php b/system/src/Grav/Framework/Object/Access/NestedArrayAccessTrait.php index 83658753d0..d9acb104f1 100644 --- a/system/src/Grav/Framework/Object/Access/NestedArrayAccessTrait.php +++ b/system/src/Grav/Framework/Object/Access/NestedArrayAccessTrait.php @@ -3,7 +3,7 @@ /** * @package Grav\Framework\Object * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Object/Access/NestedPropertyCollectionTrait.php b/system/src/Grav/Framework/Object/Access/NestedPropertyCollectionTrait.php index 120c1a49de..561b6fec31 100644 --- a/system/src/Grav/Framework/Object/Access/NestedPropertyCollectionTrait.php +++ b/system/src/Grav/Framework/Object/Access/NestedPropertyCollectionTrait.php @@ -3,7 +3,7 @@ /** * @package Grav\Framework\Object * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Object/Access/NestedPropertyTrait.php b/system/src/Grav/Framework/Object/Access/NestedPropertyTrait.php index 40395cbb02..64107e0d39 100644 --- a/system/src/Grav/Framework/Object/Access/NestedPropertyTrait.php +++ b/system/src/Grav/Framework/Object/Access/NestedPropertyTrait.php @@ -3,7 +3,7 @@ /** * @package Grav\Framework\Object * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Object/Access/OverloadedPropertyTrait.php b/system/src/Grav/Framework/Object/Access/OverloadedPropertyTrait.php index d4dd049a84..f417fba028 100644 --- a/system/src/Grav/Framework/Object/Access/OverloadedPropertyTrait.php +++ b/system/src/Grav/Framework/Object/Access/OverloadedPropertyTrait.php @@ -3,7 +3,7 @@ /** * @package Grav\Framework\Object * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Object/ArrayObject.php b/system/src/Grav/Framework/Object/ArrayObject.php index 57b65261df..a38864c890 100644 --- a/system/src/Grav/Framework/Object/ArrayObject.php +++ b/system/src/Grav/Framework/Object/ArrayObject.php @@ -3,7 +3,7 @@ /** * @package Grav\Framework\Object * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Object/Base/ObjectCollectionTrait.php b/system/src/Grav/Framework/Object/Base/ObjectCollectionTrait.php index e3c2164923..e29370add8 100644 --- a/system/src/Grav/Framework/Object/Base/ObjectCollectionTrait.php +++ b/system/src/Grav/Framework/Object/Base/ObjectCollectionTrait.php @@ -3,7 +3,7 @@ /** * @package Grav\Framework\Object * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Object/Base/ObjectTrait.php b/system/src/Grav/Framework/Object/Base/ObjectTrait.php index 7b218c1b48..86df8c783b 100644 --- a/system/src/Grav/Framework/Object/Base/ObjectTrait.php +++ b/system/src/Grav/Framework/Object/Base/ObjectTrait.php @@ -3,7 +3,7 @@ /** * @package Grav\Framework\Object * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Object/Collection/ObjectExpressionVisitor.php b/system/src/Grav/Framework/Object/Collection/ObjectExpressionVisitor.php index eaf589d867..e8b12b7f42 100644 --- a/system/src/Grav/Framework/Object/Collection/ObjectExpressionVisitor.php +++ b/system/src/Grav/Framework/Object/Collection/ObjectExpressionVisitor.php @@ -3,7 +3,7 @@ /** * @package Grav\Framework\Object * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Object/Interfaces/NestedObjectCollectionInterface.php b/system/src/Grav/Framework/Object/Interfaces/NestedObjectCollectionInterface.php index a2431be315..9f00babbfd 100644 --- a/system/src/Grav/Framework/Object/Interfaces/NestedObjectCollectionInterface.php +++ b/system/src/Grav/Framework/Object/Interfaces/NestedObjectCollectionInterface.php @@ -3,7 +3,7 @@ /** * @package Grav\Framework\Object * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Object/Interfaces/NestedObjectInterface.php b/system/src/Grav/Framework/Object/Interfaces/NestedObjectInterface.php index 4d7a880bed..c144d8e920 100644 --- a/system/src/Grav/Framework/Object/Interfaces/NestedObjectInterface.php +++ b/system/src/Grav/Framework/Object/Interfaces/NestedObjectInterface.php @@ -3,7 +3,7 @@ /** * @package Grav\Framework\Object * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Object/Interfaces/ObjectCollectionInterface.php b/system/src/Grav/Framework/Object/Interfaces/ObjectCollectionInterface.php index 8169c246e4..bd25f61837 100644 --- a/system/src/Grav/Framework/Object/Interfaces/ObjectCollectionInterface.php +++ b/system/src/Grav/Framework/Object/Interfaces/ObjectCollectionInterface.php @@ -3,7 +3,7 @@ /** * @package Grav\Framework\Object * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Object/Interfaces/ObjectInterface.php b/system/src/Grav/Framework/Object/Interfaces/ObjectInterface.php index e8ec2c1e7a..bc4d45df90 100644 --- a/system/src/Grav/Framework/Object/Interfaces/ObjectInterface.php +++ b/system/src/Grav/Framework/Object/Interfaces/ObjectInterface.php @@ -3,7 +3,7 @@ /** * @package Grav\Framework\Object * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Object/LazyObject.php b/system/src/Grav/Framework/Object/LazyObject.php index 752c5b2d7f..6be255884e 100644 --- a/system/src/Grav/Framework/Object/LazyObject.php +++ b/system/src/Grav/Framework/Object/LazyObject.php @@ -3,7 +3,7 @@ /** * @package Grav\Framework\Object * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Object/ObjectCollection.php b/system/src/Grav/Framework/Object/ObjectCollection.php index 4d23aa2cd0..94392af898 100644 --- a/system/src/Grav/Framework/Object/ObjectCollection.php +++ b/system/src/Grav/Framework/Object/ObjectCollection.php @@ -3,7 +3,7 @@ /** * @package Grav\Framework\Object * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Object/ObjectIndex.php b/system/src/Grav/Framework/Object/ObjectIndex.php index 1237233459..ab495bd76f 100644 --- a/system/src/Grav/Framework/Object/ObjectIndex.php +++ b/system/src/Grav/Framework/Object/ObjectIndex.php @@ -3,7 +3,7 @@ /** * @package Grav\Framework\Object * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Object/Property/ArrayPropertyTrait.php b/system/src/Grav/Framework/Object/Property/ArrayPropertyTrait.php index 6f935fe979..8ab4c41e4e 100644 --- a/system/src/Grav/Framework/Object/Property/ArrayPropertyTrait.php +++ b/system/src/Grav/Framework/Object/Property/ArrayPropertyTrait.php @@ -3,7 +3,7 @@ /** * @package Grav\Framework\Object * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Object/Property/LazyPropertyTrait.php b/system/src/Grav/Framework/Object/Property/LazyPropertyTrait.php index 99ad446ea4..e6892596a9 100644 --- a/system/src/Grav/Framework/Object/Property/LazyPropertyTrait.php +++ b/system/src/Grav/Framework/Object/Property/LazyPropertyTrait.php @@ -3,7 +3,7 @@ /** * @package Grav\Framework\Object * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Object/Property/MixedPropertyTrait.php b/system/src/Grav/Framework/Object/Property/MixedPropertyTrait.php index 584e812f39..1b57aab054 100644 --- a/system/src/Grav/Framework/Object/Property/MixedPropertyTrait.php +++ b/system/src/Grav/Framework/Object/Property/MixedPropertyTrait.php @@ -3,7 +3,7 @@ /** * @package Grav\Framework\Object * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Object/Property/ObjectPropertyTrait.php b/system/src/Grav/Framework/Object/Property/ObjectPropertyTrait.php index 435220a190..bb0195d660 100644 --- a/system/src/Grav/Framework/Object/Property/ObjectPropertyTrait.php +++ b/system/src/Grav/Framework/Object/Property/ObjectPropertyTrait.php @@ -3,7 +3,7 @@ /** * @package Grav\Framework\Object * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Object/PropertyObject.php b/system/src/Grav/Framework/Object/PropertyObject.php index fcd364c6c5..d9cdde83a9 100644 --- a/system/src/Grav/Framework/Object/PropertyObject.php +++ b/system/src/Grav/Framework/Object/PropertyObject.php @@ -3,7 +3,7 @@ /** * @package Grav\Framework\Object * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Pagination/AbstractPagination.php b/system/src/Grav/Framework/Pagination/AbstractPagination.php index 392bb77107..a4d902a2f6 100644 --- a/system/src/Grav/Framework/Pagination/AbstractPagination.php +++ b/system/src/Grav/Framework/Pagination/AbstractPagination.php @@ -3,7 +3,7 @@ /** * @package Grav\Framework\Pagination * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Pagination/AbstractPaginationPage.php b/system/src/Grav/Framework/Pagination/AbstractPaginationPage.php index 9461395892..072fea7672 100644 --- a/system/src/Grav/Framework/Pagination/AbstractPaginationPage.php +++ b/system/src/Grav/Framework/Pagination/AbstractPaginationPage.php @@ -3,7 +3,7 @@ /** * @package Grav\Framework\Pagination * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Pagination/Interfaces/PaginationInterface.php b/system/src/Grav/Framework/Pagination/Interfaces/PaginationInterface.php index b2f5c352b6..1a82147a11 100644 --- a/system/src/Grav/Framework/Pagination/Interfaces/PaginationInterface.php +++ b/system/src/Grav/Framework/Pagination/Interfaces/PaginationInterface.php @@ -3,7 +3,7 @@ /** * @package Grav\Framework\Pagination * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Pagination/Interfaces/PaginationPageInterface.php b/system/src/Grav/Framework/Pagination/Interfaces/PaginationPageInterface.php index b90594d71e..26c069262a 100644 --- a/system/src/Grav/Framework/Pagination/Interfaces/PaginationPageInterface.php +++ b/system/src/Grav/Framework/Pagination/Interfaces/PaginationPageInterface.php @@ -3,7 +3,7 @@ /** * @package Grav\Framework\Pagination * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Pagination/Pagination.php b/system/src/Grav/Framework/Pagination/Pagination.php index e602872d11..8f2fa203ca 100644 --- a/system/src/Grav/Framework/Pagination/Pagination.php +++ b/system/src/Grav/Framework/Pagination/Pagination.php @@ -3,7 +3,7 @@ /** * @package Grav\Framework\Pagination * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Pagination/PaginationPage.php b/system/src/Grav/Framework/Pagination/PaginationPage.php index 63ceb5f635..e64abe9c02 100644 --- a/system/src/Grav/Framework/Pagination/PaginationPage.php +++ b/system/src/Grav/Framework/Pagination/PaginationPage.php @@ -3,7 +3,7 @@ /** * @package Grav\Framework\Pagination * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Psr7/AbstractUri.php b/system/src/Grav/Framework/Psr7/AbstractUri.php index 771899578f..145437a587 100644 --- a/system/src/Grav/Framework/Psr7/AbstractUri.php +++ b/system/src/Grav/Framework/Psr7/AbstractUri.php @@ -3,7 +3,7 @@ /** * @package Grav\Framework\Psr7 * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Psr7/Request.php b/system/src/Grav/Framework/Psr7/Request.php index cd65fd98fa..795a1a46e7 100644 --- a/system/src/Grav/Framework/Psr7/Request.php +++ b/system/src/Grav/Framework/Psr7/Request.php @@ -5,7 +5,7 @@ /** * @package Grav\Framework\Psr7 * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Psr7/Response.php b/system/src/Grav/Framework/Psr7/Response.php index 6d8e68f683..6189c4a6f9 100644 --- a/system/src/Grav/Framework/Psr7/Response.php +++ b/system/src/Grav/Framework/Psr7/Response.php @@ -5,7 +5,7 @@ /** * @package Grav\Framework\Psr7 * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Psr7/ServerRequest.php b/system/src/Grav/Framework/Psr7/ServerRequest.php index 692e891a41..cb5bcbbd3b 100644 --- a/system/src/Grav/Framework/Psr7/ServerRequest.php +++ b/system/src/Grav/Framework/Psr7/ServerRequest.php @@ -5,7 +5,7 @@ /** * @package Grav\Framework\Psr7 * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Psr7/Stream.php b/system/src/Grav/Framework/Psr7/Stream.php index a5a1043635..6546bdc3e9 100644 --- a/system/src/Grav/Framework/Psr7/Stream.php +++ b/system/src/Grav/Framework/Psr7/Stream.php @@ -5,7 +5,7 @@ /** * @package Grav\Framework\Psr7 * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Psr7/Traits/MessageDecoratorTrait.php b/system/src/Grav/Framework/Psr7/Traits/MessageDecoratorTrait.php index 39e3818ce8..c09a03c285 100644 --- a/system/src/Grav/Framework/Psr7/Traits/MessageDecoratorTrait.php +++ b/system/src/Grav/Framework/Psr7/Traits/MessageDecoratorTrait.php @@ -5,7 +5,7 @@ /** * @package Grav\Framework\Psr7 * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Psr7/Traits/RequestDecoratorTrait.php b/system/src/Grav/Framework/Psr7/Traits/RequestDecoratorTrait.php index 13f4c6fd84..49f2a928ad 100644 --- a/system/src/Grav/Framework/Psr7/Traits/RequestDecoratorTrait.php +++ b/system/src/Grav/Framework/Psr7/Traits/RequestDecoratorTrait.php @@ -5,7 +5,7 @@ /** * @package Grav\Framework\Psr7 * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Psr7/Traits/ResponseDecoratorTrait.php b/system/src/Grav/Framework/Psr7/Traits/ResponseDecoratorTrait.php index 7b62c3c05f..4bbc73614a 100644 --- a/system/src/Grav/Framework/Psr7/Traits/ResponseDecoratorTrait.php +++ b/system/src/Grav/Framework/Psr7/Traits/ResponseDecoratorTrait.php @@ -5,7 +5,7 @@ /** * @package Grav\Framework\Psr7 * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Psr7/Traits/ServerRequestDecoratorTrait.php b/system/src/Grav/Framework/Psr7/Traits/ServerRequestDecoratorTrait.php index 33c26e0c7f..9222219e7f 100644 --- a/system/src/Grav/Framework/Psr7/Traits/ServerRequestDecoratorTrait.php +++ b/system/src/Grav/Framework/Psr7/Traits/ServerRequestDecoratorTrait.php @@ -5,7 +5,7 @@ /** * @package Grav\Framework\Psr7 * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Psr7/Traits/StreamDecoratorTrait.php b/system/src/Grav/Framework/Psr7/Traits/StreamDecoratorTrait.php index 358f18b476..448323fdbf 100644 --- a/system/src/Grav/Framework/Psr7/Traits/StreamDecoratorTrait.php +++ b/system/src/Grav/Framework/Psr7/Traits/StreamDecoratorTrait.php @@ -5,7 +5,7 @@ /** * @package Grav\Framework\Psr7 * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Psr7/Traits/UploadedFileDecoratorTrait.php b/system/src/Grav/Framework/Psr7/Traits/UploadedFileDecoratorTrait.php index e0c65bdddb..eec3add23c 100644 --- a/system/src/Grav/Framework/Psr7/Traits/UploadedFileDecoratorTrait.php +++ b/system/src/Grav/Framework/Psr7/Traits/UploadedFileDecoratorTrait.php @@ -5,7 +5,7 @@ /** * @package Grav\Framework\Psr7 * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Psr7/Traits/UriDecorationTrait.php b/system/src/Grav/Framework/Psr7/Traits/UriDecorationTrait.php index 607d7571f2..73adb6470a 100644 --- a/system/src/Grav/Framework/Psr7/Traits/UriDecorationTrait.php +++ b/system/src/Grav/Framework/Psr7/Traits/UriDecorationTrait.php @@ -5,7 +5,7 @@ /** * @package Grav\Framework\Psr7 * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Psr7/UploadedFile.php b/system/src/Grav/Framework/Psr7/UploadedFile.php index bfa63cdf42..c3ed62e69e 100644 --- a/system/src/Grav/Framework/Psr7/UploadedFile.php +++ b/system/src/Grav/Framework/Psr7/UploadedFile.php @@ -5,7 +5,7 @@ /** * @package Grav\Framework\Psr7 * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Psr7/Uri.php b/system/src/Grav/Framework/Psr7/Uri.php index bb88e937db..63fe04eff1 100644 --- a/system/src/Grav/Framework/Psr7/Uri.php +++ b/system/src/Grav/Framework/Psr7/Uri.php @@ -5,7 +5,7 @@ /** * @package Grav\Framework\Psr7 * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/RequestHandler/Exception/InvalidArgumentException.php b/system/src/Grav/Framework/RequestHandler/Exception/InvalidArgumentException.php index 451e58642e..2456ea1f59 100644 --- a/system/src/Grav/Framework/RequestHandler/Exception/InvalidArgumentException.php +++ b/system/src/Grav/Framework/RequestHandler/Exception/InvalidArgumentException.php @@ -3,7 +3,7 @@ /** * @package Grav\Framework\RequestHandler * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/RequestHandler/Exception/NotFoundException.php b/system/src/Grav/Framework/RequestHandler/Exception/NotFoundException.php index 40c9e0a814..ce79ab2ac8 100644 --- a/system/src/Grav/Framework/RequestHandler/Exception/NotFoundException.php +++ b/system/src/Grav/Framework/RequestHandler/Exception/NotFoundException.php @@ -3,7 +3,7 @@ /** * @package Grav\Framework\RequestHandler * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/RequestHandler/Exception/NotHandledException.php b/system/src/Grav/Framework/RequestHandler/Exception/NotHandledException.php index 1b18473f58..7b4a0e7d37 100644 --- a/system/src/Grav/Framework/RequestHandler/Exception/NotHandledException.php +++ b/system/src/Grav/Framework/RequestHandler/Exception/NotHandledException.php @@ -3,7 +3,7 @@ /** * @package Grav\Framework\RequestHandler * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/RequestHandler/Exception/PageExpiredException.php b/system/src/Grav/Framework/RequestHandler/Exception/PageExpiredException.php index 747c0ca5aa..f75216722d 100644 --- a/system/src/Grav/Framework/RequestHandler/Exception/PageExpiredException.php +++ b/system/src/Grav/Framework/RequestHandler/Exception/PageExpiredException.php @@ -3,7 +3,7 @@ /** * @package Grav\Framework\RequestHandler * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/RequestHandler/Exception/RequestException.php b/system/src/Grav/Framework/RequestHandler/Exception/RequestException.php index 60799644f7..678b26786f 100644 --- a/system/src/Grav/Framework/RequestHandler/Exception/RequestException.php +++ b/system/src/Grav/Framework/RequestHandler/Exception/RequestException.php @@ -3,7 +3,7 @@ /** * @package Grav\Framework\RequestHandler * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/RequestHandler/Middlewares/Exceptions.php b/system/src/Grav/Framework/RequestHandler/Middlewares/Exceptions.php index 9eadf72e3f..36ef3a53f5 100644 --- a/system/src/Grav/Framework/RequestHandler/Middlewares/Exceptions.php +++ b/system/src/Grav/Framework/RequestHandler/Middlewares/Exceptions.php @@ -3,7 +3,7 @@ /** * @package Grav\Framework\RequestHandler * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/RequestHandler/RequestHandler.php b/system/src/Grav/Framework/RequestHandler/RequestHandler.php index edd3178ff0..2ce2427f45 100644 --- a/system/src/Grav/Framework/RequestHandler/RequestHandler.php +++ b/system/src/Grav/Framework/RequestHandler/RequestHandler.php @@ -3,7 +3,7 @@ /** * @package Grav\Framework\RequestHandler * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/RequestHandler/Traits/RequestHandlerTrait.php b/system/src/Grav/Framework/RequestHandler/Traits/RequestHandlerTrait.php index 1b5a79e8dc..ff82889d43 100644 --- a/system/src/Grav/Framework/RequestHandler/Traits/RequestHandlerTrait.php +++ b/system/src/Grav/Framework/RequestHandler/Traits/RequestHandlerTrait.php @@ -3,7 +3,7 @@ /** * @package Grav\Framework\RequestHandler * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Route/Route.php b/system/src/Grav/Framework/Route/Route.php index 68cd6c2b30..d4d90780fa 100644 --- a/system/src/Grav/Framework/Route/Route.php +++ b/system/src/Grav/Framework/Route/Route.php @@ -3,7 +3,7 @@ /** * @package Grav\Framework\Route * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Route/RouteFactory.php b/system/src/Grav/Framework/Route/RouteFactory.php index 68baf55b60..fa1a76c303 100644 --- a/system/src/Grav/Framework/Route/RouteFactory.php +++ b/system/src/Grav/Framework/Route/RouteFactory.php @@ -3,7 +3,7 @@ /** * @package Grav\Framework\Route * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Session/Exceptions/SessionException.php b/system/src/Grav/Framework/Session/Exceptions/SessionException.php index 5ad948b67f..a07e87dc90 100644 --- a/system/src/Grav/Framework/Session/Exceptions/SessionException.php +++ b/system/src/Grav/Framework/Session/Exceptions/SessionException.php @@ -3,7 +3,7 @@ /** * @package Grav\Framework\Session * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Session/Messages.php b/system/src/Grav/Framework/Session/Messages.php index 5d854a2186..37c62a9af5 100644 --- a/system/src/Grav/Framework/Session/Messages.php +++ b/system/src/Grav/Framework/Session/Messages.php @@ -3,7 +3,7 @@ /** * @package Grav\Framework\Session * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Session/Session.php b/system/src/Grav/Framework/Session/Session.php index 53f3313317..108563e37c 100644 --- a/system/src/Grav/Framework/Session/Session.php +++ b/system/src/Grav/Framework/Session/Session.php @@ -3,7 +3,7 @@ /** * @package Grav\Framework\Session * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Session/SessionInterface.php b/system/src/Grav/Framework/Session/SessionInterface.php index a441791bd3..fa2873d9af 100644 --- a/system/src/Grav/Framework/Session/SessionInterface.php +++ b/system/src/Grav/Framework/Session/SessionInterface.php @@ -3,7 +3,7 @@ /** * @package Grav\Framework\Session * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Uri/Uri.php b/system/src/Grav/Framework/Uri/Uri.php index c43496ea93..6355a1fc93 100644 --- a/system/src/Grav/Framework/Uri/Uri.php +++ b/system/src/Grav/Framework/Uri/Uri.php @@ -3,7 +3,7 @@ /** * @package Grav\Framework\Uri * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Uri/UriFactory.php b/system/src/Grav/Framework/Uri/UriFactory.php index 6b4e7afc54..ebfec0356a 100644 --- a/system/src/Grav/Framework/Uri/UriFactory.php +++ b/system/src/Grav/Framework/Uri/UriFactory.php @@ -3,7 +3,7 @@ /** * @package Grav\Framework\Uri * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Framework/Uri/UriPartsFilter.php b/system/src/Grav/Framework/Uri/UriPartsFilter.php index 71a5135d6c..260711bf49 100644 --- a/system/src/Grav/Framework/Uri/UriPartsFilter.php +++ b/system/src/Grav/Framework/Uri/UriPartsFilter.php @@ -3,7 +3,7 @@ /** * @package Grav\Framework\Uri * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Installer/Install.php b/system/src/Grav/Installer/Install.php index 889b1d5e6c..0f23e8963a 100644 --- a/system/src/Grav/Installer/Install.php +++ b/system/src/Grav/Installer/Install.php @@ -3,7 +3,7 @@ /** * @package Grav\Installer * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Installer/InstallException.php b/system/src/Grav/Installer/InstallException.php index 145b7c9cc2..cdd5b7afa1 100644 --- a/system/src/Grav/Installer/InstallException.php +++ b/system/src/Grav/Installer/InstallException.php @@ -3,7 +3,7 @@ /** * @package Grav\Installer * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Installer/Versions.php b/system/src/Grav/Installer/Versions.php index 03f3b0b0fa..92a64ced78 100644 --- a/system/src/Grav/Installer/Versions.php +++ b/system/src/Grav/Installer/Versions.php @@ -3,7 +3,7 @@ /** * @package Grav\Installer * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/system/src/Grav/Installer/YamlUpdater.php b/system/src/Grav/Installer/YamlUpdater.php index 9af20558f2..ac562495ff 100644 --- a/system/src/Grav/Installer/YamlUpdater.php +++ b/system/src/Grav/Installer/YamlUpdater.php @@ -3,7 +3,7 @@ /** * @package Grav\Installer * - * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. + * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. * @license MIT License; see LICENSE file for details. */ diff --git a/tmp/.gitkeep b/tmp/.gitkeep index 33a9aed719..8efbf1f12e 100644 --- a/tmp/.gitkeep +++ b/tmp/.gitkeep @@ -1 +1 @@ -/* @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. */ +/* @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. */ diff --git a/user/accounts/.gitkeep b/user/accounts/.gitkeep index 33a9aed719..8efbf1f12e 100644 --- a/user/accounts/.gitkeep +++ b/user/accounts/.gitkeep @@ -1 +1 @@ -/* @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. */ +/* @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. */ diff --git a/user/data/.gitkeep b/user/data/.gitkeep index 33a9aed719..8efbf1f12e 100644 --- a/user/data/.gitkeep +++ b/user/data/.gitkeep @@ -1 +1 @@ -/* @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. */ +/* @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. */ diff --git a/user/plugins/.gitkeep b/user/plugins/.gitkeep index 33a9aed719..8efbf1f12e 100644 --- a/user/plugins/.gitkeep +++ b/user/plugins/.gitkeep @@ -1 +1 @@ -/* @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. */ +/* @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. */ diff --git a/user/themes/.gitkeep b/user/themes/.gitkeep index 33a9aed719..8efbf1f12e 100644 --- a/user/themes/.gitkeep +++ b/user/themes/.gitkeep @@ -1 +1 @@ -/* @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. */ +/* @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved. */ From b40b543790542f61df7b388fbdcce25dcf41db0f Mon Sep 17 00:00:00 2001 From: Andy Miller Date: Mon, 3 Jan 2022 09:50:34 -0700 Subject: [PATCH 83/83] prepare for release --- CHANGELOG.md | 2 +- system/defines.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 485dbe3c81..571eda6ac2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,5 @@ # v1.7.26 -## mm/dd/2021 +## 01/03/2022 1. [](#new) * Made `Grav::redirect()` to accept `Route` class diff --git a/system/defines.php b/system/defines.php index 6bacda3ac4..7cbae21b74 100644 --- a/system/defines.php +++ b/system/defines.php @@ -9,7 +9,7 @@ // Some standard defines define('GRAV', true); -define('GRAV_VERSION', '1.7.25'); +define('GRAV_VERSION', '1.7.26'); define('GRAV_SCHEMA', '1.7.0_2020-11-20_1'); define('GRAV_TESTING', false);