(Grav GitSync) Automatic Commit from smokephil

This commit is contained in:
smokephil 2025-01-17 09:13:21 +01:00 committed by GitSync
parent 88e07926d9
commit 9d9feba04b
144 changed files with 7311 additions and 5467 deletions

View file

@ -7,6 +7,6 @@ menu: LT24
taxonomy:
tag:
- hidden
published: false
published: true
---

View file

@ -1,3 +1,17 @@
# v1.10.48
## 10/28/2024
1. [](#improved)
* Treat AVIF as image when inserting / drag & dropping
* PHP 8.4 fixes - Implicitly nullable parameter declarations deprecate
# v1.10.47
## 10/22/2024
1. [](#improved)
* Added missing `show_label` logic in list field
* Use plugin's selected icon when in plugin properties
# v1.10.46
## 05/15/2024

View file

@ -1,7 +1,7 @@
name: Admin Panel
slug: admin
type: plugin
version: 1.10.46
version: 1.10.48
description: Adds an advanced administration panel to manage your site
icon: empire
author:

View file

@ -904,7 +904,7 @@ class Admin
* @return object
* @throws \RuntimeException
*/
public function getConfigurationData($type, array $post = null)
public function getConfigurationData($type, ?array $post = null)
{
static $data = [];

View file

@ -62,7 +62,7 @@ class AdminController extends AdminBaseController
* @param array|null $post
* @return void
*/
public function initialize(Grav $grav = null, $view = null, $task = null, $route = null, $post = null)
public function initialize(?Grav $grav = null, $view = null, $task = null, $route = null, $post = null)
{
$this->grav = $grav;
$this->admin = $this->grav['admin'];
@ -2717,7 +2717,7 @@ class AdminController extends AdminBaseController
* @param PageInterface|null $page
* @return Media|null
*/
public function getMedia(PageInterface $page = null)
public function getMedia(?PageInterface $page = null)
{
$page = $page ?? $this->admin->page($this->route);
if (!$page) {

View file

@ -140,7 +140,7 @@ abstract class AbstractController implements RequestHandlerInterface
* @param mixed $default
* @return mixed
*/
public function getPost(string $name = null, $default = null)
public function getPost(?string $name = null, $default = null)
{
$body = $this->request->getParsedBody();
@ -167,7 +167,7 @@ abstract class AbstractController implements RequestHandlerInterface
* @param string|null $type
* @return FormInterface
*/
public function getForm(string $type = null): FormInterface
public function getForm(?string $type = null): FormInterface
{
$object = $this->getObject();
if (!$object) {
@ -227,7 +227,7 @@ abstract class AbstractController implements RequestHandlerInterface
* @param int $code
* @return Response
*/
public function createHtmlResponse(string $content, int $code = null): ResponseInterface
public function createHtmlResponse(string $content, ?int $code = null): ResponseInterface
{
return new Response($code ?: 200, [], $content);
}
@ -255,7 +255,7 @@ abstract class AbstractController implements RequestHandlerInterface
* @param int $code
* @return Response
*/
public function createRedirectResponse(string $url, int $code = null): ResponseInterface
public function createRedirectResponse(string $url, ?int $code = null): ResponseInterface
{
if (null === $code || $code < 301 || $code > 307) {
$code = $this->grav['config']->get('system.pages.redirect_default_code', 302);

View file

@ -117,7 +117,7 @@ abstract class AdminController
* @param string|null $lang
* @return string
*/
public function getAdminUrl(string $route, string $lang = null): string
public function getAdminUrl(string $route, ?string $lang = null): string
{
/** @var Pages $pages */
$pages = $this->grav['pages'];
@ -131,7 +131,7 @@ abstract class AdminController
* @param string|null $lang
* @return string
*/
public function getAbsoluteAdminUrl(string $route, string $lang = null): string
public function getAbsoluteAdminUrl(string $route, ?string $lang = null): string
{
/** @var Pages $pages */
$pages = $this->grav['pages'];
@ -319,7 +319,7 @@ abstract class AdminController
* @param int|null $code
* @return ResponseInterface
*/
protected function createRedirectResponse(string $url = null, int $code = null): ResponseInterface
protected function createRedirectResponse(?string $url = null, ?int $code = null): ResponseInterface
{
$request = $this->getRequest();

View file

@ -71,7 +71,7 @@ class LoginController extends AdminController
* @param string|null $token
* @return ResponseInterface
*/
public function displayReset(string $username = null, string $token = null): ResponseInterface
public function displayReset(?string $username = null, ?string $token = null): ResponseInterface
{
if ('' === (string)$username || '' === (string)$token) {
$this->setMessage($this->translate('PLUGIN_ADMIN.RESET_INVALID_LINK'), 'error');
@ -318,7 +318,7 @@ class LoginController extends AdminController
* @param string|null $token
* @return ResponseInterface
*/
public function taskReset(string $username = null, string $token = null): ResponseInterface
public function taskReset(?string $username = null, ?string $token = null): ResponseInterface
{
$this->page = $this->createPage('reset');
$this->form = $this->getForm('admin-login-reset');

View file

@ -83,7 +83,7 @@ class AdminTwigExtension extends AbstractExtension
return clone $obj;
}
public function adminRouteFunc(string $route = '', string $languageCode = null)
public function adminRouteFunc(string $route = '', ?string $languageCode = null)
{
/** @var Admin $admin */
$admin = Grav::instance()['admin'];

View file

@ -80,7 +80,7 @@ export default class FilePickerField {
let renderOption = function renderOption(item, escape) {
let image = '';
if (imagesPreview && folder && (!item.status || item.status === 'available') && item.name.match(/\.(jpg|jpeg|png|gif|webp)$/i)) {
if (imagesPreview && folder && (!item.status || item.status === 'available') && item.name.match(/\.(jpg|jpeg|png|gif|webp|avif)$/i)) {
// const fallback2x = insertTextAt(`${config.base_url_relative}/../${folder}/${item.name}`, -4, '@2x');
// const fallback3x = insertTextAt(`${config.base_url_relative}/../${folder}/${item.name}`, -4, '@3x');
const source = thumbs[item.name] || `${config.base_url_relative}/../${folder}/${item.name}`;

View file

@ -349,7 +349,7 @@ export function UriToMarkdown(uri) {
const title = uri.split('.').slice(0, -1).join('.');
return uri.match(/\.(jpe?g|png|gif|svg|webp|mp4|webm|ogv|mov)$/i) ? `![${title}](${uri} "${title}")` : `[${decodeURI(uri)}](${uri})`;
return uri.match(/\.(jpe?g|png|gif|svg|webp|avif|mp4|webm|ogv|mov)$/i) ? `![${title}](${uri} "${title}")` : `[${decodeURI(uri)}](${uri})`;
}
let instances = [];

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -19,6 +19,7 @@
<label for="toggleable_{{ field.name }}"></label>
</span>
{% endif %}
{% if show_label %}
<label{{ (field.toggleable ? ' class="toggleable ' ~ field.labelclasses ~ '" for="toggleable_' ~ field.name ~ '"' : ' class="' ~ field.labelclasses ~ '"')|raw }}>
{% if field.help %}
{% if field.markdown %}
@ -31,6 +32,7 @@
{% endif %}
{{ field.validate.required in ['on', 'true', 1] ? '<span class="required">*</span>' }}
</label>
{% endif %}
{% if field.description %}
<div class="form-extra-wrapper {{ field.wrapper_classes }}">
<span class="form-description">{{ field.description|t|markdown(false)|raw }}</span>

View file

@ -68,7 +68,7 @@
</div>
{% endif %}
<h1><i class="fa fa-fw fa-plug"></i> {{ "PLUGIN_ADMIN.PLUGIN"|t }}: {{ plugin.name }}</h1>
<h1><i class="fa fa-fw fa-{{ plugin.icon ?? 'plug' }}"></i> {{ "PLUGIN_ADMIN.PLUGIN"|t }}: {{ plugin.name }}</h1>
{% endif %}
{% endblock %}

View file

@ -1,3 +1,16 @@
# v4.1.2
## 01/06/2025
1. [](#improved)
* Updated to latest symfony libraries (`v5.4.45`)
* Added a note about Google App Passwords for authentication in the README.md
# v4.1.1
## 10/28/2024
1. [](#improved)
* Updated logging methods to support Monolog2+
# v4.1.0
## 04/09/2024

View file

@ -72,7 +72,9 @@ More plugins will be released soon to support `Gmail`, `Mailgun`, `Mailjet`, `Oh
A popular option for sending email is to simply use your Google Accounts SMTP server. To set this up you will need to do 2 things first:
As Gmail no longer supports the "allow less secure apps" option, you now need to have 2FA enabled on the account and setup an "App Password" to create a specific password rather than your general account password. Follow these instructions: [https://support.google.com/accounts/answer/185833](https://support.google.com/accounts/answer/185833)
As Gmail no longer supports the "allow less secure apps" option, you now need to have 2FA enabled on the account and setup an "App Password" to create a specific password rather than your general account password. Follow these instructions: [https://support.google.com/accounts/answer/185833](https://support.google.com/accounts/answer/185833).
!! Important: When Google creates an app password for you it will look something like `pxzl vkxd xdap fomb`, you should make sure to remove the spaces when you store your password so it looks like `pxzlvkxdxdapfomb`. Also make sure you are sending from the same email address as the one you are using to authenticate with.
Then configure the Email plugin:

View file

@ -1,7 +1,7 @@
name: Email
slug: email
type: plugin
version: 4.1.0
version: 4.1.2
testing: false
description: Enables the emailing system for Grav
icon: envelope

View file

@ -106,7 +106,7 @@ class Email
$log_msg = "Email sent to %s at %s -> %s\n%s";
$to = $this->jsonifyRecipients($message->getEmail()->getTo());
$message = sprintf($log_msg, $to, date('Y-m-d H:i:s'), $this->message, $this->debug);
$this->log->addInfo($message);
$this->log->info($message);
}
return $status;

View file

@ -8,29 +8,27 @@
"packages": [
{
"name": "doctrine/deprecations",
"version": "1.1.3",
"version": "1.1.4",
"source": {
"type": "git",
"url": "https://github.com/doctrine/deprecations.git",
"reference": "dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab"
"reference": "31610dbb31faa98e6b5447b62340826f54fbc4e9"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/doctrine/deprecations/zipball/dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab",
"reference": "dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab",
"url": "https://api.github.com/repos/doctrine/deprecations/zipball/31610dbb31faa98e6b5447b62340826f54fbc4e9",
"reference": "31610dbb31faa98e6b5447b62340826f54fbc4e9",
"shasum": ""
},
"require": {
"php": "^7.1 || ^8.0"
},
"require-dev": {
"doctrine/coding-standard": "^9",
"phpstan/phpstan": "1.4.10 || 1.10.15",
"phpstan/phpstan-phpunit": "^1.0",
"doctrine/coding-standard": "^9 || ^12",
"phpstan/phpstan": "1.4.10 || 2.0.3",
"phpstan/phpstan-phpunit": "^1.0 || ^2",
"phpunit/phpunit": "^7.5 || ^8.5 || ^9.5",
"psalm/plugin-phpunit": "0.18.4",
"psr/log": "^1 || ^2 || ^3",
"vimeo/psalm": "4.30.0 || 5.12.0"
"psr/log": "^1 || ^2 || ^3"
},
"suggest": {
"psr/log": "Allows logging deprecations via PSR-3 logger implementation"
@ -38,7 +36,7 @@
"type": "library",
"autoload": {
"psr-4": {
"Doctrine\\Deprecations\\": "lib/Doctrine/Deprecations"
"Doctrine\\Deprecations\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
@ -49,9 +47,9 @@
"homepage": "https://www.doctrine-project.org/",
"support": {
"issues": "https://github.com/doctrine/deprecations/issues",
"source": "https://github.com/doctrine/deprecations/tree/1.1.3"
"source": "https://github.com/doctrine/deprecations/tree/1.1.4"
},
"time": "2024-01-30T19:34:25+00:00"
"time": "2024-12-07T21:18:45+00:00"
},
{
"name": "doctrine/lexer",
@ -348,16 +346,16 @@
},
{
"name": "symfony/amqp-messenger",
"version": "v5.4.36",
"version": "v5.4.45",
"source": {
"type": "git",
"url": "https://github.com/symfony/amqp-messenger.git",
"reference": "456958ef89fffddc3935f3954a7eac255a5adb21"
"reference": "822ad5f425ef362580273a175c45aa765220fe73"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/amqp-messenger/zipball/456958ef89fffddc3935f3954a7eac255a5adb21",
"reference": "456958ef89fffddc3935f3954a7eac255a5adb21",
"url": "https://api.github.com/repos/symfony/amqp-messenger/zipball/822ad5f425ef362580273a175c45aa765220fe73",
"reference": "822ad5f425ef362580273a175c45aa765220fe73",
"shasum": ""
},
"require": {
@ -397,7 +395,7 @@
"description": "Symfony AMQP extension Messenger Bridge",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/amqp-messenger/tree/v5.4.36"
"source": "https://github.com/symfony/amqp-messenger/tree/v5.4.45"
},
"funding": [
{
@ -413,20 +411,20 @@
"type": "tidelift"
}
],
"time": "2024-02-14T16:15:37+00:00"
"time": "2024-09-25T14:11:13+00:00"
},
{
"name": "symfony/deprecation-contracts",
"version": "v2.5.3",
"version": "v2.5.4",
"source": {
"type": "git",
"url": "https://github.com/symfony/deprecation-contracts.git",
"reference": "80d075412b557d41002320b96a096ca65aa2c98d"
"reference": "605389f2a7e5625f273b53960dc46aeaf9c62918"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/80d075412b557d41002320b96a096ca65aa2c98d",
"reference": "80d075412b557d41002320b96a096ca65aa2c98d",
"url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/605389f2a7e5625f273b53960dc46aeaf9c62918",
"reference": "605389f2a7e5625f273b53960dc46aeaf9c62918",
"shasum": ""
},
"require": {
@ -434,12 +432,12 @@
},
"type": "library",
"extra": {
"thanks": {
"url": "https://github.com/symfony/contracts",
"name": "symfony/contracts"
},
"branch-alias": {
"dev-main": "2.5-dev"
},
"thanks": {
"name": "symfony/contracts",
"url": "https://github.com/symfony/contracts"
}
},
"autoload": {
@ -464,7 +462,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.5.3"
"source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.4"
},
"funding": [
{
@ -480,20 +478,20 @@
"type": "tidelift"
}
],
"time": "2023-01-24T14:02:46+00:00"
"time": "2024-09-25T14:11:13+00:00"
},
{
"name": "symfony/doctrine-messenger",
"version": "v5.4.38",
"version": "v5.4.45",
"source": {
"type": "git",
"url": "https://github.com/symfony/doctrine-messenger.git",
"reference": "0118ae0beaebeb5961ddeedc994454e1ac11f759"
"reference": "3f5a6e1876fbf57e836ba0a02eb0a636e08c0d96"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/doctrine-messenger/zipball/0118ae0beaebeb5961ddeedc994454e1ac11f759",
"reference": "0118ae0beaebeb5961ddeedc994454e1ac11f759",
"url": "https://api.github.com/repos/symfony/doctrine-messenger/zipball/3f5a6e1876fbf57e836ba0a02eb0a636e08c0d96",
"reference": "3f5a6e1876fbf57e836ba0a02eb0a636e08c0d96",
"shasum": ""
},
"require": {
@ -537,7 +535,7 @@
"description": "Symfony Doctrine Messenger Bridge",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/doctrine-messenger/tree/v5.4.38"
"source": "https://github.com/symfony/doctrine-messenger/tree/v5.4.45"
},
"funding": [
{
@ -553,20 +551,20 @@
"type": "tidelift"
}
],
"time": "2024-03-17T15:02:26+00:00"
"time": "2024-09-25T14:11:13+00:00"
},
{
"name": "symfony/event-dispatcher",
"version": "v5.4.35",
"version": "v5.4.45",
"source": {
"type": "git",
"url": "https://github.com/symfony/event-dispatcher.git",
"reference": "7a69a85c7ea5bdd1e875806a99c51a87d3a74b38"
"reference": "72982eb416f61003e9bb6e91f8b3213600dcf9e9"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/7a69a85c7ea5bdd1e875806a99c51a87d3a74b38",
"reference": "7a69a85c7ea5bdd1e875806a99c51a87d3a74b38",
"url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/72982eb416f61003e9bb6e91f8b3213600dcf9e9",
"reference": "72982eb416f61003e9bb6e91f8b3213600dcf9e9",
"shasum": ""
},
"require": {
@ -622,7 +620,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/v5.4.35"
"source": "https://github.com/symfony/event-dispatcher/tree/v5.4.45"
},
"funding": [
{
@ -638,20 +636,20 @@
"type": "tidelift"
}
],
"time": "2024-01-23T13:51:25+00:00"
"time": "2024-09-25T14:11:13+00:00"
},
{
"name": "symfony/event-dispatcher-contracts",
"version": "v2.5.3",
"version": "v2.5.4",
"source": {
"type": "git",
"url": "https://github.com/symfony/event-dispatcher-contracts.git",
"reference": "540f4c73e87fd0c71ca44a6aa305d024ac68cb73"
"reference": "e0fe3d79b516eb75126ac6fa4cbf19b79b08c99f"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/540f4c73e87fd0c71ca44a6aa305d024ac68cb73",
"reference": "540f4c73e87fd0c71ca44a6aa305d024ac68cb73",
"url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/e0fe3d79b516eb75126ac6fa4cbf19b79b08c99f",
"reference": "e0fe3d79b516eb75126ac6fa4cbf19b79b08c99f",
"shasum": ""
},
"require": {
@ -663,12 +661,12 @@
},
"type": "library",
"extra": {
"thanks": {
"url": "https://github.com/symfony/contracts",
"name": "symfony/contracts"
},
"branch-alias": {
"dev-main": "2.5-dev"
},
"thanks": {
"name": "symfony/contracts",
"url": "https://github.com/symfony/contracts"
}
},
"autoload": {
@ -701,7 +699,7 @@
"standards"
],
"support": {
"source": "https://github.com/symfony/event-dispatcher-contracts/tree/v2.5.3"
"source": "https://github.com/symfony/event-dispatcher-contracts/tree/v2.5.4"
},
"funding": [
{
@ -717,20 +715,20 @@
"type": "tidelift"
}
],
"time": "2024-01-23T13:51:25+00:00"
"time": "2024-09-25T14:11:13+00:00"
},
{
"name": "symfony/mailer",
"version": "v5.4.38",
"version": "v5.4.45",
"source": {
"type": "git",
"url": "https://github.com/symfony/mailer.git",
"reference": "1d0ef27f1b19b9a0175a0e130d1df3113e5a130e"
"reference": "f732e1fafdf0f4a2d865e91f1018aaca174aeed9"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/mailer/zipball/1d0ef27f1b19b9a0175a0e130d1df3113e5a130e",
"reference": "1d0ef27f1b19b9a0175a0e130d1df3113e5a130e",
"url": "https://api.github.com/repos/symfony/mailer/zipball/f732e1fafdf0f4a2d865e91f1018aaca174aeed9",
"reference": "f732e1fafdf0f4a2d865e91f1018aaca174aeed9",
"shasum": ""
},
"require": {
@ -777,7 +775,7 @@
"description": "Helps sending emails",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/mailer/tree/v5.4.38"
"source": "https://github.com/symfony/mailer/tree/v5.4.45"
},
"funding": [
{
@ -793,20 +791,20 @@
"type": "tidelift"
}
],
"time": "2024-03-19T10:19:25+00:00"
"time": "2024-09-25T14:11:13+00:00"
},
{
"name": "symfony/messenger",
"version": "v5.4.38",
"version": "v5.4.45",
"source": {
"type": "git",
"url": "https://github.com/symfony/messenger.git",
"reference": "a69a4d07e20e4f298a5c030623a1a3328145a889"
"reference": "c21d463ba813a3fe9833f46114310fac99bd66e0"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/messenger/zipball/a69a4d07e20e4f298a5c030623a1a3328145a889",
"reference": "a69a4d07e20e4f298a5c030623a1a3328145a889",
"url": "https://api.github.com/repos/symfony/messenger/zipball/c21d463ba813a3fe9833f46114310fac99bd66e0",
"reference": "c21d463ba813a3fe9833f46114310fac99bd66e0",
"shasum": ""
},
"require": {
@ -867,7 +865,7 @@
"description": "Helps applications send and receive messages to/from other applications or via message queues",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/messenger/tree/v5.4.38"
"source": "https://github.com/symfony/messenger/tree/v5.4.45"
},
"funding": [
{
@ -883,20 +881,20 @@
"type": "tidelift"
}
],
"time": "2024-03-19T10:19:25+00:00"
"time": "2024-09-25T14:11:13+00:00"
},
{
"name": "symfony/mime",
"version": "v5.4.38",
"version": "v5.4.45",
"source": {
"type": "git",
"url": "https://github.com/symfony/mime.git",
"reference": "82fa6be8a0295a3932df871e88fc8c8d77aa71d4"
"reference": "8c1b9b3e5b52981551fc6044539af1d974e39064"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/mime/zipball/82fa6be8a0295a3932df871e88fc8c8d77aa71d4",
"reference": "82fa6be8a0295a3932df871e88fc8c8d77aa71d4",
"url": "https://api.github.com/repos/symfony/mime/zipball/8c1b9b3e5b52981551fc6044539af1d974e39064",
"reference": "8c1b9b3e5b52981551fc6044539af1d974e39064",
"shasum": ""
},
"require": {
@ -952,7 +950,7 @@
"mime-type"
],
"support": {
"source": "https://github.com/symfony/mime/tree/v5.4.38"
"source": "https://github.com/symfony/mime/tree/v5.4.45"
},
"funding": [
{
@ -968,26 +966,25 @@
"type": "tidelift"
}
],
"time": "2024-03-21T07:25:32+00:00"
"time": "2024-10-23T20:18:32+00:00"
},
{
"name": "symfony/polyfill-intl-idn",
"version": "v1.29.0",
"version": "v1.31.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-intl-idn.git",
"reference": "a287ed7475f85bf6f61890146edbc932c0fff919"
"reference": "c36586dcf89a12315939e00ec9b4474adcb1d773"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/a287ed7475f85bf6f61890146edbc932c0fff919",
"reference": "a287ed7475f85bf6f61890146edbc932c0fff919",
"url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/c36586dcf89a12315939e00ec9b4474adcb1d773",
"reference": "c36586dcf89a12315939e00ec9b4474adcb1d773",
"shasum": ""
},
"require": {
"php": ">=7.1",
"symfony/polyfill-intl-normalizer": "^1.10",
"symfony/polyfill-php72": "^1.10"
"php": ">=7.2",
"symfony/polyfill-intl-normalizer": "^1.10"
},
"suggest": {
"ext-intl": "For best performance"
@ -995,8 +992,8 @@
"type": "library",
"extra": {
"thanks": {
"name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill"
"url": "https://github.com/symfony/polyfill",
"name": "symfony/polyfill"
}
},
"autoload": {
@ -1036,7 +1033,7 @@
"shim"
],
"support": {
"source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.29.0"
"source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.31.0"
},
"funding": [
{
@ -1052,24 +1049,24 @@
"type": "tidelift"
}
],
"time": "2024-01-29T20:11:03+00:00"
"time": "2024-09-09T11:45:10+00:00"
},
{
"name": "symfony/polyfill-intl-normalizer",
"version": "v1.29.0",
"version": "v1.31.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-intl-normalizer.git",
"reference": "bc45c394692b948b4d383a08d7753968bed9a83d"
"reference": "3833d7255cc303546435cb650316bff708a1c75c"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/bc45c394692b948b4d383a08d7753968bed9a83d",
"reference": "bc45c394692b948b4d383a08d7753968bed9a83d",
"url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c",
"reference": "3833d7255cc303546435cb650316bff708a1c75c",
"shasum": ""
},
"require": {
"php": ">=7.1"
"php": ">=7.2"
},
"suggest": {
"ext-intl": "For best performance"
@ -1077,8 +1074,8 @@
"type": "library",
"extra": {
"thanks": {
"name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill"
"url": "https://github.com/symfony/polyfill",
"name": "symfony/polyfill"
}
},
"autoload": {
@ -1117,7 +1114,7 @@
"shim"
],
"support": {
"source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.29.0"
"source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.31.0"
},
"funding": [
{
@ -1133,30 +1130,30 @@
"type": "tidelift"
}
],
"time": "2024-01-29T20:11:03+00:00"
"time": "2024-09-09T11:45:10+00:00"
},
{
"name": "symfony/polyfill-php80",
"version": "v1.29.0",
"version": "v1.31.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-php80.git",
"reference": "87b68208d5c1188808dd7839ee1e6c8ec3b02f1b"
"reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/87b68208d5c1188808dd7839ee1e6c8ec3b02f1b",
"reference": "87b68208d5c1188808dd7839ee1e6c8ec3b02f1b",
"url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/60328e362d4c2c802a54fcbf04f9d3fb892b4cf8",
"reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8",
"shasum": ""
},
"require": {
"php": ">=7.1"
"php": ">=7.2"
},
"type": "library",
"extra": {
"thanks": {
"name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill"
"url": "https://github.com/symfony/polyfill",
"name": "symfony/polyfill"
}
},
"autoload": {
@ -1197,7 +1194,7 @@
"shim"
],
"support": {
"source": "https://github.com/symfony/polyfill-php80/tree/v1.29.0"
"source": "https://github.com/symfony/polyfill-php80/tree/v1.31.0"
},
"funding": [
{
@ -1213,20 +1210,20 @@
"type": "tidelift"
}
],
"time": "2024-01-29T20:11:03+00:00"
"time": "2024-09-09T11:45:10+00:00"
},
{
"name": "symfony/redis-messenger",
"version": "v5.4.36",
"version": "v5.4.48",
"source": {
"type": "git",
"url": "https://github.com/symfony/redis-messenger.git",
"reference": "54b107003c5abc03cc5077c8847678b432b1e602"
"reference": "a097e8c6529a7179a732161bd5368629c6319899"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/redis-messenger/zipball/54b107003c5abc03cc5077c8847678b432b1e602",
"reference": "54b107003c5abc03cc5077c8847678b432b1e602",
"url": "https://api.github.com/repos/symfony/redis-messenger/zipball/a097e8c6529a7179a732161bd5368629c6319899",
"reference": "a097e8c6529a7179a732161bd5368629c6319899",
"shasum": ""
},
"require": {
@ -1264,7 +1261,7 @@
"description": "Symfony Redis extension Messenger Bridge",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/redis-messenger/tree/v5.4.36"
"source": "https://github.com/symfony/redis-messenger/tree/v5.4.48"
},
"funding": [
{
@ -1280,20 +1277,20 @@
"type": "tidelift"
}
],
"time": "2024-02-05T13:56:32+00:00"
"time": "2024-11-13T13:58:00+00:00"
},
{
"name": "symfony/service-contracts",
"version": "v2.5.3",
"version": "v2.5.4",
"source": {
"type": "git",
"url": "https://github.com/symfony/service-contracts.git",
"reference": "a2329596ddc8fd568900e3fc76cba42489ecc7f3"
"reference": "f37b419f7aea2e9abf10abd261832cace12e3300"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/service-contracts/zipball/a2329596ddc8fd568900e3fc76cba42489ecc7f3",
"reference": "a2329596ddc8fd568900e3fc76cba42489ecc7f3",
"url": "https://api.github.com/repos/symfony/service-contracts/zipball/f37b419f7aea2e9abf10abd261832cace12e3300",
"reference": "f37b419f7aea2e9abf10abd261832cace12e3300",
"shasum": ""
},
"require": {
@ -1309,12 +1306,12 @@
},
"type": "library",
"extra": {
"thanks": {
"url": "https://github.com/symfony/contracts",
"name": "symfony/contracts"
},
"branch-alias": {
"dev-main": "2.5-dev"
},
"thanks": {
"name": "symfony/contracts",
"url": "https://github.com/symfony/contracts"
}
},
"autoload": {
@ -1347,7 +1344,7 @@
"standards"
],
"support": {
"source": "https://github.com/symfony/service-contracts/tree/v2.5.3"
"source": "https://github.com/symfony/service-contracts/tree/v2.5.4"
},
"funding": [
{
@ -1363,19 +1360,19 @@
"type": "tidelift"
}
],
"time": "2023-04-21T15:04:16+00:00"
"time": "2024-09-25T14:11:13+00:00"
}
],
"packages-dev": [],
"aliases": [],
"minimum-stability": "stable",
"stability-flags": [],
"stability-flags": {},
"prefer-stable": false,
"prefer-lowest": false,
"platform": {
"php": ">=7.3.6"
},
"platform-dev": [],
"platform-dev": {},
"platform-overrides": {
"php": "7.3.6"
},

View file

@ -322,6 +322,7 @@ class InstalledVersions
}
$installed = array();
$copiedLocalDir = false;
if (self::$canGetVendors) {
foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) {
@ -330,9 +331,11 @@ class InstalledVersions
} elseif (is_file($vendorDir.'/composer/installed.php')) {
/** @var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>} $required */
$required = require $vendorDir.'/composer/installed.php';
$installed[] = self::$installedByVendor[$vendorDir] = $required;
if (null === self::$installed && strtr($vendorDir.'/composer', '\\', '/') === strtr(__DIR__, '\\', '/')) {
self::$installed = $installed[count($installed) - 1];
self::$installedByVendor[$vendorDir] = $required;
$installed[] = $required;
if (strtr($vendorDir.'/composer', '\\', '/') === strtr(__DIR__, '\\', '/')) {
self::$installed = $required;
$copiedLocalDir = true;
}
}
}
@ -350,7 +353,7 @@ class InstalledVersions
}
}
if (self::$installed !== array()) {
if (self::$installed !== array() && !$copiedLocalDir) {
$installed[] = self::$installed;
}

View file

@ -24,6 +24,6 @@ return array(
'Grav\\Plugin\\Email\\' => array($baseDir . '/classes'),
'Grav\\Plugin\\Console\\' => array($baseDir . '/cli'),
'Egulias\\EmailValidator\\' => array($vendorDir . '/egulias/email-validator/src'),
'Doctrine\\Deprecations\\' => array($vendorDir . '/doctrine/deprecations/lib/Doctrine/Deprecations'),
'Doctrine\\Deprecations\\' => array($vendorDir . '/doctrine/deprecations/src'),
'Doctrine\\Common\\Lexer\\' => array($vendorDir . '/doctrine/lexer/src'),
);

View file

@ -126,7 +126,7 @@ class ComposerStaticInit73924571ea6ee98bb12d10ff20aff2ab
),
'Doctrine\\Deprecations\\' =>
array (
0 => __DIR__ . '/..' . '/doctrine/deprecations/lib/Doctrine/Deprecations',
0 => __DIR__ . '/..' . '/doctrine/deprecations/src',
),
'Doctrine\\Common\\Lexer\\' =>
array (

View file

@ -2,40 +2,38 @@
"packages": [
{
"name": "doctrine/deprecations",
"version": "1.1.3",
"version_normalized": "1.1.3.0",
"version": "1.1.4",
"version_normalized": "1.1.4.0",
"source": {
"type": "git",
"url": "https://github.com/doctrine/deprecations.git",
"reference": "dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab"
"reference": "31610dbb31faa98e6b5447b62340826f54fbc4e9"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/doctrine/deprecations/zipball/dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab",
"reference": "dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab",
"url": "https://api.github.com/repos/doctrine/deprecations/zipball/31610dbb31faa98e6b5447b62340826f54fbc4e9",
"reference": "31610dbb31faa98e6b5447b62340826f54fbc4e9",
"shasum": ""
},
"require": {
"php": "^7.1 || ^8.0"
},
"require-dev": {
"doctrine/coding-standard": "^9",
"phpstan/phpstan": "1.4.10 || 1.10.15",
"phpstan/phpstan-phpunit": "^1.0",
"doctrine/coding-standard": "^9 || ^12",
"phpstan/phpstan": "1.4.10 || 2.0.3",
"phpstan/phpstan-phpunit": "^1.0 || ^2",
"phpunit/phpunit": "^7.5 || ^8.5 || ^9.5",
"psalm/plugin-phpunit": "0.18.4",
"psr/log": "^1 || ^2 || ^3",
"vimeo/psalm": "4.30.0 || 5.12.0"
"psr/log": "^1 || ^2 || ^3"
},
"suggest": {
"psr/log": "Allows logging deprecations via PSR-3 logger implementation"
},
"time": "2024-01-30T19:34:25+00:00",
"time": "2024-12-07T21:18:45+00:00",
"type": "library",
"installation-source": "dist",
"autoload": {
"psr-4": {
"Doctrine\\Deprecations\\": "lib/Doctrine/Deprecations"
"Doctrine\\Deprecations\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
@ -46,7 +44,7 @@
"homepage": "https://www.doctrine-project.org/",
"support": {
"issues": "https://github.com/doctrine/deprecations/issues",
"source": "https://github.com/doctrine/deprecations/tree/1.1.3"
"source": "https://github.com/doctrine/deprecations/tree/1.1.4"
},
"install-path": "../doctrine/deprecations"
},
@ -360,17 +358,17 @@
},
{
"name": "symfony/amqp-messenger",
"version": "v5.4.36",
"version_normalized": "5.4.36.0",
"version": "v5.4.45",
"version_normalized": "5.4.45.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/amqp-messenger.git",
"reference": "456958ef89fffddc3935f3954a7eac255a5adb21"
"reference": "822ad5f425ef362580273a175c45aa765220fe73"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/amqp-messenger/zipball/456958ef89fffddc3935f3954a7eac255a5adb21",
"reference": "456958ef89fffddc3935f3954a7eac255a5adb21",
"url": "https://api.github.com/repos/symfony/amqp-messenger/zipball/822ad5f425ef362580273a175c45aa765220fe73",
"reference": "822ad5f425ef362580273a175c45aa765220fe73",
"shasum": ""
},
"require": {
@ -384,7 +382,7 @@
"symfony/property-access": "^4.4|^5.0|^6.0",
"symfony/serializer": "^4.4|^5.0|^6.0"
},
"time": "2024-02-14T16:15:37+00:00",
"time": "2024-09-25T14:11:13+00:00",
"type": "symfony-messenger-bridge",
"installation-source": "dist",
"autoload": {
@ -412,7 +410,7 @@
"description": "Symfony AMQP extension Messenger Bridge",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/amqp-messenger/tree/v5.4.36"
"source": "https://github.com/symfony/amqp-messenger/tree/v5.4.45"
},
"funding": [
{
@ -432,31 +430,31 @@
},
{
"name": "symfony/deprecation-contracts",
"version": "v2.5.3",
"version_normalized": "2.5.3.0",
"version": "v2.5.4",
"version_normalized": "2.5.4.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/deprecation-contracts.git",
"reference": "80d075412b557d41002320b96a096ca65aa2c98d"
"reference": "605389f2a7e5625f273b53960dc46aeaf9c62918"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/80d075412b557d41002320b96a096ca65aa2c98d",
"reference": "80d075412b557d41002320b96a096ca65aa2c98d",
"url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/605389f2a7e5625f273b53960dc46aeaf9c62918",
"reference": "605389f2a7e5625f273b53960dc46aeaf9c62918",
"shasum": ""
},
"require": {
"php": ">=7.1"
},
"time": "2023-01-24T14:02:46+00:00",
"time": "2024-09-25T14:11:13+00:00",
"type": "library",
"extra": {
"thanks": {
"url": "https://github.com/symfony/contracts",
"name": "symfony/contracts"
},
"branch-alias": {
"dev-main": "2.5-dev"
},
"thanks": {
"name": "symfony/contracts",
"url": "https://github.com/symfony/contracts"
}
},
"installation-source": "dist",
@ -482,7 +480,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.5.3"
"source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.4"
},
"funding": [
{
@ -502,17 +500,17 @@
},
{
"name": "symfony/doctrine-messenger",
"version": "v5.4.38",
"version_normalized": "5.4.38.0",
"version": "v5.4.45",
"version_normalized": "5.4.45.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/doctrine-messenger.git",
"reference": "0118ae0beaebeb5961ddeedc994454e1ac11f759"
"reference": "3f5a6e1876fbf57e836ba0a02eb0a636e08c0d96"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/doctrine-messenger/zipball/0118ae0beaebeb5961ddeedc994454e1ac11f759",
"reference": "0118ae0beaebeb5961ddeedc994454e1ac11f759",
"url": "https://api.github.com/repos/symfony/doctrine-messenger/zipball/3f5a6e1876fbf57e836ba0a02eb0a636e08c0d96",
"reference": "3f5a6e1876fbf57e836ba0a02eb0a636e08c0d96",
"shasum": ""
},
"require": {
@ -530,7 +528,7 @@
"symfony/property-access": "^4.4|^5.0|^6.0",
"symfony/serializer": "^4.4|^5.0|^6.0"
},
"time": "2024-03-17T15:02:26+00:00",
"time": "2024-09-25T14:11:13+00:00",
"type": "symfony-messenger-bridge",
"installation-source": "dist",
"autoload": {
@ -558,7 +556,7 @@
"description": "Symfony Doctrine Messenger Bridge",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/doctrine-messenger/tree/v5.4.38"
"source": "https://github.com/symfony/doctrine-messenger/tree/v5.4.45"
},
"funding": [
{
@ -578,17 +576,17 @@
},
{
"name": "symfony/event-dispatcher",
"version": "v5.4.35",
"version_normalized": "5.4.35.0",
"version": "v5.4.45",
"version_normalized": "5.4.45.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/event-dispatcher.git",
"reference": "7a69a85c7ea5bdd1e875806a99c51a87d3a74b38"
"reference": "72982eb416f61003e9bb6e91f8b3213600dcf9e9"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/7a69a85c7ea5bdd1e875806a99c51a87d3a74b38",
"reference": "7a69a85c7ea5bdd1e875806a99c51a87d3a74b38",
"url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/72982eb416f61003e9bb6e91f8b3213600dcf9e9",
"reference": "72982eb416f61003e9bb6e91f8b3213600dcf9e9",
"shasum": ""
},
"require": {
@ -618,7 +616,7 @@
"symfony/dependency-injection": "",
"symfony/http-kernel": ""
},
"time": "2024-01-23T13:51:25+00:00",
"time": "2024-09-25T14:11:13+00:00",
"type": "library",
"installation-source": "dist",
"autoload": {
@ -646,7 +644,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/v5.4.35"
"source": "https://github.com/symfony/event-dispatcher/tree/v5.4.45"
},
"funding": [
{
@ -666,17 +664,17 @@
},
{
"name": "symfony/event-dispatcher-contracts",
"version": "v2.5.3",
"version_normalized": "2.5.3.0",
"version": "v2.5.4",
"version_normalized": "2.5.4.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/event-dispatcher-contracts.git",
"reference": "540f4c73e87fd0c71ca44a6aa305d024ac68cb73"
"reference": "e0fe3d79b516eb75126ac6fa4cbf19b79b08c99f"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/540f4c73e87fd0c71ca44a6aa305d024ac68cb73",
"reference": "540f4c73e87fd0c71ca44a6aa305d024ac68cb73",
"url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/e0fe3d79b516eb75126ac6fa4cbf19b79b08c99f",
"reference": "e0fe3d79b516eb75126ac6fa4cbf19b79b08c99f",
"shasum": ""
},
"require": {
@ -686,15 +684,15 @@
"suggest": {
"symfony/event-dispatcher-implementation": ""
},
"time": "2024-01-23T13:51:25+00:00",
"time": "2024-09-25T14:11:13+00:00",
"type": "library",
"extra": {
"thanks": {
"url": "https://github.com/symfony/contracts",
"name": "symfony/contracts"
},
"branch-alias": {
"dev-main": "2.5-dev"
},
"thanks": {
"name": "symfony/contracts",
"url": "https://github.com/symfony/contracts"
}
},
"installation-source": "dist",
@ -728,7 +726,7 @@
"standards"
],
"support": {
"source": "https://github.com/symfony/event-dispatcher-contracts/tree/v2.5.3"
"source": "https://github.com/symfony/event-dispatcher-contracts/tree/v2.5.4"
},
"funding": [
{
@ -748,17 +746,17 @@
},
{
"name": "symfony/mailer",
"version": "v5.4.38",
"version_normalized": "5.4.38.0",
"version": "v5.4.45",
"version_normalized": "5.4.45.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/mailer.git",
"reference": "1d0ef27f1b19b9a0175a0e130d1df3113e5a130e"
"reference": "f732e1fafdf0f4a2d865e91f1018aaca174aeed9"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/mailer/zipball/1d0ef27f1b19b9a0175a0e130d1df3113e5a130e",
"reference": "1d0ef27f1b19b9a0175a0e130d1df3113e5a130e",
"url": "https://api.github.com/repos/symfony/mailer/zipball/f732e1fafdf0f4a2d865e91f1018aaca174aeed9",
"reference": "f732e1fafdf0f4a2d865e91f1018aaca174aeed9",
"shasum": ""
},
"require": {
@ -779,7 +777,7 @@
"symfony/http-client": "^4.4|^5.0|^6.0",
"symfony/messenger": "^4.4|^5.0|^6.0"
},
"time": "2024-03-19T10:19:25+00:00",
"time": "2024-09-25T14:11:13+00:00",
"type": "library",
"installation-source": "dist",
"autoload": {
@ -807,7 +805,7 @@
"description": "Helps sending emails",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/mailer/tree/v5.4.38"
"source": "https://github.com/symfony/mailer/tree/v5.4.45"
},
"funding": [
{
@ -827,17 +825,17 @@
},
{
"name": "symfony/messenger",
"version": "v5.4.38",
"version_normalized": "5.4.38.0",
"version": "v5.4.45",
"version_normalized": "5.4.45.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/messenger.git",
"reference": "a69a4d07e20e4f298a5c030623a1a3328145a889"
"reference": "c21d463ba813a3fe9833f46114310fac99bd66e0"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/messenger/zipball/a69a4d07e20e4f298a5c030623a1a3328145a889",
"reference": "a69a4d07e20e4f298a5c030623a1a3328145a889",
"url": "https://api.github.com/repos/symfony/messenger/zipball/c21d463ba813a3fe9833f46114310fac99bd66e0",
"reference": "c21d463ba813a3fe9833f46114310fac99bd66e0",
"shasum": ""
},
"require": {
@ -872,7 +870,7 @@
"suggest": {
"enqueue/messenger-adapter": "For using the php-enqueue library as a transport."
},
"time": "2024-03-19T10:19:25+00:00",
"time": "2024-09-25T14:11:13+00:00",
"type": "library",
"installation-source": "dist",
"autoload": {
@ -900,7 +898,7 @@
"description": "Helps applications send and receive messages to/from other applications or via message queues",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/messenger/tree/v5.4.38"
"source": "https://github.com/symfony/messenger/tree/v5.4.45"
},
"funding": [
{
@ -920,17 +918,17 @@
},
{
"name": "symfony/mime",
"version": "v5.4.38",
"version_normalized": "5.4.38.0",
"version": "v5.4.45",
"version_normalized": "5.4.45.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/mime.git",
"reference": "82fa6be8a0295a3932df871e88fc8c8d77aa71d4"
"reference": "8c1b9b3e5b52981551fc6044539af1d974e39064"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/mime/zipball/82fa6be8a0295a3932df871e88fc8c8d77aa71d4",
"reference": "82fa6be8a0295a3932df871e88fc8c8d77aa71d4",
"url": "https://api.github.com/repos/symfony/mime/zipball/8c1b9b3e5b52981551fc6044539af1d974e39064",
"reference": "8c1b9b3e5b52981551fc6044539af1d974e39064",
"shasum": ""
},
"require": {
@ -956,7 +954,7 @@
"symfony/property-info": "^4.4|^5.1|^6.0",
"symfony/serializer": "^5.4.35|~6.3.12|^6.4.3"
},
"time": "2024-03-21T07:25:32+00:00",
"time": "2024-10-23T20:18:32+00:00",
"type": "library",
"installation-source": "dist",
"autoload": {
@ -988,7 +986,7 @@
"mime-type"
],
"support": {
"source": "https://github.com/symfony/mime/tree/v5.4.38"
"source": "https://github.com/symfony/mime/tree/v5.4.45"
},
"funding": [
{
@ -1008,33 +1006,32 @@
},
{
"name": "symfony/polyfill-intl-idn",
"version": "v1.29.0",
"version_normalized": "1.29.0.0",
"version": "v1.31.0",
"version_normalized": "1.31.0.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-intl-idn.git",
"reference": "a287ed7475f85bf6f61890146edbc932c0fff919"
"reference": "c36586dcf89a12315939e00ec9b4474adcb1d773"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/a287ed7475f85bf6f61890146edbc932c0fff919",
"reference": "a287ed7475f85bf6f61890146edbc932c0fff919",
"url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/c36586dcf89a12315939e00ec9b4474adcb1d773",
"reference": "c36586dcf89a12315939e00ec9b4474adcb1d773",
"shasum": ""
},
"require": {
"php": ">=7.1",
"symfony/polyfill-intl-normalizer": "^1.10",
"symfony/polyfill-php72": "^1.10"
"php": ">=7.2",
"symfony/polyfill-intl-normalizer": "^1.10"
},
"suggest": {
"ext-intl": "For best performance"
},
"time": "2024-01-29T20:11:03+00:00",
"time": "2024-09-09T11:45:10+00:00",
"type": "library",
"extra": {
"thanks": {
"name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill"
"url": "https://github.com/symfony/polyfill",
"name": "symfony/polyfill"
}
},
"installation-source": "dist",
@ -1075,7 +1072,7 @@
"shim"
],
"support": {
"source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.29.0"
"source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.31.0"
},
"funding": [
{
@ -1095,31 +1092,31 @@
},
{
"name": "symfony/polyfill-intl-normalizer",
"version": "v1.29.0",
"version_normalized": "1.29.0.0",
"version": "v1.31.0",
"version_normalized": "1.31.0.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-intl-normalizer.git",
"reference": "bc45c394692b948b4d383a08d7753968bed9a83d"
"reference": "3833d7255cc303546435cb650316bff708a1c75c"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/bc45c394692b948b4d383a08d7753968bed9a83d",
"reference": "bc45c394692b948b4d383a08d7753968bed9a83d",
"url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c",
"reference": "3833d7255cc303546435cb650316bff708a1c75c",
"shasum": ""
},
"require": {
"php": ">=7.1"
"php": ">=7.2"
},
"suggest": {
"ext-intl": "For best performance"
},
"time": "2024-01-29T20:11:03+00:00",
"time": "2024-09-09T11:45:10+00:00",
"type": "library",
"extra": {
"thanks": {
"name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill"
"url": "https://github.com/symfony/polyfill",
"name": "symfony/polyfill"
}
},
"installation-source": "dist",
@ -1159,7 +1156,7 @@
"shim"
],
"support": {
"source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.29.0"
"source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.31.0"
},
"funding": [
{
@ -1179,28 +1176,28 @@
},
{
"name": "symfony/polyfill-php80",
"version": "v1.29.0",
"version_normalized": "1.29.0.0",
"version": "v1.31.0",
"version_normalized": "1.31.0.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-php80.git",
"reference": "87b68208d5c1188808dd7839ee1e6c8ec3b02f1b"
"reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/87b68208d5c1188808dd7839ee1e6c8ec3b02f1b",
"reference": "87b68208d5c1188808dd7839ee1e6c8ec3b02f1b",
"url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/60328e362d4c2c802a54fcbf04f9d3fb892b4cf8",
"reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8",
"shasum": ""
},
"require": {
"php": ">=7.1"
"php": ">=7.2"
},
"time": "2024-01-29T20:11:03+00:00",
"time": "2024-09-09T11:45:10+00:00",
"type": "library",
"extra": {
"thanks": {
"name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill"
"url": "https://github.com/symfony/polyfill",
"name": "symfony/polyfill"
}
},
"installation-source": "dist",
@ -1242,7 +1239,7 @@
"shim"
],
"support": {
"source": "https://github.com/symfony/polyfill-php80/tree/v1.29.0"
"source": "https://github.com/symfony/polyfill-php80/tree/v1.31.0"
},
"funding": [
{
@ -1262,17 +1259,17 @@
},
{
"name": "symfony/redis-messenger",
"version": "v5.4.36",
"version_normalized": "5.4.36.0",
"version": "v5.4.48",
"version_normalized": "5.4.48.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/redis-messenger.git",
"reference": "54b107003c5abc03cc5077c8847678b432b1e602"
"reference": "a097e8c6529a7179a732161bd5368629c6319899"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/redis-messenger/zipball/54b107003c5abc03cc5077c8847678b432b1e602",
"reference": "54b107003c5abc03cc5077c8847678b432b1e602",
"url": "https://api.github.com/repos/symfony/redis-messenger/zipball/a097e8c6529a7179a732161bd5368629c6319899",
"reference": "a097e8c6529a7179a732161bd5368629c6319899",
"shasum": ""
},
"require": {
@ -1284,7 +1281,7 @@
"symfony/property-access": "^4.4|^5.0|^6.0",
"symfony/serializer": "^4.4|^5.0|^6.0"
},
"time": "2024-02-05T13:56:32+00:00",
"time": "2024-11-13T13:58:00+00:00",
"type": "symfony-messenger-bridge",
"installation-source": "dist",
"autoload": {
@ -1312,7 +1309,7 @@
"description": "Symfony Redis extension Messenger Bridge",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/redis-messenger/tree/v5.4.36"
"source": "https://github.com/symfony/redis-messenger/tree/v5.4.48"
},
"funding": [
{
@ -1332,17 +1329,17 @@
},
{
"name": "symfony/service-contracts",
"version": "v2.5.3",
"version_normalized": "2.5.3.0",
"version": "v2.5.4",
"version_normalized": "2.5.4.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/service-contracts.git",
"reference": "a2329596ddc8fd568900e3fc76cba42489ecc7f3"
"reference": "f37b419f7aea2e9abf10abd261832cace12e3300"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/service-contracts/zipball/a2329596ddc8fd568900e3fc76cba42489ecc7f3",
"reference": "a2329596ddc8fd568900e3fc76cba42489ecc7f3",
"url": "https://api.github.com/repos/symfony/service-contracts/zipball/f37b419f7aea2e9abf10abd261832cace12e3300",
"reference": "f37b419f7aea2e9abf10abd261832cace12e3300",
"shasum": ""
},
"require": {
@ -1356,15 +1353,15 @@
"suggest": {
"symfony/service-implementation": ""
},
"time": "2023-04-21T15:04:16+00:00",
"time": "2024-09-25T14:11:13+00:00",
"type": "library",
"extra": {
"thanks": {
"url": "https://github.com/symfony/contracts",
"name": "symfony/contracts"
},
"branch-alias": {
"dev-main": "2.5-dev"
},
"thanks": {
"name": "symfony/contracts",
"url": "https://github.com/symfony/contracts"
}
},
"installation-source": "dist",
@ -1398,7 +1395,7 @@
"standards"
],
"support": {
"source": "https://github.com/symfony/service-contracts/tree/v2.5.3"
"source": "https://github.com/symfony/service-contracts/tree/v2.5.4"
},
"funding": [
{
@ -1417,6 +1414,6 @@
"install-path": "../symfony/service-contracts"
}
],
"dev": false,
"dev": true,
"dev-package-names": []
}

View file

@ -3,17 +3,17 @@
'name' => 'getgrav/grav-plugin-email',
'pretty_version' => 'dev-develop',
'version' => 'dev-develop',
'reference' => '9b38e4e031e87c79320dd30b46960125a0385453',
'reference' => '831784509ec3bbc822c873000d4672112f8f9557',
'type' => 'grav-plugin',
'install_path' => __DIR__ . '/../../',
'aliases' => array(),
'dev' => false,
'dev' => true,
),
'versions' => array(
'doctrine/deprecations' => array(
'pretty_version' => '1.1.3',
'version' => '1.1.3.0',
'reference' => 'dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab',
'pretty_version' => '1.1.4',
'version' => '1.1.4.0',
'reference' => '31610dbb31faa98e6b5447b62340826f54fbc4e9',
'type' => 'library',
'install_path' => __DIR__ . '/../doctrine/deprecations',
'aliases' => array(),
@ -40,7 +40,7 @@
'getgrav/grav-plugin-email' => array(
'pretty_version' => 'dev-develop',
'version' => 'dev-develop',
'reference' => '9b38e4e031e87c79320dd30b46960125a0385453',
'reference' => '831784509ec3bbc822c873000d4672112f8f9557',
'type' => 'grav-plugin',
'install_path' => __DIR__ . '/../../',
'aliases' => array(),
@ -80,45 +80,45 @@
'dev_requirement' => false,
),
'symfony/amqp-messenger' => array(
'pretty_version' => 'v5.4.36',
'version' => '5.4.36.0',
'reference' => '456958ef89fffddc3935f3954a7eac255a5adb21',
'pretty_version' => 'v5.4.45',
'version' => '5.4.45.0',
'reference' => '822ad5f425ef362580273a175c45aa765220fe73',
'type' => 'symfony-messenger-bridge',
'install_path' => __DIR__ . '/../symfony/amqp-messenger',
'aliases' => array(),
'dev_requirement' => false,
),
'symfony/deprecation-contracts' => array(
'pretty_version' => 'v2.5.3',
'version' => '2.5.3.0',
'reference' => '80d075412b557d41002320b96a096ca65aa2c98d',
'pretty_version' => 'v2.5.4',
'version' => '2.5.4.0',
'reference' => '605389f2a7e5625f273b53960dc46aeaf9c62918',
'type' => 'library',
'install_path' => __DIR__ . '/../symfony/deprecation-contracts',
'aliases' => array(),
'dev_requirement' => false,
),
'symfony/doctrine-messenger' => array(
'pretty_version' => 'v5.4.38',
'version' => '5.4.38.0',
'reference' => '0118ae0beaebeb5961ddeedc994454e1ac11f759',
'pretty_version' => 'v5.4.45',
'version' => '5.4.45.0',
'reference' => '3f5a6e1876fbf57e836ba0a02eb0a636e08c0d96',
'type' => 'symfony-messenger-bridge',
'install_path' => __DIR__ . '/../symfony/doctrine-messenger',
'aliases' => array(),
'dev_requirement' => false,
),
'symfony/event-dispatcher' => array(
'pretty_version' => 'v5.4.35',
'version' => '5.4.35.0',
'reference' => '7a69a85c7ea5bdd1e875806a99c51a87d3a74b38',
'pretty_version' => 'v5.4.45',
'version' => '5.4.45.0',
'reference' => '72982eb416f61003e9bb6e91f8b3213600dcf9e9',
'type' => 'library',
'install_path' => __DIR__ . '/../symfony/event-dispatcher',
'aliases' => array(),
'dev_requirement' => false,
),
'symfony/event-dispatcher-contracts' => array(
'pretty_version' => 'v2.5.3',
'version' => '2.5.3.0',
'reference' => '540f4c73e87fd0c71ca44a6aa305d024ac68cb73',
'pretty_version' => 'v2.5.4',
'version' => '2.5.4.0',
'reference' => 'e0fe3d79b516eb75126ac6fa4cbf19b79b08c99f',
'type' => 'library',
'install_path' => __DIR__ . '/../symfony/event-dispatcher-contracts',
'aliases' => array(),
@ -131,27 +131,27 @@
),
),
'symfony/mailer' => array(
'pretty_version' => 'v5.4.38',
'version' => '5.4.38.0',
'reference' => '1d0ef27f1b19b9a0175a0e130d1df3113e5a130e',
'pretty_version' => 'v5.4.45',
'version' => '5.4.45.0',
'reference' => 'f732e1fafdf0f4a2d865e91f1018aaca174aeed9',
'type' => 'library',
'install_path' => __DIR__ . '/../symfony/mailer',
'aliases' => array(),
'dev_requirement' => false,
),
'symfony/messenger' => array(
'pretty_version' => 'v5.4.38',
'version' => '5.4.38.0',
'reference' => 'a69a4d07e20e4f298a5c030623a1a3328145a889',
'pretty_version' => 'v5.4.45',
'version' => '5.4.45.0',
'reference' => 'c21d463ba813a3fe9833f46114310fac99bd66e0',
'type' => 'library',
'install_path' => __DIR__ . '/../symfony/messenger',
'aliases' => array(),
'dev_requirement' => false,
),
'symfony/mime' => array(
'pretty_version' => 'v5.4.38',
'version' => '5.4.38.0',
'reference' => '82fa6be8a0295a3932df871e88fc8c8d77aa71d4',
'pretty_version' => 'v5.4.45',
'version' => '5.4.45.0',
'reference' => '8c1b9b3e5b52981551fc6044539af1d974e39064',
'type' => 'library',
'install_path' => __DIR__ . '/../symfony/mime',
'aliases' => array(),
@ -164,18 +164,18 @@
),
),
'symfony/polyfill-intl-idn' => array(
'pretty_version' => 'v1.29.0',
'version' => '1.29.0.0',
'reference' => 'a287ed7475f85bf6f61890146edbc932c0fff919',
'pretty_version' => 'v1.31.0',
'version' => '1.31.0.0',
'reference' => 'c36586dcf89a12315939e00ec9b4474adcb1d773',
'type' => 'library',
'install_path' => __DIR__ . '/../symfony/polyfill-intl-idn',
'aliases' => array(),
'dev_requirement' => false,
),
'symfony/polyfill-intl-normalizer' => array(
'pretty_version' => 'v1.29.0',
'version' => '1.29.0.0',
'reference' => 'bc45c394692b948b4d383a08d7753968bed9a83d',
'pretty_version' => 'v1.31.0',
'version' => '1.31.0.0',
'reference' => '3833d7255cc303546435cb650316bff708a1c75c',
'type' => 'library',
'install_path' => __DIR__ . '/../symfony/polyfill-intl-normalizer',
'aliases' => array(),
@ -194,27 +194,27 @@
),
),
'symfony/polyfill-php80' => array(
'pretty_version' => 'v1.29.0',
'version' => '1.29.0.0',
'reference' => '87b68208d5c1188808dd7839ee1e6c8ec3b02f1b',
'pretty_version' => 'v1.31.0',
'version' => '1.31.0.0',
'reference' => '60328e362d4c2c802a54fcbf04f9d3fb892b4cf8',
'type' => 'library',
'install_path' => __DIR__ . '/../symfony/polyfill-php80',
'aliases' => array(),
'dev_requirement' => false,
),
'symfony/redis-messenger' => array(
'pretty_version' => 'v5.4.36',
'version' => '5.4.36.0',
'reference' => '54b107003c5abc03cc5077c8847678b432b1e602',
'pretty_version' => 'v5.4.48',
'version' => '5.4.48.0',
'reference' => 'a097e8c6529a7179a732161bd5368629c6319899',
'type' => 'symfony-messenger-bridge',
'install_path' => __DIR__ . '/../symfony/redis-messenger',
'aliases' => array(),
'dev_requirement' => false,
),
'symfony/service-contracts' => array(
'pretty_version' => 'v2.5.3',
'version' => '2.5.3.0',
'reference' => 'a2329596ddc8fd568900e3fc76cba42489ecc7f3',
'pretty_version' => 'v2.5.4',
'version' => '2.5.4.0',
'reference' => 'f37b419f7aea2e9abf10abd261832cace12e3300',
'type' => 'library',
'install_path' => __DIR__ . '/../symfony/service-contracts',
'aliases' => array(),

View file

@ -150,6 +150,67 @@ class MyTest extends TestCase
}
```
## Displaying deprecations after running a PHPUnit test suite
It is possible to integrate this library with PHPUnit to display all
deprecations triggered during the test suite execution.
```xml
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="vendor/phpunit/phpunit/phpunit.xsd"
colors="true"
bootstrap="vendor/autoload.php"
displayDetailsOnTestsThatTriggerDeprecations="true"
failOnDeprecation="true"
>
<!-- one attribute to display the deprecations, the other to fail the test suite -->
<php>
<!-- ensures native PHP deprecations are used -->
<server name="DOCTRINE_DEPRECATIONS" value="trigger"/>
</php>
<!-- ensures the @ operator in @trigger_error is ignored -->
<source ignoreSuppressionOfDeprecations="true">
<include>
<directory>src</directory>
</include>
</source>
</phpunit>
```
Note that you can still trigger Deprecations in your code, provided you use the
`#[WithoutErrorHandler]` attribute to disable PHPUnit's error handler for tests
that call it. Be wary that this will disable all error handling, meaning it
will mask any warnings or errors that would otherwise be caught by PHPUnit.
At the moment, it is not possible to disable deduplication with an environment
variable, but you can use a bootstrap file to achieve that:
```php
// tests/bootstrap.php
<?php
declare(strict_types=1);
require dirname(__DIR__) . '/vendor/autoload.php';
use Doctrine\Deprecations\Deprecation;
Deprecation::withoutDeduplication();
```
Then, reference that file in your PHPUnit configuration:
```xml
<phpunit
bootstrap="tests/bootstrap.php"
>
</phpunit>
```
## What is a deprecation identifier?
An identifier for deprecations is just a link to any resource, most often a

View file

@ -8,20 +8,18 @@
"php": "^7.1 || ^8.0"
},
"require-dev": {
"doctrine/coding-standard": "^9",
"phpstan/phpstan": "1.4.10 || 1.10.15",
"phpstan/phpstan-phpunit": "^1.0",
"doctrine/coding-standard": "^9 || ^12",
"phpstan/phpstan": "1.4.10 || 2.0.3",
"phpstan/phpstan-phpunit": "^1.0 || ^2",
"phpunit/phpunit": "^7.5 || ^8.5 || ^9.5",
"psalm/plugin-phpunit": "0.18.4",
"psr/log": "^1 || ^2 || ^3",
"vimeo/psalm": "4.30.0 || 5.12.0"
"psr/log": "^1 || ^2 || ^3"
},
"suggest": {
"psr/log": "Allows logging deprecations via PSR-3 logger implementation"
},
"autoload": {
"psr-4": {
"Doctrine\\Deprecations\\": "lib/Doctrine/Deprecations"
"Doctrine\\Deprecations\\": "src"
}
},
"autoload-dev": {

View file

@ -173,9 +173,7 @@ class Deprecation
self::delegateTriggerToBackend($message, $backtrace, $link, $package);
}
/**
* @param list<array{function: string, line?: int, file?: string, class?: class-string, type?: string, args?: mixed[], object?: object}> $backtrace
*/
/** @param list<array{function: string, line?: int, file?: string, class?: class-string, type?: string, args?: mixed[], object?: object}> $backtrace */
private static function delegateTriggerToBackend(string $message, array $backtrace, string $link, string $package): void
{
$type = self::$type ?? self::getTypeFromEnv();
@ -226,19 +224,19 @@ class Deprecation
public static function enableTrackingDeprecations(): void
{
self::$type = self::$type ?? 0;
self::$type = self::$type ?? self::getTypeFromEnv();
self::$type |= self::TYPE_TRACK_DEPRECATIONS;
}
public static function enableWithTriggerError(): void
{
self::$type = self::$type ?? 0;
self::$type = self::$type ?? self::getTypeFromEnv();
self::$type |= self::TYPE_TRIGGER_ERROR;
}
public static function enableWithPsrLogger(LoggerInterface $logger): void
{
self::$type = self::$type ?? 0;
self::$type = self::$type ?? self::getTypeFromEnv();
self::$type |= self::TYPE_PSR_LOGGER;
self::$logger = $logger;
}
@ -289,9 +287,7 @@ class Deprecation
return self::$triggeredDeprecations;
}
/**
* @return int-mask-of<self::TYPE_*>
*/
/** @return int-mask-of<self::TYPE_*> */
private static function getTypeFromEnv(): int
{
switch ($_SERVER['DOCTRINE_DEPRECATIONS'] ?? $_ENV['DOCTRINE_DEPRECATIONS'] ?? null) {

View file

@ -26,17 +26,13 @@ trait VerifyDeprecations
$this->doctrineNoDeprecationsExpectations[$identifier] = Deprecation::getTriggeredDeprecations()[$identifier] ?? 0;
}
/**
* @before
*/
/** @before */
public function enableDeprecationTracking(): void
{
Deprecation::enableTrackingDeprecations();
}
/**
* @after
*/
/** @after */
public function verifyDeprecationsAreTriggered(): void
{
foreach ($this->doctrineDeprecationsExpectations as $identifier => $expectation) {

View file

@ -306,19 +306,21 @@ class Connection
$this->setupExchangeAndQueues(); // also setup normal exchange for delayed messages so delay queue can DLX messages to it
}
if (0 !== $delayInMs) {
$this->publishWithDelay($body, $headers, $delayInMs, $amqpStamp);
$this->withConnectionExceptionRetry(function () use ($body, $headers, $delayInMs, $amqpStamp) {
if (0 !== $delayInMs) {
$this->publishWithDelay($body, $headers, $delayInMs, $amqpStamp);
return;
}
return;
}
$this->publishOnExchange(
$this->exchange(),
$body,
$this->getRoutingKeyForMessage($amqpStamp),
$headers,
$amqpStamp
);
$this->publishOnExchange(
$this->exchange(),
$body,
$this->getRoutingKeyForMessage($amqpStamp),
$headers,
$amqpStamp
);
});
}
/**
@ -570,13 +572,18 @@ class Connection
private function clearWhenDisconnected(): void
{
if (!$this->channel()->isConnected()) {
$this->amqpChannel = null;
$this->amqpQueues = [];
$this->amqpExchange = null;
$this->amqpDelayExchange = null;
$this->clear();
}
}
private function clear(): void
{
$this->amqpChannel = null;
$this->amqpQueues = [];
$this->amqpExchange = null;
$this->amqpDelayExchange = null;
}
private function getDefaultPublishRoutingKey(): ?string
{
return $this->exchangeOptions['default_publish_routing_key'] ?? null;
@ -593,6 +600,25 @@ class Connection
{
return (null !== $amqpStamp ? $amqpStamp->getRoutingKey() : null) ?? $this->getDefaultPublishRoutingKey();
}
private function withConnectionExceptionRetry(callable $callable): void
{
$maxRetries = 3;
$retries = 0;
retry:
try {
$callable();
} catch (\AMQPConnectionException $e) {
if (++$retries <= $maxRetries) {
$this->clear();
goto retry;
}
throw $e;
}
}
}
if (!class_exists(\Symfony\Component\Messenger\Transport\AmqpExt\Connection::class, false)) {

View file

@ -1,3 +0,0 @@
vendor/
composer.lock
phpunit.xml

View file

@ -21,6 +21,7 @@ use Doctrine\DBAL\Platforms\MySQLPlatform;
use Doctrine\DBAL\Platforms\OraclePlatform;
use Doctrine\DBAL\Query\QueryBuilder;
use Doctrine\DBAL\Result;
use Doctrine\DBAL\Schema\AbstractAsset;
use Doctrine\DBAL\Schema\AbstractSchemaManager;
use Doctrine\DBAL\Schema\Comparator;
use Doctrine\DBAL\Schema\Schema;
@ -289,7 +290,17 @@ class Connection implements ResetInterface
{
$configuration = $this->driverConnection->getConfiguration();
$assetFilter = $configuration->getSchemaAssetsFilter();
$configuration->setSchemaAssetsFilter(static function () { return true; });
$configuration->setSchemaAssetsFilter(function ($tableName) {
if ($tableName instanceof AbstractAsset) {
$tableName = $tableName->getName();
}
if (!\is_string($tableName)) {
throw new \TypeError(sprintf('The table name must be an instance of "%s" or a string ("%s" given).', AbstractAsset::class, get_debug_type($tableName)));
}
return $tableName === $this->configuration['table_name'];
});
$this->updateSchema();
$configuration->setSchemaAssetsFilter($assetFilter);
$this->autoSetup = false;

View file

@ -1,3 +0,0 @@
vendor/
composer.lock
phpunit.xml

View file

@ -47,7 +47,7 @@ final class WrappedListener
$this->pretty = $this->name.'::'.$listener[1];
} elseif ($listener instanceof \Closure) {
$r = new \ReflectionFunction($listener);
if (str_contains($r->name, '{closure}')) {
if (str_contains($r->name, '{closure')) {
$this->pretty = $this->name = 'closure';
} elseif ($class = \PHP_VERSION_ID >= 80111 ? $r->getClosureCalledClass() : $r->getClosureScopeClass()) {
$this->name = $class->name;

View file

@ -15,7 +15,7 @@ use Symfony\Component\Mailer\Exception\TransportExceptionInterface;
use Symfony\Component\Mime\RawMessage;
/**
* Interface for mailers able to send emails synchronous and/or asynchronous.
* Interface for mailers able to send emails synchronously and/or asynchronously.
*
* Implementations must support synchronous and asynchronous sending.
*

View file

@ -64,6 +64,7 @@ class SendmailTransport extends AbstractTransport
$this->stream = new ProcessStream();
if (str_contains($this->command, ' -bs')) {
$this->stream->setCommand($this->command);
$this->stream->setInteractive(true);
$this->transport = new SmtpTransport($this->stream, $dispatcher, $logger);
}
}

View file

@ -25,11 +25,18 @@ final class ProcessStream extends AbstractStream
{
private $command;
private $interactive = false;
public function setCommand(string $command)
{
$this->command = $command;
}
public function setInteractive(bool $interactive)
{
$this->interactive = $interactive;
}
public function initialize(): void
{
$descriptorSpec = [
@ -57,11 +64,15 @@ final class ProcessStream extends AbstractStream
$err = stream_get_contents($this->err);
fclose($this->err);
if (0 !== $exitCode = proc_close($this->stream)) {
throw new TransportException('Process failed with exit code '.$exitCode.': '.$out.$err);
$errorMessage = 'Process failed with exit code '.$exitCode.': '.$out.$err;
}
}
parent::terminate();
if (!$this->interactive && isset($errorMessage)) {
throw new TransportException($errorMessage);
}
}
protected function getReadConnectionDescription(): string

View file

@ -77,7 +77,7 @@ class SendFailedMessageForRetryListener implements EventSubscriberInterface
$retryEnvelope = $this->withLimitedHistory($envelope, new DelayStamp($delay), new RedeliveryStamp($retryCount));
// re-send the message for retry
$this->getSenderForTransport($event->getReceiverName())->send($retryEnvelope);
$retryEnvelope = $this->getSenderForTransport($event->getReceiverName())->send($retryEnvelope);
if (null !== $this->eventDispatcher) {
$this->eventDispatcher->dispatch(new WorkerMessageRetriedEvent($retryEnvelope, $event->getReceiverName()));

View file

@ -34,7 +34,7 @@ final class HandlerDescriptor
$r = new \ReflectionFunction($handler);
if (str_contains($r->name, '{closure}')) {
if (str_contains($r->name, '{closure')) {
$this->name = 'Closure';
} elseif (!$handler = $r->getClosureThis()) {
$class = \PHP_VERSION_ID >= 80111 ? $r->getClosureCalledClass() : $r->getClosureScopeClass();

View file

@ -180,6 +180,20 @@ abstract class AbstractHeader implements HeaderInterface
$tokens[] = $encodedToken;
}
foreach ($tokens as $i => $token) {
// whitespace(s) between 2 encoded tokens
if (
0 < $i
&& isset($tokens[$i + 1])
&& preg_match('~^[\t ]+$~', $token)
&& $this->tokenNeedsEncoding($tokens[$i - 1])
&& $this->tokenNeedsEncoding($tokens[$i + 1])
) {
$tokens[$i - 1] .= $token.$tokens[$i + 1];
array_splice($tokens, $i, 2);
}
}
return $tokens;
}

View file

@ -124,11 +124,18 @@ class Message extends RawMessage
public function ensureValidity()
{
if (!$this->headers->has('To') && !$this->headers->has('Cc') && !$this->headers->has('Bcc')) {
$to = (null !== $header = $this->headers->get('To')) ? $header->getBody() : null;
$cc = (null !== $header = $this->headers->get('Cc')) ? $header->getBody() : null;
$bcc = (null !== $header = $this->headers->get('Bcc')) ? $header->getBody() : null;
if (!$to && !$cc && !$bcc) {
throw new LogicException('An email must have a "To", "Cc", or "Bcc" header.');
}
if (!$this->headers->has('From') && !$this->headers->has('Sender')) {
$from = (null !== $header = $this->headers->get('From')) ? $header->getBody() : null;
$sender = (null !== $header = $this->headers->get('Sender')) ? $header->getBody() : null;
if (!$from && !$sender) {
throw new LogicException('An email must have a "From" or a "Sender" header.');
}

View file

@ -145,7 +145,7 @@ final class Idn
*/
public static function idn_to_ascii($domainName, $options = self::IDNA_DEFAULT, $variant = self::INTL_IDNA_VARIANT_UTS46, &$idna_info = [])
{
if (\PHP_VERSION_ID >= 70200 && self::INTL_IDNA_VARIANT_2003 === $variant) {
if (self::INTL_IDNA_VARIANT_2003 === $variant) {
@trigger_error('idn_to_ascii(): INTL_IDNA_VARIANT_2003 is deprecated', \E_USER_DEPRECATED);
}
@ -198,7 +198,7 @@ final class Idn
*/
public static function idn_to_utf8($domainName, $options = self::IDNA_DEFAULT, $variant = self::INTL_IDNA_VARIANT_UTS46, &$idna_info = [])
{
if (\PHP_VERSION_ID >= 70200 && self::INTL_IDNA_VARIANT_2003 === $variant) {
if (self::INTL_IDNA_VARIANT_2003 === $variant) {
@trigger_error('idn_to_utf8(): INTL_IDNA_VARIANT_2003 is deprecated', \E_USER_DEPRECATED);
}
@ -280,10 +280,6 @@ final class Idn
switch ($data['status']) {
case 'disallowed':
$info->errors |= self::ERROR_DISALLOWED;
// no break.
case 'valid':
$str .= mb_chr($codePoint, 'utf-8');
@ -294,7 +290,7 @@ final class Idn
break;
case 'mapped':
$str .= $data['mapping'];
$str .= $transitional && 0x1E9E === $codePoint ? 'ss' : $data['mapping'];
break;
@ -346,6 +342,18 @@ final class Idn
$validationOptions = $options;
if ('xn--' === substr($label, 0, 4)) {
// Step 4.1. If the label contains any non-ASCII code point (i.e., a code point greater than U+007F),
// record that there was an error, and continue with the next label.
if (preg_match('/[^\x00-\x7F]/', $label)) {
$info->errors |= self::ERROR_PUNYCODE;
continue;
}
// Step 4.2. Attempt to convert the rest of the label to Unicode according to Punycode [RFC3492]. If
// that conversion fails, record that there was an error, and continue
// with the next label. Otherwise replace the original label in the string by the results of the
// conversion.
try {
$label = self::punycodeDecode(substr($label, 4));
} catch (\Exception $e) {
@ -516,6 +524,8 @@ final class Idn
if ('-' === substr($label, -1, 1)) {
$info->errors |= self::ERROR_TRAILING_HYPHEN;
}
} elseif ('xn--' === substr($label, 0, 4)) {
$info->errors |= self::ERROR_PUNYCODE;
}
// Step 4. The label must not contain a U+002E (.) FULL STOP.

View file

@ -20,9 +20,8 @@
}
],
"require": {
"php": ">=7.1",
"symfony/polyfill-intl-normalizer": "^1.10",
"symfony/polyfill-php72": "^1.10"
"php": ">=7.2",
"symfony/polyfill-intl-normalizer": "^1.10"
},
"autoload": {
"psr-4": { "Symfony\\Polyfill\\Intl\\Idn\\": "" },

View file

@ -16,7 +16,7 @@
}
],
"require": {
"php": ">=7.1"
"php": ">=7.2"
},
"autoload": {
"psr-4": { "Symfony\\Polyfill\\Intl\\Normalizer\\": "" },

View file

@ -20,7 +20,7 @@
}
],
"require": {
"php": ">=7.1"
"php": ">=7.2"
},
"autoload": {
"psr-4": { "Symfony\\Polyfill\\Php80\\": "" },

View file

@ -121,7 +121,21 @@ class Connection
return $redis;
}
$redis->connect($host, $port);
@$redis->connect($host, $port);
$error = null;
set_error_handler(function ($type, $msg) use (&$error) { $error = $msg; });
try {
$isConnected = $redis->isConnected();
} finally {
restore_error_handler();
}
if (!$isConnected) {
throw new InvalidArgumentException('Redis connection failed: '.(preg_match('/^Redis::p?connect\(\): (.*)/', $error ?? $redis->getLastError() ?? '', $matches) ? \sprintf(' (%s)', $matches[1]) : ''));
}
$redis->setOption(\Redis::OPT_SERIALIZER, $serializer);
if (null !== $auth && !$redis->auth($auth)) {
@ -304,7 +318,7 @@ class Connection
try {
// This could soon be optimized with https://github.com/antirez/redis/issues/5212 or
// https://github.com/antirez/redis/issues/6256
$pendingMessages = $this->connection->xpending($this->stream, $this->group, '-', '+', 1);
$pendingMessages = $this->connection->xpending($this->stream, $this->group, '-', '+', 1) ?: [];
} catch (\RedisException $e) {
throw new TransportException($e->getMessage(), 0, $e);
}
@ -389,6 +403,7 @@ class Connection
$this->group,
$this->consumer,
[$this->stream => $messageId],
1,
1
);
} catch (\RedisException $e) {

View file

@ -1,3 +0,0 @@
vendor/
composer.lock
phpunit.xml

View file

@ -1,3 +1,9 @@
# v1.3.7
## 10/28/2023
1. [](#improved)
* PHP 8.4 fixes - Implicitly nullable parameter declarations deprecate
# v1.3.6
## 10/11/2023

View file

@ -1,7 +1,7 @@
name: Flex Objects
slug: flex-objects
type: plugin
version: 1.3.6
version: 1.3.7
description: Flex Objects plugin allows you to manage Flex Objects in Grav Admin.
icon: list-alt
author:

View file

@ -1472,7 +1472,7 @@ class AdminController
* @param FlexObjectInterface|null $object
* @return FlexFormInterface
*/
public function getForm(FlexObjectInterface $object = null): FlexFormInterface
public function getForm(?FlexObjectInterface $object = null): FlexFormInterface
{
$object = $object ?? $this->getObject();
if (!$object) {
@ -1508,7 +1508,7 @@ class AdminController
* @param FlexDirectoryInterface|null $directory
* @return FlexFormInterface
*/
public function getDirectoryForm(FlexDirectoryInterface $directory = null): FlexFormInterface
public function getDirectoryForm(?FlexDirectoryInterface $directory = null): FlexFormInterface
{
$directory = $directory ?? $this->getDirectory();
if (!$directory) {
@ -1541,7 +1541,7 @@ class AdminController
* @param string|null $key
* @return FlexObjectInterface|null
*/
public function getObject(string $key = null): ?FlexObjectInterface
public function getObject(?string $key = null): ?FlexObjectInterface
{
if (null === $this->object) {
$key = $key ?? $this->id;
@ -1588,7 +1588,7 @@ class AdminController
* @param string|null $type
* @return FlexDirectoryInterface|null
*/
public function getDirectory(string $type = null): ?FlexDirectoryInterface
public function getDirectory(?string $type = null): ?FlexDirectoryInterface
{
$type = $type ?? $this->target;

View file

@ -153,7 +153,7 @@ abstract class AbstractController implements RequestHandlerInterface
* @param mixed $default
* @return mixed
*/
public function getPost(string $name = null, $default = null)
public function getPost(?string $name = null, $default = null)
{
$body = $this->request->getParsedBody();
@ -176,7 +176,7 @@ abstract class AbstractController implements RequestHandlerInterface
* @param string|null $type
* @return FlexForm
*/
public function getForm(string $type = null): FlexFormInterface
public function getForm(?string $type = null): FlexFormInterface
{
$object = $this->getObject();
if (!$object) {

View file

@ -470,7 +470,7 @@ class ObjectController extends AbstractController
* @return void
* @throws RuntimeException
*/
public function checkAuthorization(string $action, string $scope = null): void
public function checkAuthorization(string $action, ?string $scope = null): void
{
$object = $this->getObject();

View file

@ -110,7 +110,7 @@ class Flex implements FlexInterface
* @param bool $keepMissing
* @return array<FlexDirectoryInterface|null>
*/
public function getDirectories(array $types = null, bool $keepMissing = false): array
public function getDirectories(?array $types = null, bool $keepMissing = false): array
{
return $this->flex->getDirectories($types, $keepMissing);
}
@ -147,7 +147,7 @@ class Flex implements FlexInterface
* @param string|null $keyField
* @return FlexCollectionInterface|null
*/
public function getCollection(string $type, array $keys = null, string $keyField = null): ?FlexCollectionInterface
public function getCollection(string $type, ?array $keys = null, ?string $keyField = null): ?FlexCollectionInterface
{
return $this->flex->getCollection($type, $keys, $keyField);
}
@ -185,7 +185,7 @@ class Flex implements FlexInterface
* @param string|null $keyField
* @return FlexObjectInterface|null
*/
public function getObject(string $key, string $type = null, string $keyField = null): ?FlexObjectInterface
public function getObject(string $key, ?string $type = null, ?string $keyField = null): ?FlexObjectInterface
{
return $this->flex->getObject($key, $type, $keyField);
}

View file

@ -1,3 +1,16 @@
# v7.4.2
## 10/28/2024
1. [](#improved)
* Enhanced the `input` tag to include a disabled attribute [$601](https://github.com/getgrav/grav-plugin-form/pull/601)
* Updated logging methods to support Monolog2+
# v7.4.1
## 10/22/2024
1. [](#improved)
* `honeypot` field tweaks
# v7.4.0
## 03/29/2024

View file

@ -1 +1 @@
.form-group.has-errors{background:rgba(255,0,0,.05);border:1px solid rgba(255,0,0,.2);border-radius:3px;margin:0 -5px;padding:0 5px}.form-errors{color:#b52b27}.form-honeybear{visibility:hidden;position:absolute !important;height:1px;width:1px;overflow:hidden;clip:rect(1px, 1px, 1px, 1px)}.form-errors p{margin:0}.form-input-file input{display:none}.form-input-file .dz-default.dz-message{position:absolute;text-align:center;left:0;right:0;top:50%;transform:translateY(-50%);margin:0}.form-input-file.dropzone{position:relative;min-height:70px;border-radius:3px;margin-bottom:.85rem;border:2px dashed #ccc;color:#aaa;padding:.5rem}.form-input-file.dropzone .dz-preview{margin:.5rem}.form-input-file.dropzone .dz-preview:hover{z-index:2}.form-input-file.dropzone .dz-preview .dz-error-message{min-width:140px;width:auto}.form-input-file.dropzone .dz-preview .dz-image,.form-input-file.dropzone .dz-preview.dz-file-preview .dz-image{border-radius:3px;z-index:1}.form-tabs .tabs-nav{display:flex;padding-top:1px;margin-bottom:-1px}.form-tabs .tabs-nav a{flex:1;transition:color .5s ease,background .5s ease;cursor:pointer;text-align:center;padding:10px;display:flex;align-items:center;justify-content:center;border-bottom:1px solid #ccc;border-radius:5px 5px 0 0}.form-tabs .tabs-nav a.active{border:1px solid #ccc;border-bottom:1px solid rgba(0,0,0,0);margin:0 -1px}.form-tabs .tabs-nav a.active span{color:#000}.form-tabs .tabs-nav span{display:inline-block;line-height:1.1}.form-tabs.subtle .tabs-nav{margin-right:0 !important}.form-tabs .tabs-content .tab__content{display:none;padding-top:2rem}.form-tabs .tabs-content .tab__content.active{display:block}.checkboxes{display:inline-block}.checkboxes label{display:inline;cursor:pointer;position:relative;padding:0 0 0 20px;margin-right:15px}.checkboxes label:before{content:"";display:inline-block;width:20px;height:20px;left:0;margin-top:0;margin-right:10px;position:absolute;border-radius:3px;border:1px solid #e6e6e6}.checkboxes input[type=checkbox]{display:none}.checkboxes input[type=checkbox]:checked+label:before{content:"✓";font-size:20px;line-height:1;text-align:center}.checkboxes.toggleable label{margin-right:0}.form-field-toggleable .checkboxes.toggleable{margin-right:5px;vertical-align:middle}.form-field-toggleable .checkboxes+label{display:inline-block}.switch-toggle{display:inline-flex;overflow:hidden;border-radius:3px;line-height:35px;border:1px solid #ccc}.switch-toggle input[type=radio]{position:absolute;visibility:hidden;display:none}.switch-toggle label{display:inline-block;cursor:pointer;padding:0 15px;margin:0;white-space:nowrap;color:inherit;transition:background-color .5s ease}.switch-toggle input.highlight:checked+label{background:#333;color:#fff}.switch-toggle input:checked+label{color:#fff;background:#999}.signature-pad{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;font-size:10px;width:100%;height:100%;max-width:700px;max-height:460px;border:1px solid #f0f0f0;background-color:#fff;padding:16px}.signature-pad--body{position:relative;-webkit-box-flex:1;-ms-flex:1;flex:1;border:1px solid #f6f6f6;min-height:100px}.signature-pad--body canvas{position:absolute;left:0;top:0;width:100%;height:100%;border-radius:4px;box-shadow:0 0 5px rgba(0,0,0,.02) inset}.signature-pad--footer{color:#c3c3c3;text-align:center;font-size:1.2em}.signature-pad--actions{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;margin-top:8px}[data-grav-field=array] .form-row{display:flex;align-items:center;margin-bottom:.5rem}[data-grav-field=array] .form-row>input,[data-grav-field=array] .form-row>textarea{margin:0 .5rem;display:inline-block}.form-data.basic-captcha .form-input-wrapper{border:1px solid #ccc;border-radius:5px;display:flex;overflow:hidden}.form-data.basic-captcha .form-input-prepend{display:flex;color:#333;background-color:#ccc;flex-shrink:0}.form-data.basic-captcha .form-input-prepend img{margin:0}.form-data.basic-captcha .form-input-prepend button>svg{margin:0 8px;width:18px;height:18px}.form-data.basic-captcha input.form-input{border:0}/*# sourceMappingURL=form-styles.css.map */
.form-group.has-errors{background:rgba(255,0,0,.05);border:1px solid rgba(255,0,0,.2);border-radius:3px;margin:0 -5px;padding:0 5px}.form-errors{color:#b52b27}.form-honeybear{display:none;position:absolute !important;height:1px;width:1px;overflow:hidden;clip-path:rect(0px, 1px, 1px, 0px)}.form-errors p{margin:0}.form-input-file input{display:none}.form-input-file .dz-default.dz-message{position:absolute;text-align:center;left:0;right:0;top:50%;transform:translateY(-50%);margin:0}.form-input-file.dropzone{position:relative;min-height:70px;border-radius:3px;margin-bottom:.85rem;border:2px dashed #ccc;color:#aaa;padding:.5rem}.form-input-file.dropzone .dz-preview{margin:.5rem}.form-input-file.dropzone .dz-preview:hover{z-index:2}.form-input-file.dropzone .dz-preview .dz-error-message{min-width:140px;width:auto}.form-input-file.dropzone .dz-preview .dz-image,.form-input-file.dropzone .dz-preview.dz-file-preview .dz-image{border-radius:3px;z-index:1}.form-tabs .tabs-nav{display:flex;padding-top:1px;margin-bottom:-1px}.form-tabs .tabs-nav a{flex:1;transition:color .5s ease,background .5s ease;cursor:pointer;text-align:center;padding:10px;display:flex;align-items:center;justify-content:center;border-bottom:1px solid #ccc;border-radius:5px 5px 0 0}.form-tabs .tabs-nav a.active{border:1px solid #ccc;border-bottom:1px solid rgba(0,0,0,0);margin:0 -1px}.form-tabs .tabs-nav a.active span{color:#000}.form-tabs .tabs-nav span{display:inline-block;line-height:1.1}.form-tabs.subtle .tabs-nav{margin-right:0 !important}.form-tabs .tabs-content .tab__content{display:none;padding-top:2rem}.form-tabs .tabs-content .tab__content.active{display:block}.checkboxes{display:inline-block}.checkboxes label{display:inline;cursor:pointer;position:relative;padding:0 0 0 20px;margin-right:15px}.checkboxes label:before{content:"";display:inline-block;width:20px;height:20px;left:0;margin-top:0;margin-right:10px;position:absolute;border-radius:3px;border:1px solid #e6e6e6}.checkboxes input[type=checkbox]{display:none}.checkboxes input[type=checkbox]:checked+label:before{content:"✓";font-size:20px;line-height:1;text-align:center}.checkboxes.toggleable label{margin-right:0}.form-field-toggleable .checkboxes.toggleable{margin-right:5px;vertical-align:middle}.form-field-toggleable .checkboxes+label{display:inline-block}.switch-toggle{display:inline-flex;overflow:hidden;border-radius:3px;line-height:35px;border:1px solid #ccc}.switch-toggle input[type=radio]{position:absolute;visibility:hidden;display:none}.switch-toggle label{display:inline-block;cursor:pointer;padding:0 15px;margin:0;white-space:nowrap;color:inherit;transition:background-color .5s ease}.switch-toggle input.highlight:checked+label{background:#333;color:#fff}.switch-toggle input:checked+label{color:#fff;background:#999}.signature-pad{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;font-size:10px;width:100%;height:100%;max-width:700px;max-height:460px;border:1px solid #f0f0f0;background-color:#fff;padding:16px}.signature-pad--body{position:relative;-webkit-box-flex:1;-ms-flex:1;flex:1;border:1px solid #f6f6f6;min-height:100px}.signature-pad--body canvas{position:absolute;left:0;top:0;width:100%;height:100%;border-radius:4px;box-shadow:0 0 5px rgba(0,0,0,.02) inset}.signature-pad--footer{color:#c3c3c3;text-align:center;font-size:1.2em}.signature-pad--actions{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;margin-top:8px}[data-grav-field=array] .form-row{display:flex;align-items:center;margin-bottom:.5rem}[data-grav-field=array] .form-row>input,[data-grav-field=array] .form-row>textarea{margin:0 .5rem;display:inline-block}.form-data.basic-captcha .form-input-wrapper{border:1px solid #ccc;border-radius:5px;display:flex;overflow:hidden}.form-data.basic-captcha .form-input-prepend{display:flex;color:#333;background-color:#ccc;flex-shrink:0}.form-data.basic-captcha .form-input-prepend img{margin:0}.form-data.basic-captcha .form-input-prepend button>svg{margin:0 8px;width:18px;height:18px}.form-data.basic-captcha input.form-input{border:0}/*# sourceMappingURL=form-styles.css.map */

View file

@ -1 +1 @@
{"version":3,"sourceRoot":"","sources":["../scss/form-styles.scss"],"names":[],"mappings":"CAGA,uBACI,6BACA,kCACA,kBACA,cACA,cAGJ,aACI,cAGJ,gBACI,kBACA,6BACA,WACA,UACA,gBACA,8BAGJ,eACI,SAKA,uBACI,aAGJ,wCACI,kBACA,kBACA,OACA,QACA,QACA,2BACA,SAGJ,0BACI,kBACA,gBACA,kBACA,qBACA,uBACA,WACA,cAEA,sCACI,aAEA,4CACI,UAGJ,wDACI,gBACA,WAGJ,gHAEI,kBACA,UAWZ,qBACI,aACA,gBAEA,mBAEA,uBACI,OACA,8CACA,eACA,kBACA,aACA,aACA,mBACA,uBACA,6BACA,0BAEA,8BACI,sBACA,sCACA,cAEA,mCACI,MAtGA,KA2GZ,0BACI,qBACA,gBAKR,4BACI,0BAKA,uCACI,aACA,iBAEA,8CACI,cAOhB,YACI,qBAEA,kBACI,eACA,eACA,kBACA,mBACA,kBAGJ,yBACI,WACA,qBACA,WACA,YACA,OACA,aACA,kBACA,kBACA,kBAEA,yBAGJ,iCACI,aAEJ,sDACI,YACA,eACA,cACA,kBAGJ,6BACI,eAMJ,8CACI,iBACA,sBAEJ,yCACI,qBAKR,eACI,oBACA,gBACA,kBACA,iBACA,sBAEA,iCACI,kBACA,kBACA,aAGJ,qBACI,qBACA,eACA,eACA,SACA,mBACA,cACA,qCAGJ,6CACI,gBACA,WAGJ,mCACI,WACA,gBAOR,eACI,kBACA,oBACA,oBACA,aACA,4BACA,6BACA,0BACA,sBACA,eACA,WACA,YACA,gBACA,iBACA,yBACA,sBACA,aAGJ,qBACI,kBACA,mBACA,WACA,OACA,yBACA,iBAGJ,4BACI,kBACA,OACA,MACA,WACA,YACA,kBACA,yCAGJ,uBACI,cACA,kBACA,gBAGJ,wBACI,oBACA,oBACA,aACA,yBACA,sBACA,8BACA,eAGJ,kCACI,aACA,mBACA,oBAGJ,mFAGI,eACA,qBAIA,6CACI,sBACA,kBACA,aACA,gBAEJ,6CACI,aACA,WACA,sBACA,cACA,iDACI,SAEJ,wDACI,aACA,WACA,YAGR,0CACI","file":"form-styles.css"}
{"version":3,"sourceRoot":"","sources":["../scss/form-styles.scss"],"names":[],"mappings":"CAGA,uBACI,6BACA,kCACA,kBACA,cACA,cAGJ,aACI,cAGJ,gBACI,aACA,6BACA,WACA,UACA,gBACA,mCAGJ,eACI,SAKA,uBACI,aAGJ,wCACI,kBACA,kBACA,OACA,QACA,QACA,2BACA,SAGJ,0BACI,kBACA,gBACA,kBACA,qBACA,uBACA,WACA,cAEA,sCACI,aAEA,4CACI,UAGJ,wDACI,gBACA,WAGJ,gHAEI,kBACA,UAWZ,qBACI,aACA,gBAEA,mBAEA,uBACI,OACA,8CACA,eACA,kBACA,aACA,aACA,mBACA,uBACA,6BACA,0BAEA,8BACI,sBACA,sCACA,cAEA,mCACI,MAtGA,KA2GZ,0BACI,qBACA,gBAKR,4BACI,0BAKA,uCACI,aACA,iBAEA,8CACI,cAOhB,YACI,qBAEA,kBACI,eACA,eACA,kBACA,mBACA,kBAGJ,yBACI,WACA,qBACA,WACA,YACA,OACA,aACA,kBACA,kBACA,kBAEA,yBAGJ,iCACI,aAEJ,sDACI,YACA,eACA,cACA,kBAGJ,6BACI,eAMJ,8CACI,iBACA,sBAEJ,yCACI,qBAKR,eACI,oBACA,gBACA,kBACA,iBACA,sBAEA,iCACI,kBACA,kBACA,aAGJ,qBACI,qBACA,eACA,eACA,SACA,mBACA,cACA,qCAGJ,6CACI,gBACA,WAGJ,mCACI,WACA,gBAOR,eACI,kBACA,oBACA,oBACA,aACA,4BACA,6BACA,0BACA,sBACA,eACA,WACA,YACA,gBACA,iBACA,yBACA,sBACA,aAGJ,qBACI,kBACA,mBACA,WACA,OACA,yBACA,iBAGJ,4BACI,kBACA,OACA,MACA,WACA,YACA,kBACA,yCAGJ,uBACI,cACA,kBACA,gBAGJ,wBACI,oBACA,oBACA,aACA,yBACA,sBACA,8BACA,eAGJ,kCACI,aACA,mBACA,oBAGJ,mFAGI,eACA,qBAIA,6CACI,sBACA,kBACA,aACA,gBAEJ,6CACI,aACA,WACA,sBACA,cACA,iDACI,SAEJ,wDACI,aACA,WACA,YAGR,0CACI","file":"form-styles.css"}

View file

@ -1,7 +1,7 @@
name: Form
slug: form
type: plugin
version: 7.4.0
version: 7.4.2
description: Enables forms handling and processing
icon: check-square
author:

View file

@ -506,7 +506,7 @@ class FormPlugin extends Plugin
'message' => $message
]));
$this->grav['log']->addWarning('Form reCAPTCHA Errors: [' . $uri->route() . '] ' . json_encode($errors));
$this->grav['log']->warning('Form reCAPTCHA Errors: [' . $uri->route() . '] ' . json_encode($errors));
$event->stopPropagation();
@ -556,7 +556,7 @@ class FormPlugin extends Plugin
'message' => $message
]));
$this->grav['log']->addWarning('Form Turnstile invalid: [' . $uri->route() . '] ' . json_encode($content));
$this->grav['log']->warning('Form Turnstile invalid: [' . $uri->route() . '] ' . json_encode($content));
$event->stopPropagation();
return;
}
@ -1262,7 +1262,7 @@ class FormPlugin extends Plugin
if ($forms) {
$this->forms = Utils::arrayMergeRecursiveUnique($this->forms, $forms);
if ($this->config()['debug']) {
$this->grav['log']->addDebug(sprintf("<<<< Loaded cached forms: %s\n%s", $this->getFormCacheId(), $this->arrayToString($this->forms)));
$this->grav['log']->debug(sprintf("<<<< Loaded cached forms: %s\n%s", $this->getFormCacheId(), $this->arrayToString($this->forms)));
}
}
@ -1286,7 +1286,7 @@ class FormPlugin extends Plugin
$cache->save($cache_id, $this->forms);
if ($this->config()['debug']) {
$this->grav['log']->addDebug(sprintf(">>>> Saved cached forms: %s\n%s", $this->getFormCacheId(), $this->arrayToString($this->forms)));
$this->grav['log']->debug(sprintf(">>>> Saved cached forms: %s\n%s", $this->getFormCacheId(), $this->arrayToString($this->forms)));
}
}

View file

@ -14,12 +14,12 @@ $form-active-color: #000;
}
.form-honeybear {
visibility: hidden;
display: none;
position: absolute !important;
height: 1px;
width: 1px;
overflow: hidden;
clip: rect(1px, 1px, 1px, 1px);
clip-path: rect(0px, 1px, 1px, 0px);
}
.form-errors p {

View file

@ -12,30 +12,30 @@
{% set value = field.default|merge(value) %}
{% endif %}
{% for key, text in field.options %}
{% set id = field.id|default(field.name)|hyphenize ~ '-' ~ key %}
{% set name = field.use == 'keys' ? key : id %}
{% set val = field.use == 'keys' ? '1' : key %}
{% set checked = (field.use == 'keys' ? value[key] : key in value) %}
{% set help = (key in field.help_options|keys ? field.help_options[key] : false) %}
<div class="checkboxes {{ form_field_wrapper_classes }} {{ field.wrapper_classes }}">
<input type="checkbox"
id="{{ id|e }}"
value="{{ val|e }}"
name="{{ (scope ~ field.name)|fieldName ~ '[' ~ name ~ ']' }}"
class="{{ form_field_checkbox_classes }} {{ field.classes }}"
{% if checked %}checked="checked"{% endif %}
{% if field.disabled or isDisabledToggleable %}disabled="disabled"{% endif %}
>
<label style="display: inline" for="{{ id|e }}">
{% if help %}
<span class="hint--bottom" data-hint="{{ help|t|e('html_attr') }}">{{ text|t|e }}</span>
{% else %}
{{ text|t|e }}
{% endif %}
</label>
{% for key, text in field.options %}
{% set id = field.id|default(field.name)|hyphenize ~ '-' ~ key %}
{% set name = field.use == 'keys' ? key : id %}
{% set val = field.use == 'keys' ? '1' : key %}
{% set checked = (field.use == 'keys' ? value[key] : key in value) %}
{% set help = (key in field.help_options|keys ? field.help_options[key] : false) %}
{% set disabled = key in field.disabled_options %}
<input type="checkbox"
id="{{ id|e }}"
value="{{ val|e }}"
name="{{ (scope ~ field.name)|fieldName ~ '[' ~ name ~ ']' }}"
class="{{ form_field_checkbox_classes }} {{ field.classes }}"
{% if checked %}checked="checked"{% endif %}
{% if disabled %}disabled="disabled"{% endif %}
>
<label style="display: inline; {% if disabled %}opacity: 0.6; cursor: no-drop;{% endif %}" for="{{ id|e }}">
{% if help %}
<span class="hint--bottom" data-hint="{{ help|t|e('html_attr') }}">{{ text|t|e }}</span>
{% else %}
{{ text|t|e }}
{% endif %}
</label>
{% endfor %}
</div>
{% endfor %}
{% endblock %}
{% endblock %}

View file

@ -8,6 +8,8 @@
style="visibility:hidden;position:absolute!important;height:1px;width:1px;overflow:hidden;clip:rect(1px,1px,1px,1px);"
{% endif %}
class="form-honeybear"
tabindex="-1"
autocomplete="off"
name="{{ (scope ~ field.name)|fieldName }}"
value="{{ input_value|e }}" />
{% endblock %}

2
plugins/problems/.gitignore vendored Normal file
View file

@ -0,0 +1,2 @@
node_modules
package-lock.json

View file

@ -1,3 +1,9 @@
# v2.1.2
## 10/22/2024
1. [](#improved)
* Improved `gd` module check [#36](https://github.com/getgrav/grav-plugin-problems/pull/36)
# v2.1.1
## 04/14/2021

View file

@ -1,7 +1,7 @@
name: Problems
slug: problems
type: plugin
version: 2.1.1
version: 2.1.2
description: Detects and reports problems found in the site.
icon: exclamation-circle
author:

View file

@ -57,19 +57,21 @@ class PHPModules extends Problem
$msg = 'PHP GD (Image Manipulation Library) is %s installed';
if (defined('GD_VERSION') && function_exists('gd_info')) {
$msg = $modules_success['gd'] = sprintf($msg, 'successfully');
$msg = sprintf($msg, 'successfully');
// Extra checks for Image support
$ginfo = gd_info();
$gda = array('PNG Support', 'JPEG Support', 'FreeType Support', 'GIF Read Support');
$gda = array('PNG Support', 'JPEG Support', 'FreeType Support', 'GIF Read Support', 'WebP Support', 'AVIF Support');
$gda_msg = '';
$problems_found = false;
foreach ($gda as $image_type) {
if (!$ginfo[$image_type]) {
if (!array_key_exists($image_type, $ginfo)) {
$problems_found = true;
$gda_msg = "missing $image_type, but is ";
break;
if($gda_msg !== '') {
$gda_msg .= ', ';
}
$gda_msg .= $image_type;
}
}

0
plugins/problems/css/spectre-icons.css Executable file → Normal file
View file

0
plugins/problems/css/spectre-icons.min.css vendored Executable file → Normal file
View file

0
plugins/problems/css/spectre.css Executable file → Normal file
View file

0
plugins/problems/css/spectre.min.css vendored Executable file → Normal file
View file

View file

@ -0,0 +1,15 @@
{
"project":"grav-plugin-problems",
"platforms":{
"grav":{
"nodes":{
"plugin":[
{
"source":"/",
"destination":"/user/plugins/problems"
}
]
}
}
}
}

0
plugins/problems/package.json Executable file → Normal file
View file

0
plugins/problems/scss/_accordions.scss Executable file → Normal file
View file

0
plugins/problems/scss/_animations.scss Executable file → Normal file
View file

0
plugins/problems/scss/_asian.scss Executable file → Normal file
View file

0
plugins/problems/scss/_autocomplete.scss Executable file → Normal file
View file

0
plugins/problems/scss/_avatars.scss Executable file → Normal file
View file

0
plugins/problems/scss/_badges.scss Executable file → Normal file
View file

0
plugins/problems/scss/_bars.scss Executable file → Normal file
View file

0
plugins/problems/scss/_base.scss Executable file → Normal file
View file

0
plugins/problems/scss/_breadcrumbs.scss Executable file → Normal file
View file

0
plugins/problems/scss/_buttons.scss Executable file → Normal file
View file

0
plugins/problems/scss/_calendars.scss Executable file → Normal file
View file

0
plugins/problems/scss/_cards.scss Executable file → Normal file
View file

0
plugins/problems/scss/_carousels.scss Executable file → Normal file
View file

0
plugins/problems/scss/_chips.scss Executable file → Normal file
View file

0
plugins/problems/scss/_codes.scss Executable file → Normal file
View file

0
plugins/problems/scss/_comparison-sliders.scss Executable file → Normal file
View file

0
plugins/problems/scss/_dropdowns.scss Executable file → Normal file
View file

0
plugins/problems/scss/_empty.scss Executable file → Normal file
View file

0
plugins/problems/scss/_filters.scss Executable file → Normal file
View file

0
plugins/problems/scss/_forms.scss Executable file → Normal file
View file

0
plugins/problems/scss/_icons.scss Executable file → Normal file
View file

0
plugins/problems/scss/_labels.scss Executable file → Normal file
View file

0
plugins/problems/scss/_layout.scss Executable file → Normal file
View file

0
plugins/problems/scss/_media.scss Executable file → Normal file
View file

0
plugins/problems/scss/_menus.scss Executable file → Normal file
View file

0
plugins/problems/scss/_meters.scss Executable file → Normal file
View file

0
plugins/problems/scss/_mixins.scss Executable file → Normal file
View file

0
plugins/problems/scss/_modals.scss Executable file → Normal file
View file

0
plugins/problems/scss/_navbar.scss Executable file → Normal file
View file

Some files were not shown because too many files have changed in this diff Show more