diff --git a/.drone.yml b/.drone.yml
index bdef987738cb5..656603ed1520c 100644
--- a/.drone.yml
+++ b/.drone.yml
@@ -6,7 +6,7 @@ clone:
steps:
- name: setup
- image: joomlaprojects/docker-images:php8.3
+ image: joomlaprojects/docker-images:php8.4
volumes:
- name: certificates
path: /certificates
@@ -14,7 +14,7 @@ steps:
- cp -v tests/certs/* /certificates/
- name: composer
- image: joomlaprojects/docker-images:php8.3
+ image: joomlaprojects/docker-images:php8.4
volumes:
- name: composer-cache
path: /tmp/composer-cache
@@ -70,6 +70,13 @@ steps:
- php -v
- ./libraries/vendor/bin/phpunit --testsuite Unit
+ - name: php84-unit
+ depends_on: [ phpcs ]
+ image: joomlaprojects/docker-images:php8.4
+ commands:
+ - php -v
+ - ./libraries/vendor/bin/phpunit --testsuite Unit
+
- name: php81-integration
depends_on: [ npm ]
image: joomlaprojects/docker-images:php8.1
@@ -91,6 +98,13 @@ steps:
- php -v
- ./libraries/vendor/bin/phpunit --testsuite Integration
+ - name: php84-integration
+ depends_on: [ npm ]
+ image: joomlaprojects/docker-images:php8.4
+ commands:
+ - php -v
+ - ./libraries/vendor/bin/phpunit --testsuite Integration
+
- name: php81-integration-pgsql
depends_on: [ npm ]
image: joomlaprojects/docker-images:php8.1
@@ -112,6 +126,13 @@ steps:
- php -v
- ./libraries/vendor/bin/phpunit --testsuite Integration --configuration phpunit-pgsql.xml.dist
+ - name: php84-integration-pgsql
+ depends_on: [ npm ]
+ image: joomlaprojects/docker-images:php8.4
+ commands:
+ - php -v
+ - ./libraries/vendor/bin/phpunit --testsuite Integration --configuration phpunit-pgsql.xml.dist
+
- name: scss-cs
depends_on: [ npm ]
image: node:current-alpine
@@ -154,7 +175,7 @@ steps:
- name: phpmax-system-mysql
depends_on:
- phpmin-system-mysql
- image: joomlaprojects/docker-images:cypress8.3
+ image: joomlaprojects/docker-images:cypress8.4
volumes:
- name: cypress-cache
path: /root/.cache/Cypress
@@ -167,24 +188,6 @@ steps:
exclude:
- pull_request
- - name: phpnext-system-mysql
- depends_on:
- - phpmax-system-mysql
- image: joomlaprojects/docker-images:cypress8.4
- volumes:
- - name: cypress-cache
- path: /root/.cache/Cypress
- environment:
- JOOMLA_INSTALLATION_DISABLE_LOCALHOST_CHECK: 1
- failure: ignore
- commands:
- - echo "This test is disabled because php next is not stable yet"
- - exit 1
- - bash tests/System/entrypoint.sh "$(pwd)" cmysqlnext mysqli mysql
- when:
- event:
- exclude:
- - pull_request
- name: phpmin-system-postgres
depends_on:
@@ -205,39 +208,18 @@ steps:
- name: phpmax-system-postgres
depends_on:
- phpmin-system-postgres
- image: joomlaprojects/docker-images:cypress8.3
- volumes:
- - name: cypress-cache
- path: /root/.cache/Cypress
- environment:
- JOOMLA_INSTALLATION_DISABLE_LOCALHOST_CHECK: 1
- commands:
- - bash tests/System/entrypoint.sh "$(pwd)" cpostgresmax pgsql postgres
-
- - name: phpnext-system-postgres
- depends_on:
- - phpmax-system-postgres
image: joomlaprojects/docker-images:cypress8.4
volumes:
- name: cypress-cache
path: /root/.cache/Cypress
environment:
JOOMLA_INSTALLATION_DISABLE_LOCALHOST_CHECK: 1
- failure: ignore
commands:
- - echo "This test is disabled because php next is not stable yet"
- - exit 1
- - bash tests/System/entrypoint.sh "$(pwd)" cpostgresnext pgsql postgres
- when:
- event:
- exclude:
- - pull_request
+ - bash tests/System/entrypoint.sh "$(pwd)" cpostgresmax pgsql postgres
- name: artifacts-system-tests
image: joomlaprojects/docker-images:packager
depends_on:
- - phpnext-system-mysql
- - phpnext-system-postgres
- phpmax-system-mysql
- phpmax-system-postgres
- phpmin-system-mysql
@@ -433,6 +415,6 @@ trigger:
---
kind: signature
-hmac: fedcefde305c98f4dfc926b9039f83692827337da9e689e423c9de93a97248dd
+hmac: 99da78521b10f37ddf6731e695fe52f85ee3db142bccac66901ae5372e332aae
...
diff --git a/.github/workflows/create-translation-pull-request-v5.yml b/.github/workflows/create-translation-pull-request-v5.yml
index 673410d759b40..44d0d574dd8a5 100644
--- a/.github/workflows/create-translation-pull-request-v5.yml
+++ b/.github/workflows/create-translation-pull-request-v5.yml
@@ -60,7 +60,7 @@ jobs:
- name: Update static error pages
run: |
- npm ci --ignore-scripts && node build/build.js --build-pages
+ npm ci --ignore-scripts && node build/build.mjs --build-pages
- name: Create commit
continue-on-error: true
diff --git a/.php-cs-fixer.dist.php b/.php-cs-fixer.dist.php
index 27b6d831e85ae..b188dd552c400 100644
--- a/.php-cs-fixer.dist.php
+++ b/.php-cs-fixer.dist.php
@@ -91,6 +91,14 @@
'native_function_invocation' => ['include' => ['@compiler_optimized']],
// Adds null to type declarations when parameter have a default null value
'nullable_type_declaration_for_default_null_value' => true,
+ // Removes unneeded parentheses around control statements
+ 'no_unneeded_control_parentheses' => true,
+ // Using isset($var) && multiple times should be done in one call.
+ 'combine_consecutive_issets' => true,
+ // Calling unset on multiple items should be done in one call
+ 'combine_consecutive_unsets' => true,
+ // There must be no sprintf calls with only the first argument
+ 'no_useless_sprintf' => true,
]
)
->setFinder($finder);
diff --git a/administrator/components/com_actionlogs/src/Model/ActionlogModel.php b/administrator/components/com_actionlogs/src/Model/ActionlogModel.php
index 611e7578fd2c3..0a1ac8b1cd9ff 100644
--- a/administrator/components/com_actionlogs/src/Model/ActionlogModel.php
+++ b/administrator/components/com_actionlogs/src/Model/ActionlogModel.php
@@ -58,7 +58,7 @@ public function addLog($messages, $messageLanguageKey, $context, $userId = 0)
try {
$user = $userId ? $this->getUserFactory()->loadUserById($userId) : $this->getCurrentUser();
} catch (\UnexpectedValueException $e) {
- @trigger_error(\sprintf('UserFactory must be set, this will not be caught anymore in 7.0.'), E_USER_DEPRECATED);
+ @trigger_error('UserFactory must be set, this will not be caught anymore in 7.0.', E_USER_DEPRECATED);
$user = Factory::getUser($userId);
}
diff --git a/administrator/components/com_admin/script.php b/administrator/components/com_admin/script.php
index ef787411d94d3..08d257de79bbf 100644
--- a/administrator/components/com_admin/script.php
+++ b/administrator/components/com_admin/script.php
@@ -2450,6 +2450,26 @@ public function deleteUnexistingFiles($dryRun = false, $suppressOutput = false)
'/libraries/vendor/maximebf/debugbar/src/DebugBar/Storage/PdoStorage.php',
'/libraries/vendor/maximebf/debugbar/src/DebugBar/Storage/RedisStorage.php',
'/libraries/vendor/maximebf/debugbar/src/DebugBar/Storage/StorageInterface.php',
+ // From 5.3.0-beta3 to 5.3.0-rc1
+ '/libraries/vendor/joomla/http/.drone.jsonnet',
+ '/libraries/vendor/joomla/http/.drone.yml',
+ '/libraries/vendor/joomla/oauth1/.drone.jsonnet',
+ '/libraries/vendor/joomla/oauth1/.drone.yml',
+ '/libraries/vendor/joomla/oauth2/.drone.jsonnet',
+ '/libraries/vendor/joomla/oauth2/.drone.yml',
+ '/libraries/vendor/joomla/router/.drone.jsonnet',
+ '/libraries/vendor/joomla/router/.drone.yml',
+ '/libraries/vendor/joomla/string/.drone.jsonnet',
+ '/libraries/vendor/joomla/string/.drone.yml',
+ '/libraries/vendor/joomla/uri/.drone.jsonnet',
+ '/libraries/vendor/joomla/uri/.drone.yml',
+ '/libraries/vendor/joomla/utilities/.drone.jsonnet',
+ '/libraries/vendor/joomla/utilities/.drone.yml',
+ // From 5.3.0-rc1 to 5.3.0-rc2
+ '/libraries/vendor/algo26-matthias/idna-convert/Dockerfile',
+ '/libraries/vendor/algo26-matthias/idna-convert/compose.yml',
+ '/libraries/vendor/algo26-matthias/idna-convert/src/Exception/Std3AsciiRulesViolationException.php',
+ '/libraries/vendor/algo26-matthias/idna-convert/src/TranscodeUnicode/ByteLengthTrait.php',
];
$folders = [
diff --git a/administrator/components/com_admin/sql/updates/mysql/5.3.0-2025-02-22.sql b/administrator/components/com_admin/sql/updates/mysql/5.3.0-2025-02-22.sql
new file mode 100644
index 0000000000000..426e088ca8979
--- /dev/null
+++ b/administrator/components/com_admin/sql/updates/mysql/5.3.0-2025-02-22.sql
@@ -0,0 +1,3 @@
+-- Add plg_extension_joomlaupdate plugin
+INSERT INTO `#__extensions` (`package_id`, `name`, `type`, `element`, `folder`, `client_id`, `enabled`, `access`, `protected`, `locked`, `manifest_cache`, `params`, `custom_data`, `ordering`, `state`) VALUES
+(0, 'plg_extension_joomlaupdate', 'plugin', 'joomlaupdate', 'extension', 0, 1, 1, 0, 1, '', '', '', 0, 0);
diff --git a/administrator/components/com_admin/sql/updates/mysql/5.3.0-2025-03-14.sql b/administrator/components/com_admin/sql/updates/mysql/5.3.0-2025-03-14.sql
new file mode 100644
index 0000000000000..2eedbb010e52d
--- /dev/null
+++ b/administrator/components/com_admin/sql/updates/mysql/5.3.0-2025-03-14.sql
@@ -0,0 +1,10 @@
+-- disable autostart for the previous tour
+UPDATE `#__guidedtours` SET `autostart` = 0 WHERE `uid` = 'joomla-whatsnew-5-2';
+
+INSERT INTO `#__guidedtours` (`title`, `description`, `extensions`, `url`, `published`, `language`, `note`, `access`, `uid`, `autostart`, `created`, `created_by`, `modified`, `modified_by`) VALUES
+('COM_GUIDEDTOURS_TOUR_WHATSNEW_5_3_TITLE', 'COM_GUIDEDTOURS_TOUR_WHATSNEW_5_3_DESCRIPTION', '["com_cpanel"]', 'administrator/index.php', 1, '*', '', 1, 'joomla-whatsnew-5-3', 1, CURRENT_TIMESTAMP(), 0, CURRENT_TIMESTAMP(), 0);
+
+INSERT INTO `#__guidedtour_steps` (`title`, `description`, `position`, `target`, `type`, `interactive_type`, `url`, `published`, `language`, `note`, `params`, `tour_id`, `created`, `created_by`, `modified`, `modified_by`)
+SELECT 'COM_GUIDEDTOURS_TOUR_WHATSNEW_5_3_STEP_0_TITLE', 'COM_GUIDEDTOURS_TOUR_WHATSNEW_5_3_STEP_0_DESCRIPTION', 'right', '#sidebarmenu nav > ul:first-of-type > li:last-child', 0, 1, '', 1, '*', '', '"{\"required\":1,\"requiredvalue\":\"\"}"', MAX(`id`), CURRENT_TIMESTAMP(), 0, CURRENT_TIMESTAMP(), 0
+ FROM `#__guidedtours`
+ WHERE `uid` = 'joomla-whatsnew-5-3';
diff --git a/administrator/components/com_admin/sql/updates/postgresql/5.3.0-2025-02-22.sql b/administrator/components/com_admin/sql/updates/postgresql/5.3.0-2025-02-22.sql
new file mode 100644
index 0000000000000..4f319c1a92d2d
--- /dev/null
+++ b/administrator/components/com_admin/sql/updates/postgresql/5.3.0-2025-02-22.sql
@@ -0,0 +1,3 @@
+-- Add plg_extension_joomlaupdate module
+INSERT INTO "#__extensions" ("package_id", "name", "type", "element", "folder", "client_id", "enabled", "access", "protected", "locked", "manifest_cache", "params", "custom_data", "ordering", "state") VALUES
+(0, 'plg_extension_joomlaupdate', 'plugin', 'joomlaupdate', 'extension', 0, 1, 1, 0, 1, '', '', '', 0, 0);
diff --git a/administrator/components/com_admin/sql/updates/postgresql/5.3.0-2025-03-14.sql b/administrator/components/com_admin/sql/updates/postgresql/5.3.0-2025-03-14.sql
new file mode 100644
index 0000000000000..cfb58259717f7
--- /dev/null
+++ b/administrator/components/com_admin/sql/updates/postgresql/5.3.0-2025-03-14.sql
@@ -0,0 +1,10 @@
+-- disable autostart for the previous tour
+UPDATE "#__guidedtours" SET "autostart" = 0 WHERE "uid" = 'joomla-whatsnew-5-2';
+
+INSERT INTO "#__guidedtours" ("title", "description", "extensions", "url", "published", "language", "note", "access", "uid", "autostart", "created", "created_by", "modified", "modified_by") VALUES
+('COM_GUIDEDTOURS_TOUR_WHATSNEW_5_3_TITLE', 'COM_GUIDEDTOURS_TOUR_WHATSNEW_5_3_DESCRIPTION', '["com_cpanel"]', 'administrator/index.php', 1, '*', '', 1, 'joomla-whatsnew-5-3', 1, CURRENT_TIMESTAMP, 0, CURRENT_TIMESTAMP, 0);
+
+INSERT INTO "#__guidedtour_steps" ("title", "description", "position", "target", "type", "interactive_type", "url", "published", "language", "note", "params", "tour_id", "created", "created_by", "modified", "modified_by")
+SELECT 'COM_GUIDEDTOURS_TOUR_WHATSNEW_5_3_STEP_0_TITLE', 'COM_GUIDEDTOURS_TOUR_WHATSNEW_5_3_STEP_0_DESCRIPTION', 'right', '#sidebarmenu nav > ul:first-of-type > li:last-child', 0, 1, '', 1, '*', '', '"{\"required\":1,\"requiredvalue\":\"\"}"', MAX("id"), CURRENT_TIMESTAMP, 0, CURRENT_TIMESTAMP, 0
+ FROM "#__guidedtours"
+ WHERE "uid" = 'joomla-whatsnew-5-3';
diff --git a/administrator/components/com_associations/src/Helper/AssociationsHelper.php b/administrator/components/com_associations/src/Helper/AssociationsHelper.php
index 098a7ac90fbec..6f591141a919e 100644
--- a/administrator/components/com_associations/src/Helper/AssociationsHelper.php
+++ b/administrator/components/com_associations/src/Helper/AssociationsHelper.php
@@ -193,7 +193,7 @@ private static function getExtensionHelperClassName($extensionName)
*/
private static function getExtensionRealName($extensionName)
{
- return !str_contains($extensionName, 'com_') ? $extensionName : substr($extensionName, 4);
+ return !str_starts_with($extensionName, 'com_') ? $extensionName : substr($extensionName, 4);
}
/**
@@ -593,7 +593,7 @@ public static function canCheckinItem($extensionName, $typeName, $itemId)
$userId = Factory::getUser()->id;
- return ($item->{$checkedOutFieldName} == $userId || $item->{$checkedOutFieldName} == 0);
+ return $item->{$checkedOutFieldName} == $userId || $item->{$checkedOutFieldName} == 0;
}
/**
diff --git a/administrator/components/com_associations/src/View/Associations/HtmlView.php b/administrator/components/com_associations/src/View/Associations/HtmlView.php
index 24d4b40151928..591a852c9a35b 100644
--- a/administrator/components/com_associations/src/View/Associations/HtmlView.php
+++ b/administrator/components/com_associations/src/View/Associations/HtmlView.php
@@ -174,8 +174,7 @@ public function display($tpl = null)
// Dynamic filter form.
// This selectors doesn't have to activate the filter bar.
- unset($this->activeFilters['itemtype']);
- unset($this->activeFilters['language']);
+ unset($this->activeFilters['itemtype'], $this->activeFilters['language']);
// Remove filters options depending on selected type.
if (empty($support['state'])) {
@@ -249,7 +248,7 @@ protected function addToolbar()
{
$user = $this->getCurrentUser();
- if (isset($this->typeName) && isset($this->extensionName)) {
+ if (isset($this->typeName, $this->extensionName)) {
$helper = AssociationsHelper::getExtensionHelper($this->extensionName);
$title = $helper->getTypeTitle($this->typeName);
diff --git a/administrator/components/com_banners/src/Controller/BannerController.php b/administrator/components/com_banners/src/Controller/BannerController.php
index e221e16668f19..10b7952a8c8fd 100644
--- a/administrator/components/com_banners/src/Controller/BannerController.php
+++ b/administrator/components/com_banners/src/Controller/BannerController.php
@@ -71,7 +71,7 @@ protected function allowAdd($data = [])
*/
protected function allowEdit($data = [], $key = 'id')
{
- $recordId = (int) isset($data[$key]) ? $data[$key] : 0;
+ $recordId = isset($data[$key]) ? (int) $data[$key] : 0;
$categoryId = 0;
if ($recordId) {
diff --git a/administrator/components/com_banners/src/Table/BannerTable.php b/administrator/components/com_banners/src/Table/BannerTable.php
index bd3968945314b..6c6f1d71168e7 100644
--- a/administrator/components/com_banners/src/Table/BannerTable.php
+++ b/administrator/components/com_banners/src/Table/BannerTable.php
@@ -57,6 +57,7 @@ public function __construct(DatabaseDriver $db, ?DispatcherInterface $dispatcher
$this->created = Factory::getDate()->toSql();
$this->setColumnAlias('published', 'state');
+ $this->setColumnAlias('title', 'name');
}
/**
diff --git a/administrator/components/com_categories/src/Controller/CategoryController.php b/administrator/components/com_categories/src/Controller/CategoryController.php
index a3809aca8f77f..94764772af5de 100644
--- a/administrator/components/com_categories/src/Controller/CategoryController.php
+++ b/administrator/components/com_categories/src/Controller/CategoryController.php
@@ -76,7 +76,7 @@ protected function allowAdd($data = [])
{
$user = $this->app->getIdentity();
- return ($user->authorise('core.create', $this->extension) || \count($user->getAuthorisedCategories($this->extension, 'core.create')));
+ return $user->authorise('core.create', $this->extension) || \count($user->getAuthorisedCategories($this->extension, 'core.create'));
}
/**
@@ -91,7 +91,7 @@ protected function allowAdd($data = [])
*/
protected function allowEdit($data = [], $key = 'parent_id')
{
- $recordId = (int) isset($data[$key]) ? $data[$key] : 0;
+ $recordId = isset($data[$key]) ? (int) $data[$key] : 0;
$user = $this->app->getIdentity();
// Check "edit" permission on record asset (explicit or inherited)
diff --git a/administrator/components/com_categories/src/Field/CategoryeditField.php b/administrator/components/com_categories/src/Field/CategoryeditField.php
index e89810275360e..42adbd6bd8462 100644
--- a/administrator/components/com_categories/src/Field/CategoryeditField.php
+++ b/administrator/components/com_categories/src/Field/CategoryeditField.php
@@ -152,10 +152,13 @@ protected function getOptions()
// Let's get the id for the current item, either category or content item.
$jinput = Factory::getApplication()->getInput();
+ // Is this field used to select parent category for a category ?
+ $isParentCategoryField = isset($this->element['parent']) || $jinput->getCmd('option') === 'com_categories';
+
// Load the category options for a given extension.
// For categories the old category is the category id or 0 for new category.
- if ($this->element['parent'] || $jinput->get('option') == 'com_categories') {
+ if ($isParentCategoryField) {
$oldCat = $jinput->get('id', 0);
$oldParent = $this->form->getValue($name, 0);
$extension = $this->element['extension'] ? (string) $this->element['extension'] : (string) $jinput->get('extension', 'com_content');
@@ -186,7 +189,7 @@ protected function getOptions()
->from($db->quoteName('#__categories', 'a'));
// Filter by the extension type
- if ($this->element['parent'] == true || $jinput->get('option') == 'com_categories') {
+ if ($isParentCategoryField) {
$query->where('(' . $db->quoteName('a.extension') . ' = :extension OR ' . $db->quoteName('a.parent_id') . ' = 0)')
->bind(':extension', $extension);
} else {
@@ -195,7 +198,7 @@ protected function getOptions()
}
// Filter language
- if (!empty($this->element['language'])) {
+ if (isset($this->element['language'])) {
if (str_contains($this->element['language'], ',')) {
$language = explode(',', $this->element['language']);
} else {
@@ -219,7 +222,7 @@ protected function getOptions()
$query->order($db->quoteName('a.lft') . ' ASC');
// If parent isn't explicitly stated but we are in com_categories assume we want parents
- if ($oldCat != 0 && ($this->element['parent'] == true || $jinput->get('option') == 'com_categories')) {
+ if ($oldCat != 0 && $isParentCategoryField) {
// Prevent parenting to children of this item.
// To rearrange parents and children move the children up, not the parents down.
$query->join(
@@ -244,10 +247,8 @@ protected function getOptions()
// Pad the option text with spaces using depth level as a multiplier.
foreach ($options as $option) {
// Translate ROOT
- if ($this->element['parent'] == true || $jinput->get('option') == 'com_categories') {
- if ($option->level == 0) {
- $option->text = Text::_('JGLOBAL_ROOT_PARENT');
- }
+ if ($isParentCategoryField && $option->level == 0) {
+ $option->text = Text::_('JGLOBAL_ROOT_PARENT');
}
if ($option->published == 1) {
@@ -311,7 +312,7 @@ protected function getOptions()
}
if (
- $oldCat != 0 && ($this->element['parent'] == true || $jinput->get('option') == 'com_categories')
+ $oldCat != 0 && $isParentCategoryField
&& !isset($options[0])
&& isset($this->element['show_root'])
) {
diff --git a/administrator/components/com_checkin/src/Model/CheckinModel.php b/administrator/components/com_checkin/src/Model/CheckinModel.php
index 50e663de3accb..d468199f9c0e1 100644
--- a/administrator/components/com_checkin/src/Model/CheckinModel.php
+++ b/administrator/components/com_checkin/src/Model/CheckinModel.php
@@ -102,7 +102,7 @@ public function checkin($ids = [])
$fields = $db->getTableColumns($tn, false);
- if (!(isset($fields['checked_out']) && isset($fields['checked_out_time']))) {
+ if (!(isset($fields['checked_out'], $fields['checked_out_time']))) {
continue;
}
@@ -183,7 +183,7 @@ public function getItems()
$fields = $db->getTableColumns($tn, false);
- if (!(isset($fields['checked_out']) && isset($fields['checked_out_time']))) {
+ if (!(isset($fields['checked_out'], $fields['checked_out_time']))) {
continue;
}
diff --git a/administrator/components/com_config/src/Controller/ComponentController.php b/administrator/components/com_config/src/Controller/ComponentController.php
index f7abd791c87c2..5de8a17b39c7b 100644
--- a/administrator/components/com_config/src/Controller/ComponentController.php
+++ b/administrator/components/com_config/src/Controller/ComponentController.php
@@ -86,7 +86,7 @@ public function save($key = null, $urlVar = null)
}
// Remove the permissions rules data if user isn't allowed to edit them.
- if (!$user->authorise('core.admin', $option) && isset($data['params']) && isset($data['params']['rules'])) {
+ if (!$user->authorise('core.admin', $option) && isset($data['params']['rules'])) {
unset($data['params']['rules']);
}
diff --git a/administrator/components/com_config/src/Model/ApplicationModel.php b/administrator/components/com_config/src/Model/ApplicationModel.php
index 3b23781eaf303..8100c81dca18a 100644
--- a/administrator/components/com_config/src/Model/ApplicationModel.php
+++ b/administrator/components/com_config/src/Model/ApplicationModel.php
@@ -745,10 +745,10 @@ public function save($data)
$config = new Registry($data);
// Overwrite webservices cors settings
- $app->set('cors', $data['cors']);
- $app->set('cors_allow_origin', $data['cors_allow_origin']);
- $app->set('cors_allow_headers', $data['cors_allow_headers']);
- $app->set('cors_allow_methods', $data['cors_allow_methods']);
+ $app->set('cors', $data['cors'] ?? 0);
+ $app->set('cors_allow_origin', $data['cors_allow_origin'] ?? '*');
+ $app->set('cors_allow_headers', $data['cors_allow_headers'] ?? 'Content-Type,X-Joomla-Token');
+ $app->set('cors_allow_methods', $data['cors_allow_methods'] ?? '');
// Clear cache of com_config component.
$this->cleanCache('_system');
@@ -786,8 +786,6 @@ public function save($data)
*/
public function removeroot()
{
- $app = Factory::getApplication();
-
// Get the previous configuration.
$prev = new \JConfig();
$prev = ArrayHelper::fromObject($prev);
diff --git a/administrator/components/com_config/src/Model/ComponentModel.php b/administrator/components/com_config/src/Model/ComponentModel.php
index 17554c5791631..0a80503e4e836 100644
--- a/administrator/components/com_config/src/Model/ComponentModel.php
+++ b/administrator/components/com_config/src/Model/ComponentModel.php
@@ -201,8 +201,7 @@ public function save($data)
}
// We don't need this anymore
- unset($data['option']);
- unset($data['params']['rules']);
+ unset($data['option'], $data['params']['rules']);
}
// Load the previous Data
diff --git a/administrator/components/com_contact/src/Controller/ContactController.php b/administrator/components/com_contact/src/Controller/ContactController.php
index 4e77dec9217b0..6ffa932fa9b2e 100644
--- a/administrator/components/com_contact/src/Controller/ContactController.php
+++ b/administrator/components/com_contact/src/Controller/ContactController.php
@@ -63,7 +63,7 @@ protected function allowAdd($data = [])
*/
protected function allowEdit($data = [], $key = 'id')
{
- $recordId = (int) isset($data[$key]) ? $data[$key] : 0;
+ $recordId = isset($data[$key]) ? (int) $data[$key] : 0;
// Since there is no asset tracking, fallback to the component permissions.
if (!$recordId) {
diff --git a/administrator/components/com_contact/src/Extension/ContactComponent.php b/administrator/components/com_contact/src/Extension/ContactComponent.php
index 7016c7503687a..73d1ed69cde8e 100644
--- a/administrator/components/com_contact/src/Extension/ContactComponent.php
+++ b/administrator/components/com_contact/src/Extension/ContactComponent.php
@@ -142,7 +142,7 @@ public function getContexts(): array
*/
protected function getTableNameForSection(?string $section = null)
{
- return ($section === 'category' ? 'categories' : 'contact_details');
+ return $section === 'category' ? 'categories' : 'contact_details';
}
/**
diff --git a/administrator/components/com_contact/src/Model/ContactsModel.php b/administrator/components/com_contact/src/Model/ContactsModel.php
index cbacd0635e8c0..9dfe4775d7a4f 100644
--- a/administrator/components/com_contact/src/Model/ContactsModel.php
+++ b/administrator/components/com_contact/src/Model/ContactsModel.php
@@ -158,7 +158,7 @@ protected function getListQuery()
'list.select',
'a.id, a.name, a.alias, a.checked_out, a.checked_out_time, a.catid, a.user_id' .
', a.published, a.access, a.created, a.created_by, a.ordering, a.featured, a.language' .
- ', a.publish_up, a.publish_down'
+ ', a.publish_up, a.publish_down, a.modified_by'
)
)
)
diff --git a/administrator/components/com_content/src/Controller/ArticleController.php b/administrator/components/com_content/src/Controller/ArticleController.php
index abffcfed2f15b..96fe0cc8e6647 100644
--- a/administrator/components/com_content/src/Controller/ArticleController.php
+++ b/administrator/components/com_content/src/Controller/ArticleController.php
@@ -159,7 +159,7 @@ protected function allowAdd($data = [])
*/
protected function allowEdit($data = [], $key = 'id')
{
- $recordId = (int) isset($data[$key]) ? $data[$key] : 0;
+ $recordId = isset($data[$key]) ? (int) $data[$key] : 0;
$user = $this->app->getIdentity();
// Zero record (id:0), return component edit permission by calling parent controller method
diff --git a/administrator/components/com_content/src/Model/ArticleModel.php b/administrator/components/com_content/src/Model/ArticleModel.php
index aa438b6852164..581c9d1e450ed 100644
--- a/administrator/components/com_content/src/Model/ArticleModel.php
+++ b/administrator/components/com_content/src/Model/ArticleModel.php
@@ -587,7 +587,18 @@ protected function loadFormData()
((isset($filters['published']) && $filters['published'] !== '') ? $filters['published'] : null)
)
);
- $data->set('catid', $app->getInput()->getInt('catid', (!empty($filters['category_id']) ? $filters['category_id'] : null)));
+
+ // If multiple categories are filtered, pick the first one to avoid loading all fields
+ $filteredCategories = $filters['category_id'] ?? null;
+ $selectedCatId = null;
+
+ if (\is_array($filteredCategories)) {
+ $selectedCatId = (int) reset($filteredCategories);
+ } elseif (!empty($filteredCategories)) {
+ $selectedCatId = (int) $filteredCategories;
+ }
+
+ $data->set('catid', $app->getInput()->getInt('catid', $selectedCatId));
if ($app->isClient('administrator')) {
$data->set('language', $app->getInput()->getString('language', (!empty($filters['language']) ? $filters['language'] : null)));
@@ -649,7 +660,7 @@ public function save($data)
$input = $app->getInput();
$filter = InputFilter::getInstance();
- if (isset($data['metadata']) && isset($data['metadata']['author'])) {
+ if (isset($data['metadata']['author'])) {
$data['metadata']['author'] = $filter->clean($data['metadata']['author'], 'TRIM');
}
diff --git a/administrator/components/com_content/tmpl/articles/default.php b/administrator/components/com_content/tmpl/articles/default.php
index 862896a10057c..6b989353f9583 100644
--- a/administrator/components/com_content/tmpl/articles/default.php
+++ b/administrator/components/com_content/tmpl/articles/default.php
@@ -321,7 +321,7 @@
escape($item->access_level); ?>
- created_by != 0) : ?>
+ author_name)) : ?>
escape($item->author_name); ?>
diff --git a/administrator/components/com_contenthistory/src/Helper/ContenthistoryHelper.php b/administrator/components/com_contenthistory/src/Helper/ContenthistoryHelper.php
index fa56bd3587465..aa501e65ce981 100644
--- a/administrator/components/com_contenthistory/src/Helper/ContenthistoryHelper.php
+++ b/administrator/components/com_contenthistory/src/Helper/ContenthistoryHelper.php
@@ -189,7 +189,7 @@ public static function getLookupValue($lookup, $value)
{
$result = false;
- if (isset($lookup->sourceColumn) && isset($lookup->targetTable) && isset($lookup->targetColumn) && isset($lookup->displayColumn)) {
+ if (isset($lookup->sourceColumn, $lookup->targetTable, $lookup->targetColumn, $lookup->displayColumn)) {
$db = Factory::getDbo();
$value = (int) $value;
$query = $db->getQuery(true);
diff --git a/administrator/components/com_cpanel/src/View/Cpanel/HtmlView.php b/administrator/components/com_cpanel/src/View/Cpanel/HtmlView.php
index 3e8bc11296dd2..bc861c51637d0 100644
--- a/administrator/components/com_cpanel/src/View/Cpanel/HtmlView.php
+++ b/administrator/components/com_cpanel/src/View/Cpanel/HtmlView.php
@@ -69,7 +69,7 @@ public function display($tpl = null)
$parts = explode('.', $dashboard);
$component = $parts[0];
- if (!str_contains($component, 'com_')) {
+ if (!str_starts_with($component, 'com_')) {
$component = 'com_' . $component;
}
diff --git a/administrator/components/com_fields/src/Controller/FieldController.php b/administrator/components/com_fields/src/Controller/FieldController.php
index 24682c186ce79..8401f415a7f29 100644
--- a/administrator/components/com_fields/src/Controller/FieldController.php
+++ b/administrator/components/com_fields/src/Controller/FieldController.php
@@ -95,7 +95,7 @@ protected function allowAdd($data = [])
*/
protected function allowEdit($data = [], $key = 'id')
{
- $recordId = (int) isset($data[$key]) ? $data[$key] : 0;
+ $recordId = isset($data[$key]) ? (int) $data[$key] : 0;
$user = $this->app->getIdentity();
// Zero record (id:0), return component edit permission by calling parent controller method
diff --git a/administrator/components/com_fields/src/Controller/GroupController.php b/administrator/components/com_fields/src/Controller/GroupController.php
index 6572227d11fe3..debed0279faeb 100644
--- a/administrator/components/com_fields/src/Controller/GroupController.php
+++ b/administrator/components/com_fields/src/Controller/GroupController.php
@@ -117,7 +117,7 @@ protected function allowAdd($data = [])
*/
protected function allowEdit($data = [], $key = 'parent_id')
{
- $recordId = (int) isset($data[$key]) ? $data[$key] : 0;
+ $recordId = isset($data[$key]) ? (int) $data[$key] : 0;
$user = $this->app->getIdentity();
// Zero record (parent_id:0), return component edit permission by calling parent controller method
diff --git a/administrator/components/com_fields/src/Model/FieldModel.php b/administrator/components/com_fields/src/Model/FieldModel.php
index ec1a19ef7df59..cdb173524567c 100644
--- a/administrator/components/com_fields/src/Model/FieldModel.php
+++ b/administrator/components/com_fields/src/Model/FieldModel.php
@@ -229,7 +229,7 @@ public function save($data)
*/
if (
$field && \in_array($field->type, ['list', 'checkboxes', 'radio'], true)
- && isset($data['fieldparams']['options']) && isset($field->fieldparams['options'])
+ && isset($data['fieldparams']['options'], $field->fieldparams['options'])
) {
$oldParams = $this->getParams($field->fieldparams['options']);
$newParams = $this->getParams($data['fieldparams']['options']);
@@ -330,7 +330,7 @@ private function checkDefaultValue($data)
try {
$rule->setDatabase($this->getDatabase());
} catch (DatabaseNotFoundException) {
- @trigger_error(\sprintf('Database must be set, this will not be caught anymore in 5.0.'), E_USER_DEPRECATED);
+ @trigger_error('Database must be set, this will not be caught anymore in 5.0.', E_USER_DEPRECATED);
$rule->setDatabase(Factory::getContainer()->get(DatabaseInterface::class));
}
}
@@ -1168,6 +1168,16 @@ protected function batchCopy($value, $pks, $contexts)
foreach ($pks as $pk) {
if ($user->authorise('core.create', $component . '.fieldgroup.' . $value)) {
+ // Find all assigned categories to this field
+ $db = $this->getDatabase();
+ $query = $db->getQuery(true);
+
+ $query->select($db->quoteName('category_id'))
+ ->from($db->quoteName('#__fields_categories'))
+ ->where($db->quoteName('field_id') . ' = ' . (int) $pk);
+
+ $assignedCatIds = $db->setQuery($query)->loadColumn();
+
$table->reset();
$table->load($pk);
@@ -1194,6 +1204,17 @@ protected function batchCopy($value, $pks, $contexts)
// Get the new item ID
$newId = $table->id;
+ // Inset the assigned categories
+ if (!empty($assignedCatIds)) {
+ $tuple = new \stdClass();
+ $tuple->field_id = $newId;
+
+ foreach ($assignedCatIds as $catId) {
+ $tuple->category_id = $catId;
+ $db->insertObject('#__fields_categories', $tuple);
+ }
+ }
+
// Add the new ID to the array
$newIds[$pk] = $newId;
} else {
diff --git a/administrator/components/com_fields/src/Model/GroupModel.php b/administrator/components/com_fields/src/Model/GroupModel.php
index 69caf97134ff0..196b956b0d73d 100644
--- a/administrator/components/com_fields/src/Model/GroupModel.php
+++ b/administrator/components/com_fields/src/Model/GroupModel.php
@@ -120,14 +120,13 @@ public function getForm($data = [], $loadData = true)
return false;
}
- // Modify the form based on Edit State access controls.
- if (empty($data['context'])) {
- $data['context'] = $context;
- }
+ $record = new \stdClass();
+ $record->context = $context;
+ $record->id = $jinput->get('id');
$user = $this->getCurrentUser();
- if (!$user->authorise('core.edit.state', $context . '.fieldgroup.' . $jinput->get('id'))) {
+ if (!$this->canEditState($record)) {
// Disable fields for display.
$form->setFieldAttribute('ordering', 'disabled', 'true');
$form->setFieldAttribute('state', 'disabled', 'true');
@@ -160,7 +159,9 @@ protected function canDelete($record)
return false;
}
- return $this->getCurrentUser()->authorise('core.delete', $record->context . '.fieldgroup.' . (int) $record->id);
+ $component = explode('.', $record->context)[0];
+
+ return $this->getCurrentUser()->authorise('core.delete', $component . '.fieldgroup.' . (int) $record->id);
}
/**
@@ -177,13 +178,15 @@ protected function canEditState($record)
{
$user = $this->getCurrentUser();
+ $component = explode('.', $record->context)[0];
+
// Check for existing fieldgroup.
if (!empty($record->id)) {
- return $user->authorise('core.edit.state', $record->context . '.fieldgroup.' . (int) $record->id);
+ return $user->authorise('core.edit.state', $component . '.fieldgroup.' . (int) $record->id);
}
// Default to component settings.
- return $user->authorise('core.edit.state', $record->context);
+ return $user->authorise('core.edit.state', $component);
}
/**
diff --git a/administrator/components/com_finder/src/Indexer/Indexer.php b/administrator/components/com_finder/src/Indexer/Indexer.php
index 6aec4b6572342..1ed61b79faf90 100644
--- a/administrator/components/com_finder/src/Indexer/Indexer.php
+++ b/administrator/components/com_finder/src/Indexer/Indexer.php
@@ -122,7 +122,7 @@ class Indexer
public function __construct(?DatabaseInterface $db = null)
{
if ($db === null) {
- @trigger_error(\sprintf('Database will be mandatory in 5.0.'), E_USER_DEPRECATED);
+ @trigger_error('Database will be mandatory in 5.0.', E_USER_DEPRECATED);
$db = Factory::getContainer()->get(DatabaseInterface::class);
}
diff --git a/administrator/components/com_finder/src/Indexer/Query.php b/administrator/components/com_finder/src/Indexer/Query.php
index 61b1bd4cd9b5f..17838e033bdc2 100644
--- a/administrator/components/com_finder/src/Indexer/Query.php
+++ b/administrator/components/com_finder/src/Indexer/Query.php
@@ -208,7 +208,7 @@ class Query
public function __construct($options, ?DatabaseInterface $db = null)
{
if ($db === null) {
- @trigger_error(\sprintf('Database will be mandatory in 5.0.'), E_USER_DEPRECATED);
+ @trigger_error('Database will be mandatory in 5.0.', E_USER_DEPRECATED);
$db = Factory::getContainer()->get(DatabaseInterface::class);
}
diff --git a/administrator/components/com_guidedtours/src/Helper/GuidedtoursHelper.php b/administrator/components/com_guidedtours/src/Helper/GuidedtoursHelper.php
index 004b94dac33fa..41a950c34fb77 100644
--- a/administrator/components/com_guidedtours/src/Helper/GuidedtoursHelper.php
+++ b/administrator/components/com_guidedtours/src/Helper/GuidedtoursHelper.php
@@ -24,7 +24,7 @@
class GuidedtoursHelper
{
/**
- * Load the translation files for an Guided Tour
+ * Load the translation files for a Guided Tour
*
* @param string $uid Guided Tour Unique Identifier
* @param boolean $steps Should tour steps language file be loaded
diff --git a/administrator/components/com_guidedtours/src/View/Step/HtmlView.php b/administrator/components/com_guidedtours/src/View/Step/HtmlView.php
index a25ee5be05f74..f8893688b99f4 100644
--- a/administrator/components/com_guidedtours/src/View/Step/HtmlView.php
+++ b/administrator/components/com_guidedtours/src/View/Step/HtmlView.php
@@ -23,7 +23,7 @@
// phpcs:enable PSR1.Files.SideEffects
/**
- * View to edit an Step
+ * View to edit a Step
*
* @since 4.3.0
*/
diff --git a/administrator/components/com_guidedtours/src/View/Tour/HtmlView.php b/administrator/components/com_guidedtours/src/View/Tour/HtmlView.php
index a67a3e88bf086..064f7df2a3676 100644
--- a/administrator/components/com_guidedtours/src/View/Tour/HtmlView.php
+++ b/administrator/components/com_guidedtours/src/View/Tour/HtmlView.php
@@ -23,7 +23,7 @@
// phpcs:enable PSR1.Files.SideEffects
/**
- * View to edit an tour.
+ * View to edit a tour.
*
* @since 4.3.0
*/
diff --git a/administrator/components/com_guidedtours/tmpl/step/edit.php b/administrator/components/com_guidedtours/tmpl/step/edit.php
index c47a6d07209ba..6f0fac755e907 100644
--- a/administrator/components/com_guidedtours/tmpl/step/edit.php
+++ b/administrator/components/com_guidedtours/tmpl/step/edit.php
@@ -13,8 +13,8 @@
use Joomla\CMS\HTML\HTMLHelper;
use Joomla\CMS\Language\Text;
use Joomla\CMS\Layout\LayoutHelper;
-use Joomla\CMS\Router\Route;
use Joomla\CMS\MVC\View\GenericDataException;
+use Joomla\CMS\Router\Route;
/** @var \Joomla\Component\Guidedtours\Administrator\View\Step\HtmlView $this */
diff --git a/administrator/components/com_guidedtours/tmpl/tours/default.php b/administrator/components/com_guidedtours/tmpl/tours/default.php
index 6b1f349b562f2..33ef8b8f550f5 100644
--- a/administrator/components/com_guidedtours/tmpl/tours/default.php
+++ b/administrator/components/com_guidedtours/tmpl/tours/default.php
@@ -13,8 +13,8 @@
use Joomla\CMS\Factory;
use Joomla\CMS\HTML\Helpers\StringHelper;
use Joomla\CMS\HTML\HTMLHelper;
-use Joomla\CMS\Language\Text;
use Joomla\CMS\Language\Multilanguage;
+use Joomla\CMS\Language\Text;
use Joomla\CMS\Layout\LayoutHelper;
use Joomla\CMS\Router\Route;
use Joomla\CMS\Session\Session;
diff --git a/administrator/components/com_installer/src/Controller/ManageController.php b/administrator/components/com_installer/src/Controller/ManageController.php
index 27cb7b9cd4656..1cff966e77d0e 100644
--- a/administrator/components/com_installer/src/Controller/ManageController.php
+++ b/administrator/components/com_installer/src/Controller/ManageController.php
@@ -173,7 +173,7 @@ public function loadChangelog()
$output = $model->loadChangelog($eid, $source);
- echo (new JsonResponse($output));
+ echo new JsonResponse($output);
}
/**
diff --git a/administrator/components/com_installer/src/Model/InstallModel.php b/administrator/components/com_installer/src/Model/InstallModel.php
index 94784353b08d6..42163fe5c438c 100644
--- a/administrator/components/com_installer/src/Model/InstallModel.php
+++ b/administrator/components/com_installer/src/Model/InstallModel.php
@@ -329,7 +329,7 @@ protected function _getPackageFromUpload()
// Move uploaded file.
try {
- File::upload($tmp_src, $tmp_dest, false, true);
+ File::upload($tmp_src, $tmp_dest);
} catch (FilesystemException) {
Factory::getApplication()->enqueueMessage(Text::_('COM_INSTALLER_MSG_INSTALL_WARNINSTALLUPLOADERROR'), 'error');
diff --git a/administrator/components/com_joomlaupdate/extract.php b/administrator/components/com_joomlaupdate/extract.php
index 0e50bbdeb71b5..bb9e73156ecdd 100644
--- a/administrator/components/com_joomlaupdate/extract.php
+++ b/administrator/components/com_joomlaupdate/extract.php
@@ -1956,7 +1956,7 @@ function setHugeMemoryLimit()
@unlink($basePath . 'update.php');
// Import a custom finalisation file
- $filename = \dirname(__FILE__) . '/finalisation.php';
+ $filename = __DIR__ . '/finalisation.php';
if (file_exists($filename)) {
clearFileInOPCache($filename);
diff --git a/administrator/components/com_joomlaupdate/src/Controller/DisplayController.php b/administrator/components/com_joomlaupdate/src/Controller/DisplayController.php
index dba5f257ae347..2b509f3a4640f 100644
--- a/administrator/components/com_joomlaupdate/src/Controller/DisplayController.php
+++ b/administrator/components/com_joomlaupdate/src/Controller/DisplayController.php
@@ -76,8 +76,7 @@ public function display($cachable = false, $urlparams = false)
$state->set('log_file', $this->app->get('log_path') . '/joomla_update.php');
}
- // Perform update source preference check and refresh update information.
- $model->applyUpdateSite();
+ // Refresh update information.
$model->refreshUpdates();
// Push the model into the view (as default).
diff --git a/administrator/components/com_joomlaupdate/src/Model/UpdateModel.php b/administrator/components/com_joomlaupdate/src/Model/UpdateModel.php
index 029dd990cd613..0c2218d26d403 100644
--- a/administrator/components/com_joomlaupdate/src/Model/UpdateModel.php
+++ b/administrator/components/com_joomlaupdate/src/Model/UpdateModel.php
@@ -85,18 +85,18 @@ public function __construct($config = [], ?MVCFactoryInterface $factory = null)
*
* @since 2.5.4
*/
- public function applyUpdateSite()
+ public function applyUpdateSite(?string $updateSource = null, ?string $updateURL = null)
{
- // Determine the intended update URL.
- $params = ComponentHelper::getParams('com_joomlaupdate');
+ $params = ComponentHelper::getParams('com_joomlaupdate');
+ $updateSource = $updateSource ?: $params->get('updatesource', 'default');
+ $updateURL = trim($updateURL ?: $params->get('customurl', ''));
- switch ($params->get('updatesource', 'default')) {
+ // Determine the intended update URL.
+ switch ($updateSource) {
case 'custom':
// "Custom"
// @todo: check if the customurl is valid and not just "not empty".
- if (trim($params->get('customurl', '')) != '') {
- $updateURL = trim($params->get('customurl', ''));
- } else {
+ if ($updateURL === '') {
Factory::getApplication()->enqueueMessage(Text::_('COM_JOOMLAUPDATE_CONFIG_UPDATESOURCE_CUSTOM_ERROR'), 'error');
return;
@@ -134,21 +134,19 @@ public function applyUpdateSite()
$db->setQuery($query);
$update_site = $db->loadObject();
- if ($update_site->location !== $updateURL || $update_site->type !== $updateType) {
- // Modify the database record.
- $update_site->last_check_timestamp = 0;
- $update_site->location = $updateURL;
- $update_site->type = $updateType;
- $db->updateObject('#__update_sites', $update_site, 'update_site_id');
+ // Modify the database record.
+ $update_site->last_check_timestamp = 0;
+ $update_site->location = $updateURL;
+ $update_site->type = $updateType;
+ $db->updateObject('#__update_sites', $update_site, 'update_site_id');
- // Remove cached updates.
- $query->clear()
- ->delete($db->quoteName('#__updates'))
- ->where($db->quoteName('extension_id') . ' = :id')
- ->bind(':id', $id, ParameterType::INTEGER);
- $db->setQuery($query);
- $db->execute();
- }
+ // Remove cached updates.
+ $query->clear()
+ ->delete($db->quoteName('#__updates'))
+ ->where($db->quoteName('extension_id') . ' = :id')
+ ->bind(':id', $id, ParameterType::INTEGER);
+ $db->setQuery($query);
+ $db->execute();
}
/**
@@ -614,7 +612,7 @@ public function createUpdateFile($basename = null): bool
$data .= '];';
// Remove the old file, if it's there...
- $configpath = JPATH_COMPONENT_ADMINISTRATOR . '/update.php';
+ $configpath = JPATH_ADMINISTRATOR . '/components/com_joomlaupdate/update.php';
if (is_file($configpath)) {
try {
@@ -902,8 +900,8 @@ public function cleanUp()
}
// Remove the update.php file used in Joomla 4.0.3 and later.
- if (is_file(JPATH_COMPONENT_ADMINISTRATOR . '/update.php')) {
- File::delete(JPATH_COMPONENT_ADMINISTRATOR . '/update.php');
+ if (is_file(JPATH_ADMINISTRATOR . '/components/com_joomlaupdate/update.php')) {
+ File::delete(JPATH_ADMINISTRATOR . '/components/com_joomlaupdate/update.php');
}
// Remove joomla.xml from the site's root.
@@ -996,7 +994,7 @@ public function upload()
// Move uploaded file.
try {
- File::upload($tmp_src, $tmp_dest, false);
+ File::upload($tmp_src, $tmp_dest);
} catch (FilesystemException $exception) {
throw new \RuntimeException(Text::_('COM_INSTALLER_MSG_INSTALL_WARNINSTALLUPLOADERROR'), 500, $exception);
}
@@ -1415,9 +1413,7 @@ public function getNonCoreExtensions()
$decode = json_decode($extension->manifest_cache);
// Remove unused fields so they do not cause javascript errors during pre-update check
- unset($decode->description);
- unset($decode->copyright);
- unset($decode->creationDate);
+ unset($decode->description, $decode->copyright, $decode->creationDate);
$this->translateExtensionName($extension);
$extension->version
@@ -1476,9 +1472,7 @@ public function getNonCorePlugins($folderFilter = ['system', 'user', 'authentica
$decode = json_decode($plugin->manifest_cache);
// Remove unused fields so they do not cause javascript errors during pre-update check
- unset($decode->description);
- unset($decode->copyright);
- unset($decode->creationDate);
+ unset($decode->description, $decode->copyright, $decode->creationDate);
$this->translateExtensionName($plugin);
$plugin->version = $decode->version ?? Text::_('COM_JOOMLAUPDATE_PREUPDATE_UNKNOWN_EXTENSION_MANIFESTCACHE_VERSION');
diff --git a/administrator/components/com_mails/src/Helper/MailsHelper.php b/administrator/components/com_mails/src/Helper/MailsHelper.php
index 61405818dc953..542623d0c62a7 100644
--- a/administrator/components/com_mails/src/Helper/MailsHelper.php
+++ b/administrator/components/com_mails/src/Helper/MailsHelper.php
@@ -75,7 +75,7 @@ public static function loadTranslationFiles($extension, $language = 'en-GB')
return;
}
- $lang = Factory::getLanguage();
+ $lang = Factory::getApplication()->getLanguage();
$source = '';
switch (substr($extension, 0, 3)) {
@@ -83,8 +83,8 @@ public static function loadTranslationFiles($extension, $language = 'en-GB')
default:
$source = JPATH_ADMINISTRATOR . '/components/' . $extension;
- $lang->load($extension, JPATH_BASE, $language, true)
- || $lang->load($extension, JPATH_BASE . '/components/' . $extension, $language, true);
+ $lang->load($extension, JPATH_SITE, $language, true)
+ || $lang->load($extension, JPATH_SITE . '/components/' . $extension, $language, true);
break;
diff --git a/administrator/components/com_mails/src/View/Template/HtmlView.php b/administrator/components/com_mails/src/View/Template/HtmlView.php
index f9796f4e35f6d..f13731136c781 100644
--- a/administrator/components/com_mails/src/View/Template/HtmlView.php
+++ b/administrator/components/com_mails/src/View/Template/HtmlView.php
@@ -15,7 +15,6 @@
use Joomla\CMS\MVC\View\GenericDataException;
use Joomla\CMS\MVC\View\HtmlView as BaseHtmlView;
use Joomla\CMS\Object\CMSObject;
-use Joomla\CMS\Toolbar\Toolbar;
use Joomla\CMS\Toolbar\ToolbarHelper;
use Joomla\Component\Mails\Administrator\Helper\MailsHelper;
use Joomla\Component\Mails\Administrator\Model\TemplateModel;
diff --git a/administrator/components/com_media/resources/scripts/components/browser/browser.vue b/administrator/components/com_media/resources/scripts/components/browser/browser.vue
index b882a71f5b994..b783f7bcb8715 100644
--- a/administrator/components/com_media/resources/scripts/components/browser/browser.vue
+++ b/administrator/components/com_media/resources/scripts/components/browser/browser.vue
@@ -30,7 +30,7 @@
authorise('core.create', 'com_media')) {
// Add the upload button
- $layout = new FileLayout('toolbar.upload', JPATH_COMPONENT_ADMINISTRATOR . '/layouts');
+ $layout = new FileLayout('toolbar.upload', JPATH_ADMINISTRATOR . '/components/com_media/layouts');
$toolbar->customButton('upload')
->html($layout->render([]));
@@ -116,7 +116,7 @@ protected function prepareToolbar()
// Add a delete button
if ($user->authorise('core.delete', 'com_media')) {
// Instantiate a new FileLayout instance and render the layout
- $layout = new FileLayout('toolbar.delete', JPATH_COMPONENT_ADMINISTRATOR . '/layouts');
+ $layout = new FileLayout('toolbar.delete', JPATH_ADMINISTRATOR . '/components/com_media/layouts');
$toolbar->customButton('delete')
->html($layout->render([]));
diff --git a/administrator/components/com_menus/src/Model/ItemModel.php b/administrator/components/com_menus/src/Model/ItemModel.php
index a012cc94b3269..3b4d4ba88d0d0 100644
--- a/administrator/components/com_menus/src/Model/ItemModel.php
+++ b/administrator/components/com_menus/src/Model/ItemModel.php
@@ -567,7 +567,7 @@ protected function loadFormData()
// Only merge if there is a session and itemId or itemid is null.
if (
- isset($sessionData['id']) && isset($itemData['id']) && $sessionData['id'] === $itemData['id']
+ isset($sessionData['id'], $itemData['id']) && $sessionData['id'] === $itemData['id']
|| \is_null($itemData['id'])
) {
$data = array_merge($itemData, $sessionData);
diff --git a/administrator/components/com_menus/src/Model/MenutypesModel.php b/administrator/components/com_menus/src/Model/MenutypesModel.php
index 5fa7c17fbb8bd..2f9a826a0b0f5 100644
--- a/administrator/components/com_menus/src/Model/MenutypesModel.php
+++ b/administrator/components/com_menus/src/Model/MenutypesModel.php
@@ -537,8 +537,7 @@ protected function getTypeOptionsFromLayouts($component, $view)
// If the view is hidden from the menu, discard it and move on to the next view.
if (!empty($menu['hidden']) && $menu['hidden'] == 'true') {
- unset($xml);
- unset($o);
+ unset($xml, $o);
continue;
}
diff --git a/administrator/components/com_messages/src/View/Messages/HtmlView.php b/administrator/components/com_messages/src/View/Messages/HtmlView.php
index b6ec48d0692b0..a03cc1fad8e51 100644
--- a/administrator/components/com_messages/src/View/Messages/HtmlView.php
+++ b/administrator/components/com_messages/src/View/Messages/HtmlView.php
@@ -117,7 +117,6 @@ public function display($tpl = null)
*/
protected function addToolbar()
{
- $state = $this->state;
$canDo = ContentHelper::getActions('com_messages');
$user = $this->getCurrentUser();
diff --git a/administrator/components/com_modules/src/Controller/ModuleController.php b/administrator/components/com_modules/src/Controller/ModuleController.php
index 90a83929d08b9..f6b14678e9f69 100644
--- a/administrator/components/com_modules/src/Controller/ModuleController.php
+++ b/administrator/components/com_modules/src/Controller/ModuleController.php
@@ -141,7 +141,7 @@ protected function allowSave($data, $key = 'id')
protected function allowEdit($data = [], $key = 'id')
{
// Initialise variables.
- $recordId = (int) isset($data[$key]) ? $data[$key] : 0;
+ $recordId = isset($data[$key]) ? (int) $data[$key] : 0;
// Zero record (id:0), return component edit permission by calling parent controller method
if (!$recordId) {
diff --git a/administrator/components/com_modules/src/View/Modules/HtmlView.php b/administrator/components/com_modules/src/View/Modules/HtmlView.php
index 87eb4cfa73fe7..f66002c263416 100644
--- a/administrator/components/com_modules/src/View/Modules/HtmlView.php
+++ b/administrator/components/com_modules/src/View/Modules/HtmlView.php
@@ -156,8 +156,7 @@ public function display($tpl = null)
// If in the frontend state and language should not activate the search tools.
if (Factory::getApplication()->isClient('site')) {
- unset($this->activeFilters['state']);
- unset($this->activeFilters['language']);
+ unset($this->activeFilters['state'], $this->activeFilters['language']);
}
}
diff --git a/administrator/components/com_newsfeeds/src/Controller/NewsfeedController.php b/administrator/components/com_newsfeeds/src/Controller/NewsfeedController.php
index 1e279a399322d..e369f2c2a3ca2 100644
--- a/administrator/components/com_newsfeeds/src/Controller/NewsfeedController.php
+++ b/administrator/components/com_newsfeeds/src/Controller/NewsfeedController.php
@@ -68,7 +68,7 @@ protected function allowAdd($data = [])
*/
protected function allowEdit($data = [], $key = 'id')
{
- $recordId = (int) isset($data[$key]) ? $data[$key] : 0;
+ $recordId = isset($data[$key]) ? (int) $data[$key] : 0;
// Since there is no asset tracking, fallback to the component permissions.
if (!$recordId) {
diff --git a/administrator/components/com_newsfeeds/src/Model/NewsfeedsModel.php b/administrator/components/com_newsfeeds/src/Model/NewsfeedsModel.php
index f6796b06894ca..888b929f9ebe3 100644
--- a/administrator/components/com_newsfeeds/src/Model/NewsfeedsModel.php
+++ b/administrator/components/com_newsfeeds/src/Model/NewsfeedsModel.php
@@ -170,6 +170,7 @@ protected function getListQuery()
$db->quoteName('a.language'),
$db->quoteName('a.publish_up'),
$db->quoteName('a.publish_down'),
+ $db->quoteName('a.modified_by'),
]
)
)
diff --git a/administrator/components/com_postinstall/src/Helper/PostinstallHelper.php b/administrator/components/com_postinstall/src/Helper/PostinstallHelper.php
index 59838745fbb0f..b41667da25a2c 100644
--- a/administrator/components/com_postinstall/src/Helper/PostinstallHelper.php
+++ b/administrator/components/com_postinstall/src/Helper/PostinstallHelper.php
@@ -32,9 +32,9 @@ class PostinstallHelper
*/
public function parsePath($path)
{
- if (str_contains($path, 'site://')) {
+ if (str_starts_with($path, 'site://')) {
$path = JPATH_ROOT . str_replace('site://', '/', $path);
- } elseif (str_contains($path, 'admin://')) {
+ } elseif (str_starts_with($path, 'admin://')) {
$path = JPATH_ADMINISTRATOR . str_replace('admin://', '/', $path);
}
diff --git a/administrator/components/com_scheduler/src/Helper/SchedulerHelper.php b/administrator/components/com_scheduler/src/Helper/SchedulerHelper.php
index c3dcd616515d5..3d809baeac76f 100644
--- a/administrator/components/com_scheduler/src/Helper/SchedulerHelper.php
+++ b/administrator/components/com_scheduler/src/Helper/SchedulerHelper.php
@@ -63,6 +63,13 @@ public static function getTaskOptions(): TaskOptions
PluginHelper::importPlugin('task');
$app->getDispatcher()->dispatch('onTaskOptionsList', $event);
+ if (isset($options->options) && \is_array($options->options)) {
+ // Sort the options alphabetically by title
+ usort($options->options, function ($a, $b) {
+ return strcmp($a->getTitle(), $b->getTitle());
+ });
+ }
+
self::$taskOptionsCache = $options;
return $options;
diff --git a/administrator/components/com_scheduler/src/Task/TaskOption.php b/administrator/components/com_scheduler/src/Task/TaskOption.php
index 4603edac78d29..1612a4799f871 100644
--- a/administrator/components/com_scheduler/src/Task/TaskOption.php
+++ b/administrator/components/com_scheduler/src/Task/TaskOption.php
@@ -78,6 +78,18 @@ public function __construct(string $type, string $langConstPrefix)
$this->langConstPrefix = $langConstPrefix;
}
+ /**
+ * Method to get the type title.
+ *
+ * @return string The type title.
+ *
+ * @since 5.3.0
+ */
+ public function getTitle(): string
+ {
+ return $this->title;
+ }
+
/**
* Magic method to allow read-only access to private properties.
*
diff --git a/administrator/components/com_scheduler/src/View/Logs/HtmlView.php b/administrator/components/com_scheduler/src/View/Logs/HtmlView.php
index c898b70254f78..b1a23b35d04cc 100644
--- a/administrator/components/com_scheduler/src/View/Logs/HtmlView.php
+++ b/administrator/components/com_scheduler/src/View/Logs/HtmlView.php
@@ -111,7 +111,6 @@ public function display($tpl = null): void
protected function addToolbar(): void
{
$canDo = ContentHelper::getActions('com_scheduler');
- $user = Factory::getApplication()->getIdentity();
$toolbar = Toolbar::getInstance();
ToolbarHelper::title(Text::_('COM_SCHEDULER_FIELDSET_EXEC_HIST'), 'list');
diff --git a/administrator/components/com_tags/src/Model/TagsModel.php b/administrator/components/com_tags/src/Model/TagsModel.php
index b5b435973a744..b80b86fc8cd63 100644
--- a/administrator/components/com_tags/src/Model/TagsModel.php
+++ b/administrator/components/com_tags/src/Model/TagsModel.php
@@ -276,7 +276,7 @@ public function getItems()
$items = parent::getItems();
if ($items != false) {
- $extension = $this->getState('filter.extension');
+ $extension = $this->getState('filter.extension', '');
$this->countItems($items, $extension);
}
diff --git a/administrator/components/com_templates/src/Model/StyleModel.php b/administrator/components/com_templates/src/Model/StyleModel.php
index bb381388aea5e..ee5ed39d665aa 100644
--- a/administrator/components/com_templates/src/Model/StyleModel.php
+++ b/administrator/components/com_templates/src/Model/StyleModel.php
@@ -11,19 +11,16 @@
namespace Joomla\Component\Templates\Administrator\Model;
use Joomla\CMS\Application\ApplicationHelper;
-use Joomla\CMS\Component\ComponentHelper;
use Joomla\CMS\Factory;
use Joomla\CMS\Form\Form;
use Joomla\CMS\Language\Multilanguage;
use Joomla\CMS\Language\Text;
use Joomla\CMS\MVC\Factory\MVCFactoryInterface;
use Joomla\CMS\MVC\Model\AdminModel;
-use Joomla\CMS\Object\CMSObject;
use Joomla\CMS\Plugin\PluginHelper;
use Joomla\CMS\Table\Table;
use Joomla\Database\ParameterType;
use Joomla\Filesystem\Path;
-use Joomla\Registry\Registry;
use Joomla\String\StringHelper;
use Joomla\Utilities\ArrayHelper;
@@ -54,14 +51,6 @@ class StyleModel extends AdminModel
*/
protected $helpURL;
- /**
- * Item cache.
- *
- * @var array
- * @since 1.6
- */
- private $_cache = [];
-
/**
* Constructor.
*
@@ -87,28 +76,6 @@ public function __construct($config = [], ?MVCFactoryInterface $factory = null)
parent::__construct($config, $factory);
}
- /**
- * Method to auto-populate the model state.
- *
- * @note Calling getState in this method will result in recursion.
- *
- * @return void
- *
- * @since 1.6
- */
- protected function populateState()
- {
- $app = Factory::getApplication();
-
- // Load the User state.
- $pk = $app->getInput()->getInt('id');
- $this->setState('style.id', $pk);
-
- // Load the parameters.
- $params = ComponentHelper::getParams('com_templates');
- $this->setState('params', $params);
- }
-
/**
* Method to delete rows.
*
@@ -284,10 +251,6 @@ public function getForm($data = [], $loadData = true)
// Get the form.
$form = $this->loadForm('com_templates.style', 'style', ['control' => 'jform', 'load_data' => $loadData]);
- if (empty($form)) {
- return false;
- }
-
// Modify the form based on access controls.
if (!$this->canEditState((object) $data)) {
// Disable fields for display.
@@ -331,42 +294,18 @@ protected function loadFormData()
*/
public function getItem($pk = null)
{
- $pk = (!empty($pk)) ? $pk : (int) $this->getState('style.id');
-
- if (!isset($this->_cache[$pk])) {
- // Get a row instance.
- $table = $this->getTable();
-
- // Attempt to load the row.
- $return = $table->load($pk);
-
- // Check for a table object error.
- if ($return === false && $table->getError()) {
- $this->setError($table->getError());
-
- return false;
- }
-
- // Convert to the \Joomla\CMS\Object\CMSObject before adding other data.
- $properties = $table->getProperties(1);
- $this->_cache[$pk] = ArrayHelper::toObject($properties, CMSObject::class);
-
- // Convert the params field to an array.
- $registry = new Registry($table->params);
- $this->_cache[$pk]->params = $registry->toArray();
-
- // Get the template XML.
- $client = ApplicationHelper::getClientInfo($table->client_id);
- $path = Path::clean($client->path . '/templates/' . $table->template . '/templateDetails.xml');
+ if ($item = parent::getItem($pk)) {
+ $client = ApplicationHelper::getClientInfo($item->client_id);
+ $path = Path::clean($client->path . '/templates/' . $item->template . '/templateDetails.xml');
if (file_exists($path)) {
- $this->_cache[$pk]->xml = simplexml_load_file($path);
+ $item->xml = simplexml_load_file($path);
} else {
- $this->_cache[$pk]->xml = null;
+ $item->xml = null;
}
}
- return $this->_cache[$pk];
+ return $item;
}
/**
@@ -385,7 +324,7 @@ protected function preprocessForm(Form $form, $data, $group = 'content')
{
$clientId = $this->getState('item.client_id');
$template = $this->getState('item.template');
- $lang = Factory::getLanguage();
+ $lang = Factory::getApplication()->getLanguage();
$client = ApplicationHelper::getClientInfo($clientId);
if (!$form->loadFile('style_' . $client->name, true)) {
@@ -394,10 +333,18 @@ protected function preprocessForm(Form $form, $data, $group = 'content')
$formFile = Path::clean($client->path . '/templates/' . $template . '/templateDetails.xml');
+ /**
+ * $data could be array or object, so we use object casting here to make sure $styleObj
+ * is an object and access to template style data via the object's properties
+ */
+ $styleObj = (object) $data;
+
// Load the core and/or local language file(s).
// Default to using parent template language constants
- $lang->load('tpl_' . $data->parent, $client->path)
- || $lang->load('tpl_' . $data->parent, $client->path . '/templates/' . $data->parent);
+ if (!empty($styleObj->parent)) {
+ $lang->load('tpl_' . $styleObj->parent, $client->path)
+ || $lang->load('tpl_' . $styleObj->parent, $client->path . '/templates/' . $styleObj->parent);
+ }
// Apply any, optional, overrides for child template language constants
$lang->load('tpl_' . $template, $client->path)
@@ -411,11 +358,7 @@ protected function preprocessForm(Form $form, $data, $group = 'content')
}
// Disable home field if it is default style
-
- if (
- (\is_array($data) && \array_key_exists('home', $data) && $data['home'] == '1')
- || (\is_object($data) && isset($data->home) && $data->home == '1')
- ) {
+ if (isset($styleObj->home) && $styleObj->home == '1') {
$form->setFieldAttribute('home', 'readonly', 'true');
}
diff --git a/administrator/components/com_templates/src/Model/TemplateModel.php b/administrator/components/com_templates/src/Model/TemplateModel.php
index f62fe8495a0e5..4f0a1724995e5 100644
--- a/administrator/components/com_templates/src/Model/TemplateModel.php
+++ b/administrator/components/com_templates/src/Model/TemplateModel.php
@@ -238,8 +238,6 @@ public function getCoreList()
// Initialize the array variable to store core file list.
$this->coreFileList = [];
- $app = Factory::getApplication();
-
foreach ($templates as $template) {
$client = ApplicationHelper::getClientInfo($template->client_id);
$element = Path::clean($client->path . '/templates/' . $template->element . '/');
@@ -473,7 +471,6 @@ public function getDirectoryTree($dir)
*/
public function getCoreFile($file, $client_id)
{
- $app = Factory::getApplication();
$filePath = Path::clean($file);
$explodeArray = explode(DIRECTORY_SEPARATOR, $filePath);
@@ -701,7 +698,7 @@ public function checkNewName()
->bind(':name', $name);
$db->setQuery($query);
- return ($db->loadResult() == 0);
+ return $db->loadResult() == 0;
}
/**
@@ -2002,15 +1999,17 @@ public function child()
}
$user = $this->getCurrentUser();
- unset($xml->languages);
- unset($xml->media);
- unset($xml->files);
- unset($xml->parent);
- unset($xml->inheritable);
// Remove the update parts
- unset($xml->update);
- unset($xml->updateservers);
+ unset(
+ $xml->languages,
+ $xml->media,
+ $xml->files,
+ $xml->parent,
+ $xml->inheritable,
+ $xml->update,
+ $xml->updateservers
+ );
if (isset($xml->creationDate)) {
$xml->creationDate = (new Date('now'))->format('F Y');
diff --git a/administrator/components/com_templates/src/View/Style/JsonView.php b/administrator/components/com_templates/src/View/Style/JsonView.php
index 37a71594722ac..e86554c725d69 100644
--- a/administrator/components/com_templates/src/View/Style/JsonView.php
+++ b/administrator/components/com_templates/src/View/Style/JsonView.php
@@ -69,7 +69,7 @@ public function display($tpl = null)
return false;
}
- $paramsList = (array) $this->item;
+ $paramsList = get_object_vars($this->item);
unset($paramsList['xml']);
diff --git a/administrator/components/com_templates/src/View/Templates/HtmlView.php b/administrator/components/com_templates/src/View/Templates/HtmlView.php
index ffe907ba60176..9e11c30277732 100644
--- a/administrator/components/com_templates/src/View/Templates/HtmlView.php
+++ b/administrator/components/com_templates/src/View/Templates/HtmlView.php
@@ -142,7 +142,7 @@ protected function addToolbar()
$toolbar = $this->getDocument()->getToolbar();
// Add a shortcut to the styles list view.
- $toolbar->linkButton('', 'COM_TEMPLATES_MANAGER_STYLES_BUTTON')
+ $toolbar->linkButton('styles', 'COM_TEMPLATES_MANAGER_STYLES_BUTTON')
->url('index.php?option=com_templates&view=styles&client_id=' . $clientId)
->icon('icon-brush thememanager');
diff --git a/administrator/components/com_users/src/Controller/CallbackController.php b/administrator/components/com_users/src/Controller/CallbackController.php
index e58524965240e..f2c5075b10b1f 100644
--- a/administrator/components/com_users/src/Controller/CallbackController.php
+++ b/administrator/components/com_users/src/Controller/CallbackController.php
@@ -58,8 +58,6 @@ public function __construct(array $config = [], ?MVCFactoryInterface $factory =
*/
public function callback($cachable = false, $urlparams = false): void
{
- $app = $this->app;
-
// Get the Method and make sure it's non-empty
$method = $this->input->getCmd('method', '');
diff --git a/administrator/components/com_users/src/Controller/GroupController.php b/administrator/components/com_users/src/Controller/GroupController.php
index f3e0d4cb0e5b2..e8a47efc2b232 100644
--- a/administrator/components/com_users/src/Controller/GroupController.php
+++ b/administrator/components/com_users/src/Controller/GroupController.php
@@ -44,7 +44,7 @@ class GroupController extends FormController
*/
protected function allowSave($data, $key = 'id')
{
- return ($this->app->getIdentity()->authorise('core.admin', $this->option) && parent::allowSave($data, $key));
+ return $this->app->getIdentity()->authorise('core.admin', $this->option) && parent::allowSave($data, $key);
}
/**
diff --git a/administrator/components/com_users/src/Controller/LevelController.php b/administrator/components/com_users/src/Controller/LevelController.php
index f4d36c7a69fa7..a16fc20e4c7eb 100644
--- a/administrator/components/com_users/src/Controller/LevelController.php
+++ b/administrator/components/com_users/src/Controller/LevelController.php
@@ -47,7 +47,7 @@ class LevelController extends FormController
*/
protected function allowSave($data, $key = 'id')
{
- return ($this->app->getIdentity()->authorise('core.admin', $this->option) && parent::allowSave($data, $key));
+ return $this->app->getIdentity()->authorise('core.admin', $this->option) && parent::allowSave($data, $key);
}
/**
diff --git a/administrator/components/com_users/src/Model/BackupcodesModel.php b/administrator/components/com_users/src/Model/BackupcodesModel.php
index cae3ab133197b..33271b4f73c99 100644
--- a/administrator/components/com_users/src/Model/BackupcodesModel.php
+++ b/administrator/components/com_users/src/Model/BackupcodesModel.php
@@ -252,7 +252,7 @@ public function isBackupCode($code, ?User $user = null): bool
*/
$otherResult = false;
- $temp1 = '';
+ $temp1 = [];
for ($i = 0; $i < 10; $i++) {
$temp1[$i] = random_int(0, 99999999);
diff --git a/administrator/components/com_users/src/Model/CaptiveModel.php b/administrator/components/com_users/src/Model/CaptiveModel.php
index 9cbe58c36790e..358d2a15e0a92 100644
--- a/administrator/components/com_users/src/Model/CaptiveModel.php
+++ b/administrator/components/com_users/src/Model/CaptiveModel.php
@@ -426,7 +426,7 @@ public function checkTryLimit(MfaTable $method)
$maxTries = (int) $params->get('mfatrycount', 10);
$blockHours = (int) $params->get('mfatrytime', 1);
- $lastTryTime = strtotime($method->last_try) ?: 0;
+ $lastTryTime = $method->last_try !== null ? strtotime($method->last_try) : 0;
$hoursSinceLastTry = (strtotime(Factory::getDate()->toSql()) - $lastTryTime) / 3600;
if ($method->last_try !== null && $hoursSinceLastTry > $blockHours) {
diff --git a/administrator/components/com_users/src/Model/UserModel.php b/administrator/components/com_users/src/Model/UserModel.php
index 889add8c3d370..ecfaf6e7275d5 100644
--- a/administrator/components/com_users/src/Model/UserModel.php
+++ b/administrator/components/com_users/src/Model/UserModel.php
@@ -292,7 +292,7 @@ public function save($data)
}
// Destroy all active sessions for the user after changing the password or blocking him
- if ($data['password2'] || $data['block']) {
+ if (!empty($data['password2']) || $data['block']) {
UserHelper::destroyUserSessions($user->id, true);
}
diff --git a/administrator/help/en-GB/toc.json b/administrator/help/en-GB/toc.json
index 630ec1846c336..5af8c2abd5c5b 100644
--- a/administrator/help/en-GB/toc.json
+++ b/administrator/help/en-GB/toc.json
@@ -1 +1 @@
-{"Articles":"ARTICLES","Articles:_Categories":"ARTICLES:_CATEGORIES","Articles:_Edit":"ARTICLES:_EDIT","Articles:_Edit_Category":"ARTICLES:_EDIT_CATEGORY","Articles:_Featured":"ARTICLES:_FEATURED","Banners":"BANNERS","Banners:_Categories":"BANNERS:_CATEGORIES","Banners:_Clients":"BANNERS:_CLIENTS","Banners:_Edit":"BANNERS:_EDIT","Banners:_New_or_Edit_Category":"BANNERS:_NEW_OR_EDIT_CATEGORY","Banners:_New_or_Edit_Client":"BANNERS:_NEW_OR_EDIT_CLIENT","Banners:_Tracks":"BANNERS:_TRACKS","Contacts":"CONTACTS","Contacts:_Categories":"CONTACTS:_CATEGORIES","Contacts:_Edit":"CONTACTS:_EDIT","Contacts:_Edit_Category":"CONTACTS:_EDIT_CATEGORY","Admin_Modules:_Action_Logs_-_Latest":"ADMIN_MODULES:_ACTION_LOGS_-_LATEST","Admin_Modules:_Administrator_Dashboard_Menu":"ADMIN_MODULES:_ADMINISTRATOR_DASHBOARD_MENU","Admin_Modules:_Administrator_Menu":"ADMIN_MODULES:_ADMINISTRATOR_MENU","Admin_Modules:_Articles_-_Latest":"ADMIN_MODULES:_ARTICLES_-_LATEST","Admin_Modules:_Custom":"ADMIN_MODULES:_CUSTOM","Admin_Modules:_Feed_Display":"ADMIN_MODULES:_FEED_DISPLAY","Admin_Modules:_Frontend_Link":"ADMIN_MODULES:_FRONTEND_LINK","Admin_Modules:_Guided_Tours":"ADMIN_MODULES:_GUIDED_TOURS","Admin_Modules:_Joomla_Version_Information":"ADMIN_MODULES:_JOOMLA_VERSION_INFORMATION","Admin_Modules:_Login_Form":"ADMIN_MODULES:_LOGIN_FORM","Admin_Modules:_Login_Support_Information":"ADMIN_MODULES:_LOGIN_SUPPORT_INFORMATION","Admin_Modules:_Messages":"ADMIN_MODULES:_MESSAGES","Admin_Modules:_Multilingual_Status":"ADMIN_MODULES:_MULTILINGUAL_STATUS","Admin_Modules:_Popular_Articles":"ADMIN_MODULES:_POPULAR_ARTICLES","Admin_Modules:_Post_Installation_Messages":"ADMIN_MODULES:_POST_INSTALLATION_MESSAGES","Admin_Modules:_Privacy_Dashboard":"ADMIN_MODULES:_PRIVACY_DASHBOARD","Admin_Modules:_Privacy_Status_Check":"ADMIN_MODULES:_PRIVACY_STATUS_CHECK","Admin_Modules:_Quick_Icons":"ADMIN_MODULES:_QUICK_ICONS","Admin_Modules:_Sample_Data":"ADMIN_MODULES:_SAMPLE_DATA","Admin_Modules:_Title":"ADMIN_MODULES:_TITLE","Admin_Modules:_Toolbar":"ADMIN_MODULES:_TOOLBAR","Articles:_Options":"ARTICLES:_OPTIONS","Banners:_Options":"BANNERS:_OPTIONS","Cache:_Options":"CACHE:_OPTIONS","Check-in:_Options":"CHECK-IN:_OPTIONS","Contacts:_Options":"CONTACTS:_OPTIONS","Edit_Update_Site":"EDIT_UPDATE_SITE","Editors":"EDITORS","Extensions:_Discover":"EXTENSIONS:_DISCOVER","Extensions:_Install":"EXTENSIONS:_INSTALL","Extensions:_Languages":"EXTENSIONS:_LANGUAGES","Extensions:_Manage":"EXTENSIONS:_MANAGE","Extensions:_Update":"EXTENSIONS:_UPDATE","Extensions:_Update_Sites":"EXTENSIONS:_UPDATE_SITES","Field_Groups":"FIELD_GROUPS","Field_Groups:_Edit":"FIELD_GROUPS:_EDIT","Fields":"FIELDS","Fields:_Edit":"FIELDS:_EDIT","Guided_Tours":"GUIDED_TOURS","Guided_Tours:_New_or_Edit_Step":"GUIDED_TOURS:_NEW_OR_EDIT_STEP","Guided_Tours:_New_or_Edit_Tour":"GUIDED_TOURS:_NEW_OR_EDIT_TOUR","Guided_Tours:_Options":"GUIDED_TOURS:_OPTIONS","Guided_Tours:_Steps":"GUIDED_TOURS:_STEPS","Home_Dashboard":"HOME_DASHBOARD","Information:_Database":"INFORMATION:_DATABASE","Information:_Warnings":"INFORMATION:_WARNINGS","Installer:_Options":"INSTALLER:_OPTIONS","Joomla_Update":"JOOMLA_UPDATE","Joomla_Update:_Options":"JOOMLA_UPDATE:_OPTIONS","Languages:_Content":"LANGUAGES:_CONTENT","Languages:_Edit_Content_Language":"LANGUAGES:_EDIT_CONTENT_LANGUAGE","Languages:_Edit_Override":"LANGUAGES:_EDIT_OVERRIDE","Languages:_Installed":"LANGUAGES:_INSTALLED","Languages:_Options":"LANGUAGES:_OPTIONS","Languages:_Overrides":"LANGUAGES:_OVERRIDES","Mail_Template:_Edit":"MAIL_TEMPLATE:_EDIT","Mail_Templates":"MAIL_TEMPLATES","Mail_Templates:_Options":"MAIL_TEMPLATES:_OPTIONS","Maintenance:_Clear_Cache":"MAINTENANCE:_CLEAR_CACHE","Maintenance:_Global_Check-in":"MAINTENANCE:_GLOBAL_CHECK-IN","Mass_Mail_Users":"MASS_MAIL_USERS","Media":"MEDIA","Media:_Options":"MEDIA:_OPTIONS","Menu_Item:_Alias":"MENU_ITEM:_ALIAS","Menu_Item:_Article_Archived":"MENU_ITEM:_ARTICLE_ARCHIVED","Menu_Item:_Compact_List_of_Tagged_Items":"MENU_ITEM:_COMPACT_LIST_OF_TAGGED_ITEMS","Menu_Item:_Components_Menu_Container":"MENU_ITEM:_COMPONENTS_MENU_CONTAINER","Menu_Item:_Confirm_Request":"MENU_ITEM:_CONFIRM_REQUEST","Menu_Item:_Create_Article":"MENU_ITEM:_CREATE_ARTICLE","Menu_Item:_Create_Contact":"MENU_ITEM:_CREATE_CONTACT","Menu_Item:_Create_Request":"MENU_ITEM:_CREATE_REQUEST","Menu_Item:_Display_Template_Options":"MENU_ITEM:_DISPLAY_TEMPLATE_OPTIONS","Menu_Item:_Extend_Consent":"MENU_ITEM:_EXTEND_CONSENT","Menu_Item:_Featured_Articles":"MENU_ITEM:_FEATURED_ARTICLES","Menu_Item:_Featured_Contacts":"MENU_ITEM:_FEATURED_CONTACTS","Menu_Item:_Heading":"MENU_ITEM:_HEADING","Menu_Item:_Iframe_Wrapper":"MENU_ITEM:_IFRAME_WRAPPER","Menu_Item:_List_All_Tags":"MENU_ITEM:_LIST_ALL_TAGS","Menu_Item:_Login_Form":"MENU_ITEM:_LOGIN_FORM","Menu_Item:_Logout":"MENU_ITEM:_LOGOUT","Menu_Item:_New_Item":"MENU_ITEM:_NEW_ITEM","Menu_Item:_Password_Reset":"MENU_ITEM:_PASSWORD_RESET","Menu_Item:_Registration_Form":"MENU_ITEM:_REGISTRATION_FORM","Menu_Item:_Search":"MENU_ITEM:_SEARCH","Menu_Item:_Separator":"MENU_ITEM:_SEPARATOR","Menu_Item:_Single_Article":"MENU_ITEM:_SINGLE_ARTICLE","Menu_Item:_Single_Contact":"MENU_ITEM:_SINGLE_CONTACT","Menu_Item:_Single_News_Feed":"MENU_ITEM:_SINGLE_NEWS_FEED","Menu_Item:_Site_Configuration_Options":"MENU_ITEM:_SITE_CONFIGURATION_OPTIONS","Menu_Item:_Tagged_Items":"MENU_ITEM:_TAGGED_ITEMS","Menu_Item:_URL":"MENU_ITEM:_URL","Menus":"MENUS","Menus:_Edit":"MENUS:_EDIT","Menus:_Items":"MENUS:_ITEMS","Menus:_Options":"MENUS:_OPTIONS","Messages:_Options":"MESSAGES:_OPTIONS","Modules":"MODULES","Modules:_Options":"MODULES:_OPTIONS","Multilingual_Associations":"MULTILINGUAL_ASSOCIATIONS","Multilingual_Associations:_Edit":"MULTILINGUAL_ASSOCIATIONS:_EDIT","Multilingual_Associations:_Options":"MULTILINGUAL_ASSOCIATIONS:_OPTIONS","My_Profile":"MY_PROFILE","News_Feed:_Options":"NEWS_FEED:_OPTIONS","News_Feeds":"NEWS_FEEDS","News_Feeds:_Categories":"NEWS_FEEDS:_CATEGORIES","News_Feeds:_Edit":"NEWS_FEEDS:_EDIT","News_Feeds:_Edit_Category":"NEWS_FEEDS:_EDIT_CATEGORY","Permissions_for_Group":"PERMISSIONS_FOR_GROUP","Permissions_for_User":"PERMISSIONS_FOR_USER","Plugin:_Options":"PLUGIN:_OPTIONS","Plugins":"PLUGINS","Plugins:_Name_of_Plugin":"PLUGINS:_NAME_OF_PLUGIN","Post-installation_Messages_for_Joomla_CMS":"POST-INSTALLATION_MESSAGES_FOR_JOOMLA_CMS","Post-installation_Messages:_Options":"POST-INSTALLATION_MESSAGES:_OPTIONS","Privacy_Dashboard":"PRIVACY_DASHBOARD","Privacy:_Consents":"PRIVACY:_CONSENTS","Privacy:_Extension_Capabilities":"PRIVACY:_EXTENSION_CAPABILITIES","Privacy:_Information_Requests":"PRIVACY:_INFORMATION_REQUESTS","Privacy:_New_Information_Request":"PRIVACY:_NEW_INFORMATION_REQUEST","Privacy:_Options":"PRIVACY:_OPTIONS","Privacy:_Review_Information_Request":"PRIVACY:_REVIEW_INFORMATION_REQUEST","Private_Messages":"PRIVATE_MESSAGES","Private_Messages:_Read":"PRIVATE_MESSAGES:_READ","Private_Messages:_Write":"PRIVATE_MESSAGES:_WRITE","Redirect:_Options":"REDIRECT:_OPTIONS","Redirects:_Links":"REDIRECTS:_LINKS","Redirects:_New_or_Edit":"REDIRECTS:_NEW_OR_EDIT","Scheduled_Tasks":"SCHEDULED_TASKS","Scheduled_Tasks:_Edit":"SCHEDULED_TASKS:_EDIT","Scheduled_Tasks:_Options":"SCHEDULED_TASKS:_OPTIONS","Site_Global_Configuration":"SITE_GLOBAL_CONFIGURATION","Site_Modules:_Articles_-_Archived":"SITE_MODULES:_ARTICLES_-_ARCHIVED","Site_Modules:_Articles_-_Latest":"SITE_MODULES:_ARTICLES_-_LATEST","Site_Modules:_Articles_-_Most_Read":"SITE_MODULES:_ARTICLES_-_MOST_READ","Site_Modules:_Articles_-_Newsflash":"SITE_MODULES:_ARTICLES_-_NEWSFLASH","Site_Modules:_Articles_-_Related":"SITE_MODULES:_ARTICLES_-_RELATED","Site_Modules:_Banners":"SITE_MODULES:_BANNERS","Site_Modules:_Breadcrumbs":"SITE_MODULES:_BREADCRUMBS","Site_Modules:_Custom":"SITE_MODULES:_CUSTOM","Site_Modules:_Feed_Display":"SITE_MODULES:_FEED_DISPLAY","Site_Modules:_Footer":"SITE_MODULES:_FOOTER","Site_Modules:_Language_Switcher":"SITE_MODULES:_LANGUAGE_SWITCHER","Site_Modules:_Login":"SITE_MODULES:_LOGIN","Site_Modules:_Menu":"SITE_MODULES:_MENU","Site_Modules:_Random_Image":"SITE_MODULES:_RANDOM_IMAGE","Site_Modules:_Smart_Search":"SITE_MODULES:_SMART_SEARCH","Site_Modules:_Statistics":"SITE_MODULES:_STATISTICS","Site_Modules:_Syndication_Feeds":"SITE_MODULES:_SYNDICATION_FEEDS","Site_Modules:_Tags_-_Popular":"SITE_MODULES:_TAGS_-_POPULAR","Site_Modules:_Tags_-_Similar":"SITE_MODULES:_TAGS_-_SIMILAR","Site_Modules:_Wrapper":"SITE_MODULES:_WRAPPER","Site_System_Information":"SITE_SYSTEM_INFORMATION","Smart_Search:_Content_Maps":"SMART_SEARCH:_CONTENT_MAPS","Smart_Search:_Indexed_Content":"SMART_SEARCH:_INDEXED_CONTENT","Smart_Search:_New_or_Edit_Filter":"SMART_SEARCH:_NEW_OR_EDIT_FILTER","Smart_Search:_Options":"SMART_SEARCH:_OPTIONS","Smart_Search:_Search_Filters":"SMART_SEARCH:_SEARCH_FILTERS","Smart_Search:_Search_Term_Analysis":"SMART_SEARCH:_SEARCH_TERM_ANALYSIS","Stages_List:_Basic_Workflow":"STAGES_LIST:_BASIC_WORKFLOW","Start_Here":"START_HERE","Tags":"TAGS","Tags:_New_or_Edit":"TAGS:_NEW_OR_EDIT","Tags:_Options":"TAGS:_OPTIONS","Template:_Options":"TEMPLATE:_OPTIONS","Templates:_Customise":"TEMPLATES:_CUSTOMISE","Templates:_Customise_Source":"TEMPLATES:_CUSTOMISE_SOURCE","Templates:_Edit_Style":"TEMPLATES:_EDIT_STYLE","Templates:_Styles":"TEMPLATES:_STYLES","Templates:_Templates":"TEMPLATES:_TEMPLATES","Transitions_List:_Basic_Workflow":"TRANSITIONS_LIST:_BASIC_WORKFLOW","User_Actions_Log":"USER_ACTIONS_LOG","User_Actions_Log:_Options":"USER_ACTIONS_LOG:_OPTIONS","User_Notes":"USER_NOTES","User_Notes:_New_or_Edit":"USER_NOTES:_NEW_OR_EDIT","Users":"USERS","Users:_Edit_Profile":"USERS:_EDIT_PROFILE","Users:_Edit_Viewing_Access_Level":"USERS:_EDIT_VIEWING_ACCESS_LEVEL","Users:_Groups":"USERS:_GROUPS","Users:_New_or_Edit_Group":"USERS:_NEW_OR_EDIT_GROUP","Users:_Options":"USERS:_OPTIONS","Users:_Viewing_Access_Levels":"USERS:_VIEWING_ACCESS_LEVELS","Workflows_List":"WORKFLOWS_LIST"}
\ No newline at end of file
+{"Articles":"ARTICLES","Articles:_Categories":"ARTICLES:_CATEGORIES","Articles:_Edit":"ARTICLES:_EDIT","Articles:_Edit_Category":"ARTICLES:_EDIT_CATEGORY","Articles:_Featured":"ARTICLES:_FEATURED","Banners":"BANNERS","Banners:_Categories":"BANNERS:_CATEGORIES","Banners:_Clients":"BANNERS:_CLIENTS","Banners:_Edit":"BANNERS:_EDIT","Banners:_New_or_Edit_Category":"BANNERS:_NEW_OR_EDIT_CATEGORY","Banners:_New_or_Edit_Client":"BANNERS:_NEW_OR_EDIT_CLIENT","Banners:_Tracks":"BANNERS:_TRACKS","Contacts":"CONTACTS","Contacts:_Categories":"CONTACTS:_CATEGORIES","Contacts:_Edit":"CONTACTS:_EDIT","Contacts:_Edit_Category":"CONTACTS:_EDIT_CATEGORY","Admin_Modules:_Action_Logs_-_Latest":"ADMIN_MODULES:_ACTION_LOGS_-_LATEST","Admin_Modules:_Administrator_Dashboard_Menu":"ADMIN_MODULES:_ADMINISTRATOR_DASHBOARD_MENU","Admin_Modules:_Administrator_Menu":"ADMIN_MODULES:_ADMINISTRATOR_MENU","Admin_Modules:_Articles_-_Latest":"ADMIN_MODULES:_ARTICLES_-_LATEST","Admin_Modules:_Custom":"ADMIN_MODULES:_CUSTOM","Admin_Modules:_Feed_Display":"ADMIN_MODULES:_FEED_DISPLAY","Admin_Modules:_Frontend_Link":"ADMIN_MODULES:_FRONTEND_LINK","Admin_Modules:_Guided_Tours":"ADMIN_MODULES:_GUIDED_TOURS","Admin_Modules:_Joomla_Version_Information":"ADMIN_MODULES:_JOOMLA_VERSION_INFORMATION","Admin_Modules:_Login_Form":"ADMIN_MODULES:_LOGIN_FORM","Admin_Modules:_Login_Support_Information":"ADMIN_MODULES:_LOGIN_SUPPORT_INFORMATION","Admin_Modules:_Messages":"ADMIN_MODULES:_MESSAGES","Admin_Modules:_Multilingual_Status":"ADMIN_MODULES:_MULTILINGUAL_STATUS","Admin_Modules:_Popular_Articles":"ADMIN_MODULES:_POPULAR_ARTICLES","Admin_Modules:_Post_Installation_Messages":"ADMIN_MODULES:_POST_INSTALLATION_MESSAGES","Admin_Modules:_Privacy_Dashboard":"ADMIN_MODULES:_PRIVACY_DASHBOARD","Admin_Modules:_Privacy_Status_Check":"ADMIN_MODULES:_PRIVACY_STATUS_CHECK","Admin_Modules:_Quick_Icons":"ADMIN_MODULES:_QUICK_ICONS","Admin_Modules:_Sample_Data":"ADMIN_MODULES:_SAMPLE_DATA","Admin_Modules:_Title":"ADMIN_MODULES:_TITLE","Admin_Modules:_Toolbar":"ADMIN_MODULES:_TOOLBAR","Articles:_Options":"ARTICLES:_OPTIONS","Banners:_Options":"BANNERS:_OPTIONS","Cache:_Options":"CACHE:_OPTIONS","Check-in:_Options":"CHECK-IN:_OPTIONS","Contacts:_Options":"CONTACTS:_OPTIONS","Edit_Update_Site":"EDIT_UPDATE_SITE","Editors":"EDITORS","Extensions:_Discover":"EXTENSIONS:_DISCOVER","Extensions:_Install":"EXTENSIONS:_INSTALL","Extensions:_Languages":"EXTENSIONS:_LANGUAGES","Extensions:_Manage":"EXTENSIONS:_MANAGE","Extensions:_Update":"EXTENSIONS:_UPDATE","Extensions:_Update_Sites":"EXTENSIONS:_UPDATE_SITES","Field_Groups":"FIELD_GROUPS","Field_Groups:_Edit":"FIELD_GROUPS:_EDIT","Fields":"FIELDS","Fields:_Edit":"FIELDS:_EDIT","Guided_Tours":"GUIDED_TOURS","Guided_Tours:_New_or_Edit_Step":"GUIDED_TOURS:_NEW_OR_EDIT_STEP","Guided_Tours:_New_or_Edit_Tour":"GUIDED_TOURS:_NEW_OR_EDIT_TOUR","Guided_Tours:_Options":"GUIDED_TOURS:_OPTIONS","Guided_Tours:_Steps":"GUIDED_TOURS:_STEPS","Home_Dashboard":"HOME_DASHBOARD","Information:_Database":"INFORMATION:_DATABASE","Information:_Warnings":"INFORMATION:_WARNINGS","Installer:_Options":"INSTALLER:_OPTIONS","Joomla_Update":"JOOMLA_UPDATE","Joomla_Update:_Options":"JOOMLA_UPDATE:_OPTIONS","Languages:_Content":"LANGUAGES:_CONTENT","Languages:_Edit_Content_Language":"LANGUAGES:_EDIT_CONTENT_LANGUAGE","Languages:_Edit_Override":"LANGUAGES:_EDIT_OVERRIDE","Languages:_Installed":"LANGUAGES:_INSTALLED","Languages:_Options":"LANGUAGES:_OPTIONS","Languages:_Overrides":"LANGUAGES:_OVERRIDES","Mail_Template:_Edit":"MAIL_TEMPLATE:_EDIT","Mail_Templates":"MAIL_TEMPLATES","Mail_Templates:_Options":"MAIL_TEMPLATES:_OPTIONS","Maintenance:_Clear_Cache":"MAINTENANCE:_CLEAR_CACHE","Maintenance:_Global_Check-in":"MAINTENANCE:_GLOBAL_CHECK-IN","Mass_Mail_Users":"MASS_MAIL_USERS","Media":"MEDIA","Media:_Options":"MEDIA:_OPTIONS","Menu_Item:_Alias":"MENU_ITEM:_ALIAS","Menu_Item:_Article_Archived":"MENU_ITEM:_ARTICLE_ARCHIVED","Menu_Item:_Compact_List_of_Tagged_Items":"MENU_ITEM:_COMPACT_LIST_OF_TAGGED_ITEMS","Menu_Item:_Components_Menu_Container":"MENU_ITEM:_COMPONENTS_MENU_CONTAINER","Menu_Item:_Confirm_Request":"MENU_ITEM:_CONFIRM_REQUEST","Menu_Item:_Create_Article":"MENU_ITEM:_CREATE_ARTICLE","Menu_Item:_Create_Contact":"MENU_ITEM:_CREATE_CONTACT","Menu_Item:_Create_Request":"MENU_ITEM:_CREATE_REQUEST","Menu_Item:_Display_Template_Options":"MENU_ITEM:_DISPLAY_TEMPLATE_OPTIONS","Menu_Item:_Extend_Consent":"MENU_ITEM:_EXTEND_CONSENT","Menu_Item:_Featured_Articles":"MENU_ITEM:_FEATURED_ARTICLES","Menu_Item:_Featured_Contacts":"MENU_ITEM:_FEATURED_CONTACTS","Menu_Item:_Heading":"MENU_ITEM:_HEADING","Menu_Item:_Iframe_Wrapper":"MENU_ITEM:_IFRAME_WRAPPER","Menu_Item:_List_All_Tags":"MENU_ITEM:_LIST_ALL_TAGS","Menu_Item:_Login_Form":"MENU_ITEM:_LOGIN_FORM","Menu_Item:_Logout":"MENU_ITEM:_LOGOUT","Menu_Item:_New_Item":"MENU_ITEM:_NEW_ITEM","Menu_Item:_Password_Reset":"MENU_ITEM:_PASSWORD_RESET","Menu_Item:_Registration_Form":"MENU_ITEM:_REGISTRATION_FORM","Menu_Item:_Search":"MENU_ITEM:_SEARCH","Menu_Item:_Separator":"MENU_ITEM:_SEPARATOR","Menu_Item:_Single_Article":"MENU_ITEM:_SINGLE_ARTICLE","Menu_Item:_Single_Contact":"MENU_ITEM:_SINGLE_CONTACT","Menu_Item:_Single_News_Feed":"MENU_ITEM:_SINGLE_NEWS_FEED","Menu_Item:_Site_Configuration_Options":"MENU_ITEM:_SITE_CONFIGURATION_OPTIONS","Menu_Item:_Tagged_Items":"MENU_ITEM:_TAGGED_ITEMS","Menu_Item:_URL":"MENU_ITEM:_URL","Menus":"MENUS","Menus:_Edit":"MENUS:_EDIT","Menus:_Items":"MENUS:_ITEMS","Menus:_Options":"MENUS:_OPTIONS","Messages:_Options":"MESSAGES:_OPTIONS","Modules":"MODULES","Modules:_Options":"MODULES:_OPTIONS","Multilingual_Associations":"MULTILINGUAL_ASSOCIATIONS","Multilingual_Associations:_Edit":"MULTILINGUAL_ASSOCIATIONS:_EDIT","Multilingual_Associations:_Options":"MULTILINGUAL_ASSOCIATIONS:_OPTIONS","My_Profile":"MY_PROFILE","News_Feed:_Options":"NEWS_FEED:_OPTIONS","News_Feeds":"NEWS_FEEDS","News_Feeds:_Categories":"NEWS_FEEDS:_CATEGORIES","News_Feeds:_Edit":"NEWS_FEEDS:_EDIT","News_Feeds:_Edit_Category":"NEWS_FEEDS:_EDIT_CATEGORY","Permissions_for_Group":"PERMISSIONS_FOR_GROUP","Permissions_for_User":"PERMISSIONS_FOR_USER","Plugin:_Options":"PLUGIN:_OPTIONS","Plugins":"PLUGINS","Plugins:_Name_of_Plugin":"PLUGINS:_NAME_OF_PLUGIN","Post-installation_Messages_for_Joomla_CMS":"POST-INSTALLATION_MESSAGES_FOR_JOOMLA_CMS","Post-installation_Messages:_Options":"POST-INSTALLATION_MESSAGES:_OPTIONS","Privacy_Dashboard":"PRIVACY_DASHBOARD","Privacy:_Consents":"PRIVACY:_CONSENTS","Privacy:_Extension_Capabilities":"PRIVACY:_EXTENSION_CAPABILITIES","Privacy:_Information_Requests":"PRIVACY:_INFORMATION_REQUESTS","Privacy:_New_Information_Request":"PRIVACY:_NEW_INFORMATION_REQUEST","Privacy:_Options":"PRIVACY:_OPTIONS","Privacy:_Review_Information_Request":"PRIVACY:_REVIEW_INFORMATION_REQUEST","Private_Messages":"PRIVATE_MESSAGES","Private_Messages:_Read":"PRIVATE_MESSAGES:_READ","Private_Messages:_Write":"PRIVATE_MESSAGES:_WRITE","Redirect:_Options":"REDIRECT:_OPTIONS","Redirects:_Links":"REDIRECTS:_LINKS","Redirects:_New_or_Edit":"REDIRECTS:_NEW_OR_EDIT","Scheduled_Tasks":"SCHEDULED_TASKS","Scheduled_Tasks:_Edit":"SCHEDULED_TASKS:_EDIT","Scheduled_Tasks:_Options":"SCHEDULED_TASKS:_OPTIONS","Site_Global_Configuration":"SITE_GLOBAL_CONFIGURATION","Site_Modules:_Articles":"SITE_MODULES:_ARTICLES","Site_Modules:_Articles_-_Archived":"SITE_MODULES:_ARTICLES_-_ARCHIVED","Site_Modules:_Articles_-_Latest":"SITE_MODULES:_ARTICLES_-_LATEST","Site_Modules:_Articles_-_Most_Read":"SITE_MODULES:_ARTICLES_-_MOST_READ","Site_Modules:_Articles_-_Newsflash":"SITE_MODULES:_ARTICLES_-_NEWSFLASH","Site_Modules:_Articles_-_Related":"SITE_MODULES:_ARTICLES_-_RELATED","Site_Modules:_Banners":"SITE_MODULES:_BANNERS","Site_Modules:_Breadcrumbs":"SITE_MODULES:_BREADCRUMBS","Site_Modules:_Custom":"SITE_MODULES:_CUSTOM","Site_Modules:_Feed_Display":"SITE_MODULES:_FEED_DISPLAY","Site_Modules:_Footer":"SITE_MODULES:_FOOTER","Site_Modules:_Language_Switcher":"SITE_MODULES:_LANGUAGE_SWITCHER","Site_Modules:_Login":"SITE_MODULES:_LOGIN","Site_Modules:_Menu":"SITE_MODULES:_MENU","Site_Modules:_Random_Image":"SITE_MODULES:_RANDOM_IMAGE","Site_Modules:_Smart_Search":"SITE_MODULES:_SMART_SEARCH","Site_Modules:_Statistics":"SITE_MODULES:_STATISTICS","Site_Modules:_Syndication_Feeds":"SITE_MODULES:_SYNDICATION_FEEDS","Site_Modules:_Tags_-_Popular":"SITE_MODULES:_TAGS_-_POPULAR","Site_Modules:_Tags_-_Similar":"SITE_MODULES:_TAGS_-_SIMILAR","Site_Modules:_Wrapper":"SITE_MODULES:_WRAPPER","Site_System_Information":"SITE_SYSTEM_INFORMATION","Smart_Search:_Content_Maps":"SMART_SEARCH:_CONTENT_MAPS","Smart_Search:_Indexed_Content":"SMART_SEARCH:_INDEXED_CONTENT","Smart_Search:_New_or_Edit_Filter":"SMART_SEARCH:_NEW_OR_EDIT_FILTER","Smart_Search:_Options":"SMART_SEARCH:_OPTIONS","Smart_Search:_Search_Filters":"SMART_SEARCH:_SEARCH_FILTERS","Smart_Search:_Search_Term_Analysis":"SMART_SEARCH:_SEARCH_TERM_ANALYSIS","Stages_List:_Basic_Workflow":"STAGES_LIST:_BASIC_WORKFLOW","Start_Here":"START_HERE","Tags":"TAGS","Tags:_New_or_Edit":"TAGS:_NEW_OR_EDIT","Tags:_Options":"TAGS:_OPTIONS","Template:_Options":"TEMPLATE:_OPTIONS","Templates:_Customise":"TEMPLATES:_CUSTOMISE","Templates:_Customise_Source":"TEMPLATES:_CUSTOMISE_SOURCE","Templates:_Edit_Style":"TEMPLATES:_EDIT_STYLE","Templates:_Styles":"TEMPLATES:_STYLES","Templates:_Templates":"TEMPLATES:_TEMPLATES","Transitions_List:_Basic_Workflow":"TRANSITIONS_LIST:_BASIC_WORKFLOW","User_Actions_Log":"USER_ACTIONS_LOG","User_Actions_Log:_Options":"USER_ACTIONS_LOG:_OPTIONS","User_Notes":"USER_NOTES","User_Notes:_New_or_Edit":"USER_NOTES:_NEW_OR_EDIT","Users":"USERS","Users:_Edit_Profile":"USERS:_EDIT_PROFILE","Users:_Edit_Viewing_Access_Level":"USERS:_EDIT_VIEWING_ACCESS_LEVEL","Users:_Groups":"USERS:_GROUPS","Users:_New_or_Edit_Group":"USERS:_NEW_OR_EDIT_GROUP","Users:_Options":"USERS:_OPTIONS","Users:_Viewing_Access_Levels":"USERS:_VIEWING_ACCESS_LEVELS","Workflows_List":"WORKFLOWS_LIST"}
diff --git a/administrator/index.php b/administrator/index.php
index c47e4bb494d0a..480d1fce34f93 100644
--- a/administrator/index.php
+++ b/administrator/index.php
@@ -29,4 +29,4 @@
\define('_JEXEC', 1);
// Run the application - All executable code should be triggered through this file
-require_once \dirname(__FILE__) . '/includes/app.php';
+require_once __DIR__ . '/includes/app.php';
diff --git a/administrator/language/en-GB/com_admin.ini b/administrator/language/en-GB/com_admin.ini
index bf0c056969878..450ecdeb052ae 100644
--- a/administrator/language/en-GB/com_admin.ini
+++ b/administrator/language/en-GB/com_admin.ini
@@ -172,6 +172,7 @@ COM_ADMIN_HELP_SCHEDULED_TASKS="Scheduled Tasks"
COM_ADMIN_HELP_SCHEDULED_TASKS:_EDIT="Scheduled Tasks: New/Edit"
COM_ADMIN_HELP_SCHEDULED_TASKS:_OPTIONS="Scheduled Tasks: Options"
COM_ADMIN_HELP_SITE_GLOBAL_CONFIGURATION="Global Configuration"
+COM_ADMIN_HELP_SITE_MODULES:_ARTICLES="Site Modules: Articles"
COM_ADMIN_HELP_SITE_MODULES:_ARTICLES_-_ARCHIVED="Site Modules: Articles - Archived"
COM_ADMIN_HELP_SITE_MODULES:_ARTICLES_-_LATEST="Site Modules: Articles - Latest"
COM_ADMIN_HELP_SITE_MODULES:_ARTICLES_-_MOST_READ="Site Modules: Articles - Most Read"
diff --git a/administrator/language/en-GB/guidedtours.joomla_whatsnew_5_3.ini b/administrator/language/en-GB/guidedtours.joomla_whatsnew_5_3.ini
new file mode 100644
index 0000000000000..279928d33f031
--- /dev/null
+++ b/administrator/language/en-GB/guidedtours.joomla_whatsnew_5_3.ini
@@ -0,0 +1,7 @@
+; Joomla! Project
+; (C) 2025 Open Source Matters, Inc.
+; License GNU General Public License version 2 or later; see LICENSE.txt
+; Note : All ini files need to be saved as UTF-8
+
+COM_GUIDEDTOURS_TOUR_WHATSNEW_5_3_DESCRIPTION="Welcome to Joomla 5.3! Guided Tours Updates Guided Tours now has its own API. Joomla API Documentation
Stay tuned for other new enhancements coming soon!
Core Updates Organize Files in their Own Location Now you can see and select your stored/uploaded documents directly from the Media Manager. Find more information in the Joomla Community Magazine .
View Scheduled Task History You now have the ability to view execution information directly in the backend without having to access log files. Look for the Execution History button located in the Scheduled Tasks page.
Other Enhancements and Fixes Template Override Plugin Comparison - adds compare functionality to plugin overrides Tag Alias Lookup Fixed - now instead of showing the tag id number in the URL the tag name is shown "
+COM_GUIDEDTOURS_TOUR_WHATSNEW_5_3_TITLE="What’s New in Joomla 5.3!"
diff --git a/administrator/language/en-GB/guidedtours.joomla_whatsnew_5_3_steps.ini b/administrator/language/en-GB/guidedtours.joomla_whatsnew_5_3_steps.ini
new file mode 100644
index 0000000000000..fe8788b793d8c
--- /dev/null
+++ b/administrator/language/en-GB/guidedtours.joomla_whatsnew_5_3_steps.ini
@@ -0,0 +1,7 @@
+; Joomla! Project
+; (C) 2025 Open Source Matters, Inc.
+; License GNU General Public License version 2 or later; see LICENSE.txt
+; Note : All ini files need to be saved as UTF-8
+
+COM_GUIDEDTOURS_TOUR_WHATSNEW_5_3_STEP_0_DESCRIPTION="Joomla 5.3 Full Release Notes View the full release notes on joomla.org
Help and Information Many resources to help you can be found here together with additional links to more resources, documentation, support and how to become involved in Joomla.
"
+COM_GUIDEDTOURS_TOUR_WHATSNEW_5_3_STEP_0_TITLE="More Information and Help"
diff --git a/administrator/language/en-GB/install.xml b/administrator/language/en-GB/install.xml
index 510ae467b45ff..5268d21b008c3 100644
--- a/administrator/language/en-GB/install.xml
+++ b/administrator/language/en-GB/install.xml
@@ -2,8 +2,8 @@
English (en-GB)
en-GB
- 5.3.0
- 2025-02
+ 5.3.1
+ 2025-04
Joomla! Project
admin@joomla.org
www.joomla.org
diff --git a/administrator/language/en-GB/langmetadata.xml b/administrator/language/en-GB/langmetadata.xml
index d35d3fecf42c1..0a0091c6e64c4 100644
--- a/administrator/language/en-GB/langmetadata.xml
+++ b/administrator/language/en-GB/langmetadata.xml
@@ -1,8 +1,8 @@
English (en-GB)
- 5.3.0
- 2025-02
+ 5.3.1
+ 2025-04
Joomla! Project
admin@joomla.org
www.joomla.org
diff --git a/administrator/language/en-GB/plg_extension_joomlaupdate.ini b/administrator/language/en-GB/plg_extension_joomlaupdate.ini
new file mode 100644
index 0000000000000..7ee43b831f954
--- /dev/null
+++ b/administrator/language/en-GB/plg_extension_joomlaupdate.ini
@@ -0,0 +1,7 @@
+; Joomla! Project
+; (C) 2025 Open Source Matters, Inc.
+; License GNU General Public License version 2 or later; see LICENSE.txt
+; Note : All ini files need to be saved as UTF-8
+
+PLG_EXTENSION_JOOMLAUPDATE="Extension - Joomla! Update"
+PLG_EXTENSION_JOOMLAUPDATE_XML_DESCRIPTION="Purges the core updates after update channel changes."
diff --git a/administrator/language/en-GB/plg_extension_joomlaupdate.sys.ini b/administrator/language/en-GB/plg_extension_joomlaupdate.sys.ini
new file mode 100644
index 0000000000000..7ee43b831f954
--- /dev/null
+++ b/administrator/language/en-GB/plg_extension_joomlaupdate.sys.ini
@@ -0,0 +1,7 @@
+; Joomla! Project
+; (C) 2025 Open Source Matters, Inc.
+; License GNU General Public License version 2 or later; see LICENSE.txt
+; Note : All ini files need to be saved as UTF-8
+
+PLG_EXTENSION_JOOMLAUPDATE="Extension - Joomla! Update"
+PLG_EXTENSION_JOOMLAUPDATE_XML_DESCRIPTION="Purges the core updates after update channel changes."
diff --git a/administrator/language/en-GB/plg_system_tasknotification.ini b/administrator/language/en-GB/plg_system_tasknotification.ini
index d94cfe5d028f5..210865e60ff7d 100644
--- a/administrator/language/en-GB/plg_system_tasknotification.ini
+++ b/administrator/language/en-GB/plg_system_tasknotification.ini
@@ -6,8 +6,10 @@
PLG_SYSTEM_TASK_NOTIFICATION="System - Task Notification"
PLG_SYSTEM_TASK_NOTIFICATION_FAILURE_MAIL_BODY="Hello,\n\n\nPlanned execution of Scheduled Task#{TASK_ID}, {TASK_TITLE}, has failed with exit code {EXIT_CODE} at {EXEC_DATE_TIME}.\n\nPlease visit the Joomla! backend for more information.\n\n{TASK_OUTPUT}"
PLG_SYSTEM_TASK_NOTIFICATION_FAILURE_MAIL_SUBJECT="Task Failure"
+PLG_SYSTEM_TASK_NOTIFICATION_FAILURE_USERGROUP_LABEL="User Groups to Notify"
PLG_SYSTEM_TASK_NOTIFICATION_FATAL_MAIL_BODY="Hello,\n\nPlanned execution of Scheduler Task#{TASK_ID}, {TASK_TITLE}, recovered from a fatal failure.\n\nThis could mean that the task execution exhausted the system resources or the restrictions from the PHP INI.\n\nPlease visit the Joomla! backend for more information."
PLG_SYSTEM_TASK_NOTIFICATION_FATAL_MAIL_SUBJECT="Task Recover from Fatal Failure"
+PLG_SYSTEM_TASK_NOTIFICATION_FATAL_USERGROUP_LABEL="User Groups to Notify"
PLG_SYSTEM_TASK_NOTIFICATION_LABEL_FAILURE_MAIL_TOGGLE="Task Failure"
PLG_SYSTEM_TASK_NOTIFICATION_LABEL_FATAL_FAILURE_MAIL_TOGGLE="Fatal Failures/Crashes (Recommended)"
PLG_SYSTEM_TASK_NOTIFICATION_LABEL_ORPHANED_TASK_MAIL_TOGGLE="Orphaned Tasks (Recommended)"
@@ -15,7 +17,9 @@ PLG_SYSTEM_TASK_NOTIFICATION_LABEL_SUCCESS_MAIL_TOGGLE="Task Success"
PLG_SYSTEM_TASK_NOTIFICATION_NO_MAIL_SENT="Could not send task notification to any user. This either means that mailer is not set up properly or no user with system emails enabled, com_scheduler `core.manage` privilege exists."
PLG_SYSTEM_TASK_NOTIFICATION_ORPHAN_MAIL_BODY="Hello,\n\nScheduled Task#{TASK_ID}, {TASK_TITLE}, has been orphaned. This likely means that the provider plugin was removed or disabled from your Joomla! installation.\n\nPlease visit the Joomla! backend to investigate."
PLG_SYSTEM_TASK_NOTIFICATION_ORPHAN_MAIL_SUBJECT="New Orphaned Task"
+PLG_SYSTEM_TASK_NOTIFICATION_ORPHAN_USERGROUP_LABEL="User Groups to Notify"
PLG_SYSTEM_TASK_NOTIFICATION_SUCCESS_MAIL_BODY="Hello,\n\nScheduled Task#{TASK_ID}, {TASK_TITLE}, has been successfully executed at {EXEC_DATE_TIME}.\n\n{TASK_OUTPUT}"
PLG_SYSTEM_TASK_NOTIFICATION_SUCCESS_MAIL_SUBJECT="Task Successful"
+PLG_SYSTEM_TASK_NOTIFICATION_SUCCESS_USERGROUP_LABEL="User Groups to Notify"
PLG_SYSTEM_TASK_NOTIFICATION_USER_FETCH_FAIL="Failed to fetch users to send notifications to."
PLG_SYSTEM_TASK_NOTIFICATION_XML_DESCRIPTION="Responsible for email notifications for execution of Scheduled tasks."
diff --git a/administrator/language/en-GB/tpl_atum.ini b/administrator/language/en-GB/tpl_atum.ini
index 0cf1c38ac75bd..ab3f3d7bc5b09 100644
--- a/administrator/language/en-GB/tpl_atum.ini
+++ b/administrator/language/en-GB/tpl_atum.ini
@@ -30,4 +30,4 @@ TPL_ATUM_MORE_ELEMENTS="More Elements"
TPL_ATUM_SITE_LOGO_LABEL="Brand Large"
TPL_ATUM_SITE_LOGO_SMALL_LABEL="Brand Small"
TPL_ATUM_TOOLBAR="Toolbar"
-TPL_ATUM_XML_DESCRIPTION="Continuing the Egyptian god/goddess theme (Khepri from 1.5, Hathor from 1.6, Isis from 3.0), Atum is the name of the Joomla 4 administrator template."
+TPL_ATUM_XML_DESCRIPTION="Continuing the Egyptian god/goddess theme (Khepri from 1.5, Hathor from 1.6, Isis from 3.0), Atum is the name of the Joomla 4 and Joomla 5 administrator template."
diff --git a/administrator/language/en-GB/tpl_atum.sys.ini b/administrator/language/en-GB/tpl_atum.sys.ini
index 321cfb585629d..50eb38f0c5918 100644
--- a/administrator/language/en-GB/tpl_atum.sys.ini
+++ b/administrator/language/en-GB/tpl_atum.sys.ini
@@ -16,4 +16,4 @@ TPL_ATUM_POSITION_STATUS="Status"
TPL_ATUM_POSITION_TITLE="Title"
TPL_ATUM_POSITION_TOOLBAR="Toolbar"
TPL_ATUM_POSITION_TOP="Top"
-TPL_ATUM_XML_DESCRIPTION="Continuing the Egyptian god/goddess theme (Khepri from 1.5, Hathor from 1.6, Isis from 3.0), Atum is the name of the Joomla 4 administrator template."
+TPL_ATUM_XML_DESCRIPTION="Continuing the Egyptian god/goddess theme (Khepri from 1.5, Hathor from 1.6, Isis from 3.0), Atum is the name of the Joomla 4 and Joomla 5 administrator template."
diff --git a/administrator/manifests/files/joomla.xml b/administrator/manifests/files/joomla.xml
index cc26db958eba0..f8a26a264fe56 100644
--- a/administrator/manifests/files/joomla.xml
+++ b/administrator/manifests/files/joomla.xml
@@ -6,8 +6,8 @@
www.joomla.org
(C) 2019 Open Source Matters, Inc.
GNU General Public License version 2 or later; see LICENSE.txt
- 5.3.0-beta2-dev
- 2025-02
+ 5.3.1-dev
+ 2025-04
FILES_JOOMLA_XML_DESCRIPTION
administrator/components/com_admin/script.php
diff --git a/administrator/manifests/packages/pkg_en-GB.xml b/administrator/manifests/packages/pkg_en-GB.xml
index 20ecc7b53aaa9..e56d61946077a 100644
--- a/administrator/manifests/packages/pkg_en-GB.xml
+++ b/administrator/manifests/packages/pkg_en-GB.xml
@@ -2,8 +2,8 @@
English (en-GB) Language Pack
en-GB
- 5.3.0.1
- 2025-02
+ 5.3.1.1
+ 2025-04
Joomla! Project
admin@joomla.org
www.joomla.org
diff --git a/administrator/modules/mod_feed/src/Helper/FeedHelper.php b/administrator/modules/mod_feed/src/Helper/FeedHelper.php
index 7a50805cd27f1..6aeb39f618417 100644
--- a/administrator/modules/mod_feed/src/Helper/FeedHelper.php
+++ b/administrator/modules/mod_feed/src/Helper/FeedHelper.php
@@ -43,7 +43,7 @@ public function getFeedData(Registry $params, FeedFactory $feed): \Joomla\CMS\Fe
// Get RSS parsed object
try {
$rssDoc = $feed->getFeed($rssurl);
- } catch (\Exception $e) {
+ } catch (\Exception) {
return Text::_('MOD_FEED_ERR_FEED_NOT_RETRIEVED');
}
diff --git a/administrator/modules/mod_logged/src/Helper/LoggedHelper.php b/administrator/modules/mod_logged/src/Helper/LoggedHelper.php
index 322a6c9fd0b4f..ca304eca0c2e2 100644
--- a/administrator/modules/mod_logged/src/Helper/LoggedHelper.php
+++ b/administrator/modules/mod_logged/src/Helper/LoggedHelper.php
@@ -45,7 +45,7 @@ public static function getList(Registry $params, CMSApplication $app, DatabaseIn
$query = $db->getQuery(true)
->select('s.time, s.client_id, u.id, u.name, u.username')
->from('#__session AS s')
- ->join('LEFT', '#__users AS u ON s.userid = u.id')
+ ->join('RIGHT', '#__users AS u ON s.userid = u.id')
->where('s.guest = 0')
->setLimit($params->get('count', 5), 0);
diff --git a/administrator/modules/mod_menu/src/Menu/CssMenu.php b/administrator/modules/mod_menu/src/Menu/CssMenu.php
index ab3459891e731..7fe5e1eb4b1f6 100644
--- a/administrator/modules/mod_menu/src/Menu/CssMenu.php
+++ b/administrator/modules/mod_menu/src/Menu/CssMenu.php
@@ -236,7 +236,7 @@ protected function check($node, Registry $params)
$table->load(['menutype' => $menutype]);
- $menutype = isset($table->title) ? $table->title : $menutype;
+ $menutype = $table->title ?? $menutype;
$message = Text::sprintf('MOD_MENU_IMPORTANT_ITEMS_INACCESSIBLE_LIST_WARNING', $menutype, implode(', ', $missing), $uri);
$this->application->enqueueMessage($message, 'warning');
@@ -284,8 +284,8 @@ protected function preprocess($parent)
continue;
}
- $item->scope = $item->scope ?? 'default';
- $item->icon = $item->icon ?? '';
+ $item->scope ??= 'default';
+ $item->icon ??= '';
// Whether this scope can be displayed. Applies only to preset items. Db driven items should use un/published state.
if (($item->scope === 'help' && $this->params->get('showhelp', 1) == 0) || ($item->scope === 'edit' && !$this->params->get('shownew', 1))) {
@@ -353,7 +353,7 @@ protected function preprocess($parent)
continue;
}
- list($assetName) = isset($query['context']) ? explode('.', $query['context'], 2) : ['com_fields'];
+ [$assetName] = isset($query['context']) ? explode('.', $query['context'], 2) : ['com_fields'];
} elseif ($item->element === 'com_cpanel' && $item->link === 'index.php') {
continue;
} elseif (
@@ -382,7 +382,7 @@ protected function preprocess($parent)
continue;
}
- list($assetName) = isset($query['extension']) ? explode('.', $query['extension'], 2) : ['com_workflow'];
+ [$assetName] = isset($query['extension']) ? explode('.', $query['extension'], 2) : ['com_workflow'];
} elseif (\in_array($item->element, ['com_config', 'com_privacy', 'com_actionlogs'], true) && !$user->authorise('core.admin')) {
// Special case for components which only allow super user access
$parent->removeChild($item);
diff --git a/administrator/modules/mod_privacy_dashboard/src/Helper/PrivacyDashboardHelper.php b/administrator/modules/mod_privacy_dashboard/src/Helper/PrivacyDashboardHelper.php
index 7e61ff13bbc9d..e222594ae625e 100644
--- a/administrator/modules/mod_privacy_dashboard/src/Helper/PrivacyDashboardHelper.php
+++ b/administrator/modules/mod_privacy_dashboard/src/Helper/PrivacyDashboardHelper.php
@@ -50,7 +50,7 @@ public static function getData()
try {
return $db->loadObjectList();
- } catch (ExecutionFailureException $e) {
+ } catch (ExecutionFailureException) {
return [];
}
}
diff --git a/administrator/modules/mod_stats_admin/src/Helper/StatsAdminHelper.php b/administrator/modules/mod_stats_admin/src/Helper/StatsAdminHelper.php
index 778e4cba0ad81..4ee2df3276851 100644
--- a/administrator/modules/mod_stats_admin/src/Helper/StatsAdminHelper.php
+++ b/administrator/modules/mod_stats_admin/src/Helper/StatsAdminHelper.php
@@ -96,7 +96,7 @@ public function getStatsData(Registry $params, CMSApplication $app, DatabaseInte
try {
$items = $db->loadResult();
- } catch (\RuntimeException $e) {
+ } catch (\RuntimeException) {
$items = false;
}
@@ -131,7 +131,7 @@ public function getStatsData(Registry $params, CMSApplication $app, DatabaseInte
foreach ($arrays as $response) {
foreach ($response as $row) {
// We only add a row if the title and data are given
- if (isset($row['title']) && isset($row['data'])) {
+ if (isset($row['title'], $row['data'])) {
$rows[$i] = new \stdClass();
$rows[$i]->title = $row['title'];
$rows[$i]->icon = $row['icon'] ?? 'info';
diff --git a/api/components/com_languages/src/View/Overrides/JsonapiView.php b/api/components/com_languages/src/View/Overrides/JsonapiView.php
index 8d5ab5ee72322..a60022fe40aef 100644
--- a/api/components/com_languages/src/View/Overrides/JsonapiView.php
+++ b/api/components/com_languages/src/View/Overrides/JsonapiView.php
@@ -97,8 +97,7 @@ protected function prepareItem($item)
{
$item->id = $item->key;
$item->value = $item->override;
- unset($item->key);
- unset($item->override);
+ unset($item->key, $item->override);
return parent::prepareItem($item);
}
diff --git a/api/components/com_media/src/Controller/MediaController.php b/api/components/com_media/src/Controller/MediaController.php
index ed21098dc32bf..328e56819a283 100644
--- a/api/components/com_media/src/Controller/MediaController.php
+++ b/api/components/com_media/src/Controller/MediaController.php
@@ -212,7 +212,7 @@ public function add(): void
}
// Content is only required when it is a file
- if (empty($content) && strpos($path, '.') !== false) {
+ if (empty($content) && str_contains($path, '.')) {
$missingParameters[] = 'content';
}
diff --git a/api/components/com_media/src/Model/AdapterModel.php b/api/components/com_media/src/Model/AdapterModel.php
index 34e731578acfd..70b6d2b2837d0 100644
--- a/api/components/com_media/src/Model/AdapterModel.php
+++ b/api/components/com_media/src/Model/AdapterModel.php
@@ -35,7 +35,7 @@ class AdapterModel extends BaseModel
*/
public function getItem(): \stdClass
{
- list($provider, $account) = array_pad(explode('-', $this->getState('id'), 2), 2, null);
+ [$provider, $account] = array_pad(explode('-', $this->getState('id'), 2), 2, null);
if ($account === null) {
throw new \Exception('Account was not set');
diff --git a/api/components/com_media/src/Model/MediaModel.php b/api/components/com_media/src/Model/MediaModel.php
index 6b9e00afca441..445478803d6b1 100644
--- a/api/components/com_media/src/Model/MediaModel.php
+++ b/api/components/com_media/src/Model/MediaModel.php
@@ -77,7 +77,7 @@ public function getItems(): array
['adapter' => $adapterName, 'path' => $path] = $this->resolveAdapterAndPath($this->getState('path', ''));
try {
$files = $this->mediaApiModel->getFiles($adapterName, $path, $options);
- } catch (FileNotFoundException $e) {
+ } catch (FileNotFoundException) {
throw new ResourceNotFound(
Text::sprintf('WEBSERVICE_COM_MEDIA_FILE_NOT_FOUND', $path),
404
diff --git a/api/components/com_media/src/Model/MediumModel.php b/api/components/com_media/src/Model/MediumModel.php
index dcf2df8fe96d6..0b0025ec8d2c5 100644
--- a/api/components/com_media/src/Model/MediumModel.php
+++ b/api/components/com_media/src/Model/MediumModel.php
@@ -69,7 +69,7 @@ public function getItem()
try {
return $this->mediaApiModel->getFile($adapterName, $path, $options);
- } catch (FileNotFoundException $e) {
+ } catch (FileNotFoundException) {
throw new ResourceNotFound(
Text::sprintf('WEBSERVICE_COM_MEDIA_FILE_NOT_FOUND', $path),
404
@@ -121,7 +121,7 @@ public function save($path = null): string
$this->mediaApiModel->move($adapterName, $oldPath, $path, $override),
'/'
);
- } catch (FileNotFoundException $e) {
+ } catch (FileNotFoundException) {
throw new Save(
Text::sprintf(
'WEBSERVICE_COM_MEDIA_FILE_NOT_FOUND',
@@ -159,7 +159,7 @@ public function save($path = null): string
);
$resultPath = $dirname . '/' . $name;
- } catch (FileNotFoundException $e) {
+ } catch (FileNotFoundException) {
throw new Save(
Text::sprintf(
'WEBSERVICE_COM_MEDIA_FILE_NOT_FOUND',
@@ -167,7 +167,7 @@ public function save($path = null): string
),
404
);
- } catch (FileExistsException $e) {
+ } catch (FileExistsException) {
throw new Save(
Text::sprintf(
'WEBSERVICE_COM_MEDIA_FILE_EXISTS',
@@ -175,7 +175,7 @@ public function save($path = null): string
),
400
);
- } catch (InvalidPathException $e) {
+ } catch (InvalidPathException) {
throw new Save(
Text::sprintf(
'WEBSERVICE_COM_MEDIA_BAD_FILE_TYPE',
@@ -201,7 +201,7 @@ public function save($path = null): string
$dirname,
$content
);
- } catch (FileNotFoundException $e) {
+ } catch (FileNotFoundException) {
throw new Save(
Text::sprintf(
'WEBSERVICE_COM_MEDIA_FILE_NOT_FOUND',
@@ -209,7 +209,7 @@ public function save($path = null): string
),
404
);
- } catch (InvalidPathException $e) {
+ } catch (InvalidPathException) {
throw new Save(
Text::sprintf(
'WEBSERVICE_COM_MEDIA_BAD_FILE_TYPE',
@@ -250,7 +250,7 @@ public function delete(): void
try {
$this->mediaApiModel->delete($adapterName, $path);
- } catch (FileNotFoundException $e) {
+ } catch (FileNotFoundException) {
throw new Save(
Text::sprintf('WEBSERVICE_COM_MEDIA_FILE_NOT_FOUND', $path),
404
diff --git a/api/components/com_newsfeeds/src/View/Feeds/JsonapiView.php b/api/components/com_newsfeeds/src/View/Feeds/JsonapiView.php
index 7fca339755ad9..c0cc8ca7978de 100644
--- a/api/components/com_newsfeeds/src/View/Feeds/JsonapiView.php
+++ b/api/components/com_newsfeeds/src/View/Feeds/JsonapiView.php
@@ -91,6 +91,7 @@ class JsonapiView extends BaseApiView
'editor',
'access_level',
'category_title',
+ 'modified_by',
];
/**
diff --git a/api/index.php b/api/index.php
index 3785e00f2cf5c..39b7bd8adceda 100644
--- a/api/index.php
+++ b/api/index.php
@@ -28,4 +28,4 @@
\define('_JEXEC', 1);
// Run the application - All executable code should be triggered through this file
-require_once \dirname(__FILE__) . '/includes/app.php';
+require_once __DIR__ . '/includes/app.php';
diff --git a/api/language/en-GB/install.xml b/api/language/en-GB/install.xml
index 8fe1a949e3928..c6607b67d298d 100644
--- a/api/language/en-GB/install.xml
+++ b/api/language/en-GB/install.xml
@@ -2,8 +2,8 @@
English (en-GB)
en-GB
- 5.3.0
- 2025-02
+ 5.3.1
+ 2025-04
Joomla! Project
admin@joomla.org
www.joomla.org
diff --git a/api/language/en-GB/langmetadata.xml b/api/language/en-GB/langmetadata.xml
index 9acf75713686f..a8ea8fc8d4c8c 100644
--- a/api/language/en-GB/langmetadata.xml
+++ b/api/language/en-GB/langmetadata.xml
@@ -1,8 +1,8 @@
English (en-GB)
- 5.3.0
- 2025-02
+ 5.3.1
+ 2025-04
Joomla! Project
admin@joomla.org
www.joomla.org
diff --git a/build/build-modules-js/init/minify-vendor.mjs b/build/build-modules-js/init/minify-vendor.mjs
index 25541a21ceb65..32f16aac2ff66 100644
--- a/build/build-modules-js/init/minify-vendor.mjs
+++ b/build/build-modules-js/init/minify-vendor.mjs
@@ -9,7 +9,6 @@ const RootPath = process.cwd();
const folders = [
'media/vendor/accessibility/js',
'media/vendor/chosen/js',
- 'media/vendor/codemirror',
'media/vendor/debugbar',
'media/vendor/diff/js',
'media/vendor/es-module-shims/js',
diff --git a/build/build-modules-js/javascript/build-bootstrap-js.mjs b/build/build-modules-js/javascript/build-bootstrap-js.mjs
index 02e81becf691e..ffa9a0e5e6333 100644
--- a/build/build-modules-js/javascript/build-bootstrap-js.mjs
+++ b/build/build-modules-js/javascript/build-bootstrap-js.mjs
@@ -3,7 +3,7 @@ import {
} from 'node:fs/promises';
import { resolve } from 'node:path';
import { transform } from 'esbuild';
-import rimraf from 'rimraf';
+import { rimrafSync } from 'rimraf';
import { rollup } from 'rollup';
import { nodeResolve } from '@rollup/plugin-node-resolve';
import replace from '@rollup/plugin-replace';
@@ -65,6 +65,13 @@ const build = async () => {
],
}),
],
+ });
+
+ await bundle.write({
+ format: 'es',
+ sourcemap: false,
+ dir: outputFolder,
+ chunkFileNames: '[name].js',
manualChunks: {
alert: ['build/media_source/vendor/bootstrap/js/alert.es6.js'],
button: ['build/media_source/vendor/bootstrap/js/button.es6.js'],
@@ -86,19 +93,12 @@ const build = async () => {
},
});
- await bundle.write({
- format: 'es',
- sourcemap: false,
- dir: outputFolder,
- chunkFileNames: '[name].js',
- });
-
// closes the bundle
await bundle.close();
};
export const bootstrapJs = async () => {
- rimraf.sync(resolve(outputFolder));
+ rimrafSync(resolve(outputFolder));
try {
await build(resolve(inputFolder, 'index.es6.js'));
diff --git a/build/build.php b/build/build.php
index 84d485d938b08..bf84fc6008d13 100644
--- a/build/build.php
+++ b/build/build.php
@@ -122,6 +122,8 @@ function clean_checkout(string $dir)
system('find libraries/vendor -name _config.yml | xargs rm -rf -');
system('find libraries/vendor -name .bowerrc | xargs rm -rf -');
system('find libraries/vendor -name bower.json | xargs rm -rf -');
+ system('find libraries/vendor -name .drone.yml | xargs rm -rf -');
+ system('find libraries/vendor -name .drone.jsonnet | xargs rm -rf -');
system('rm -rf libraries/vendor/bin');
// aldo26-matthias/idna-convert
diff --git a/build/media_source/com_guidedtours/images/5_3/filesdirectory.jpg b/build/media_source/com_guidedtours/images/5_3/filesdirectory.jpg
new file mode 100644
index 0000000000000..b4310f09a468c
Binary files /dev/null and b/build/media_source/com_guidedtours/images/5_3/filesdirectory.jpg differ
diff --git a/build/media_source/com_media/scss/components/_media-breadcrumb.scss b/build/media_source/com_media/scss/components/_media-breadcrumb.scss
index cb2076fba6280..67bbb738feb51 100644
--- a/build/media_source/com_media/scss/components/_media-breadcrumb.scss
+++ b/build/media_source/com_media/scss/components/_media-breadcrumb.scss
@@ -34,9 +34,8 @@
a {
color: var(--body-color);
}
- &::before,
&::after {
- border: none;
+ border-inline-start-color: $breadcrumbs-current-bg;
}
}
&:hover {
@@ -62,7 +61,7 @@
border-inline-start: 10px solid transparent;
}
&::before {
- border-inline-start-color: $border-color;
+ border-inline-start-color: var(--gray-400);
}
&::after {
border-inline-start-color: $breadcrumbs-bg;
diff --git a/build/media_source/plg_installer_webinstaller/js/client.es6.js b/build/media_source/plg_installer_webinstaller/js/client.es6.js
index 4f4b8e23cc9b2..d9ac1d58a72dd 100644
--- a/build/media_source/plg_installer_webinstaller/js/client.es6.js
+++ b/build/media_source/plg_installer_webinstaller/js/client.es6.js
@@ -413,7 +413,7 @@ customElements.whenDefined('joomla-tab').then(() => {
link.click();
}
- if (link.hasAttribute('aria-expanded') && link.getAttribute('aria-expanded') === 'true' && !instance) {
+ if (link.hasAttribute('aria-selected') && link.getAttribute('aria-selected') === 'true' && !instance) {
instance = new WebInstaller();
instance.initialise();
}
diff --git a/build/media_source/templates/administrator/atum/scss/blocks/_form.scss b/build/media_source/templates/administrator/atum/scss/blocks/_form.scss
index bd9781b01ed01..2c7995ccbe674 100644
--- a/build/media_source/templates/administrator/atum/scss/blocks/_form.scss
+++ b/build/media_source/templates/administrator/atum/scss/blocks/_form.scss
@@ -164,7 +164,8 @@ label.valid {
}
.filter-search-bar__description {
- bottom: 100%;
+ top: 100%;
+ bottom: auto;
}
.container-popup .filter-search-bar__description {
diff --git a/build/media_source/templates/administrator/atum/scss/blocks/_login.scss b/build/media_source/templates/administrator/atum/scss/blocks/_login.scss
index b12e979b781ca..fea0fa175e942 100644
--- a/build/media_source/templates/administrator/atum/scss/blocks/_login.scss
+++ b/build/media_source/templates/administrator/atum/scss/blocks/_login.scss
@@ -265,7 +265,7 @@ label {
}
.invalid .form-control-feedback {
- color: var(--danger);
+ color: var(--danger-text);
}
}
diff --git a/build/media_source/templates/administrator/atum/scss/pages/_com_users.scss b/build/media_source/templates/administrator/atum/scss/pages/_com_users.scss
index 56d9b600906df..e1f4412a73cca 100644
--- a/build/media_source/templates/administrator/atum/scss/pages/_com_users.scss
+++ b/build/media_source/templates/administrator/atum/scss/pages/_com_users.scss
@@ -100,4 +100,10 @@
margin-inline-start: 2rem;
}
}
+
+ &.view-user {
+ table thead th {
+ color: var(--bs-body-color);
+ }
+ }
}
diff --git a/build/media_source/templates/administrator/atum/scss/vendor/joomla-custom-elements/joomla-tab.scss b/build/media_source/templates/administrator/atum/scss/vendor/joomla-custom-elements/joomla-tab.scss
index e4dd67b7e07a4..62bc59a657453 100644
--- a/build/media_source/templates/administrator/atum/scss/vendor/joomla-custom-elements/joomla-tab.scss
+++ b/build/media_source/templates/administrator/atum/scss/vendor/joomla-custom-elements/joomla-tab.scss
@@ -44,7 +44,7 @@ joomla-tab {
box-shadow: none;
&:first-of-type,
- &[aria-expanded=true]:first-of-type {
+ &[aria-selected=true]:first-of-type {
border-start-start-radius: .25rem;
}
@@ -52,7 +52,7 @@ joomla-tab {
z-index: 1;
}
- &[aria-expanded=true],
+ &[aria-selected=true],
&:focus,
&:hover {
color: $joomla-tab-btn-hvr;
@@ -76,7 +76,7 @@ joomla-tab {
}
}
- &[aria-expanded=true] {
+ &[aria-selected=true] {
font-weight: $font-weight-bold;
background: $joomla-tab-btn-aria-exp-bg;
}
@@ -96,7 +96,7 @@ joomla-tab {
border: $joomla-tab-btn-region-border;
border-top: 0;
- &[aria-expanded=true],
+ &[aria-selected=true],
&:hover,
&:focus {
color: var(--template-text-light);
@@ -154,7 +154,7 @@ joomla-tab[orientation=vertical] {
> button[role=tab] {
text-align: start;
- &[aria-expanded=true] {
+ &[aria-selected=true] {
color: $joomla-tablist-btn-aria-exp; // var(--template-text-light);
background-color: $joomla-tablist-btn-aria-exp-bg; // var(--template-bg-dark-60);
}
@@ -174,7 +174,7 @@ joomla-tab[orientation=vertical] {
border-bottom: $joomla-tab-vert-border-bottom; // 1px solid $gray-300;
box-shadow: none;
- &[aria-expanded=true],
+ &[aria-selected=true],
&:focus,
&:hover {
color: var(--template-text-light);
@@ -231,7 +231,7 @@ joomla-tab[view=accordion] {
border-bottom: $joomla-tab-vert-border-bottom; // 1px solid $gray-300;
box-shadow: none;
- &[aria-expanded=true]::after,
+ &[aria-selected=true]::after,
&:hover::after {
position: absolute;
top: auto;
@@ -261,7 +261,7 @@ joomla-tab[view=accordion] {
}
[active],
- [aria-expanded=true] {
+ [aria-selected=true] {
background-color: var(--body-bg);
}
@@ -320,7 +320,7 @@ joomla-tab[view=accordion] {
background-color: var(--btn-primary-bg);
border: var(--btn-primary-border);
- &[aria-expanded=true],
+ &[aria-selected=true],
&:hover,
&:focus {
color: var(--btn-primary-color);
@@ -332,7 +332,7 @@ joomla-tab[view=accordion] {
}
[dir=rtl] joomla-tab {
- div[role="tablist"] > button[role="tab"][aria-expanded="true"]::after {
+ div[role="tablist"] > button[role="tab"][aria-selected="true"]::after {
right: auto;
left: 0;
}
diff --git a/build/media_source/templates/site/cassiopeia/scss/blocks/_form.scss b/build/media_source/templates/site/cassiopeia/scss/blocks/_form.scss
index 438cb3f7a2c16..e94376b815d72 100644
--- a/build/media_source/templates/site/cassiopeia/scss/blocks/_form.scss
+++ b/build/media_source/templates/site/cassiopeia/scss/blocks/_form.scss
@@ -96,6 +96,7 @@ td .form-control {
&[id^=id-skip-] {
right: auto;
+ max-width: unset;
}
&[id^=cbunpublish] {
diff --git a/build/media_source/vendor/bootstrap/js/carousel.es6.js b/build/media_source/vendor/bootstrap/js/carousel.es6.js
index b1b521cb1c6b5..53e7523ee3d48 100644
--- a/build/media_source/vendor/bootstrap/js/carousel.es6.js
+++ b/build/media_source/vendor/bootstrap/js/carousel.es6.js
@@ -4,21 +4,12 @@ window.bootstrap = window.bootstrap || {};
window.bootstrap.Carousel = Carousel;
if (Joomla && Joomla.getOptions) {
- // Get the elements/configurations from the PHP
+ // Get the elements configuration from PHP
const carousels = Joomla.getOptions('bootstrap.carousel');
- // Initialise the elements
+
if (typeof carousels === 'object' && carousels !== null) {
Object.keys(carousels).forEach((carousel) => {
- const opt = carousels[carousel];
- const options = {
- interval: opt.interval ? opt.interval : 5000,
- keyboard: opt.keyboard ? opt.keyboard : true,
- pause: opt.pause ? opt.pause : 'hover',
- slide: opt.slide ? opt.slide : false,
- wrap: opt.wrap ? opt.wrap : true,
- touch: opt.touch ? opt.touch : true,
- };
-
+ const options = carousels[carousel];
const elements = Array.from(document.querySelectorAll(carousel));
if (elements.length) {
elements.map((el) => new window.bootstrap.Carousel(el, options));
diff --git a/build/media_source/vendor/tinymce/langs/da.es5.js b/build/media_source/vendor/tinymce/langs/da.es5.js
index 2bfd5f9bc2d78..e08c040325532 100644
--- a/build/media_source/vendor/tinymce/langs/da.es5.js
+++ b/build/media_source/vendor/tinymce/langs/da.es5.js
@@ -120,7 +120,7 @@ tinymce.addI18n('da',{
"Source": "Kilde",
"Dimensions": "Dimensioner",
"Constrain proportions": "Behold propertioner",
-"General": "Generet",
+"General": "Generelt",
"Advanced": "Avanceret",
"Style": "Stil",
"Vertical space": "Lodret afstand",
diff --git a/components/com_contact/forms/contact.xml b/components/com_contact/forms/contact.xml
index 98f2ee0d4806d..f97f6593ebcd0 100644
--- a/components/com_contact/forms/contact.xml
+++ b/components/com_contact/forms/contact.xml
@@ -58,7 +58,6 @@
type="checkbox"
label="COM_CONTACT_CONTACT_EMAIL_A_COPY_LABEL"
id="contact-email-copy"
- default="0"
/>
diff --git a/components/com_contact/src/Controller/ContactController.php b/components/com_contact/src/Controller/ContactController.php
index 3f7b94cc8e718..d8b04fe06716a 100644
--- a/components/com_contact/src/Controller/ContactController.php
+++ b/components/com_contact/src/Controller/ContactController.php
@@ -344,7 +344,7 @@ protected function allowAdd($data = [])
*/
protected function allowEdit($data = [], $key = 'id')
{
- $recordId = (int) isset($data[$key]) ? $data[$key] : 0;
+ $recordId = isset($data[$key]) ? (int) $data[$key] : 0;
if (!$recordId) {
return false;
@@ -364,7 +364,7 @@ protected function allowEdit($data = [], $key = 'id')
// Fallback on edit.own.
if ($user->authorise('core.edit.own', $this->option . '.category.' . $categoryId)) {
- return ($record->created_by === $user->id);
+ return $record->created_by === $user->id;
}
return false;
diff --git a/components/com_contact/src/Controller/DisplayController.php b/components/com_contact/src/Controller/DisplayController.php
index 4c606fdbe0884..50ddae3318575 100644
--- a/components/com_contact/src/Controller/DisplayController.php
+++ b/components/com_contact/src/Controller/DisplayController.php
@@ -42,7 +42,7 @@ public function __construct($config = [], ?MVCFactoryInterface $factory = null,
$input = Factory::getApplication()->getInput();
if ($input->get('view') === 'contacts' && $input->get('layout') === 'modal') {
- $config['base_path'] = JPATH_COMPONENT_ADMINISTRATOR;
+ $config['base_path'] = JPATH_ADMINISTRATOR . '/components/com_contact';
}
parent::__construct($config, $factory, $app, $input);
diff --git a/components/com_content/forms/filter_articles.xml b/components/com_content/forms/filter_articles.xml
index 942c28dd13209..3c49167c2101f 100644
--- a/components/com_content/forms/filter_articles.xml
+++ b/components/com_content/forms/filter_articles.xml
@@ -94,7 +94,7 @@
type="list"
label="JGLOBAL_SORT_BY"
onchange="this.form.submit();"
- default="a.title ASC"
+ default="a.id DESC"
validate="options"
>
JGLOBAL_SORT_BY
diff --git a/components/com_content/helpers/icon.php b/components/com_content/helpers/icon.php
index 46d76acccbb77..9906ef941646a 100644
--- a/components/com_content/helpers/icon.php
+++ b/components/com_content/helpers/icon.php
@@ -125,6 +125,6 @@ public static function print_screen($article, $params, $attribs = [], $legacy =
*/
private static function getIcon()
{
- return (new \Joomla\Component\Content\Administrator\Service\HTML\Icon(Joomla\CMS\Factory::getApplication()));
+ return new \Joomla\Component\Content\Administrator\Service\HTML\Icon(Joomla\CMS\Factory::getApplication());
}
}
diff --git a/components/com_content/src/Controller/ArticleController.php b/components/com_content/src/Controller/ArticleController.php
index 3a3e3d985f230..950f9b71a5a7c 100644
--- a/components/com_content/src/Controller/ArticleController.php
+++ b/components/com_content/src/Controller/ArticleController.php
@@ -124,7 +124,7 @@ protected function allowAdd($data = [])
*/
protected function allowEdit($data = [], $key = 'id')
{
- $recordId = (int) isset($data[$key]) ? $data[$key] : 0;
+ $recordId = isset($data[$key]) ? (int) $data[$key] : 0;
$user = $this->app->getIdentity();
// Zero record (id:0), return component edit permission by calling parent controller method
diff --git a/components/com_content/src/Controller/DisplayController.php b/components/com_content/src/Controller/DisplayController.php
index 8f9bb4c3bd190..ebe4421cd602a 100644
--- a/components/com_content/src/Controller/DisplayController.php
+++ b/components/com_content/src/Controller/DisplayController.php
@@ -43,10 +43,10 @@ public function __construct($config = [], ?MVCFactoryInterface $factory = null,
// Article frontpage Editor pagebreak proxying:
if ($this->input->get('view') === 'article' && $this->input->get('layout') === 'pagebreak') {
- $config['base_path'] = JPATH_COMPONENT_ADMINISTRATOR;
+ $config['base_path'] = JPATH_ADMINISTRATOR . '/components/com_content';
} elseif ($this->input->get('view') === 'articles' && $this->input->get('layout') === 'modal') {
// Article frontpage Editor article proxying:
- $config['base_path'] = JPATH_COMPONENT_ADMINISTRATOR;
+ $config['base_path'] = JPATH_ADMINISTRATOR . '/components/com_content';
}
parent::__construct($config, $factory, $app, $input);
diff --git a/components/com_content/src/View/Category/HtmlView.php b/components/com_content/src/View/Category/HtmlView.php
index 52bbecd7acfba..4bc55bd439c23 100644
--- a/components/com_content/src/View/Category/HtmlView.php
+++ b/components/com_content/src/View/Category/HtmlView.php
@@ -167,10 +167,6 @@ public function display($tpl = null)
$this->category->metadata = new Registry($this->category->metadata);
}
- if (($app->get('MetaAuthor') == '1') && $this->category->get('author', '')) {
- $this->getDocument()->setMetaData('author', $this->category->get('author', ''));
- }
-
$mdata = $this->category->metadata->toArray();
foreach ($mdata as $k => $v) {
diff --git a/components/com_contenthistory/src/Controller/DisplayController.php b/components/com_contenthistory/src/Controller/DisplayController.php
index 7e03191127121..dc1e329c3d60f 100644
--- a/components/com_contenthistory/src/Controller/DisplayController.php
+++ b/components/com_contenthistory/src/Controller/DisplayController.php
@@ -36,7 +36,7 @@ class DisplayController extends BaseController
*/
public function __construct($config = [], ?MVCFactoryInterface $factory = null, $app = null, $input = null)
{
- $config['base_path'] = JPATH_COMPONENT_ADMINISTRATOR;
+ $config['base_path'] = JPATH_ADMINISTRATOR . '/components/com_contenthistory';
parent::__construct($config, $factory, $app, $input);
}
diff --git a/components/com_contenthistory/src/Dispatcher/Dispatcher.php b/components/com_contenthistory/src/Dispatcher/Dispatcher.php
index 9534de6e17e16..c56afe13626c6 100644
--- a/components/com_contenthistory/src/Dispatcher/Dispatcher.php
+++ b/components/com_contenthistory/src/Dispatcher/Dispatcher.php
@@ -69,7 +69,7 @@ protected function checkAccess()
*/
public function getController(string $name, string $client = '', array $config = []): BaseController
{
- $config['base_path'] = JPATH_COMPONENT_ADMINISTRATOR;
+ $config['base_path'] = JPATH_ADMINISTRATOR . '/components/com_contenthistory';
$client = 'Administrator';
return parent::getController($name, $client, $config);
diff --git a/components/com_fields/src/Controller/DisplayController.php b/components/com_fields/src/Controller/DisplayController.php
index 74a55c4116d1b..bd1db65e71c21 100644
--- a/components/com_fields/src/Controller/DisplayController.php
+++ b/components/com_fields/src/Controller/DisplayController.php
@@ -41,7 +41,7 @@ public function __construct($config = [], ?MVCFactoryInterface $factory = null,
// Load the backend language file.
$app->getLanguage()->load('com_fields', JPATH_ADMINISTRATOR);
- $config['base_path'] = JPATH_COMPONENT_ADMINISTRATOR;
+ $config['base_path'] = JPATH_ADMINISTRATOR . '/components/com_fields';
}
parent::__construct($config, $factory, $app, $input);
diff --git a/components/com_finder/src/Model/SearchModel.php b/components/com_finder/src/Model/SearchModel.php
index 746585e01c894..959de428f23cf 100644
--- a/components/com_finder/src/Model/SearchModel.php
+++ b/components/com_finder/src/Model/SearchModel.php
@@ -543,7 +543,7 @@ protected function populateState($ordering = null, $direction = null)
$this->setState('list.ordering', 'l.sale_price');
break;
- case ($order === 'relevance' && !empty($this->includedTerms)):
+ case $order === 'relevance' && !empty($this->includedTerms):
$this->setState('list.ordering', 'm.weight');
break;
diff --git a/components/com_finder/src/Service/Router.php b/components/com_finder/src/Service/Router.php
index 108af7642a430..4baa969a22930 100644
--- a/components/com_finder/src/Service/Router.php
+++ b/components/com_finder/src/Service/Router.php
@@ -66,7 +66,7 @@ public function build(&$query)
if (isset($query['Itemid'])) {
$item = $this->menu->getItem($query['Itemid']);
- if ($query['option'] == 'com_finder' && isset($query['f']) && isset($item->query['f']) && $query['f'] == $item->query['f']) {
+ if ($query['option'] == 'com_finder' && isset($query['f'], $item->query['f']) && $query['f'] == $item->query['f']) {
unset($query['f']);
}
}
diff --git a/components/com_finder/src/View/Search/HtmlView.php b/components/com_finder/src/View/Search/HtmlView.php
index 9178f9deffa21..f9195cda974de 100644
--- a/components/com_finder/src/View/Search/HtmlView.php
+++ b/components/com_finder/src/View/Search/HtmlView.php
@@ -299,7 +299,7 @@ protected function getLayoutFile($layout = null)
$filetofind = $this->_createFileName('template', ['name' => $file]);
$exists = Path::find($this->_path['template'], $filetofind);
- return ($exists ? $layout : 'result');
+ return $exists ? $layout : 'result';
}
/**
diff --git a/components/com_menus/src/Dispatcher/Dispatcher.php b/components/com_menus/src/Dispatcher/Dispatcher.php
index 65a57e1ae63bd..e669d119bb42c 100644
--- a/components/com_menus/src/Dispatcher/Dispatcher.php
+++ b/components/com_menus/src/Dispatcher/Dispatcher.php
@@ -70,7 +70,7 @@ public function checkAccess()
*/
public function getController(string $name, string $client = '', array $config = []): BaseController
{
- $config['base_path'] = JPATH_COMPONENT_ADMINISTRATOR;
+ $config['base_path'] = JPATH_ADMINISTRATOR . '/components/com_menus';
$client = 'Administrator';
return parent::getController($name, $client, $config);
diff --git a/components/com_modules/src/Controller/DisplayController.php b/components/com_modules/src/Controller/DisplayController.php
index dc76c599ac657..895b33effdad7 100644
--- a/components/com_modules/src/Controller/DisplayController.php
+++ b/components/com_modules/src/Controller/DisplayController.php
@@ -43,7 +43,7 @@ public function __construct($config = [], ?MVCFactoryInterface $factory = null,
// Modules frontpage Editor Module proxying.
if ($this->input->get('view') === 'modules' && $this->input->get('layout') === 'modal') {
- $config['base_path'] = JPATH_COMPONENT_ADMINISTRATOR;
+ $config['base_path'] = JPATH_ADMINISTRATOR . '/components/com_modules';
}
parent::__construct($config, $factory, $app, $input);
diff --git a/components/com_modules/src/Dispatcher/Dispatcher.php b/components/com_modules/src/Dispatcher/Dispatcher.php
index 6672e696f67f2..98b8452b7a70b 100644
--- a/components/com_modules/src/Dispatcher/Dispatcher.php
+++ b/components/com_modules/src/Dispatcher/Dispatcher.php
@@ -71,7 +71,7 @@ public function checkAccess()
public function getController(string $name, string $client = '', array $config = []): BaseController
{
if ($this->input->get('task') === 'orderPosition') {
- $config['base_path'] = JPATH_COMPONENT_ADMINISTRATOR;
+ $config['base_path'] = JPATH_ADMINISTRATOR . '/components/com_modules';
$client = 'Administrator';
}
diff --git a/components/com_privacy/src/Dispatcher/Dispatcher.php b/components/com_privacy/src/Dispatcher/Dispatcher.php
index d1f2b84c48b5d..66d8e44008a3f 100644
--- a/components/com_privacy/src/Dispatcher/Dispatcher.php
+++ b/components/com_privacy/src/Dispatcher/Dispatcher.php
@@ -36,6 +36,16 @@ protected function checkAccess()
parent::checkAccess();
$view = $this->input->get('view');
+ $task = $this->input->get('task', 'display');
+
+ // Ignore any-non-"display" tasks
+ if (str_contains($task, '.')) {
+ $task = explode('.', $task)[1];
+ }
+
+ if ($task !== 'display') {
+ return;
+ }
// Submitting information requests and confirmation through the frontend is restricted to authenticated users at this time
if (\in_array($view, ['confirm', 'request']) && $this->app->getIdentity()->guest) {
diff --git a/components/com_tags/src/Service/Router.php b/components/com_tags/src/Service/Router.php
index 46723299c389c..3f49973737316 100644
--- a/components/com_tags/src/Service/Router.php
+++ b/components/com_tags/src/Service/Router.php
@@ -144,7 +144,7 @@ public function preprocess($query)
foreach (array_unique([$lang, '*']) as $language) {
if (isset($query['view']) && $query['view'] === 'tags') {
- if (isset($query['parent_id']) && isset($this->lookup[$language]['tags'][$query['parent_id']])) {
+ if (isset($query['parent_id'], $this->lookup[$language]['tags'][$query['parent_id']])) {
$query['Itemid'] = $this->lookup[$language]['tags'][$query['parent_id']];
break;
}
diff --git a/components/com_users/forms/frontend.xml b/components/com_users/forms/frontend.xml
index 61bc7ac9969b6..d0c9f10c44441 100644
--- a/components/com_users/forms/frontend.xml
+++ b/components/com_users/forms/frontend.xml
@@ -45,17 +45,6 @@
COM_USERS_USER_COLORSCHEME_OPTION_DARK
-
- JOPTION_USE_DEFAULT
- JNO
- JYES
-
diff --git a/components/com_users/forms/frontend_admin.xml b/components/com_users/forms/frontend_admin.xml
index fde276653a5a0..8643be3899d52 100644
--- a/components/com_users/forms/frontend_admin.xml
+++ b/components/com_users/forms/frontend_admin.xml
@@ -22,6 +22,17 @@
>
JOPTION_USE_DEFAULT
+
+ JOPTION_USE_DEFAULT
+ JNO
+ JYES
+
diff --git a/components/com_users/src/Dispatcher/Dispatcher.php b/components/com_users/src/Dispatcher/Dispatcher.php
index e5d04442e9fbb..49f77c6da9f80 100644
--- a/components/com_users/src/Dispatcher/Dispatcher.php
+++ b/components/com_users/src/Dispatcher/Dispatcher.php
@@ -38,6 +38,16 @@ protected function checkAccess()
$view = $this->input->get('view');
$user = $this->app->getIdentity();
+ $task = $this->input->get('task', 'display');
+
+ // Ignore any-non-"display" tasks
+ if (str_contains($task, '.')) {
+ $task = explode('.', $task)[1];
+ }
+
+ if ($task !== 'display') {
+ return;
+ }
// Do any specific processing by view.
switch ($view) {
diff --git a/components/com_users/src/Model/ResetModel.php b/components/com_users/src/Model/ResetModel.php
index a9abc6a1fbf26..100529ddb3a87 100644
--- a/components/com_users/src/Model/ResetModel.php
+++ b/components/com_users/src/Model/ResetModel.php
@@ -527,7 +527,7 @@ public function checkResetLimit($user)
$resetHours = (int) $params->get('reset_time');
$result = true;
- $lastResetTime = strtotime($user->lastResetTime) ?: 0;
+ $lastResetTime = $user->lastResetTime === null ? 0 : strtotime($user->lastResetTime);
$hoursSinceLastReset = (strtotime(Factory::getDate()->toSql()) - $lastResetTime) / 3600;
if ($hoursSinceLastReset > $resetHours) {
diff --git a/components/com_users/src/View/Profile/HtmlView.php b/components/com_users/src/View/Profile/HtmlView.php
index a07f3a9a0fcb5..651e27819105e 100644
--- a/components/com_users/src/View/Profile/HtmlView.php
+++ b/components/com_users/src/View/Profile/HtmlView.php
@@ -141,8 +141,8 @@ public function display($tpl = null)
$active = Factory::getApplication()->getMenu()->getActive();
if (
- $active && isset($active->query['layout'])
- && isset($active->query['option']) && $active->query['option'] === 'com_users'
+ $active && isset($active->query['layout'], $active->query['option'])
+ && $active->query['option'] === 'com_users'
&& isset($active->query['view']) && $active->query['view'] === 'profile'
) {
$this->setLayout($active->query['layout']);
diff --git a/composer.json b/composer.json
index e25d4ab3e0bbf..3d05ca7edc98c 100644
--- a/composer.json
+++ b/composer.json
@@ -58,12 +58,12 @@
"joomla/console": "^3.0.1",
"joomla/crypt": "^3.0.1",
"joomla/data": "^3.0.1",
- "joomla/database": "^3.3.1",
+ "joomla/database": "^3.4",
"joomla/di": "^3.0.1",
"joomla/event": "^3.0.1",
"joomla/filter": "^3.0.2",
- "joomla/filesystem": "^3.0.2",
- "joomla/http": "^3.0.1",
+ "joomla/filesystem": "^3.1.0",
+ "joomla/http": "^3.1.0",
"joomla/input": "~3.0",
"joomla/language": "~3.0",
"joomla/oauth1": "~3.0",
@@ -74,7 +74,7 @@
"joomla/string": "^3.0.1",
"joomla/uri": "~3.0",
"joomla/utilities": "~3.0",
- "algo26-matthias/idna-convert": "^3.1.1",
+ "algo26-matthias/idna-convert": "^3.2.0",
"defuse/php-encryption": "^2.4.0",
"doctrine/inflector": "^1.4.4",
"fig/link-util": "^1.2.0",
@@ -84,13 +84,13 @@
"phpmailer/phpmailer": "^6.9.3",
"psr/link": "~1.1.1",
"symfony/console": "^6.4.17",
- "symfony/error-handler": "^6.4.18",
+ "symfony/error-handler": "^6.4.19",
"symfony/ldap": "^6.4.13",
"symfony/options-resolver": "^6.4.16",
"symfony/polyfill-mbstring": "^1.31.0",
"symfony/web-link": "^6.4.13",
"symfony/yaml": "^6.4.18",
- "typo3/phar-stream-wrapper": "^4.0.0",
+ "typo3/phar-stream-wrapper": "^3.1.8",
"wamania/php-stemmer": "^4.0.0",
"tobscure/json-api": "dev-joomla-backports",
"willdurand/negotiation": "^3.1.0",
@@ -100,7 +100,7 @@
"ext-gd": "*",
"web-auth/webauthn-lib": "4.5.2",
"ext-dom": "*",
- "composer/ca-bundle": "^1.5.5",
+ "composer/ca-bundle": "^1.5.6",
"dragonmantank/cron-expression": "^3.4.0",
"enshrined/svg-sanitize": "^0.21.0",
"lcobucci/jwt": "^4.3.0",
@@ -108,16 +108,16 @@
"phpseclib/bcmath_compat": "^2.0.3",
"jfcherng/php-diff": "^6.16.2",
"voku/portable-utf8": "dev-joomla-5.3 as 6.0.13",
- "php-tuf/php-tuf": "^1.0.2",
- "php-debugbar/php-debugbar": "^2.1"
+ "php-tuf/php-tuf": "^1.0.3",
+ "php-debugbar/php-debugbar": "^2.1.6"
},
"require-dev": {
"phpunit/phpunit": "^9.6.22",
- "friendsofphp/php-cs-fixer": "^3.68.5",
- "squizlabs/php_codesniffer": "^3.11.3",
+ "friendsofphp/php-cs-fixer": "^3.72.0",
+ "squizlabs/php_codesniffer": "^3.12.0",
"joomla/mediawiki": "^3.0",
"joomla/test": "~3.0",
- "phpstan/phpstan": "^2.1.2",
+ "phpstan/phpstan": "^2.1.8",
"phpstan/phpstan-deprecation-rules": "^2.0.1"
},
"replace": {
diff --git a/composer.lock b/composer.lock
index eb73b2e9da898..c4d3ab93ce3da 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,20 +4,20 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
- "content-hash": "b0456bd2df912057327fcee03b31bf70",
+ "content-hash": "a38a4283b189156423edcb9ee0f8c001",
"packages": [
{
"name": "algo26-matthias/idna-convert",
- "version": "v3.1.1",
+ "version": "v3.2.0",
"source": {
"type": "git",
"url": "https://github.com/algo26-matthias/idna-convert.git",
- "reference": "d8dbf18599548b8460ab0c462f299a15cacf6e66"
+ "reference": "0cea987c75b981797cf3bc28b182c5da05c41252"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/algo26-matthias/idna-convert/zipball/d8dbf18599548b8460ab0c462f299a15cacf6e66",
- "reference": "d8dbf18599548b8460ab0c462f299a15cacf6e66",
+ "url": "https://api.github.com/repos/algo26-matthias/idna-convert/zipball/0cea987c75b981797cf3bc28b182c5da05c41252",
+ "reference": "0cea987c75b981797cf3bc28b182c5da05c41252",
"shasum": ""
},
"require": {
@@ -58,22 +58,22 @@
],
"support": {
"issues": "https://github.com/algo26-matthias/idna-convert/issues",
- "source": "https://github.com/algo26-matthias/idna-convert/tree/v3.1.1"
+ "source": "https://github.com/algo26-matthias/idna-convert/tree/v3.2.0"
},
- "time": "2024-03-18T16:24:08+00:00"
+ "time": "2025-04-01T11:22:26+00:00"
},
{
"name": "brick/math",
- "version": "0.12.1",
+ "version": "0.12.3",
"source": {
"type": "git",
"url": "https://github.com/brick/math.git",
- "reference": "f510c0a40911935b77b86859eb5223d58d660df1"
+ "reference": "866551da34e9a618e64a819ee1e01c20d8a588ba"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/brick/math/zipball/f510c0a40911935b77b86859eb5223d58d660df1",
- "reference": "f510c0a40911935b77b86859eb5223d58d660df1",
+ "url": "https://api.github.com/repos/brick/math/zipball/866551da34e9a618e64a819ee1e01c20d8a588ba",
+ "reference": "866551da34e9a618e64a819ee1e01c20d8a588ba",
"shasum": ""
},
"require": {
@@ -82,7 +82,7 @@
"require-dev": {
"php-coveralls/php-coveralls": "^2.2",
"phpunit/phpunit": "^10.1",
- "vimeo/psalm": "5.16.0"
+ "vimeo/psalm": "6.8.8"
},
"type": "library",
"autoload": {
@@ -112,7 +112,7 @@
],
"support": {
"issues": "https://github.com/brick/math/issues",
- "source": "https://github.com/brick/math/tree/0.12.1"
+ "source": "https://github.com/brick/math/tree/0.12.3"
},
"funding": [
{
@@ -120,20 +120,20 @@
"type": "github"
}
],
- "time": "2023-11-29T23:19:16+00:00"
+ "time": "2025-02-28T13:11:00+00:00"
},
{
"name": "composer/ca-bundle",
- "version": "1.5.5",
+ "version": "1.5.6",
"source": {
"type": "git",
"url": "https://github.com/composer/ca-bundle.git",
- "reference": "08c50d5ec4c6ced7d0271d2862dec8c1033283e6"
+ "reference": "f65c239c970e7f072f067ab78646e9f0b2935175"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/composer/ca-bundle/zipball/08c50d5ec4c6ced7d0271d2862dec8c1033283e6",
- "reference": "08c50d5ec4c6ced7d0271d2862dec8c1033283e6",
+ "url": "https://api.github.com/repos/composer/ca-bundle/zipball/f65c239c970e7f072f067ab78646e9f0b2935175",
+ "reference": "f65c239c970e7f072f067ab78646e9f0b2935175",
"shasum": ""
},
"require": {
@@ -180,7 +180,7 @@
"support": {
"irc": "irc://irc.freenode.org/composer",
"issues": "https://github.com/composer/ca-bundle/issues",
- "source": "https://github.com/composer/ca-bundle/tree/1.5.5"
+ "source": "https://github.com/composer/ca-bundle/tree/1.5.6"
},
"funding": [
{
@@ -196,7 +196,7 @@
"type": "tidelift"
}
],
- "time": "2025-01-08T16:17:16+00:00"
+ "time": "2025-03-06T14:30:56+00:00"
},
{
"name": "defuse/php-encryption",
@@ -1502,16 +1502,16 @@
},
{
"name": "joomla/database",
- "version": "3.3.1",
+ "version": "3.4.1",
"source": {
"type": "git",
"url": "https://github.com/joomla-framework/database.git",
- "reference": "d13a7504471b4730a8107e3566c6fe6d476706fc"
+ "reference": "e283eb17a68b96c340cae397cb77e723b2ea50a6"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/joomla-framework/database/zipball/d13a7504471b4730a8107e3566c6fe6d476706fc",
- "reference": "d13a7504471b4730a8107e3566c6fe6d476706fc",
+ "url": "https://api.github.com/repos/joomla-framework/database/zipball/e283eb17a68b96c340cae397cb77e723b2ea50a6",
+ "reference": "e283eb17a68b96c340cae397cb77e723b2ea50a6",
"shasum": ""
},
"require": {
@@ -1569,7 +1569,7 @@
],
"support": {
"issues": "https://github.com/joomla-framework/database/issues",
- "source": "https://github.com/joomla-framework/database/tree/3.3.1"
+ "source": "https://github.com/joomla-framework/database/tree/3.4.1"
},
"funding": [
{
@@ -1581,7 +1581,7 @@
"type": "github"
}
],
- "time": "2025-01-26T13:22:09+00:00"
+ "time": "2025-04-06T13:57:03+00:00"
},
{
"name": "joomla/di",
@@ -1725,16 +1725,16 @@
},
{
"name": "joomla/filesystem",
- "version": "3.0.2",
+ "version": "3.1.0",
"source": {
"type": "git",
"url": "https://github.com/joomla-framework/filesystem.git",
- "reference": "c69358f6500b8d931bd6e4e3042aa365dcace155"
+ "reference": "4bcdf0b029db585c42169ddd5c4f3635c7cac04e"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/joomla-framework/filesystem/zipball/c69358f6500b8d931bd6e4e3042aa365dcace155",
- "reference": "c69358f6500b8d931bd6e4e3042aa365dcace155",
+ "url": "https://api.github.com/repos/joomla-framework/filesystem/zipball/4bcdf0b029db585c42169ddd5c4f3635c7cac04e",
+ "reference": "4bcdf0b029db585c42169ddd5c4f3635c7cac04e",
"shasum": ""
},
"require": {
@@ -1744,7 +1744,8 @@
"joomla/test": "^3.0",
"mikey179/vfsstream": "^1.6.11",
"phan/phan": "^5.4.2",
- "phpstan/phpstan": "^1.10.7",
+ "phpstan/phpstan": "^2.0",
+ "phpstan/phpstan-deprecation-rules": "^2.0",
"phpunit/phpunit": "^9.5.28",
"squizlabs/php_codesniffer": "^3.7.2"
},
@@ -1773,7 +1774,7 @@
],
"support": {
"issues": "https://github.com/joomla-framework/filesystem/issues",
- "source": "https://github.com/joomla-framework/filesystem/tree/3.0.2"
+ "source": "https://github.com/joomla-framework/filesystem/tree/3.1.0"
},
"funding": [
{
@@ -1785,7 +1786,7 @@
"type": "github"
}
],
- "time": "2024-09-12T11:44:35+00:00"
+ "time": "2025-03-07T09:56:32+00:00"
},
{
"name": "joomla/filter",
@@ -1856,16 +1857,16 @@
},
{
"name": "joomla/http",
- "version": "3.0.1",
+ "version": "3.1.0",
"source": {
"type": "git",
"url": "https://github.com/joomla-framework/http.git",
- "reference": "3379b5a0c68524685b89d6997e5fec56c6ad3d43"
+ "reference": "157ceb1d386cb4a80292909f128f53f1b99f2597"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/joomla-framework/http/zipball/3379b5a0c68524685b89d6997e5fec56c6ad3d43",
- "reference": "3379b5a0c68524685b89d6997e5fec56c6ad3d43",
+ "url": "https://api.github.com/repos/joomla-framework/http/zipball/157ceb1d386cb4a80292909f128f53f1b99f2597",
+ "reference": "157ceb1d386cb4a80292909f128f53f1b99f2597",
"shasum": ""
},
"require": {
@@ -1879,7 +1880,8 @@
"require-dev": {
"joomla/test": "^3.0",
"phan/phan": "^5.4.2",
- "phpstan/phpstan": "^1.10.7",
+ "phpstan/phpstan": "^2.0",
+ "phpstan/phpstan-deprecation-rules": "^2.0",
"phpunit/phpunit": "^9.5.28",
"squizlabs/php_codesniffer": "^3.7.2"
},
@@ -1911,7 +1913,7 @@
],
"support": {
"issues": "https://github.com/joomla-framework/http/issues",
- "source": "https://github.com/joomla-framework/http/tree/3.0.1"
+ "source": "https://github.com/joomla-framework/http/tree/3.1.0"
},
"funding": [
{
@@ -1923,7 +1925,7 @@
"type": "github"
}
],
- "time": "2024-03-11T18:42:37+00:00"
+ "time": "2025-03-05T11:15:59+00:00"
},
{
"name": "joomla/input",
@@ -3025,16 +3027,16 @@
},
{
"name": "php-debugbar/php-debugbar",
- "version": "v2.1.1",
+ "version": "v2.1.6",
"source": {
"type": "git",
"url": "https://github.com/php-debugbar/php-debugbar.git",
- "reference": "e044ee885e5e0ba54da1138ce49c9096f6e3facb"
+ "reference": "16fa68da5617220594aa5e33fa9de415f94784a0"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/php-debugbar/php-debugbar/zipball/e044ee885e5e0ba54da1138ce49c9096f6e3facb",
- "reference": "e044ee885e5e0ba54da1138ce49c9096f6e3facb",
+ "url": "https://api.github.com/repos/php-debugbar/php-debugbar/zipball/16fa68da5617220594aa5e33fa9de415f94784a0",
+ "reference": "16fa68da5617220594aa5e33fa9de415f94784a0",
"shasum": ""
},
"require": {
@@ -3089,22 +3091,22 @@
],
"support": {
"issues": "https://github.com/php-debugbar/php-debugbar/issues",
- "source": "https://github.com/php-debugbar/php-debugbar/tree/v2.1.1"
+ "source": "https://github.com/php-debugbar/php-debugbar/tree/v2.1.6"
},
- "time": "2025-02-13T12:08:20+00:00"
+ "time": "2025-02-21T17:47:03+00:00"
},
{
"name": "php-tuf/php-tuf",
- "version": "1.0.2",
+ "version": "1.0.3",
"source": {
"type": "git",
"url": "https://github.com/joomla-backports/php-tuf.git",
- "reference": "051750c097eaa1c3954e5f1f480f708260de5d47"
+ "reference": "1fc585dc5a090a4af94823e21470779f31030733"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/joomla-backports/php-tuf/zipball/051750c097eaa1c3954e5f1f480f708260de5d47",
- "reference": "051750c097eaa1c3954e5f1f480f708260de5d47",
+ "url": "https://api.github.com/repos/joomla-backports/php-tuf/zipball/1fc585dc5a090a4af94823e21470779f31030733",
+ "reference": "1fc585dc5a090a4af94823e21470779f31030733",
"shasum": ""
},
"require": {
@@ -3165,7 +3167,7 @@
"MIT"
],
"description": "PHP implementation of The Update Framework (TUF)",
- "time": "2025-02-03T07:10:33+00:00"
+ "time": "2025-03-19T20:05:51+00:00"
},
{
"name": "phpmailer/phpmailer",
@@ -4277,16 +4279,16 @@
},
{
"name": "symfony/error-handler",
- "version": "v6.4.18",
+ "version": "v6.4.19",
"source": {
"type": "git",
"url": "https://github.com/symfony/error-handler.git",
- "reference": "e8d3b5b1975e67812a54388b1ba8e9ec28eb770e"
+ "reference": "3d4e55cd2b8f1979a65eba9ab749d6466c316f71"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/error-handler/zipball/e8d3b5b1975e67812a54388b1ba8e9ec28eb770e",
- "reference": "e8d3b5b1975e67812a54388b1ba8e9ec28eb770e",
+ "url": "https://api.github.com/repos/symfony/error-handler/zipball/3d4e55cd2b8f1979a65eba9ab749d6466c316f71",
+ "reference": "3d4e55cd2b8f1979a65eba9ab749d6466c316f71",
"shasum": ""
},
"require": {
@@ -4332,7 +4334,7 @@
"description": "Provides tools to manage errors and ease debugging PHP code",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/error-handler/tree/v6.4.18"
+ "source": "https://github.com/symfony/error-handler/tree/v6.4.19"
},
"funding": [
{
@@ -4348,20 +4350,20 @@
"type": "tidelift"
}
],
- "time": "2025-01-06T09:38:16+00:00"
+ "time": "2025-02-02T20:16:33+00:00"
},
{
"name": "symfony/http-client",
- "version": "v6.4.18",
+ "version": "v6.4.19",
"source": {
"type": "git",
"url": "https://github.com/symfony/http-client.git",
- "reference": "394b440934056b8d9d6ba250001458e9d7998b7f"
+ "reference": "3294a433fc9d12ae58128174896b5b1822c28dad"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/http-client/zipball/394b440934056b8d9d6ba250001458e9d7998b7f",
- "reference": "394b440934056b8d9d6ba250001458e9d7998b7f",
+ "url": "https://api.github.com/repos/symfony/http-client/zipball/3294a433fc9d12ae58128174896b5b1822c28dad",
+ "reference": "3294a433fc9d12ae58128174896b5b1822c28dad",
"shasum": ""
},
"require": {
@@ -4425,7 +4427,7 @@
"http"
],
"support": {
- "source": "https://github.com/symfony/http-client/tree/v6.4.18"
+ "source": "https://github.com/symfony/http-client/tree/v6.4.19"
},
"funding": [
{
@@ -4441,7 +4443,7 @@
"type": "tidelift"
}
],
- "time": "2025-01-28T15:49:13+00:00"
+ "time": "2025-02-13T09:55:13+00:00"
},
{
"name": "symfony/http-client-contracts",
@@ -5540,16 +5542,16 @@
},
{
"name": "symfony/validator",
- "version": "v6.4.18",
+ "version": "v6.4.19",
"source": {
"type": "git",
"url": "https://github.com/symfony/validator.git",
- "reference": "ce20367d07b2592202e9c266b16a93fa50145207"
+ "reference": "f3e853dffe7c5db675686b8216d6d890dad8c885"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/validator/zipball/ce20367d07b2592202e9c266b16a93fa50145207",
- "reference": "ce20367d07b2592202e9c266b16a93fa50145207",
+ "url": "https://api.github.com/repos/symfony/validator/zipball/f3e853dffe7c5db675686b8216d6d890dad8c885",
+ "reference": "f3e853dffe7c5db675686b8216d6d890dad8c885",
"shasum": ""
},
"require": {
@@ -5617,7 +5619,7 @@
"description": "Provides tools to validate values",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/validator/tree/v6.4.18"
+ "source": "https://github.com/symfony/validator/tree/v6.4.19"
},
"funding": [
{
@@ -5633,7 +5635,7 @@
"type": "tidelift"
}
],
- "time": "2025-01-27T16:05:44+00:00"
+ "time": "2025-02-19T13:12:02+00:00"
},
{
"name": "symfony/var-dumper",
@@ -5881,12 +5883,12 @@
"source": {
"type": "git",
"url": "https://github.com/joomla-backports/json-api-php.git",
- "reference": "a56f59df9e0fc95b1421a5210e1cdf208c9f91d2"
+ "reference": "89f1ef6a6711bd2f03d67fa13e4704928da411da"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/joomla-backports/json-api-php/zipball/a56f59df9e0fc95b1421a5210e1cdf208c9f91d2",
- "reference": "a56f59df9e0fc95b1421a5210e1cdf208c9f91d2",
+ "url": "https://api.github.com/repos/joomla-backports/json-api-php/zipball/89f1ef6a6711bd2f03d67fa13e4704928da411da",
+ "reference": "89f1ef6a6711bd2f03d67fa13e4704928da411da",
"shasum": ""
},
"require": {
@@ -5929,29 +5931,30 @@
"jsonapi",
"standard"
],
- "time": "2022-12-30T19:09:00+00:00"
+ "time": "2025-03-21T09:49:11+00:00"
},
{
"name": "typo3/phar-stream-wrapper",
- "version": "v4.0.0",
+ "version": "v3.1.8",
"source": {
"type": "git",
"url": "https://github.com/TYPO3/phar-stream-wrapper.git",
- "reference": "ce4b6e9873d4dd7dce2a397511713bf14977fdf2"
+ "reference": "a931b28f422a60052db85c0a84a05a366453b2c0"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/TYPO3/phar-stream-wrapper/zipball/ce4b6e9873d4dd7dce2a397511713bf14977fdf2",
- "reference": "ce4b6e9873d4dd7dce2a397511713bf14977fdf2",
+ "url": "https://api.github.com/repos/TYPO3/phar-stream-wrapper/zipball/a931b28f422a60052db85c0a84a05a366453b2c0",
+ "reference": "a931b28f422a60052db85c0a84a05a366453b2c0",
"shasum": ""
},
"require": {
"ext-json": "*",
- "php": "^7.1 || ^8.0"
+ "php": "^7.0 || ~8.0 || ~8.1 || ~8.2 || ~8.3"
},
"require-dev": {
"ext-xdebug": "*",
- "phpunit/phpunit": "^7 || ^8 || ^9"
+ "phpspec/prophecy": "^1.10",
+ "symfony/phpunit-bridge": "^5.1"
},
"suggest": {
"ext-fileinfo": "For PHP builtin file type guessing, otherwise uses internal processing"
@@ -5959,7 +5962,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "4.x-dev"
+ "dev-master": "v3.x-dev"
}
},
"autoload": {
@@ -5981,9 +5984,9 @@
],
"support": {
"issues": "https://github.com/TYPO3/phar-stream-wrapper/issues",
- "source": "https://github.com/TYPO3/phar-stream-wrapper/tree/v4.0.0"
+ "source": "https://github.com/TYPO3/phar-stream-wrapper/tree/v3.1.8"
},
- "time": "2024-12-10T00:00:25+00:00"
+ "time": "2024-12-09T23:06:33+00:00"
},
{
"name": "voku/portable-ascii",
@@ -7113,16 +7116,16 @@
},
{
"name": "friendsofphp/php-cs-fixer",
- "version": "v3.68.5",
+ "version": "v3.72.0",
"source": {
"type": "git",
"url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git",
- "reference": "7bedb718b633355272428c60736dc97fb96daf27"
+ "reference": "900389362c43d116fee1ffc51f7878145fa61b57"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/7bedb718b633355272428c60736dc97fb96daf27",
- "reference": "7bedb718b633355272428c60736dc97fb96daf27",
+ "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/900389362c43d116fee1ffc51f7878145fa61b57",
+ "reference": "900389362c43d116fee1ffc51f7878145fa61b57",
"shasum": ""
},
"require": {
@@ -7139,7 +7142,7 @@
"react/promise": "^2.0 || ^3.0",
"react/socket": "^1.0",
"react/stream": "^1.0",
- "sebastian/diff": "^4.0 || ^5.1 || ^6.0",
+ "sebastian/diff": "^4.0 || ^5.1 || ^6.0 || ^7.0",
"symfony/console": "^5.4 || ^6.4 || ^7.0",
"symfony/event-dispatcher": "^5.4 || ^6.4 || ^7.0",
"symfony/filesystem": "^5.4 || ^6.4 || ^7.0",
@@ -7152,18 +7155,18 @@
"symfony/stopwatch": "^5.4 || ^6.4 || ^7.0"
},
"require-dev": {
- "facile-it/paraunit": "^1.3.1 || ^2.4",
- "infection/infection": "^0.29.8",
- "justinrainbow/json-schema": "^5.3 || ^6.0",
+ "facile-it/paraunit": "^1.3.1 || ^2.6",
+ "infection/infection": "^0.29.14",
+ "justinrainbow/json-schema": "^5.3 || ^6.2",
"keradus/cli-executor": "^2.1",
"mikey179/vfsstream": "^1.6.12",
"php-coveralls/php-coveralls": "^2.7",
"php-cs-fixer/accessible-object": "^1.1",
- "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.5",
- "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.5",
- "phpunit/phpunit": "^9.6.22 || ^10.5.40 || ^11.5.2",
- "symfony/var-dumper": "^5.4.48 || ^6.4.15 || ^7.2.0",
- "symfony/yaml": "^5.4.45 || ^6.4.13 || ^7.2.0"
+ "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.6",
+ "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.6",
+ "phpunit/phpunit": "^9.6.22 || ^10.5.45 || ^11.5.12",
+ "symfony/var-dumper": "^5.4.48 || ^6.4.18 || ^7.2.3",
+ "symfony/yaml": "^5.4.45 || ^6.4.18 || ^7.2.3"
},
"suggest": {
"ext-dom": "For handling output formats in XML",
@@ -7204,7 +7207,7 @@
],
"support": {
"issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues",
- "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.68.5"
+ "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.72.0"
},
"funding": [
{
@@ -7212,7 +7215,7 @@
"type": "github"
}
],
- "time": "2025-01-30T17:00:50+00:00"
+ "time": "2025-03-13T11:25:37+00:00"
},
{
"name": "joomla/mediawiki",
@@ -7356,16 +7359,16 @@
},
{
"name": "myclabs/deep-copy",
- "version": "1.12.1",
+ "version": "1.13.0",
"source": {
"type": "git",
"url": "https://github.com/myclabs/DeepCopy.git",
- "reference": "123267b2c49fbf30d78a7b2d333f6be754b94845"
+ "reference": "024473a478be9df5fdaca2c793f2232fe788e414"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/123267b2c49fbf30d78a7b2d333f6be754b94845",
- "reference": "123267b2c49fbf30d78a7b2d333f6be754b94845",
+ "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/024473a478be9df5fdaca2c793f2232fe788e414",
+ "reference": "024473a478be9df5fdaca2c793f2232fe788e414",
"shasum": ""
},
"require": {
@@ -7404,7 +7407,7 @@
],
"support": {
"issues": "https://github.com/myclabs/DeepCopy/issues",
- "source": "https://github.com/myclabs/DeepCopy/tree/1.12.1"
+ "source": "https://github.com/myclabs/DeepCopy/tree/1.13.0"
},
"funding": [
{
@@ -7412,7 +7415,7 @@
"type": "tidelift"
}
],
- "time": "2024-11-08T17:47:46+00:00"
+ "time": "2025-02-12T12:17:51+00:00"
},
{
"name": "nikic/php-parser",
@@ -7592,16 +7595,16 @@
},
{
"name": "phpstan/phpstan",
- "version": "2.1.2",
+ "version": "2.1.8",
"source": {
"type": "git",
"url": "https://github.com/phpstan/phpstan.git",
- "reference": "7d08f569e582ade182a375c366cbd896eccadd3a"
+ "reference": "f9adff3b87c03b12cc7e46a30a524648e497758f"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpstan/phpstan/zipball/7d08f569e582ade182a375c366cbd896eccadd3a",
- "reference": "7d08f569e582ade182a375c366cbd896eccadd3a",
+ "url": "https://api.github.com/repos/phpstan/phpstan/zipball/f9adff3b87c03b12cc7e46a30a524648e497758f",
+ "reference": "f9adff3b87c03b12cc7e46a30a524648e497758f",
"shasum": ""
},
"require": {
@@ -7646,7 +7649,7 @@
"type": "github"
}
],
- "time": "2025-01-21T14:54:06+00:00"
+ "time": "2025-03-09T09:30:48+00:00"
},
{
"name": "phpstan/phpstan-deprecation-rules",
@@ -9608,16 +9611,16 @@
},
{
"name": "squizlabs/php_codesniffer",
- "version": "3.11.3",
+ "version": "3.12.0",
"source": {
"type": "git",
"url": "https://github.com/PHPCSStandards/PHP_CodeSniffer.git",
- "reference": "ba05f990e79cbe69b9f35c8c1ac8dca7eecc3a10"
+ "reference": "2d1b63db139c3c6ea0c927698e5160f8b3b8d630"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/ba05f990e79cbe69b9f35c8c1ac8dca7eecc3a10",
- "reference": "ba05f990e79cbe69b9f35c8c1ac8dca7eecc3a10",
+ "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/2d1b63db139c3c6ea0c927698e5160f8b3b8d630",
+ "reference": "2d1b63db139c3c6ea0c927698e5160f8b3b8d630",
"shasum": ""
},
"require": {
@@ -9684,11 +9687,11 @@
"type": "open_collective"
},
{
- "url": "https://thanks.dev/phpcsstandards",
+ "url": "https://thanks.dev/u/gh/phpcsstandards",
"type": "thanks_dev"
}
],
- "time": "2025-01-23T17:04:15+00:00"
+ "time": "2025-03-18T05:04:51+00:00"
},
{
"name": "symfony/event-dispatcher",
@@ -9978,16 +9981,16 @@
},
{
"name": "symfony/process",
- "version": "v6.4.15",
+ "version": "v6.4.19",
"source": {
"type": "git",
"url": "https://github.com/symfony/process.git",
- "reference": "3cb242f059c14ae08591c5c4087d1fe443564392"
+ "reference": "7a1c12e87b08ec9c97abdd188c9b3f5a40e37fc3"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/process/zipball/3cb242f059c14ae08591c5c4087d1fe443564392",
- "reference": "3cb242f059c14ae08591c5c4087d1fe443564392",
+ "url": "https://api.github.com/repos/symfony/process/zipball/7a1c12e87b08ec9c97abdd188c9b3f5a40e37fc3",
+ "reference": "7a1c12e87b08ec9c97abdd188c9b3f5a40e37fc3",
"shasum": ""
},
"require": {
@@ -10019,7 +10022,7 @@
"description": "Executes commands in sub-processes",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/process/tree/v6.4.15"
+ "source": "https://github.com/symfony/process/tree/v6.4.19"
},
"funding": [
{
@@ -10035,20 +10038,20 @@
"type": "tidelift"
}
],
- "time": "2024-11-06T14:19:14+00:00"
+ "time": "2025-02-04T13:35:48+00:00"
},
{
"name": "symfony/stopwatch",
- "version": "v6.4.13",
+ "version": "v6.4.19",
"source": {
"type": "git",
"url": "https://github.com/symfony/stopwatch.git",
- "reference": "2cae0a6f8d04937d02f6d19806251e2104d54f92"
+ "reference": "dfe1481c12c06266d0c3d58c0cb4b09bd497ab9c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/stopwatch/zipball/2cae0a6f8d04937d02f6d19806251e2104d54f92",
- "reference": "2cae0a6f8d04937d02f6d19806251e2104d54f92",
+ "url": "https://api.github.com/repos/symfony/stopwatch/zipball/dfe1481c12c06266d0c3d58c0cb4b09bd497ab9c",
+ "reference": "dfe1481c12c06266d0c3d58c0cb4b09bd497ab9c",
"shasum": ""
},
"require": {
@@ -10081,7 +10084,7 @@
"description": "Provides a way to profile code",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/stopwatch/tree/v6.4.13"
+ "source": "https://github.com/symfony/stopwatch/tree/v6.4.19"
},
"funding": [
{
@@ -10097,7 +10100,7 @@
"type": "tidelift"
}
],
- "time": "2024-09-25T14:18:03+00:00"
+ "time": "2025-02-21T10:06:30+00:00"
},
{
"name": "theseer/tokenizer",
diff --git a/includes/incompatible.html b/includes/incompatible.html
index 4593b6d29f35f..513d0941d61e5 100644
--- a/includes/incompatible.html
+++ b/includes/incompatible.html
@@ -6,7 +6,7 @@
Joomla: unsupported PHP version
-
+
diff --git a/index.php b/index.php
index 85daa024dce05..0ce8bceb9aef4 100644
--- a/index.php
+++ b/index.php
@@ -29,4 +29,4 @@
define('_JEXEC', 1);
// Run the application - All executable code should be triggered through this file
-require_once dirname(__FILE__) . '/includes/app.php';
+require_once __DIR__ . '/includes/app.php';
diff --git a/installation/index.php b/installation/index.php
index 163297bc31829..099e5daf1d835 100644
--- a/installation/index.php
+++ b/installation/index.php
@@ -29,4 +29,4 @@
\define('_JEXEC', 1);
// Run the application - All executable code should be triggered through this file
-require_once \dirname(__FILE__) . '/includes/app.php';
+require_once __DIR__ . '/includes/app.php';
diff --git a/installation/joomla.php b/installation/joomla.php
index 137e042651c57..6a3e8db46c2a6 100644
--- a/installation/joomla.php
+++ b/installation/joomla.php
@@ -36,4 +36,4 @@
\define('_JCLI_INSTALLATION', 1);
// Run the application - All executable code should be triggered through this file
-require_once \dirname(__FILE__) . '/includes/cli.php';
+require_once __DIR__ . '/includes/cli.php';
diff --git a/installation/language/af-ZA/langmetadata.xml b/installation/language/af-ZA/langmetadata.xml
index 87ea235288772..93f6b011f3972 100644
--- a/installation/language/af-ZA/langmetadata.xml
+++ b/installation/language/af-ZA/langmetadata.xml
@@ -1,8 +1,8 @@
Afrikaans (Suid-Afrika)
- 5.2.4
- 2025-01
+ 5.3.1
+ 2025-04
Afrikaans Translation Team
(C) 2005 Open Source Matters, Inc.
GNU General Public License version 2 or later; see LICENSE.txt
diff --git a/installation/language/ar-AA/joomla.ini b/installation/language/ar-AA/joomla.ini
index b92783ff8b2fe..6452eaea8febf 100644
--- a/installation/language/ar-AA/joomla.ini
+++ b/installation/language/ar-AA/joomla.ini
@@ -5,31 +5,31 @@
; Fatal error page
; These will be processed by the JavaScript Build
-BUILD_FATAL_HEADER="عذرًا ، كانت هناك مشكلة لم نتمكن من تجاوزها."
+BUILD_FATAL_HEADER="عذرًا، كانت هناك مشكلة لم نتمكن من تجاوزها."
BUILD_FATAL_LANGUAGE="اللغة العربية بالكود الموحد" ; IMPORTANT NOTE FOR TRANSLATORS: Do not literally translate this line, instead add the localised name of the language. For example French will be Français FR
-BUILD_FATAL_TEXT="أعاد الخادم ملف \"{{statusCode_statusText}}\""
+BUILD_FATAL_TEXT="أرجع الخادم \"{{statusCode_statusText}}\""
BUILD_FATAL_URL_TEXT="ساعدني في حل هذا"
; These will be processed by the JavaScript Build
BUILD_INCOMPLETE_HEADER="إعداد البيئة غير مكتمل"
BUILD_INCOMPLETE_LANGUAGE="اللغة العربية بالكود الموحد" ; IMPORTANT NOTE FOR TRANSLATORS: Do not literally translate this line, instead add the localised name of the language. For example French will be Français FR
-BUILD_INCOMPLETE_TEXT="يبدو أنك تحاول تشغيل جوملا! من مستودع git الخاص بك. للقيام بذلك يتطلب منك إكمال خطوتين إضافيتين أولاً."
-BUILD_INCOMPLETE_URL_TEXT="[ المزيد من التفاصيل %s]"
+BUILD_INCOMPLETE_TEXT="يبدو أنك تحاول تشغيل جوملا! من مستودع git الخاص بنا. يتطلب هذا منك إكمال خطوتين إضافيتين أولاً."
+BUILD_INCOMPLETE_URL_TEXT="المزيد من التفاصيل"
; These will be processed by the JavaScript Build
-BUILD_NOXML_HEADER="عذرا ، PHP الخاص بك يفتقد مكتبة حيوية"
+BUILD_NOXML_HEADER="عذرًا، PHP الخاص بك يفتقد مكتبة حيوية"
BUILD_NOXML_LANGUAGE="اللغة العربية بالكود الموحد" ; IMPORTANT NOTE FOR TRANSLATORS: Do not literally translate this line, instead add the localised name of the language. For example French will be Français FR
-BUILD_NOXML_TEXT="يحتاج مضيفك إلى استخدام PHP مع دعم مكتبة XML لتشغيل هذا الإصدار من جوملا!"
+BUILD_NOXML_TEXT="يحتاج الخادم الخاص بك إلى استخدام PHP مع دعم مكتبة XML لتشغيل هذا الإصدار من جوملا!"
BUILD_NOXML_URL_TEXT="ساعدني في حل هذا"
; These will be processed by the JavaScript Build
-BUILD_MIN_PHP_ERROR_HEADER="عذرًا ، إصدار PHP الخاص بك غير مدعوم."
+BUILD_MIN_PHP_ERROR_HEADER="عذرًا، إصدار PHP الخاص بك غير مدعوم."
BUILD_MIN_PHP_ERROR_LANGUAGE="اللغة العربية بالكود الموحد" ; IMPORTANT NOTE FOR TRANSLATORS: Do not literally translate this line, instead add the localised name of the language. For example French will be Français FR
-BUILD_MIN_PHP_ERROR_TEXT="يحتاج مضيفك إلى استخدام إصدار PHP {{phpversion}} أو أحدث لتشغيل هذا الإصدار من جوملا."
+BUILD_MIN_PHP_ERROR_TEXT="يحتاج الخادم الخاص بك إلى استخدام إصدار PHP {{phpversion}} أو أحدث لتشغيل هذا الإصدار من جوملا."
BUILD_MIN_PHP_ERROR_URL_TEXT="ساعدني في حل هذا"
; Main Config
-INSTL_SELECT_INSTALL_LANG="حدد لغة التنصيب"
-INSTL_SELECT_LANGUAGE_TITLE="اختار اللغة"
+INSTL_SELECT_INSTALL_LANG="حدد لغة التثبيت"
+INSTL_SELECT_LANGUAGE_TITLE="اختر اللغة"
INSTL_SETUP_LOGIN_DATA="إعداد بيانات تسجيل الدخول"
-INSTL_WARNJAVASCRIPT="تحذير! يجب تمكين الجافا سكريبت لكي يتم تثبيت نظتم جوملا! بشكل صحيح"
-INSTL_WARNJSON="PHP خلال تثبيتكم JSON للتمكن من تثيت جوملا . يجب تفعيل"
+INSTL_WARNJAVASCRIPT="تحذير! يجب تمكين الجافاسكربت لكي يتم تثبيت نظام جوملا! بشكل صحيح."
+INSTL_WARNJSON="يجب تفعيل JSON في نسخة PHP الخاصة بك لتتمكن من تثبيت جوملا!"
; Precheck view
INSTL_DATABASE_SUPPORT="دعم قاعدة البيانات:"
INSTL_JSON_SUPPORT_AVAILABLE="دعم JSON"
@@ -37,15 +37,15 @@ INSTL_MB_LANGUAGE_IS_DEFAULT="استخدام لغة افتراضية متعدد
; Deprecated, will be removed with 6.0
INSTL_MB_STRING_OVERLOAD_OFF="إيقاف التحميل الزائد للسلسة متعددة وحدات البايت"
INSTL_NOTICE_DATABASE_SUPPORT="لم يتم العثور على قواعد البيانات المدعومة."
-INSTL_NOTICE_JSON_SUPPORT_AVAILABLE="PHP خلال تثبيتكم JSON للتمكن من تثيت جوملا . يجب تفعيل"
-INSTL_NOTICE_MBLANG_NOTDEFAULT="لم يتم تعيين لغة PHP mbstring على الحيادية. يمكن تعيين ذلك محليًا عن طريق إدخال php_value mbstring.languageutral في ملف .htaccess الخاص بك."
+INSTL_NOTICE_JSON_SUPPORT_AVAILABLE="يجب تفعيل JSON في نسخة PHP الخاصة بك لتتمكن من تثبيت جوملا!"
+INSTL_NOTICE_MBLANG_NOTDEFAULT="لم يتم تعيين لغة PHP mbstring على الحيادية. يمكن تعيين ذلك محليًا عن طريق إدخال php_value mbstring.languageutral في مِلَفّ .htaccess الخاص بك."
; Deprecated, will be removed with 6.0
-INSTL_NOTICE_MBSTRING_OVERLOAD_OFF="تم تعيين overload دالة PHP mbstring. يمكن إيقاف تشغيل هذا محليًا عن طريق إدخال php_value mbstring.func_overload 0 في ملف .htaccess الخاص بك."
+INSTL_NOTICE_MBSTRING_OVERLOAD_OFF="تم تعيين overload دالة PHP mbstring. يمكن إيقاف تشغيل هذه محليًا عن طريق إدخال php_value mbstring.func_overload 0 في مِلَفّ .htaccess الخاص بك."
INSTL_NOTICE_PARSE_INI_FILE_AVAILABLE="وظائف php المطلوبة parse_ini_file و parse_ini_string معطلة على الخادم الخاص بك."
INSTL_NOTICE_XML_SUPPORT="دعم XML غير متوفر. يجب تمكين هذا افتراضيًا في php ولكن قد يحتاج مستخدمو Ubuntu إلى تثبيت هذا عن طريق إجراء sudo apt-get install php-xml متبوعًا بإعادة تشغيل خادم الويب."
INSTL_NOTICE_ZLIB_COMPRESSION_SUPPORT="لم يتم تعيين ضغط Zlib. يمكن تشغيل هذا محليًا عن طريق إدخال zlib.output_compression = On في ملف php.ini ."
INSTL_PARSE_INI_FILE_AVAILABLE="دعم محلل INI"
-INSTL_PRECHECK_ACTUAL="حالياً"
+INSTL_PRECHECK_ACTUAL="حاليًا"
INSTL_PRECHECK_DESC="إذا كان أي من هذه المناصر غير مدعوم \"أي غير متوفر\" سيكون مكتوب باللون الأحمر (لا) عندها يرجى القيام بالإجراءات اللازمة لتصحيحها. لا يمكنك تنصيب جوملا! حتى توفير الإعدادت المطلوبة أدناه."
INSTL_PRECHECK_DIRECTIVE="التوجيهات"
INSTL_PRECHECK_RECOMMENDED="ينصح بها"
@@ -81,10 +81,13 @@ INSTL_DATABASE_NAME_LABEL="اسم قاعدة البيانات"
INSTL_DATABASE_NAME_MSG_MYSQL="اسم قاعدة البيانات غير صالح. يجب ألا يحتوي على الأحرف التالية: \ /"
INSTL_DATABASE_NAME_MSG_POSTGRES="اسم قاعدة البيانات غير صالح. يجب أن يبدأ بحرف ، متبوعًا بأحرف أبجدية رقمية."
INSTL_DATABASE_NO_SCHEMA="لايوجد مخطط لقاعدة البيانات متوفرة لهذا النوع من قواعد البيانات."
+INSTL_DATABASE_PASSWORD_DESC="أدخل كلمة مرور قاعدة البيانات التي قمت بإنشائها أو كلمة المرور المقدمة من مزود خدمة الاستضافة الخاص بك."
INSTL_DATABASE_PREFIX_DESC="قم باختيار بادئة الجداول او يتم اختيارها عشوائيا. المستحسن, ان يكون عدد الحروف اربعة أو خمسة, تحتوي على حروف فقط, و يفترض ان تكون النهاية بالسطر السفلي. يجب التأكد أن البادئة ليست مستعملة لصفوف اخرى في قاعدة البيانات ."
+INSTL_DATABASE_PREFIX_DUPLICATE_DESC="إذا كنت تستخدم قاعدة بيانات موجودة مع جداول بنفس البادئة، سيقوم جوملا بإعادة تسمية الجداول الموجودة وذلك بإضافة البادئة \"bak_\"."
INSTL_DATABASE_PREFIX_MSG="بادئة الجداول يجب أن تبدأ بحرف، يتبعه عدد اختياري من الحروف والأرقام وينتهي بالشرطة السفلية(_)."
INSTL_DATABASE_RESPONSE_ERROR="فشلت عملية التنصيب."
INSTL_DATABASE_TYPE_DESC="هذه على الأرجح \"MySQLi\""
+INSTL_DATABASE_USER_DESC="أدخل اسم مستخدم قاعدة البيانات التي قمت بإنشائها أو اسم المستخدم الذي حصلت عليه من مزود خدمة الاستضافة الخاص بك."
INSTL_DATABASE_VALIDATION_ERROR="تحقق من بيانات اعتماد قاعدة البيانات أو نوع قاعدة البيانات أو اسم قاعدة البيانات أو اسم المضيف. إذا كان لديك MySQL 8 مثبتًا ، فالرجاء قراءة توضيحات لمزيد من المعلومات."
INSTL_CONNECT_DB="إعداد اتصال قاعدة البيانات"
@@ -100,6 +103,9 @@ INSTL_SETUP_SITE_NAME="إعداد اسم الموقع"
INSTL_SITE="الإعدادات الرئيسية"
INSTL_SITE_DEVMODE_LABEL="اكتشفنا وضع التطوير development mode"
INSTL_SITE_NAME_DESC="أدخل اسم الموقع الخاص بك المبني بجوملا!."
+; Expert View
+INSTL_PUBLIC_FOLDER_DESC="المسار النسبي أو المطلق إلى المجلد العام"
+INSTL_PUBLIC_FOLDER_DESC_SHORT="المسار النسبي أو المطلق إلى المجلد العام"
; Complete view
INSTL_COMPLETE_ERROR_FOLDER_DELETE="تعذر حذف مجلد \"%s\" . يرجى القيام بحذفه بشكل يدوي."
INSTL_COMPLETE_REMOVE_FOLDER="يرجى إزالة مجلد \"%s\""
@@ -117,7 +123,10 @@ INSTL_LANGUAGES_COLUMN_HEADER_LANGUAGE="اللغة"
INSTL_LANGUAGES_COLUMN_HEADER_LANGUAGE_SELECT="اختار اللغة"
INSTL_LANGUAGES_COLUMN_HEADER_LANGUAGE_TAG="كود اللغة"
INSTL_LANGUAGES_COLUMN_HEADER_VERSION="الاصدار"
+INSTL_LANGUAGES_DESC="واجهة Joomla متاحة بعدة لغات. اختر لغاتك المفضلة عن طريق اختيار خانات الاختيار ثم تثبيتها عن طريق تحديد زر \"تثبيت اللغات المحددة\". ملاحظة: هذه العملية ستستغرق حوالي 10 ثوان لتنزيل وتثبيت كل لغة. لتجنب المهلة الزمنية يرجى تحديد ما لا يزيد عن 3 لغات للتثبيت."
+INSTL_LANGUAGES_MESSAGE_PLEASE_WAIT="ستستغرق هذه العملية ما يصل إلى 10 ثوان في كل لغة للإكتمال الرجاء الانتظار بينما نقوم بتنزيل وتثبيت اللغات …"
INSTL_LANGUAGES_NO_LANGUAGE_SELECTED="لطفاً, حدد اللغة. إن لم تكن تريد تنصيب المزيد من اللغات فانقر على زر 'السابق' "
+INSTL_LANGUAGES_SELECTED="قم بتثبيت اللغات المحددة"
INSTL_LANGUAGES_WARNING_NO_INTERNET="لم تتمكن جوملا! من الاتصال بسيرفر اللغات. لطفاً قم بإنهاء عملية التنصيب."
INSTL_LANGUAGES_WARNING_NO_INTERNET2="ملاحظة: سيكون متاحاً لك تنصيب اللغات أيضا من لوحة تحكم جوملا!"
INSTL_LANGUAGES_WARNING_BACK_BUTTON="العودة للمرحلة الأخيرة من التنصيب"
@@ -186,6 +195,7 @@ INSTL_NOTICE_NEEDSTOBEWRITABLE="لا يزال بإمكانك متابعة الت
INSTL_OUTPUT_BUFFERING="تخزين المخرجات Output Buffering"
INSTL_PHP_VERSION="نسخة PHP"
INSTL_PHP_VERSION_NEWER="إصدار PHP >= %s"
+INSTL_PROCESS_BUSY="العملية قيد الإجراء. الرجاء الانتظار …"
INSTL_SESSION_AUTO_START="بداية تلقائية للجلسة Session auto start"
INSTL_WRITABLE="%s قابل للكتابة"
INSTL_ZIP_SUPPORT_AVAILABLE="توفر ZIP خاصية فك الملفات المضغوطة"
@@ -201,6 +211,7 @@ JGLOBAL_SELECT_NO_RESULTS_MATCH="لايوجد نتائج مشابهة"
JGLOBAL_SELECT_SOME_OPTIONS="حدد بعض الخيارات"
JHIDEPASSWORD="إخفاء كلمة المرور"
JINVALID_TOKEN="رمز غير صالح"
+JINVALID_TOKEN_NOTICE="قيم الكود الأمني غير متوافقة. تم رفض الطلب تفاديًا لأي خرق أمني محتمل. لطفاً حاول مرة أخرى."
JNEXT="التالي"
JNO="ابدا"
JNOTICE="ملاحظة"
@@ -222,6 +233,7 @@ JLIB_FILESYSTEM_ERROR_PATH_IS_NOT_A_FOLDER="JFolder: :حذف: المسار لا
JLIB_FORM_FIELD_INVALID="حقل غير صحيح: "
JLIB_FORM_VALIDATE_FIELD_INVALID="حقل غير صالح: %s"
JLIB_FORM_VALIDATE_FIELD_REQUIRED="حقل مطلوب: %s"
+JLIB_INSTALLER_ABORT="إيقاف تثبيت اللغة: %s"
JLIB_INSTALLER_ABORT_CREATE_DIRECTORY="التطبيق %1$s: فشل انشاء الدليل باسم: %2$s"
JLIB_INSTALLER_ABORT_NOINSTALLPATH="مسار التنصيب غير موجود"
JLIB_INSTALLER_ABORT_PACK_INSTALL_ERROR_EXTENSION="الحزمة %1$s: حصل خطأ عند محاولة تنصيب الاضافة: %2$s"
@@ -234,6 +246,7 @@ JLIB_INSTALLER_WARNING_UNABLE_TO_INSTALL_CONTENT_LANGUAGE="تعذر إنشاء
JLIB_UPDATER_ERROR_COLLECTION_FOPEN="الدالة allow_url_fopen غير مفعلة. يجب تفعيلها كي تتم عملية التحديث."
JLIB_UPDATER_ERROR_COLLECTION_OPEN_URL="Update: :Collection: غير قادر على فتح %s"
JLIB_UPDATER_ERROR_COLLECTION_PARSE_URL="Update: :Collection: لا يمكن تحليل %s"
+JLIB_UPDATER_ERROR_OPEN_UPDATE_SITE="تحديث: تعذر فتح موقع التحديث #%d "%s", الرابط: %s."
JLIB_UTIL_ERROR_CONNECT_DATABASE="JDatabase: :getInstance: تعذر الاتصال بقاعدة البيانات joomla.library: %1$s - %2$s"
; Strings for the language debugger
JDEBUG_LANGUAGE_FILES_IN_ERROR="تحليل الأخطاء في ملفات اللغة"
@@ -256,6 +269,7 @@ MESSAGE="الرسالة"
NOTICE="ملاحظة"
WARNING="تحذير"
; Javascript ajax error messages
+JLIB_JS_AJAX_ERROR_CONNECTION_ABORT="فشل الاتصال عند محاولة الحصول على بيانات JSON."
JLIB_JS_AJAX_ERROR_NO_CONTENT="لايمكن استعادة المحتوى."
JLIB_JS_AJAX_ERROR_OTHER="حدث خطأ أثناء جلب البيانات JSON: HTTP %s حالة الكود."
JLIB_JS_AJAX_ERROR_PARSE="حدث خطأ في تحليل أثناء معالجة البيانات JSON التالية:%s"
@@ -271,4 +285,9 @@ JLIB_FORM_CONTAINS_INVALID_FIELDS="لا يمكن إرسال النموذج لأ
JLIB_FORM_FIELD_INVALID_VALUE="هذه القيمة غير صالحة."
JLIB_FORM_FIELD_REQUIRED_CHECK="يجب تحديد أحد الخيارات."
JLIB_FORM_FIELD_REQUIRED_VALUE="يرجى ملء هذا الحقل."
+; Installation progress screen
+INSTL="تثبيت"
+INSTL_FINISHED="تم التثبيت"
+INSTL_IN_PROGRESS="يتم التثبيت"
+INSTL_PROGRESS="حالة التثبيت"
diff --git a/installation/language/ar-AA/langmetadata.xml b/installation/language/ar-AA/langmetadata.xml
index 312bc933aec7e..808f7455b5c01 100644
--- a/installation/language/ar-AA/langmetadata.xml
+++ b/installation/language/ar-AA/langmetadata.xml
@@ -1,8 +1,8 @@
Arabic (اللغة العربية)
- 5.2.4
- 2025-01
+ 5.3.1
+ 2025-04
Dr. Ashraf Damra
(C) 2005 Open Source Matters, Inc.
GNU General Public License version 2 or later; see LICENSE.txt
diff --git a/installation/language/be-BY/langmetadata.xml b/installation/language/be-BY/langmetadata.xml
index 0917c772619da..5367cca256d77 100644
--- a/installation/language/be-BY/langmetadata.xml
+++ b/installation/language/be-BY/langmetadata.xml
@@ -1,8 +1,8 @@
Belarusian (Belarus)
- 5.2.4
- 2025-01
+ 5.3.1
+ 2025-04
Joomla Belarus Community
(C) 2005 Open Source Matters, Inc.
GNU General Public License version 2 or later; see LICENSE.txt
diff --git a/installation/language/bg-BG/langmetadata.xml b/installation/language/bg-BG/langmetadata.xml
index b3230b1202f33..5315164f75e95 100644
--- a/installation/language/bg-BG/langmetadata.xml
+++ b/installation/language/bg-BG/langmetadata.xml
@@ -1,8 +1,8 @@
Bulgarian (bg-BG)
- 5.2.4
- 2025-01
+ 5.3.1
+ 2025-04
Joomla! Bulgaria
(C) 2005 Open Source Matters, Inc.
GNU General Public License version 2 or later; see LICENSE.txt
diff --git a/installation/language/ca-ES/langmetadata.xml b/installation/language/ca-ES/langmetadata.xml
index dcf1f1d5a683d..2d1bb5f8bd774 100644
--- a/installation/language/ca-ES/langmetadata.xml
+++ b/installation/language/ca-ES/langmetadata.xml
@@ -1,8 +1,8 @@
Catalan (ca-ES)
- 5.2.4
- 2025-01
+ 5.3.1
+ 2025-04
Catalan [ca-ES] Translation Team
(C) 2005 Open Source Matters, Inc.
GNU General Public License version 2 or later; see LICENSE.txt
diff --git a/installation/language/cs-CZ/langmetadata.xml b/installation/language/cs-CZ/langmetadata.xml
index e8b6ee42b938b..73b5df58f6185 100644
--- a/installation/language/cs-CZ/langmetadata.xml
+++ b/installation/language/cs-CZ/langmetadata.xml
@@ -1,8 +1,8 @@
Czech (Čeština)
- 5.2.4
- 2025-01
+ 5.3.1
+ 2025-04
Czech Translation Team
(C) 2005 Open Source Matters, Inc.
GNU General Public License version 2 or later; see LICENSE.txt
diff --git a/installation/language/cy-GB/langmetadata.xml b/installation/language/cy-GB/langmetadata.xml
index 3d4a4b4412fdd..079dbc0334998 100644
--- a/installation/language/cy-GB/langmetadata.xml
+++ b/installation/language/cy-GB/langmetadata.xml
@@ -1,8 +1,8 @@
Welsh (United Kingdom)
- 5.2.4
- 2025-01
+ 5.3.1
+ 2025-04
Joomla! Project - Welsh Translation Team
(C) 2005 Open Source Matters, Inc.
GNU General Public License version 2 or later; see LICENSE.txt
diff --git a/installation/language/da-DK/langmetadata.xml b/installation/language/da-DK/langmetadata.xml
index 198e0c60ba04f..61ded4aa4e10b 100644
--- a/installation/language/da-DK/langmetadata.xml
+++ b/installation/language/da-DK/langmetadata.xml
@@ -1,8 +1,8 @@
Danish (Danmark)
- 5.2.4
- 2025-01
+ 5.3.1
+ 2025-04
Danish Translation Team (Transl.: Ronny Buelund)
(C) 2005 Open Source Matters, Inc.
GNU General Public License version 2 or later; see LICENSE.txt
diff --git a/installation/language/de-AT/langmetadata.xml b/installation/language/de-AT/langmetadata.xml
index 5256f573bfb68..b59efab926338 100644
--- a/installation/language/de-AT/langmetadata.xml
+++ b/installation/language/de-AT/langmetadata.xml
@@ -1,8 +1,8 @@
German (Austria)
- 5.2.3
- 2025-01
+ 5.3.0
+ 2025-04
J!German
(C) 2005 Open Source Matters, Inc.
GNU General Public License version 2 or later; see LICENSE.txt
diff --git a/installation/language/de-CH/langmetadata.xml b/installation/language/de-CH/langmetadata.xml
index 4b6854cae98d1..5e26938c292b3 100644
--- a/installation/language/de-CH/langmetadata.xml
+++ b/installation/language/de-CH/langmetadata.xml
@@ -1,8 +1,8 @@
German (Switzerland)
- 5.2.3
- 2025-01
+ 5.3.0
+ 2025-04
J!German
(C) 2005 Open Source Matters, Inc.
GNU General Public License version 2 or later; see LICENSE.txt
diff --git a/installation/language/de-DE/langmetadata.xml b/installation/language/de-DE/langmetadata.xml
index 3cd4d882526d2..0b937660985c3 100644
--- a/installation/language/de-DE/langmetadata.xml
+++ b/installation/language/de-DE/langmetadata.xml
@@ -1,8 +1,8 @@
German (Germany)
- 5.2.3
- 2025-01
+ 5.3.0
+ 2025-04
J!German
(C) 2005 Open Source Matters, Inc.
GNU General Public License version 2 or later; see LICENSE.txt
diff --git a/installation/language/de-LI/langmetadata.xml b/installation/language/de-LI/langmetadata.xml
index 6ffe9f219a3ea..6f0cf20019ab7 100644
--- a/installation/language/de-LI/langmetadata.xml
+++ b/installation/language/de-LI/langmetadata.xml
@@ -1,8 +1,8 @@
German (Liechtenstein)
- 5.2.3
- 2025-01
+ 5.3.0
+ 2025-04
J!German
(C) 2005 Open Source Matters, Inc.
GNU General Public License version 2 or later; see LICENSE.txt
diff --git a/installation/language/de-LU/langmetadata.xml b/installation/language/de-LU/langmetadata.xml
index f52a1f0754feb..c5bf9121bc466 100644
--- a/installation/language/de-LU/langmetadata.xml
+++ b/installation/language/de-LU/langmetadata.xml
@@ -1,8 +1,8 @@
German (Luxembourg)
- 5.2.3
- 2025-01
+ 5.3.0
+ 2025-04
J!German
(C) 2005 Open Source Matters, Inc.
GNU General Public License version 2 or later; see LICENSE.txt
diff --git a/installation/language/el-GR/langmetadata.xml b/installation/language/el-GR/langmetadata.xml
index f9e868ca7d905..ff308ce64c543 100644
--- a/installation/language/el-GR/langmetadata.xml
+++ b/installation/language/el-GR/langmetadata.xml
@@ -1,8 +1,8 @@
Greek (el-GR)
- 5.2.4
- 2025-01
+ 5.3.1
+ 2025-04
Ομάδα Μετάφρασης: joomla. gr
(C) 2005 Open Source Matters, Inc.
GNU General Public License version 2 or later; see LICENSE.txt
diff --git a/installation/language/en-AU/joomla.ini b/installation/language/en-AU/joomla.ini
index 46a048b6c1d81..bcab3640e02d7 100644
--- a/installation/language/en-AU/joomla.ini
+++ b/installation/language/en-AU/joomla.ini
@@ -81,11 +81,13 @@ INSTL_DATABASE_NAME_LABEL="Database Name"
INSTL_DATABASE_NAME_MSG_MYSQL="The database name is invalid. It must not contain the following characters: \ /"
INSTL_DATABASE_NAME_MSG_POSTGRES="The database name is invalid. It must start with a letter, followed by alphanumeric characters."
INSTL_DATABASE_NO_SCHEMA="No database schema exists for this database type."
+INSTL_DATABASE_PASSWORD_DESC="Enter the database password you created or a password provided by your host."
INSTL_DATABASE_PREFIX_DESC="Enter a table prefix or use the randomly generated one."
INSTL_DATABASE_PREFIX_DUPLICATE_DESC="If you are using an existing database with tables with the same prefix, Joomla will rename those existing tables by adding the prefix \"bak_\"."
INSTL_DATABASE_PREFIX_MSG="The table prefix must start with a letter, optionally be followed by alphanumeric characters and by an underscore"
INSTL_DATABASE_RESPONSE_ERROR="The installation process failed."
INSTL_DATABASE_TYPE_DESC="Select the database type."
+INSTL_DATABASE_USER_DESC="Enter the database username you created or a username provided by your host."
INSTL_DATABASE_VALIDATION_ERROR="Check your database credentials, database type, database name or hostname. If you have MySQL 8 installed then please read this wiki for more information."
INSTL_CONNECT_DB="Setup Database Connection"
diff --git a/installation/language/en-AU/langmetadata.xml b/installation/language/en-AU/langmetadata.xml
index cd1091db2ab13..3ec7f1f6e0233 100644
--- a/installation/language/en-AU/langmetadata.xml
+++ b/installation/language/en-AU/langmetadata.xml
@@ -1,8 +1,8 @@
English (Australia)
- 5.2.4
- 2025-01
+ 5.3.1
+ 2025-04
Joomla! Project
(C) 2005 Open Source Matters, Inc.
GNU General Public License version 2 or later; see LICENSE.txt
diff --git a/installation/language/en-CA/joomla.ini b/installation/language/en-CA/joomla.ini
index 3375f22616da9..78a40e714eb88 100644
--- a/installation/language/en-CA/joomla.ini
+++ b/installation/language/en-CA/joomla.ini
@@ -81,11 +81,13 @@ INSTL_DATABASE_NAME_LABEL="Database Name"
INSTL_DATABASE_NAME_MSG_MYSQL="The database name is invalid. It must not contain the following characters: \ /"
INSTL_DATABASE_NAME_MSG_POSTGRES="The database name is invalid. It must start with a letter, followed by alphanumeric characters."
INSTL_DATABASE_NO_SCHEMA="No database schema exists for this database type."
+INSTL_DATABASE_PASSWORD_DESC="Enter the database password you created or a password provided by your host."
INSTL_DATABASE_PREFIX_DESC="Enter a table prefix or use the randomly generated one."
INSTL_DATABASE_PREFIX_DUPLICATE_DESC="If you are using an existing database with tables with the same prefix, Joomla will rename those existing tables by adding the prefix \"bak_\"."
INSTL_DATABASE_PREFIX_MSG="The table prefix must start with a letter, optionally be followed by alphanumeric characters and by an underscore"
INSTL_DATABASE_RESPONSE_ERROR="The installation process failed."
INSTL_DATABASE_TYPE_DESC="Select the database type."
+INSTL_DATABASE_USER_DESC="Enter the database username you created or a username provided by your host."
INSTL_DATABASE_VALIDATION_ERROR="Check your database credentials, database type, database name or hostname. If you have MySQL 8 installed then please read this wiki for more information."
INSTL_CONNECT_DB="Setup Database Connection"
diff --git a/installation/language/en-CA/langmetadata.xml b/installation/language/en-CA/langmetadata.xml
index e104fd54dfab1..700c56b6d14d2 100644
--- a/installation/language/en-CA/langmetadata.xml
+++ b/installation/language/en-CA/langmetadata.xml
@@ -1,8 +1,8 @@
English (Canada)
- 5.2.4
- 2025-01
+ 5.3.1
+ 2025-04
Joomla! Project
(C) 2005 Open Source Matters, Inc.
GNU General Public License version 2 or later; see LICENSE.txt
diff --git a/installation/language/en-GB/langmetadata.xml b/installation/language/en-GB/langmetadata.xml
index de3af39bb5bb8..a01ca60662abd 100644
--- a/installation/language/en-GB/langmetadata.xml
+++ b/installation/language/en-GB/langmetadata.xml
@@ -1,8 +1,8 @@
English (United Kingdom)
- 5.3.0
- 2025-02
+ 5.3.1
+ 2025-04
Joomla! Project
(C) 2005 Open Source Matters, Inc.
GNU General Public License version 2 or later; see LICENSE.txt
diff --git a/installation/language/en-NZ/joomla.ini b/installation/language/en-NZ/joomla.ini
index 8ca3d30d38fd9..74bf611f371d8 100644
--- a/installation/language/en-NZ/joomla.ini
+++ b/installation/language/en-NZ/joomla.ini
@@ -81,11 +81,13 @@ INSTL_DATABASE_NAME_LABEL="Database Name"
INSTL_DATABASE_NAME_MSG_MYSQL="The database name is invalid. It must not contain the following characters: \ /"
INSTL_DATABASE_NAME_MSG_POSTGRES="The database name is invalid. It must start with a letter, followed by alphanumeric characters."
INSTL_DATABASE_NO_SCHEMA="No database schema exists for this database type."
+INSTL_DATABASE_PASSWORD_DESC="Enter the database password you created or a password provided by your host."
INSTL_DATABASE_PREFIX_DESC="Enter a table prefix or use the randomly generated one."
INSTL_DATABASE_PREFIX_DUPLICATE_DESC="If you are using an existing database with tables with the same prefix, Joomla will rename those existing tables by adding the prefix \"bak_\"."
INSTL_DATABASE_PREFIX_MSG="The table prefix must start with a letter, optionally be followed by alphanumeric characters and by an underscore"
INSTL_DATABASE_RESPONSE_ERROR="The installation process failed."
INSTL_DATABASE_TYPE_DESC="Select the database type."
+INSTL_DATABASE_USER_DESC="Enter the database username you created or a username provided by your host."
INSTL_DATABASE_VALIDATION_ERROR="Check your database credentials, database type, database name or hostname. If you have MySQL 8 installed then please read this wiki for more information."
INSTL_CONNECT_DB="Setup Database Connection"
diff --git a/installation/language/en-NZ/langmetadata.xml b/installation/language/en-NZ/langmetadata.xml
index 1fdcbf32ba7e8..2cfc8b6469424 100644
--- a/installation/language/en-NZ/langmetadata.xml
+++ b/installation/language/en-NZ/langmetadata.xml
@@ -1,8 +1,8 @@
English (New Zealand)
- 5.2.4
- 2025-01
+ 5.3.1
+ 2025-04
Joomla! Project
(C) 2005 Open Source Matters, Inc.
GNU General Public License version 2 or later; see LICENSE.txt
diff --git a/installation/language/en-US/joomla.ini b/installation/language/en-US/joomla.ini
index 467c40a2ecd10..8037288d2c3b0 100644
--- a/installation/language/en-US/joomla.ini
+++ b/installation/language/en-US/joomla.ini
@@ -81,11 +81,13 @@ INSTL_DATABASE_NAME_LABEL="Database Name"
INSTL_DATABASE_NAME_MSG_MYSQL="The database name is invalid. It must not contain the following characters: \ /"
INSTL_DATABASE_NAME_MSG_POSTGRES="The database name is invalid. It must start with a letter, followed by alphanumeric characters."
INSTL_DATABASE_NO_SCHEMA="No database schema exists for this database type."
+INSTL_DATABASE_PASSWORD_DESC="Enter the database password you created or a password provided by your host."
INSTL_DATABASE_PREFIX_DESC="Enter a table prefix or use the randomly generated one."
INSTL_DATABASE_PREFIX_DUPLICATE_DESC="If you are using an existing database with tables with the same prefix, Joomla will rename those existing tables by adding the prefix \"bak_\"."
INSTL_DATABASE_PREFIX_MSG="The table prefix must start with a letter, optionally be followed by alphanumeric characters and by an underscore"
INSTL_DATABASE_RESPONSE_ERROR="The installation process failed."
INSTL_DATABASE_TYPE_DESC="Select the database type."
+INSTL_DATABASE_USER_DESC="Enter the database username you created or a username provided by your host."
INSTL_DATABASE_VALIDATION_ERROR="Check your database credentials, database type, database name or hostname. If you have MySQL 8 installed then please read this wiki for more information."
INSTL_CONNECT_DB="Setup Database Connection"
diff --git a/installation/language/en-US/langmetadata.xml b/installation/language/en-US/langmetadata.xml
index 2fb05b7faaae0..f96ab2859b7a9 100644
--- a/installation/language/en-US/langmetadata.xml
+++ b/installation/language/en-US/langmetadata.xml
@@ -1,8 +1,8 @@
English (United States)
- 5.2.4
- 2025-01
+ 5.3.1
+ 2025-04
Joomla! Project
(C) 2005 Open Source Matters, Inc.
GNU General Public License version 2 or later; see LICENSE.txt
diff --git a/installation/language/es-ES/langmetadata.xml b/installation/language/es-ES/langmetadata.xml
index 1f31853ec3c0f..7b37d69ab88aa 100644
--- a/installation/language/es-ES/langmetadata.xml
+++ b/installation/language/es-ES/langmetadata.xml
@@ -1,8 +1,8 @@
Spanish (es-ES)
- 5.2.4
- 2025-01
+ 5.3.1
+ 2025-04
Spanish [es-ES] Translation Team
(C) 2005 Open Source Matters, Inc.
GNU General Public License version 2 or later; see LICENSE.txt
diff --git a/installation/language/et-EE/langmetadata.xml b/installation/language/et-EE/langmetadata.xml
index 658781aefdfa3..6350deed942bf 100644
--- a/installation/language/et-EE/langmetadata.xml
+++ b/installation/language/et-EE/langmetadata.xml
@@ -1,8 +1,8 @@
Estonian
- 5.2.4
- 2025-01
+ 5.3.1
+ 2025-04
Joomla! Project
(C) 2005 Open Source Matters, Inc.
GNU General Public License version 2 or later; see LICENSE.txt
diff --git a/installation/language/eu-ES/langmetadata.xml b/installation/language/eu-ES/langmetadata.xml
index f5da4765ef6b6..c14e8cdfe2f09 100644
--- a/installation/language/eu-ES/langmetadata.xml
+++ b/installation/language/eu-ES/langmetadata.xml
@@ -1,8 +1,8 @@
Basque
- 5.2.4
- 2025-01
+ 5.3.1
+ 2025-04
Joomla! Basque Translation Team
(C) 2005 Open Source Matters, Inc.
GNU General Public License version 2 or later; see LICENSE.txt
diff --git a/installation/language/fa-AF/langmetadata.xml b/installation/language/fa-AF/langmetadata.xml
index c955e625037bc..f610201449286 100644
--- a/installation/language/fa-AF/langmetadata.xml
+++ b/installation/language/fa-AF/langmetadata.xml
@@ -1,8 +1,8 @@
فارسی (دری)
- 5.2.4
- 2025-01
+ 5.3.1
+ 2025-04
JoomlaPersian Translation Team
(C) 2005 Open Source Matters, Inc.
GNU General Public License version 2 or later; see LICENSE.txt
diff --git a/installation/language/fa-IR/langmetadata.xml b/installation/language/fa-IR/langmetadata.xml
index f9aa2669c5a3d..43b3babf0c563 100644
--- a/installation/language/fa-IR/langmetadata.xml
+++ b/installation/language/fa-IR/langmetadata.xml
@@ -1,8 +1,8 @@
Persian (fa-IR)
- 5.2.4
- 2025-01
+ 5.3.1
+ 2025-04
Persian Translation Team: joomlafarsi.com
(C) 2005 Open Source Matters, Inc.
GNU General Public License version 2 or later; see LICENSE.txt
diff --git a/installation/language/fi-FI/langmetadata.xml b/installation/language/fi-FI/langmetadata.xml
index 9b9a9e1c377e2..1c4528bb79204 100644
--- a/installation/language/fi-FI/langmetadata.xml
+++ b/installation/language/fi-FI/langmetadata.xml
@@ -1,8 +1,8 @@
Finnish (Finland)
- 5.2.4
- 2025-01
+ 5.3.1
+ 2025-04
Finnish translation team: Joomla.fi
(C) 2005 Open Source Matters, Inc.
GNU General Public License version 2 or later; see LICENSE.txt
diff --git a/installation/language/fr-CA/joomla.ini b/installation/language/fr-CA/joomla.ini
index 33158b82efee9..0533a43fd4611 100644
--- a/installation/language/fr-CA/joomla.ini
+++ b/installation/language/fr-CA/joomla.ini
@@ -81,7 +81,7 @@ INSTL_DATABASE_NAME_LABEL="Nom de la base"
INSTL_DATABASE_NAME_MSG_MYSQL="Le nom de la base de données n'est pas valide. Il ne doit pas contenir les caractères suivants : \ / "
INSTL_DATABASE_NAME_MSG_POSTGRES="Le nom de la base de données n'est pas valide. Il doit commencer par une lettre, suivie de caractères alphanumériques."
INSTL_DATABASE_NO_SCHEMA="Aucun schéma de base de données n'existe pour ce type de base de données."
-INSTL_DATABASE_PASSWORD_DESC="Saisissez le mot de passe d'accès à la base de données"
+INSTL_DATABASE_PASSWORD_DESC="Saisissez le mot de passe d'accès à la base de données."
INSTL_DATABASE_PREFIX_DESC="Saisissez un préfixe de table ou utilisez celui généré aléatoirement"
INSTL_DATABASE_PREFIX_DUPLICATE_DESC="Si vous utilisez une base de données existante avec des tables ayant le même préfixe, Joomla renommera les tables existantes en leur ajoutant le préfixe \"bak_\"."
INSTL_DATABASE_PREFIX_MSG="Le préfixe de la table doit commencer par une lettre, éventuellement suivie de caractères alphanumériques et d'un trait de soulignement"
diff --git a/installation/language/fr-CA/langmetadata.xml b/installation/language/fr-CA/langmetadata.xml
index 1d290743932e3..c45826f4a7391 100644
--- a/installation/language/fr-CA/langmetadata.xml
+++ b/installation/language/fr-CA/langmetadata.xml
@@ -1,8 +1,8 @@
French (Canada)
- 5.2.4
- 2025-01
+ 5.3.1
+ 2025-04
Joomla! Project - French translation team
(C) 2005 Open Source Matters, Inc.
GNU General Public License version 2 or later; see LICENSE.txt
diff --git a/installation/language/fr-FR/langmetadata.xml b/installation/language/fr-FR/langmetadata.xml
index cbf2462ceadce..08e51188e5d60 100644
--- a/installation/language/fr-FR/langmetadata.xml
+++ b/installation/language/fr-FR/langmetadata.xml
@@ -1,8 +1,8 @@
French (fr-FR)
- 5.2.4
- 2025-01
+ 5.3.1
+ 2025-04
Joomla! Project - French translation team
(C) 2005 Open Source Matters, Inc.
GNU General Public License version 2 or later; see LICENSE.txt
diff --git a/installation/language/he-IL/langmetadata.xml b/installation/language/he-IL/langmetadata.xml
index a4f1f9a5405eb..1c4da43e5eebe 100644
--- a/installation/language/he-IL/langmetadata.xml
+++ b/installation/language/he-IL/langmetadata.xml
@@ -1,8 +1,8 @@
Hebrew (Israel)
- 5.2.4
- 2025-01
+ 5.3.1
+ 2025-04
פרוייקט ג'ומלה
(C) 2005 Open Source Matters, Inc.
GNU General Public License version 2 or later; see LICENSE.txt
diff --git a/installation/language/hr-HR/langmetadata.xml b/installation/language/hr-HR/langmetadata.xml
index eefcba0465faf..207f076bd5786 100644
--- a/installation/language/hr-HR/langmetadata.xml
+++ b/installation/language/hr-HR/langmetadata.xml
@@ -1,8 +1,8 @@
Hrvatski (Hrvatska)
- 5.2.4
- 2025-01
+ 5.3.1
+ 2025-04
Joomla! Hrvatska team
(C) 2005 Open Source Matters, Inc.
GNU General Public License version 2 or later; see LICENSE.txt
diff --git a/installation/language/hu-HU/langmetadata.xml b/installation/language/hu-HU/langmetadata.xml
index 0494262eb0384..995271ea89617 100644
--- a/installation/language/hu-HU/langmetadata.xml
+++ b/installation/language/hu-HU/langmetadata.xml
@@ -1,8 +1,8 @@
Hungarian (Magyar)
- 5.2.4
- 2025-01
+ 5.3.1
+ 2025-04
Joomla! Magyarország
(C) 2005 Open Source Matters, Inc.
GNU General Public License version 2 or later; see LICENSE.txt
diff --git a/installation/language/id-ID/langmetadata.xml b/installation/language/id-ID/langmetadata.xml
index f3c904ac68c97..1db9631c0844f 100644
--- a/installation/language/id-ID/langmetadata.xml
+++ b/installation/language/id-ID/langmetadata.xml
@@ -1,8 +1,8 @@
Bahasa Indonesia (id-ID)
- 5.2.4
- 2025-01
+ 5.3.1
+ 2025-04
Joomla! Indonesia
(C) 2005 Open Source Matters, Inc.
GNU General Public License version 2 or later; see LICENSE.txt
diff --git a/installation/language/it-IT/langmetadata.xml b/installation/language/it-IT/langmetadata.xml
index 202c13a7d5b6f..c947012f518e5 100644
--- a/installation/language/it-IT/langmetadata.xml
+++ b/installation/language/it-IT/langmetadata.xml
@@ -1,8 +1,8 @@
Italiano (it-IT)
- 5.2.4
- 2025-01
+ 5.3.1
+ 2025-04
Joomla! Project (Italian Translation Team)
(C) 2005 Open Source Matters, Inc.
GNU General Public License version 2 or later; see LICENSE.txt
diff --git a/installation/language/ja-JP/langmetadata.xml b/installation/language/ja-JP/langmetadata.xml
index 7aab7436e7bdb..af662f5e09a15 100644
--- a/installation/language/ja-JP/langmetadata.xml
+++ b/installation/language/ja-JP/langmetadata.xml
@@ -1,8 +1,8 @@
Japanese (Japan)
- 5.2.4
- 2025-01
+ 5.3.1
+ 2025-04
Joomla!じゃぱん
(C) 2005 Open Source Matters, Inc.
GNU General Public License version 2 or later; see LICENSE.txt
diff --git a/installation/language/ka-GE/langmetadata.xml b/installation/language/ka-GE/langmetadata.xml
index a119bebe45acc..63b43249db827 100644
--- a/installation/language/ka-GE/langmetadata.xml
+++ b/installation/language/ka-GE/langmetadata.xml
@@ -1,8 +1,8 @@
Georgian (Georgia)
- 5.2.4
- 2025-01
+ 5.3.1
+ 2025-04
Georgian Translation Team
(C) 2005 Open Source Matters, Inc.
GNU General Public License version 2 or later; see LICENSE.txt
diff --git a/installation/language/kk-KZ/langmetadata.xml b/installation/language/kk-KZ/langmetadata.xml
index 904d5553513d6..a6657a1b567c6 100644
--- a/installation/language/kk-KZ/langmetadata.xml
+++ b/installation/language/kk-KZ/langmetadata.xml
@@ -1,8 +1,8 @@
Kazakh (Kazakhstan)
- 5.2.4
- 2025-01
+ 5.3.1
+ 2025-04
Sarvarov Akylkerey
(C) 2005 Open Source Matters, Inc.
GNU General Public License version 2 or later; see LICENSE.txt
diff --git a/installation/language/ko-KR/langmetadata.xml b/installation/language/ko-KR/langmetadata.xml
index f7072d555eb18..e8cb92464cc4d 100644
--- a/installation/language/ko-KR/langmetadata.xml
+++ b/installation/language/ko-KR/langmetadata.xml
@@ -1,8 +1,8 @@
Korean (Republic of Korea)
- 5.2.4
- 2025-01
+ 5.3.1
+ 2025-04
Joomla! 프로젝트
(C) 2005 Open Source Matters, Inc.
GNU General Public License version 2 or later; see LICENSE.txt
diff --git a/installation/language/lt-LT/langmetadata.xml b/installation/language/lt-LT/langmetadata.xml
index 1314923c510ab..c95277f7936d2 100644
--- a/installation/language/lt-LT/langmetadata.xml
+++ b/installation/language/lt-LT/langmetadata.xml
@@ -1,8 +1,8 @@
Lietuvių (lt-LT)
- 5.2.4
- 2025-01
+ 5.3.1
+ 2025-04
Oskaras Jankauskas
(C) 2005 Open Source Matters, Inc.
GNU General Public License version 2 or later; see LICENSE.txt
diff --git a/installation/language/lv-LV/langmetadata.xml b/installation/language/lv-LV/langmetadata.xml
index 6cdb2665eda9f..97a4e3a7da822 100644
--- a/installation/language/lv-LV/langmetadata.xml
+++ b/installation/language/lv-LV/langmetadata.xml
@@ -1,8 +1,8 @@
Latvian (Latvia)
- 5.2.4
- 2025-01
+ 5.3.1
+ 2025-04
Joomla! Projekts
(C) 2005 Open Source Matters, Inc.
GNU General Public License version 2 or later; see LICENSE.txt
diff --git a/installation/language/mk-MK/langmetadata.xml b/installation/language/mk-MK/langmetadata.xml
index a8bb569fb327a..9abff766be8c6 100644
--- a/installation/language/mk-MK/langmetadata.xml
+++ b/installation/language/mk-MK/langmetadata.xml
@@ -1,8 +1,8 @@
Macedonian (mk-MK)
- 5.2.4
- 2025-01
+ 5.3.1
+ 2025-04
Joomla! Project
(C) 2005 Open Source Matters, Inc.
GNU General Public License version 2 or later; see LICENSE.txt
diff --git a/installation/language/nl-BE/joomla.ini b/installation/language/nl-BE/joomla.ini
index 408b93c2cc45d..21be651f038ff 100644
--- a/installation/language/nl-BE/joomla.ini
+++ b/installation/language/nl-BE/joomla.ini
@@ -6,22 +6,22 @@
; Fatal error page
; These will be processed by the JavaScript Build
BUILD_FATAL_HEADER="Sorry, er deed zich een probleem voor dat we niet konden herstellen."
-BUILD_FATAL_LANGUAGE="Engels GB" ; IMPORTANT NOTE FOR TRANSLATORS: Do not literally translate this line, instead add the localised name of the language. For example French will be Français FR
+BUILD_FATAL_LANGUAGE="Vlaams BE" ; IMPORTANT NOTE FOR TRANSLATORS: Do not literally translate this line, instead add the localised name of the language. For example French will be Français FR
BUILD_FATAL_TEXT="De server heeft een \"{{statusCode_statusText}} \" teruggestuurd"
BUILD_FATAL_URL_TEXT="Help dit probleem op te lossen"
; These will be processed by the JavaScript Build
BUILD_INCOMPLETE_HEADER="Omgeving instellen onvolledig"
-BUILD_INCOMPLETE_LANGUAGE="Engels GB" ; IMPORTANT NOTE FOR TRANSLATORS: Do not literally translate this line, instead add the localised name of the language. For example French will be Français FR
+BUILD_INCOMPLETE_LANGUAGE="Vlaams BE" ; IMPORTANT NOTE FOR TRANSLATORS: Do not literally translate this line, instead add the localised name of the language. For example French will be Français FR
BUILD_INCOMPLETE_TEXT="Het lijkt erop dat u probeert Joomla! uit te voeren vanuit onze git repository. Hiervoor is vereist dat u eerst een aantal extra stappen heeft voltooid."
BUILD_INCOMPLETE_URL_TEXT="Meer details"
; These will be processed by the JavaScript Build
BUILD_NOXML_HEADER="Sorry, uw PHP mist een noodzakelijke library"
-BUILD_NOXML_LANGUAGE="Engels GB" ; IMPORTANT NOTE FOR TRANSLATORS: Do not literally translate this line, instead add the localised name of the language. For example French will be Français FR
+BUILD_NOXML_LANGUAGE="Vlaams BE" ; IMPORTANT NOTE FOR TRANSLATORS: Do not literally translate this line, instead add the localised name of the language. For example French will be Français FR
BUILD_NOXML_TEXT="Om deze versie van Joomla! uit te kunnen voeren moet uw host PHP gebruiken met ondersteuning voor de XML-library"
BUILD_NOXML_URL_TEXT="Help dit probleem op te lossen"
; These will be processed by the JavaScript Build
BUILD_MIN_PHP_ERROR_HEADER="Sorry, uw PHP-versie wordt niet ondersteund."
-BUILD_MIN_PHP_ERROR_LANGUAGE="Engels GB" ; IMPORTANT NOTE FOR TRANSLATORS: Do not literally translate this line, instead add the localised name of the language. For example French will be Français FR
+BUILD_MIN_PHP_ERROR_LANGUAGE="Vlaams BE" ; IMPORTANT NOTE FOR TRANSLATORS: Do not literally translate this line, instead add the localised name of the language. For example French will be Français FR
BUILD_MIN_PHP_ERROR_TEXT="Uw host moet PHP versie {{phpversion}} of nieuwer gebruiken om deze versie van Joomla uit te voeren."
BUILD_MIN_PHP_ERROR_URL_TEXT="Help dit probleem op te lossen"
; Main Config
@@ -81,13 +81,13 @@ INSTL_DATABASE_NAME_LABEL="Database naam"
INSTL_DATABASE_NAME_MSG_MYSQL="De naam van de database is ongeldig. Het mag de volgende tekens NIET bevatten: \ /"
INSTL_DATABASE_NAME_MSG_POSTGRES="De naam van de database is ongeldig. Deze moet beginnen met een letter, gevolgd door alfanumerieke tekens."
INSTL_DATABASE_NO_SCHEMA="Er bestaat geen database schema voor dit database type."
-INSTL_DATABASE_PASSWORD_DESC="Voer het database wachtwoord in dat is aangemaakt of een wachtwoord dat door de host is verstrekt."
+INSTL_DATABASE_PASSWORD_DESC="Een wachtwoord dat uzelf heeft aangemaakt, of een wachtwoord dat door de webhost is verstrekt."
INSTL_DATABASE_PREFIX_DESC="Een tabel voorvoegsel invoeren of de willekeurig gegenereerde gebruiken."
INSTL_DATABASE_PREFIX_DUPLICATE_DESC="Als een bestaande database gebruikt wordt met tabellen met dezelfde voorvoegsel, zal Joomla deze bestaande tabellen hernoemen door het voorvoegsel \"bak_\" toe te voegen."
INSTL_DATABASE_PREFIX_MSG="Het voorvoegsel van de tabel moet beginnen met een letter, eventueel gevolgd door alfanumerieke tekens en een onderstrepingsteken"
INSTL_DATABASE_RESPONSE_ERROR="Het installatieproces is mislukt."
INSTL_DATABASE_TYPE_DESC="Selecteer het databasetype."
-INSTL_DATABASE_USER_DESC="Voer de gebruikersnaam in die is aangemaakt of een gebruikersnaam die door de host is verstrekt."
+INSTL_DATABASE_USER_DESC="Vul de database gebruikersnaam in die u heeft aangemaakt of een gebruikersnaam die door uw host is verstrekt."
INSTL_DATABASE_VALIDATION_ERROR="Controleer uw database inloggegevens, database type, database naam of hostname. Als u MySQL 8 geïnstalleerd heeft, lees dan deze wiki voor meer informatie."
INSTL_CONNECT_DB="Databaseverbinding instellen"
@@ -111,8 +111,8 @@ INSTL_COMPLETE_ERROR_FOLDER_DELETE="De \"%s\" map kan niet worden verwijderd. Ve
INSTL_COMPLETE_REMOVE_FOLDER="Verwijder \"%s\" map"
INSTL_COMPLETE_CONGRAT="Gefeliciteerd!"
INSTL_COMPLETE_TITLE="Gefeliciteerd! Uw Joomla site staat klaar."
-INSTL_COMPLETE_SITE_BTN="Website openen"
-INSTL_COMPLETE_ADMIN_BTN="Beheer openen"
+INSTL_COMPLETE_SITE_BTN="Voltooien & website openen"
+INSTL_COMPLETE_ADMIN_BTN="Voltooien & beheer openen"
INSTL_COMPLETE_FINAL="Installatie is voltooid"
INSTL_COMPLETE_FINAL_DESC="Uw Joomla installatie is nu voltooid en klaar voor gebruik."
INSTL_COMPLETE_ADD_EXTRA_LANGUAGE="Extra talen installeren"
@@ -123,8 +123,8 @@ INSTL_LANGUAGES_COLUMN_HEADER_LANGUAGE="Taal"
INSTL_LANGUAGES_COLUMN_HEADER_LANGUAGE_SELECT="Selecteer taal"
INSTL_LANGUAGES_COLUMN_HEADER_LANGUAGE_TAG="Taal tag"
INSTL_LANGUAGES_COLUMN_HEADER_VERSION="Versie"
-INSTL_LANGUAGES_DESC="De Joomla-interface is beschikbaar in verschillende talen. Kies de gewenste talen door de selectievakjes aan te vinken en deze vervolgens te installeren door op de knop \"Installeer geselecteerde talen\" te klikken. Opmerking: Deze bewerking duurt voor elke taal ongeveer 10 seconden om te downloaden en te installeren. Selecteer, om time-outs te voorkomen, niet meer dan 3 talen om te installeren."
-INSTL_LANGUAGES_MESSAGE_PLEASE_WAIT="Deze bewerking duurt maximaal 10 seconden per taal om te voltooien Een ogenblik geduld, terwijl we de talen downloaden en installeren …"
+INSTL_LANGUAGES_DESC="De Joomla-interface is beschikbaar in verschillende talen. Kies de gewenste talen door de selectievakjes aan te vinken en deze vervolgens te installeren door op de knop 'Volgende' te klikken. Opmerking: Deze bewerking duurt voor elke taal ongeveer 10 seconden om te downloaden en te installeren. Om time-outs te voorkomen, selecteert u niet meer dan 3 talen om te installeren."
+INSTL_LANGUAGES_MESSAGE_PLEASE_WAIT="Deze bewerking duurt maximaal 10 seconden per taal om te voltooien Een ogenblik geduld, terwijl we de talen downloaden en installeren ..."
INSTL_LANGUAGES_NO_LANGUAGE_SELECTED="Er zijn geen talen geselecteerd om te installeren."
INSTL_LANGUAGES_SELECTED="Installeer geselecteerde talen"
INSTL_LANGUAGES_WARNING_NO_INTERNET="Joomla! kon niet verbinden met de taalserver. Voltooi het installatieproces."
@@ -147,7 +147,7 @@ INSTL_DEFAULTLANGUAGE_FRONTEND_SET_DEFAULT="Joomla heeft %s ingesteld als uw sta
INSTL_DEFAULTLANGUAGE_SET_DEFAULT_LANGUAGE="Standaardtaal instellen"
INSTL_DEFAULTLANGUAGE_TRY_LATER="U kunt het later installeren met behulp van Joomla beheer."
-INSTL_DEFAULTLANGUAGE_NATIVE_LANGUAGE_NAME="Vlaams (BE)" ; IMPORTANT NOTE FOR TRANSLATORS: Do not literally translate this line, instead add the localised name of the language. For example Spanish will be Español
+INSTL_DEFAULTLANGUAGE_NATIVE_LANGUAGE_NAME="Flemish (BE)" ; IMPORTANT NOTE FOR TRANSLATORS: Do not literally translate this line, instead add the localised name of the language. For example Spanish will be Español
; Database Model
INSTL_DATABASE_COULD_NOT_CONNECT="Kan geen verbinding maken met de database. Foutmelding: %s"
INSTL_DATABASE_COULD_NOT_CREATE_DATABASE="De installatie kan niet met de gespecificeerde database verbinden en kan geen database aanmaken. Controleer uw instellingen en maak, indien nodig, handmatig de database aan."
@@ -211,9 +211,9 @@ JGLOBAL_SELECT_NO_RESULTS_MATCH="Geen overeenkomende resultaten"
JGLOBAL_SELECT_SOME_OPTIONS="Selecteer enkele opties"
JHIDEPASSWORD="Verberg wachtwoord"
JINVALID_TOKEN="Het laatste verzoek is geweigerd omdat het een ongeldig beveiligingstoken bevat. Vernieuw de pagina en probeer het opnieuw."
-JINVALID_TOKEN_NOTICE="Het beveiligingstoken komt niet overeen. Het verzoek is geannuleerd om een inbreuk op de beveiliging te voorkomen. Probeer het opnieuw."
+JINVALID_TOKEN_NOTICE="Het beveiligingstoken komt niet overeen. Het verzoek werd afgebroken om een inbreuk op de beveiliging te voorkomen. Probeer nogmaals."
JNEXT="Volgende"
-JNO="Nee"
+JNO="Neen"
JNOTICE="Opmerking"
JOFF="Uit"
JON="Aan"
@@ -233,7 +233,7 @@ JLIB_FILESYSTEM_ERROR_PATH_IS_NOT_A_FOLDER="%1$s: Pad is geen map. Pad: %2$s"
JLIB_FORM_FIELD_INVALID="Ongeldig veld: "
JLIB_FORM_VALIDATE_FIELD_INVALID="Ongeldig veld: %s"
JLIB_FORM_VALIDATE_FIELD_REQUIRED="Vereist veld: %s"
-JLIB_INSTALLER_ABORT="Installeren taal afgebroken: %s"
+JLIB_INSTALLER_ABORT="De taalinstallatie wordt gestopt: %s"
JLIB_INSTALLER_ABORT_CREATE_DIRECTORY="Extensie %1$s: Aanmaken map mislukt: %2$s"
JLIB_INSTALLER_ABORT_NOINSTALLPATH="Installatiepad bestaat niet."
JLIB_INSTALLER_ABORT_PACK_INSTALL_ERROR_EXTENSION="Pakket %1$s: Er is een fout opgetreden bij het installeren van een extensie: %2$s."
@@ -269,7 +269,7 @@ MESSAGE="Bericht"
NOTICE="Opmerking"
WARNING="Waarschuwing"
; Javascript ajax error messages
-JLIB_JS_AJAX_ERROR_CONNECTION_ABORT="Er is een verbindingsfout opgetreden bij het ophalen van de JSON-gegevens."
+JLIB_JS_AJAX_ERROR_CONNECTION_ABORT="De verbinding werd afgebroken tijdens het ophalen van de JSON data."
JLIB_JS_AJAX_ERROR_NO_CONTENT="Er werd geen inhoud teruggegeven."
JLIB_JS_AJAX_ERROR_OTHER="Er deed zich een fout voor tijdens het ophalen van de JSON data: HTTP %d status code."
JLIB_JS_AJAX_ERROR_PARSE="Er deed zich een ontledingsfout voor bij het verwerken van de volgende JSON data:%s"
diff --git a/installation/language/nl-BE/langmetadata.xml b/installation/language/nl-BE/langmetadata.xml
index 63b3d5e083f61..ff9658238f02d 100644
--- a/installation/language/nl-BE/langmetadata.xml
+++ b/installation/language/nl-BE/langmetadata.xml
@@ -1,17 +1,17 @@
- Dutch (Belgium)
- 5.2.4
- 2025-01
- Dutch (BE) translation team
+ Vlaams (België)
+ 5.3.1
+ 2025-04
+ Vlaams (BE) translation team
(C) 2005 Open Source Matters, Inc.
GNU General Public License version 2 or later; see LICENSE.txt
joomla.ini
- Dutch (nl-BE)
- Dutch (Belgium)
+ Vlaams (nl-BE)
+ Vlaams (België)
nl-BE
0
diff --git a/installation/language/nl-NL/langmetadata.xml b/installation/language/nl-NL/langmetadata.xml
index 41fff0b928fdf..4dd3a706e63c7 100644
--- a/installation/language/nl-NL/langmetadata.xml
+++ b/installation/language/nl-NL/langmetadata.xml
@@ -1,8 +1,8 @@
- Dutch (nl-NL)
- 5.2.4
- 2025-01
+ Dutch (Netherlands)
+ 5.3.1
+ 2025-04
Dutch Translation Team
(C) 2005 Open Source Matters, Inc.
GNU General Public License version 2 or later; see LICENSE.txt
diff --git a/installation/language/pl-PL/langmetadata.xml b/installation/language/pl-PL/langmetadata.xml
index 6744c98f6937f..64242edc42cdc 100644
--- a/installation/language/pl-PL/langmetadata.xml
+++ b/installation/language/pl-PL/langmetadata.xml
@@ -1,8 +1,8 @@
Polski (PL)
- 5.2.4
- 2025-01
+ 5.3.1
+ 2025-04
Projekt Joomla!
(C) 2005 Open Source Matters, Inc.
GNU General Public License version 2 or later; see LICENSE.txt
diff --git a/installation/language/pt-BR/langmetadata.xml b/installation/language/pt-BR/langmetadata.xml
index 3836368fe26a8..cba2be3b6c239 100644
--- a/installation/language/pt-BR/langmetadata.xml
+++ b/installation/language/pt-BR/langmetadata.xml
@@ -1,8 +1,8 @@
- Portuguese (Brazil)
- 5.2.4
- 2025-01
+ Português do Brasil (pt-BR)
+ 5.3.1
+ 2025-04
Projeto Joomla!
(C) 2005 Open Source Matters, Inc.
GNU General Public License version 2 or later; see LICENSE.txt
@@ -10,7 +10,7 @@
joomla.ini
- Brazilian Portuguese (pt-BR)
+ Português do Brasil (pt-BR)
Portuguese (Brazil)
pt-BR
0
diff --git a/installation/language/pt-PT/langmetadata.xml b/installation/language/pt-PT/langmetadata.xml
index 72b1769ad66d0..bffe7c15337bb 100644
--- a/installation/language/pt-PT/langmetadata.xml
+++ b/installation/language/pt-PT/langmetadata.xml
@@ -1,8 +1,8 @@
Português (Portugal)
- 5.2.4
- 2025-01
+ 5.3.1
+ 2025-04
Comunidade JoomlaPortugal
(C) 2005 Open Source Matters, Inc.
GNU General Public License version 2 or later; see LICENSE.txt
diff --git a/installation/language/ro-RO/langmetadata.xml b/installation/language/ro-RO/langmetadata.xml
index 413ee32496d9b..db794d8818ec2 100644
--- a/installation/language/ro-RO/langmetadata.xml
+++ b/installation/language/ro-RO/langmetadata.xml
@@ -1,8 +1,8 @@
Română (România)
- 5.2.4
- 2025-01
+ 5.3.1
+ 2025-04
Horia Negura - Quanta
(C) 2005 Open Source Matters, Inc.
GNU General Public License version 2 or later; see LICENSE.txt
diff --git a/installation/language/sk-SK/langmetadata.xml b/installation/language/sk-SK/langmetadata.xml
index f96813342b69b..5a65b19dd28d7 100644
--- a/installation/language/sk-SK/langmetadata.xml
+++ b/installation/language/sk-SK/langmetadata.xml
@@ -1,8 +1,8 @@
Slovak (Slovakia)
- 5.2.4
- 2025-01
+ 5.3.1
+ 2025-04
Slovak translation team : Peter Michnica
(C) 2005 Open Source Matters, Inc.
GNU General Public License version 2 or later; see LICENSE.txt
diff --git a/installation/language/sl-SI/langmetadata.xml b/installation/language/sl-SI/langmetadata.xml
index ecd85b4595055..8a5e502741db1 100644
--- a/installation/language/sl-SI/langmetadata.xml
+++ b/installation/language/sl-SI/langmetadata.xml
@@ -1,8 +1,8 @@
Slovenščina (Slovenija)
- 5.2.4
- 2025-01
+ 5.3.1
+ 2025-04
Slovenska prevajalska ekipa
(C) 2005 Open Source Matters, Inc.
GNU General Public License version 2 or later; see LICENSE.txt
diff --git a/installation/language/sr-YU/langmetadata.xml b/installation/language/sr-YU/langmetadata.xml
index 9f4489bfe8fc0..65a87e58516d5 100644
--- a/installation/language/sr-YU/langmetadata.xml
+++ b/installation/language/sr-YU/langmetadata.xml
@@ -1,8 +1,8 @@
Srpski (Republika Srbija)
- 5.2.4
- 2025-01
+ 5.3.1
+ 2025-04
Goran Nešić - UIX Web Design & Saša Matić Bardak.RS
(C) 2005 Open Source Matters, Inc.
GNU General Public License version 2 or later; see LICENSE.txt
diff --git a/installation/language/sv-SE/langmetadata.xml b/installation/language/sv-SE/langmetadata.xml
index 297a4122cad81..2effb8f35901d 100644
--- a/installation/language/sv-SE/langmetadata.xml
+++ b/installation/language/sv-SE/langmetadata.xml
@@ -1,8 +1,8 @@
Swedish (Sweden)
- 5.2.4
- 2025-01
+ 5.3.1
+ 2025-04
Swedish Translation Team - SvenskJoomla
(C) 2005 Open Source Matters, Inc.
GNU General Public License version 2 or later; see LICENSE.txt
diff --git a/installation/language/ta-IN/langmetadata.xml b/installation/language/ta-IN/langmetadata.xml
index 64974c95bef05..9f4cef44118bd 100644
--- a/installation/language/ta-IN/langmetadata.xml
+++ b/installation/language/ta-IN/langmetadata.xml
@@ -1,8 +1,8 @@
Tamil (India)
- 5.2.4
- 2025-01
+ 5.3.1
+ 2025-04
Ilagnayeru 'MIG' Manickam, Elango Samy Manim
(C) 2005 Open Source Matters, Inc.
GNU General Public License version 2 or later; see LICENSE.txt
diff --git a/installation/language/th-TH/langmetadata.xml b/installation/language/th-TH/langmetadata.xml
index 1f58afb8de579..4932daa8df047 100644
--- a/installation/language/th-TH/langmetadata.xml
+++ b/installation/language/th-TH/langmetadata.xml
@@ -1,8 +1,8 @@
Thai (ภาษาไทย)
- 5.2.4
- 2025-01
+ 5.3.1
+ 2025-04
Thai Translation Team
(C) 2005 Open Source Matters, Inc.
GNU General Public License version 2 or later; see LICENSE.txt
diff --git a/installation/language/tr-TR/langmetadata.xml b/installation/language/tr-TR/langmetadata.xml
index 80dd66ec87c96..7ef10fddda155 100644
--- a/installation/language/tr-TR/langmetadata.xml
+++ b/installation/language/tr-TR/langmetadata.xml
@@ -1,8 +1,8 @@
Turkish (Turkey)
- 5.2.4
- 2025-01
+ 5.3.1
+ 2025-04
Joomla! Türkiye
(C) 2005 Open Source Matters, Inc.
GNU General Public License version 2 or later; see LICENSE.txt
diff --git a/installation/language/uk-UA/langmetadata.xml b/installation/language/uk-UA/langmetadata.xml
index fb95ffd4f3eb8..ae3bb6c1f24ec 100644
--- a/installation/language/uk-UA/langmetadata.xml
+++ b/installation/language/uk-UA/langmetadata.xml
@@ -1,8 +1,8 @@
Ukrainian (uk-UA)
- 5.2.4
- 2025-01
+ 5.3.1
+ 2025-04
Denys Nosov
(C) 2005 Open Source Matters, Inc.
GNU General Public License version 2 or later; see LICENSE.txt
diff --git a/installation/language/ur-PK/langmetadata.xml b/installation/language/ur-PK/langmetadata.xml
index 749e40926d2da..69ddec77372d8 100644
--- a/installation/language/ur-PK/langmetadata.xml
+++ b/installation/language/ur-PK/langmetadata.xml
@@ -1,8 +1,8 @@
Urdu (ur-PK)
- 5.2.4
- 2025-01
+ 5.3.1
+ 2025-04
Urdu Translation Team
(C) 2005 Open Source Matters, Inc.
GNU General Public License version 2 or later; see LICENSE.txt
diff --git a/installation/language/vi-VN/langmetadata.xml b/installation/language/vi-VN/langmetadata.xml
index eccfbd5299e88..817dab73f58bd 100644
--- a/installation/language/vi-VN/langmetadata.xml
+++ b/installation/language/vi-VN/langmetadata.xml
@@ -1,8 +1,8 @@
Vietnamese (Vietnam)
- 5.2.4
- 2025-01
+ 5.3.1
+ 2025-04
Joomla! Project
(C) 2005 Open Source Matters, Inc.
GNU General Public License version 2 or later; see LICENSE.txt
diff --git a/installation/language/zh-CN/langmetadata.xml b/installation/language/zh-CN/langmetadata.xml
index ce725e6d441e6..3c757b4d8451a 100644
--- a/installation/language/zh-CN/langmetadata.xml
+++ b/installation/language/zh-CN/langmetadata.xml
@@ -1,8 +1,8 @@
Chinese Simplified (China)
- 5.2.4
- 2025-01
+ 5.3.1
+ 2025-04
Joomla中文网
(C) 2005 Open Source Matters, Inc.
GNU General Public License version 2 or later; see LICENSE.txt
diff --git a/installation/language/zh-TW/langmetadata.xml b/installation/language/zh-TW/langmetadata.xml
index 39cae5e1b4e28..089a70ee6384b 100644
--- a/installation/language/zh-TW/langmetadata.xml
+++ b/installation/language/zh-TW/langmetadata.xml
@@ -1,8 +1,8 @@
正體中文
- 5.2.4
- 2025-01
+ 5.3.1
+ 2025-04
正體中文 Translation Team
(C) 2005 Open Source Matters, Inc.
GNU General Public License version 2 or later; see LICENSE.txt
diff --git a/installation/sql/mysql/base.sql b/installation/sql/mysql/base.sql
index 534493dbc12f2..db5dc5cff4aaa 100644
--- a/installation/sql/mysql/base.sql
+++ b/installation/sql/mysql/base.sql
@@ -288,7 +288,8 @@ INSERT INTO `#__extensions` (`package_id`, `name`, `type`, `element`, `folder`,
(0, 'plg_editors_tinymce', 'plugin', 'tinymce', 'editors', 0, 1, 1, 0, 1, '', '{"configuration":{"toolbars":{"2":{"toolbar1":["bold","underline","strikethrough","|","undo","redo","|","bullist","numlist","|","pastetext"]},"1":{"menu":["edit","insert","view","format","table","tools"],"toolbar1":["bold","italic","underline","strikethrough","|","alignleft","aligncenter","alignright","alignjustify","|","blocks","|","bullist","numlist","|","outdent","indent","|","undo","redo","|","link","unlink","anchor","code","|","hr","table","|","subscript","superscript","|","charmap","pastetext","preview"]},"0":{"menu":["edit","insert","view","format","table","tools"],"toolbar1":["bold","italic","underline","strikethrough","|","alignleft","aligncenter","alignright","alignjustify","|","styles","|","blocks","fontfamily","fontsize","|","searchreplace","|","bullist","numlist","|","outdent","indent","|","undo","redo","|","link","unlink","anchor","image","|","code","|","forecolor","backcolor","|","fullscreen","|","table","|","subscript","superscript","|","charmap","emoticons","media","hr","ltr","rtl","|","cut","copy","paste","pastetext","|","visualchars","visualblocks","nonbreaking","blockquote","jtemplate","|","print","preview","codesample","insertdatetime","removeformat"]}},"setoptions":{"2":{"access":["1"],"skin":"0","skin_admin":"0","mobile":"0","drag_drop":"1","path":"","entity_encoding":"raw","lang_mode":"1","text_direction":"ltr","content_css":"1","content_css_custom":"","relative_urls":"1","newlines":"0","use_config_textfilters":"0","invalid_elements":"script,applet,iframe","valid_elements":"","extended_elements":"","resizing":"1","resize_horizontal":"1","element_path":"1","wordcount":"1","image_advtab":"0","advlist":"1","autosave":"1","contextmenu":"1","custom_plugin":"","custom_button":""},"1":{"access":["6","2"],"skin":"0","skin_admin":"0","mobile":"0","drag_drop":"1","path":"","entity_encoding":"raw","lang_mode":"1","text_direction":"ltr","content_css":"1","content_css_custom":"","relative_urls":"1","newlines":"0","use_config_textfilters":"0","invalid_elements":"script,applet,iframe","valid_elements":"","extended_elements":"","resizing":"1","resize_horizontal":"1","element_path":"1","wordcount":"1","image_advtab":"0","advlist":"1","autosave":"1","contextmenu":"1","custom_plugin":"","custom_button":""},"0":{"access":["7","4","8"],"skin":"0","skin_admin":"0","mobile":"0","drag_drop":"1","path":"","entity_encoding":"raw","lang_mode":"1","text_direction":"ltr","content_css":"1","content_css_custom":"","relative_urls":"1","newlines":"0","use_config_textfilters":"0","invalid_elements":"script,applet,iframe","valid_elements":"","extended_elements":"","resizing":"1","resize_horizontal":"1","element_path":"1","wordcount":"1","image_advtab":"1","advlist":"1","autosave":"1","contextmenu":"1","custom_plugin":"","custom_button":""}}},"sets_amount":3,"html_height":"550","html_width":"750"}', '', 3, 0),
(0, 'plg_extension_finder', 'plugin', 'finder', 'extension', 0, 1, 1, 0, 1, '', '', '', 1, 0),
(0, 'plg_extension_joomla', 'plugin', 'joomla', 'extension', 0, 1, 1, 0, 1, '', '', '', 2, 0),
-(0, 'plg_extension_namespacemap', 'plugin', 'namespacemap', 'extension', 0, 1, 1, 1, 1, '', '{}', '', 3, 0),
+(0, 'plg_extension_joomlaupdate', 'plugin', 'joomlaupdate', 'extension', 0, 1, 1, 0, 1, '', '', '', 3, 0),
+(0, 'plg_extension_namespacemap', 'plugin', 'namespacemap', 'extension', 0, 1, 1, 1, 1, '', '{}', '', 4, 0),
(0, 'plg_fields_calendar', 'plugin', 'calendar', 'fields', 0, 1, 1, 0, 1, '', '', '', 1, 0),
(0, 'plg_fields_checkboxes', 'plugin', 'checkboxes', 'fields', 0, 1, 1, 0, 1, '', '', '', 2, 0),
(0, 'plg_fields_color', 'plugin', 'color', 'fields', 0, 1, 1, 0, 1, '', '', '', 3, 0),
diff --git a/installation/sql/postgresql/base.sql b/installation/sql/postgresql/base.sql
index 663718b278dfb..9a16881110208 100644
--- a/installation/sql/postgresql/base.sql
+++ b/installation/sql/postgresql/base.sql
@@ -294,7 +294,8 @@ INSERT INTO "#__extensions" ("package_id", "name", "type", "element", "folder",
(0, 'plg_editors_tinymce', 'plugin', 'tinymce', 'editors', 0, 1, 1, 0, 1, '', '{"configuration":{"toolbars":{"2":{"toolbar1":["bold","underline","strikethrough","|","undo","redo","|","bullist","numlist","|","pastetext"]},"1":{"menu":["edit","insert","view","format","table","tools"],"toolbar1":["bold","italic","underline","strikethrough","|","alignleft","aligncenter","alignright","alignjustify","|","blocks","|","bullist","numlist","|","outdent","indent","|","undo","redo","|","link","unlink","anchor","code","|","hr","table","|","subscript","superscript","|","charmap","pastetext","preview"]},"0":{"menu":["edit","insert","view","format","table","tools"],"toolbar1":["bold","italic","underline","strikethrough","|","alignleft","aligncenter","alignright","alignjustify","|","styles","|","blocks","fontfamily","fontsize","|","searchreplace","|","bullist","numlist","|","outdent","indent","|","undo","redo","|","link","unlink","anchor","image","|","code","|","forecolor","backcolor","|","fullscreen","|","table","|","subscript","superscript","|","charmap","emoticons","media","hr","ltr","rtl","|","cut","copy","paste","pastetext","|","visualchars","visualblocks","nonbreaking","blockquote","jtemplate","|","print","preview","codesample","insertdatetime","removeformat"]}},"setoptions":{"2":{"access":["1"],"skin":"0","skin_admin":"0","mobile":"0","drag_drop":"1","path":"","entity_encoding":"raw","lang_mode":"1","text_direction":"ltr","content_css":"1","content_css_custom":"","relative_urls":"1","newlines":"0","use_config_textfilters":"0","invalid_elements":"script,applet,iframe","valid_elements":"","extended_elements":"","resizing":"1","resize_horizontal":"1","element_path":"1","wordcount":"1","image_advtab":"0","advlist":"1","autosave":"1","contextmenu":"1","custom_plugin":"","custom_button":""},"1":{"access":["6","2"],"skin":"0","skin_admin":"0","mobile":"0","drag_drop":"1","path":"","entity_encoding":"raw","lang_mode":"1","text_direction":"ltr","content_css":"1","content_css_custom":"","relative_urls":"1","newlines":"0","use_config_textfilters":"0","invalid_elements":"script,applet,iframe","valid_elements":"","extended_elements":"","resizing":"1","resize_horizontal":"1","element_path":"1","wordcount":"1","image_advtab":"0","advlist":"1","autosave":"1","contextmenu":"1","custom_plugin":"","custom_button":""},"0":{"access":["7","4","8"],"skin":"0","skin_admin":"0","mobile":"0","drag_drop":"1","path":"","entity_encoding":"raw","lang_mode":"1","text_direction":"ltr","content_css":"1","content_css_custom":"","relative_urls":"1","newlines":"0","use_config_textfilters":"0","invalid_elements":"script,applet,iframe","valid_elements":"","extended_elements":"","resizing":"1","resize_horizontal":"1","element_path":"1","wordcount":"1","image_advtab":"1","advlist":"1","autosave":"1","contextmenu":"1","custom_plugin":"","custom_button":""}}},"sets_amount":3,"html_height":"550","html_width":"750"}', '', 3, 0),
(0, 'plg_extension_finder', 'plugin', 'finder', 'extension', 0, 1, 1, 0, 1, '', '', '', 1, 0),
(0, 'plg_extension_joomla', 'plugin', 'joomla', 'extension', 0, 1, 1, 0, 1, '', '', '', 2, 0),
-(0, 'plg_extension_namespacemap', 'plugin', 'namespacemap', 'extension', 0, 1, 1, 1, 1, '', '{}', '', 3, 0),
+(0, 'plg_extension_joomlaupdate', 'plugin', 'joomlaupdate', 'extension', 0, 1, 1, 0, 1, '', '', '', 3, 0),
+(0, 'plg_extension_namespacemap', 'plugin', 'namespacemap', 'extension', 0, 1, 1, 1, 1, '', '{}', '', 4, 0),
(0, 'plg_fields_calendar', 'plugin', 'calendar', 'fields', 0, 1, 1, 0, 1, '', '', '', 1, 0),
(0, 'plg_fields_checkboxes', 'plugin', 'checkboxes', 'fields', 0, 1, 1, 0, 1, '', '', '', 2, 0),
(0, 'plg_fields_color', 'plugin', 'color', 'fields', 0, 1, 1, 0, 1, '', '', '', 3, 0),
diff --git a/installation/sql/postgresql/extensions.sql b/installation/sql/postgresql/extensions.sql
index 6271c6cf4dbd0..2aac95993f3a9 100644
--- a/installation/sql/postgresql/extensions.sql
+++ b/installation/sql/postgresql/extensions.sql
@@ -838,7 +838,7 @@ INSERT INTO "#__action_log_config" ("id", "type_title", "type_alias", "id_holder
(23, 'contact', 'com_contact.form', 'id', 'name', '#__contact_details', 'PLG_ACTIONLOG_JOOMLA');
-SELECT setval('#__action_log_config_id_seq', 23, false);
+SELECT setval('#__action_log_config_id_seq', 24, false);
--
-- Table structure for table `#__action_logs_users`
diff --git a/installation/src/Console/InstallCommand.php b/installation/src/Console/InstallCommand.php
index 9ba642657c97a..fd800069520f9 100644
--- a/installation/src/Console/InstallCommand.php
+++ b/installation/src/Console/InstallCommand.php
@@ -379,7 +379,7 @@ protected function getStringFromOption($option, $question, FormField $field): st
// We don't have a CLI option and now interactively get that from the user.
while (\is_null($answer) || $answer === false) {
- if (\in_array($option, ['admin-password', 'db-pass', 'public_folder'])) {
+ if (\in_array($option, ['admin-password', 'db-pass'])) {
$answer = $this->ioStyle->askHidden($question);
} else {
$answer = $this->ioStyle->ask(
diff --git a/installation/src/Model/ConfigurationModel.php b/installation/src/Model/ConfigurationModel.php
index e92ea8708d532..915d7b469b42f 100644
--- a/installation/src/Model/ConfigurationModel.php
+++ b/installation/src/Model/ConfigurationModel.php
@@ -371,6 +371,7 @@ public function createConfiguration($options)
$registry->set('captcha', '0');
$registry->set('list_limit', 20);
$registry->set('access', 1);
+ $registry->set('frontediting', 1);
// Debug settings.
$registry->set('debug', false);
@@ -402,6 +403,12 @@ public function createConfiguration($options)
// Locale settings.
$registry->set('offset', 'UTC');
+ // CORS settings.
+ $registry->set('cors', false);
+ $registry->set('cors_allow_origin', '*');
+ $registry->set('cors_allow_methods', '');
+ $registry->set('cors_allow_headers', 'Content-Type,X-Joomla-Token');
+
// Mail settings.
$registry->set('mailonline', true);
$registry->set('mailer', 'mail');
diff --git a/language/en-GB/com_contact.ini b/language/en-GB/com_contact.ini
index ad1c8fb320e5a..d8e690176b449 100644
--- a/language/en-GB/com_contact.ini
+++ b/language/en-GB/com_contact.ini
@@ -29,7 +29,7 @@ COM_CONTACT_EMAIL_FORM="Contact Form"
COM_CONTACT_EMAIL_LABEL="Email"
COM_CONTACT_EMAIL_THANKS="Thank you for your email."
COM_CONTACT_ENQUIRY_SUBJECT="{SITENAME}: {SUBJECT}"
-COM_CONTACT_ENQUIRY_TEXT="This is an enquiry email via {URL} from:\n{NAME} <{EMAIL}>\n\n{BODY}\n\n{CUSTOMFIELDS}"
+COM_CONTACT_ENQUIRY_TEXT="This is an enquiry email via {URL} from:\n{NAME} {EMAIL}\n\n{BODY}\n\n{CUSTOMFIELDS}"
COM_CONTACT_ERROR_CONTACT_NOT_FOUND="Contact not found"
COM_CONTACT_ERROR_UNIQUE_ALIAS="Another Contact in this category has the same alias."
COM_CONTACT_ERROR_UNIQUE_ALIAS_TRASHED="A trashed Contact in this category has the same alias."
diff --git a/language/en-GB/install.xml b/language/en-GB/install.xml
index 5df25462b5497..d522483bc38a3 100644
--- a/language/en-GB/install.xml
+++ b/language/en-GB/install.xml
@@ -2,8 +2,8 @@
English (en-GB)
en-GB
- 5.3.0
- 2025-02
+ 5.3.1
+ 2025-04
Joomla! Project
admin@joomla.org
www.joomla.org
diff --git a/language/en-GB/langmetadata.xml b/language/en-GB/langmetadata.xml
index af1095dc69fc7..787c82421161d 100644
--- a/language/en-GB/langmetadata.xml
+++ b/language/en-GB/langmetadata.xml
@@ -1,8 +1,8 @@
English (en-GB)
- 5.3.0
- 2025-02
+ 5.3.1
+ 2025-04
Joomla! Project
admin@joomla.org
www.joomla.org
diff --git a/language/en-GB/mod_articles_category.ini b/language/en-GB/mod_articles_category.ini
index a734bfe12bbff..f615cfa75bc4f 100644
--- a/language/en-GB/mod_articles_category.ini
+++ b/language/en-GB/mod_articles_category.ini
@@ -3,7 +3,7 @@
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8
-MOD_ARTICLES_CATEGORY="Articles - Category"
+MOD_ARTICLES_CATEGORY="Articles - Category (Legacy)"
MOD_ARTICLES_CATEGORY_FIELD_ARTICLEGROUPING_LABEL="Article Grouping"
MOD_ARTICLES_CATEGORY_FIELD_ARTICLEGROUPINGDIR_LABEL="Grouping Direction"
MOD_ARTICLES_CATEGORY_FIELD_ARTICLEORDERING_LABEL="Article Field to Order By"
@@ -72,4 +72,4 @@ MOD_ARTICLES_CATEGORY_READ_MORE="Read more: "
MOD_ARTICLES_CATEGORY_READ_MORE_TITLE="Read More …"
MOD_ARTICLES_CATEGORY_REGISTER_TO_READ_MORE="Register to read more"
MOD_ARTICLES_CATEGORY_UNTAGGED="Untagged"
-MOD_ARTICLES_CATEGORY_XML_DESCRIPTION="This module displays a list of articles from one or more categories."
+MOD_ARTICLES_CATEGORY_XML_DESCRIPTION="This module displays a list of articles from one or more categories. This module is superseded by the \"Articles\" module."
diff --git a/language/en-GB/mod_articles_category.sys.ini b/language/en-GB/mod_articles_category.sys.ini
index dbeffc1a2ae8f..be43ccf788737 100644
--- a/language/en-GB/mod_articles_category.sys.ini
+++ b/language/en-GB/mod_articles_category.sys.ini
@@ -3,6 +3,6 @@
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8
-MOD_ARTICLES_CATEGORY="Articles - Category"
+MOD_ARTICLES_CATEGORY="Articles - Category (Legacy)"
MOD_ARTICLES_CATEGORY_LAYOUT_DEFAULT="Default"
-MOD_ARTICLES_CATEGORY_XML_DESCRIPTION="This module displays a list of articles from one or more categories."
+MOD_ARTICLES_CATEGORY_XML_DESCRIPTION="This module displays a list of articles from one or more categories. This module is superseded by the \"Articles\" module."
diff --git a/language/en-GB/mod_articles_latest.ini b/language/en-GB/mod_articles_latest.ini
index 861d4216d2ee9..6e3ad0305bbb6 100644
--- a/language/en-GB/mod_articles_latest.ini
+++ b/language/en-GB/mod_articles_latest.ini
@@ -3,7 +3,7 @@
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8
-MOD_ARTICLES_LATEST="Articles - Latest"
+MOD_ARTICLES_LATEST="Articles - Latest (Legacy)"
MOD_LATEST_NEWS_FIELD_AUTHOR_LABEL="Created by Author(s)"
MOD_LATEST_NEWS_FIELD_COUNT_LABEL="Articles to Display"
MOD_LATEST_NEWS_FIELD_FEATURED_LABEL="Featured Articles"
@@ -19,4 +19,4 @@ MOD_LATEST_NEWS_VALUE_RECENT_MODIFIED="Recently Modified First"
MOD_LATEST_NEWS_VALUE_RECENT_PUBLISHED="Recently Published First"
MOD_LATEST_NEWS_VALUE_RECENT_RAND="Random Articles"
MOD_LATEST_NEWS_VALUE_RECENT_TOUCHED="Recently Touched First"
-MOD_LATEST_NEWS_XML_DESCRIPTION="This module shows a list of the most recently published and current Articles."
+MOD_LATEST_NEWS_XML_DESCRIPTION="This module shows a list of the most recently published and current Articles. This module is superseded by the \"Articles\" module."
diff --git a/language/en-GB/mod_articles_latest.sys.ini b/language/en-GB/mod_articles_latest.sys.ini
index 29499eaacd389..ac2987d17e4b7 100644
--- a/language/en-GB/mod_articles_latest.sys.ini
+++ b/language/en-GB/mod_articles_latest.sys.ini
@@ -3,6 +3,6 @@
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8
-MOD_ARTICLES_LATEST="Articles - Latest"
+MOD_ARTICLES_LATEST="Articles - Latest (Legacy)"
MOD_ARTICLES_LATEST_LAYOUT_DEFAULT="Default"
-MOD_LATEST_NEWS_XML_DESCRIPTION="This module shows a list of the most recently published and current Articles."
+MOD_LATEST_NEWS_XML_DESCRIPTION="This module shows a list of the most recently published and current Articles. This module is superseded by the \"Articles\" module."
diff --git a/language/en-GB/mod_articles_news.ini b/language/en-GB/mod_articles_news.ini
index bb442222fa205..dffaafc7028f1 100644
--- a/language/en-GB/mod_articles_news.ini
+++ b/language/en-GB/mod_articles_news.ini
@@ -3,7 +3,7 @@
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8
-MOD_ARTICLES_NEWS="Articles - Newsflash"
+MOD_ARTICLES_NEWS="Articles - Newsflash (Legacy)"
MOD_ARTICLES_NEWS_FIELD_EXCLUDE_CURRENT_LABEL="Exclude Current Article"
MOD_ARTICLES_NEWS_FIELD_FEATURED_LABEL="Featured Articles"
MOD_ARTICLES_NEWS_FIELD_IMAGES_ARTICLE_LABEL="Show Intro/Full Image"
@@ -28,4 +28,4 @@ MOD_ARTICLES_NEWS_READMORE="Read more …"
MOD_ARTICLES_NEWS_READMORE_REGISTER="Register to Read More"
MOD_ARTICLES_NEWS_TITLE_HEADING="Header Level"
MOD_ARTICLES_NEWS_VALUE_ONLY_SHOW_FEATURED="Only show Featured Articles"
-MOD_ARTICLES_NEWS_XML_DESCRIPTION="The Article Newsflash Module will display a fixed number of Articles from a specific Category or a set of Categories."
+MOD_ARTICLES_NEWS_XML_DESCRIPTION="The Article Newsflash Module will display a fixed number of Articles from a specific Category or a set of Categories. This module is superseded by the \"Articles\" module."
diff --git a/language/en-GB/mod_articles_news.sys.ini b/language/en-GB/mod_articles_news.sys.ini
index 1cd060b4f36b8..9eb6479b1b133 100644
--- a/language/en-GB/mod_articles_news.sys.ini
+++ b/language/en-GB/mod_articles_news.sys.ini
@@ -3,8 +3,8 @@
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8
-MOD_ARTICLES_NEWS="Articles - Newsflash"
+MOD_ARTICLES_NEWS="Articles - Newsflash (Legacy)"
MOD_ARTICLES_NEWS_LAYOUT_DEFAULT="Default"
-MOD_ARTICLES_NEWS_LAYOUT_HORIZONTAL="Horizontal"
+MOD_ARTICLES_NEWS_LAYOUT_HORIZONTAL="Horizontal"
MOD_ARTICLES_NEWS_LAYOUT_VERTICAL="Vertical"
-MOD_ARTICLES_NEWS_XML_DESCRIPTION="The Newsflash Module will display a fixed number of articles from a specific category."
+MOD_ARTICLES_NEWS_XML_DESCRIPTION="The Newsflash Module will display a fixed number of articles from a specific category. This module is superseded by the \"Articles\" module."
diff --git a/language/en-GB/mod_articles_popular.ini b/language/en-GB/mod_articles_popular.ini
index 45e17aec04419..c354b043be063 100644
--- a/language/en-GB/mod_articles_popular.ini
+++ b/language/en-GB/mod_articles_popular.ini
@@ -3,7 +3,7 @@
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8
-MOD_ARTICLES_POPULAR="Articles - Most Read"
+MOD_ARTICLES_POPULAR="Articles - Most Read (Legacy)"
MOD_POPULAR_FIELD_COUNT_LABEL="Articles to Display"
MOD_POPULAR_FIELD_DATEFIELD_LABEL="Date Field"
MOD_POPULAR_FIELD_DATEFILTERING_LABEL="Date Filtering"
@@ -17,4 +17,4 @@ MOD_POPULAR_OPTION_MODIFIED_VALUE="Modified Date"
MOD_POPULAR_OPTION_OFF_VALUE="Off"
MOD_POPULAR_OPTION_RELATIVEDAY_VALUE="Relative Date"
MOD_POPULAR_OPTION_STARTPUBLISHING_VALUE="Start Publishing Date"
-MOD_POPULAR_XML_DESCRIPTION="This module shows a list of the published Articles which have the highest number of page views."
+MOD_POPULAR_XML_DESCRIPTION="This module shows a list of the published Articles which have the highest number of page views. This module is superseded by the \"Articles\" module."
diff --git a/language/en-GB/mod_articles_popular.sys.ini b/language/en-GB/mod_articles_popular.sys.ini
index d57521510e7af..422ff3526349f 100644
--- a/language/en-GB/mod_articles_popular.sys.ini
+++ b/language/en-GB/mod_articles_popular.sys.ini
@@ -3,6 +3,6 @@
; License GNU General Public License version 2 or later; see LICENSE.txt
; Note : All ini files need to be saved as UTF-8
-MOD_ARTICLES_POPULAR="Articles - Most Read"
+MOD_ARTICLES_POPULAR="Articles - Most Read (Legacy)"
MOD_ARTICLES_POPULAR_LAYOUT_DEFAULT="Default"
-MOD_POPULAR_XML_DESCRIPTION="This module shows a list of the published Articles which have the highest number of page views."
+MOD_POPULAR_XML_DESCRIPTION="This module shows a list of the published Articles which have the highest number of page views. This module is superseded by the \"Articles\" module."
diff --git a/language/en-GB/tpl_cassiopeia.ini b/language/en-GB/tpl_cassiopeia.ini
index 767466ee41822..ea9946904cb93 100644
--- a/language/en-GB/tpl_cassiopeia.ini
+++ b/language/en-GB/tpl_cassiopeia.ini
@@ -40,4 +40,4 @@ TPL_CASSIOPEIA_STICKY_LABEL="Sticky Header"
TPL_CASSIOPEIA_TAGLINE_DESC="Optional text to show as a subheading"
TPL_CASSIOPEIA_TAGLINE_LABEL="Tagline"
TPL_CASSIOPEIA_TITLE="Title (alternative to logo)"
-TPL_CASSIOPEIA_XML_DESCRIPTION="Continuing the space theme (Solarflare from 1.0, Milkyway from 1.5 and Protostar from 3.0), Cassiopeia is the Joomla 4 site template based on Bootstrap 5."
+TPL_CASSIOPEIA_XML_DESCRIPTION="Continuing the space theme (Solarflare from 1.0, Milkyway from 1.5 and Protostar from 3.0), Cassiopeia is the Joomla 4 and Joomla 5 site template based on Bootstrap 5."
diff --git a/language/en-GB/tpl_cassiopeia.sys.ini b/language/en-GB/tpl_cassiopeia.sys.ini
index 226990e03c946..42e58e4a3bd90 100644
--- a/language/en-GB/tpl_cassiopeia.sys.ini
+++ b/language/en-GB/tpl_cassiopeia.sys.ini
@@ -1,28 +1,28 @@
-; Joomla! Project
-; (C) 2017 Open Source Matters, Inc.
-; License GNU General Public License version 2 or later; see LICENSE.txt
-; Note : All ini files need to be saved as UTF-8
-
-CASSIOPEIA="Cassiopeia Site template"
+; Joomla! Project
+; (C) 2017 Open Source Matters, Inc.
+; License GNU General Public License version 2 or later; see LICENSE.txt
+; Note : All ini files need to be saved as UTF-8
+
+CASSIOPEIA="Cassiopeia Site template"
TPL_CASSIOPEIA_MOD_CUSTOM_LAYOUT_BANNER="Banner"
TPL_CASSIOPEIA_MOD_MENU_LAYOUT_COLLAPSE-METISMENU="Collapsible Dropdown"
-TPL_CASSIOPEIA_MOD_MENU_LAYOUT_DROPDOWN-METISMENU="Dropdown"
-TPL_CASSIOPEIA_POSITION_BANNER="Banner"
-TPL_CASSIOPEIA_POSITION_BELOW-TOP="Below Top"
-TPL_CASSIOPEIA_POSITION_BOTTOM-A="Bottom-a"
-TPL_CASSIOPEIA_POSITION_BOTTOM-B="Bottom-b"
-TPL_CASSIOPEIA_POSITION_BREADCRUMBS="Breadcrumbs"
-TPL_CASSIOPEIA_POSITION_DEBUG="Debug"
-TPL_CASSIOPEIA_POSITION_ERROR-403="Error 403"
-TPL_CASSIOPEIA_POSITION_ERROR-404="Error 404"
-TPL_CASSIOPEIA_POSITION_FOOTER="Footer"
-TPL_CASSIOPEIA_POSITION_MAIN-BOTTOM="Main-bottom"
-TPL_CASSIOPEIA_POSITION_MAIN-TOP="Main-top"
-TPL_CASSIOPEIA_POSITION_MENU="Menu"
-TPL_CASSIOPEIA_POSITION_SEARCH="Search"
-TPL_CASSIOPEIA_POSITION_SIDEBAR-LEFT="Sidebar-left"
-TPL_CASSIOPEIA_POSITION_SIDEBAR-RIGHT="Sidebar-right"
-TPL_CASSIOPEIA_POSITION_TOP-A="Top-a"
-TPL_CASSIOPEIA_POSITION_TOP-B="Top-b"
-TPL_CASSIOPEIA_POSITION_TOPBAR="Top Bar"
-TPL_CASSIOPEIA_XML_DESCRIPTION="Continuing the space theme (Solarflare from 1.0, Milkyway from 1.5 and Protostar from 3.0), Cassiopeia is the Joomla 4 site template based on Bootstrap 5."
+TPL_CASSIOPEIA_MOD_MENU_LAYOUT_DROPDOWN-METISMENU="Dropdown"
+TPL_CASSIOPEIA_POSITION_BANNER="Banner"
+TPL_CASSIOPEIA_POSITION_BELOW-TOP="Below Top"
+TPL_CASSIOPEIA_POSITION_BOTTOM-A="Bottom-a"
+TPL_CASSIOPEIA_POSITION_BOTTOM-B="Bottom-b"
+TPL_CASSIOPEIA_POSITION_BREADCRUMBS="Breadcrumbs"
+TPL_CASSIOPEIA_POSITION_DEBUG="Debug"
+TPL_CASSIOPEIA_POSITION_ERROR-403="Error 403"
+TPL_CASSIOPEIA_POSITION_ERROR-404="Error 404"
+TPL_CASSIOPEIA_POSITION_FOOTER="Footer"
+TPL_CASSIOPEIA_POSITION_MAIN-BOTTOM="Main-bottom"
+TPL_CASSIOPEIA_POSITION_MAIN-TOP="Main-top"
+TPL_CASSIOPEIA_POSITION_MENU="Menu"
+TPL_CASSIOPEIA_POSITION_SEARCH="Search"
+TPL_CASSIOPEIA_POSITION_SIDEBAR-LEFT="Sidebar-left"
+TPL_CASSIOPEIA_POSITION_SIDEBAR-RIGHT="Sidebar-right"
+TPL_CASSIOPEIA_POSITION_TOP-A="Top-a"
+TPL_CASSIOPEIA_POSITION_TOP-B="Top-b"
+TPL_CASSIOPEIA_POSITION_TOPBAR="Top Bar"
+TPL_CASSIOPEIA_XML_DESCRIPTION="Continuing the space theme (Solarflare from 1.0, Milkyway from 1.5 and Protostar from 3.0), Cassiopeia is the Joomla 4 and Joomla 5 site template based on Bootstrap 5."
diff --git a/layouts/joomla/mail/mailtemplate.php b/layouts/joomla/mail/mailtemplate.php
index 209b0ad26f570..23e680c7cdeeb 100644
--- a/layouts/joomla/mail/mailtemplate.php
+++ b/layouts/joomla/mail/mailtemplate.php
@@ -62,8 +62,8 @@
table, td, div, h1, p { font-family: Arial, sans-serif; }
-
-
+
+
@@ -83,8 +83,14 @@
-
-
+
diff --git a/libraries/bootstrap.php b/libraries/bootstrap.php
index 190240a730ee6..041f53782a0ca 100644
--- a/libraries/bootstrap.php
+++ b/libraries/bootstrap.php
@@ -62,17 +62,6 @@ class_exists('\\Joomla\\CMS\\Autoload\\ClassLoader');
set_error_handler(['Joomla\CMS\Exception\ExceptionHandler', 'handleUserDeprecatedErrors'], E_USER_DEPRECATED);
}
-// Suppress phar stream wrapper for non .phar files
-$behavior = new \TYPO3\PharStreamWrapper\Behavior();
-\TYPO3\PharStreamWrapper\Manager::initialize(
- $behavior->withAssertion(new \TYPO3\PharStreamWrapper\Interceptor\PharExtensionInterceptor())
-);
-
-if (in_array('phar', stream_get_wrappers())) {
- stream_wrapper_unregister('phar');
- stream_wrapper_register('phar', 'TYPO3\\PharStreamWrapper\\PharStreamWrapper');
-}
-
// Define the Joomla version if not already defined.
defined('JVERSION') or define('JVERSION', (new \Joomla\CMS\Version())->getShortVersion());
diff --git a/libraries/cms.php b/libraries/cms.php
index 03f8203174b7b..e8303fd34ca34 100644
--- a/libraries/cms.php
+++ b/libraries/cms.php
@@ -49,17 +49,6 @@ class_exists('\\Joomla\\CMS\\Autoload\\ClassLoader');
// Decorate Composer autoloader
spl_autoload_register([new \Joomla\CMS\Autoload\ClassLoader($loader), 'loadClass'], true, true);
-// Suppress phar stream wrapper for non .phar files
-$behavior = new \TYPO3\PharStreamWrapper\Behavior();
-\TYPO3\PharStreamWrapper\Manager::initialize(
- $behavior->withAssertion(new \TYPO3\PharStreamWrapper\Interceptor\PharExtensionInterceptor())
-);
-
-if (in_array('phar', stream_get_wrappers())) {
- stream_wrapper_unregister('phar');
- stream_wrapper_register('phar', 'TYPO3\\PharStreamWrapper\\PharStreamWrapper');
-}
-
// Define the Joomla version if not already defined
if (!defined('JVERSION')) {
define('JVERSION', (new \Joomla\CMS\Version())->getShortVersion());
diff --git a/libraries/src/Application/CMSApplication.php b/libraries/src/Application/CMSApplication.php
index b429655708aa1..2d6a730c72add 100644
--- a/libraries/src/Application/CMSApplication.php
+++ b/libraries/src/Application/CMSApplication.php
@@ -249,10 +249,8 @@ public function enqueueMessage($msg, $type = self::MSG_INFO)
'type' => $inputFilter->clean(strtolower($type), 'cmd'),
];
- // For empty queue, if messages exists in the session, enqueue them first.
- $messages = $this->getMessageQueue();
-
- if (!\in_array($message, $this->messageQueue)) {
+ // Get the messages of the session and add the new message if it is not already in the queue.
+ if (!\in_array($message, $this->getMessageQueue())) {
// Enqueue the message.
$this->messageQueue[] = $message;
}
diff --git a/libraries/src/Application/MultiFactorAuthenticationHandler.php b/libraries/src/Application/MultiFactorAuthenticationHandler.php
index e41486964323a..daf195510469b 100644
--- a/libraries/src/Application/MultiFactorAuthenticationHandler.php
+++ b/libraries/src/Application/MultiFactorAuthenticationHandler.php
@@ -271,11 +271,6 @@ private function needsMultiFactorAuthenticationRedirection(): bool
return false;
}
- // Do not redirect if we are already in a MFA management or captive page
- if ($this->isMultiFactorAuthenticationPage()) {
- return false;
- }
-
$option = strtolower($this->input->getCmd('option', ''));
$task = strtolower($this->input->getCmd('task', ''));
@@ -294,6 +289,13 @@ private function needsMultiFactorAuthenticationRedirection(): bool
return false;
}
+ // Do not redirect if we are already in a MFA management or captive page
+ $onlyCaptive = $this->isMultiFactorAuthenticationPending() && !$isMFASetupMandatory;
+
+ if ($this->isMultiFactorAuthenticationPage($onlyCaptive)) {
+ return false;
+ }
+
return true;
}
diff --git a/libraries/src/Categories/Categories.php b/libraries/src/Categories/Categories.php
index 7205c7e563db2..018717fc719f6 100644
--- a/libraries/src/Categories/Categories.php
+++ b/libraries/src/Categories/Categories.php
@@ -237,7 +237,7 @@ protected function _load($id)
try {
$db = $this->getDatabase();
} catch (DatabaseNotFoundException) {
- @trigger_error(\sprintf('Database must be set, this will not be caught anymore in 5.0.'), E_USER_DEPRECATED);
+ @trigger_error('Database must be set, this will not be caught anymore in 5.0.', E_USER_DEPRECATED);
$db = Factory::getContainer()->get(DatabaseInterface::class);
}
diff --git a/libraries/src/Changelog/Changelog.php b/libraries/src/Changelog/Changelog.php
index dbe0561a9766e..1923c1b354527 100644
--- a/libraries/src/Changelog/Changelog.php
+++ b/libraries/src/Changelog/Changelog.php
@@ -288,8 +288,7 @@ public function endElement($parser, $name)
$this->$key = $val;
}
- unset($this->latest);
- unset($this->currentChangelog);
+ unset($this->latest, $this->currentChangelog);
} elseif (isset($this->currentChangelog)) {
// The update might be for an older version of j!
unset($this->currentChangelog);
@@ -368,9 +367,8 @@ public function loadFromXml($url)
$this->currentChangelog = new \stdClass();
$this->xmlParser = xml_parser_create('');
- xml_set_object($this->xmlParser, $this);
- xml_set_element_handler($this->xmlParser, 'startElement', 'endElement');
- xml_set_character_data_handler($this->xmlParser, 'characterData');
+ xml_set_element_handler($this->xmlParser, [$this, 'startElement'], [$this, 'endElement']);
+ xml_set_character_data_handler($this->xmlParser, [$this, 'characterData']);
if (!xml_parse($this->xmlParser, $response->body)) {
Log::add(
diff --git a/libraries/src/Client/FtpClient.php b/libraries/src/Client/FtpClient.php
index fb94d9b95f269..28be94171e137 100644
--- a/libraries/src/Client/FtpClient.php
+++ b/libraries/src/Client/FtpClient.php
@@ -344,7 +344,7 @@ public function connect($host = '127.0.0.1', $port = 21)
*/
public function isConnected()
{
- return ($this->_conn);
+ return $this->_conn;
}
/**
diff --git a/libraries/src/Component/Router/RouterView.php b/libraries/src/Component/Router/RouterView.php
index 471224f74564a..259e7577c45a9 100644
--- a/libraries/src/Component/Router/RouterView.php
+++ b/libraries/src/Component/Router/RouterView.php
@@ -89,7 +89,7 @@ public function getPath($query)
$result = [];
// Get the right view object
- if (isset($query['view']) && isset($views[$query['view']])) {
+ if (isset($query['view'], $views[$query['view']])) {
$viewobj = $views[$query['view']];
}
diff --git a/libraries/src/Component/Router/Rules/NomenuRules.php b/libraries/src/Component/Router/Rules/NomenuRules.php
index 61cf23054283b..b102d362f555d 100644
--- a/libraries/src/Component/Router/Rules/NomenuRules.php
+++ b/libraries/src/Component/Router/Rules/NomenuRules.php
@@ -77,7 +77,7 @@ public function parse(&$segments, &$vars)
$vars['view'] = array_shift($segments);
$view = $views[$vars['view']];
- if (isset($view->key) && isset($segments[0])) {
+ if (isset($view->key, $segments[0])) {
if (\is_callable([$this->router, 'get' . ucfirst($view->name) . 'Id'])) {
$input = $this->router->app->getInput();
if ($view->parent_key && $input->get($view->parent_key)) {
diff --git a/libraries/src/Console/CoreUpdateChannelCommand.php b/libraries/src/Console/CoreUpdateChannelCommand.php
index 31dba413e2490..bfc9a0b7e826b 100644
--- a/libraries/src/Console/CoreUpdateChannelCommand.php
+++ b/libraries/src/Console/CoreUpdateChannelCommand.php
@@ -142,7 +142,7 @@ protected function doExecute(InputInterface $input, OutputInterface $output): in
/** @var UpdateModel $updatemodel */
$app = $this->getApplication();
$updatemodel = $app->bootComponent('com_joomlaupdate')->getMVCFactory($app)->createModel('Update', 'Administrator');
- $updatemodel->applyUpdateSite();
+ $updatemodel->applyUpdateSite($channel);
if ($channel == 'custom') {
$symfonyStyle->success('The update channel for this site has been set to the custom url "' . $params->get('customurl') . '".');
diff --git a/libraries/src/Console/SetConfigurationCommand.php b/libraries/src/Console/SetConfigurationCommand.php
index b0651581f24f9..7db330f30e2b3 100644
--- a/libraries/src/Console/SetConfigurationCommand.php
+++ b/libraries/src/Console/SetConfigurationCommand.php
@@ -133,7 +133,7 @@ private function retrieveOptionsFromInput(array $options): bool
return false;
}
- list($option, $value) = explode('=', $option);
+ [$option, $value] = explode('=', $option);
$collected[$option] = $value;
}
@@ -205,7 +205,7 @@ public function getOptions()
*/
public function getInitialConfigurationOptions(): Registry
{
- return (new Registry(new \JConfig()));
+ return new Registry(new \JConfig());
}
diff --git a/libraries/src/Dispatcher/ComponentDispatcher.php b/libraries/src/Dispatcher/ComponentDispatcher.php
index d36849d7a6f87..794e606334485 100644
--- a/libraries/src/Dispatcher/ComponentDispatcher.php
+++ b/libraries/src/Dispatcher/ComponentDispatcher.php
@@ -120,7 +120,7 @@ public function dispatch()
// Check for a controller.task command.
if (str_contains($command, '.')) {
// Explode the controller.task command.
- list($controller, $task) = explode('.', $command);
+ [$controller, $task] = explode('.', $command);
$this->input->set('controller', $controller);
$this->input->set('task', $task);
diff --git a/libraries/src/Document/Renderer/Html/MessageRenderer.php b/libraries/src/Document/Renderer/Html/MessageRenderer.php
index 29891ed6e155e..2a72553462bbc 100644
--- a/libraries/src/Document/Renderer/Html/MessageRenderer.php
+++ b/libraries/src/Document/Renderer/Html/MessageRenderer.php
@@ -82,7 +82,7 @@ private function getData()
// Build the sorted message list
if (\is_array($messages) && !empty($messages)) {
foreach ($messages as $msg) {
- if (isset($msg['type']) && isset($msg['message'])) {
+ if (isset($msg['type'], $msg['message'])) {
$lists[$msg['type']][] = $msg['message'];
}
}
diff --git a/libraries/src/Document/Renderer/Html/MetasRenderer.php b/libraries/src/Document/Renderer/Html/MetasRenderer.php
index 26b0b082e8595..f6e29d269ad32 100644
--- a/libraries/src/Document/Renderer/Html/MetasRenderer.php
+++ b/libraries/src/Document/Renderer/Html/MetasRenderer.php
@@ -76,7 +76,7 @@ public function render($head, $params = [], $content = null)
throw new \RuntimeException('Detected an override for "joomla.script.options" asset');
}
- $jsonFlags = JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE | (JDEBUG ? JSON_PRETTY_PRINT : 0);
+ $jsonFlags = JSON_UNESCAPED_UNICODE | (JDEBUG ? JSON_PRETTY_PRINT : 0);
$jsonOptions = json_encode($scriptOptions, $jsonFlags);
// Set content and update attributes of dummy asset to correct ones
diff --git a/libraries/src/Environment/Browser.php b/libraries/src/Environment/Browser.php
index 29133799bbf84..cfc8c787b5366 100644
--- a/libraries/src/Environment/Browser.php
+++ b/libraries/src/Environment/Browser.php
@@ -562,7 +562,7 @@ public function match($userAgent = null, $accept = null)
$this->setBrowser('edge');
if (str_contains($version[1], '.')) {
- list($this->majorVersion, $this->minorVersion) = explode('.', $version[1]);
+ [$this->majorVersion, $this->minorVersion] = explode('.', $version[1]);
} else {
$this->majorVersion = $version[1];
$this->minorVersion = 0;
@@ -574,11 +574,11 @@ public function match($userAgent = null, $accept = null)
*/
$this->setBrowser('edg');
- list($this->majorVersion, $this->minorVersion) = explode('.', $version[1]);
+ [$this->majorVersion, $this->minorVersion] = explode('.', $version[1]);
} elseif (preg_match('|Opera[\/ ]([0-9.]+)|', $this->agent, $version)) {
$this->setBrowser('opera');
- list($this->majorVersion, $this->minorVersion) = explode('.', $version[1]);
+ [$this->majorVersion, $this->minorVersion] = explode('.', $version[1]);
/*
* Due to changes in Opera UA, we need to check Version/xx.yy,
@@ -591,7 +591,7 @@ public function match($userAgent = null, $accept = null)
// Opera 15+
$this->setBrowser('opera');
- list($this->majorVersion, $this->minorVersion) = explode('.', $version[1]);
+ [$this->majorVersion, $this->minorVersion] = explode('.', $version[1]);
} elseif (
preg_match('/Chrome[\/ ]([0-9.]+)/i', $this->agent, $version)
|| preg_match('/CrMo[\/ ]([0-9.]+)/i', $this->agent, $version)
@@ -599,7 +599,7 @@ public function match($userAgent = null, $accept = null)
) {
$this->setBrowser('chrome');
- list($this->majorVersion, $this->minorVersion) = explode('.', $version[1]);
+ [$this->majorVersion, $this->minorVersion] = explode('.', $version[1]);
} elseif (
str_contains($this->lowerAgent, 'elaine/')
|| str_contains($this->lowerAgent, 'palmsource')
@@ -620,7 +620,7 @@ public function match($userAgent = null, $accept = null)
}
if (str_contains($version[1], '.')) {
- list($this->majorVersion, $this->minorVersion) = explode('.', $version[1]);
+ [$this->majorVersion, $this->minorVersion] = explode('.', $version[1]);
} else {
$this->majorVersion = $version[1];
$this->minorVersion = 0;
@@ -653,7 +653,7 @@ public function match($userAgent = null, $accept = null)
} elseif (preg_match('|Firefox\/([0-9.]+)|', $this->agent, $version)) {
$this->setBrowser('firefox');
- list($this->majorVersion, $this->minorVersion) = explode('.', $version[1]);
+ [$this->majorVersion, $this->minorVersion] = explode('.', $version[1]);
} elseif (preg_match('|Lynx\/([0-9]+)|', $this->agent, $version)) {
$this->setBrowser('lynx');
} elseif (preg_match('|Links \(([0-9]+)|', $this->agent, $version)) {
@@ -683,7 +683,7 @@ public function match($userAgent = null, $accept = null)
} elseif (preg_match('|Mozilla\/([0-9.]+)|', $this->agent, $version)) {
$this->setBrowser('mozilla');
- list($this->majorVersion, $this->minorVersion) = explode('.', $version[1]);
+ [$this->majorVersion, $this->minorVersion] = explode('.', $version[1]);
}
}
}
@@ -733,7 +733,7 @@ public function getPlatform()
protected function identifyBrowserVersion()
{
if (preg_match('|Version[/ ]([0-9.]+)|', $this->agent, $version)) {
- list($this->majorVersion, $this->minorVersion) = explode('.', $version[1]);
+ [$this->majorVersion, $this->minorVersion] = explode('.', $version[1]);
return;
}
@@ -848,8 +848,8 @@ public function getHTTPProtocol()
*/
public function isViewable($mimetype)
{
- $mimetype = strtolower($mimetype);
- list($type, $subtype) = explode('/', $mimetype);
+ $mimetype = strtolower($mimetype);
+ [$type, $subtype] = explode('/', $mimetype);
if (!empty($this->accept)) {
$wildcard_match = false;
diff --git a/libraries/src/Extension/ExtensionHelper.php b/libraries/src/Extension/ExtensionHelper.php
index f17b506296849..db4523844ab91 100644
--- a/libraries/src/Extension/ExtensionHelper.php
+++ b/libraries/src/Extension/ExtensionHelper.php
@@ -206,6 +206,7 @@ class ExtensionHelper
// Core plugin extensions - extension
['plugin', 'joomla', 'extension', 0],
+ ['plugin', 'joomlaupdate', 'extension', 0],
['plugin', 'namespacemap', 'extension', 0],
['plugin', 'finder', 'extension', 0],
diff --git a/libraries/src/Extension/ExtensionManagerTrait.php b/libraries/src/Extension/ExtensionManagerTrait.php
index fe2acdcdd20e0..d2ab3f2815335 100644
--- a/libraries/src/Extension/ExtensionManagerTrait.php
+++ b/libraries/src/Extension/ExtensionManagerTrait.php
@@ -156,7 +156,7 @@ private function loadExtension($type, $extensionName, $extensionPath)
$container->set($type, new Module(new ModuleDispatcherFactory(''), new HelperFactory('')));
break;
case PluginInterface::class:
- list($pluginName, $pluginType) = explode(':', $extensionName);
+ [$pluginName, $pluginType] = explode(':', $extensionName);
$container->set($type, $this->loadPluginFromFilesystem($pluginName, $pluginType));
}
}
diff --git a/libraries/src/Extension/PluginInterface.php b/libraries/src/Extension/PluginInterface.php
index 55baeb78188ed..9ac414a7d869c 100644
--- a/libraries/src/Extension/PluginInterface.php
+++ b/libraries/src/Extension/PluginInterface.php
@@ -19,6 +19,8 @@
* Access to plugin specific services.
*
* @since 4.0.0
+ *
+ * @TODO Starting from 7.0 the class will no longer extend DispatcherAwareInterface
*/
interface PluginInterface extends DispatcherAwareInterface
{
diff --git a/libraries/src/Filter/InputFilter.php b/libraries/src/Filter/InputFilter.php
index 14ad681b0cf3f..28449fc60edd9 100644
--- a/libraries/src/Filter/InputFilter.php
+++ b/libraries/src/Filter/InputFilter.php
@@ -218,7 +218,7 @@ public static function isSafeFile($file, $options = [])
// Make sure we can scan nested file descriptors
$descriptors = $file;
- if (isset($file['name']) && isset($file['tmp_name'])) {
+ if (isset($file['name'], $file['tmp_name'])) {
$descriptors = static::decodeFileData(
[
$file['name'],
diff --git a/libraries/src/Form/Field/ChromestyleField.php b/libraries/src/Form/Field/ChromestyleField.php
index ad945d5e7ced0..0d446326f76c2 100644
--- a/libraries/src/Form/Field/ChromestyleField.php
+++ b/libraries/src/Form/Field/ChromestyleField.php
@@ -155,8 +155,6 @@ protected function getGroups()
}
}
- reset($groups);
-
return $groups;
}
diff --git a/libraries/src/Form/Field/GroupedlistField.php b/libraries/src/Form/Field/GroupedlistField.php
index 9cf88ba6e76f8..2b39a99f2d6ae 100644
--- a/libraries/src/Form/Field/GroupedlistField.php
+++ b/libraries/src/Form/Field/GroupedlistField.php
@@ -142,8 +142,6 @@ protected function getGroups()
}
}
- reset($groups);
-
return $groups;
}
diff --git a/libraries/src/Form/Field/HeadertagField.php b/libraries/src/Form/Field/HeadertagField.php
index ec3107cd6db3b..951e0ac513429 100644
--- a/libraries/src/Form/Field/HeadertagField.php
+++ b/libraries/src/Form/Field/HeadertagField.php
@@ -48,8 +48,6 @@ protected function getOptions()
$options[] = $tmp;
}
- reset($options);
-
return $options;
}
}
diff --git a/libraries/src/Form/Field/ListField.php b/libraries/src/Form/Field/ListField.php
index 4372a9b9f6296..138d89f4005bb 100644
--- a/libraries/src/Form/Field/ListField.php
+++ b/libraries/src/Form/Field/ListField.php
@@ -208,8 +208,6 @@ protected function getOptions()
array_unshift($options, $tmp);
}
- reset($options);
-
return $options;
}
diff --git a/libraries/src/Form/Field/ModuletagField.php b/libraries/src/Form/Field/ModuletagField.php
index 9257d6a620d4c..a5431ae34d3bf 100644
--- a/libraries/src/Form/Field/ModuletagField.php
+++ b/libraries/src/Form/Field/ModuletagField.php
@@ -48,8 +48,6 @@ protected function getOptions()
$options[] = $tmp;
}
- reset($options);
-
return $options;
}
}
diff --git a/libraries/src/Form/Field/TimezoneField.php b/libraries/src/Form/Field/TimezoneField.php
index 1bddb7d57ef68..e99279a4ca2a7 100644
--- a/libraries/src/Form/Field/TimezoneField.php
+++ b/libraries/src/Form/Field/TimezoneField.php
@@ -133,7 +133,7 @@ protected function getGroups()
}
// Get the group/locale from the timezone.
- list($group, $locale) = explode('/', $zone, 2);
+ [$group, $locale] = explode('/', $zone, 2);
// Only use known groups.
if (\in_array($group, self::$zones)) {
diff --git a/libraries/src/Form/Form.php b/libraries/src/Form/Form.php
index 5d7f949ef449c..db61578b72694 100644
--- a/libraries/src/Form/Form.php
+++ b/libraries/src/Form/Form.php
@@ -1466,7 +1466,7 @@ protected function loadField($element, $group = null, $value = null)
try {
$field->setDatabase($this->getDatabase());
} catch (DatabaseNotFoundException) {
- @trigger_error(\sprintf('Database must be set, this will not be caught anymore in 5.0.'), E_USER_DEPRECATED);
+ @trigger_error('Database must be set, this will not be caught anymore in 5.0.', E_USER_DEPRECATED);
$field->setDatabase(Factory::getContainer()->get(DatabaseInterface::class));
}
}
diff --git a/libraries/src/Form/FormField.php b/libraries/src/Form/FormField.php
index 7e369ad7fe344..ae60376c7af0c 100644
--- a/libraries/src/Form/FormField.php
+++ b/libraries/src/Form/FormField.php
@@ -1218,7 +1218,7 @@ public function validate($value, $group = null, ?Registry $input = null)
try {
$rule->setDatabase($this->getDatabase());
} catch (DatabaseNotFoundException) {
- @trigger_error(\sprintf('Database must be set, this will not be caught anymore in 5.0.'), E_USER_DEPRECATED);
+ @trigger_error('Database must be set, this will not be caught anymore in 5.0.', E_USER_DEPRECATED);
$rule->setDatabase(Factory::getContainer()->get(DatabaseInterface::class));
}
}
@@ -1243,7 +1243,7 @@ public function validate($value, $group = null, ?Registry $input = null)
try {
$rule->setDatabase($this->getDatabase());
} catch (DatabaseNotFoundException) {
- @trigger_error(\sprintf('Database must be set, this will not be caught anymore in 5.0.'), E_USER_DEPRECATED);
+ @trigger_error('Database must be set, this will not be caught anymore in 5.0.', E_USER_DEPRECATED);
$rule->setDatabase(Factory::getContainer()->get(DatabaseInterface::class));
}
}
diff --git a/libraries/src/Form/FormHelper.php b/libraries/src/Form/FormHelper.php
index 749899d8c782d..a860ffddc3074 100644
--- a/libraries/src/Form/FormHelper.php
+++ b/libraries/src/Form/FormHelper.php
@@ -213,8 +213,8 @@ protected static function loadClass($entity, $type)
$subPrefix = '';
if (strpos($name, '.')) {
- list($subPrefix, $name) = explode('.', $name);
- $subPrefix = ucfirst($subPrefix) . '\\';
+ [$subPrefix, $name] = explode('.', $name);
+ $subPrefix = ucfirst($subPrefix) . '\\';
}
// Compile the classname
@@ -229,7 +229,7 @@ protected static function loadClass($entity, $type)
$prefix = 'J';
if (strpos($type, '.')) {
- list($prefix, $type) = explode('.', $type);
+ [$prefix, $type] = explode('.', $type);
}
$class = StringHelper::ucfirst($prefix, '_') . 'Form' . StringHelper::ucfirst($entity, '_') . StringHelper::ucfirst($type, '_');
diff --git a/libraries/src/Form/Rule/TimeRule.php b/libraries/src/Form/Rule/TimeRule.php
index 69b3be2871ac9..e09293065a518 100644
--- a/libraries/src/Form/Rule/TimeRule.php
+++ b/libraries/src/Form/Rule/TimeRule.php
@@ -86,7 +86,7 @@ public function test(\SimpleXMLElement $element, $value, $group = null, ?Registr
}
// If min and max is set
- if (isset($element['min']) && isset($element['max'])) {
+ if (isset($element['min'], $element['max'])) {
$min = $element['min'][0] . $element['min'][1];
$max = $element['max'][0] . $element['max'][1];
diff --git a/libraries/src/HTML/HTMLHelper.php b/libraries/src/HTML/HTMLHelper.php
index 5d02e65bbf4fa..dbcf82efbec7d 100644
--- a/libraries/src/HTML/HTMLHelper.php
+++ b/libraries/src/HTML/HTMLHelper.php
@@ -124,7 +124,7 @@ protected static function extract($key)
*/
final public static function _(string $key, ...$methodArgs)
{
- list($key, $prefix, $file, $func) = static::extract($key);
+ [$key, $prefix, $file, $func] = static::extract($key);
if (\array_key_exists($key, static::$registry)) {
$function = static::$registry[$key];
@@ -215,7 +215,7 @@ public static function register($key, callable $function)
E_USER_DEPRECATED
);
- list($key) = static::extract($key);
+ [$key] = static::extract($key);
static::$registry[$key] = $function;
@@ -240,7 +240,7 @@ public static function unregister($key)
E_USER_DEPRECATED
);
- list($key) = static::extract($key);
+ [$key] = static::extract($key);
if (isset(static::$registry[$key])) {
unset(static::$registry[$key]);
@@ -262,7 +262,7 @@ public static function unregister($key)
*/
public static function isRegistered($key)
{
- list($key) = static::extract($key);
+ [$key] = static::extract($key);
return isset(static::$registry[$key]);
}
@@ -480,12 +480,12 @@ protected static function includeRelativeFiles($folder, $file, $relative, $detec
// If the file contains any /: it can be in a media extension subfolder
if (strpos($file, '/')) {
// Divide the file extracting the extension as the first part before /
- list($extension, $file) = explode('/', $file, 2);
+ [$extension, $file] = explode('/', $file, 2);
// If the file yet contains any /: it can be a plugin
if (strpos($file, '/')) {
// Divide the file extracting the element as the first part before /
- list($element, $file) = explode('/', $file, 2);
+ [$element, $file] = explode('/', $file, 2);
// Try to deal with plugins group in the media folder
$found = static::addFileToBuffer(JPATH_PUBLIC . "/media/$extension/$element/$folder/$file", $ext, $debugMode);
@@ -761,8 +761,8 @@ public static function image($file, $alt, $attribs = null, $relative = false, $r
}
// Set the attribute
- list($key, $value) = explode('=', $attribute);
- $attributes[$key] = trim($value, '"');
+ [$key, $value] = explode('=', $attribute);
+ $attributes[$key] = trim($value, '"');
}
// Add the attributes from the string to the original attributes
@@ -1038,7 +1038,7 @@ public static function tooltipText($title = '', $content = '', $translate = true
if ($content !== '' || $title !== '') {
// Split title into title and content if the title contains '::' (old Mootools format).
if ($content === '' && !(!str_contains($title, '::'))) {
- list($title, $content) = explode('::', $title, 2);
+ [$title, $content] = explode('::', $title, 2);
}
// Pass texts through Text if required.
diff --git a/libraries/src/HTML/Helpers/Bootstrap.php b/libraries/src/HTML/Helpers/Bootstrap.php
index 2a603cdc6ec74..b9bc8c07d1e76 100644
--- a/libraries/src/HTML/Helpers/Bootstrap.php
+++ b/libraries/src/HTML/Helpers/Bootstrap.php
@@ -125,35 +125,66 @@ public static function button($selector = ''): void
*
* Options for the carousel can be:
* - interval number 5000 The amount of time to delay between automatically cycling an item.
- * If false, carousel will not automatically cycle.
* - keyboard boolean true Whether the carousel should react to keyboard events.
- * - pause string| hover Pauses the cycling of the carousel on mouseenter and resumes the cycling
- * boolean of the carousel on mouseleave.
- * - slide string| false Autoplays the carousel after the user manually cycles the first item.
- * boolean If "carousel", autoplays the carousel on load.
+ * - pause string| hover If set to "hover", pauses the cycling of the carousel on mouseenter and resumes the
+ * boolean cycling of the carousel on mouseleave. If set to false, hovering over the carousel won’t
+ * pause it. On touch-enabled devices, when set to "hover", cycling will pause on touchend
+ * (once the user finished interacting with the carousel) for two intervals, before
+ * automatically resuming. This is in addition to the mouse behavior.
+ * - ride string| false If set to true, autoplays the carousel after the user manually cycles the first item. If set
+ * boolean to "carousel", autoplays the carousel on load.
+ * - touch boolean true Whether the carousel should support left/right swipe interactions on touchscreen devices.
+ * - wrap boolean true Whether the carousel should cycle continuously or have hard stops.
*/
public static function carousel($selector = '', $params = []): void
{
- // Only load once
if (!empty(static::$loaded[__METHOD__][$selector])) {
return;
}
if ($selector !== '') {
- // Setup options object
- $opt = [
- 'interval' => (int) ($params['interval'] ?? 5000),
- 'keyboard' => (bool) ($params['keyboard'] ?? true),
- 'pause' => $params['pause'] ?? 'hover',
- 'slide' => (bool) ($params['slide'] ?? false),
- 'wrap' => (bool) ($params['wrap'] ?? true),
- 'touch' => (bool) ($params['touch'] ?? true),
- ];
+ $opt['interval'] = 5000;
+
+ if (isset($params['interval']) && is_numeric($params['interval'])) {
+ $opt['interval'] = (int) $params['interval'];
+ }
+
+ $opt['keyboard'] = true;
+
+ if (isset($params['keyboard']) && \is_bool($params['keyboard'])) {
+ $opt['keyboard'] = $params['keyboard'];
+ }
+
+ $opt['pause'] = 'hover';
+
+ if (isset($params['pause']) && \in_array($params['pause'], ['hover', false], true)) {
+ $opt['pause'] = $params['pause'];
+ }
+
+ $opt['ride'] = false;
+
+ if (isset($params['ride']) && \in_array($params['ride'], ['carousel', true, false], true)) {
+ $opt['ride'] = $params['ride'];
+ }
+
+ $opt['touch'] = true;
- Factory::getDocument()->addScriptOptions('bootstrap.carousel', [$selector => (object) array_filter($opt)]);
+ if (isset($params['touch']) && \is_bool($params['touch'])) {
+ $opt['touch'] = $params['touch'];
+ }
+
+ $opt['wrap'] = true;
+
+ if (isset($params['wrap']) && \is_bool($params['wrap'])) {
+ $opt['wrap'] = $params['wrap'];
+ }
+
+ Factory::getApplication()->getDocument()->addScriptOptions(
+ 'bootstrap.carousel',
+ [$selector => (object) $opt]
+ );
}
- // Include the Bootstrap component
Factory::getApplication()
->getDocument()
->getWebAssetManager()
diff --git a/libraries/src/HTML/Helpers/Number.php b/libraries/src/HTML/Helpers/Number.php
index 0814e47eba685..edc1ffdf2ea5c 100644
--- a/libraries/src/HTML/Helpers/Number.php
+++ b/libraries/src/HTML/Helpers/Number.php
@@ -55,7 +55,7 @@ public static function bytes($bytes, $unit = 'auto', $precision = 2, $iec = fals
$oBytes = $bytes;
} else {
preg_match('/(.*?)\s?((?:[KMGTPEZY]i?)?B?)$/i', trim($bytes), $matches);
- list(, $oBytes, $oUnit) = $matches;
+ [, $oBytes, $oUnit] = $matches;
if ($oUnit && is_numeric($oBytes)) {
$oBase = $iec && !str_contains($oUnit, 'i') ? 1000 : 1024;
diff --git a/libraries/src/HTML/Helpers/Select.php b/libraries/src/HTML/Helpers/Select.php
index 0a6993e01be2d..dc51a186385f3 100644
--- a/libraries/src/HTML/Helpers/Select.php
+++ b/libraries/src/HTML/Helpers/Select.php
@@ -244,7 +244,7 @@ public static function groupedlist($data, $name, $options = [])
$noGroup = false;
}
- if (isset($options['group.id']) && isset($group[$options['group.id']])) {
+ if (isset($options['group.id'], $group[$options['group.id']])) {
$id = $group[$options['group.id']];
$noGroup = false;
}
@@ -257,7 +257,7 @@ public static function groupedlist($data, $name, $options = [])
$noGroup = false;
}
- if (isset($options['group.id']) && isset($group->{$options['group.id']})) {
+ if (isset($options['group.id'], $group->{$options['group.id']})) {
$id = $group->{$options['group.id']};
$noGroup = false;
}
diff --git a/libraries/src/Helper/UserGroupsHelper.php b/libraries/src/Helper/UserGroupsHelper.php
index 40a7cc98554df..13693231dc7f1 100644
--- a/libraries/src/Helper/UserGroupsHelper.php
+++ b/libraries/src/Helper/UserGroupsHelper.php
@@ -171,7 +171,7 @@ public function getAll()
*/
public function has($id)
{
- return (\array_key_exists($id, $this->groups) && $this->groups[$id] !== false);
+ return \array_key_exists($id, $this->groups) && $this->groups[$id] !== false;
}
/**
diff --git a/libraries/src/Image/Image.php b/libraries/src/Image/Image.php
index ae75155449c30..a00cf57bfe0dd 100644
--- a/libraries/src/Image/Image.php
+++ b/libraries/src/Image/Image.php
@@ -225,10 +225,10 @@ public function getOrientation()
private static function getOrientationString(int $width, int $height): string
{
switch (true) {
- case ($width > $height):
+ case $width > $height:
return self::ORIENTATION_LANDSCAPE;
- case ($width < $height):
+ case $width < $height:
return self::ORIENTATION_PORTRAIT;
default:
diff --git a/libraries/src/Input/Cli.php b/libraries/src/Input/Cli.php
index fed26dc34dda8..445ba54d2e4e7 100644
--- a/libraries/src/Input/Cli.php
+++ b/libraries/src/Input/Cli.php
@@ -91,8 +91,7 @@ public function serialize()
// Remove $_ENV and $_SERVER from the inputs.
$inputs = $this->inputs;
- unset($inputs['env']);
- unset($inputs['server']);
+ unset($inputs['env'], $inputs['server']);
// Serialize the executable, args, options, data, and inputs.
return serialize([$this->executable, $this->args, $this->options, $this->data, $inputs]);
@@ -113,7 +112,7 @@ public function serialize()
public function unserialize($input)
{
// Unserialize the executable, args, options, data, and inputs.
- list($this->executable, $this->args, $this->options, $this->data, $this->inputs) = unserialize($input);
+ [$this->executable, $this->args, $this->options, $this->data, $this->inputs] = unserialize($input);
// Load the filter.
if (isset($this->options['filter'])) {
diff --git a/libraries/src/Input/Input.php b/libraries/src/Input/Input.php
index e3f5544d32ae5..edead02752de0 100644
--- a/libraries/src/Input/Input.php
+++ b/libraries/src/Input/Input.php
@@ -210,7 +210,7 @@ protected function getArrayRecursive(array $vars = [], $datasource = null, $defa
public function unserialize($input)
{
// Unserialize the options, data, and inputs.
- list($this->options, $this->data, $this->inputs) = unserialize($input);
+ [$this->options, $this->data, $this->inputs] = unserialize($input);
// Load the filter.
if (isset($this->options['filter'])) {
diff --git a/libraries/src/Installer/Manifest/LibraryManifest.php b/libraries/src/Installer/Manifest/LibraryManifest.php
index 8851de89cf55e..e28847bbd799a 100644
--- a/libraries/src/Installer/Manifest/LibraryManifest.php
+++ b/libraries/src/Installer/Manifest/LibraryManifest.php
@@ -109,7 +109,7 @@ protected function loadManifestFromData(\SimpleXMLElement $xml)
$this->packagerurl = (string) $xml->packagerurl;
$this->update = (string) $xml->update;
- if (isset($xml->files) && isset($xml->files->file) && \count($xml->files->file)) {
+ if (isset($xml->files, $xml->files->file) && \count($xml->files->file)) {
foreach ($xml->files->file as $file) {
$this->filelist[] = (string) $file;
}
diff --git a/libraries/src/MVC/Controller/AdminController.php b/libraries/src/MVC/Controller/AdminController.php
index 30ec59d7c0b96..a831e46600fad 100644
--- a/libraries/src/MVC/Controller/AdminController.php
+++ b/libraries/src/MVC/Controller/AdminController.php
@@ -307,8 +307,7 @@ public function saveorder()
// Remove zero PKs and corresponding order values resulting from input filter for PK
foreach ($pks as $i => $pk) {
if ($pk === 0) {
- unset($pks[$i]);
- unset($order[$i]);
+ unset($pks[$i], $order[$i]);
}
}
@@ -402,8 +401,7 @@ public function saveOrderAjax()
// Remove zero PKs and corresponding order values resulting from input filter for PK
foreach ($pks as $i => $pk) {
if ($pk === 0) {
- unset($pks[$i]);
- unset($order[$i]);
+ unset($pks[$i], $order[$i]);
}
}
diff --git a/libraries/src/MVC/Controller/BaseController.php b/libraries/src/MVC/Controller/BaseController.php
index 00117553d08f1..2ad02cc2eb192 100644
--- a/libraries/src/MVC/Controller/BaseController.php
+++ b/libraries/src/MVC/Controller/BaseController.php
@@ -302,7 +302,7 @@ public static function getInstance($prefix, $config = [])
// Check for a controller.task command.
if (str_contains($command, '.')) {
// Explode the controller.task command.
- list($type, $task) = explode('.', $command);
+ [$type, $task] = explode('.', $command);
// Define the controller filename and path.
$file = self::createFileName('controller', ['name' => $type, 'format' => $format]);
diff --git a/libraries/src/MVC/Factory/MVCFactory.php b/libraries/src/MVC/Factory/MVCFactory.php
index 35fe905b69ee0..b21b3a1021f54 100644
--- a/libraries/src/MVC/Factory/MVCFactory.php
+++ b/libraries/src/MVC/Factory/MVCFactory.php
@@ -171,7 +171,7 @@ public function createModel($name, $prefix = '', array $config = [])
try {
$model->setDatabase($this->getDatabase());
} catch (DatabaseNotFoundException) {
- @trigger_error(\sprintf('Database must be set, this will not be caught anymore in 5.0.'), E_USER_DEPRECATED);
+ @trigger_error('Database must be set, this will not be caught anymore in 5.0.', E_USER_DEPRECATED);
$model->setDatabase(Factory::getContainer()->get(DatabaseInterface::class));
}
}
@@ -267,7 +267,7 @@ public function createTable($name, $prefix = '', array $config = [])
try {
$db = \array_key_exists('dbo', $config) ? $config['dbo'] : $this->getDatabase();
} catch (DatabaseNotFoundException) {
- @trigger_error(\sprintf('Database must be set, this will not be caught anymore in 5.0.'), E_USER_DEPRECATED);
+ @trigger_error('Database must be set, this will not be caught anymore in 5.0.', E_USER_DEPRECATED);
$db = Factory::getContainer()->get(DatabaseInterface::class);
}
diff --git a/libraries/src/MVC/Model/BaseDatabaseModel.php b/libraries/src/MVC/Model/BaseDatabaseModel.php
index e7dbc8e27dfa2..1970f16a1e26c 100644
--- a/libraries/src/MVC/Model/BaseDatabaseModel.php
+++ b/libraries/src/MVC/Model/BaseDatabaseModel.php
@@ -105,7 +105,7 @@ public function __construct($config = [], ?MVCFactoryInterface $factory = null)
$db = \array_key_exists('dbo', $config) ? $config['dbo'] : Factory::getDbo();
if ($db) {
- @trigger_error(\sprintf('Database is not available in constructor in 6.0.'), E_USER_DEPRECATED);
+ @trigger_error('Database is not available in constructor in 6.0.', E_USER_DEPRECATED);
$this->setDatabase($db);
// Is needed, when models use the deprecated MVC DatabaseAwareTrait, as the trait is overriding the local functions
diff --git a/libraries/src/MVC/Model/FormModel.php b/libraries/src/MVC/Model/FormModel.php
index c08d362d68f9d..8291f3061a573 100644
--- a/libraries/src/MVC/Model/FormModel.php
+++ b/libraries/src/MVC/Model/FormModel.php
@@ -200,7 +200,7 @@ public function validate($form, $data, $group = null)
if (!empty($dispatcher->getListeners('onUserBeforeDataValidation'))) {
@trigger_error(
'The `onUserBeforeDataValidation` event is deprecated and will be removed in 6.0.'
- . 'Use the `onContentValidateData` event instead.',
+ . 'Use the `onContentBeforeValidateData` event instead.',
E_USER_DEPRECATED
);
diff --git a/libraries/src/MVC/View/JsonApiView.php b/libraries/src/MVC/View/JsonApiView.php
index a288e5fc90b40..1350a765968d0 100644
--- a/libraries/src/MVC/View/JsonApiView.php
+++ b/libraries/src/MVC/View/JsonApiView.php
@@ -215,7 +215,7 @@ public function displayItem($item = null)
$item = $this->prepareItem($model->getItem());
}
- if ($item->id === null) {
+ if (!$item || $item->id === null) {
throw new RouteNotFoundException('Item does not exist');
}
diff --git a/libraries/src/MVC/View/ListView.php b/libraries/src/MVC/View/ListView.php
index e5b6d0dc91bb3..e36f955f986dc 100644
--- a/libraries/src/MVC/View/ListView.php
+++ b/libraries/src/MVC/View/ListView.php
@@ -13,7 +13,6 @@
use Joomla\CMS\HTML\HTMLHelper;
use Joomla\CMS\Language\Text;
use Joomla\CMS\Layout\FileLayout;
-use Joomla\CMS\Toolbar\Toolbar;
use Joomla\CMS\Toolbar\ToolbarHelper;
use Joomla\Registry\Registry;
diff --git a/libraries/src/Mail/MailTemplate.php b/libraries/src/Mail/MailTemplate.php
index c718d1daac197..2961eb222d590 100644
--- a/libraries/src/Mail/MailTemplate.php
+++ b/libraries/src/Mail/MailTemplate.php
@@ -333,6 +333,7 @@ public function send()
$this->addLayoutTemplateData([
'siteName' => $app->get('sitename'),
'lang' => substr($this->language, 0, 2),
+ 'mail' => $mail,
]);
$layout = $config->get('mail_htmllayout', 'mailtemplate');
diff --git a/libraries/src/Menu/SiteMenu.php b/libraries/src/Menu/SiteMenu.php
index 8abedbe60af73..f99f6015006e8 100644
--- a/libraries/src/Menu/SiteMenu.php
+++ b/libraries/src/Menu/SiteMenu.php
@@ -72,7 +72,7 @@ public function __construct($options = [])
$this->language = isset($options['language']) && $options['language'] instanceof Language ? $options['language'] : Factory::getLanguage();
if (!isset($options['db']) || !($options['db'] instanceof DatabaseDriver)) {
- @trigger_error(\sprintf('Database will be mandatory in 5.0.'), E_USER_DEPRECATED);
+ @trigger_error('Database will be mandatory in 5.0.', E_USER_DEPRECATED);
$options['db'] = Factory::getContainer()->get(DatabaseDriver::class);
}
diff --git a/libraries/src/Plugin/CMSPlugin.php b/libraries/src/Plugin/CMSPlugin.php
index 8b373a758c319..37a93a302106d 100644
--- a/libraries/src/Plugin/CMSPlugin.php
+++ b/libraries/src/Plugin/CMSPlugin.php
@@ -14,6 +14,7 @@
use Joomla\CMS\Event\Result\ResultAwareInterface;
use Joomla\CMS\Extension\PluginInterface;
use Joomla\CMS\Factory;
+use Joomla\CMS\Language\Language;
use Joomla\CMS\Language\LanguageAwareInterface;
use Joomla\CMS\Language\LanguageAwareTrait;
use Joomla\Event\AbstractEvent;
@@ -32,11 +33,19 @@
* Plugin Class
*
* @since 1.5
+ *
+ * @TODO Starting from 7.0 the class will no longer implement DispatcherAwareInterface and LanguageAwareInterface
*/
abstract class CMSPlugin implements DispatcherAwareInterface, PluginInterface, LanguageAwareInterface
{
- use DispatcherAwareTrait;
- use LanguageAwareTrait;
+ use DispatcherAwareTrait {
+ setDispatcher as traitSetDispatcher;
+ getDispatcher as traitGetDispatcher;
+ }
+ use LanguageAwareTrait {
+ setLanguage as traitSetLanguage;
+ getLanguage as traitGetLanguage;
+ }
/**
* A Registry object holding the parameters for the plugin
@@ -101,15 +110,31 @@ abstract class CMSPlugin implements DispatcherAwareInterface, PluginInterface, L
/**
* Constructor
*
- * @param DispatcherInterface $dispatcher The event dispatcher
- * @param array $config An optional associative array of configuration settings.
- * Recognized key values include 'name', 'group', 'params', 'language'
- * (this list is not meant to be comprehensive).
+ * @param array $config An optional associative array of configuration settings.
+ * Recognized key values include 'name', 'group', 'params', 'language'
+ * (this list is not meant to be comprehensive).
*
* @since 1.5
*/
- public function __construct(DispatcherInterface $dispatcher, array $config = [])
+ public function __construct($config = [])
{
+ if ($config instanceof DispatcherInterface) {
+ @trigger_error(
+ \sprintf(
+ 'Passing an instance of %1$s to %2$s() will not be supported in 7.0. '
+ . 'Starting from 7.0 CMSPlugin class will no longer implement DispatcherAwareInterface.',
+ DispatcherInterface::class,
+ __METHOD__
+ ),
+ \E_USER_DEPRECATED
+ );
+
+ // Set the dispatcher we are to register our listeners with
+ $this->setDispatcher($config);
+
+ $config = \func_num_args() > 1 ? func_get_arg(1) : [];
+ }
+
// Get the parameters.
if (isset($config['params'])) {
if ($config['params'] instanceof Registry) {
@@ -153,9 +178,6 @@ public function __construct(DispatcherInterface $dispatcher, array $config = [])
$this->db = Factory::getDbo();
}
}
-
- // Set the dispatcher we are to register our listeners with
- $this->setDispatcher($dispatcher);
}
/**
@@ -390,4 +412,83 @@ public function setApplication(CMSApplicationInterface $application): void
$this->setLanguage($application->getLanguage());
}
}
+
+ /**
+ * Set the language to use.
+ *
+ * @param Language $language The language to use
+ *
+ * @return void
+ *
+ * @since 5.3.0
+ *
+ * @deprecated 5.2 will be removed in 7.0
+ * Plugin should use the language from Application, and only after the app is initialised
+ */
+ public function setLanguage(Language $language): void
+ {
+ $this->traitSetLanguage($language);
+ }
+
+ /**
+ * Get the Language.
+ *
+ * @return Language
+ *
+ * @throws \UnexpectedValueException May be thrown if the language has not been set.
+ *
+ * @since 5.3.0
+ *
+ * @deprecated 5.2 will be removed in 7.0
+ * Plugin should use the language from Application, and only after the app is initialised.
+ */
+ protected function getLanguage(): Language
+ {
+ @trigger_error(
+ __CLASS__ . ': Use of LanguageAwareInterface over CMSPlugin will be removed in 7.0.',
+ \E_USER_DEPRECATED
+ );
+
+ return $this->traitGetLanguage();
+ }
+
+ /**
+ * Set the dispatcher to use.
+ *
+ * @param DispatcherInterface $dispatcher The dispatcher to use.
+ *
+ * @return $this
+ *
+ * @since 5.3.0
+ *
+ * @deprecated 5.2 will be removed in 7.0
+ * Plugin should implement DispatcherAwareInterface on its own, when it is needed.
+ */
+ public function setDispatcher(DispatcherInterface $dispatcher)
+ {
+ @trigger_error(
+ __CLASS__ . ': Use of DispatcherAwareInterface over CMSPlugin will be removed in 7.0.'
+ . ' Plugin should implement DispatcherAwareInterface on its own, when it is needed.',
+ \E_USER_DEPRECATED
+ );
+
+ return $this->traitSetDispatcher($dispatcher);
+ }
+
+ /**
+ * Get the event dispatcher.
+ *
+ * @return DispatcherInterface
+ *
+ * @throws \UnexpectedValueException May be thrown if the dispatcher has not been set.
+ *
+ * @since 5.3.0
+ *
+ * @deprecated 5.2 will be removed in 7.0
+ * Plugin should implement DispatcherAwareInterface on its own, when it is needed.
+ */
+ public function getDispatcher()
+ {
+ return $this->traitGetDispatcher();
+ }
}
diff --git a/libraries/src/Response/JsonResponse.php b/libraries/src/Response/JsonResponse.php
index 2b7d470361daf..975df65b441f7 100644
--- a/libraries/src/Response/JsonResponse.php
+++ b/libraries/src/Response/JsonResponse.php
@@ -85,7 +85,7 @@ public function __construct($response = null, $message = null, $error = false, $
// Build the sorted messages list
if (\is_array($messages) && \count($messages)) {
foreach ($messages as $message) {
- if (isset($message['type']) && isset($message['message'])) {
+ if (isset($message['type'], $message['message'])) {
$lists[$message['type']][] = $message['message'];
}
}
diff --git a/libraries/src/Router/Router.php b/libraries/src/Router/Router.php
index 56d02ecfb931d..ff60e790c33dc 100644
--- a/libraries/src/Router/Router.php
+++ b/libraries/src/Router/Router.php
@@ -121,15 +121,13 @@ public static function getInstance($client, $options = [])
// Create a Router object
$classname = 'JRouter' . ucfirst($client);
- if (!class_exists($classname)) {
- throw new \RuntimeException(Text::sprintf('JLIB_APPLICATION_ERROR_ROUTER_LOAD', $client), 500);
- }
-
- // Check for a possible service from the container otherwise manually instantiate the class
+ // Check for a possible service from the container, otherwise manually instantiate the class if it exists
if (Factory::getContainer()->has($classname)) {
self::$instances[$client] = Factory::getContainer()->get($classname);
- } else {
+ } elseif (class_exists($classname)) {
self::$instances[$client] = new $classname();
+ } else {
+ throw new \RuntimeException(Text::sprintf('JLIB_APPLICATION_ERROR_ROUTER_LOAD', $client), 500);
}
}
diff --git a/libraries/src/Table/Category.php b/libraries/src/Table/Category.php
index bb23fd1b76f85..6ec3e365319f9 100644
--- a/libraries/src/Table/Category.php
+++ b/libraries/src/Table/Category.php
@@ -172,7 +172,7 @@ public function check()
return false;
}
- $this->alias = trim($this->alias);
+ $this->alias = trim($this->alias ?? '');
if (empty($this->alias)) {
$this->alias = $this->title;
diff --git a/libraries/src/Table/Content.php b/libraries/src/Table/Content.php
index 0b7d15808c63e..ab457b3657b70 100644
--- a/libraries/src/Table/Content.php
+++ b/libraries/src/Table/Content.php
@@ -156,7 +156,7 @@ public function bind($array, $ignore = '')
$this->introtext = $array['articletext'];
$this->fulltext = '';
} else {
- list($this->introtext, $this->fulltext) = preg_split($pattern, $array['articletext'], 2);
+ [$this->introtext, $this->fulltext] = preg_split($pattern, $array['articletext'], 2);
}
}
diff --git a/libraries/src/Table/ContentType.php b/libraries/src/Table/ContentType.php
index d72de3dd52380..06afe016015a9 100644
--- a/libraries/src/Table/ContentType.php
+++ b/libraries/src/Table/ContentType.php
@@ -57,13 +57,13 @@ public function check()
// Check for valid name.
if (trim($this->type_title) === '') {
- throw new \UnexpectedValueException(\sprintf('The title is empty'));
+ throw new \UnexpectedValueException('The title is empty');
}
$this->type_title = ucfirst($this->type_title);
if (empty($this->type_alias)) {
- throw new \UnexpectedValueException(\sprintf('The type_alias is empty'));
+ throw new \UnexpectedValueException('The type_alias is empty');
}
return true;
@@ -143,7 +143,7 @@ public function getContentTable()
$tableInfo = json_decode($this->table);
if (\is_object($tableInfo) && isset($tableInfo->special)) {
- if (\is_object($tableInfo->special) && isset($tableInfo->special->type) && isset($tableInfo->special->prefix)) {
+ if (\is_object($tableInfo->special) && isset($tableInfo->special->type, $tableInfo->special->prefix)) {
$class = $tableInfo->special->class ?? 'Joomla\\CMS\\Table\\Table';
if (!class_implements($class, 'Joomla\\CMS\\Table\\TableInterface')) {
diff --git a/libraries/src/Table/Nested.php b/libraries/src/Table/Nested.php
index 156f5265357a2..858a9cb5858e2 100644
--- a/libraries/src/Table/Nested.php
+++ b/libraries/src/Table/Nested.php
@@ -1556,7 +1556,7 @@ protected function _getNode($id, $key = null)
protected function _getTreeRepositionData($referenceNode, $nodeWidth, $position = 'before')
{
// Make sure the reference an object with a left and right id.
- if (!\is_object($referenceNode) || !(isset($referenceNode->lft) && isset($referenceNode->rgt))) {
+ if (!\is_object($referenceNode) || !(isset($referenceNode->lft, $referenceNode->rgt))) {
return false;
}
diff --git a/libraries/src/Updater/Adapter/CollectionAdapter.php b/libraries/src/Updater/Adapter/CollectionAdapter.php
index 9d03103ea9126..245af85af7213 100644
--- a/libraries/src/Updater/Adapter/CollectionAdapter.php
+++ b/libraries/src/Updater/Adapter/CollectionAdapter.php
@@ -222,8 +222,7 @@ public function findUpdate($options)
}
$this->xmlParser = xml_parser_create('');
- xml_set_object($this->xmlParser, $this);
- xml_set_element_handler($this->xmlParser, '_startElement', '_endElement');
+ xml_set_element_handler($this->xmlParser, [$this, '_startElement'], [$this, '_endElement']);
if (!xml_parse($this->xmlParser, $response->body)) {
// If the URL is missing the .xml extension, try appending it and retry loading the update
diff --git a/libraries/src/Updater/Adapter/ExtensionAdapter.php b/libraries/src/Updater/Adapter/ExtensionAdapter.php
index b112ef432c00c..3019c7f6538ad 100644
--- a/libraries/src/Updater/Adapter/ExtensionAdapter.php
+++ b/libraries/src/Updater/Adapter/ExtensionAdapter.php
@@ -280,9 +280,8 @@ public function findUpdate($options)
}
$this->xmlParser = xml_parser_create('');
- xml_set_object($this->xmlParser, $this);
- xml_set_element_handler($this->xmlParser, '_startElement', '_endElement');
- xml_set_character_data_handler($this->xmlParser, '_characterData');
+ xml_set_element_handler($this->xmlParser, [$this, '_startElement'], [$this, '_endElement']);
+ xml_set_character_data_handler($this->xmlParser, [$this, '_characterData']);
if (!xml_parse($this->xmlParser, $response->body)) {
// If the URL is missing the .xml extension, try appending it and retry loading the update
diff --git a/libraries/src/Updater/Update.php b/libraries/src/Updater/Update.php
index 1780fa1a4f364..76e8f463caa50 100644
--- a/libraries/src/Updater/Update.php
+++ b/libraries/src/Updater/Update.php
@@ -487,8 +487,7 @@ public function _endElement($parser, $name)
$this->$key = $val;
}
- unset($this->latest);
- unset($this->currentUpdate);
+ unset($this->latest, $this->currentUpdate);
} elseif (isset($this->currentUpdate)) {
// The update might be for an older version of j!
unset($this->currentUpdate);
@@ -658,9 +657,8 @@ public function loadFromXml($url, $minimumStability = Updater::STABILITY_STABLE,
$this->channel = $channel;
$this->xmlParser = xml_parser_create('');
- xml_set_object($this->xmlParser, $this);
- xml_set_element_handler($this->xmlParser, '_startElement', '_endElement');
- xml_set_character_data_handler($this->xmlParser, '_characterData');
+ xml_set_element_handler($this->xmlParser, [$this, '_startElement'], [$this, '_endElement']);
+ xml_set_character_data_handler($this->xmlParser, [$this, '_characterData']);
if (!xml_parse($this->xmlParser, $response->body)) {
Log::add(
diff --git a/libraries/src/User/User.php b/libraries/src/User/User.php
index 92bd676677938..a2adcdeb3bc1a 100644
--- a/libraries/src/User/User.php
+++ b/libraries/src/User/User.php
@@ -658,10 +658,12 @@ public function bind(&$array)
}
// Prevent updating internal fields
- unset($array['registerDate']);
- unset($array['lastvisitDate']);
- unset($array['lastResetTime']);
- unset($array['resetCount']);
+ unset(
+ $array['registerDate'],
+ $array['lastvisitDate'],
+ $array['lastResetTime'],
+ $array['resetCount']
+ );
}
if (\array_key_exists('params', $array)) {
@@ -769,6 +771,11 @@ public function save($updateOnly = false)
}
}
+ // Unset the activation token, if the mail address changes - that affects both, activation and PW resets
+ if ($this->email !== $oldUser->email && $this->id !== 0 && !empty($this->activation) && !$this->block) {
+ $table->activation = '';
+ }
+
// Fire the onUserBeforeSave event.
$dispatcher = Factory::getApplication()->getDispatcher();
PluginHelper::importPlugin('user', null, true, $dispatcher);
diff --git a/libraries/src/Version.php b/libraries/src/Version.php
index daa54a91d1320..caaea7f74f0cb 100644
--- a/libraries/src/Version.php
+++ b/libraries/src/Version.php
@@ -55,7 +55,7 @@ final class Version
* @var integer
* @since 3.8.0
*/
- public const PATCH_VERSION = 0;
+ public const PATCH_VERSION = 1;
/**
* Extra release version info.
@@ -66,7 +66,7 @@ final class Version
* @var string
* @since 3.8.0
*/
- public const EXTRA_VERSION = 'beta2-dev';
+ public const EXTRA_VERSION = 'dev';
/**
* Development status.
@@ -90,7 +90,7 @@ final class Version
* @var string
* @since 3.5
*/
- public const RELDATE = '18-February-2025';
+ public const RELDATE = '15-April-2025';
/**
* Release time.
@@ -98,7 +98,7 @@ final class Version
* @var string
* @since 3.5
*/
- public const RELTIME = '17:01';
+ public const RELTIME = '16:01';
/**
* Release timezone.
diff --git a/modules/mod_articles_archive/src/Helper/ArticlesArchiveHelper.php b/modules/mod_articles_archive/src/Helper/ArticlesArchiveHelper.php
index 690b62407cc46..a8fd6be30f6b4 100644
--- a/modules/mod_articles_archive/src/Helper/ArticlesArchiveHelper.php
+++ b/modules/mod_articles_archive/src/Helper/ArticlesArchiveHelper.php
@@ -67,7 +67,7 @@ public function getArticlesByMonths(Registry $moduleParams, SiteApplication $app
try {
$rows = (array) $db->loadObjectList();
- } catch (\RuntimeException $e) {
+ } catch (\RuntimeException) {
$app->enqueueMessage(Text::_('JERROR_AN_ERROR_HAS_OCCURRED'), 'error');
return [];
diff --git a/modules/mod_feed/src/Helper/FeedHelper.php b/modules/mod_feed/src/Helper/FeedHelper.php
index d450085993714..a716ab862962a 100644
--- a/modules/mod_feed/src/Helper/FeedHelper.php
+++ b/modules/mod_feed/src/Helper/FeedHelper.php
@@ -42,7 +42,7 @@ public function getFeedInformation($params)
try {
$feed = new FeedFactory();
$rssDoc = $feed->getFeed($rssurl);
- } catch (\Exception $e) {
+ } catch (\Exception) {
return Text::_('MOD_FEED_ERR_FEED_NOT_RETRIEVED');
}
diff --git a/modules/mod_languages/src/Helper/LanguagesHelper.php b/modules/mod_languages/src/Helper/LanguagesHelper.php
index f4cd09068730b..3b3563ed04889 100644
--- a/modules/mod_languages/src/Helper/LanguagesHelper.php
+++ b/modules/mod_languages/src/Helper/LanguagesHelper.php
@@ -62,14 +62,15 @@ public function getLanguages(&$params)
}
// Load associations
- $assoc = Associations::isEnabled();
+ $assoc = Associations::isEnabled();
+ $option = $app->getInput()->get('option');
+ $associations = [];
- if ($assoc) {
+ if ($assoc && $option) {
if ($active) {
$associations = MenusHelper::getAssociations($active->id);
}
- $option = $app->getInput()->get('option');
$component = $app->bootComponent($option);
if ($component instanceof AssociationServiceInterface) {
diff --git a/modules/mod_related_items/src/Helper/RelatedItemsHelper.php b/modules/mod_related_items/src/Helper/RelatedItemsHelper.php
index 1bbb6cac033ae..1cb33963268c9 100644
--- a/modules/mod_related_items/src/Helper/RelatedItemsHelper.php
+++ b/modules/mod_related_items/src/Helper/RelatedItemsHelper.php
@@ -86,7 +86,7 @@ public function getRelatedArticles(Registry $params, SiteApplication $app): arra
try {
$metakey = trim($db->loadResult());
- } catch (\RuntimeException $e) {
+ } catch (\RuntimeException) {
$app->enqueueMessage(Text::_('JERROR_AN_ERROR_HAS_OCCURRED'), 'error');
return [];
@@ -150,7 +150,7 @@ public function getRelatedArticles(Registry $params, SiteApplication $app): arra
try {
$articleIds = $db->loadColumn();
- } catch (\RuntimeException $e) {
+ } catch (\RuntimeException) {
$app->enqueueMessage(Text::_('JERROR_AN_ERROR_HAS_OCCURRED'), 'error');
return [];
diff --git a/modules/mod_stats/src/Helper/StatsHelper.php b/modules/mod_stats/src/Helper/StatsHelper.php
index 47d5d2479daf4..2abf2eb9261e7 100644
--- a/modules/mod_stats/src/Helper/StatsHelper.php
+++ b/modules/mod_stats/src/Helper/StatsHelper.php
@@ -106,7 +106,7 @@ public function getStats(Registry &$params, CMSApplicationInterface $app)
try {
$items = $db->loadResult();
- } catch (\RuntimeException $e) {
+ } catch (\RuntimeException) {
$items = false;
}
@@ -134,7 +134,7 @@ public function getStats(Registry &$params, CMSApplicationInterface $app)
try {
$hits = $db->loadResult();
- } catch (\RuntimeException $e) {
+ } catch (\RuntimeException) {
$hits = false;
}
@@ -154,7 +154,7 @@ public function getStats(Registry &$params, CMSApplicationInterface $app)
foreach ($arrays as $response) {
foreach ($response as $row) {
// We only add a row if the title and data are given
- if (isset($row['title']) && isset($row['data'])) {
+ if (isset($row['title'], $row['data'])) {
$rows[$i] = new \stdClass();
$rows[$i]->title = $row['title'];
$rows[$i]->icon = $row['icon'] ?? 'info';
diff --git a/modules/mod_tags_similar/src/Helper/TagsSimilarHelper.php b/modules/mod_tags_similar/src/Helper/TagsSimilarHelper.php
index 954b0ed3dd6e2..e5bde10ae20c6 100644
--- a/modules/mod_tags_similar/src/Helper/TagsSimilarHelper.php
+++ b/modules/mod_tags_similar/src/Helper/TagsSimilarHelper.php
@@ -204,7 +204,7 @@ public function getItems(&$params)
try {
$results = $db->loadObjectList();
- } catch (\RuntimeException $e) {
+ } catch (\RuntimeException) {
$results = [];
$app->enqueueMessage(Text::_('JERROR_AN_ERROR_HAS_OCCURRED'), 'error');
}
diff --git a/modules/mod_users_latest/src/Helper/UsersLatestHelper.php b/modules/mod_users_latest/src/Helper/UsersLatestHelper.php
index 84eb29738056a..c32614d7a9598 100644
--- a/modules/mod_users_latest/src/Helper/UsersLatestHelper.php
+++ b/modules/mod_users_latest/src/Helper/UsersLatestHelper.php
@@ -69,7 +69,7 @@ public function getLatestUsers(Registry $params, SiteApplication $app): array
try {
return (array) $db->loadObjectList();
- } catch (\RuntimeException $e) {
+ } catch (\RuntimeException) {
$app->enqueueMessage(Text::_('JERROR_AN_ERROR_HAS_OCCURRED'), 'error');
return [];
diff --git a/modules/mod_whosonline/src/Helper/WhosonlineHelper.php b/modules/mod_whosonline/src/Helper/WhosonlineHelper.php
index caa1e642cb322..84ad110af5f23 100644
--- a/modules/mod_whosonline/src/Helper/WhosonlineHelper.php
+++ b/modules/mod_whosonline/src/Helper/WhosonlineHelper.php
@@ -49,7 +49,7 @@ public static function getOnlineCount()
try {
$sessions = (array) $db->loadObjectList();
- } catch (\RuntimeException $e) {
+ } catch (\RuntimeException) {
$sessions = [];
}
@@ -113,7 +113,7 @@ public static function getOnlineUserNames($params)
try {
return (array) $db->loadObjectList();
- } catch (\RuntimeException $e) {
+ } catch (\RuntimeException) {
return [];
}
}
diff --git a/modules/mod_wrapper/src/Helper/WrapperHelper.php b/modules/mod_wrapper/src/Helper/WrapperHelper.php
index e30aeb56c6ce8..ef57b64d7567b 100644
--- a/modules/mod_wrapper/src/Helper/WrapperHelper.php
+++ b/modules/mod_wrapper/src/Helper/WrapperHelper.php
@@ -52,7 +52,7 @@ public function getParamsWrapper(Registry $params, SiteApplication $app)
if (str_starts_with($url, '/')) {
// Relative URL in component. use server http_host.
$url = 'http://' . $app->getInput()->server->get('HTTP_HOST') . $url;
- } elseif (!str_contains($url, 'http') && !str_contains($url, 'https')) {
+ } elseif (!str_starts_with($url, 'http://') && !str_starts_with($url, 'https://')) {
$url = 'http://' . $url;
}
}
diff --git a/package-lock.json b/package-lock.json
index a91a8a76aa9bc..d0948ccfa5507 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,6 +1,6 @@
{
"name": "joomla",
- "version": "5.3.0",
+ "version": "5.3.1",
"lockfileVersion": 3,
"requires": true,
"packages": {
@@ -11,21 +11,21 @@
"license": "GPL-2.0-or-later",
"dependencies": {
"@claviska/jquery-minicolors": "^2.3.6",
- "@codemirror/autocomplete": "^6.18.4",
+ "@codemirror/autocomplete": "^6.18.6",
"@codemirror/commands": "^6.8.0",
"@codemirror/lang-css": "^6.3.1",
"@codemirror/lang-html": "^6.4.9",
- "@codemirror/lang-javascript": "^6.2.2",
+ "@codemirror/lang-javascript": "^6.2.3",
"@codemirror/lang-json": "^6.0.1",
"@codemirror/lang-markdown": "^6.3.2",
"@codemirror/lang-php": "^6.0.1",
"@codemirror/lang-xml": "^6.1.0",
- "@codemirror/language": "^6.10.8",
+ "@codemirror/language": "^6.11.0",
"@codemirror/lint": "^6.8.4",
- "@codemirror/search": "^6.5.8",
+ "@codemirror/search": "^6.5.10",
"@codemirror/state": "^6.5.2",
"@codemirror/theme-one-dark": "^6.1.2",
- "@codemirror/view": "^6.36.2",
+ "@codemirror/view": "^6.36.4",
"@fortawesome/fontawesome-free": "^6.7.2",
"@popperjs/core": "^2.11.8",
"@webcomponents/webcomponentsjs": "^2.8.0",
@@ -41,7 +41,7 @@
"es-module-shims": "^1.10.1",
"focus-visible": "^5.2.1",
"hotkeys-js": "^3.13.9",
- "joomla-ui-custom-elements": "^0.2.0",
+ "joomla-ui-custom-elements": "^0.4.1",
"jquery": "^3.7.1",
"jquery-migrate": "^3.5.2",
"mark.js": "^8.11.1",
@@ -50,7 +50,7 @@
"punycode": "^2.3.1",
"qrcode-generator": "^1.4.4",
"roboto-fontface": "^0.10.0",
- "sa11y": "^4.0.4",
+ "sa11y": "^4.1.1",
"shepherd.js": "^11.2.0",
"short-and-sweet": "^1.0.4",
"skipto": "^4.1.7",
@@ -61,43 +61,44 @@
"vuex-persist": "^3.1.3"
},
"devDependencies": {
- "@babel/core": "^7.26.7",
- "@babel/preset-env": "^7.26.7",
- "@rollup/plugin-babel": "^5.3.1",
- "@rollup/plugin-commonjs": "^21.1.0",
- "@rollup/plugin-node-resolve": "^13.3.0",
- "@rollup/plugin-replace": "^3.1.0",
+ "@babel/core": "^7.26.10",
+ "@babel/preset-env": "^7.26.9",
+ "@rollup/plugin-babel": "^6.0.4",
+ "@rollup/plugin-commonjs": "^28.0.3",
+ "@rollup/plugin-node-resolve": "^16.0.1",
+ "@rollup/plugin-replace": "^6.0.2",
"@vue/compiler-sfc": "^3.5.8",
- "chokidar": "^3.6.0",
+ "chokidar": "^4.0.3",
"cli-progress": "^3.12.0",
- "commander": "^8.3.0",
- "core-js": "^3.40.0",
- "cypress": "^13.17.0",
- "esbuild": "^0.24.2",
+ "commander": "^13.1.0",
+ "core-js": "^3.41.0",
+ "cypress": "^14.2.0",
+ "esbuild": "^0.25.1",
"eslint": "^8.57.1",
"eslint-config-airbnb-base": "^15.0.0",
"eslint-plugin-import": "^2.31.0",
- "eslint-plugin-vue": "^8.7.1",
- "fs-extra": "^10.1.0",
- "ini": "^2.0.0",
- "jasmine-core": "^3.99.1",
+ "eslint-plugin-vue": "^9.33.0",
+ "fs-extra": "^11.3.0",
+ "ini": "^5.0.0",
+ "jasmine-core": "^5.6.0",
"joomla-cypress": "^1.3.0",
- "lightningcss": "^1.29.1",
+ "lightningcss": "^1.29.3",
"mysql": "^2.18.1",
- "pg": "^8.13.1",
+ "pg": "^8.14.0",
"postcss-scss": "^4.0.9",
"recursive-readdir": "^2.2.3",
- "rimraf": "^3.0.2",
- "rollup": "^2.79.2",
+ "rimraf": "^6.0.1",
+ "rollup": "^4.35.0",
"rollup-plugin-vue": "^6.0.0",
- "rtlcss": "^3.5.0",
- "sass-embedded": "^1.83.4",
+ "rtlcss": "^4.3.0",
+ "sass-embedded": "^1.85.1",
"semver": "^7.7.1",
"smtp-tester": "^2.1.0",
"stylelint": "^14.16.1",
"stylelint-config-standard": "^24.0.0",
"stylelint-order": "^5.0.0",
- "stylelint-scss": "^4.7.0"
+ "stylelint-scss": "^4.7.0",
+ "totp-generator": "^1.0.0"
},
"engines": {
"node": ">=20.0.0",
@@ -134,9 +135,9 @@
}
},
"node_modules/@babel/compat-data": {
- "version": "7.26.5",
- "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.5.tgz",
- "integrity": "sha512-XvcZi1KWf88RVbF9wn8MN6tYFloU5qX8KjuF3E1PVBmJ9eypXfs4GRiJwLuTZL0iSnJUKn1BFPa5BPZZJyFzPg==",
+ "version": "7.26.8",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.8.tgz",
+ "integrity": "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==",
"dev": true,
"license": "MIT",
"engines": {
@@ -144,22 +145,22 @@
}
},
"node_modules/@babel/core": {
- "version": "7.26.7",
- "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.7.tgz",
- "integrity": "sha512-SRijHmF0PSPgLIBYlWnG0hyeJLwXE2CgpsXaMOrtt2yp9/86ALw6oUlj9KYuZ0JN07T4eBMVIW4li/9S1j2BGA==",
+ "version": "7.26.10",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.10.tgz",
+ "integrity": "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@ampproject/remapping": "^2.2.0",
"@babel/code-frame": "^7.26.2",
- "@babel/generator": "^7.26.5",
+ "@babel/generator": "^7.26.10",
"@babel/helper-compilation-targets": "^7.26.5",
"@babel/helper-module-transforms": "^7.26.0",
- "@babel/helpers": "^7.26.7",
- "@babel/parser": "^7.26.7",
- "@babel/template": "^7.25.9",
- "@babel/traverse": "^7.26.7",
- "@babel/types": "^7.26.7",
+ "@babel/helpers": "^7.26.10",
+ "@babel/parser": "^7.26.10",
+ "@babel/template": "^7.26.9",
+ "@babel/traverse": "^7.26.10",
+ "@babel/types": "^7.26.10",
"convert-source-map": "^2.0.0",
"debug": "^4.1.0",
"gensync": "^1.0.0-beta.2",
@@ -185,14 +186,14 @@
}
},
"node_modules/@babel/generator": {
- "version": "7.26.5",
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.5.tgz",
- "integrity": "sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw==",
+ "version": "7.26.10",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.10.tgz",
+ "integrity": "sha512-rRHT8siFIXQrAYOYqZQVsAr8vJ+cBNqcVAY6m5V8/4QqzaPl+zDBe6cLEPRDuNOUf3ww8RfJVlOyQMoSI+5Ang==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/parser": "^7.26.5",
- "@babel/types": "^7.26.5",
+ "@babel/parser": "^7.26.10",
+ "@babel/types": "^7.26.10",
"@jridgewell/gen-mapping": "^0.3.5",
"@jridgewell/trace-mapping": "^0.3.25",
"jsesc": "^3.0.2"
@@ -242,18 +243,18 @@
}
},
"node_modules/@babel/helper-create-class-features-plugin": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.9.tgz",
- "integrity": "sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==",
+ "version": "7.26.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.26.9.tgz",
+ "integrity": "sha512-ubbUqCofvxPRurw5L8WTsCLSkQiVpov4Qx0WMA+jUN+nXBK8ADPlJO1grkFw5CWKC5+sZSOfuGMdX1aI1iT9Sg==",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-annotate-as-pure": "^7.25.9",
"@babel/helper-member-expression-to-functions": "^7.25.9",
"@babel/helper-optimise-call-expression": "^7.25.9",
- "@babel/helper-replace-supers": "^7.25.9",
+ "@babel/helper-replace-supers": "^7.26.5",
"@babel/helper-skip-transparent-expression-wrappers": "^7.25.9",
- "@babel/traverse": "^7.25.9",
+ "@babel/traverse": "^7.26.9",
"semver": "^6.3.1"
},
"engines": {
@@ -481,26 +482,26 @@
}
},
"node_modules/@babel/helpers": {
- "version": "7.26.7",
- "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.7.tgz",
- "integrity": "sha512-8NHiL98vsi0mbPQmYAGWwfcFaOy4j2HY49fXJCfuDcdE7fMIsH9a7GdaeXpIBsbT7307WU8KCMp5pUVDNL4f9A==",
+ "version": "7.26.10",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.10.tgz",
+ "integrity": "sha512-UPYc3SauzZ3JGgj87GgZ89JVdC5dj0AoetR5Bw6wj4niittNyFh6+eOGonYvJ1ao6B8lEa3Q3klS7ADZ53bc5g==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/template": "^7.25.9",
- "@babel/types": "^7.26.7"
+ "@babel/template": "^7.26.9",
+ "@babel/types": "^7.26.10"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/parser": {
- "version": "7.26.7",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.7.tgz",
- "integrity": "sha512-kEvgGGgEjRUutvdVvZhbn/BxVt+5VSpwXz1j3WYXQbXDo8KzFOPNG2GQbdAiNq8g6wn1yKk7C/qrke03a84V+w==",
+ "version": "7.26.10",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.10.tgz",
+ "integrity": "sha512-6aQR2zGE/QFi8JpDLjUZEPYOs7+mhKXm86VaKFiLP35JQwQb6bwUE+XbvkH0EptsYhbNBSUGaUBLKqxH1xSgsA==",
"license": "MIT",
"dependencies": {
- "@babel/types": "^7.26.7"
+ "@babel/types": "^7.26.10"
},
"bin": {
"parser": "bin/babel-parser.js"
@@ -672,15 +673,15 @@
}
},
"node_modules/@babel/plugin-transform-async-generator-functions": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.9.tgz",
- "integrity": "sha512-RXV6QAzTBbhDMO9fWwOmwwTuYaiPbggWQ9INdZqAYeSHyG7FzQ+nOZaUUjNwKv9pV3aE4WFqFm1Hnbci5tBCAw==",
+ "version": "7.26.8",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.26.8.tgz",
+ "integrity": "sha512-He9Ej2X7tNf2zdKMAGOsmg2MrFc+hfoAhd3po4cWfo/NWjzEAKa0oQruj1ROVUdl0e6fb6/kE/G3SSxE0lRJOg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.26.5",
"@babel/helper-remap-async-to-generator": "^7.25.9",
- "@babel/traverse": "^7.25.9"
+ "@babel/traverse": "^7.26.8"
},
"engines": {
"node": ">=6.9.0"
@@ -926,13 +927,13 @@
}
},
"node_modules/@babel/plugin-transform-for-of": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.25.9.tgz",
- "integrity": "sha512-LqHxduHoaGELJl2uhImHwRQudhCM50pT46rIBNvtT/Oql3nqiS3wOwP+5ten7NpYSXrrVLgtZU3DZmPtWZo16A==",
+ "version": "7.26.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.26.9.tgz",
+ "integrity": "sha512-Hry8AusVm8LW5BVFgiyUReuoGzPUpdHQQqJY5bZnbbf+ngOHWuCuYFKw/BqaaWlvEUrF91HMhDtEaI1hZzNbLg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.26.5",
"@babel/helper-skip-transparent-expression-wrappers": "^7.25.9"
},
"engines": {
@@ -1394,13 +1395,13 @@
}
},
"node_modules/@babel/plugin-transform-template-literals": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.25.9.tgz",
- "integrity": "sha512-o97AE4syN71M/lxrCtQByzphAdlYluKPDBzDVzMmfCobUjjhAryZV0AIpRPrxN0eAkxXO6ZLEScmt+PNhj2OTw==",
+ "version": "7.26.8",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.26.8.tgz",
+ "integrity": "sha512-OmGDL5/J0CJPJZTHZbi2XpO0tyT2Ia7fzpW5GURwdtp2X3fMmN8au/ej6peC/T33/+CRiIpA8Krse8hFGVmT5Q==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.25.9"
+ "@babel/helper-plugin-utils": "^7.26.5"
},
"engines": {
"node": ">=6.9.0"
@@ -1493,13 +1494,13 @@
}
},
"node_modules/@babel/preset-env": {
- "version": "7.26.7",
- "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.26.7.tgz",
- "integrity": "sha512-Ycg2tnXwixaXOVb29rana8HNPgLVBof8qqtNQ9LE22IoyZboQbGSxI6ZySMdW3K5nAe6gu35IaJefUJflhUFTQ==",
+ "version": "7.26.9",
+ "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.26.9.tgz",
+ "integrity": "sha512-vX3qPGE8sEKEAZCWk05k3cpTAE3/nOYca++JA+Rd0z2NCNzabmYvEiSShKzm10zdquOIAVXsy2Ei/DTW34KlKQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/compat-data": "^7.26.5",
+ "@babel/compat-data": "^7.26.8",
"@babel/helper-compilation-targets": "^7.26.5",
"@babel/helper-plugin-utils": "^7.26.5",
"@babel/helper-validator-option": "^7.25.9",
@@ -1513,7 +1514,7 @@
"@babel/plugin-syntax-import-attributes": "^7.26.0",
"@babel/plugin-syntax-unicode-sets-regex": "^7.18.6",
"@babel/plugin-transform-arrow-functions": "^7.25.9",
- "@babel/plugin-transform-async-generator-functions": "^7.25.9",
+ "@babel/plugin-transform-async-generator-functions": "^7.26.8",
"@babel/plugin-transform-async-to-generator": "^7.25.9",
"@babel/plugin-transform-block-scoped-functions": "^7.26.5",
"@babel/plugin-transform-block-scoping": "^7.25.9",
@@ -1528,7 +1529,7 @@
"@babel/plugin-transform-dynamic-import": "^7.25.9",
"@babel/plugin-transform-exponentiation-operator": "^7.26.3",
"@babel/plugin-transform-export-namespace-from": "^7.25.9",
- "@babel/plugin-transform-for-of": "^7.25.9",
+ "@babel/plugin-transform-for-of": "^7.26.9",
"@babel/plugin-transform-function-name": "^7.25.9",
"@babel/plugin-transform-json-strings": "^7.25.9",
"@babel/plugin-transform-literals": "^7.25.9",
@@ -1556,7 +1557,7 @@
"@babel/plugin-transform-shorthand-properties": "^7.25.9",
"@babel/plugin-transform-spread": "^7.25.9",
"@babel/plugin-transform-sticky-regex": "^7.25.9",
- "@babel/plugin-transform-template-literals": "^7.25.9",
+ "@babel/plugin-transform-template-literals": "^7.26.8",
"@babel/plugin-transform-typeof-symbol": "^7.26.7",
"@babel/plugin-transform-unicode-escapes": "^7.25.9",
"@babel/plugin-transform-unicode-property-regex": "^7.25.9",
@@ -1564,9 +1565,9 @@
"@babel/plugin-transform-unicode-sets-regex": "^7.25.9",
"@babel/preset-modules": "0.1.6-no-external-plugins",
"babel-plugin-polyfill-corejs2": "^0.4.10",
- "babel-plugin-polyfill-corejs3": "^0.10.6",
+ "babel-plugin-polyfill-corejs3": "^0.11.0",
"babel-plugin-polyfill-regenerator": "^0.6.1",
- "core-js-compat": "^3.38.1",
+ "core-js-compat": "^3.40.0",
"semver": "^6.3.1"
},
"engines": {
@@ -1602,9 +1603,9 @@
}
},
"node_modules/@babel/runtime": {
- "version": "7.26.7",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.7.tgz",
- "integrity": "sha512-AOPI3D+a8dXnja+iwsUqGRjr1BbZIe771sXdapOtYI531gSqpi92vXivKcq2asu/DFpdl1ceFAKZyRzK2PCVcQ==",
+ "version": "7.26.10",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.10.tgz",
+ "integrity": "sha512-2WJMeRQPHKSPemqk/awGrAiuFfzBmOIPXKizAsVhWH9YJqLZ0H+HS4c8loHGgW6utJ3E/ejXQUsiGaQy2NZ9Fw==",
"license": "MIT",
"dependencies": {
"regenerator-runtime": "^0.14.0"
@@ -1614,32 +1615,32 @@
}
},
"node_modules/@babel/template": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz",
- "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==",
+ "version": "7.26.9",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.26.9.tgz",
+ "integrity": "sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/code-frame": "^7.25.9",
- "@babel/parser": "^7.25.9",
- "@babel/types": "^7.25.9"
+ "@babel/code-frame": "^7.26.2",
+ "@babel/parser": "^7.26.9",
+ "@babel/types": "^7.26.9"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/traverse": {
- "version": "7.26.7",
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.7.tgz",
- "integrity": "sha512-1x1sgeyRLC3r5fQOM0/xtQKsYjyxmFjaOrLJNtZ81inNjyJHGIolTULPiSc/2qe1/qfpFLisLQYFnnZl7QoedA==",
+ "version": "7.26.10",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.10.tgz",
+ "integrity": "sha512-k8NuDrxr0WrPH5Aupqb2LCVURP/S0vBEn5mK6iH+GIYob66U5EtoZvcdudR2jQ4cmTwhEwW1DLB+Yyas9zjF6A==",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/code-frame": "^7.26.2",
- "@babel/generator": "^7.26.5",
- "@babel/parser": "^7.26.7",
- "@babel/template": "^7.25.9",
- "@babel/types": "^7.26.7",
+ "@babel/generator": "^7.26.10",
+ "@babel/parser": "^7.26.10",
+ "@babel/template": "^7.26.9",
+ "@babel/types": "^7.26.10",
"debug": "^4.3.1",
"globals": "^11.1.0"
},
@@ -1648,9 +1649,9 @@
}
},
"node_modules/@babel/types": {
- "version": "7.26.7",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.7.tgz",
- "integrity": "sha512-t8kDRGrKXyp6+tjUh7hw2RLyclsW4TRoRvRHtSyAX9Bb5ldlFh+90YAYY6awRXrlB4G5G2izNeGySpATlFzmOg==",
+ "version": "7.26.10",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.10.tgz",
+ "integrity": "sha512-emqcG3vHrpxUKTrxcblR36dcrcoRDvKmnL/dCL6ZsHaShW80qxCAcNhzQZrpeM765VzEos+xOi4s+r4IXzTwdQ==",
"license": "MIT",
"dependencies": {
"@babel/helper-string-parser": "^7.25.9",
@@ -1677,9 +1678,9 @@
}
},
"node_modules/@codemirror/autocomplete": {
- "version": "6.18.4",
- "resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.18.4.tgz",
- "integrity": "sha512-sFAphGQIqyQZfP2ZBsSHV7xQvo9Py0rV0dW7W3IMRdS+zDuNb2l3no78CvUaWKGfzFjI4FTrLdUSj86IGb2hRA==",
+ "version": "6.18.6",
+ "resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.18.6.tgz",
+ "integrity": "sha512-PHHBXFomUs5DF+9tCOM/UoW6XQ4R44lLNNhRaW9PKPTU0D7lIjRg3ElxaJnTwsl/oHiR93WSXDBrekhoUGCPtg==",
"license": "MIT",
"dependencies": {
"@codemirror/language": "^6.0.0",
@@ -1731,9 +1732,9 @@
}
},
"node_modules/@codemirror/lang-javascript": {
- "version": "6.2.2",
- "resolved": "https://registry.npmjs.org/@codemirror/lang-javascript/-/lang-javascript-6.2.2.tgz",
- "integrity": "sha512-VGQfY+FCc285AhWuwjYxQyUQcYurWlxdKYT4bqwr3Twnd5wP5WSeu52t4tvvuWmljT4EmgEgZCqSieokhtY8hg==",
+ "version": "6.2.3",
+ "resolved": "https://registry.npmjs.org/@codemirror/lang-javascript/-/lang-javascript-6.2.3.tgz",
+ "integrity": "sha512-8PR3vIWg7pSu7ur8A07pGiYHgy3hHj+mRYRCSG8q+mPIrl0F02rgpGv+DsQTHRTc30rydOsf5PZ7yjKFg2Ackw==",
"license": "MIT",
"dependencies": {
"@codemirror/autocomplete": "^6.0.0",
@@ -1798,9 +1799,9 @@
}
},
"node_modules/@codemirror/language": {
- "version": "6.10.8",
- "resolved": "https://registry.npmjs.org/@codemirror/language/-/language-6.10.8.tgz",
- "integrity": "sha512-wcP8XPPhDH2vTqf181U8MbZnW+tDyPYy0UzVOa+oHORjyT+mhhom9vBd7dApJwoDz9Nb/a8kHjJIsuA/t8vNFw==",
+ "version": "6.11.0",
+ "resolved": "https://registry.npmjs.org/@codemirror/language/-/language-6.11.0.tgz",
+ "integrity": "sha512-A7+f++LodNNc1wGgoRDTt78cOwWm9KVezApgjOMp1W4hM0898nsqBXwF+sbePE7ZRcjN7Sa1Z5m2oN27XkmEjQ==",
"license": "MIT",
"dependencies": {
"@codemirror/state": "^6.0.0",
@@ -1823,9 +1824,9 @@
}
},
"node_modules/@codemirror/search": {
- "version": "6.5.8",
- "resolved": "https://registry.npmjs.org/@codemirror/search/-/search-6.5.8.tgz",
- "integrity": "sha512-PoWtZvo7c1XFeZWmmyaOp2G0XVbOnm+fJzvghqGAktBW3cufwJUWvSCcNG0ppXiBEM05mZu6RhMtXPv2hpllig==",
+ "version": "6.5.10",
+ "resolved": "https://registry.npmjs.org/@codemirror/search/-/search-6.5.10.tgz",
+ "integrity": "sha512-RMdPdmsrUf53pb2VwflKGHEe1XVM07hI7vV2ntgw1dmqhimpatSJKva4VA9h4TLUDOD4EIF02201oZurpnEFsg==",
"license": "MIT",
"dependencies": {
"@codemirror/state": "^6.0.0",
@@ -1855,9 +1856,9 @@
}
},
"node_modules/@codemirror/view": {
- "version": "6.36.2",
- "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.36.2.tgz",
- "integrity": "sha512-DZ6ONbs8qdJK0fdN7AB82CgI6tYXf4HWk1wSVa0+9bhVznCuuvhQtX8bFBoy3dv8rZSQqUd8GvhVAcielcidrA==",
+ "version": "6.36.4",
+ "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.36.4.tgz",
+ "integrity": "sha512-ZQ0V5ovw/miKEXTvjgzRyjnrk9TwriUB1k4R5p7uNnHR9Hus+D1SXHGdJshijEzPFjU25xea/7nhIeSqYFKdbA==",
"license": "MIT",
"dependencies": {
"@codemirror/state": "^6.5.0",
@@ -1894,9 +1895,9 @@
}
},
"node_modules/@cypress/request": {
- "version": "3.0.7",
- "resolved": "https://registry.npmjs.org/@cypress/request/-/request-3.0.7.tgz",
- "integrity": "sha512-LzxlLEMbBOPYB85uXrDqvD4MgcenjRBLIns3zyhx7vTPj/0u2eQhzXvPiGcaJrV38Q9dbkExWp6cOHPJ+EtFYg==",
+ "version": "3.0.8",
+ "resolved": "https://registry.npmjs.org/@cypress/request/-/request-3.0.8.tgz",
+ "integrity": "sha512-h0NFgh1mJmm1nr4jCwkGHwKneVYKghUyWe6TMNrk0B9zsjAJxpg8C4/+BAcmLgCPa1vj1V8rNUaILl+zYRUWBQ==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
@@ -1913,7 +1914,7 @@
"json-stringify-safe": "~5.0.1",
"mime-types": "~2.1.19",
"performance-now": "^2.1.0",
- "qs": "6.13.1",
+ "qs": "6.14.0",
"safe-buffer": "^5.1.2",
"tough-cookie": "^5.0.0",
"tunnel-agent": "^0.6.0",
@@ -1945,9 +1946,9 @@
}
},
"node_modules/@esbuild/aix-ppc64": {
- "version": "0.24.2",
- "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.2.tgz",
- "integrity": "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==",
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.1.tgz",
+ "integrity": "sha512-kfYGy8IdzTGy+z0vFGvExZtxkFlA4zAxgKEahG9KE1ScBjpQnFsNOX8KTU5ojNru5ed5CVoJYXFtoxaq5nFbjQ==",
"cpu": [
"ppc64"
],
@@ -1962,9 +1963,9 @@
}
},
"node_modules/@esbuild/android-arm": {
- "version": "0.24.2",
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.2.tgz",
- "integrity": "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==",
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.1.tgz",
+ "integrity": "sha512-dp+MshLYux6j/JjdqVLnMglQlFu+MuVeNrmT5nk6q07wNhCdSnB7QZj+7G8VMUGh1q+vj2Bq8kRsuyA00I/k+Q==",
"cpu": [
"arm"
],
@@ -1979,9 +1980,9 @@
}
},
"node_modules/@esbuild/android-arm64": {
- "version": "0.24.2",
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.2.tgz",
- "integrity": "sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==",
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.1.tgz",
+ "integrity": "sha512-50tM0zCJW5kGqgG7fQ7IHvQOcAn9TKiVRuQ/lN0xR+T2lzEFvAi1ZcS8DiksFcEpf1t/GYOeOfCAgDHFpkiSmA==",
"cpu": [
"arm64"
],
@@ -1996,9 +1997,9 @@
}
},
"node_modules/@esbuild/android-x64": {
- "version": "0.24.2",
- "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.2.tgz",
- "integrity": "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==",
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.1.tgz",
+ "integrity": "sha512-GCj6WfUtNldqUzYkN/ITtlhwQqGWu9S45vUXs7EIYf+7rCiiqH9bCloatO9VhxsL0Pji+PF4Lz2XXCES+Q8hDw==",
"cpu": [
"x64"
],
@@ -2013,9 +2014,9 @@
}
},
"node_modules/@esbuild/darwin-arm64": {
- "version": "0.24.2",
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.2.tgz",
- "integrity": "sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==",
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.1.tgz",
+ "integrity": "sha512-5hEZKPf+nQjYoSr/elb62U19/l1mZDdqidGfmFutVUjjUZrOazAtwK+Kr+3y0C/oeJfLlxo9fXb1w7L+P7E4FQ==",
"cpu": [
"arm64"
],
@@ -2030,9 +2031,9 @@
}
},
"node_modules/@esbuild/darwin-x64": {
- "version": "0.24.2",
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.2.tgz",
- "integrity": "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==",
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.1.tgz",
+ "integrity": "sha512-hxVnwL2Dqs3fM1IWq8Iezh0cX7ZGdVhbTfnOy5uURtao5OIVCEyj9xIzemDi7sRvKsuSdtCAhMKarxqtlyVyfA==",
"cpu": [
"x64"
],
@@ -2047,9 +2048,9 @@
}
},
"node_modules/@esbuild/freebsd-arm64": {
- "version": "0.24.2",
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.2.tgz",
- "integrity": "sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==",
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.1.tgz",
+ "integrity": "sha512-1MrCZs0fZa2g8E+FUo2ipw6jw5qqQiH+tERoS5fAfKnRx6NXH31tXBKI3VpmLijLH6yriMZsxJtaXUyFt/8Y4A==",
"cpu": [
"arm64"
],
@@ -2064,9 +2065,9 @@
}
},
"node_modules/@esbuild/freebsd-x64": {
- "version": "0.24.2",
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.2.tgz",
- "integrity": "sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==",
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.1.tgz",
+ "integrity": "sha512-0IZWLiTyz7nm0xuIs0q1Y3QWJC52R8aSXxe40VUxm6BB1RNmkODtW6LHvWRrGiICulcX7ZvyH6h5fqdLu4gkww==",
"cpu": [
"x64"
],
@@ -2081,9 +2082,9 @@
}
},
"node_modules/@esbuild/linux-arm": {
- "version": "0.24.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.2.tgz",
- "integrity": "sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==",
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.1.tgz",
+ "integrity": "sha512-NdKOhS4u7JhDKw9G3cY6sWqFcnLITn6SqivVArbzIaf3cemShqfLGHYMx8Xlm/lBit3/5d7kXvriTUGa5YViuQ==",
"cpu": [
"arm"
],
@@ -2098,9 +2099,9 @@
}
},
"node_modules/@esbuild/linux-arm64": {
- "version": "0.24.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.2.tgz",
- "integrity": "sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==",
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.1.tgz",
+ "integrity": "sha512-jaN3dHi0/DDPelk0nLcXRm1q7DNJpjXy7yWaWvbfkPvI+7XNSc/lDOnCLN7gzsyzgu6qSAmgSvP9oXAhP973uQ==",
"cpu": [
"arm64"
],
@@ -2115,9 +2116,9 @@
}
},
"node_modules/@esbuild/linux-ia32": {
- "version": "0.24.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.2.tgz",
- "integrity": "sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==",
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.1.tgz",
+ "integrity": "sha512-OJykPaF4v8JidKNGz8c/q1lBO44sQNUQtq1KktJXdBLn1hPod5rE/Hko5ugKKZd+D2+o1a9MFGUEIUwO2YfgkQ==",
"cpu": [
"ia32"
],
@@ -2132,9 +2133,9 @@
}
},
"node_modules/@esbuild/linux-loong64": {
- "version": "0.24.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.2.tgz",
- "integrity": "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==",
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.1.tgz",
+ "integrity": "sha512-nGfornQj4dzcq5Vp835oM/o21UMlXzn79KobKlcs3Wz9smwiifknLy4xDCLUU0BWp7b/houtdrgUz7nOGnfIYg==",
"cpu": [
"loong64"
],
@@ -2149,9 +2150,9 @@
}
},
"node_modules/@esbuild/linux-mips64el": {
- "version": "0.24.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.2.tgz",
- "integrity": "sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==",
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.1.tgz",
+ "integrity": "sha512-1osBbPEFYwIE5IVB/0g2X6i1qInZa1aIoj1TdL4AaAb55xIIgbg8Doq6a5BzYWgr+tEcDzYH67XVnTmUzL+nXg==",
"cpu": [
"mips64el"
],
@@ -2166,9 +2167,9 @@
}
},
"node_modules/@esbuild/linux-ppc64": {
- "version": "0.24.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.2.tgz",
- "integrity": "sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==",
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.1.tgz",
+ "integrity": "sha512-/6VBJOwUf3TdTvJZ82qF3tbLuWsscd7/1w+D9LH0W/SqUgM5/JJD0lrJ1fVIfZsqB6RFmLCe0Xz3fmZc3WtyVg==",
"cpu": [
"ppc64"
],
@@ -2183,9 +2184,9 @@
}
},
"node_modules/@esbuild/linux-riscv64": {
- "version": "0.24.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.2.tgz",
- "integrity": "sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==",
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.1.tgz",
+ "integrity": "sha512-nSut/Mx5gnilhcq2yIMLMe3Wl4FK5wx/o0QuuCLMtmJn+WeWYoEGDN1ipcN72g1WHsnIbxGXd4i/MF0gTcuAjQ==",
"cpu": [
"riscv64"
],
@@ -2200,9 +2201,9 @@
}
},
"node_modules/@esbuild/linux-s390x": {
- "version": "0.24.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.2.tgz",
- "integrity": "sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==",
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.1.tgz",
+ "integrity": "sha512-cEECeLlJNfT8kZHqLarDBQso9a27o2Zd2AQ8USAEoGtejOrCYHNtKP8XQhMDJMtthdF4GBmjR2au3x1udADQQQ==",
"cpu": [
"s390x"
],
@@ -2217,9 +2218,9 @@
}
},
"node_modules/@esbuild/linux-x64": {
- "version": "0.24.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz",
- "integrity": "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==",
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.1.tgz",
+ "integrity": "sha512-xbfUhu/gnvSEg+EGovRc+kjBAkrvtk38RlerAzQxvMzlB4fXpCFCeUAYzJvrnhFtdeyVCDANSjJvOvGYoeKzFA==",
"cpu": [
"x64"
],
@@ -2234,9 +2235,9 @@
}
},
"node_modules/@esbuild/netbsd-arm64": {
- "version": "0.24.2",
- "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.24.2.tgz",
- "integrity": "sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==",
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.1.tgz",
+ "integrity": "sha512-O96poM2XGhLtpTh+s4+nP7YCCAfb4tJNRVZHfIE7dgmax+yMP2WgMd2OecBuaATHKTHsLWHQeuaxMRnCsH8+5g==",
"cpu": [
"arm64"
],
@@ -2251,9 +2252,9 @@
}
},
"node_modules/@esbuild/netbsd-x64": {
- "version": "0.24.2",
- "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.2.tgz",
- "integrity": "sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==",
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.1.tgz",
+ "integrity": "sha512-X53z6uXip6KFXBQ+Krbx25XHV/NCbzryM6ehOAeAil7X7oa4XIq+394PWGnwaSQ2WRA0KI6PUO6hTO5zeF5ijA==",
"cpu": [
"x64"
],
@@ -2268,9 +2269,9 @@
}
},
"node_modules/@esbuild/openbsd-arm64": {
- "version": "0.24.2",
- "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.2.tgz",
- "integrity": "sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==",
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.1.tgz",
+ "integrity": "sha512-Na9T3szbXezdzM/Kfs3GcRQNjHzM6GzFBeU1/6IV/npKP5ORtp9zbQjvkDJ47s6BCgaAZnnnu/cY1x342+MvZg==",
"cpu": [
"arm64"
],
@@ -2285,9 +2286,9 @@
}
},
"node_modules/@esbuild/openbsd-x64": {
- "version": "0.24.2",
- "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.2.tgz",
- "integrity": "sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==",
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.1.tgz",
+ "integrity": "sha512-T3H78X2h1tszfRSf+txbt5aOp/e7TAz3ptVKu9Oyir3IAOFPGV6O9c2naym5TOriy1l0nNf6a4X5UXRZSGX/dw==",
"cpu": [
"x64"
],
@@ -2302,9 +2303,9 @@
}
},
"node_modules/@esbuild/sunos-x64": {
- "version": "0.24.2",
- "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.2.tgz",
- "integrity": "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==",
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.1.tgz",
+ "integrity": "sha512-2H3RUvcmULO7dIE5EWJH8eubZAI4xw54H1ilJnRNZdeo8dTADEZ21w6J22XBkXqGJbe0+wnNJtw3UXRoLJnFEg==",
"cpu": [
"x64"
],
@@ -2319,9 +2320,9 @@
}
},
"node_modules/@esbuild/win32-arm64": {
- "version": "0.24.2",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.2.tgz",
- "integrity": "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==",
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.1.tgz",
+ "integrity": "sha512-GE7XvrdOzrb+yVKB9KsRMq+7a2U/K5Cf/8grVFRAGJmfADr/e/ODQ134RK2/eeHqYV5eQRFxb1hY7Nr15fv1NQ==",
"cpu": [
"arm64"
],
@@ -2336,9 +2337,9 @@
}
},
"node_modules/@esbuild/win32-ia32": {
- "version": "0.24.2",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.2.tgz",
- "integrity": "sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==",
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.1.tgz",
+ "integrity": "sha512-uOxSJCIcavSiT6UnBhBzE8wy3n0hOkJsBOzy7HDAuTDE++1DJMRRVCPGisULScHL+a/ZwdXPpXD3IyFKjA7K8A==",
"cpu": [
"ia32"
],
@@ -2353,9 +2354,9 @@
}
},
"node_modules/@esbuild/win32-x64": {
- "version": "0.24.2",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.2.tgz",
- "integrity": "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==",
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.1.tgz",
+ "integrity": "sha512-Y1EQdcfwMSeQN/ujR5VayLOJ1BHaK+ssyk0AEzPjC+t1lITgsnccPqFjb6V+LsTp/9Iov4ysfjxLaGJ9RPtkVg==",
"cpu": [
"x64"
],
@@ -2370,9 +2371,9 @@
}
},
"node_modules/@eslint-community/eslint-utils": {
- "version": "4.4.1",
- "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz",
- "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==",
+ "version": "4.5.1",
+ "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.5.1.tgz",
+ "integrity": "sha512-soEIOALTfTK6EjmKMMoLugwaP0rzkad90iIWd1hMO9ARkSAyjfMfkRRhLvD5qH7vvM0Cg72pieUfR6yh6XxC4w==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -2533,6 +2534,109 @@
"dev": true,
"license": "BSD-3-Clause"
},
+ "node_modules/@isaacs/cliui": {
+ "version": "8.0.2",
+ "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
+ "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^5.1.2",
+ "string-width-cjs": "npm:string-width@^4.2.0",
+ "strip-ansi": "^7.0.1",
+ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
+ "wrap-ansi": "^8.1.0",
+ "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@isaacs/cliui/node_modules/ansi-regex": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
+ "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/@isaacs/cliui/node_modules/ansi-styles": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
+ "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/@isaacs/cliui/node_modules/emoji-regex": {
+ "version": "9.2.2",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
+ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@isaacs/cliui/node_modules/string-width": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
+ "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "eastasianwidth": "^0.2.0",
+ "emoji-regex": "^9.2.2",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@isaacs/cliui/node_modules/strip-ansi": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+ "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ }
+ },
+ "node_modules/@isaacs/cliui/node_modules/wrap-ansi": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
+ "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^6.1.0",
+ "string-width": "^5.0.1",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
"node_modules/@jridgewell/gen-mapping": {
"version": "0.3.8",
"resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz",
@@ -2654,9 +2758,9 @@
}
},
"node_modules/@lezer/markdown": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/@lezer/markdown/-/markdown-1.4.0.tgz",
- "integrity": "sha512-mk4MYeq6ZQdxgsgRAe0G7kqPRV6Desajfa14TcHoGGXIqqj1/2ARN31VFpmrXDgvXiGBWpA7RXtv0he+UdTkGw==",
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/@lezer/markdown/-/markdown-1.4.2.tgz",
+ "integrity": "sha512-iYewCigG/517D0xJPQd7RGaCjZAFwROiH8T9h7OTtz0bRVtkxzFhGBFJ9JGKgBBs4uuo1cvxzyQ5iKhDLMcLUQ==",
"license": "MIT",
"dependencies": {
"@lezer/common": "^1.0.0",
@@ -2740,110 +2844,394 @@
}
},
"node_modules/@rollup/plugin-babel": {
- "version": "5.3.1",
- "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz",
- "integrity": "sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==",
+ "version": "6.0.4",
+ "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-6.0.4.tgz",
+ "integrity": "sha512-YF7Y52kFdFT/xVSuVdjkV5ZdX/3YtmX0QulG+x0taQOtJdHYzVU61aSSkAgVJ7NOv6qPkIYiJSgSWWN/DM5sGw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/helper-module-imports": "^7.10.4",
- "@rollup/pluginutils": "^3.1.0"
+ "@babel/helper-module-imports": "^7.18.6",
+ "@rollup/pluginutils": "^5.0.1"
},
"engines": {
- "node": ">= 10.0.0"
+ "node": ">=14.0.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0",
"@types/babel__core": "^7.1.9",
- "rollup": "^1.20.0||^2.0.0"
+ "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0"
},
"peerDependenciesMeta": {
"@types/babel__core": {
"optional": true
+ },
+ "rollup": {
+ "optional": true
}
}
},
"node_modules/@rollup/plugin-commonjs": {
- "version": "21.1.0",
- "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-21.1.0.tgz",
- "integrity": "sha512-6ZtHx3VHIp2ReNNDxHjuUml6ur+WcQ28N1yHgCQwsbNkQg2suhxGMDQGJOn/KuDxKtd1xuZP5xSTwBA4GQ8hbA==",
+ "version": "28.0.3",
+ "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-28.0.3.tgz",
+ "integrity": "sha512-pyltgilam1QPdn+Zd9gaCfOLcnjMEJ9gV+bTw6/r73INdvzf1ah9zLIJBm+kW7R6IUFIQ1YO+VqZtYxZNWFPEQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@rollup/pluginutils": "^3.1.0",
+ "@rollup/pluginutils": "^5.0.1",
"commondir": "^1.0.1",
- "estree-walker": "^2.0.1",
- "glob": "^7.1.6",
- "is-reference": "^1.2.1",
- "magic-string": "^0.25.7",
- "resolve": "^1.17.0"
+ "estree-walker": "^2.0.2",
+ "fdir": "^6.2.0",
+ "is-reference": "1.2.1",
+ "magic-string": "^0.30.3",
+ "picomatch": "^4.0.2"
},
"engines": {
- "node": ">= 8.0.0"
+ "node": ">=16.0.0 || 14 >= 14.17"
},
"peerDependencies": {
- "rollup": "^2.38.3"
+ "rollup": "^2.68.0||^3.0.0||^4.0.0"
+ },
+ "peerDependenciesMeta": {
+ "rollup": {
+ "optional": true
+ }
}
},
"node_modules/@rollup/plugin-node-resolve": {
- "version": "13.3.0",
- "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-13.3.0.tgz",
- "integrity": "sha512-Lus8rbUo1eEcnS4yTFKLZrVumLPY+YayBdWXgFSHYhTT2iJbMhoaaBL3xl5NCdeRytErGr8tZ0L71BMRmnlwSw==",
+ "version": "16.0.1",
+ "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-16.0.1.tgz",
+ "integrity": "sha512-tk5YCxJWIG81umIvNkSod2qK5KyQW19qcBF/B78n1bjtOON6gzKoVeSzAE8yHCZEDmqkHKkxplExA8KzdJLJpA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@rollup/pluginutils": "^3.1.0",
- "@types/resolve": "1.17.1",
+ "@rollup/pluginutils": "^5.0.1",
+ "@types/resolve": "1.20.2",
"deepmerge": "^4.2.2",
- "is-builtin-module": "^3.1.0",
"is-module": "^1.0.0",
- "resolve": "^1.19.0"
+ "resolve": "^1.22.1"
},
"engines": {
- "node": ">= 10.0.0"
+ "node": ">=14.0.0"
},
"peerDependencies": {
- "rollup": "^2.42.0"
+ "rollup": "^2.78.0||^3.0.0||^4.0.0"
+ },
+ "peerDependenciesMeta": {
+ "rollup": {
+ "optional": true
+ }
}
},
"node_modules/@rollup/plugin-replace": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-3.1.0.tgz",
- "integrity": "sha512-pA3XRUrSKybVYqmH5TqWNZpGxF+VV+1GrYchKgCNIj2vsSOX7CVm2RCtx8p2nrC7xvkziYyK+lSi74T93MU3YA==",
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-6.0.2.tgz",
+ "integrity": "sha512-7QaYCf8bqF04dOy7w/eHmJeNExxTYwvKAmlSAH/EaWWUzbT0h5sbF6bktFoX/0F/0qwng5/dWFMyf3gzaM8DsQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@rollup/pluginutils": "^3.1.0",
- "magic-string": "^0.25.7"
+ "@rollup/pluginutils": "^5.0.1",
+ "magic-string": "^0.30.3"
+ },
+ "engines": {
+ "node": ">=14.0.0"
},
"peerDependencies": {
- "rollup": "^1.20.0 || ^2.0.0"
+ "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0"
+ },
+ "peerDependenciesMeta": {
+ "rollup": {
+ "optional": true
+ }
}
},
"node_modules/@rollup/pluginutils": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz",
- "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==",
+ "version": "5.1.4",
+ "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.4.tgz",
+ "integrity": "sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@types/estree": "0.0.39",
- "estree-walker": "^1.0.1",
- "picomatch": "^2.2.2"
+ "@types/estree": "^1.0.0",
+ "estree-walker": "^2.0.2",
+ "picomatch": "^4.0.2"
},
"engines": {
- "node": ">= 8.0.0"
+ "node": ">=14.0.0"
},
"peerDependencies": {
- "rollup": "^1.20.0||^2.0.0"
+ "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0"
+ },
+ "peerDependenciesMeta": {
+ "rollup": {
+ "optional": true
+ }
}
},
- "node_modules/@rollup/pluginutils/node_modules/estree-walker": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz",
- "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==",
+ "node_modules/@rollup/rollup-android-arm-eabi": {
+ "version": "4.35.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.35.0.tgz",
+ "integrity": "sha512-uYQ2WfPaqz5QtVgMxfN6NpLD+no0MYHDBywl7itPYd3K5TjjSghNKmX8ic9S8NU8w81NVhJv/XojcHptRly7qQ==",
+ "cpu": [
+ "arm"
+ ],
"dev": true,
- "license": "MIT"
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-android-arm64": {
+ "version": "4.35.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.35.0.tgz",
+ "integrity": "sha512-FtKddj9XZudurLhdJnBl9fl6BwCJ3ky8riCXjEw3/UIbjmIY58ppWwPEvU3fNu+W7FUsAsB1CdH+7EQE6CXAPA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-arm64": {
+ "version": "4.35.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.35.0.tgz",
+ "integrity": "sha512-Uk+GjOJR6CY844/q6r5DR/6lkPFOw0hjfOIzVx22THJXMxktXG6CbejseJFznU8vHcEBLpiXKY3/6xc+cBm65Q==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-x64": {
+ "version": "4.35.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.35.0.tgz",
+ "integrity": "sha512-3IrHjfAS6Vkp+5bISNQnPogRAW5GAV1n+bNCrDwXmfMHbPl5EhTmWtfmwlJxFRUCBZ+tZ/OxDyU08aF6NI/N5Q==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-freebsd-arm64": {
+ "version": "4.35.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.35.0.tgz",
+ "integrity": "sha512-sxjoD/6F9cDLSELuLNnY0fOrM9WA0KrM0vWm57XhrIMf5FGiN8D0l7fn+bpUeBSU7dCgPV2oX4zHAsAXyHFGcQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-freebsd-x64": {
+ "version": "4.35.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.35.0.tgz",
+ "integrity": "sha512-2mpHCeRuD1u/2kruUiHSsnjWtHjqVbzhBkNVQ1aVD63CcexKVcQGwJ2g5VphOd84GvxfSvnnlEyBtQCE5hxVVw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
+ "version": "4.35.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.35.0.tgz",
+ "integrity": "sha512-mrA0v3QMy6ZSvEuLs0dMxcO2LnaCONs1Z73GUDBHWbY8tFFocM6yl7YyMu7rz4zS81NDSqhrUuolyZXGi8TEqg==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-musleabihf": {
+ "version": "4.35.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.35.0.tgz",
+ "integrity": "sha512-DnYhhzcvTAKNexIql8pFajr0PiDGrIsBYPRvCKlA5ixSS3uwo/CWNZxB09jhIapEIg945KOzcYEAGGSmTSpk7A==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-gnu": {
+ "version": "4.35.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.35.0.tgz",
+ "integrity": "sha512-uagpnH2M2g2b5iLsCTZ35CL1FgyuzzJQ8L9VtlJ+FckBXroTwNOaD0z0/UF+k5K3aNQjbm8LIVpxykUOQt1m/A==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-musl": {
+ "version": "4.35.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.35.0.tgz",
+ "integrity": "sha512-XQxVOCd6VJeHQA/7YcqyV0/88N6ysSVzRjJ9I9UA/xXpEsjvAgDTgH3wQYz5bmr7SPtVK2TsP2fQ2N9L4ukoUg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-loongarch64-gnu": {
+ "version": "4.35.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.35.0.tgz",
+ "integrity": "sha512-5pMT5PzfgwcXEwOaSrqVsz/LvjDZt+vQ8RT/70yhPU06PTuq8WaHhfT1LW+cdD7mW6i/J5/XIkX/1tCAkh1W6g==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
+ "version": "4.35.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.35.0.tgz",
+ "integrity": "sha512-c+zkcvbhbXF98f4CtEIP1EBA/lCic5xB0lToneZYvMeKu5Kamq3O8gqrxiYYLzlZH6E3Aq+TSW86E4ay8iD8EA==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-riscv64-gnu": {
+ "version": "4.35.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.35.0.tgz",
+ "integrity": "sha512-s91fuAHdOwH/Tad2tzTtPX7UZyytHIRR6V4+2IGlV0Cej5rkG0R61SX4l4y9sh0JBibMiploZx3oHKPnQBKe4g==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-s390x-gnu": {
+ "version": "4.35.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.35.0.tgz",
+ "integrity": "sha512-hQRkPQPLYJZYGP+Hj4fR9dDBMIM7zrzJDWFEMPdTnTy95Ljnv0/4w/ixFw3pTBMEuuEuoqtBINYND4M7ujcuQw==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-gnu": {
+ "version": "4.35.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.35.0.tgz",
+ "integrity": "sha512-Pim1T8rXOri+0HmV4CdKSGrqcBWX0d1HoPnQ0uw0bdp1aP5SdQVNBy8LjYncvnLgu3fnnCt17xjWGd4cqh8/hA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-musl": {
+ "version": "4.35.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.35.0.tgz",
+ "integrity": "sha512-QysqXzYiDvQWfUiTm8XmJNO2zm9yC9P/2Gkrwg2dH9cxotQzunBHYr6jk4SujCTqnfGxduOmQcI7c2ryuW8XVg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-arm64-msvc": {
+ "version": "4.35.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.35.0.tgz",
+ "integrity": "sha512-OUOlGqPkVJCdJETKOCEf1mw848ZyJ5w50/rZ/3IBQVdLfR5jk/6Sr5m3iO2tdPgwo0x7VcncYuOvMhBWZq8ayg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-ia32-msvc": {
+ "version": "4.35.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.35.0.tgz",
+ "integrity": "sha512-2/lsgejMrtwQe44glq7AFFHLfJBPafpsTa6JvP2NGef/ifOa4KBoglVf7AKN7EV9o32evBPRqfg96fEHzWo5kw==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-x64-msvc": {
+ "version": "4.35.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.35.0.tgz",
+ "integrity": "sha512-PIQeY5XDkrOysbQblSW7v3l1MDZzkTEzAfTPkj5VAu3FW8fS4ynyLg2sINp0fp3SjZ8xkRYpLqoKcYqAkhU1dw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
},
"node_modules/@rtsao/scc": {
"version": "1.1.0",
@@ -2867,9 +3255,9 @@
}
},
"node_modules/@types/estree": {
- "version": "0.0.39",
- "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz",
- "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==",
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz",
+ "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==",
"dev": true,
"license": "MIT"
},
@@ -2899,9 +3287,9 @@
"license": "MIT"
},
"node_modules/@types/node": {
- "version": "22.13.1",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.1.tgz",
- "integrity": "sha512-jK8uzQlrvXqEU91UxiK5J7pKHyzgnI1Qnl0QDHIgVGuolJhRb9EEl28Cj9b3rGR8B2lhFCtvIm5os8lFnO/1Ew==",
+ "version": "22.13.10",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.10.tgz",
+ "integrity": "sha512-I6LPUvlRH+O6VRUqYOcMudhaIdUVWfsjnZavnsraHvpBwaEyMN29ry+0UVJhImYL16xsscu0aske3yA+uPOWfw==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -2933,14 +3321,11 @@
"license": "MIT"
},
"node_modules/@types/resolve": {
- "version": "1.17.1",
- "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz",
- "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==",
+ "version": "1.20.2",
+ "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz",
+ "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==",
"dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/node": "*"
- }
+ "license": "MIT"
},
"node_modules/@types/sinonjs__fake-timers": {
"version": "8.1.1",
@@ -3025,15 +3410,6 @@
"source-map-js": "^1.2.0"
}
},
- "node_modules/@vue/compiler-sfc/node_modules/magic-string": {
- "version": "0.30.17",
- "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz",
- "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==",
- "license": "MIT",
- "dependencies": {
- "@jridgewell/sourcemap-codec": "^1.5.0"
- }
- },
"node_modules/@vue/compiler-ssr": {
"version": "3.5.13",
"resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.13.tgz",
@@ -3113,9 +3489,9 @@
"license": "MIT"
},
"node_modules/acorn": {
- "version": "8.14.0",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz",
- "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==",
+ "version": "8.14.1",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz",
+ "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==",
"dev": true,
"license": "MIT",
"bin": {
@@ -3218,20 +3594,6 @@
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
- "node_modules/anymatch": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
- "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "normalize-path": "^3.0.0",
- "picomatch": "^2.0.4"
- },
- "engines": {
- "node": ">= 8"
- }
- },
"node_modules/apca-w3": {
"version": "0.1.9",
"resolved": "https://registry.npmjs.org/apca-w3/-/apca-w3-0.1.9.tgz",
@@ -3318,18 +3680,19 @@
}
},
"node_modules/array.prototype.findlastindex": {
- "version": "1.2.5",
- "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz",
- "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==",
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz",
+ "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "call-bind": "^1.0.7",
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.4",
"define-properties": "^1.2.1",
- "es-abstract": "^1.23.2",
+ "es-abstract": "^1.23.9",
"es-errors": "^1.3.0",
- "es-object-atoms": "^1.0.0",
- "es-shim-unscopables": "^1.0.2"
+ "es-object-atoms": "^1.1.1",
+ "es-shim-unscopables": "^1.1.0"
},
"engines": {
"node": ">= 0.4"
@@ -3543,14 +3906,14 @@
}
},
"node_modules/babel-plugin-polyfill-corejs3": {
- "version": "0.10.6",
- "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz",
- "integrity": "sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==",
+ "version": "0.11.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.11.1.tgz",
+ "integrity": "sha512-yGCqvBT4rwMczo28xkH/noxJ6MZ4nJfkVYdoDaC/utLtWrXxv27HVrzAeSbqR8SxDsp46n0YF47EbHoixy6rXQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/helper-define-polyfill-provider": "^0.6.2",
- "core-js-compat": "^3.38.0"
+ "@babel/helper-define-polyfill-provider": "^0.6.3",
+ "core-js-compat": "^3.40.0"
},
"peerDependencies": {
"@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
@@ -3627,19 +3990,6 @@
"node": "*"
}
},
- "node_modules/binary-extensions": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
- "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
"node_modules/blob-util": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/blob-util/-/blob-util-2.0.2.tgz",
@@ -3779,19 +4129,6 @@
"node": "*"
}
},
- "node_modules/builtin-modules": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz",
- "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
"node_modules/cachedir": {
"version": "2.4.0",
"resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.4.0.tgz",
@@ -3822,9 +4159,9 @@
}
},
"node_modules/call-bind-apply-helpers": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz",
- "integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==",
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
+ "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -3836,14 +4173,14 @@
}
},
"node_modules/call-bound": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz",
- "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==",
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",
+ "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "call-bind-apply-helpers": "^1.0.1",
- "get-intrinsic": "^1.2.6"
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.2",
+ "get-intrinsic": "^1.3.0"
},
"engines": {
"node": ">= 0.4"
@@ -3891,9 +4228,9 @@
}
},
"node_modules/caniuse-lite": {
- "version": "1.0.30001697",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001697.tgz",
- "integrity": "sha512-GwNPlWJin8E+d7Gxq96jxM6w0w+VFeyyXRsjU58emtkYqnbwHqXm5uT2uCmO0RQE9htWknOP4xtBlLmM/gWxvQ==",
+ "version": "1.0.30001704",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001704.tgz",
+ "integrity": "sha512-+L2IgBbV6gXB4ETf0keSvLr7JUrRVbIaB/lrQ1+z8mRcQiisG5k+lG6O4n6Y5q6f5EuNfaYXKgymucphlEXQew==",
"dev": true,
"funding": [
{
@@ -3970,28 +4307,19 @@
}
},
"node_modules/chokidar": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
- "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz",
+ "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "anymatch": "~3.1.2",
- "braces": "~3.0.2",
- "glob-parent": "~5.1.2",
- "is-binary-path": "~2.1.0",
- "is-glob": "~4.0.1",
- "normalize-path": "~3.0.0",
- "readdirp": "~3.6.0"
+ "readdirp": "^4.0.1"
},
"engines": {
- "node": ">= 8.10.0"
+ "node": ">= 14.16.0"
},
"funding": {
"url": "https://paulmillr.com/funding/"
- },
- "optionalDependencies": {
- "fsevents": "~2.3.2"
}
},
"node_modules/chosen-js": {
@@ -4001,9 +4329,9 @@
"license": "MIT"
},
"node_modules/ci-info": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.1.0.tgz",
- "integrity": "sha512-HutrvTNsF48wnxkzERIXOe5/mlcfFcbfCmwcg6CJnizbSue78AbDt+1cgl26zwn61WFxhcPykPfZrbqjGmBb4A==",
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.2.0.tgz",
+ "integrity": "sha512-cYY9mypksY8NRqgDB1XD1RiJL338v/551niynFTGkZOO2LHuB2OmOYxDIe/ttN9AHwrqdum1360G3ald0W9kCg==",
"dev": true,
"funding": [
{
@@ -4146,13 +4474,13 @@
}
},
"node_modules/commander": {
- "version": "8.3.0",
- "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz",
- "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==",
+ "version": "13.1.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-13.1.0.tgz",
+ "integrity": "sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==",
"dev": true,
"license": "MIT",
"engines": {
- "node": ">= 12"
+ "node": ">=18"
}
},
"node_modules/common-tags": {
@@ -4204,9 +4532,9 @@
"license": "MIT"
},
"node_modules/core-js": {
- "version": "3.40.0",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.40.0.tgz",
- "integrity": "sha512-7vsMc/Lty6AGnn7uFpYT56QesI5D2Y/UkgKounk87OP9Z2H9Z8kj6jzcSGAxFmUtDOS0ntK6lbQz+Nsa0Jj6mQ==",
+ "version": "3.41.0",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.41.0.tgz",
+ "integrity": "sha512-SJ4/EHwS36QMJd6h/Rg+GyR4A5xE0FSI3eZ+iBVpfqf1x0eTSg1smWLHrA+2jQThZSh97fmSgFSU8B61nxosxA==",
"dev": true,
"hasInstallScript": true,
"license": "MIT",
@@ -4216,13 +4544,13 @@
}
},
"node_modules/core-js-compat": {
- "version": "3.40.0",
- "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.40.0.tgz",
- "integrity": "sha512-0XEDpr5y5mijvw8Lbc6E5AkjrHfp7eEoPlu36SWeAbcL8fn1G1ANe8DBlo2XoNN89oVpxWwOjYIPVzR4ZvsKCQ==",
+ "version": "3.41.0",
+ "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.41.0.tgz",
+ "integrity": "sha512-RFsU9LySVue9RTwdDVX/T0e2Y6jRYWXERKElIjpuEOEnxaXffI0X7RUwVzfYLfzuLXSNJDYoRYUAmRUcyln20A==",
"dev": true,
"license": "MIT",
"dependencies": {
- "browserslist": "^4.24.3"
+ "browserslist": "^4.24.4"
},
"funding": {
"type": "opencollective",
@@ -4325,14 +4653,14 @@
"license": "MIT"
},
"node_modules/cypress": {
- "version": "13.17.0",
- "resolved": "https://registry.npmjs.org/cypress/-/cypress-13.17.0.tgz",
- "integrity": "sha512-5xWkaPurwkIljojFidhw8lFScyxhtiFHl/i/3zov+1Z5CmY4t9tjIdvSXfu82Y3w7wt0uR9KkucbhkVvJZLQSA==",
+ "version": "14.2.0",
+ "resolved": "https://registry.npmjs.org/cypress/-/cypress-14.2.0.tgz",
+ "integrity": "sha512-u7fuc9JEpSYLOdu8mzZDZ/JWsHUzR5pc8i1TeSqMz/bafXp+6IweMAeyphsEJ6/13qbB6nwTEY1m+GUAp6GqCQ==",
"dev": true,
"hasInstallScript": true,
"license": "MIT",
"dependencies": {
- "@cypress/request": "^3.0.6",
+ "@cypress/request": "^3.0.7",
"@cypress/xvfb": "^1.2.4",
"@types/sinonjs__fake-timers": "8.1.1",
"@types/sizzle": "^2.3.2",
@@ -4343,9 +4671,9 @@
"cachedir": "^2.3.0",
"chalk": "^4.1.0",
"check-more-types": "^2.24.0",
- "ci-info": "^4.0.0",
+ "ci-info": "^4.1.0",
"cli-cursor": "^3.1.0",
- "cli-table3": "~0.6.1",
+ "cli-table3": "~0.6.5",
"commander": "^6.2.1",
"common-tags": "^1.8.0",
"dayjs": "^1.10.4",
@@ -4380,7 +4708,7 @@
"cypress": "bin/cypress"
},
"engines": {
- "node": "^16.0.0 || ^18.0.0 || >=20.0.0"
+ "node": "^18.0.0 || ^20.0.0 || >=22.0.0"
}
},
"node_modules/cypress-file-upload": {
@@ -4614,16 +4942,13 @@
}
},
"node_modules/detect-libc": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz",
- "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==",
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz",
+ "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==",
"dev": true,
"license": "Apache-2.0",
- "bin": {
- "detect-libc": "bin/detect-libc.js"
- },
"engines": {
- "node": ">=0.10"
+ "node": ">=8"
}
},
"node_modules/diff": {
@@ -4762,6 +5087,13 @@
"node": ">= 0.4"
}
},
+ "node_modules/eastasianwidth": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
+ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/ecc-jsbn": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
@@ -4774,9 +5106,9 @@
}
},
"node_modules/electron-to-chromium": {
- "version": "1.5.93",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.93.tgz",
- "integrity": "sha512-M+29jTcfNNoR9NV7la4SwUqzWAxEwnc7ThA5e1m6LRSotmpfpCpLcIfgtSCVL+MllNLgAyM/5ru86iMRemPzDQ==",
+ "version": "1.5.119",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.119.tgz",
+ "integrity": "sha512-Ku4NMzUjz3e3Vweh7PhApPrZSS4fyiCIbcIrG9eKrriYVLmbMepETR/v6SU7xPm98QTqMSYiCwfO89QNjXLkbQ==",
"dev": true,
"license": "ISC"
},
@@ -4965,13 +5297,16 @@
}
},
"node_modules/es-shim-unscopables": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz",
- "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz",
+ "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "hasown": "^2.0.0"
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
}
},
"node_modules/es-to-primitive": {
@@ -4993,9 +5328,9 @@
}
},
"node_modules/esbuild": {
- "version": "0.24.2",
- "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.2.tgz",
- "integrity": "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==",
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.1.tgz",
+ "integrity": "sha512-BGO5LtrGC7vxnqucAe/rmvKdJllfGaYWdyABvyMoXQlfYMb2bbRuReWR5tEGE//4LcNJj9XrkovTqNYRFZHAMQ==",
"dev": true,
"hasInstallScript": true,
"license": "MIT",
@@ -5006,31 +5341,31 @@
"node": ">=18"
},
"optionalDependencies": {
- "@esbuild/aix-ppc64": "0.24.2",
- "@esbuild/android-arm": "0.24.2",
- "@esbuild/android-arm64": "0.24.2",
- "@esbuild/android-x64": "0.24.2",
- "@esbuild/darwin-arm64": "0.24.2",
- "@esbuild/darwin-x64": "0.24.2",
- "@esbuild/freebsd-arm64": "0.24.2",
- "@esbuild/freebsd-x64": "0.24.2",
- "@esbuild/linux-arm": "0.24.2",
- "@esbuild/linux-arm64": "0.24.2",
- "@esbuild/linux-ia32": "0.24.2",
- "@esbuild/linux-loong64": "0.24.2",
- "@esbuild/linux-mips64el": "0.24.2",
- "@esbuild/linux-ppc64": "0.24.2",
- "@esbuild/linux-riscv64": "0.24.2",
- "@esbuild/linux-s390x": "0.24.2",
- "@esbuild/linux-x64": "0.24.2",
- "@esbuild/netbsd-arm64": "0.24.2",
- "@esbuild/netbsd-x64": "0.24.2",
- "@esbuild/openbsd-arm64": "0.24.2",
- "@esbuild/openbsd-x64": "0.24.2",
- "@esbuild/sunos-x64": "0.24.2",
- "@esbuild/win32-arm64": "0.24.2",
- "@esbuild/win32-ia32": "0.24.2",
- "@esbuild/win32-x64": "0.24.2"
+ "@esbuild/aix-ppc64": "0.25.1",
+ "@esbuild/android-arm": "0.25.1",
+ "@esbuild/android-arm64": "0.25.1",
+ "@esbuild/android-x64": "0.25.1",
+ "@esbuild/darwin-arm64": "0.25.1",
+ "@esbuild/darwin-x64": "0.25.1",
+ "@esbuild/freebsd-arm64": "0.25.1",
+ "@esbuild/freebsd-x64": "0.25.1",
+ "@esbuild/linux-arm": "0.25.1",
+ "@esbuild/linux-arm64": "0.25.1",
+ "@esbuild/linux-ia32": "0.25.1",
+ "@esbuild/linux-loong64": "0.25.1",
+ "@esbuild/linux-mips64el": "0.25.1",
+ "@esbuild/linux-ppc64": "0.25.1",
+ "@esbuild/linux-riscv64": "0.25.1",
+ "@esbuild/linux-s390x": "0.25.1",
+ "@esbuild/linux-x64": "0.25.1",
+ "@esbuild/netbsd-arm64": "0.25.1",
+ "@esbuild/netbsd-x64": "0.25.1",
+ "@esbuild/openbsd-arm64": "0.25.1",
+ "@esbuild/openbsd-x64": "0.25.1",
+ "@esbuild/sunos-x64": "0.25.1",
+ "@esbuild/win32-arm64": "0.25.1",
+ "@esbuild/win32-ia32": "0.25.1",
+ "@esbuild/win32-x64": "0.25.1"
}
},
"node_modules/escalade": {
@@ -5261,70 +5596,72 @@
}
},
"node_modules/eslint-plugin-vue": {
- "version": "8.7.1",
- "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-8.7.1.tgz",
- "integrity": "sha512-28sbtm4l4cOzoO1LtzQPxfxhQABararUb1JtqusQqObJpWX2e/gmVyeYVfepizPFne0Q5cILkYGiBoV36L12Wg==",
+ "version": "9.33.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.33.0.tgz",
+ "integrity": "sha512-174lJKuNsuDIlLpjeXc5E2Tss8P44uIimAfGD0b90k0NoirJqpG7stLuU9Vp/9ioTOrQdWVREc4mRd1BD+CvGw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "eslint-utils": "^3.0.0",
+ "@eslint-community/eslint-utils": "^4.4.0",
+ "globals": "^13.24.0",
"natural-compare": "^1.4.0",
- "nth-check": "^2.0.1",
- "postcss-selector-parser": "^6.0.9",
- "semver": "^7.3.5",
- "vue-eslint-parser": "^8.0.1"
+ "nth-check": "^2.1.1",
+ "postcss-selector-parser": "^6.0.15",
+ "semver": "^7.6.3",
+ "vue-eslint-parser": "^9.4.3",
+ "xml-name-validator": "^4.0.0"
},
"engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ "node": "^14.17.0 || >=16.0.0"
},
"peerDependencies": {
- "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0"
+ "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0 || ^9.0.0"
}
},
- "node_modules/eslint-scope": {
- "version": "7.2.2",
- "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz",
- "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==",
+ "node_modules/eslint-plugin-vue/node_modules/globals": {
+ "version": "13.24.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz",
+ "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
"dev": true,
- "license": "BSD-2-Clause",
+ "license": "MIT",
"dependencies": {
- "esrecurse": "^4.3.0",
- "estraverse": "^5.2.0"
+ "type-fest": "^0.20.2"
},
"engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ "node": ">=8"
},
"funding": {
- "url": "https://opencollective.com/eslint"
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/eslint-utils": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz",
- "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==",
+ "node_modules/eslint-plugin-vue/node_modules/type-fest": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
"dev": true,
- "license": "MIT",
- "dependencies": {
- "eslint-visitor-keys": "^2.0.0"
- },
+ "license": "(MIT OR CC0-1.0)",
"engines": {
- "node": "^10.0.0 || ^12.0.0 || >= 14.0.0"
+ "node": ">=10"
},
"funding": {
- "url": "https://github.com/sponsors/mysticatea"
- },
- "peerDependencies": {
- "eslint": ">=5"
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/eslint-utils/node_modules/eslint-visitor-keys": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
- "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
+ "node_modules/eslint-scope": {
+ "version": "7.2.2",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz",
+ "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==",
"dev": true,
- "license": "Apache-2.0",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
+ },
"engines": {
- "node": ">=10"
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
}
},
"node_modules/eslint-visitor-keys": {
@@ -5340,19 +5677,6 @@
"url": "https://opencollective.com/eslint"
}
},
- "node_modules/eslint/node_modules/glob-parent": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
- "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "is-glob": "^4.0.3"
- },
- "engines": {
- "node": ">=10.13.0"
- }
- },
"node_modules/eslint/node_modules/globals": {
"version": "13.24.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz",
@@ -5558,6 +5882,19 @@
"node": ">=8.6.0"
}
},
+ "node_modules/fast-glob/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
"node_modules/fast-json-stable-stringify": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
@@ -5600,9 +5937,9 @@
}
},
"node_modules/fastq": {
- "version": "1.19.0",
- "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.0.tgz",
- "integrity": "sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA==",
+ "version": "1.19.1",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz",
+ "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==",
"dev": true,
"license": "ISC",
"dependencies": {
@@ -5619,6 +5956,21 @@
"pend": "~1.2.0"
}
},
+ "node_modules/fdir": {
+ "version": "6.4.3",
+ "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.3.tgz",
+ "integrity": "sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "picomatch": "^3 || ^4"
+ },
+ "peerDependenciesMeta": {
+ "picomatch": {
+ "optional": true
+ }
+ }
+ },
"node_modules/figures": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz",
@@ -5703,10 +6055,49 @@
"node": "^10.12.0 || >=12.0.0"
}
},
+ "node_modules/flat-cache/node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "deprecated": "Glob versions prior to v9 are no longer supported",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/flat-cache/node_modules/rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "deprecated": "Rimraf versions prior to v4 are no longer supported",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "glob": "^7.1.3"
+ },
+ "bin": {
+ "rimraf": "bin.js"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
"node_modules/flatted": {
- "version": "3.3.2",
- "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz",
- "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==",
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz",
+ "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==",
"license": "ISC"
},
"node_modules/focus-lock": {
@@ -5728,9 +6119,9 @@
"license": "W3C"
},
"node_modules/for-each": {
- "version": "0.3.4",
- "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.4.tgz",
- "integrity": "sha512-kKaIINnFpzW6ffJNDjjyjrk21BkDx38c0xa/klsT8VzLCaMEefv4ZTacrcVR4DmgTeBra++jMDAfS/tS799YDw==",
+ "version": "0.3.5",
+ "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz",
+ "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -5743,6 +6134,36 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/foreground-child": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz",
+ "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "cross-spawn": "^7.0.6",
+ "signal-exit": "^4.0.1"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/foreground-child/node_modules/signal-exit": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+ "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
"node_modules/forever-agent": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
@@ -5754,14 +6175,15 @@
}
},
"node_modules/form-data": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz",
- "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==",
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz",
+ "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==",
"dev": true,
"license": "MIT",
"dependencies": {
"asynckit": "^0.4.0",
"combined-stream": "^1.0.8",
+ "es-set-tostringtag": "^2.1.0",
"mime-types": "^2.1.12"
},
"engines": {
@@ -5769,9 +6191,9 @@
}
},
"node_modules/fs-extra": {
- "version": "10.1.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
- "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
+ "version": "11.3.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.0.tgz",
+ "integrity": "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -5780,7 +6202,7 @@
"universalify": "^2.0.0"
},
"engines": {
- "node": ">=12"
+ "node": ">=14.14"
}
},
"node_modules/fs.realpath": {
@@ -5866,18 +6288,18 @@
}
},
"node_modules/get-intrinsic": {
- "version": "1.2.7",
- "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.7.tgz",
- "integrity": "sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==",
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
+ "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "call-bind-apply-helpers": "^1.0.1",
+ "call-bind-apply-helpers": "^1.0.2",
"es-define-property": "^1.0.1",
"es-errors": "^1.3.0",
- "es-object-atoms": "^1.0.0",
+ "es-object-atoms": "^1.1.1",
"function-bind": "^1.1.2",
- "get-proto": "^1.0.0",
+ "get-proto": "^1.0.1",
"gopd": "^1.2.0",
"has-symbols": "^1.1.0",
"hasown": "^2.0.2",
@@ -5959,38 +6381,66 @@
}
},
"node_modules/glob": {
- "version": "7.2.3",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
- "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
- "deprecated": "Glob versions prior to v9 are no longer supported",
+ "version": "11.0.1",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.1.tgz",
+ "integrity": "sha512-zrQDm8XPnYEKawJScsnM0QzobJxlT/kHOOlRTio8IH/GrmxRE5fjllkzdaHclIuNjUQTJYH2xHNIGfdpJkDJUw==",
"dev": true,
"license": "ISC",
"dependencies": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.1.1",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
+ "foreground-child": "^3.1.0",
+ "jackspeak": "^4.0.1",
+ "minimatch": "^10.0.0",
+ "minipass": "^7.1.2",
+ "package-json-from-dist": "^1.0.0",
+ "path-scurry": "^2.0.0"
+ },
+ "bin": {
+ "glob": "dist/esm/bin.mjs"
},
"engines": {
- "node": "*"
+ "node": "20 || >=22"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/glob-parent": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
- "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
"dev": true,
"license": "ISC",
"dependencies": {
- "is-glob": "^4.0.1"
+ "is-glob": "^4.0.3"
},
"engines": {
- "node": ">= 6"
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/glob/node_modules/brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/glob/node_modules/minimatch": {
+ "version": "10.0.1",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz",
+ "integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": "20 || >=22"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/global": {
@@ -6019,6 +6469,16 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/global-dirs/node_modules/ini": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz",
+ "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/global-modules": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz",
@@ -6505,13 +6965,13 @@
"license": "ISC"
},
"node_modules/ini": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz",
- "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==",
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-5.0.0.tgz",
+ "integrity": "sha512-+N0ngpO3e7cRUWOJAS7qw0IZIVc6XPrW4MlFBdD066F2L4k1L6ker3hLqSq7iXxU5tgS4WGkIUElWn5vogAEnw==",
"dev": true,
"license": "ISC",
"engines": {
- "node": ">=10"
+ "node": "^18.17.0 || >=20.5.0"
}
},
"node_modules/internal-slot": {
@@ -6597,19 +7057,6 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/is-binary-path": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
- "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "binary-extensions": "^2.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/is-boolean-object": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz",
@@ -6624,23 +7071,7 @@
"node": ">= 0.4"
},
"funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-builtin-module": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz",
- "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "builtin-modules": "^3.3.0"
- },
- "engines": {
- "node": ">=6"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/is-callable": {
@@ -7078,17 +7509,33 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/jackspeak": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.0.tgz",
+ "integrity": "sha512-9DDdhb5j6cpeitCbvLO7n7J4IxnbM6hoF6O1g4HQ5TfhvvKN8ywDM7668ZhMHRqVmxqhps/F6syWK2KcPxYlkw==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "@isaacs/cliui": "^8.0.2"
+ },
+ "engines": {
+ "node": "20 || >=22"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
"node_modules/jasmine-core": {
- "version": "3.99.1",
- "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-3.99.1.tgz",
- "integrity": "sha512-Hu1dmuoGcZ7AfyynN3LsfruwMbxMALMka+YtZeGoLuDEySVmVAPaonkNoBRIw/ectu8b9tVQCJNgp4a4knp+tg==",
+ "version": "5.6.0",
+ "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-5.6.0.tgz",
+ "integrity": "sha512-niVlkeYVRwKFpmfWg6suo6H9CrNnydfBLEqefM5UjibYS+UoTjZdmvPJSiuyrRLGnFj1eYRhFd/ch+5hSlsFVA==",
"dev": true,
"license": "MIT"
},
"node_modules/joomla-cypress": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/joomla-cypress/-/joomla-cypress-1.3.0.tgz",
- "integrity": "sha512-pBSmhop4IJhZma0noYfuq3KtKOl9qivDk6eSva6GcDq2Anyog1qj1L/4jXS9P2hYg6SXDdyw05mcr1a8IjATpA==",
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/joomla-cypress/-/joomla-cypress-1.3.1.tgz",
+ "integrity": "sha512-8ww37fHL2yVTld8f7BwZuIFc5g1Ba0bCgaxlMGZhqBl89BO+iGaiAXR9uKT5pufjaZEJDBVd92ScTJZLaoeRwQ==",
"dev": true,
"license": "GPL-2.0+",
"dependencies": {
@@ -7096,10 +7543,95 @@
"cypress-file-upload": "^5.0.8"
}
},
+ "node_modules/joomla-cypress/node_modules/commander": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz",
+ "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/joomla-cypress/node_modules/cypress": {
+ "version": "13.17.0",
+ "resolved": "https://registry.npmjs.org/cypress/-/cypress-13.17.0.tgz",
+ "integrity": "sha512-5xWkaPurwkIljojFidhw8lFScyxhtiFHl/i/3zov+1Z5CmY4t9tjIdvSXfu82Y3w7wt0uR9KkucbhkVvJZLQSA==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "dependencies": {
+ "@cypress/request": "^3.0.6",
+ "@cypress/xvfb": "^1.2.4",
+ "@types/sinonjs__fake-timers": "8.1.1",
+ "@types/sizzle": "^2.3.2",
+ "arch": "^2.2.0",
+ "blob-util": "^2.0.2",
+ "bluebird": "^3.7.2",
+ "buffer": "^5.7.1",
+ "cachedir": "^2.3.0",
+ "chalk": "^4.1.0",
+ "check-more-types": "^2.24.0",
+ "ci-info": "^4.0.0",
+ "cli-cursor": "^3.1.0",
+ "cli-table3": "~0.6.1",
+ "commander": "^6.2.1",
+ "common-tags": "^1.8.0",
+ "dayjs": "^1.10.4",
+ "debug": "^4.3.4",
+ "enquirer": "^2.3.6",
+ "eventemitter2": "6.4.7",
+ "execa": "4.1.0",
+ "executable": "^4.1.1",
+ "extract-zip": "2.0.1",
+ "figures": "^3.2.0",
+ "fs-extra": "^9.1.0",
+ "getos": "^3.2.1",
+ "is-installed-globally": "~0.4.0",
+ "lazy-ass": "^1.6.0",
+ "listr2": "^3.8.3",
+ "lodash": "^4.17.21",
+ "log-symbols": "^4.0.0",
+ "minimist": "^1.2.8",
+ "ospath": "^1.2.2",
+ "pretty-bytes": "^5.6.0",
+ "process": "^0.11.10",
+ "proxy-from-env": "1.0.0",
+ "request-progress": "^3.0.0",
+ "semver": "^7.5.3",
+ "supports-color": "^8.1.1",
+ "tmp": "~0.2.3",
+ "tree-kill": "1.2.2",
+ "untildify": "^4.0.0",
+ "yauzl": "^2.10.0"
+ },
+ "bin": {
+ "cypress": "bin/cypress"
+ },
+ "engines": {
+ "node": "^16.0.0 || ^18.0.0 || >=20.0.0"
+ }
+ },
+ "node_modules/joomla-cypress/node_modules/fs-extra": {
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
+ "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "at-least-node": "^1.0.0",
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/joomla-ui-custom-elements": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/joomla-ui-custom-elements/-/joomla-ui-custom-elements-0.2.0.tgz",
- "integrity": "sha512-Rgm5yjvYn3C9juR9QMU/8H4mBXtpayb6zfgA5uIx7EHgGjGQzk3njCykatC7mrcrIjp3Fei5hghP5nHpQxlbGg==",
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/joomla-ui-custom-elements/-/joomla-ui-custom-elements-0.4.1.tgz",
+ "integrity": "sha512-hqmls4050GehK78WyIm+sPUEZSEbUgy9KqmJkzwqtRx+vQ0nf25K37xAgZwxMwxHX26Mjcx6vCyKM8XKhDnDdg==",
"license": "GPL-2.0-or-later"
},
"node_modules/jquery": {
@@ -7241,6 +7773,16 @@
"verror": "1.10.0"
}
},
+ "node_modules/jssha": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/jssha/-/jssha-3.3.1.tgz",
+ "integrity": "sha512-VCMZj12FCFMQYcFLPRm/0lOBbLi8uM2BhXPTqw3U4YAfs4AZfiApOoBLoN8cQE60Z50m1MYMTQVCfgF/KaCVhQ==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": "*"
+ }
+ },
"node_modules/keyv": {
"version": "4.5.4",
"resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
@@ -7330,13 +7872,13 @@
"license": "MIT"
},
"node_modules/lightningcss": {
- "version": "1.29.1",
- "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.29.1.tgz",
- "integrity": "sha512-FmGoeD4S05ewj+AkhTY+D+myDvXI6eL27FjHIjoyUkO/uw7WZD1fBVs0QxeYWa7E17CUHJaYX/RUGISCtcrG4Q==",
+ "version": "1.29.3",
+ "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.29.3.tgz",
+ "integrity": "sha512-GlOJwTIP6TMIlrTFsxTerwC0W6OpQpCGuX1ECRLBUVRh6fpJH3xTqjCjRgQHTb4ZXexH9rtHou1Lf03GKzmhhQ==",
"dev": true,
"license": "MPL-2.0",
"dependencies": {
- "detect-libc": "^1.0.3"
+ "detect-libc": "^2.0.3"
},
"engines": {
"node": ">= 12.0.0"
@@ -7346,22 +7888,22 @@
"url": "https://opencollective.com/parcel"
},
"optionalDependencies": {
- "lightningcss-darwin-arm64": "1.29.1",
- "lightningcss-darwin-x64": "1.29.1",
- "lightningcss-freebsd-x64": "1.29.1",
- "lightningcss-linux-arm-gnueabihf": "1.29.1",
- "lightningcss-linux-arm64-gnu": "1.29.1",
- "lightningcss-linux-arm64-musl": "1.29.1",
- "lightningcss-linux-x64-gnu": "1.29.1",
- "lightningcss-linux-x64-musl": "1.29.1",
- "lightningcss-win32-arm64-msvc": "1.29.1",
- "lightningcss-win32-x64-msvc": "1.29.1"
+ "lightningcss-darwin-arm64": "1.29.3",
+ "lightningcss-darwin-x64": "1.29.3",
+ "lightningcss-freebsd-x64": "1.29.3",
+ "lightningcss-linux-arm-gnueabihf": "1.29.3",
+ "lightningcss-linux-arm64-gnu": "1.29.3",
+ "lightningcss-linux-arm64-musl": "1.29.3",
+ "lightningcss-linux-x64-gnu": "1.29.3",
+ "lightningcss-linux-x64-musl": "1.29.3",
+ "lightningcss-win32-arm64-msvc": "1.29.3",
+ "lightningcss-win32-x64-msvc": "1.29.3"
}
},
"node_modules/lightningcss-darwin-arm64": {
- "version": "1.29.1",
- "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.29.1.tgz",
- "integrity": "sha512-HtR5XJ5A0lvCqYAoSv2QdZZyoHNttBpa5EP9aNuzBQeKGfbyH5+UipLWvVzpP4Uml5ej4BYs5I9Lco9u1fECqw==",
+ "version": "1.29.3",
+ "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.29.3.tgz",
+ "integrity": "sha512-fb7raKO3pXtlNbQbiMeEu8RbBVHnpyqAoxTyTRMEWFQWmscGC2wZxoHzZ+YKAepUuKT9uIW5vL2QbFivTgprZg==",
"cpu": [
"arm64"
],
@@ -7380,9 +7922,9 @@
}
},
"node_modules/lightningcss-darwin-x64": {
- "version": "1.29.1",
- "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.29.1.tgz",
- "integrity": "sha512-k33G9IzKUpHy/J/3+9MCO4e+PzaFblsgBjSGlpAaFikeBFm8B/CkO3cKU9oI4g+fjS2KlkLM/Bza9K/aw8wsNA==",
+ "version": "1.29.3",
+ "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.29.3.tgz",
+ "integrity": "sha512-KF2XZ4ZdmDGGtEYmx5wpzn6u8vg7AdBHaEOvDKu8GOs7xDL/vcU2vMKtTeNe1d4dogkDdi3B9zC77jkatWBwEQ==",
"cpu": [
"x64"
],
@@ -7401,9 +7943,9 @@
}
},
"node_modules/lightningcss-freebsd-x64": {
- "version": "1.29.1",
- "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.29.1.tgz",
- "integrity": "sha512-0SUW22fv/8kln2LnIdOCmSuXnxgxVC276W5KLTwoehiO0hxkacBxjHOL5EtHD8BAXg2BvuhsJPmVMasvby3LiQ==",
+ "version": "1.29.3",
+ "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.29.3.tgz",
+ "integrity": "sha512-VUWeVf+V1UM54jv9M4wen9vMlIAyT69Krl9XjI8SsRxz4tdNV/7QEPlW6JASev/pYdiynUCW0pwaFquDRYdxMw==",
"cpu": [
"x64"
],
@@ -7422,9 +7964,9 @@
}
},
"node_modules/lightningcss-linux-arm-gnueabihf": {
- "version": "1.29.1",
- "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.29.1.tgz",
- "integrity": "sha512-sD32pFvlR0kDlqsOZmYqH/68SqUMPNj+0pucGxToXZi4XZgZmqeX/NkxNKCPsswAXU3UeYgDSpGhu05eAufjDg==",
+ "version": "1.29.3",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.29.3.tgz",
+ "integrity": "sha512-UhgZ/XVNfXQVEJrMIWeK1Laj8KbhjbIz7F4znUk7G4zeGw7TRoJxhb66uWrEsonn1+O45w//0i0Fu0wIovYdYg==",
"cpu": [
"arm"
],
@@ -7443,9 +7985,9 @@
}
},
"node_modules/lightningcss-linux-arm64-gnu": {
- "version": "1.29.1",
- "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.29.1.tgz",
- "integrity": "sha512-0+vClRIZ6mmJl/dxGuRsE197o1HDEeeRk6nzycSy2GofC2JsY4ifCRnvUWf/CUBQmlrvMzt6SMQNMSEu22csWQ==",
+ "version": "1.29.3",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.29.3.tgz",
+ "integrity": "sha512-Pqau7jtgJNmQ/esugfmAT1aCFy/Gxc92FOxI+3n+LbMHBheBnk41xHDhc0HeYlx9G0xP5tK4t0Koy3QGGNqypw==",
"cpu": [
"arm64"
],
@@ -7464,9 +8006,9 @@
}
},
"node_modules/lightningcss-linux-arm64-musl": {
- "version": "1.29.1",
- "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.29.1.tgz",
- "integrity": "sha512-UKMFrG4rL/uHNgelBsDwJcBqVpzNJbzsKkbI3Ja5fg00sgQnHw/VrzUTEc4jhZ+AN2BvQYz/tkHu4vt1kLuJyw==",
+ "version": "1.29.3",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.29.3.tgz",
+ "integrity": "sha512-dxakOk66pf7KLS7VRYFO7B8WOJLecE5OPL2YOk52eriFd/yeyxt2Km5H0BjLfElokIaR+qWi33gB8MQLrdAY3A==",
"cpu": [
"arm64"
],
@@ -7485,9 +8027,9 @@
}
},
"node_modules/lightningcss-linux-x64-gnu": {
- "version": "1.29.1",
- "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.29.1.tgz",
- "integrity": "sha512-u1S+xdODy/eEtjADqirA774y3jLcm8RPtYztwReEXoZKdzgsHYPl0s5V52Tst+GKzqjebkULT86XMSxejzfISw==",
+ "version": "1.29.3",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.29.3.tgz",
+ "integrity": "sha512-ySZTNCpbfbK8rqpKJeJR2S0g/8UqqV3QnzcuWvpI60LWxnFN91nxpSSwCbzfOXkzKfar9j5eOuOplf+klKtINg==",
"cpu": [
"x64"
],
@@ -7506,9 +8048,9 @@
}
},
"node_modules/lightningcss-linux-x64-musl": {
- "version": "1.29.1",
- "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.29.1.tgz",
- "integrity": "sha512-L0Tx0DtaNUTzXv0lbGCLB/c/qEADanHbu4QdcNOXLIe1i8i22rZRpbT3gpWYsCh9aSL9zFujY/WmEXIatWvXbw==",
+ "version": "1.29.3",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.29.3.tgz",
+ "integrity": "sha512-3pVZhIzW09nzi10usAXfIGTTSTYQ141dk88vGFNCgawIzayiIzZQxEcxVtIkdvlEq2YuFsL9Wcj/h61JHHzuFQ==",
"cpu": [
"x64"
],
@@ -7527,9 +8069,9 @@
}
},
"node_modules/lightningcss-win32-arm64-msvc": {
- "version": "1.29.1",
- "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.29.1.tgz",
- "integrity": "sha512-QoOVnkIEFfbW4xPi+dpdft/zAKmgLgsRHfJalEPYuJDOWf7cLQzYg0DEh8/sn737FaeMJxHZRc1oBreiwZCjog==",
+ "version": "1.29.3",
+ "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.29.3.tgz",
+ "integrity": "sha512-VRnkAvtIkeWuoBJeGOTrZxsNp4HogXtcaaLm8agmbYtLDOhQdpgxW6NjZZjDXbvGF+eOehGulXZ3C1TiwHY4QQ==",
"cpu": [
"arm64"
],
@@ -7548,9 +8090,9 @@
}
},
"node_modules/lightningcss-win32-x64-msvc": {
- "version": "1.29.1",
- "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.29.1.tgz",
- "integrity": "sha512-NygcbThNBe4JElP+olyTI/doBNGJvLs3bFCRPdvuCcxZCcCZ71B858IHpdm7L1btZex0FvCmM17FK98Y9MRy1Q==",
+ "version": "1.29.3",
+ "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.29.3.tgz",
+ "integrity": "sha512-IszwRPu2cPnDQsZpd7/EAr0x2W7jkaWqQ1SwCVIZ/tSbZVXPLt6k8s6FkcyBjViCzvB5CW0We0QbbP7zp2aBjQ==",
"cpu": [
"x64"
],
@@ -7744,13 +8286,12 @@
}
},
"node_modules/magic-string": {
- "version": "0.25.9",
- "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz",
- "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==",
- "dev": true,
+ "version": "0.30.17",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz",
+ "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==",
"license": "MIT",
"dependencies": {
- "sourcemap-codec": "^1.4.8"
+ "@jridgewell/sourcemap-codec": "^1.5.0"
}
},
"node_modules/mailparser": {
@@ -7911,6 +8452,19 @@
"node": ">=8.6"
}
},
+ "node_modules/micromatch/node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
"node_modules/mime-db": {
"version": "1.52.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
@@ -8000,6 +8554,16 @@
"node": ">= 6"
}
},
+ "node_modules/minipass": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
+ "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ }
+ },
"node_modules/ms": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
@@ -8031,9 +8595,9 @@
"license": "MIT"
},
"node_modules/nanoid": {
- "version": "3.3.8",
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz",
- "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==",
+ "version": "3.3.9",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.9.tgz",
+ "integrity": "sha512-SppoicMGpZvbF1l3z4x7No3OlIjP7QJvC9XR7AhZr1kL133KHnKPztkKDc+Ir4aJ/1VhTySrtKhrsycmrMQfvg==",
"funding": [
{
"type": "github",
@@ -8169,15 +8733,16 @@
}
},
"node_modules/object.entries": {
- "version": "1.1.8",
- "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz",
- "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==",
+ "version": "1.1.9",
+ "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz",
+ "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "call-bind": "^1.0.7",
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.4",
"define-properties": "^1.2.1",
- "es-object-atoms": "^1.0.0"
+ "es-object-atoms": "^1.1.1"
},
"engines": {
"node": ">= 0.4"
@@ -8363,6 +8928,13 @@
"node": ">=6"
}
},
+ "node_modules/package-json-from-dist": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz",
+ "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==",
+ "dev": true,
+ "license": "BlueOak-1.0.0"
+ },
"node_modules/parent-module": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
@@ -8446,6 +9018,33 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/path-scurry": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz",
+ "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "lru-cache": "^11.0.0",
+ "minipass": "^7.1.2"
+ },
+ "engines": {
+ "node": "20 || >=22"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/path-scurry/node_modules/lru-cache": {
+ "version": "11.0.2",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.0.2.tgz",
+ "integrity": "sha512-123qHRfJBmo2jXDbo/a5YOQrJoHF/GNQTLzQ5+IdK5pWpceK17yRc6ozlWd25FxvGKQbIUs91fDFkXmDHTKcyA==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": "20 || >=22"
+ }
+ },
"node_modules/path-type": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
@@ -8481,15 +9080,15 @@
"license": "MIT"
},
"node_modules/pg": {
- "version": "8.13.1",
- "resolved": "https://registry.npmjs.org/pg/-/pg-8.13.1.tgz",
- "integrity": "sha512-OUir1A0rPNZlX//c7ksiu7crsGZTKSOXJPgtNiHGIlC9H0lO+NC6ZDYksSgBYY/thSWhnSRBv8w1lieNNGATNQ==",
+ "version": "8.14.0",
+ "resolved": "https://registry.npmjs.org/pg/-/pg-8.14.0.tgz",
+ "integrity": "sha512-nXbVpyoaXVmdqlKEzToFf37qzyeeh7mbiXsnoWvstSqohj88yaa/I/Rq/HEVn2QPSZEuLIJa/jSpRDyzjEx4FQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"pg-connection-string": "^2.7.0",
- "pg-pool": "^3.7.0",
- "pg-protocol": "^1.7.0",
+ "pg-pool": "^3.8.0",
+ "pg-protocol": "^1.8.0",
"pg-types": "^2.1.0",
"pgpass": "1.x"
},
@@ -8534,9 +9133,9 @@
}
},
"node_modules/pg-pool": {
- "version": "3.7.0",
- "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.7.0.tgz",
- "integrity": "sha512-ZOBQForurqh4zZWjrgSwwAtzJ7QiRX0ovFkZr2klsen3Nm0aoh33Ls0fzfv3imeH/nw/O27cjdz5kzYJfeGp/g==",
+ "version": "3.8.0",
+ "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.8.0.tgz",
+ "integrity": "sha512-VBw3jiVm6ZOdLBTIcXLNdSotb6Iy3uOCwDGFAksZCXmi10nyRvnP2v3jl4d+IsLYRyXf6o9hIm/ZtUzlByNUdw==",
"dev": true,
"license": "MIT",
"peerDependencies": {
@@ -8544,9 +9143,9 @@
}
},
"node_modules/pg-protocol": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.7.0.tgz",
- "integrity": "sha512-hTK/mE36i8fDDhgDFjy6xNOG+LCorxLG3WO17tku+ij6sVHXh1jQUJ8hYAnRhNla4QVD2H8er/FOjc/+EgC6yQ==",
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.8.0.tgz",
+ "integrity": "sha512-jvuYlEkL03NRvOoyoRktBK7+qU5kOvlAwvmrH8sr3wbLrOdVWsRxQfz8mMy9sZFsqJ1hEWNfdWKI4SAmoL+j7g==",
"dev": true,
"license": "MIT"
},
@@ -8584,13 +9183,13 @@
"license": "ISC"
},
"node_modules/picomatch": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
- "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz",
+ "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==",
"dev": true,
"license": "MIT",
"engines": {
- "node": ">=8.6"
+ "node": ">=12"
},
"funding": {
"url": "https://github.com/sponsors/jonschlinkert"
@@ -8607,9 +9206,9 @@
}
},
"node_modules/possible-typed-array-names": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz",
- "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz",
+ "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==",
"dev": true,
"license": "MIT",
"engines": {
@@ -8617,9 +9216,9 @@
}
},
"node_modules/postcss": {
- "version": "8.5.1",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.1.tgz",
- "integrity": "sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==",
+ "version": "8.5.3",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz",
+ "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==",
"funding": [
{
"type": "opencollective",
@@ -8859,13 +9458,13 @@
"license": "MIT"
},
"node_modules/qs": {
- "version": "6.13.1",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.1.tgz",
- "integrity": "sha512-EJPeIn0CYrGu+hli1xilKAPXODtJ12T0sP63Ijx2/khC2JtuaN3JyNIpvmnkmaEtha9ocbG4A4cMcr+TvqvwQg==",
+ "version": "6.14.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz",
+ "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==",
"dev": true,
"license": "BSD-3-Clause",
"dependencies": {
- "side-channel": "^1.0.6"
+ "side-channel": "^1.1.0"
},
"engines": {
"node": ">=0.6"
@@ -9069,16 +9668,17 @@
"license": "MIT"
},
"node_modules/readdirp": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
- "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz",
+ "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "picomatch": "^2.2.1"
- },
"engines": {
- "node": ">=8.10.0"
+ "node": ">= 14.18.0"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
}
},
"node_modules/recursive-readdir": {
@@ -9314,9 +9914,9 @@
}
},
"node_modules/reusify": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
- "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz",
+ "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==",
"dev": true,
"license": "MIT",
"engines": {
@@ -9332,17 +9932,20 @@
"license": "MIT"
},
"node_modules/rimraf": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
- "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
- "deprecated": "Rimraf versions prior to v4 are no longer supported",
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-6.0.1.tgz",
+ "integrity": "sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A==",
"dev": true,
"license": "ISC",
"dependencies": {
- "glob": "^7.1.3"
+ "glob": "^11.0.0",
+ "package-json-from-dist": "^1.0.0"
},
"bin": {
- "rimraf": "bin.js"
+ "rimraf": "dist/esm/bin.mjs"
+ },
+ "engines": {
+ "node": "20 || >=22"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
@@ -9355,18 +9958,41 @@
"license": "Apache-2.0"
},
"node_modules/rollup": {
- "version": "2.79.2",
- "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.2.tgz",
- "integrity": "sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==",
+ "version": "4.35.0",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.35.0.tgz",
+ "integrity": "sha512-kg6oI4g+vc41vePJyO6dHt/yl0Rz3Thv0kJeVQ3D1kS3E5XSuKbPc29G4IpT/Kv1KQwgHVcN+HtyS+HYLNSvQg==",
"dev": true,
"license": "MIT",
+ "dependencies": {
+ "@types/estree": "1.0.6"
+ },
"bin": {
"rollup": "dist/bin/rollup"
},
"engines": {
- "node": ">=10.0.0"
+ "node": ">=18.0.0",
+ "npm": ">=8.0.0"
},
"optionalDependencies": {
+ "@rollup/rollup-android-arm-eabi": "4.35.0",
+ "@rollup/rollup-android-arm64": "4.35.0",
+ "@rollup/rollup-darwin-arm64": "4.35.0",
+ "@rollup/rollup-darwin-x64": "4.35.0",
+ "@rollup/rollup-freebsd-arm64": "4.35.0",
+ "@rollup/rollup-freebsd-x64": "4.35.0",
+ "@rollup/rollup-linux-arm-gnueabihf": "4.35.0",
+ "@rollup/rollup-linux-arm-musleabihf": "4.35.0",
+ "@rollup/rollup-linux-arm64-gnu": "4.35.0",
+ "@rollup/rollup-linux-arm64-musl": "4.35.0",
+ "@rollup/rollup-linux-loongarch64-gnu": "4.35.0",
+ "@rollup/rollup-linux-powerpc64le-gnu": "4.35.0",
+ "@rollup/rollup-linux-riscv64-gnu": "4.35.0",
+ "@rollup/rollup-linux-s390x-gnu": "4.35.0",
+ "@rollup/rollup-linux-x64-gnu": "4.35.0",
+ "@rollup/rollup-linux-x64-musl": "4.35.0",
+ "@rollup/rollup-win32-arm64-msvc": "4.35.0",
+ "@rollup/rollup-win32-ia32-msvc": "4.35.0",
+ "@rollup/rollup-win32-x64-msvc": "4.35.0",
"fsevents": "~2.3.2"
}
},
@@ -9403,19 +10029,22 @@
"license": "MIT"
},
"node_modules/rtlcss": {
- "version": "3.5.0",
- "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-3.5.0.tgz",
- "integrity": "sha512-wzgMaMFHQTnyi9YOwsx9LjOxYXJPzS8sYnFaKm6R5ysvTkwzHiB0vxnbHwchHQT65PTdBjDG21/kQBWI7q9O7A==",
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-4.3.0.tgz",
+ "integrity": "sha512-FI+pHEn7Wc4NqKXMXFM+VAYKEj/mRIcW4h24YVwVtyjI+EqGrLc2Hx/Ny0lrZ21cBWU2goLy36eqMcNj3AQJig==",
"dev": true,
"license": "MIT",
"dependencies": {
- "find-up": "^5.0.0",
+ "escalade": "^3.1.1",
"picocolors": "^1.0.0",
- "postcss": "^8.3.11",
+ "postcss": "^8.4.21",
"strip-json-comments": "^3.1.1"
},
"bin": {
"rtlcss": "bin/rtlcss.js"
+ },
+ "engines": {
+ "node": ">=12.0.0"
}
},
"node_modules/run-parallel": {
@@ -9443,9 +10072,9 @@
}
},
"node_modules/rxjs": {
- "version": "7.8.1",
- "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz",
- "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==",
+ "version": "7.8.2",
+ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz",
+ "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
@@ -9453,9 +10082,9 @@
}
},
"node_modules/sa11y": {
- "version": "4.0.4",
- "resolved": "https://registry.npmjs.org/sa11y/-/sa11y-4.0.4.tgz",
- "integrity": "sha512-6uTJWz4hkIE2nv3CItOGBG1x21Xck6dq57H9G6oET8k2eldR0PhrgjuuO4NPNRYfnbCKUAEB/LDxueRH26qLzg==",
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/sa11y/-/sa11y-4.1.1.tgz",
+ "integrity": "sha512-mATbmsSVZky5RtyJbm39XjwntSxb3YADvgk5cdyP/8Em8G8O0mwHoKqyUx7A10QJNJmwfnUDOYuqv83Y14ZcBA==",
"license": "GPL-2.0-or-later",
"dependencies": {
"apca-w3": "^0.1.9",
@@ -9560,9 +10189,9 @@
"license": "MIT"
},
"node_modules/sass-embedded": {
- "version": "1.83.4",
- "resolved": "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.83.4.tgz",
- "integrity": "sha512-Hf2burRA/y5PGxsg6jB9UpoK/xZ6g/pgrkOcdl6j+rRg1Zj8XhGKZ1MTysZGtTPUUmiiErqzkP5+Kzp95yv9GQ==",
+ "version": "1.85.1",
+ "resolved": "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.85.1.tgz",
+ "integrity": "sha512-0i+3h2Df/c71afluxC1SXqyyMmJlnKWfu9ZGdzwuKRM1OftEa2XM2myt5tR36CF3PanYrMjFKtRIj8PfSf838w==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -9582,32 +10211,32 @@
"node": ">=16.0.0"
},
"optionalDependencies": {
- "sass-embedded-android-arm": "1.83.4",
- "sass-embedded-android-arm64": "1.83.4",
- "sass-embedded-android-ia32": "1.83.4",
- "sass-embedded-android-riscv64": "1.83.4",
- "sass-embedded-android-x64": "1.83.4",
- "sass-embedded-darwin-arm64": "1.83.4",
- "sass-embedded-darwin-x64": "1.83.4",
- "sass-embedded-linux-arm": "1.83.4",
- "sass-embedded-linux-arm64": "1.83.4",
- "sass-embedded-linux-ia32": "1.83.4",
- "sass-embedded-linux-musl-arm": "1.83.4",
- "sass-embedded-linux-musl-arm64": "1.83.4",
- "sass-embedded-linux-musl-ia32": "1.83.4",
- "sass-embedded-linux-musl-riscv64": "1.83.4",
- "sass-embedded-linux-musl-x64": "1.83.4",
- "sass-embedded-linux-riscv64": "1.83.4",
- "sass-embedded-linux-x64": "1.83.4",
- "sass-embedded-win32-arm64": "1.83.4",
- "sass-embedded-win32-ia32": "1.83.4",
- "sass-embedded-win32-x64": "1.83.4"
+ "sass-embedded-android-arm": "1.85.1",
+ "sass-embedded-android-arm64": "1.85.1",
+ "sass-embedded-android-ia32": "1.85.1",
+ "sass-embedded-android-riscv64": "1.85.1",
+ "sass-embedded-android-x64": "1.85.1",
+ "sass-embedded-darwin-arm64": "1.85.1",
+ "sass-embedded-darwin-x64": "1.85.1",
+ "sass-embedded-linux-arm": "1.85.1",
+ "sass-embedded-linux-arm64": "1.85.1",
+ "sass-embedded-linux-ia32": "1.85.1",
+ "sass-embedded-linux-musl-arm": "1.85.1",
+ "sass-embedded-linux-musl-arm64": "1.85.1",
+ "sass-embedded-linux-musl-ia32": "1.85.1",
+ "sass-embedded-linux-musl-riscv64": "1.85.1",
+ "sass-embedded-linux-musl-x64": "1.85.1",
+ "sass-embedded-linux-riscv64": "1.85.1",
+ "sass-embedded-linux-x64": "1.85.1",
+ "sass-embedded-win32-arm64": "1.85.1",
+ "sass-embedded-win32-ia32": "1.85.1",
+ "sass-embedded-win32-x64": "1.85.1"
}
},
"node_modules/sass-embedded-android-arm": {
- "version": "1.83.4",
- "resolved": "https://registry.npmjs.org/sass-embedded-android-arm/-/sass-embedded-android-arm-1.83.4.tgz",
- "integrity": "sha512-9Z4pJAOgEkXa3VDY/o+U6l5XvV0mZTJcSl0l/mSPHihjAHSpLYnOW6+KOWeM8dxqrsqTYcd6COzhanI/a++5Gw==",
+ "version": "1.85.1",
+ "resolved": "https://registry.npmjs.org/sass-embedded-android-arm/-/sass-embedded-android-arm-1.85.1.tgz",
+ "integrity": "sha512-GkcgUGMZtEF9gheuE1dxCU0ZSAifuaFXi/aX7ZXvjtdwmTl9Zc/OHR9oiUJkc8IW9UI7H8TuwlTAA8+SwgwIeQ==",
"cpu": [
"arm"
],
@@ -9622,9 +10251,9 @@
}
},
"node_modules/sass-embedded-android-arm64": {
- "version": "1.83.4",
- "resolved": "https://registry.npmjs.org/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.83.4.tgz",
- "integrity": "sha512-tgX4FzmbVqnQmD67ZxQDvI+qFNABrboOQgwsG05E5bA/US42zGajW9AxpECJYiMXVOHmg+d81ICbjb0fsVHskw==",
+ "version": "1.85.1",
+ "resolved": "https://registry.npmjs.org/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.85.1.tgz",
+ "integrity": "sha512-27oRheqNA3SJM2hAxpVbs7mCKUwKPWmEEhyiNFpBINb5ELVLg+Ck5RsGg+SJmo130ul5YX0vinmVB5uPWc8X5w==",
"cpu": [
"arm64"
],
@@ -9639,9 +10268,9 @@
}
},
"node_modules/sass-embedded-android-ia32": {
- "version": "1.83.4",
- "resolved": "https://registry.npmjs.org/sass-embedded-android-ia32/-/sass-embedded-android-ia32-1.83.4.tgz",
- "integrity": "sha512-RsFOziFqPcfZXdFRULC4Ayzy9aK6R6FwQ411broCjlOBX+b0gurjRadkue3cfUEUR5mmy0KeCbp7zVKPLTK+5Q==",
+ "version": "1.85.1",
+ "resolved": "https://registry.npmjs.org/sass-embedded-android-ia32/-/sass-embedded-android-ia32-1.85.1.tgz",
+ "integrity": "sha512-f3x16NyRgtXFksIaO/xXKrUhttUBv8V0XsAR2Dhdb/yz4yrDrhzw9Wh8fmw7PlQqECcQvFaoDr3XIIM6lKzasw==",
"cpu": [
"ia32"
],
@@ -9656,9 +10285,9 @@
}
},
"node_modules/sass-embedded-android-riscv64": {
- "version": "1.83.4",
- "resolved": "https://registry.npmjs.org/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.83.4.tgz",
- "integrity": "sha512-EHwh0nmQarBBrMRU928eTZkFGx19k/XW2YwbPR4gBVdWLkbTgCA5aGe8hTE6/1zStyx++3nDGvTZ78+b/VvvLg==",
+ "version": "1.85.1",
+ "resolved": "https://registry.npmjs.org/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.85.1.tgz",
+ "integrity": "sha512-IP6OijpJ8Mqo7XqCe0LsuZVbAxEFVboa0kXqqR5K55LebEplsTIA2GnmRyMay3Yr/2FVGsZbCb6Wlgkw23eCiA==",
"cpu": [
"riscv64"
],
@@ -9673,9 +10302,9 @@
}
},
"node_modules/sass-embedded-android-x64": {
- "version": "1.83.4",
- "resolved": "https://registry.npmjs.org/sass-embedded-android-x64/-/sass-embedded-android-x64-1.83.4.tgz",
- "integrity": "sha512-0PgQNuPWYy1jEOEPDVsV89KfqOsMLIp9CSbjBY7jRcwRhyVAcigqrUG6bDeNtojHUYKA1kU+Eh/85WxOHUOgBw==",
+ "version": "1.85.1",
+ "resolved": "https://registry.npmjs.org/sass-embedded-android-x64/-/sass-embedded-android-x64-1.85.1.tgz",
+ "integrity": "sha512-Mh7CA53wR3ADvXAYipFc/R3vV4PVOzoKwWzPxmq+7i8UZrtsVjKONxGtqWe9JG1mna0C9CRZAx0sv/BzbOJxWg==",
"cpu": [
"x64"
],
@@ -9690,9 +10319,9 @@
}
},
"node_modules/sass-embedded-darwin-arm64": {
- "version": "1.83.4",
- "resolved": "https://registry.npmjs.org/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.83.4.tgz",
- "integrity": "sha512-rp2ywymWc3nymnSnAFG5R/8hvxWCsuhK3wOnD10IDlmNB7o4rzKby1c+2ZfpQGowlYGWsWWTgz8FW2qzmZsQRw==",
+ "version": "1.85.1",
+ "resolved": "https://registry.npmjs.org/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.85.1.tgz",
+ "integrity": "sha512-msWxzhvcP9hqGVegxVePVEfv9mVNTlUgGr6k7O7Ihji702mbtrH/lKwF4aRkkt4g1j7tv10+JtQXmTNi/pi9kA==",
"cpu": [
"arm64"
],
@@ -9707,9 +10336,9 @@
}
},
"node_modules/sass-embedded-darwin-x64": {
- "version": "1.83.4",
- "resolved": "https://registry.npmjs.org/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.83.4.tgz",
- "integrity": "sha512-kLkN2lXz9PCgGfDS8Ev5YVcl/V2173L6379en/CaFuJJi7WiyPgBymW7hOmfCt4uO4R1y7CP2Uc08DRtZsBlAA==",
+ "version": "1.85.1",
+ "resolved": "https://registry.npmjs.org/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.85.1.tgz",
+ "integrity": "sha512-J4UFHUiyI9Z+mwYMwz11Ky9TYr3hY1fCxeQddjNGL/+ovldtb0yAIHvoVM0BGprQDm5JqhtUk8KyJ3RMJqpaAA==",
"cpu": [
"x64"
],
@@ -9724,9 +10353,9 @@
}
},
"node_modules/sass-embedded-linux-arm": {
- "version": "1.83.4",
- "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.83.4.tgz",
- "integrity": "sha512-nL90ryxX2lNmFucr9jYUyHHx21AoAgdCL1O5Ltx2rKg2xTdytAGHYo2MT5S0LIeKLa/yKP/hjuSvrbICYNDvtA==",
+ "version": "1.85.1",
+ "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.85.1.tgz",
+ "integrity": "sha512-X0fDh95nNSw1wfRlnkE4oscoEA5Au4nnk785s9jghPFkTBg+A+5uB6trCjf0fM22+Iw6kiP4YYmDdw3BqxAKLQ==",
"cpu": [
"arm"
],
@@ -9741,9 +10370,9 @@
}
},
"node_modules/sass-embedded-linux-arm64": {
- "version": "1.83.4",
- "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.83.4.tgz",
- "integrity": "sha512-E0zjsZX2HgESwyqw31EHtI39DKa7RgK7nvIhIRco1d0QEw227WnoR9pjH3M/ZQy4gQj3GKilOFHM5Krs/omeIA==",
+ "version": "1.85.1",
+ "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.85.1.tgz",
+ "integrity": "sha512-jGadetB03BMFG2rq3OXub/uvC/lGpbQOiLGEz3NLb2nRZWyauRhzDtvZqkr6BEhxgIWtMtz2020yD8ZJSw/r2w==",
"cpu": [
"arm64"
],
@@ -9758,9 +10387,9 @@
}
},
"node_modules/sass-embedded-linux-ia32": {
- "version": "1.83.4",
- "resolved": "https://registry.npmjs.org/sass-embedded-linux-ia32/-/sass-embedded-linux-ia32-1.83.4.tgz",
- "integrity": "sha512-ew5HpchSzgAYbQoriRh8QhlWn5Kw2nQ2jHoV9YLwGKe3fwwOWA0KDedssvDv7FWnY/FCqXyymhLd6Bxae4Xquw==",
+ "version": "1.85.1",
+ "resolved": "https://registry.npmjs.org/sass-embedded-linux-ia32/-/sass-embedded-linux-ia32-1.85.1.tgz",
+ "integrity": "sha512-7HlYY90d9mitDtNi5s+S+5wYZrTVbkBH2/kf7ixrzh2BFfT0YM81UHLJRnGX93y9aOMBL6DSZAIfkt1RsV9bkQ==",
"cpu": [
"ia32"
],
@@ -9775,9 +10404,9 @@
}
},
"node_modules/sass-embedded-linux-musl-arm": {
- "version": "1.83.4",
- "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.83.4.tgz",
- "integrity": "sha512-0RrJRwMrmm+gG0VOB5b5Cjs7Sd+lhqpQJa6EJNEaZHljJokEfpE5GejZsGMRMIQLxEvVphZnnxl6sonCGFE/QQ==",
+ "version": "1.85.1",
+ "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.85.1.tgz",
+ "integrity": "sha512-5vcdEqE8QZnu6i6shZo7x2N36V7YUoFotWj2rGekII5ty7Nkaj+VtZhUEOp9tAzEOlaFuDp5CyO1kUCvweT64A==",
"cpu": [
"arm"
],
@@ -9792,9 +10421,9 @@
}
},
"node_modules/sass-embedded-linux-musl-arm64": {
- "version": "1.83.4",
- "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.83.4.tgz",
- "integrity": "sha512-IzMgalf6MZOxgp4AVCgsaWAFDP/IVWOrgVXxkyhw29fyAEoSWBJH4k87wyPhEtxSuzVHLxKNbc8k3UzdWmlBFg==",
+ "version": "1.85.1",
+ "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.85.1.tgz",
+ "integrity": "sha512-FLkIT0p18XOkR6wryJ13LqGBDsrYev2dRk9dtiU18NCpNXruKsdBQ1ZnWHVKB3h1dA9lFyEEisC0sooKdNfeOQ==",
"cpu": [
"arm64"
],
@@ -9809,9 +10438,9 @@
}
},
"node_modules/sass-embedded-linux-musl-ia32": {
- "version": "1.83.4",
- "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-ia32/-/sass-embedded-linux-musl-ia32-1.83.4.tgz",
- "integrity": "sha512-LLb4lYbcxPzX4UaJymYXC+WwokxUlfTJEFUv5VF0OTuSsHAGNRs/rslPtzVBTvMeG9TtlOQDhku1F7G6iaDotA==",
+ "version": "1.85.1",
+ "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-ia32/-/sass-embedded-linux-musl-ia32-1.85.1.tgz",
+ "integrity": "sha512-N1093T84zQJor1yyIAdYScB5eAuQarGK1tKgZ4uTnxVlgA7Xi1lXV8Eh7ox9sDqKCaWkVQ3MjqU26vYRBeRWyw==",
"cpu": [
"ia32"
],
@@ -9826,9 +10455,9 @@
}
},
"node_modules/sass-embedded-linux-musl-riscv64": {
- "version": "1.83.4",
- "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.83.4.tgz",
- "integrity": "sha512-zoKlPzD5Z13HKin1UGR74QkEy+kZEk2AkGX5RelRG494mi+IWwRuWCppXIovor9+BQb9eDWPYPoMVahwN5F7VA==",
+ "version": "1.85.1",
+ "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.85.1.tgz",
+ "integrity": "sha512-WRsZS/7qlfYXsa93FBpSruieuURIu7ySfFhzYfF1IbKrNAGwmbduutkHZh2ddm5/vQMvQ0Rdosgv+CslaQHMcw==",
"cpu": [
"riscv64"
],
@@ -9843,9 +10472,9 @@
}
},
"node_modules/sass-embedded-linux-musl-x64": {
- "version": "1.83.4",
- "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.83.4.tgz",
- "integrity": "sha512-hB8+/PYhfEf2zTIcidO5Bpof9trK6WJjZ4T8g2MrxQh8REVtdPcgIkoxczRynqybf9+fbqbUwzXtiUao2GV+vQ==",
+ "version": "1.85.1",
+ "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.85.1.tgz",
+ "integrity": "sha512-+OlLIilA5TnP0YEqTQ8yZtkW+bJIQYvzoGoNLUEskeyeGuOiIyn2CwL6G4JQB4xZQFaxPHb7JD3EueFkQbH0Pw==",
"cpu": [
"x64"
],
@@ -9860,9 +10489,9 @@
}
},
"node_modules/sass-embedded-linux-riscv64": {
- "version": "1.83.4",
- "resolved": "https://registry.npmjs.org/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.83.4.tgz",
- "integrity": "sha512-83fL4n+oeDJ0Y4KjASmZ9jHS1Vl9ESVQYHMhJE0i4xDi/P3BNarm2rsKljq/QtrwGpbqwn8ujzOu7DsNCMDSHA==",
+ "version": "1.85.1",
+ "resolved": "https://registry.npmjs.org/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.85.1.tgz",
+ "integrity": "sha512-mKKlOwMGLN7yP1p0gB5yG/HX4fYLnpWaqstNuOOXH+fOzTaNg0+1hALg0H0CDIqypPO74M5MS9T6FAJZGdT6dQ==",
"cpu": [
"riscv64"
],
@@ -9877,9 +10506,9 @@
}
},
"node_modules/sass-embedded-linux-x64": {
- "version": "1.83.4",
- "resolved": "https://registry.npmjs.org/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.83.4.tgz",
- "integrity": "sha512-NlnGdvCmTD5PK+LKXlK3sAuxOgbRIEoZfnHvxd157imCm/s2SYF/R28D0DAAjEViyI8DovIWghgbcqwuertXsA==",
+ "version": "1.85.1",
+ "resolved": "https://registry.npmjs.org/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.85.1.tgz",
+ "integrity": "sha512-uKRTv0z8NgtHV7xSren78+yoWB79sNi7TMqI7Bxd8fcRNIgHQSA8QBdF8led2ETC004hr8h71BrY60RPO+SSvA==",
"cpu": [
"x64"
],
@@ -9894,9 +10523,9 @@
}
},
"node_modules/sass-embedded-win32-arm64": {
- "version": "1.83.4",
- "resolved": "https://registry.npmjs.org/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.83.4.tgz",
- "integrity": "sha512-J2BFKrEaeSrVazU2qTjyQdAk+MvbzJeTuCET0uAJEXSKtvQ3AzxvzndS7LqkDPbF32eXAHLw8GVpwcBwKbB3Uw==",
+ "version": "1.85.1",
+ "resolved": "https://registry.npmjs.org/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.85.1.tgz",
+ "integrity": "sha512-/GMiZXBOc6AEMBC3g25Rp+x8fq9Z6Ql7037l5rajBPhZ+DdFwtdHY0Ou3oIU6XuWUwD06U3ii4XufXVFhsP6PA==",
"cpu": [
"arm64"
],
@@ -9911,9 +10540,9 @@
}
},
"node_modules/sass-embedded-win32-ia32": {
- "version": "1.83.4",
- "resolved": "https://registry.npmjs.org/sass-embedded-win32-ia32/-/sass-embedded-win32-ia32-1.83.4.tgz",
- "integrity": "sha512-uPAe9T/5sANFhJS5dcfAOhOJy8/l2TRYG4r+UO3Wp4yhqbN7bggPvY9c7zMYS0OC8tU/bCvfYUDFHYMCl91FgA==",
+ "version": "1.85.1",
+ "resolved": "https://registry.npmjs.org/sass-embedded-win32-ia32/-/sass-embedded-win32-ia32-1.85.1.tgz",
+ "integrity": "sha512-L+4BWkKKBGFOKVQ2PQ5HwFfkM5FvTf1Xx2VSRvEWt9HxPXp6SPDho6zC8fqNQ3hSjoaoASEIJcSvgfdQYO0gdg==",
"cpu": [
"ia32"
],
@@ -9928,9 +10557,9 @@
}
},
"node_modules/sass-embedded-win32-x64": {
- "version": "1.83.4",
- "resolved": "https://registry.npmjs.org/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.83.4.tgz",
- "integrity": "sha512-C9fkDY0jKITdJFij4UbfPFswxoXN9O/Dr79v17fJnstVwtUojzVJWKHUXvF0Zg2LIR7TCc4ju3adejKFxj7ueA==",
+ "version": "1.85.1",
+ "resolved": "https://registry.npmjs.org/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.85.1.tgz",
+ "integrity": "sha512-/FO0AGKWxVfCk4GKsC0yXWBpUZdySe3YAAbQQL0lL6xUd1OiUY8Kow6g4Kc1TB/+z0iuQKKTqI/acJMEYl4iTQ==",
"cpu": [
"x64"
],
@@ -10232,14 +10861,6 @@
"node": ">=0.10.0"
}
},
- "node_modules/sourcemap-codec": {
- "version": "1.4.8",
- "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz",
- "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==",
- "deprecated": "Please use @jridgewell/sourcemap-codec instead",
- "dev": true,
- "license": "MIT"
- },
"node_modules/spdx-correct": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz",
@@ -10354,6 +10975,22 @@
"node": ">=8"
}
},
+ "node_modules/string-width-cjs": {
+ "name": "string-width",
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/string.prototype.trim": {
"version": "1.2.10",
"resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz",
@@ -10426,6 +11063,20 @@
"node": ">=8"
}
},
+ "node_modules/strip-ansi-cjs": {
+ "name": "strip-ansi",
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/strip-bom": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
@@ -10821,22 +11472,22 @@
}
},
"node_modules/tldts": {
- "version": "6.1.76",
- "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.76.tgz",
- "integrity": "sha512-6U2ti64/nppsDxQs9hw8ephA3nO6nSQvVVfxwRw8wLQPFtLI1cFI1a1eP22g+LUP+1TA2pKKjUTwWB+K2coqmQ==",
+ "version": "6.1.84",
+ "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.84.tgz",
+ "integrity": "sha512-aRGIbCIF3teodtUFAYSdQONVmDRy21REM3o6JnqWn5ZkQBJJ4gHxhw6OfwQ+WkSAi3ASamrS4N4nyazWx6uTYg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "tldts-core": "^6.1.76"
+ "tldts-core": "^6.1.84"
},
"bin": {
"tldts": "bin/cli.js"
}
},
"node_modules/tldts-core": {
- "version": "6.1.76",
- "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.76.tgz",
- "integrity": "sha512-uzhJ02RaMzgQR3yPoeE65DrcHI6LoM4saUqXOt/b5hmb3+mc4YWpdSeAQqVqRUlQ14q8ZuLRWyBR1ictK1dzzg==",
+ "version": "6.1.84",
+ "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.84.tgz",
+ "integrity": "sha512-NaQa1W76W2aCGjXybvnMYzGSM4x8fvG2AN/pla7qxcg0ZHbooOPhA8kctmOZUDfZyhDL27OGNbwAeig8P4p1vg==",
"dev": true,
"license": "MIT"
},
@@ -10863,10 +11514,20 @@
"node": ">=8.0"
}
},
+ "node_modules/totp-generator": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/totp-generator/-/totp-generator-1.0.0.tgz",
+ "integrity": "sha512-Iu/1Lk60/MH8FE+5cDWPiGbwKK1hxzSq+KT9oSqhZ1BEczGIKGcN50bP0WMLiIZKRg7t29iWLxw6f81TICQdoA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "jssha": "^3.3.1"
+ }
+ },
"node_modules/tough-cookie": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.0.tgz",
- "integrity": "sha512-rvZUv+7MoBYTiDmFPBrhL7Ujx9Sk+q9wwm22x8c8T5IJaR+Wsyc7TNxbVxo84kZoRJZZMazowFLqpankBEQrGg==",
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.2.tgz",
+ "integrity": "sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==",
"dev": true,
"license": "BSD-3-Clause",
"dependencies": {
@@ -11150,9 +11811,9 @@
}
},
"node_modules/update-browserslist-db": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz",
- "integrity": "sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==",
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz",
+ "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==",
"dev": true,
"funding": [
{
@@ -11276,22 +11937,22 @@
}
},
"node_modules/vue-eslint-parser": {
- "version": "8.3.0",
- "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-8.3.0.tgz",
- "integrity": "sha512-dzHGG3+sYwSf6zFBa0Gi9ZDshD7+ad14DGOdTLjruRVgZXe2J+DcZ9iUhyR48z5g1PqRa20yt3Njna/veLJL/g==",
+ "version": "9.4.3",
+ "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.4.3.tgz",
+ "integrity": "sha512-2rYRLWlIpaiN8xbPiDyXZXRgLGOtWxERV7ND5fFAv5qo1D2N9Fu9MNajBNc6o13lZ+24DAWCkQCvj4klgmcITg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "debug": "^4.3.2",
- "eslint-scope": "^7.0.0",
- "eslint-visitor-keys": "^3.1.0",
- "espree": "^9.0.0",
+ "debug": "^4.3.4",
+ "eslint-scope": "^7.1.1",
+ "eslint-visitor-keys": "^3.3.0",
+ "espree": "^9.3.1",
"esquery": "^1.4.0",
"lodash": "^4.17.21",
- "semver": "^7.3.5"
+ "semver": "^7.3.6"
},
"engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ "node": "^14.17.0 || >=16.0.0"
},
"funding": {
"url": "https://github.com/sponsors/mysticatea"
@@ -11467,16 +12128,17 @@
}
},
"node_modules/which-typed-array": {
- "version": "1.1.18",
- "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.18.tgz",
- "integrity": "sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==",
+ "version": "1.1.19",
+ "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz",
+ "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==",
"dev": true,
"license": "MIT",
"dependencies": {
"available-typed-arrays": "^1.0.7",
"call-bind": "^1.0.8",
- "call-bound": "^1.0.3",
- "for-each": "^0.3.3",
+ "call-bound": "^1.0.4",
+ "for-each": "^0.3.5",
+ "get-proto": "^1.0.1",
"gopd": "^1.2.0",
"has-tostringtag": "^1.0.2"
},
@@ -11515,6 +12177,25 @@
"url": "https://github.com/chalk/wrap-ansi?sponsor=1"
}
},
+ "node_modules/wrap-ansi-cjs": {
+ "name": "wrap-ansi",
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
"node_modules/wrappy": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
@@ -11536,6 +12217,16 @@
"node": "^12.13.0 || ^14.15.0 || >=16.0.0"
}
},
+ "node_modules/xml-name-validator": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz",
+ "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=12"
+ }
+ },
"node_modules/xtend": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
diff --git a/package.json b/package.json
index 8ec2a8c8eafe9..abfb2b5403178 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "joomla",
- "version": "5.3.0",
+ "version": "5.3.1",
"description": "Joomla CMS",
"license": "GPL-2.0-or-later",
"repository": {
@@ -38,21 +38,21 @@
],
"dependencies": {
"@claviska/jquery-minicolors": "^2.3.6",
- "@codemirror/autocomplete": "^6.18.4",
+ "@codemirror/autocomplete": "^6.18.6",
"@codemirror/commands": "^6.8.0",
"@codemirror/lang-css": "^6.3.1",
"@codemirror/lang-html": "^6.4.9",
- "@codemirror/lang-javascript": "^6.2.2",
+ "@codemirror/lang-javascript": "^6.2.3",
"@codemirror/lang-json": "^6.0.1",
"@codemirror/lang-markdown": "^6.3.2",
"@codemirror/lang-php": "^6.0.1",
"@codemirror/lang-xml": "^6.1.0",
- "@codemirror/language": "^6.10.8",
+ "@codemirror/language": "^6.11.0",
"@codemirror/lint": "^6.8.4",
- "@codemirror/search": "^6.5.8",
+ "@codemirror/search": "^6.5.10",
"@codemirror/state": "^6.5.2",
"@codemirror/theme-one-dark": "^6.1.2",
- "@codemirror/view": "^6.36.2",
+ "@codemirror/view": "^6.36.4",
"@fortawesome/fontawesome-free": "^6.7.2",
"@popperjs/core": "^2.11.8",
"@webcomponents/webcomponentsjs": "^2.8.0",
@@ -68,7 +68,7 @@
"es-module-shims": "^1.10.1",
"focus-visible": "^5.2.1",
"hotkeys-js": "^3.13.9",
- "joomla-ui-custom-elements": "^0.2.0",
+ "joomla-ui-custom-elements": "^0.4.1",
"jquery": "^3.7.1",
"jquery-migrate": "^3.5.2",
"mark.js": "^8.11.1",
@@ -77,7 +77,7 @@
"punycode": "^2.3.1",
"qrcode-generator": "^1.4.4",
"roboto-fontface": "^0.10.0",
- "sa11y": "^4.0.4",
+ "sa11y": "^4.1.1",
"shepherd.js": "^11.2.0",
"short-and-sweet": "^1.0.4",
"skipto": "^4.1.7",
@@ -88,42 +88,43 @@
"vuex-persist": "^3.1.3"
},
"devDependencies": {
- "@babel/core": "^7.26.7",
- "@babel/preset-env": "^7.26.7",
- "@rollup/plugin-babel": "^5.3.1",
- "@rollup/plugin-commonjs": "^21.1.0",
- "@rollup/plugin-node-resolve": "^13.3.0",
- "@rollup/plugin-replace": "^3.1.0",
+ "@babel/core": "^7.26.10",
+ "@babel/preset-env": "^7.26.9",
+ "@rollup/plugin-babel": "^6.0.4",
+ "@rollup/plugin-commonjs": "^28.0.3",
+ "@rollup/plugin-node-resolve": "^16.0.1",
+ "@rollup/plugin-replace": "^6.0.2",
"@vue/compiler-sfc": "^3.5.8",
- "chokidar": "^3.6.0",
+ "chokidar": "^4.0.3",
"cli-progress": "^3.12.0",
- "commander": "^8.3.0",
- "core-js": "^3.40.0",
- "cypress": "^13.17.0",
- "esbuild": "^0.24.2",
+ "commander": "^13.1.0",
+ "core-js": "^3.41.0",
+ "cypress": "^14.2.0",
+ "esbuild": "^0.25.1",
"eslint": "^8.57.1",
"eslint-config-airbnb-base": "^15.0.0",
"eslint-plugin-import": "^2.31.0",
- "eslint-plugin-vue": "^8.7.1",
- "fs-extra": "^10.1.0",
- "ini": "^2.0.0",
- "jasmine-core": "^3.99.1",
+ "eslint-plugin-vue": "^9.33.0",
+ "fs-extra": "^11.3.0",
+ "ini": "^5.0.0",
+ "jasmine-core": "^5.6.0",
"joomla-cypress": "^1.3.0",
- "lightningcss": "^1.29.1",
+ "lightningcss": "^1.29.3",
"mysql": "^2.18.1",
- "pg": "^8.13.1",
+ "pg": "^8.14.0",
"postcss-scss": "^4.0.9",
"recursive-readdir": "^2.2.3",
- "rimraf": "^3.0.2",
- "rollup": "^2.79.2",
+ "rimraf": "^6.0.1",
+ "rollup": "^4.35.0",
"rollup-plugin-vue": "^6.0.0",
- "rtlcss": "^3.5.0",
- "sass-embedded": "^1.83.4",
+ "rtlcss": "^4.3.0",
+ "sass-embedded": "^1.85.1",
"semver": "^7.7.1",
"smtp-tester": "^2.1.0",
"stylelint": "^14.16.1",
"stylelint-config-standard": "^24.0.0",
"stylelint-order": "^5.0.0",
- "stylelint-scss": "^4.7.0"
+ "stylelint-scss": "^4.7.0",
+ "totp-generator": "^1.0.0"
}
}
diff --git a/plugins/actionlog/joomla/src/Extension/Joomla.php b/plugins/actionlog/joomla/src/Extension/Joomla.php
index 64d56acf74223..97cda770a924d 100644
--- a/plugins/actionlog/joomla/src/Extension/Joomla.php
+++ b/plugins/actionlog/joomla/src/Extension/Joomla.php
@@ -164,7 +164,7 @@ public function onContentAfterSave(Model\AfterSaveEvent $event): void
return;
}
- list($option, $contentType) = explode('.', $params->type_alias);
+ [$option, $contentType] = explode('.', $params->type_alias);
if (!$this->checkLoggable($option)) {
return;
@@ -183,13 +183,13 @@ public function onContentAfterSave(Model\AfterSaveEvent $event): void
$messageLanguageKey = $defaultLanguageKey;
}
- $id = empty($params->id_holder) ? 0 : $article->get($params->id_holder);
+ $id = empty($params->id_holder) ? 0 : $article->{$params->id_holder};
$message = [
'action' => $isNew ? 'add' : 'update',
'type' => $params->text_prefix . '_TYPE_' . $params->type_title,
'id' => $id,
- 'title' => $article->get($params->title_holder),
+ 'title' => $article->{$params->title_holder} ?? '',
'itemlink' => ActionlogsHelper::getContentTypeLink($option, $contentType, $id, $params->id_holder, $article),
];
@@ -231,13 +231,13 @@ public function onContentAfterDelete(Model\AfterDeleteEvent $event): void
$messageLanguageKey = 'PLG_SYSTEM_ACTIONLOGS_CONTENT_DELETED';
}
- $id = empty($params->id_holder) ? 0 : $article->get($params->id_holder);
+ $id = empty($params->id_holder) ? 0 : $article->{$params->id_holder};
$message = [
'action' => 'delete',
'type' => $params->text_prefix . '_TYPE_' . $params->type_title,
'id' => $id,
- 'title' => $article->get($params->title_holder),
+ 'title' => $article->{$params->title_holder} ?? '',
];
$this->addLog([$message], $messageLanguageKey, $context);
@@ -272,7 +272,7 @@ public function onContentChangeState(Model\AfterChangeStateEvent $event): void
return;
}
- list(, $contentType) = explode('.', $params->type_alias);
+ [, $contentType] = explode('.', $params->type_alias);
switch ($value) {
case 0:
@@ -316,7 +316,7 @@ public function onContentChangeState(Model\AfterChangeStateEvent $event): void
try {
$items = $db->loadObjectList($params->id_holder);
- } catch (\RuntimeException $e) {
+ } catch (\RuntimeException) {
$items = [];
}
@@ -544,7 +544,7 @@ public function onExtensionAfterSave(Model\AfterSaveEvent $event): void
return;
}
- list(, $contentType) = explode('.', $params->type_alias);
+ [, $contentType] = explode('.', $params->type_alias);
if ($isNew) {
$messageLanguageKey = $params->text_prefix . '_' . $params->type_title . '_ADDED';
@@ -875,7 +875,7 @@ public function onUserLoginFailure(User\LoginFailureEvent $event): void
try {
$loggedInUser = $db->loadObject();
- } catch (ExecutionFailureException $e) {
+ } catch (ExecutionFailureException) {
return;
}
diff --git a/plugins/api-authentication/token/src/Extension/Token.php b/plugins/api-authentication/token/src/Extension/Token.php
index b6e21814ba70b..2e82cacf35d9c 100644
--- a/plugins/api-authentication/token/src/Extension/Token.php
+++ b/plugins/api-authentication/token/src/Extension/Token.php
@@ -163,7 +163,7 @@ public function onUserAuthenticate(AuthenticationEvent $event): void
return;
}
- list($algo, $userId, $tokenHMAC) = $parts;
+ [$algo, $userId, $tokenHMAC] = $parts;
/**
* Verify the HMAC algorithm requested in the token string is allowed
@@ -180,7 +180,7 @@ public function onUserAuthenticate(AuthenticationEvent $event): void
*/
try {
$siteSecret = $this->getApplication()->get('secret');
- } catch (\Exception $e) {
+ } catch (\Exception) {
return;
}
@@ -282,7 +282,7 @@ private function getTokenSeedForUser(int $userId): ?string
$query->bind(':userId', $userId, ParameterType::INTEGER);
return $db->setQuery($query)->loadResult();
- } catch (\Exception $e) {
+ } catch (\Exception) {
return null;
}
}
@@ -313,7 +313,7 @@ private function isTokenEnabledForUser(int $userId): bool
$value = $db->setQuery($query)->loadResult();
return $value == 1;
- } catch (\Exception $e) {
+ } catch (\Exception) {
return false;
}
}
diff --git a/plugins/authentication/cookie/src/Extension/Cookie.php b/plugins/authentication/cookie/src/Extension/Cookie.php
index 20b33d8623160..7a1b157ac7654 100644
--- a/plugins/authentication/cookie/src/Extension/Cookie.php
+++ b/plugins/authentication/cookie/src/Extension/Cookie.php
@@ -208,7 +208,7 @@ public function onUserAuthenticate(AuthenticationEvent $event): void
try {
$result = $db->setQuery($query)->loadObject();
- } catch (\RuntimeException $e) {
+ } catch (\RuntimeException) {
$response->status = Authentication::STATUS_FAILURE;
return;
@@ -303,7 +303,7 @@ public function onUserAfterLogin(AfterLoginEvent $event): void
if ($results === null) {
$unique = true;
}
- } catch (\RuntimeException $e) {
+ } catch (\RuntimeException) {
$errorCount++;
// We'll let this query fail up to 5 times before giving up, there's probably a bigger issue at this point
@@ -370,7 +370,7 @@ public function onUserAfterLogin(AfterLoginEvent $event): void
try {
$db->setQuery($query)->execute();
- } catch (\RuntimeException $e) {
+ } catch (\RuntimeException) {
// We aren't concerned with errors from this query, carry on
}
}
@@ -416,7 +416,7 @@ public function onUserAfterLogout(AfterLogoutEvent $event): void
try {
$db->setQuery($query)->execute();
- } catch (\RuntimeException $e) {
+ } catch (\RuntimeException) {
// We aren't concerned with errors from this query, carry on
}
diff --git a/plugins/authentication/ldap/src/Extension/Ldap.php b/plugins/authentication/ldap/src/Extension/Ldap.php
index 326171b6f9f88..5d11a818df7a4 100644
--- a/plugins/authentication/ldap/src/Extension/Ldap.php
+++ b/plugins/authentication/ldap/src/Extension/Ldap.php
@@ -143,7 +143,7 @@ public function onUserAuthenticate(AuthenticationEvent $event): void
],
];
// if these are not set, the system defaults are used
- if (isset($cacertdir) && isset($cacertfile)) {
+ if (isset($cacertdir, $cacertfile)) {
$options['options']['x_tls_cacertdir'] = $cacertdir;
$options['options']['x_tls_cacertfile'] = $cacertfile;
}
diff --git a/plugins/content/confirmconsent/src/Field/ConsentBoxField.php b/plugins/content/confirmconsent/src/Field/ConsentBoxField.php
index 8357cac139e50..01e322e7667a6 100644
--- a/plugins/content/confirmconsent/src/Field/ConsentBoxField.php
+++ b/plugins/content/confirmconsent/src/Field/ConsentBoxField.php
@@ -250,7 +250,7 @@ private function getAssignedArticleUrl()
try {
$article = $db->loadObject();
- } catch (ExecutionFailureException $e) {
+ } catch (ExecutionFailureException) {
// Something at the database layer went wrong
return Route::_(
'index.php?option=com_content&view=article&id='
diff --git a/plugins/content/emailcloak/src/Extension/EmailCloak.php b/plugins/content/emailcloak/src/Extension/EmailCloak.php
index 1c4e543d93110..3500eadc82f92 100644
--- a/plugins/content/emailcloak/src/Extension/EmailCloak.php
+++ b/plugins/content/emailcloak/src/Extension/EmailCloak.php
@@ -11,6 +11,7 @@
namespace Joomla\Plugin\Content\EmailCloak\Extension;
use Joomla\CMS\Event\Content\ContentPrepareEvent;
+use Joomla\CMS\Event\CustomFields\AfterPrepareFieldEvent;
use Joomla\CMS\Event\Finder\ResultEvent;
use Joomla\CMS\HTML\HTMLHelper;
use Joomla\CMS\Plugin\CMSPlugin;
@@ -38,8 +39,9 @@ final class EmailCloak extends CMSPlugin implements SubscriberInterface
public static function getSubscribedEvents(): array
{
return [
- 'onContentPrepare' => 'onContentPrepare',
- 'onFinderResult' => 'onFinderResult',
+ 'onContentPrepare' => 'onContentPrepare',
+ 'onFinderResult' => 'onFinderResult',
+ 'onCustomFieldsAfterPrepareField' => 'onCustomFieldsAfterPrepareField',
];
}
@@ -96,6 +98,27 @@ public function onContentPrepare(ContentPrepareEvent $event)
}
}
+ /**
+ * Plugin that cloaks all emails in a custom field.
+ *
+ * @param AfterPrepareFieldEvent $event Event instance
+ *
+ * @return void
+ */
+ public function onCustomFieldsAfterPrepareField(AfterPrepareFieldEvent $event)
+ {
+ // If the value is empty then there is nothing to do
+ if (empty($event->getValue())) {
+ return;
+ }
+
+ $text = $this->cloak($event->getValue());
+
+ if ($text) {
+ $event->updateValue($text);
+ }
+ }
+
/**
* Generate a search pattern based on link and text.
*
@@ -137,7 +160,7 @@ private function cloak($text)
$mode = $mode === 1;
// Example: any@example.org
- $searchEmail = "([\p{L}\p{N}\.\'\-\+]+\@(?:[\.\-\p{L}\p{N}]+\.)+(?:[\-\p{L}\p{N}]{2,24}))";
+ $searchEmail = "([\p{L}\p{N}\.\'\-\+\_]+\@(?:[\.\-\p{L}\p{N}]+\.)+(?:[\-\p{L}\p{N}]{2,24}))";
// Example: any@example.org?subject=anyText
$searchEmailLink = $searchEmail . '([?&][\x20-\x7f][^"<>]+)';
diff --git a/plugins/content/finder/src/Extension/Finder.php b/plugins/content/finder/src/Extension/Finder.php
index cc1f2a4746cd6..d75781ef4dcbc 100644
--- a/plugins/content/finder/src/Extension/Finder.php
+++ b/plugins/content/finder/src/Extension/Finder.php
@@ -14,6 +14,8 @@
use Joomla\CMS\Event\Model;
use Joomla\CMS\Plugin\CMSPlugin;
use Joomla\CMS\Plugin\PluginHelper;
+use Joomla\Event\DispatcherAwareInterface;
+use Joomla\Event\DispatcherAwareTrait;
use Joomla\Event\SubscriberInterface;
// phpcs:disable PSR1.Files.SideEffects
@@ -25,8 +27,10 @@
*
* @since 2.5
*/
-final class Finder extends CMSPlugin implements SubscriberInterface
+final class Finder extends CMSPlugin implements SubscriberInterface, DispatcherAwareInterface
{
+ use DispatcherAwareTrait;
+
/**
* Flag to check whether finder plugins already imported.
*
diff --git a/plugins/editors/codemirror/src/Extension/Codemirror.php b/plugins/editors/codemirror/src/Extension/Codemirror.php
index 16d68593d5e7f..51e90b70b2027 100644
--- a/plugins/editors/codemirror/src/Extension/Codemirror.php
+++ b/plugins/editors/codemirror/src/Extension/Codemirror.php
@@ -12,6 +12,8 @@
use Joomla\CMS\Event\Editor\EditorSetupEvent;
use Joomla\CMS\Plugin\CMSPlugin;
+use Joomla\Event\DispatcherAwareInterface;
+use Joomla\Event\DispatcherAwareTrait;
use Joomla\Event\SubscriberInterface;
use Joomla\Plugin\Editors\CodeMirror\Provider\CodeMirrorProvider;
@@ -24,8 +26,10 @@
*
* @since 1.6
*/
-final class Codemirror extends CMSPlugin implements SubscriberInterface
+final class Codemirror extends CMSPlugin implements SubscriberInterface, DispatcherAwareInterface
{
+ use DispatcherAwareTrait;
+
/**
* Returns an array of events this subscriber will listen to.
*
diff --git a/plugins/editors/none/src/Extension/None.php b/plugins/editors/none/src/Extension/None.php
index 605fefb4dbb85..cb52c30f1de92 100644
--- a/plugins/editors/none/src/Extension/None.php
+++ b/plugins/editors/none/src/Extension/None.php
@@ -12,6 +12,8 @@
use Joomla\CMS\Event\Editor\EditorSetupEvent;
use Joomla\CMS\Plugin\CMSPlugin;
+use Joomla\Event\DispatcherAwareInterface;
+use Joomla\Event\DispatcherAwareTrait;
use Joomla\Event\SubscriberInterface;
use Joomla\Plugin\Editors\None\Provider\EditorNoneProvider;
@@ -24,8 +26,10 @@
*
* @since 1.5
*/
-final class None extends CMSPlugin implements SubscriberInterface
+final class None extends CMSPlugin implements SubscriberInterface, DispatcherAwareInterface
{
+ use DispatcherAwareTrait;
+
/**
* Returns an array of events this subscriber will listen to.
*
diff --git a/plugins/editors/tinymce/src/Extension/TinyMCE.php b/plugins/editors/tinymce/src/Extension/TinyMCE.php
index 6116faf3c00df..a6c92585b70bc 100644
--- a/plugins/editors/tinymce/src/Extension/TinyMCE.php
+++ b/plugins/editors/tinymce/src/Extension/TinyMCE.php
@@ -17,6 +17,8 @@
use Joomla\CMS\Session\Session;
use Joomla\CMS\String\StringableInterface;
use Joomla\Database\DatabaseAwareTrait;
+use Joomla\Event\DispatcherAwareInterface;
+use Joomla\Event\DispatcherAwareTrait;
use Joomla\Event\SubscriberInterface;
use Joomla\Filesystem\Folder;
use Joomla\Plugin\Editors\TinyMCE\PluginTraits\KnownButtons;
@@ -32,9 +34,10 @@
*
* @since 1.5
*/
-final class TinyMCE extends CMSPlugin implements SubscriberInterface
+final class TinyMCE extends CMSPlugin implements SubscriberInterface, DispatcherAwareInterface
{
use DatabaseAwareTrait;
+ use DispatcherAwareTrait;
// @todo: KnownButtons, ToolbarPresets for backward compatibility. Remove in Joomla 6
use KnownButtons;
diff --git a/plugins/editors/tinymce/src/PluginTraits/ActiveSiteTemplate.php b/plugins/editors/tinymce/src/PluginTraits/ActiveSiteTemplate.php
index 2b0d6b0b28a2d..64f19c61a275c 100644
--- a/plugins/editors/tinymce/src/PluginTraits/ActiveSiteTemplate.php
+++ b/plugins/editors/tinymce/src/PluginTraits/ActiveSiteTemplate.php
@@ -47,7 +47,7 @@ protected function getActiveSiteTemplate()
try {
return $db->loadObject();
- } catch (\RuntimeException $e) {
+ } catch (\RuntimeException) {
$this->getApplication()->enqueueMessage(Text::_('JERROR_AN_ERROR_HAS_OCCURRED'), 'error');
return new \stdClass();
diff --git a/plugins/editors/tinymce/src/PluginTraits/XTDButtons.php b/plugins/editors/tinymce/src/PluginTraits/XTDButtons.php
index efc432cf5da4e..b42dcf9b04754 100644
--- a/plugins/editors/tinymce/src/PluginTraits/XTDButtons.php
+++ b/plugins/editors/tinymce/src/PluginTraits/XTDButtons.php
@@ -74,7 +74,7 @@ private function tinyButtons($buttons, array $options = []): array
if ($link && $link[0] !== '#') {
$link = str_contains($link, '&') ? htmlspecialchars_decode($link) : $link;
$link = Uri::base(true) . '/' . $link;
- $options['src'] = $options['src'] ?? $link;
+ $options['src'] ??= $link;
}
// Set action to "modal" for legacy buttons, when possible
@@ -85,9 +85,9 @@ private function tinyButtons($buttons, array $options = []): array
$wa->useScript('joomla.dialog');
$legacyModal = false;
- $options['popupType'] = $options['popupType'] ?? 'iframe';
- $options['textHeader'] = $options['textHeader'] ?? $title;
- $options['iconHeader'] = $options['iconHeader'] ?? 'icon-' . $icon;
+ $options['popupType'] ??= 'iframe';
+ $options['textHeader'] ??= $title;
+ $options['iconHeader'] ??= 'icon-' . $icon;
}
$coreButton = [];
diff --git a/plugins/extension/finder/src/Extension/Finder.php b/plugins/extension/finder/src/Extension/Finder.php
index 05acb5071e935..2b5332f6ffd86 100644
--- a/plugins/extension/finder/src/Extension/Finder.php
+++ b/plugins/extension/finder/src/Extension/Finder.php
@@ -177,7 +177,7 @@ function ($word) {
try {
$db->setQuery($query);
$db->execute();
- } catch (\Exception $ex) {
+ } catch (\Exception) {
// It would be nice if the common word is stored to the DB, but it isn't super important
}
}
diff --git a/plugins/extension/joomlaupdate/joomlaupdate.xml b/plugins/extension/joomlaupdate/joomlaupdate.xml
new file mode 100644
index 0000000000000..6c95354b654ec
--- /dev/null
+++ b/plugins/extension/joomlaupdate/joomlaupdate.xml
@@ -0,0 +1,21 @@
+
+
+ plg_extension_joomlaupdate
+ Joomla! Project
+ 2025-02
+ (C) 2025 Open Source Matters, Inc.
+ GNU General Public License version 2 or later; see LICENSE.txt
+ admin@joomla.org
+ www.joomla.org
+ 1.0.0
+ PLG_EXTENSION_JOOMLAUPDATE_XML_DESCRIPTION
+ Joomla\Plugin\Extension\Joomlaupdate
+
+ services
+ src
+
+
+ language/en-GB/plg_extension_joomlaupdate.ini
+ language/en-GB/plg_extension_joomlaupdate.sys.ini
+
+
diff --git a/plugins/extension/joomlaupdate/services/provider.php b/plugins/extension/joomlaupdate/services/provider.php
new file mode 100644
index 0000000000000..93520836cb062
--- /dev/null
+++ b/plugins/extension/joomlaupdate/services/provider.php
@@ -0,0 +1,47 @@
+
+ * @license GNU General Public License version 2 or later; see LICENSE.txt
+ */
+
+\defined('_JEXEC') or die;
+
+use Joomla\CMS\Extension\PluginInterface;
+use Joomla\CMS\Factory;
+use Joomla\CMS\Plugin\PluginHelper;
+use Joomla\DI\Container;
+use Joomla\DI\ServiceProviderInterface;
+use Joomla\Event\DispatcherInterface;
+use Joomla\Plugin\Extension\Joomlaupdate\Extension\Joomlaupdate;
+
+return new class () implements ServiceProviderInterface {
+ /**
+ * Registers the service provider with a DI container.
+ *
+ * @param Container $container The DI container.
+ *
+ * @return void
+ *
+ * @since 5.3.0
+ */
+ public function register(Container $container)
+ {
+ $container->set(
+ PluginInterface::class,
+ function (Container $container) {
+ $plugin = new Joomlaupdate(
+ $container->get(DispatcherInterface::class),
+ (array) PluginHelper::getPlugin('extension', 'joomlaupdate')
+ );
+
+ $plugin->setApplication(Factory::getApplication());
+
+ return $plugin;
+ }
+ );
+ }
+};
diff --git a/plugins/extension/joomlaupdate/src/Extension/Joomlaupdate.php b/plugins/extension/joomlaupdate/src/Extension/Joomlaupdate.php
new file mode 100644
index 0000000000000..b760caebe119f
--- /dev/null
+++ b/plugins/extension/joomlaupdate/src/Extension/Joomlaupdate.php
@@ -0,0 +1,91 @@
+
+ * @license GNU General Public License version 2 or later; see LICENSE.txt
+ */
+
+namespace Joomla\Plugin\Extension\Joomlaupdate\Extension;
+
+use Joomla\CMS\Event\Model\AfterSaveEvent;
+use Joomla\CMS\Plugin\CMSPlugin;
+use Joomla\Component\Joomlaupdate\Administrator\Model\UpdateModel;
+use Joomla\Event\SubscriberInterface;
+use Joomla\Registry\Registry;
+
+// phpcs:disable PSR1.Files.SideEffects
+\defined('_JEXEC') or die;
+// phpcs:enable PSR1.Files.SideEffects
+
+/**
+ * The extension plugin for com_joomlaupdate
+ *
+ * @since 5.3.0
+ */
+final class Joomlaupdate extends CMSPlugin implements SubscriberInterface
+{
+ /**
+ * Load the language file on instantiation.
+ *
+ * @var boolean
+ *
+ * @since 5.3.0
+ */
+ protected $autoloadLanguage = true;
+
+ /**
+ * Returns an array of events this subscriber will listen to.
+ *
+ * @return array
+ *
+ * @since 5.3.0
+ */
+ public static function getSubscribedEvents(): array
+ {
+ return [
+ 'onExtensionAfterSave' => 'onExtensionAfterSave',
+ ];
+ }
+
+ /**
+ * After update of an extension
+ *
+ * @param AfterSaveEvent $event Event instance.
+ *
+ * @return void
+ *
+ * @since 5.3.0
+ */
+ public function onExtensionAfterSave(AfterSaveEvent $event): void
+ {
+ $context = $event->getContext();
+ $item = $event->getItem();
+
+ if ($context !== 'com_config.component') {
+ return;
+ }
+
+ if ($item->element !== 'com_joomlaupdate') {
+ return;
+ }
+
+ /** @var UpdateModel $updateModel */
+ $updateModel = $this->getApplication()->bootComponent('com_joomlaupdate')
+ ->getMVCFactory()->createModel('Update', 'Administrator', ['ignore_request' => true]);
+
+ if (!$updateModel) {
+ return;
+ }
+
+ $params = new Registry($item->params);
+
+ // Apply updated config
+ $updateModel->applyUpdateSite(
+ $params->get('updatesource'),
+ $params->get('customurl'),
+ );
+ }
+}
diff --git a/plugins/filesystem/local/src/Adapter/LocalAdapter.php b/plugins/filesystem/local/src/Adapter/LocalAdapter.php
index 1e2f58d7b4dbf..a8a074759ca96 100644
--- a/plugins/filesystem/local/src/Adapter/LocalAdapter.php
+++ b/plugins/filesystem/local/src/Adapter/LocalAdapter.php
@@ -262,7 +262,7 @@ public function createFile(string $name, string $path, $data): string
try {
File::write($localPath, $data);
- } catch (FilesystemException $exception) {
+ } catch (FilesystemException) {
}
if ($this->thumbnails && MediaHelper::isImage(pathinfo($localPath)['basename'])) {
@@ -303,7 +303,7 @@ public function updateFile(string $name, string $path, $data)
try {
File::write($localPath, $data);
- } catch (FilesystemException $exception) {
+ } catch (FilesystemException) {
}
if ($this->thumbnails && MediaHelper::isImage(pathinfo($localPath)['basename'])) {
@@ -426,7 +426,7 @@ private function getPathInformation(string $path): \stdClass
$obj->height = $props->height;
$obj->thumb_path = $this->thumbnails ? $this->getThumbnail($path) : $this->getUrl($obj->path);
- } catch (UnparsableImageException $e) {
+ } catch (UnparsableImageException) {
// Ignore the exception - it's an image that we don't know how to parse right now
}
}
@@ -531,13 +531,17 @@ private function copyFile(string $sourcePath, string $destinationPath, bool $for
$destinationPath .= '/' . $this->getFileName($sourcePath);
}
+ if (!MediaHelper::checkFileExtension(pathinfo($destinationPath, PATHINFO_EXTENSION))) {
+ throw new \Exception(Text::_('COM_MEDIA_MOVE_FILE_EXTENSION_INVALID'));
+ }
+
if (file_exists($destinationPath) && !$force) {
throw new \Exception(Text::_('COM_MEDIA_COPY_FILE_NOT_POSSIBLE_FILE_ALREADY_EXISTS'));
}
try {
File::copy($sourcePath, $destinationPath);
- } catch (FilesystemException $exception) {
+ } catch (FilesystemException) {
throw new \Exception(Text::_('COM_MEDIA_COPY_FILE_NOT_POSSIBLE'));
}
}
@@ -564,7 +568,7 @@ private function copyFolder(string $sourcePath, string $destinationPath, bool $f
if (is_file($destinationPath)) {
File::delete($destinationPath);
}
- } catch (FilesystemException $exception) {
+ } catch (FilesystemException) {
throw new \Exception(Text::_('COM_MEDIA_COPY_FOLDER_DESTINATION_CAN_NOT_DELETE'));
}
@@ -652,7 +656,7 @@ private function moveFile(string $sourcePath, string $destinationPath, bool $for
try {
File::move($sourcePath, $destinationPath);
- } catch (FilesystemException $exception) {
+ } catch (FilesystemException) {
throw new \Exception(Text::_('COM_MEDIA_MOVE_FILE_NOT_POSSIBLE'));
}
}
@@ -679,7 +683,7 @@ private function moveFolder(string $sourcePath, string $destinationPath, bool $f
if (is_file($destinationPath)) {
File::delete($destinationPath);
}
- } catch (FilesystemException $exception) {
+ } catch (FilesystemException) {
throw new \Exception(Text::_('COM_MEDIA_MOVE_FOLDER_NOT_POSSIBLE'));
}
@@ -860,7 +864,7 @@ private function checkContent(string $localPath, string $mediaContent)
try {
File::delete($tmpFile);
- } catch (FilesystemException $exception) {
+ } catch (FilesystemException) {
}
if (!$can) {
@@ -986,7 +990,7 @@ private function createThumbnail(string $path, string $thumbnailPath): bool
{
try {
(new Image($path))->createThumbnails([$this->thumbnailSize[0] . 'x' . $this->thumbnailSize[1]], Image::SCALE_INSIDE, \dirname($thumbnailPath), true);
- } catch (\Exception $e) {
+ } catch (\Exception) {
return false;
}
diff --git a/plugins/installer/override/src/Extension/Override.php b/plugins/installer/override/src/Extension/Override.php
index 6cf60631e1d96..a1ea7e6782d32 100644
--- a/plugins/installer/override/src/Extension/Override.php
+++ b/plugins/installer/override/src/Extension/Override.php
@@ -175,7 +175,7 @@ public function getOverrideCoreList()
try {
/** @var \Joomla\Component\Templates\Administrator\Model\TemplateModel $templateModel */
$templateModel = $this->getModel();
- } catch (\Exception $e) {
+ } catch (\Exception) {
return [];
}
diff --git a/plugins/installer/packageinstaller/tmpl/default.php b/plugins/installer/packageinstaller/tmpl/default.php
index 60f75e7aee403..5d68a7187b8da 100644
--- a/plugins/installer/packageinstaller/tmpl/default.php
+++ b/plugins/installer/packageinstaller/tmpl/default.php
@@ -10,9 +10,9 @@
defined('_JEXEC') or die;
-use Joomla\CMS\Filesystem\FilesystemHelper;
use Joomla\CMS\HTML\HTMLHelper;
use Joomla\CMS\Language\Text;
+use Joomla\Filesystem\Helper as FilesystemHelper;
/** @var \Joomla\Plugin\Installer\Package\Extension\PackageInstaller $this */
@@ -33,7 +33,7 @@
);
$return = $this->getApplication()->getInput()->getBase64('return');
-$maxSizeBytes = FilesystemHelper::fileUploadMaxSize(false);
+$maxSizeBytes = FilesystemHelper::getFileUploadMaxSize();
$maxSize = HTMLHelper::_('number.bytes', $maxSizeBytes);
?>
diff --git a/plugins/media-action/resize/src/Extension/Resize.php b/plugins/media-action/resize/src/Extension/Resize.php
index 38030498de15a..de5e763e6ebc0 100644
--- a/plugins/media-action/resize/src/Extension/Resize.php
+++ b/plugins/media-action/resize/src/Extension/Resize.php
@@ -72,13 +72,18 @@ public function onContentBeforeSave(BeforeSaveEvent $event): void
$imgObject = new Image(imagecreatefromstring($item->data));
- if ($imgObject->getWidth() < $this->params->get('batch_width', 0) && $imgObject->getHeight() < $this->params->get('batch_height', 0)) {
+ $maxWidth = (int) $this->params->get('batch_width', 0);
+ $maxHeight = (int) $this->params->get('batch_height', 0);
+ if (
+ !(($maxWidth && $imgObject->getWidth() > $maxWidth)
+ || ($maxHeight && $imgObject->getHeight() > $maxHeight))
+ ) {
return;
}
$imgObject->resize(
- $this->params->get('batch_width', 0),
- $this->params->get('batch_height', 0),
+ $maxWidth,
+ $maxHeight,
false,
Image::SCALE_INSIDE
);
diff --git a/plugins/multifactorauth/email/src/Extension/Email.php b/plugins/multifactorauth/email/src/Extension/Email.php
index 0924b6c83740f..2bd4d1edc0aa4 100644
--- a/plugins/multifactorauth/email/src/Extension/Email.php
+++ b/plugins/multifactorauth/email/src/Extension/Email.php
@@ -173,7 +173,7 @@ public function onUserMultifactorCaptive(Captive $event): void
try {
$this->sendCode($key, $user);
- } catch (\Exception $e) {
+ } catch (\Exception) {
return;
}
@@ -476,7 +476,7 @@ function (MfaTable $record) {
'user_id' => $user->id,
]
);
- } catch (\Exception $event) {
+ } catch (\Exception) {
// Fail gracefully
}
}
diff --git a/plugins/multifactorauth/webauthn/src/Extension/Webauthn.php b/plugins/multifactorauth/webauthn/src/Extension/Webauthn.php
index d1df17ead70f9..e1604ae8dcbcd 100644
--- a/plugins/multifactorauth/webauthn/src/Extension/Webauthn.php
+++ b/plugins/multifactorauth/webauthn/src/Extension/Webauthn.php
@@ -344,7 +344,7 @@ public function onUserMultifactorCaptive(Captive $event): void
ob_start();
include $layoutPath;
$html = ob_get_clean();
- } catch (\Exception $e) {
+ } catch (\Exception) {
return;
}
@@ -422,7 +422,7 @@ public function onUserMultifactorValidate(Validate $event): void
} catch (\Exception $e) {
try {
$this->getApplication()->enqueueMessage($e->getMessage(), 'error');
- } catch (\Exception $e) {
+ } catch (\Exception) {
}
$event->addResult(false);
diff --git a/plugins/multifactorauth/webauthn/src/Helper/Credentials.php b/plugins/multifactorauth/webauthn/src/Helper/Credentials.php
index c9a8026199859..94444a801cd99 100644
--- a/plugins/multifactorauth/webauthn/src/Helper/Credentials.php
+++ b/plugins/multifactorauth/webauthn/src/Helper/Credentials.php
@@ -105,7 +105,7 @@ public static function verifyAttestation(string $data): ?PublicKeyCredentialSour
try {
$publicKeyCredentialCreationOptions = unserialize(base64_decode($encodedOptions));
- } catch (\Exception $e) {
+ } catch (\Exception) {
$publicKeyCredentialCreationOptions = null;
}
@@ -274,7 +274,7 @@ private static function getWebauthnServer(?int $userId): Server
try {
$app = Factory::getApplication();
$siteName = $app->get('sitename');
- } catch (\Exception $e) {
+ } catch (\Exception) {
$siteName = 'Joomla! Site';
}
diff --git a/plugins/multifactorauth/yubikey/src/Extension/Yubikey.php b/plugins/multifactorauth/yubikey/src/Extension/Yubikey.php
index 61f26ff9f1d54..ed10669dedf0c 100644
--- a/plugins/multifactorauth/yubikey/src/Extension/Yubikey.php
+++ b/plugins/multifactorauth/yubikey/src/Extension/Yubikey.php
@@ -319,7 +319,7 @@ function ($rec) use ($record) {
return $rec->method === $record->method;
}
);
- } catch (\Exception $e) {
+ } catch (\Exception) {
$records = [];
}
@@ -409,7 +409,7 @@ private function validateYubikeyOtp(string $otp): bool
} else {
continue;
}
- } catch (\Exception $exc) {
+ } catch (\Exception) {
// No response, continue with the next server
continue;
}
diff --git a/plugins/sampledata/multilang/src/Extension/MultiLanguage.php b/plugins/sampledata/multilang/src/Extension/MultiLanguage.php
index 377c4a02f91a4..1974b8ed34e58 100644
--- a/plugins/sampledata/multilang/src/Extension/MultiLanguage.php
+++ b/plugins/sampledata/multilang/src/Extension/MultiLanguage.php
@@ -527,7 +527,7 @@ private function enablePlugin($pluginName)
try {
$db->execute();
- } catch (ExecutionFailureException $e) {
+ } catch (ExecutionFailureException) {
return false;
}
@@ -553,7 +553,7 @@ private function enablePlugin($pluginName)
try {
$db->execute();
- } catch (ExecutionFailureException $e) {
+ } catch (ExecutionFailureException) {
return false;
}
}
@@ -590,7 +590,7 @@ private function disableModuleMainMenu()
try {
$db->execute();
- } catch (ExecutionFailureException $e) {
+ } catch (ExecutionFailureException) {
return false;
}
@@ -922,7 +922,7 @@ private function addAssociations($groupedAssociations)
try {
$db->execute();
- } catch (\RuntimeException $e) {
+ } catch (\RuntimeException) {
return false;
}
}
@@ -956,7 +956,7 @@ private function addModuleInModuleMenu($moduleId)
try {
$db->execute();
- } catch (\RuntimeException $e) {
+ } catch (\RuntimeException) {
return false;
}
@@ -1132,7 +1132,7 @@ private function addArticle($itemLanguage, $categoryId)
if ($stage_id) {
$workflow->createAssociation($newId, $stage_id);
}
- } catch (ExecutionFailureException $e) {
+ } catch (ExecutionFailureException) {
return false;
}
diff --git a/plugins/schemaorg/custom/src/Extension/Custom.php b/plugins/schemaorg/custom/src/Extension/Custom.php
index 0024c560cbb73..b08065724c1b2 100644
--- a/plugins/schemaorg/custom/src/Extension/Custom.php
+++ b/plugins/schemaorg/custom/src/Extension/Custom.php
@@ -76,7 +76,7 @@ public function onSchemaPrepareSave(PrepareSaveEvent $event): void
$schema = new Registry($subject->schema);
$json = (new Registry($schema->get('json')))->toArray();
- } catch (\RuntimeException $e) {
+ } catch (\RuntimeException) {
$this->getApplication()->enqueueMessage(Text::_('PLG_SCHEMAORG_CUSTOM_JSON_ERROR'), 'error');
return;
}
diff --git a/plugins/system/actionlogs/src/Extension/ActionLogs.php b/plugins/system/actionlogs/src/Extension/ActionLogs.php
index 7c4de3bfb9870..0ed4effdde34d 100644
--- a/plugins/system/actionlogs/src/Extension/ActionLogs.php
+++ b/plugins/system/actionlogs/src/Extension/ActionLogs.php
@@ -182,7 +182,7 @@ public function onContentPrepareData(Model\PrepareDataEvent $event): void
try {
$values = $db->setQuery($query)->loadObject();
- } catch (ExecutionFailureException $e) {
+ } catch (ExecutionFailureException) {
return;
}
@@ -292,7 +292,7 @@ public function onUserAfterSave(User\AfterSaveEvent $event): void
try {
$db->setQuery($query)->execute();
- } catch (ExecutionFailureException $e) {
+ } catch (ExecutionFailureException) {
// Do nothing.
}
}
@@ -325,7 +325,7 @@ public function onUserAfterDelete(User\AfterDeleteEvent $event): void
try {
$db->setQuery($query)->execute();
- } catch (ExecutionFailureException $e) {
+ } catch (ExecutionFailureException) {
// Do nothing.
}
}
@@ -399,7 +399,7 @@ public function onExtensionAfterSave(Model\AfterSaveEvent $event): void
try {
$values = $db->setQuery($query)->loadObjectList();
- } catch (ExecutionFailureException $e) {
+ } catch (ExecutionFailureException) {
return;
}
@@ -420,7 +420,7 @@ public function onExtensionAfterSave(Model\AfterSaveEvent $event): void
try {
$db->setQuery($query)->execute();
- } catch (ExecutionFailureException $e) {
+ } catch (ExecutionFailureException) {
// Do nothing.
}
}
diff --git a/plugins/system/cache/src/Extension/Cache.php b/plugins/system/cache/src/Extension/Cache.php
index 1f0f936fb5806..6e9d04c7e812e 100644
--- a/plugins/system/cache/src/Extension/Cache.php
+++ b/plugins/system/cache/src/Extension/Cache.php
@@ -24,8 +24,9 @@
use Joomla\CMS\Profiler\Profiler;
use Joomla\CMS\Router\SiteRouter;
use Joomla\CMS\Uri\Uri;
+use Joomla\Event\DispatcherAwareInterface;
+use Joomla\Event\DispatcherAwareTrait;
use Joomla\Event\DispatcherInterface;
-use Joomla\Event\Event;
use Joomla\Event\Priority;
use Joomla\Event\SubscriberInterface;
@@ -38,8 +39,10 @@
*
* @since 1.5
*/
-final class Cache extends CMSPlugin implements SubscriberInterface
+final class Cache extends CMSPlugin implements SubscriberInterface, DispatcherAwareInterface
{
+ use DispatcherAwareTrait;
+
/**
* Cache instance.
*
diff --git a/plugins/system/debug/src/DataCollector/ProfileCollector.php b/plugins/system/debug/src/DataCollector/ProfileCollector.php
index 11bd3d6853d39..328f931f2c944 100644
--- a/plugins/system/debug/src/DataCollector/ProfileCollector.php
+++ b/plugins/system/debug/src/DataCollector/ProfileCollector.php
@@ -263,7 +263,7 @@ public function setRequestEndTime($time): self
*/
public function collect(): array
{
- $this->requestEndTime = $this->requestEndTime ?? microtime(true);
+ $this->requestEndTime ??= microtime(true);
$start = $this->requestStartTime;
diff --git a/plugins/system/debug/src/JavascriptRenderer.php b/plugins/system/debug/src/JavascriptRenderer.php
index d2daeea496bd9..eaf1ec39c0b4a 100644
--- a/plugins/system/debug/src/JavascriptRenderer.php
+++ b/plugins/system/debug/src/JavascriptRenderer.php
@@ -55,9 +55,9 @@ public function __construct(DebugBar $debugBar, $baseUrl = null, $basePath = nul
*/
public function renderHead()
{
- list($cssFiles, $jsFiles, $inlineCss, $inlineJs, $inlineHead) = $this->getAssets(null, self::RELATIVE_URL);
- $html = '';
- $doc = Factory::getApplication()->getDocument();
+ [$cssFiles, $jsFiles, $inlineCss, $inlineJs, $inlineHead] = $this->getAssets(null, self::RELATIVE_URL);
+ $html = '';
+ $doc = Factory::getApplication()->getDocument();
foreach ($cssFiles as $file) {
$html .= \sprintf(' ' . "\n", $file);
diff --git a/plugins/system/guidedtours/src/Extension/GuidedTours.php b/plugins/system/guidedtours/src/Extension/GuidedTours.php
index 15c9e81e9f18f..6598411423d2f 100644
--- a/plugins/system/guidedtours/src/Extension/GuidedTours.php
+++ b/plugins/system/guidedtours/src/Extension/GuidedTours.php
@@ -214,7 +214,7 @@ public function onBeforeCompileHead()
try {
$result = $db->setQuery($query)->loadResult();
- } catch (\Exception $e) {
+ } catch (\Exception) {
// Do not start the tour.
continue;
}
diff --git a/plugins/system/languagefilter/src/Extension/LanguageFilter.php b/plugins/system/languagefilter/src/Extension/LanguageFilter.php
index eec4e7fb45706..7b085bf49decd 100644
--- a/plugins/system/languagefilter/src/Extension/LanguageFilter.php
+++ b/plugins/system/languagefilter/src/Extension/LanguageFilter.php
@@ -160,8 +160,7 @@ public function __construct(
foreach ($this->sefs as $sef => $language) {
if (!\array_key_exists($language->lang_code, LanguageHelper::getInstalledLanguages(0))) {
- unset($this->lang_codes[$language->lang_code]);
- unset($this->sefs[$language->sef]);
+ unset($this->lang_codes[$language->lang_code], $this->sefs[$language->sef]);
}
}
}
@@ -514,7 +513,7 @@ public function parseRule(&$router, &$uri)
$language_new = $this->languageFactory->createLanguage($lang_code, (bool) $app->get('debug_lang'));
foreach ($language->getPaths() as $extension => $files) {
- if (str_contains($extension, 'plg_system')) {
+ if (str_starts_with($extension, 'plg_system')) {
$extension_name = substr($extension, 11);
$language_new->load($extension, JPATH_ADMINISTRATOR)
diff --git a/plugins/system/log/src/Extension/Log.php b/plugins/system/log/src/Extension/Log.php
index 96601d0569042..bf52c7c1abd76 100644
--- a/plugins/system/log/src/Extension/Log.php
+++ b/plugins/system/log/src/Extension/Log.php
@@ -81,7 +81,7 @@ public function onUserLoginFailure(LoginFailureEvent $event): void
try {
Logger::add($errorlog['comment'], Logger::INFO, $errorlog['status']);
- } catch (\Exception $e) {
+ } catch (\Exception) {
// If the log file is unwriteable during login then we should not go to the error page
return;
}
diff --git a/plugins/system/privacyconsent/src/Extension/PrivacyConsent.php b/plugins/system/privacyconsent/src/Extension/PrivacyConsent.php
index 17abfcce198c8..be7a3a344562a 100644
--- a/plugins/system/privacyconsent/src/Extension/PrivacyConsent.php
+++ b/plugins/system/privacyconsent/src/Extension/PrivacyConsent.php
@@ -200,7 +200,7 @@ public function onUserAfterSave(User\AfterSaveEvent $event): void
try {
$this->getDatabase()->insertObject('#__privacy_consents', $userNote);
- } catch (\Exception $e) {
+ } catch (\Exception) {
// Do nothing if the save fails
}
diff --git a/plugins/system/redirect/src/Extension/Redirect.php b/plugins/system/redirect/src/Extension/Redirect.php
index b74325bc5b77e..8bdb1b71c102d 100644
--- a/plugins/system/redirect/src/Extension/Redirect.php
+++ b/plugins/system/redirect/src/Extension/Redirect.php
@@ -214,7 +214,7 @@ public function handleError(ErrorEvent $event)
try {
$this->getDatabase()->updateObject('#__redirect_links', $redirect, 'id');
- } catch (\Exception $e) {
+ } catch (\Exception) {
// We don't log issues for now
}
diff --git a/plugins/system/schedulerunner/src/Extension/ScheduleRunner.php b/plugins/system/schedulerunner/src/Extension/ScheduleRunner.php
index a4ea9742b2dd3..b285b7e844795 100644
--- a/plugins/system/schedulerunner/src/Extension/ScheduleRunner.php
+++ b/plugins/system/schedulerunner/src/Extension/ScheduleRunner.php
@@ -163,7 +163,7 @@ public function runLazyCron(EventInterface $e)
// Suppress all errors to avoid any output
try {
$this->runScheduler();
- } catch (\Exception $e) {
+ } catch (\Exception) {
}
ob_end_clean();
diff --git a/plugins/system/schemaorg/src/Extension/Schemaorg.php b/plugins/system/schemaorg/src/Extension/Schemaorg.php
index 19344f276958a..8453b572300d4 100644
--- a/plugins/system/schemaorg/src/Extension/Schemaorg.php
+++ b/plugins/system/schemaorg/src/Extension/Schemaorg.php
@@ -28,6 +28,8 @@
use Joomla\CMS\User\UserFactoryAwareTrait;
use Joomla\Database\DatabaseAwareTrait;
use Joomla\Database\ParameterType;
+use Joomla\Event\DispatcherAwareInterface;
+use Joomla\Event\DispatcherAwareTrait;
use Joomla\Event\SubscriberInterface;
use Joomla\Registry\Registry;
@@ -40,11 +42,12 @@
*
* @since 5.0.0
*/
-final class Schemaorg extends CMSPlugin implements SubscriberInterface
+final class Schemaorg extends CMSPlugin implements SubscriberInterface, DispatcherAwareInterface
{
use DatabaseAwareTrait;
- use SchemaorgPrepareImageTrait;
+ use DispatcherAwareTrait;
use SchemaorgPrepareDateTrait;
+ use SchemaorgPrepareImageTrait;
use UserFactoryAwareTrait;
/**
@@ -380,13 +383,6 @@ public function onBeforeCompileHead(): void
$webPageSchema['about'] = ['@id' => $baseId];
$webPageSchema['inLanguage'] = $app->getLanguage()->getTag();
- // We support Breadcrumb linking
- $breadcrumbs = ModuleHelper::getModule('mod_breadcrumbs');
-
- if (!empty($breadcrumbs->id)) {
- $webPageSchema['breadcrumb'] = ['@id' => $domain . '#/schema/BreadcrumbList/' . (int) $breadcrumbs->id];
- }
-
$baseSchema['@graph'][] = $webPageSchema;
if ($itemId > 0) {
diff --git a/plugins/system/shortcut/src/Extension/Shortcut.php b/plugins/system/shortcut/src/Extension/Shortcut.php
index 8439405c24f24..2293a996384fa 100644
--- a/plugins/system/shortcut/src/Extension/Shortcut.php
+++ b/plugins/system/shortcut/src/Extension/Shortcut.php
@@ -16,6 +16,8 @@
use Joomla\CMS\Plugin\CMSPlugin;
use Joomla\CMS\Router\Route;
use Joomla\CMS\Uri\Uri;
+use Joomla\Event\DispatcherAwareInterface;
+use Joomla\Event\DispatcherAwareTrait;
use Joomla\Event\Event;
use Joomla\Event\SubscriberInterface;
@@ -28,8 +30,10 @@
*
* @since 4.2.0
*/
-final class Shortcut extends CMSPlugin implements SubscriberInterface
+final class Shortcut extends CMSPlugin implements SubscriberInterface, DispatcherAwareInterface
{
+ use DispatcherAwareTrait;
+
/**
* Returns an array of events this subscriber will listen to.
*
diff --git a/plugins/system/stats/src/Extension/Stats.php b/plugins/system/stats/src/Extension/Stats.php
index 5e385cfd641db..208e451788440 100644
--- a/plugins/system/stats/src/Extension/Stats.php
+++ b/plugins/system/stats/src/Extension/Stats.php
@@ -498,7 +498,7 @@ private function saveParams()
$result = $db->setQuery($query)->execute();
$this->clearCacheGroups(['com_plugins']);
- } catch (\Exception $exc) {
+ } catch (\Exception) {
// If we failed to execute
$db->unlockTables();
$result = false;
@@ -507,7 +507,7 @@ private function saveParams()
try {
// Unlock the tables after writing
$db->unlockTables();
- } catch (\Exception $e) {
+ } catch (\Exception) {
// If we can't lock the tables assume we have somehow failed
$result = false;
}
@@ -585,7 +585,7 @@ private function clearCacheGroups(array $clearGroups)
$cache = Cache::getInstance('callback', $options);
$cache->clean();
- } catch (\Exception $e) {
+ } catch (\Exception) {
// Ignore it
}
}
@@ -623,7 +623,7 @@ private function disablePlugin()
$result = $db->setQuery($query)->execute();
$this->clearCacheGroups(['com_plugins']);
- } catch (\Exception $exc) {
+ } catch (\Exception) {
// If we failed to execute
$db->unlockTables();
$result = false;
@@ -632,7 +632,7 @@ private function disablePlugin()
try {
// Unlock the tables after writing
$db->unlockTables();
- } catch (\Exception $e) {
+ } catch (\Exception) {
// If we can't lock the tables assume we have somehow failed
$result = false;
}
diff --git a/plugins/system/tasknotification/forms/task_notification.xml b/plugins/system/tasknotification/forms/task_notification.xml
index 15ff5aabe8743..cdc44bdd8d3c6 100644
--- a/plugins/system/tasknotification/forms/task_notification.xml
+++ b/plugins/system/tasknotification/forms/task_notification.xml
@@ -13,6 +13,17 @@
JDISABLED
JENABLED
+
+
JDISABLED
JENABLED
+
+
JDISABLED
JENABLED
+
+
JDISABLED
JENABLED
+
+
diff --git a/plugins/system/tasknotification/src/Extension/TaskNotification.php b/plugins/system/tasknotification/src/Extension/TaskNotification.php
index 31d3cb32b8e25..2fd2861e94549 100644
--- a/plugins/system/tasknotification/src/Extension/TaskNotification.php
+++ b/plugins/system/tasknotification/src/Extension/TaskNotification.php
@@ -97,7 +97,7 @@ public function injectTaskNotificationFieldset(Model\PrepareFormEvent $event): b
try {
$formFile = Path::check($formFile);
- } catch (\Exception $e) {
+ } catch (\Exception) {
// Log?
return false;
}
@@ -134,10 +134,11 @@ public function notifyFailure(Event $event): void
// Load translations
$this->loadLanguage();
+ $groups = $task->get('params.notifications.notification_failure_groups');
// @todo safety checks, multiple files [?]
$outFile = $event->getArgument('subject')->snapshot['output_file'] ?? '';
- $this->sendMail('plg_system_tasknotification.failure_mail', $data, $outFile);
+ $this->sendMail('plg_system_tasknotification.failure_mail', $data, $outFile, $groups);
}
/**
@@ -163,9 +164,10 @@ public function notifyOrphan(Event $event): void
// Load translations
$this->loadLanguage();
+ $groups = $task->get('params.notifications.notification_orphan_groups');
$data = $this->getDataFromTask($event->getArgument('subject'));
- $this->sendMail('plg_system_tasknotification.orphan_mail', $data);
+ $this->sendMail('plg_system_tasknotification.orphan_mail', $data, '', $groups);
}
/**
@@ -191,10 +193,11 @@ public function notifySuccess(Event $event): void
// Load translations
$this->loadLanguage();
+ $groups = $task->get('params.notifications.notification_success_groups');
// @todo safety checks, multiple files [?]
$outFile = $event->getArgument('subject')->snapshot['output_file'] ?? '';
- $this->sendMail('plg_system_tasknotification.success_mail', $data, $outFile);
+ $this->sendMail('plg_system_tasknotification.success_mail', $data, $outFile, $groups);
}
/**
@@ -236,8 +239,12 @@ public function notifyFatalRecovery(Event $event): void
return;
}
+ // Load translations
+ $this->loadLanguage();
+ $groups = $task->get('params.notifications.notification_fatal_groups');
+
$data = $this->getDataFromTask($event->getArgument('subject'));
- $this->sendMail('plg_system_tasknotification.fatal_recovery_mail', $data);
+ $this->sendMail('plg_system_tasknotification.fatal_recovery_mail', $data, '', $groups);
}
/**
@@ -267,13 +274,14 @@ private function getDataFromTask(Task $task): array
* @param string $template The mail template.
* @param array $data The data to bind to the mail template.
* @param string $attachment The attachment to send with the mail (@todo multiple)
+ * @param array $groups The user groups to notify.
*
* @return void
*
* @since 4.1.0
* @throws \Exception
*/
- private function sendMail(string $template, array $data, string $attachment = ''): void
+ private function sendMail(string $template, array $data, string $attachment = '', array $groups = []): void
{
$app = $this->getApplication();
$db = $this->getDatabase();
@@ -281,16 +289,18 @@ private function sendMail(string $template, array $data, string $attachment = ''
// Get all users who are not blocked and have opted in for system mails.
$query = $db->getQuery(true);
- $query->select($db->quoteName(['name', 'email', 'sendEmail', 'id']))
- ->from($db->quoteName('#__users'))
- ->where($db->quoteName('sendEmail') . ' = 1')
- ->where($db->quoteName('block') . ' = 0');
+ $query->select('DISTINCT ' . $db->quoteName('u.id') . ', ' . $db->quoteName('u.email'))
+ ->from($db->quoteName('#__users', 'u'))
+ ->join('LEFT', $db->quoteName('#__user_usergroup_map', 'g') . ' ON ' . $db->quoteName('g.user_id') . ' = ' . $db->quoteName('u.id'))
+ ->where($db->quoteName('u.sendEmail') . ' = 1')
+ ->where($db->quoteName('u.block') . ' = 0')
+ ->whereIn($db->quoteName('g.group_id'), $groups);
$db->setQuery($query);
try {
$users = $db->loadObjectList();
- } catch (\RuntimeException $e) {
+ } catch (\RuntimeException) {
return;
}
@@ -302,30 +312,26 @@ private function sendMail(string $template, array $data, string $attachment = ''
$mailSent = false;
- // Mail all matching users who also have the `core.manage` privilege for com_scheduler.
+ // Mail all matching users.
foreach ($users as $user) {
- $user = $this->getUserFactory()->loadUserById($user->id);
-
- if ($user->authorise('core.manage', 'com_scheduler')) {
- try {
- $mailer = new MailTemplate($template, $app->getLanguage()->getTag());
- $mailer->addTemplateData($data);
- $mailer->addRecipient($user->email);
-
- if (
- !empty($attachment)
- && is_file($attachment)
- ) {
- // @todo we allow multiple files [?]
- $attachName = pathinfo($attachment, PATHINFO_BASENAME);
- $mailer->addAttachment($attachName, $attachment);
- }
-
- $mailer->send();
- $mailSent = true;
- } catch (MailerException $exception) {
- Log::add($this->getApplication()->getLanguage()->_('PLG_SYSTEM_TASK_NOTIFICATION_NOTIFY_SEND_EMAIL_FAIL'), Log::ERROR);
+ try {
+ $mailer = new MailTemplate($template, $app->getLanguage()->getTag());
+ $mailer->addTemplateData($data);
+ $mailer->addRecipient($user->email);
+
+ if (
+ !empty($attachment)
+ && is_file($attachment)
+ ) {
+ // @todo we allow multiple files [?]
+ $attachName = pathinfo($attachment, PATHINFO_BASENAME);
+ $mailer->addAttachment($attachName, $attachment);
}
+
+ $mailer->send();
+ $mailSent = true;
+ } catch (MailerException) {
+ Log::add($this->getApplication()->getLanguage()->_('PLG_SYSTEM_TASK_NOTIFICATION_NOTIFY_SEND_EMAIL_FAIL'), Log::ERROR);
}
}
diff --git a/plugins/system/webauthn/src/Authentication.php b/plugins/system/webauthn/src/Authentication.php
index c8b12f620ad5a..3c7ab9e2c6208 100644
--- a/plugins/system/webauthn/src/Authentication.php
+++ b/plugins/system/webauthn/src/Authentication.php
@@ -308,7 +308,7 @@ public function validateAttestationResponse(string $data): PublicKeyCredentialSo
/** @var PublicKeyCredentialCreationOptions|null $publicKeyCredentialCreationOptions */
try {
$publicKeyCredentialCreationOptions = unserialize(base64_decode($encodedOptions));
- } catch (\Exception $e) {
+ } catch (\Exception) {
Log::add('The plg_system_webauthn.publicKeyCredentialCreationOptions in the session is invalid', Log::NOTICE, 'webauthn.system');
$publicKeyCredentialCreationOptions = null;
}
@@ -392,7 +392,7 @@ private function getSiteIcon(): ?string
'/templates/',
'/templates/' . $this->app->getTemplate(),
];
- } catch (\Exception $e) {
+ } catch (\Exception) {
return null;
}
@@ -502,7 +502,7 @@ private function getPKCredentialRequestOptions(): PublicKeyCredentialRequestOpti
try {
$publicKeyCredentialRequestOptions = unserialize(base64_decode($encodedOptions));
- } catch (\Exception $e) {
+ } catch (\Exception) {
Log::add('Invalid plg_system_webauthn.publicKeyCredentialRequestOptions in the session', Log::NOTICE, 'webauthn.system');
throw new \RuntimeException(Text::_('PLG_SYSTEM_WEBAUTHN_ERR_CREATE_INVALID_LOGIN_REQUEST'));
diff --git a/plugins/system/webauthn/src/CredentialRepository.php b/plugins/system/webauthn/src/CredentialRepository.php
index fc3c22877e08f..cfb5a03fc466a 100644
--- a/plugins/system/webauthn/src/CredentialRepository.php
+++ b/plugins/system/webauthn/src/CredentialRepository.php
@@ -79,7 +79,7 @@ public function findOneByCredentialId(string $publicKeyCredentialId): ?PublicKey
try {
return PublicKeyCredentialSource::createFromArray(json_decode($json, true));
- } catch (\Throwable $e) {
+ } catch (\Throwable) {
return null;
}
}
@@ -136,7 +136,7 @@ public function findAllForUserEntity(PublicKeyCredentialUserEntity $publicKeyCre
try {
return PublicKeyCredentialSource::createFromArray($data);
- } catch (\InvalidArgumentException $e) {
+ } catch (\InvalidArgumentException) {
return null;
}
};
@@ -222,7 +222,7 @@ public function saveCredentialSource(PublicKeyCredentialSource $publicKeyCredent
$o->user_id = $oldRecord->user_id;
$o->label = $oldRecord->label;
$update = true;
- } catch (\Exception $e) {
+ } catch (\Exception) {
}
$o->credential = $this->encryptCredential($o->credential);
@@ -304,7 +304,7 @@ public function getAll(int $userId): array
$record['credential'] = PublicKeyCredentialSource::createFromArray($data);
return $record;
- } catch (\InvalidArgumentException $e) {
+ } catch (\InvalidArgumentException) {
$record['credential'] = null;
return $record;
@@ -338,7 +338,7 @@ public function has(string $credentialId): bool
$count = $db->setQuery($query)->loadResult();
return $count > 0;
- } catch (\Exception $e) {
+ } catch (\Exception) {
return false;
}
}
@@ -473,7 +473,7 @@ public function getUserIdFromHandle(?string $userHandle): ?int
try {
$numRecords = $db->setQuery($query)->loadResult();
- } catch (\Exception $e) {
+ } catch (\Exception) {
return null;
}
@@ -501,7 +501,7 @@ public function getUserIdFromHandle(?string $userHandle): ?int
while (true) {
try {
$ids = $db->setQuery($query, $start, $limit)->loadColumn();
- } catch (\Exception $e) {
+ } catch (\Exception) {
return null;
}
@@ -585,7 +585,7 @@ private function getEncryptionKey(): string
/** @var Registry $config */
$config = $app->getConfig();
$secret = $config->get('secret', '');
- } catch (\Exception $e) {
+ } catch (\Exception) {
$secret = '';
}
@@ -621,7 +621,7 @@ private function formatDate($date, ?string $format = null, bool $tzAware = true)
try {
$tzDefault = Factory::getApplication()->get('offset');
- } catch (\Exception $e) {
+ } catch (\Exception) {
$tzDefault = 'GMT';
}
@@ -634,7 +634,7 @@ private function formatDate($date, ?string $format = null, bool $tzAware = true)
$userTimeZone = new \DateTimeZone($tz);
$jDate->setTimezone($userTimeZone);
- } catch (\Exception $e) {
+ } catch (\Exception) {
// Nothing. Fall back to UTC.
}
}
diff --git a/plugins/system/webauthn/src/Extension/Webauthn.php b/plugins/system/webauthn/src/Extension/Webauthn.php
index 876e04cd48971..4f468bdaae40d 100644
--- a/plugins/system/webauthn/src/Extension/Webauthn.php
+++ b/plugins/system/webauthn/src/Extension/Webauthn.php
@@ -155,7 +155,7 @@ public static function getSubscribedEvents(): array
{
try {
$app = Factory::getApplication();
- } catch (\Exception $e) {
+ } catch (\Exception) {
return [];
}
diff --git a/plugins/system/webauthn/src/MetadataRepository.php b/plugins/system/webauthn/src/MetadataRepository.php
index 4d61056780c13..e157860ae4957 100644
--- a/plugins/system/webauthn/src/MetadataRepository.php
+++ b/plugins/system/webauthn/src/MetadataRepository.php
@@ -128,7 +128,7 @@ private function load(): void
try {
$jwtConfig = Configuration::forUnsecuredSigner();
$token = $jwtConfig->parser()->parse($rawJwt);
- } catch (\Exception $e) {
+ } catch (\Exception) {
return;
}
@@ -153,7 +153,7 @@ private function load(): void
}
return MetadataStatement::createFromArray($array);
- } catch (\Exception $e) {
+ } catch (\Exception) {
return null;
}
};
diff --git a/plugins/system/webauthn/src/PluginTraits/AdditionalLoginButtons.php b/plugins/system/webauthn/src/PluginTraits/AdditionalLoginButtons.php
index cbf17cd67bfde..573b962185711 100644
--- a/plugins/system/webauthn/src/PluginTraits/AdditionalLoginButtons.php
+++ b/plugins/system/webauthn/src/PluginTraits/AdditionalLoginButtons.php
@@ -138,7 +138,7 @@ private function mustDisplayButton(): bool
*/
try {
$document = $this->getApplication()->getDocument();
- } catch (\Exception $e) {
+ } catch (\Exception) {
$document = null;
}
diff --git a/plugins/system/webauthn/src/PluginTraits/AjaxHandlerChallenge.php b/plugins/system/webauthn/src/PluginTraits/AjaxHandlerChallenge.php
index 6de8ad4c124f3..d3c93729eca56 100644
--- a/plugins/system/webauthn/src/PluginTraits/AjaxHandlerChallenge.php
+++ b/plugins/system/webauthn/src/PluginTraits/AjaxHandlerChallenge.php
@@ -89,7 +89,7 @@ public function onAjaxWebauthnChallenge(AjaxChallenge $event): void
try {
$myUser = Factory::getContainer()->get(UserFactoryInterface::class)->loadUserById($userId);
- } catch (\Exception $e) {
+ } catch (\Exception) {
$myUser = new User();
}
diff --git a/plugins/system/webauthn/src/PluginTraits/AjaxHandlerDelete.php b/plugins/system/webauthn/src/PluginTraits/AjaxHandlerDelete.php
index 1a7d0febe33a4..d064d2dc5784d 100644
--- a/plugins/system/webauthn/src/PluginTraits/AjaxHandlerDelete.php
+++ b/plugins/system/webauthn/src/PluginTraits/AjaxHandlerDelete.php
@@ -81,7 +81,7 @@ public function onAjaxWebauthnDelete(AjaxDelete $event): void
// Delete the record
try {
$repository->remove($credentialId);
- } catch (\Exception $e) {
+ } catch (\Exception) {
$event->addResult(false);
return;
diff --git a/plugins/system/webauthn/src/PluginTraits/AjaxHandlerSaveLabel.php b/plugins/system/webauthn/src/PluginTraits/AjaxHandlerSaveLabel.php
index aa188019d20db..f1647f1057e03 100644
--- a/plugins/system/webauthn/src/PluginTraits/AjaxHandlerSaveLabel.php
+++ b/plugins/system/webauthn/src/PluginTraits/AjaxHandlerSaveLabel.php
@@ -90,7 +90,7 @@ public function onAjaxWebauthnSavelabel(AjaxSaveLabel $event): void
// Save the new label
try {
$repository->setLabel($credentialId, $newLabel);
- } catch (\Exception $e) {
+ } catch (\Exception) {
$event->addResult(false);
return;
diff --git a/plugins/system/webauthn/src/PluginTraits/UserDeletion.php b/plugins/system/webauthn/src/PluginTraits/UserDeletion.php
index 5dd83d6016c69..9a883f5157a80 100644
--- a/plugins/system/webauthn/src/PluginTraits/UserDeletion.php
+++ b/plugins/system/webauthn/src/PluginTraits/UserDeletion.php
@@ -66,7 +66,7 @@ public function onUserAfterDelete(Event $event): void
try {
$db->setQuery($query)->execute();
- } catch (\Exception $e) {
+ } catch (\Exception) {
// Don't worry if this fails
}
diff --git a/plugins/task/checkfiles/src/Extension/Checkfiles.php b/plugins/task/checkfiles/src/Extension/Checkfiles.php
index 7c1ab16a9cbe0..a85f4c73b183c 100644
--- a/plugins/task/checkfiles/src/Extension/Checkfiles.php
+++ b/plugins/task/checkfiles/src/Extension/Checkfiles.php
@@ -143,7 +143,7 @@ protected function checkImages(ExecuteTaskEvent $event): int
try {
$image->resize($newWidth, $newHeight, false);
- } catch (\LogicException $e) {
+ } catch (\LogicException) {
$this->logTask($this->getApplication()->getLanguage()->_('PLG_TASK_CHECK_FILES_LOG_RESIZE_FAIL'), 'error');
return TaskStatus::KNOCKOUT;
diff --git a/plugins/task/deleteactionlogs/src/Extension/DeleteActionLogs.php b/plugins/task/deleteactionlogs/src/Extension/DeleteActionLogs.php
index 1b756739ca27c..0015106b2dfe6 100644
--- a/plugins/task/deleteactionlogs/src/Extension/DeleteActionLogs.php
+++ b/plugins/task/deleteactionlogs/src/Extension/DeleteActionLogs.php
@@ -94,7 +94,7 @@ private function deleteLogs(ExecuteTaskEvent $event): int
try {
$db->execute();
- } catch (\RuntimeException $e) {
+ } catch (\RuntimeException) {
// Ignore it
return Status::KNOCKOUT;
}
diff --git a/plugins/task/globalcheckin/src/Extension/Globalcheckin.php b/plugins/task/globalcheckin/src/Extension/Globalcheckin.php
index 8f63a9aa035be..213c274f9ee18 100644
--- a/plugins/task/globalcheckin/src/Extension/Globalcheckin.php
+++ b/plugins/task/globalcheckin/src/Extension/Globalcheckin.php
@@ -88,7 +88,7 @@ protected function makeCheckin(ExecuteTaskEvent $event): int
$fields = $db->getTableColumns($tn, false);
- if (!(isset($fields['checked_out']) && isset($fields['checked_out_time']))) {
+ if (!(isset($fields['checked_out'], $fields['checked_out_time']))) {
continue;
}
@@ -114,7 +114,7 @@ protected function makeCheckin(ExecuteTaskEvent $event): int
try {
$db->execute();
- } catch (ExecutionFailureException $e) {
+ } catch (ExecutionFailureException) {
// This failure isn't critical, don't care too much
$failed = true;
}
diff --git a/plugins/task/privacyconsent/src/Extension/PrivacyConsent.php b/plugins/task/privacyconsent/src/Extension/PrivacyConsent.php
index 2114be4957825..4ff194dd5d8e5 100644
--- a/plugins/task/privacyconsent/src/Extension/PrivacyConsent.php
+++ b/plugins/task/privacyconsent/src/Extension/PrivacyConsent.php
@@ -133,7 +133,7 @@ private function remindExpiringConsents($expire, $remind): int
try {
$users = $db->setQuery($query)->loadObjectList();
- } catch (\RuntimeException $exception) {
+ } catch (\RuntimeException) {
return Status::KNOCKOUT;
}
@@ -183,10 +183,10 @@ private function remindExpiringConsents($expire, $remind): int
try {
$db->execute();
- } catch (\RuntimeException $e) {
+ } catch (\RuntimeException) {
return Status::KNOCKOUT;
}
- } catch (MailDisabledException | phpmailerException $exception) {
+ } catch (MailDisabledException | phpmailerException) {
return Status::KNOCKOUT;
}
}
@@ -222,7 +222,7 @@ private function invalidateExpiredConsents($expire): int
try {
$users = $db->loadObjectList();
- } catch (\RuntimeException $e) {
+ } catch (\RuntimeException) {
return Status::KNOCKOUT;
}
@@ -246,7 +246,7 @@ private function invalidateExpiredConsents($expire): int
try {
$db->execute();
- } catch (\RuntimeException $e) {
+ } catch (\RuntimeException) {
return Status::KNOCKOUT;
}
diff --git a/plugins/task/requests/src/Extension/Requests.php b/plugins/task/requests/src/Extension/Requests.php
index 606d1d9a00b9a..eb595d0ac3b18 100644
--- a/plugins/task/requests/src/Extension/Requests.php
+++ b/plugins/task/requests/src/Extension/Requests.php
@@ -146,7 +146,7 @@ protected function makeGetRequest(ExecuteTaskEvent $event): int
File::write($responseFilename, $responseBody);
$this->snapshot['output_file'] = $responseFilename;
$responseStatus = 'SAVED';
- } catch (\Exception $e) {
+ } catch (\Exception) {
$this->logTask($this->getApplication()->getLanguage()->_('PLG_TASK_REQUESTS_TASK_GET_REQUEST_LOG_UNWRITEABLE_OUTPUT'), 'error');
$responseStatus = 'NOT_SAVED';
}
diff --git a/plugins/task/rotatelogs/src/Extension/RotateLogs.php b/plugins/task/rotatelogs/src/Extension/RotateLogs.php
index 542de9e9746a9..65237a2abd97b 100644
--- a/plugins/task/rotatelogs/src/Extension/RotateLogs.php
+++ b/plugins/task/rotatelogs/src/Extension/RotateLogs.php
@@ -103,7 +103,7 @@ private function rotateLogs(ExecuteTaskEvent $event): int
foreach ($files as $file) {
try {
File::delete($logPath . '/' . $file);
- } catch (FilesystemException $exception) {
+ } catch (FilesystemException) {
}
}
} else {
@@ -146,7 +146,7 @@ private function rotate($path, $filename, $currentVersion)
try {
File::move($path . '/' . $filename, $rotatedFile);
- } catch (FilesystemException $exception) {
+ } catch (FilesystemException) {
}
}
diff --git a/plugins/task/sitestatus/src/Extension/SiteStatus.php b/plugins/task/sitestatus/src/Extension/SiteStatus.php
index da446799f2282..6bf6064da0806 100644
--- a/plugins/task/sitestatus/src/Extension/SiteStatus.php
+++ b/plugins/task/sitestatus/src/Extension/SiteStatus.php
@@ -171,7 +171,7 @@ private function writeConfigFile(Registry $config): int
// Attempt to write the configuration file as a PHP class named JConfig.
$configuration = $config->toString('PHP', ['class' => 'JConfig', 'closingtag' => false]);
File::write($file, $configuration);
- } catch (\Exception $e) {
+ } catch (\Exception) {
$this->logTask($this->getApplication()->getLanguage()->_('PLG_TASK_SITE_STATUS_ERROR_WRITE_FAILED'), 'error');
return Status::KNOCKOUT;
diff --git a/plugins/task/updatenotification/src/Extension/UpdateNotification.php b/plugins/task/updatenotification/src/Extension/UpdateNotification.php
index 7ad5464b0c54e..c685edb9413ac 100644
--- a/plugins/task/updatenotification/src/Extension/UpdateNotification.php
+++ b/plugins/task/updatenotification/src/Extension/UpdateNotification.php
@@ -203,7 +203,7 @@ private function sendNotification(ExecuteTaskEvent $event): int
} catch (MailDisabledException | phpMailerException $exception) {
try {
$this->logTask($jLanguage->_($exception->getMessage()));
- } catch (\RuntimeException $exception) {
+ } catch (\RuntimeException) {
return Status::KNOCKOUT;
}
}
@@ -300,7 +300,7 @@ private function getSuperUsers($email = null)
$db->setQuery($query);
$ret = $db->loadObjectList();
- } catch (\Exception $exc) {
+ } catch (\Exception) {
return $ret;
}
diff --git a/plugins/user/contactcreator/src/Extension/ContactCreator.php b/plugins/user/contactcreator/src/Extension/ContactCreator.php
index f9070ab324804..fe4c35c3782c1 100644
--- a/plugins/user/contactcreator/src/Extension/ContactCreator.php
+++ b/plugins/user/contactcreator/src/Extension/ContactCreator.php
@@ -108,7 +108,7 @@ public function onUserAfterSave(AfterSaveEvent $event): void
// Check if the contact already exists to generate new name & alias if required
if ($contact->id == 0) {
- list($name, $alias) = $this->generateAliasAndName($contact->alias, $contact->name, $categoryId);
+ [$name, $alias] = $this->generateAliasAndName($contact->alias, $contact->name, $categoryId);
$contact->name = $name;
$contact->alias = $alias;
diff --git a/plugins/user/joomla/src/Extension/Joomla.php b/plugins/user/joomla/src/Extension/Joomla.php
index 2e57b02b22b2a..09148bab8d66c 100644
--- a/plugins/user/joomla/src/Extension/Joomla.php
+++ b/plugins/user/joomla/src/Extension/Joomla.php
@@ -164,7 +164,7 @@ public function onUserAfterDelete(AfterDeleteEvent $event): void
try {
$db->setQuery($query)->execute();
- } catch (\Exception $e) {
+ } catch (\Exception) {
// Do nothing
}
}
@@ -349,7 +349,7 @@ public function onUserLogin(LoginEvent $event)
try {
$db->setQuery($query)->execute();
- } catch (\RuntimeException $e) {
+ } catch (\RuntimeException) {
// The old session is already invalidated, don't let this block logging in
}
diff --git a/plugins/user/profile/src/Extension/Profile.php b/plugins/user/profile/src/Extension/Profile.php
index 37961248c2310..0f42e8c13a186 100644
--- a/plugins/user/profile/src/Extension/Profile.php
+++ b/plugins/user/profile/src/Extension/Profile.php
@@ -328,7 +328,7 @@ public function onUserBeforeSave(BeforeSaveEvent $event)
try {
$date = new Date($data['profile']['dob']);
$this->date = $date->format('Y-m-d H:i:s');
- } catch (\Exception $e) {
+ } catch (\Exception) {
// Throw an exception if date is not valid.
throw new \InvalidArgumentException($this->getApplication()->getLanguage()->_('PLG_USER_PROFILE_ERROR_INVALID_DOB'));
}
diff --git a/plugins/user/token/src/Extension/Token.php b/plugins/user/token/src/Extension/Token.php
index a523718476323..96591be720708 100644
--- a/plugins/user/token/src/Extension/Token.php
+++ b/plugins/user/token/src/Extension/Token.php
@@ -158,7 +158,7 @@ public function onContentPrepareData(PrepareDataEvent $event): void
$data->{$this->profileKeyPrefix}[$k] = $v[1];
}
- } catch (\Exception $e) {
+ } catch (\Exception) {
// We suppress any database error. It means we get no token saved by default.
}
@@ -428,7 +428,7 @@ public function onUserAfterDelete(AfterDeleteEvent $event): void
$query->bind(':profileKey', $profileKey, ParameterType::STRING);
$db->setQuery($query)->execute();
- } catch (\Exception $e) {
+ } catch (\Exception) {
// Do nothing.
}
}
@@ -473,7 +473,7 @@ private function getTokenSeedForUser(int $userId): ?string
$query->bind(':userId', $userId, ParameterType::INTEGER);
return $db->setQuery($query)->loadResult();
- } catch (\Exception $e) {
+ } catch (\Exception) {
return null;
}
}
@@ -553,7 +553,7 @@ private function getTokenForDisplay(
try {
$siteSecret = $this->getApplication()->get('secret');
- } catch (\Exception $e) {
+ } catch (\Exception) {
$siteSecret = '';
}
@@ -620,7 +620,7 @@ private function hasTokenProfileFields(?int $userId): bool
try {
$numRows = $db->setQuery($q)->loadResult() ?? 0;
- } catch (\Exception $e) {
+ } catch (\Exception) {
return false;
}
diff --git a/plugins/user/token/src/Field/JoomlatokenField.php b/plugins/user/token/src/Field/JoomlatokenField.php
index 7de4cbc7751ae..5aa1570344b9b 100644
--- a/plugins/user/token/src/Field/JoomlatokenField.php
+++ b/plugins/user/token/src/Field/JoomlatokenField.php
@@ -104,7 +104,7 @@ private function getTokenForDisplay(string $tokenSeed): string
try {
$siteSecret = Factory::getApplication()->get('secret');
- } catch (\Exception $e) {
+ } catch (\Exception) {
$siteSecret = '';
}
diff --git a/templates/system/build_incomplete.html b/templates/system/build_incomplete.html
index 50014b0c6506e..9eb53c2561d52 100644
--- a/templates/system/build_incomplete.html
+++ b/templates/system/build_incomplete.html
@@ -6,7 +6,7 @@
Joomla: Environment Setup Incomplete
-
+
diff --git a/templates/system/fatal-error.html b/templates/system/fatal-error.html
index 75c9faff1a50d..68247714020c9 100644
--- a/templates/system/fatal-error.html
+++ b/templates/system/fatal-error.html
@@ -6,7 +6,7 @@
An Error Occurred: {{statusText}}
-
+
diff --git a/templates/system/incompatible.html b/templates/system/incompatible.html
index 4593b6d29f35f..513d0941d61e5 100644
--- a/templates/system/incompatible.html
+++ b/templates/system/incompatible.html
@@ -6,7 +6,7 @@
Joomla: unsupported PHP version
-
+
diff --git a/tests/System/README.md b/tests/System/README.md
index d9f5e1050bdbf..550b185e9489c 100644
--- a/tests/System/README.md
+++ b/tests/System/README.md
@@ -1,6 +1,6 @@
-# System Tests in Joomla
+# Joomla System Tests
-The Joomla CMS System Tests are end-to-end (E2E) tests and executed in real browsers
+The **Joomla System Tests** are end-to-end (E2E) tests and executed in real browsers
using the [Cypress](https://www.cypress.io) test automation tool.
These tests simulate real user interactions, clicking and navigating like a human would,
to ensure the entire application works as expected.
@@ -10,14 +10,14 @@ and details how to execute and extend tests.
It concludes with solutions for common failure situations in the troubleshooting chapter.
-## Software Architecture – Overview
+## Software Architecture Overview
The following software architecture diagram illustrates the Joomla System Tests architecture and provides an overview.
It is simplified to offer an initial understanding. Detailed explanations follow later in this document.
-
+
-On the left, **Cypress** is running as a [Node.js](https://nodejs.org/) application. The file **`cypress.config.mjs`** is used to configure settings and preferences for running the System Tests in your environment.
+On the left, **Cypress** is running as a [Node.js](https://nodejs.org/) application. The file **`cypress.config.mjs`** is used to configure settings and preferences for running the Joomla System Tests in your environment.
In the middle, the **Cypress Test Runner** controls a **Browser** with the **Joomla** application running HTML, CSS, and JavaScript. Also running in the browser context are the **Database Commands**, the **API commands** and the npm packages **[joomala-cypress](https://github.com/joomla-projects/joomla-cypress/)** and
**[smtp-tester](https://www.npmjs.com/package/smtp-tester)**.
@@ -26,19 +26,32 @@ The **Joomla** CMS server software is depicted on the right. It runs with PHP on
several key components: the public **User-Frontend**, the administrator **Admin-Backend**, the **API**, and the **Web-Installer**. These components and their interactions will be detailed later in the document.
The file **`configuration.php`** is used to configure settings for Joomla server software.
-Joomla uses a **Database**, and the System Tests do as well.
+Joomla uses a **Database**, and the Joomla System Tests do as well.
## Installation
-Joomla System Tests work on different operating systems such as macOS, desktop Linux distributions like Ubuntu,
-and Windows (using WSL 2 or a framework like Laragon). They also work well with Docker containers.
-You will need a Web Server and a database like MariaDB running.
+Joomla System Tests are compatible with various operating systems, including macOS, desktop Linux distributions like Ubuntu, and Windows (using WSL 2 or frameworks like Laragon).
+They are fully compatible with the official [Joomla Docker containers](https://hub.docker.com/_/joomla).
+
+To run these tests, you will need a web server (e.g. Apache) and a database (e.g. MariaDB).
+Ensure the web server is configured to load the `rewrite_module` and allow directory overrides. For example, in Apache:
+
+```apache
+# Load the rewrite module
+LoadModule rewrite_module lib/httpd/modules/mod_rewrite.so
+
+# Configure directory overrides
+
+ AllowOverride All
+
+```
+
Before getting started, please ensure you have the following prerequisites installed:
[PHP](https://www.php.net/), [Git](https://git-scm.com/), [npm](https://www.npmjs.com/),
and [Composer](https://getcomposer.org/).
-The following steps are required for the installation of the CMS System Tests.
+The following steps are required for the installation of the Joomla System Tests.
1. Clone Joomla into an empty folder (e.g. `/var/www/html`) where it can be served by a Web Server
```
@@ -58,7 +71,7 @@ cp cypress.config.dist.mjs cypress.config.mjs
5. Adapt the env variables in the file `cypress.config.mjs`, they should point to the site, user data and database environment. Ensure that the `smtp_port` is not in use on your system.
-## Running System Tests
+## Running Joomla System Tests
After installation, you can start the Joomla System Tests with headless Cypress. The test suite starts with Joomla Web-Installer as the first test step.
```
@@ -86,19 +99,19 @@ npx cypress run --spec 'tests/System/integration/{administrator,site,api,plugins
> npm run cypress:open
> ```
-If you are running System Tests, you will see `console.log()` outputs from Cypress Tasks in the Node.js environment. If you would like to see `console.log()` output from the browser in headless mode as well, you can use the Electron web browser and set the following environment variable:
+If you are running Joomla System Tests, you will see `console.log()` outputs from Cypress Tasks in the Node.js environment. If you would like to see `console.log()` output from the browser in headless mode as well, you can use the Electron web browser and set the following environment variable:
```
export ELECTRON_ENABLE_LOGGING=1
npm run cypress:run --browser electron
```
-## Software Architecture – More Detailed
+## Software Architecture Details
-Since many interactions in System Tests are involved, the following image illustrates 10 simplified interactions,
+Since Joomla System Tests involve many interactions, the following image illustrates 10 simplified interactions,
which are numbered and described below.
-
+
1. **Cypress** starts the **Browser** and runs **Cypress Test Runner** to control Joomla running in the browser and access the DOM.
2. **Joomla** software running in the browser sends requests to the **Web Server** and receives responses just as it would during normal use, even without tests.
@@ -106,14 +119,15 @@ which are numbered and described below.
4. Cypress **Tasks** are used to execute code within the Cypress Node.js context. These tasks are triggered by the Cypress Test Runner, which runs in the browser, and are typically used for operations like
interacting with the file system.
5. Joomla on the Web Server interacts with the **Database** as it normally would, without running any tests.
-6. System Tests has Cypress custom **Database Commands** (described later) to interact with the database.
-7. The file `cypress.config.mjs` is read by **Cypress** and used to configure settings and preferences for running the System Tests in your environment.
+6. Joomla System Tests has Cypress custom **Database Commands** (described later) to interact with the database.
+7. The file `cypress.config.mjs` is read by **Cypress** and used to configure settings and
+ preferences for running the Joomla System Tests in your environment.
8. The Joomla installation is initiated by the test spec [Installation.cy.js](integration/install/Installation.cy.js),
which is the first test executed in the overall test suite.
This test spec deletes the Joomla configuration file, and since the `configuration.php` file no longer exists,
the following Joomla Web-Installer call starts the installation process, including database creation.
To ensure that this initial test spec runs correctly, the `installation` folder must not be deleted,
-allowing the System Tests to be executed multiple times.
+allowing the Joomla System Tests to be executed multiple times.
After the Joomla Web-Installer completes, [Installation.cy.js](integration/install/Installation.cy.js)
modifies some parameters in the `configuration.php` file, such as SMTP settings or the API `$secret`.
9. Joomla Web-Installer creates `configuration.php` file. For security reasons, the file mask is set to read-only (444).
@@ -178,7 +192,7 @@ The following code in a test executes the writing file task with parameters:
### Commands
We are using [custom commands](https://docs.cypress.io/api/cypress-api/custom-commands) to enhance Cypress
-with reusable code snippets for the System Tests.
+with reusable code snippets for the Joomla System Tests.
These commands can be used to create objects in the database or to call the API.
Since Cypress doesn't support namespaces for commands, we prefix them in the function name.
Therefore, a Database Command always starts with `db_`, and an API command with `api_`.
@@ -221,7 +235,7 @@ The following commands are available and are served by the file [tests/System/su
- **db_updateExtensionParameter** – Sets the parameter for the given extension
-#### API commands
+#### API Commands
The API commands make API requests to the CMS API endpoint `/api/index.php/v1`.
They are asynchronous and must be chained like:
@@ -240,6 +254,23 @@ The following commands are available and are served by the file
- **api_responseContains** – Checks if the given attribute in the response contains the specified value
+#### Config Commands
+
+There is a single config command provided by the file
+[tests/System/support/commands/config.mjs](/tests/System/support/commands/config.mjs):
+
+- **config_setParameter** - Sets a parameter in `configuration.php` file
+
+Even tough `config_setParameter` is a Cypress command running in the browser context,
+it uses `cy.readFile()` and the Cypress task `writeRelativeFile` to delegate file system operations to Node.js,
+as browsers cannot access the filesystem directly.
+
+This command is asynchronous and must be chained, as shown below:
+```JavaScript
+cy.config_setParameter('sef', false).then(() => { ... })`
+```
+
+
### Developer Tips
#### Running a Single Test
@@ -264,7 +295,7 @@ cy.wait(20000); // waits for 20 seconds
## Troubleshooting
-### Errors 'EACCES: permission denied' or 'EPERM: operation not permitted'
+### Error 'EACCES: permission denied' or 'EPERM: operation not permitted'
If the Cypress installation step or the entire test suite is executed by a non-root user, the following error may occur:
```
@@ -290,7 +321,7 @@ sudo npm run cypress:run
If the `root` user does not have a Cypress installation, you can use the Cypress installation cache of the current user:
```
-CYPRESS_CACHE_FOLDER=$HOME/.cache/Cypress sudo npm run cypress:run
+sudo CYPRESS_CACHE_FOLDER=$HOME/.cache/Cypress npm run cypress:run
```
@@ -312,7 +343,7 @@ but you still need to configure `cypress.config.mjs` file.
### Timeout Error on Slow Machines
-If you encounter the following error while running the System Tests on slow machines:
+If you encounter the following error while running the Joomla System Tests on slow machines:
```
AssertionError: Timed out retrying after 4000ms: Expected to find element
diff --git a/tests/System/data/com_media/test-image-1.jpg b/tests/System/data/com_media/test-image-1.jpg
deleted file mode 100644
index edf94915fd28e..0000000000000
Binary files a/tests/System/data/com_media/test-image-1.jpg and /dev/null differ
diff --git a/tests/System/data/com_media/test-image-1.png b/tests/System/data/com_media/test-image-1.png
deleted file mode 100644
index 8a1daa0121d52..0000000000000
Binary files a/tests/System/data/com_media/test-image-1.png and /dev/null differ
diff --git a/tests/System/data/com_media/test-image-2.png b/tests/System/data/com_media/test-image-2.png
deleted file mode 100644
index 8a1daa0121d52..0000000000000
Binary files a/tests/System/data/com_media/test-image-2.png and /dev/null differ
diff --git a/tests/System/fixtures/com_media/test-image-1.jpg b/tests/System/fixtures/com_media/test-image-1.jpg
new file mode 100644
index 0000000000000..04ed6209f02c0
Binary files /dev/null and b/tests/System/fixtures/com_media/test-image-1.jpg differ
diff --git a/tests/System/fixtures/com_media/test-image-2.jpg b/tests/System/fixtures/com_media/test-image-2.jpg
new file mode 100644
index 0000000000000..d780f8931c364
Binary files /dev/null and b/tests/System/fixtures/com_media/test-image-2.jpg differ
diff --git a/tests/System/fixtures/com_media/test-image-3.jpg b/tests/System/fixtures/com_media/test-image-3.jpg
new file mode 100644
index 0000000000000..231009b941419
Binary files /dev/null and b/tests/System/fixtures/com_media/test-image-3.jpg differ
diff --git a/tests/System/integration/administrator/components/com_contenthistory/Content.cy.js b/tests/System/integration/administrator/components/com_contenthistory/Content.cy.js
index afa40f90dab93..d2a7729a2aeef 100644
--- a/tests/System/integration/administrator/components/com_contenthistory/Content.cy.js
+++ b/tests/System/integration/administrator/components/com_contenthistory/Content.cy.js
@@ -94,7 +94,7 @@ describe('Test in backend that the content history list', () => {
.should('contain.text', 'Please select two versions');
});
- it('can delete an history content item', () => {
+ it('can delete a history content item', () => {
cy.visit('/administrator/index.php?option=com_content&task=article.add');
cy.get('#jform_title').clear().type('Test article versions');
cy.clickToolbarButton('Save');
diff --git a/tests/System/integration/administrator/components/com_finder/Index.cy.js b/tests/System/integration/administrator/components/com_finder/Index.cy.js
new file mode 100644
index 0000000000000..f6decc45d1b20
--- /dev/null
+++ b/tests/System/integration/administrator/components/com_finder/Index.cy.js
@@ -0,0 +1,28 @@
+describe('Test in backend that the Smart Search', () => {
+ beforeEach(() => {
+ cy.doAdministratorLogin();
+ });
+ afterEach(() => {
+ cy.task('queryDB', "DELETE FROM #__content WHERE title = 'Test article'");
+ });
+
+ it('can index an article', () => {
+ // Create a new article
+ cy.visit('/administrator/index.php?option=com_content&task=article.add');
+ cy.get('#jform_title').clear().type('Test article');
+ cy.clickToolbarButton('Save & Close');
+ // Visit the smart search page
+ cy.visit('/administrator/index.php?option=com_finder&view=index');
+ cy.contains('Test article').should('exist');
+ });
+
+ it('can purge the index', () => {
+ // Visit the smart search page
+ cy.visit('/administrator/index.php?option=com_finder&view=index');
+ cy.get('#toolbar-maintenance-group > button').click();
+ // Click the "Clear Index" button
+ cy.get('#maintenance-group-children-index-purge > button', { force: true }).click();
+ cy.clickDialogConfirm(true);
+ cy.checkForSystemMessage('All items have been deleted.');
+ });
+});
diff --git a/tests/System/integration/administrator/components/com_installer/FromUrl.cy.js b/tests/System/integration/administrator/components/com_installer/FromUrl.cy.js
new file mode 100644
index 0000000000000..7a8a4e1e9c825
--- /dev/null
+++ b/tests/System/integration/administrator/components/com_installer/FromUrl.cy.js
@@ -0,0 +1,30 @@
+describe('Test in backend that the Installer', () => {
+ beforeEach(() => {
+ cy.doAdministratorLogin();
+ cy.visit('/administrator/index.php?option=com_installer&view=install');
+ });
+
+ it('has a title', () => {
+ cy.get('h1.page-title').should('contain.text', 'Extensions: Install');
+ });
+
+ it('can install and uninstall a component from URL tab', () => {
+ cy.get('joomla-tab-element#url').should('exist');
+ cy.get('joomla-tab-element#url').click({ force: true });
+ cy.get('button#installbutton_url').should('contain.text', 'Check & Install');
+ cy.get('input#install_url').type('https://github.com/joomla-extensions/patchtester/releases/download/4.4.0/com_patchtester_4.4.0.zip', { force: true }); // Fill in the input field
+ cy.get('button#installbutton_url').click({ force: true });
+ // Check if the installation was successful
+ cy.contains('Installation of the component was successful.');
+
+ // Uninstall the component
+ cy.visit('/administrator/index.php?option=com_installer&view=manage');
+ cy.searchForItem('Joomla! Patch Tester');
+ cy.checkAllResults();
+ cy.clickToolbarButton('Action');
+ cy.contains('Uninstall').click();
+ cy.clickDialogConfirm(true);
+ // Check if the uninstallation was successful
+ cy.contains('Uninstalling the component was successful');
+ });
+});
diff --git a/tests/System/integration/administrator/components/com_media/Media.cy.js b/tests/System/integration/administrator/components/com_media/Media.cy.js
index dcdd714c060fd..d7472190d502c 100644
--- a/tests/System/integration/administrator/components/com_media/Media.cy.js
+++ b/tests/System/integration/administrator/components/com_media/Media.cy.js
@@ -74,6 +74,7 @@ describe('Test in backend that the media manager', () => {
});
it('can display an error message when an invalid path is defined in the url', () => {
+ cy.on('uncaught:exception', () => false);
cy.visit('/administrator/index.php?option=com_media&path=local-images:/invalid');
cy.wait('@getMedia');
@@ -81,10 +82,29 @@ describe('Test in backend that the media manager', () => {
});
it('can display an error message when an invalid path is defined in the session', () => {
+ cy.on('uncaught:exception', () => false);
window.sessionStorage.setItem('joomla.mediamanager', JSON.stringify({ selectedDirectory: 'local-images:/invalid' }));
cy.visit('/administrator/index.php?option=com_media');
cy.wait('@getMedia');
cy.checkForSystemMessage('File or Folder not found');
});
+
+ it('can not rename to malicious file', () => {
+ cy.visit('/administrator/index.php?option=com_media');
+ cy.wait('@getMedia');
+
+ cy.window()
+ .then((win) => win.Joomla.getOptions('csrf.token'))
+ .then((token) => cy.request({
+ method: 'put',
+ url: '/administrator/index.php?option=com_media&format=json&mediatypes=0,1,2,3&task=api.files&path=local-images%3A%2Fpowered_by.png',
+ body: { [token]: '1', newPath: 'local-images:/powered.php', move: 0 },
+ failOnStatusCode: false,
+ }))
+ .then((response) => {
+ expect(response.status).to.eq(500);
+ cy.readFile('images/powered.php').should('not.exist');
+ });
+ });
});
diff --git a/tests/System/integration/administrator/components/com_menu/Menu.cy.js b/tests/System/integration/administrator/components/com_menu/Menu.cy.js
index f775ca49edd43..1b44800c02245 100644
--- a/tests/System/integration/administrator/components/com_menu/Menu.cy.js
+++ b/tests/System/integration/administrator/components/com_menu/Menu.cy.js
@@ -1,4 +1,4 @@
-describe('Test in backend that the user form', () => {
+describe('Test in backend that the menu form', () => {
beforeEach(() => cy.doAdministratorLogin());
afterEach(() => cy.task('queryDB', "DELETE FROM #__menu_types WHERE menutype = 'test'"));
diff --git a/tests/System/integration/administrator/components/com_templates/Styles.cy.js b/tests/System/integration/administrator/components/com_templates/Styles.cy.js
new file mode 100644
index 0000000000000..5e23a78705329
--- /dev/null
+++ b/tests/System/integration/administrator/components/com_templates/Styles.cy.js
@@ -0,0 +1,51 @@
+describe('Test in backend that the styles list', () => {
+ beforeEach(() => cy.doAdministratorLogin());
+
+ it('can list site styles', () => {
+ cy.visit('/administrator/index.php?option=com_templates&view=styles&client_id=0');
+ cy.get('h1.page-title').should('contain.text', 'Templates: Styles (Site)');
+ cy.get('#client_id option:selected').should('have.text', 'Site');
+ cy.get('#styleList tbody a').contains('Cassiopeia - Default').click();
+ cy.get('h1.page-title').should('contain.text', 'Templates: Edit Style');
+ cy.clickToolbarButton('Cancel');
+ });
+
+ it('can list administrator styles', () => {
+ cy.visit('/administrator/index.php?option=com_templates&view=styles&client_id=1');
+ cy.get('h1.page-title').should('contain.text', 'Templates: Styles (Administrator)');
+ cy.get('#client_id option:selected').should('have.text', 'Administrator');
+ cy.get('#styleList tbody a').contains('Atum - Default').click();
+ cy.get('h1.page-title').should('contain.text', 'Templates: Edit Style');
+ cy.clickToolbarButton('Cancel');
+ });
+
+ it('can select client', () => {
+ cy.visit('/administrator/index.php?option=com_templates&view=styles&client_id=0');
+ cy.get('h1.page-title').should('contain.text', 'Templates: Styles (Site)');
+ cy.get('#client_id').select('Administrator');
+ cy.get('h1.page-title').should('contain.text', 'Templates: Styles (Administrator)');
+ cy.get('#client_id').select('Site');
+ cy.get('h1.page-title').should('contain.text', 'Templates: Styles (Site)');
+ });
+
+ it('can open templates', () => {
+ cy.visit('/administrator/index.php?option=com_templates&view=styles&client_id=1');
+ cy.get('h1.page-title').should('contain.text', 'Templates: Styles (Administrator)');
+ cy.get('#toolbar-templates').click();
+ cy.get('h1.page-title').should('contain.text', 'Templates: Templates (Administrator)');
+ });
+
+ it('can open options', () => {
+ cy.visit('/administrator/index.php?option=com_templates&view=styles&client_id=0');
+ cy.intercept('**/administrator/index.php?option=com_config&view=component&component=com_templates*').as('options');
+ cy.intercept('**/administrator/index.php?option=com_templates&view=styles&client_id=0*').as('listview');
+
+ cy.clickToolbarButton('Options');
+ cy.wait('@options');
+ cy.title().should('contain', 'Template: Options');
+ cy.get('h1.page-title').should('contain', 'Template: Options');
+
+ cy.clickToolbarButton('Cancel');
+ cy.wait('@listview');
+ });
+});
diff --git a/tests/System/integration/administrator/components/com_templates/Templates.cy.js b/tests/System/integration/administrator/components/com_templates/Templates.cy.js
new file mode 100644
index 0000000000000..bac91ca46550d
--- /dev/null
+++ b/tests/System/integration/administrator/components/com_templates/Templates.cy.js
@@ -0,0 +1,51 @@
+describe('Test in backend that the templates list', () => {
+ beforeEach(() => cy.doAdministratorLogin());
+
+ it('can list site templates', () => {
+ cy.visit('/administrator/index.php?option=com_templates&view=templates&client_id=0');
+ cy.get('h1.page-title').should('contain.text', 'Templates: Templates (Site)');
+ cy.get('#client_id option:selected').should('have.text', 'Site');
+ cy.get('#templateList tbody .template-name a').contains('Cassiopeia').click();
+ cy.get('h1.page-title').should('contain.text', 'Templates: Customise (Cassiopeia)');
+ cy.clickToolbarButton('Cancel');
+ });
+
+ it('can list administrator templates', () => {
+ cy.visit('/administrator/index.php?option=com_templates&view=templates&client_id=1');
+ cy.get('h1.page-title').should('contain.text', 'Templates: Templates (Administrator)');
+ cy.get('#client_id option:selected').should('have.text', 'Administrator');
+ cy.get('#templateList tbody .template-name a').contains('Atum').click();
+ cy.get('h1.page-title').should('contain.text', 'Templates: Customise (Atum)');
+ cy.clickToolbarButton('Cancel');
+ });
+
+ it('can select client', () => {
+ cy.visit('/administrator/index.php?option=com_templates&view=templates&client_id=0');
+ cy.get('h1.page-title').should('contain.text', 'Templates: Templates (Site)');
+ cy.get('#client_id').select('Administrator');
+ cy.get('h1.page-title').should('contain.text', 'Templates: Templates (Administrator)');
+ cy.get('#client_id').select('Site');
+ cy.get('h1.page-title').should('contain.text', 'Templates: Templates (Site)');
+ });
+
+ it('can open styles', () => {
+ cy.visit('/administrator/index.php?option=com_templates&view=templates&client_id=0');
+ cy.get('h1.page-title').should('contain.text', 'Templates: Templates (Site)');
+ cy.get('#toolbar-styles').click();
+ cy.get('h1.page-title').should('contain.text', 'Templates: Styles (Site)');
+ });
+
+ it('can open options', () => {
+ cy.visit('/administrator/index.php?option=com_templates&view=templates&client_id=1');
+ cy.intercept('**/administrator/index.php?option=com_config&view=component&component=com_templates*').as('options');
+ cy.intercept('**/administrator/index.php?option=com_templates&view=templates&client_id=1*').as('listview');
+
+ cy.clickToolbarButton('Options');
+ cy.wait('@options');
+ cy.title().should('contain', 'Template: Options');
+ cy.get('h1.page-title').should('contain', 'Template: Options');
+
+ cy.clickToolbarButton('Cancel');
+ cy.wait('@listview');
+ });
+});
diff --git a/tests/System/integration/administrator/components/com_users/Mfa.cy.js b/tests/System/integration/administrator/components/com_users/Mfa.cy.js
new file mode 100644
index 0000000000000..040d92756781c
--- /dev/null
+++ b/tests/System/integration/administrator/components/com_users/Mfa.cy.js
@@ -0,0 +1,125 @@
+import { TOTP } from 'totp-generator';
+
+afterEach(() => cy.db_getUserId().then((uid) => cy.task('queryDB', `DELETE FROM #__user_mfa WHERE user_id = ${uid}`)));
+
+describe('Test in backend that the user', () => {
+ it('can login with Multi-factor Authentication (email)', () => {
+ cy.doAdministratorLogin();
+ cy.visit('/administrator/index.php?option=com_users&view=users');
+ cy.get('.header-profile:visible').click();
+ cy.get('.header-profile a.dropdown-item').contains('Edit Account').click();
+ cy.get('#myTab div[role="tablist"] button[aria-controls="multifactorauth"]').click();
+ cy.task('clearEmails');
+ cy.get('.com-users-methods-list-method-name-email a.com-users-methods-list-method-addnew').click();
+ cy.get('#com-users-method-edit-title').clear().type('Test Code');
+ cy.task('getMails').then((mails) => {
+ cy.wrap(mails).should('have.lengthOf', 1);
+ cy.wrap(mails[0].headers.subject).should('match', /code is -\d{6}-$/);
+ cy.wrap(/code is -(\d{6})-$/.exec(mails[0].headers.subject)[1]).as('code')
+ .then((code) => cy.wrap(mails[0].body).should('have.string', `Your authentication code is ${code}.`));
+ cy.wrap(mails[0].html).should('be.false');
+ });
+ cy.get('@code').then((code) => cy.get('#com-users-method-code').clear().type(code));
+ cy.get('#com-users-method-edit').submit();
+ cy.get('.com-users-methods-list-method-name-email .com-users-methods-list-method-record').contains('Test Code');
+ cy.clickToolbarButton('Cancel');
+ cy.doAdministratorLogout();
+ cy.get('#mod-login-username').type(Cypress.env('username'));
+ cy.get('#mod-login-password').type(Cypress.env('password'));
+ cy.get('#form-login').submit();
+ cy.get('#users-mfa-title').contains('Test Code');
+ cy.task('getMails').then((mails) => {
+ cy.wrap(mails).should('have.lengthOf', 2);
+ cy.wrap(mails[1].headers.subject).should('match', /code is -\d{6}-$/);
+ cy.wrap(/code is -(\d{6})-$/.exec(mails[1].headers.subject)[1]).as('code');
+ });
+ cy.get('@code').then((code) => cy.get('#users-mfa-code').clear().type(code));
+ cy.get('#users-mfa-captive-form').submit();
+ cy.visit('/administrator/index.php?option=com_users&view=users');
+ cy.get('.header-profile:visible').click();
+ cy.get('.header-profile a.dropdown-item').contains('Edit Account').click();
+ cy.get('#myTab div[role="tablist"] button[aria-controls="multifactorauth"]').click();
+ cy.get('#com-users-methods-reset-message').contains('is enabled');
+ cy.get('.com-users-methods-list-method-name-email a.com-users-methods-list-method-record-delete').click();
+ cy.on('window:confirm', (text) => expect(text).to.contains('Are you sure you want to delete?'));
+ cy.get('#com-users-methods-reset-message').contains('not enabled');
+ });
+
+ it('can login with Multi-factor Authentication (totp)', () => {
+ cy.doAdministratorLogin();
+ cy.visit('/administrator/index.php?option=com_users&view=users');
+ cy.get('.header-profile:visible').click();
+ cy.get('.header-profile a.dropdown-item').contains('Edit Account').click();
+ cy.get('#myTab div[role="tablist"] button[aria-controls="multifactorauth"]').click();
+ cy.get('.com-users-methods-list-method-name-totp a.com-users-methods-list-method-addnew').click();
+ cy.get('#com-users-method-edit-title').clear().type('Test Code');
+ cy.get('.com-users-method-edit-tabular-container table tr td')
+ .contains('Enter this key')
+ .next()
+ .invoke('text')
+ .then((key) => key.trim())
+ .as('secret');
+ cy.get('@secret').then((secret) => cy.get('#com-users-method-code').clear().type(TOTP.generate(secret).otp));
+ cy.get('#com-users-method-edit').submit();
+ cy.get('.com-users-methods-list-method-name-totp .com-users-methods-list-method-record').contains('Test Code');
+ cy.clickToolbarButton('Cancel');
+ cy.doAdministratorLogout();
+ cy.get('#mod-login-username').type(Cypress.env('username'));
+ cy.get('#mod-login-password').type(Cypress.env('password'));
+ cy.get('#form-login').submit();
+ cy.get('#users-mfa-title').contains('Verification code');
+ cy.get('@secret').then((secret) => cy.get('#users-mfa-code').clear().type(TOTP.generate(secret).otp));
+ cy.get('#users-mfa-captive-form').submit();
+ cy.visit('/administrator/index.php?option=com_users&view=users');
+ cy.get('.header-profile:visible').click();
+ cy.get('.header-profile a.dropdown-item').contains('Edit Account').click();
+ cy.get('#myTab div[role="tablist"] button[aria-controls="multifactorauth"]').click();
+ cy.get('#com-users-methods-reset-message').contains('is enabled');
+ cy.get('.com-users-methods-list-method-name-totp a.com-users-methods-list-method-record-delete').click();
+ cy.on('window:confirm', (text) => expect(text).to.contains('Are you sure you want to delete?'));
+ cy.get('#com-users-methods-reset-message').contains('not enabled');
+ });
+
+ it('can login with Multi-factor Authentication (backup codes)', () => {
+ cy.doAdministratorLogin();
+ cy.visit('/administrator/index.php?option=com_users&view=users');
+ cy.get('.header-profile:visible').click();
+ cy.get('.header-profile a.dropdown-item').contains('Edit Account').click();
+ cy.get('#myTab div[role="tablist"] button[aria-controls="multifactorauth"]').click();
+ cy.get('.com-users-methods-list-method-name-totp a.com-users-methods-list-method-addnew').click();
+ cy.get('#com-users-method-edit-title').clear().type('Test Code');
+ cy.get('.com-users-method-edit-tabular-container table tr td')
+ .contains('Enter this key')
+ .next()
+ .invoke('text')
+ .then((key) => key.trim())
+ .as('secret');
+ cy.get('@secret').then((secret) => cy.get('#com-users-method-code').clear().type(TOTP.generate(secret).otp));
+ cy.get('#com-users-method-edit').submit();
+ cy.get('.com-users-methods-list-method-name-totp .com-users-methods-list-method-record').contains('Test Code');
+ cy.get('.com-users-methods-list-method-name-backupcodes .com-users-methods-list-method-record-info a')
+ .should('have.text', 'Print these codes')
+ .click();
+ cy.get('table > tbody > tr > td').first().invoke('text').then((code) => cy.wrap(/\d{8}/.exec(code)[0]).as('code'));
+ cy.get('#toolbar-user-mfa-edit-cancel').contains('Back').click();
+ cy.clickToolbarButton('Cancel');
+ cy.doAdministratorLogout();
+ cy.get('#mod-login-username').type(Cypress.env('username'));
+ cy.get('#mod-login-password').type(Cypress.env('password'));
+ cy.get('#form-login').submit();
+ cy.get('#users-mfa-title').contains('Verification code');
+ cy.get('#toolbar-user-mfa-choose-another').click();
+ cy.get('a.com-users-method').contains('Backup Codes').click();
+ cy.get('#users-mfa-title').contains('Backup Codes');
+ cy.get('@code').then((code) => cy.get('#users-mfa-code').clear().type(code));
+ cy.get('#users-mfa-captive-form').submit();
+ cy.visit('/administrator/index.php?option=com_users&view=users');
+ cy.get('.header-profile:visible').click();
+ cy.get('.header-profile a.dropdown-item').contains('Edit Account').click();
+ cy.get('#myTab div[role="tablist"] button[aria-controls="multifactorauth"]').click();
+ cy.get('#com-users-methods-reset-message').contains('is enabled');
+ cy.get('.com-users-methods-list-method-name-totp a.com-users-methods-list-method-record-delete').click();
+ cy.on('window:confirm', (text) => expect(text).to.contains('Are you sure you want to delete?'));
+ cy.get('#com-users-methods-reset-message').contains('not enabled');
+ });
+});
diff --git a/tests/System/integration/api/Basic.cy.js b/tests/System/integration/api/Basic.cy.js
index 337eadedc2a99..ab01bc20f6ff4 100644
--- a/tests/System/integration/api/Basic.cy.js
+++ b/tests/System/integration/api/Basic.cy.js
@@ -13,7 +13,7 @@ describe('Test that the API', () => {
it('returns not found return code when wrong route is set', () => {
cy.api_getBearerToken().then((token) => cy.request({
- method: 'GET', url: '/api/index.php/v1/content/articles/1', headers: { Authorization: `Bearer ${token}` }, failOnStatusCode: false,
+ method: 'GET', url: '/api/index.php/v1/invalid', headers: { Authorization: `Bearer ${token}` }, failOnStatusCode: false,
})
.its('status').should('equal', 404));
});
diff --git a/tests/System/integration/api/com_banners/Categories.cy.js b/tests/System/integration/api/com_banners/Categories.cy.js
index e202aac9e438a..925fdb2d0a808 100644
--- a/tests/System/integration/api/com_banners/Categories.cy.js
+++ b/tests/System/integration/api/com_banners/Categories.cy.js
@@ -17,7 +17,12 @@ describe('Test that banners categories API endpoint', () => {
});
it('can create a category', () => {
- cy.api_post('/banners/categories', { title: 'automated test banner category', description: 'automated test banner category description' })
+ cy.api_post('/banners/categories', {
+ title: 'automated test banner category',
+ description: 'automated test banner category description',
+ parent_id: 1,
+ extension: 'com_banners',
+ })
.then((response) => {
cy.wrap(response).its('body').its('data').its('attributes')
.its('title')
diff --git a/tests/System/integration/api/com_contact/Categories.cy.js b/tests/System/integration/api/com_contact/Categories.cy.js
index b8d4ca781d33f..046e5f87e4fbe 100644
--- a/tests/System/integration/api/com_contact/Categories.cy.js
+++ b/tests/System/integration/api/com_contact/Categories.cy.js
@@ -17,7 +17,12 @@ describe('Test that contact categories API endpoint', () => {
});
it('can create a category', () => {
- cy.api_post('/contacts/categories', { title: 'automated test contact category', description: 'automated test contact category description' })
+ cy.api_post('/contacts/categories', {
+ title: 'automated test contact category',
+ description: 'automated test contact category description',
+ parent_id: 1,
+ extension: 'com_contacts',
+ })
.then((response) => {
cy.wrap(response).its('body').its('data').its('attributes')
.its('title')
diff --git a/tests/System/integration/api/com_contact/Contacts.cy.js b/tests/System/integration/api/com_contact/Contacts.cy.js
index 0e428f617debe..edf5dc4e29563 100644
--- a/tests/System/integration/api/com_contact/Contacts.cy.js
+++ b/tests/System/integration/api/com_contact/Contacts.cy.js
@@ -62,7 +62,7 @@ describe('Test that contacts API endpoint', () => {
cy.wrap(mails[0].receivers).should('have.property', Cypress.env('email'));
cy.wrap(mails[0].headers.subject).should('equal', `${Cypress.env('sitename')}: automated test subject`);
cy.wrap(mails[0].body).should('have.string', 'This is an enquiry email via');
- cy.wrap(mails[0].body).should('have.string', `${Cypress.env('name')} <${Cypress.env('email')}>`);
+ cy.wrap(mails[0].body).should('have.string', `${Cypress.env('name')} ${Cypress.env('email')}`);
cy.wrap(mails[0].body).should('have.string', 'automated test message');
});
});
diff --git a/tests/System/integration/api/com_content/Categories.cy.js b/tests/System/integration/api/com_content/Categories.cy.js
index 47c6b557bee8b..634876895e678 100644
--- a/tests/System/integration/api/com_content/Categories.cy.js
+++ b/tests/System/integration/api/com_content/Categories.cy.js
@@ -17,7 +17,12 @@ describe('Test that content categories API endpoint', () => {
});
it('can create a category', () => {
- cy.api_post('/content/categories', { title: 'automated test content category', description: 'automated test content category description' })
+ cy.api_post('/content/categories', {
+ title: 'automated test content category',
+ description: 'automated test content category description',
+ parent_id: 1,
+ extension: 'com_content',
+ })
.then((response) => {
cy.wrap(response).its('body').its('data').its('attributes')
.its('title')
@@ -30,7 +35,10 @@ describe('Test that content categories API endpoint', () => {
it('can update a category', () => {
cy.db_createCategory({ title: 'automated test content category', extension: 'com_content' })
- .then((id) => cy.api_patch(`/content/categories/${id}`, { title: 'updated automated test content category', description: 'automated test content category description' }))
+ .then((id) => cy.api_patch(`/content/categories/${id}`, {
+ title: 'updated automated test content category',
+ description: 'automated test content category description',
+ }))
.then((response) => {
cy.wrap(response).its('body').its('data').its('attributes')
.its('title')
diff --git a/tests/System/integration/api/com_media/Files.cy.js b/tests/System/integration/api/com_media/Files.cy.js
index 5260022a981e4..37507085491b0 100644
--- a/tests/System/integration/api/com_media/Files.cy.js
+++ b/tests/System/integration/api/com_media/Files.cy.js
@@ -1,15 +1,27 @@
describe('Test that media files API endpoint', () => {
- // Ensure 'test-dir' (relative to cmsPath) is available and has correct permissions
+ // Create relative path to the fixtures images directory, from Cypress config and platform independent
+ const fixturesFolder = Cypress.config('fixturesFolder').replace(/\\/g, '/');
+ // projectRoot is e.g. 'C:\laragon\www\joomla53\tests\System\fixtures'
+ const projectRoot = Cypress.config('projectRoot').replace(/\\/g, '/');
+ // Result is e.g. 'tests/System/fixtures/com_media'
+ const mediaFixturesFolder = `${fixturesFolder
+ .replace(projectRoot, '')
+ .replace(/^\//, '')}/com_media`;
+
+ // Create directories and test images before running each test
beforeEach(() => {
- cy.task('writeRelativeFile', { path: 'images/test-dir/dummy.txt', content: '1' });
- cy.task('writeRelativeFile', { path: 'files/test-image-1.jpg', content: '1' });
+ // Ensure 'files/test-dir' exists (relative to cmsPath) and has the correct permissions
cy.task('writeRelativeFile', { path: 'files/test-dir/dummy.txt', content: '1' });
- cy.task('writeRelativeFile', { path: 'files/test-dir/test-image-1-subfolder.jpg', content: '1' });
- });
- // If it exists, delete the 'test-dir' (relative to cmsPath) and its contents
- afterEach(() => {
- cy.task('deleteRelativePath', 'images/test-dir');
+ // Ensure 'images/test-dir2' exists (relative to cmsPath) and has the correct permissions
+ cy.task('writeRelativeFile', { path: 'images/test-dir2/dummy.txt', content: '1' });
+ cy.task('copyRelativeFile', { source: `${mediaFixturesFolder}/test-image-1.jpg`, destination: 'files/test-image-1.jpg' });
+ cy.task('copyRelativeFile', { source: `${mediaFixturesFolder}/test-image-2.jpg`, destination: 'files/test-dir/test-image-2.jpg' });
+ cy.task('copyRelativeFile', { source: `${mediaFixturesFolder}/test-image-3.jpg`, destination: 'images/test-dir2/test-image-3.jpg' });
+ });
+ // Delete all files and directories created during the test, only for clean-up and only if they exist
+ after(() => {
cy.task('deleteRelativePath', 'files/test-dir');
+ cy.task('deleteRelativePath', 'images/test-dir2');
cy.task('deleteRelativePath', 'files/test-image-1.jpg');
});
@@ -23,7 +35,7 @@ describe('Test that media files API endpoint', () => {
it('can deliver a list of files in a subfolder', () => {
cy.api_get('/media/files/test-dir/')
- .then((response) => cy.api_responseContains(response, 'name', 'test-image-1-subfolder.jpg'));
+ .then((response) => cy.api_responseContains(response, 'name', 'test-image-2.jpg'));
});
it('can deliver a list of files with an adapter', () => {
@@ -61,7 +73,7 @@ describe('Test that media files API endpoint', () => {
});
it('can create a file without adapter', () => {
- cy.readFile('tests/System/data/com_media/test-image-1.jpg', 'binary')
+ cy.readFile('tests/System/fixtures/com_media/test-image-1.jpg', 'binary')
.then((data) => cy.api_post('/media/files', { path: 'test-dir/test.jpg', content: Buffer.from(data, 'binary').toString('base64') }))
.then((response) => {
cy.wrap(response).its('body').its('data').its('attributes')
@@ -86,33 +98,33 @@ describe('Test that media files API endpoint', () => {
});
it('can create a file with adapter', () => {
- cy.readFile('tests/System/data/com_media/test-image-1.jpg', 'binary')
- .then((data) => cy.api_post('/media/files', { path: 'local-images:/test-dir/test.jpg', content: Buffer.from(data, 'binary').toString('base64') }))
+ cy.readFile('tests/System/fixtures/com_media/test-image-2.jpg', 'binary')
+ .then((data) => cy.api_post('/media/files', { path: 'local-images:/test-dir2/test.jpg', content: Buffer.from(data, 'binary').toString('base64') }))
.then((response) => {
cy.wrap(response).its('body').its('data').its('attributes')
.its('name')
.should('include', 'test.jpg');
cy.wrap(response).its('body').its('data').its('attributes')
.its('path')
- .should('include', 'local-images:/test-dir/test.jpg');
+ .should('include', 'local-images:/test-dir2/test.jpg');
});
});
it('can create a folder with adapter', () => {
- cy.api_post('/media/files', { path: 'local-images:/test-dir/test-from-create' })
+ cy.api_post('/media/files', { path: 'local-images:/test-dir2/test-from-create' })
.then((response) => {
cy.wrap(response).its('body').its('data').its('attributes')
.its('name')
.should('include', 'test-from-create');
cy.wrap(response).its('body').its('data').its('attributes')
.its('path')
- .should('include', 'local-images:/test-dir/test-from-create');
+ .should('include', 'local-images:/test-dir2/test-from-create');
});
});
it('can update a file without adapter', () => {
- cy.task('writeRelativeFile', { path: 'files/test-dir/override.jpg', content: '1' })
- .then(() => cy.readFile('tests/System/data/com_media/test-image-1.jpg', 'binary'))
+ cy.task('writeRelativeFile', { path: 'files/test-dir/override.jpg', content: '1', mode: 0o666 })
+ .then(() => cy.readFile('tests/System/fixtures/com_media/test-image-1.jpg', 'binary'))
.then((data) => cy.api_patch(
'/media/files/test-dir/override.jpg',
{ path: 'test-dir/override.jpg', content: Buffer.from(data, 'binary').toString('base64') },
@@ -127,7 +139,7 @@ describe('Test that media files API endpoint', () => {
});
it('can update a folder without adapter', () => {
- cy.task('writeRelativeFile', { path: 'files/test-dir/override/test.jpg', content: '1' })
+ cy.task('writeRelativeFile', { path: 'files/test-dir/override/test.jpg', content: '1', mode: 0o666 })
.then(() => cy.api_patch('/media/files/test-dir/override', { path: 'test-dir/override-new' }))
.then((response) => {
cy.wrap(response).its('body').its('data').its('attributes')
@@ -140,51 +152,47 @@ describe('Test that media files API endpoint', () => {
});
it('can update a file with adapter', () => {
- cy.task('writeRelativeFile', { path: 'images/test-dir/override.jpg', content: '1' })
- .then(() => cy.readFile('tests/System/data/com_media/test-image-1.jpg', 'binary'))
+ cy.task('writeRelativeFile', { path: 'images/test-dir2/override.jpg', content: '1', mode: 0o666 })
+ .then(() => cy.readFile('tests/System/fixtures/com_media/test-image-2.jpg', 'binary'))
.then((data) => cy.api_patch(
- '/media/files/local-images:/test-dir/override.jpg',
- { path: 'local-images:/test-dir/override.jpg', content: Buffer.from(data, 'binary').toString('base64') },
+ '/media/files/local-images:/test-dir2/override.jpg',
+ { path: 'local-images:/test-dir2/override.jpg', content: Buffer.from(data, 'binary').toString('base64') },
)).then((response) => {
cy.wrap(response).its('body').its('data').its('attributes')
.its('name')
.should('include', 'override.jpg');
cy.wrap(response).its('body').its('data').its('attributes')
.its('path')
- .should('include', 'local-images:/test-dir/override.jpg');
+ .should('include', 'local-images:/test-dir2/override.jpg');
});
});
it('can update a folder with adapter', () => {
- cy.task('writeRelativeFile', { path: 'images/test-dir/override/test.jpg', content: '1' })
- .then(() => cy.api_patch('/media/files/local-images:/test-dir/override', { path: 'local-images:/test-dir/override-new' }))
+ cy.task('writeRelativeFile', { path: 'images/test-dir2/override/test.jpg', content: '1', mode: 0o666 })
+ .then(() => cy.api_patch('/media/files/local-images:/test-dir2/override', { path: 'local-images:/test-dir2/override-new' }))
.then((response) => {
cy.wrap(response).its('body').its('data').its('attributes')
.its('name')
.should('include', 'override-new');
cy.wrap(response).its('body').its('data').its('attributes')
.its('path')
- .should('include', 'local-images:/test-dir/override-new');
+ .should('include', 'local-images:/test-dir2/override-new');
});
});
- it('can delete a file without adapter', () => {
- cy.task('writeRelativeFile', { path: 'files/test-dir/todelete.jpg', content: '1' })
- .then(() => cy.api_delete('/media/files/test-dir/todelete.jpg'));
+ it("can delete an image in 'files' without adapter", () => {
+ cy.api_delete('/media/files/test-dir/test-image-2.jpg');
});
- it('can delete a folder without adapter', () => {
- cy.task('writeRelativeFile', { path: 'files/test-dir/todelete/dummy.txt', content: '1' })
- .then(() => cy.api_delete('/media/files/test-dir/todelete'));
+ it("can delete a folder in 'files' without adapter", () => {
+ cy.api_delete('/media/files/test-dir');
});
- it('can delete a file with adapter', () => {
- cy.task('writeRelativeFile', { path: 'images/test-dir/todelete.jpg', content: '1' })
- .then(() => cy.api_delete('/media/files/local-images:/test-dir/todelete.jpg'));
+ it("can delete an image in 'images' with adapter", () => {
+ cy.api_delete('/media/files/local-images:/test-dir2/test-image-3.jpg');
});
- it('can delete a folder with adapter', () => {
- cy.task('writeRelativeFile', { path: 'images/test-dir/todelete/dummy.txt', content: '1' })
- .then(() => cy.api_delete('/media/files/local-images:/test-dir/todelete'));
+ it("can delete a folder in 'images' with adapter", () => {
+ cy.api_delete('/media/files/local-images:/test-dir2');
});
});
diff --git a/tests/System/integration/api/com_menus/AdministratorMenuItems.cy.js b/tests/System/integration/api/com_menus/AdministratorMenuItems.cy.js
index d25dc3f2e5057..fa6205b73cca2 100644
--- a/tests/System/integration/api/com_menus/AdministratorMenuItems.cy.js
+++ b/tests/System/integration/api/com_menus/AdministratorMenuItems.cy.js
@@ -45,7 +45,7 @@ describe('Test that menu items administrator API endpoint', () => {
it('can update an administrator menu item', () => {
cy.db_createMenuItem({ title: 'automated test administrator menu item', type: 'component', client_id: 1 })
- .then((id) => cy.api_patch(`/menus/administrator/items/${id}`, { title: 'updated automated test administrator menu item', type: 'component' }))
+ .then((id) => cy.api_patch(`/menus/administrator/items/${id}`, { title: 'updated automated test administrator menu item', type: 'component', menuordering: id }))
.then((response) => cy.wrap(response).its('body').its('data').its('attributes')
.its('title')
.should('include', 'updated automated test administrator menu item'));
diff --git a/tests/System/integration/api/com_menus/SiteMenuItems.cy.js b/tests/System/integration/api/com_menus/SiteMenuItems.cy.js
index 9be6aa3775bb1..409774a5d66dd 100644
--- a/tests/System/integration/api/com_menus/SiteMenuItems.cy.js
+++ b/tests/System/integration/api/com_menus/SiteMenuItems.cy.js
@@ -44,7 +44,7 @@ describe('Test that menu items site API endpoint', () => {
it('can update a site menu item', () => {
cy.db_createMenuItem({ title: 'updated automated test site menu item', type: 'component' })
- .then((id) => cy.api_patch(`/menus/site/items/${id}`, { title: 'automated test site menu item', type: 'component' }))
+ .then((id) => cy.api_patch(`/menus/site/items/${id}`, { title: 'automated test site menu item', type: 'component', menuordering: id }))
.then((response) => cy.wrap(response).its('body').its('data').its('attributes')
.its('title')
.should('include', 'automated test site menu item'));
diff --git a/tests/System/integration/api/com_newsfeed/Categories.cy.js b/tests/System/integration/api/com_newsfeed/Categories.cy.js
index 7575bd59f881d..3c849aad38de7 100644
--- a/tests/System/integration/api/com_newsfeed/Categories.cy.js
+++ b/tests/System/integration/api/com_newsfeed/Categories.cy.js
@@ -15,7 +15,12 @@ describe('Test that newsfeed categories API endpoint', () => {
});
it('can create a category', () => {
- cy.api_post('/newsfeeds/categories', { title: 'automated test feed category', description: 'automated test feed category description' })
+ cy.api_post('/newsfeeds/categories', {
+ title: 'automated test feed category',
+ description: 'automated test feed category description',
+ parent_id: 1,
+ extension: 'com_newsfeeds',
+ })
.then((response) => {
cy.wrap(response).its('body').its('data').its('attributes')
.its('title')
diff --git a/tests/System/integration/cli/Finder.cy.js b/tests/System/integration/cli/Finder.cy.js
new file mode 100644
index 0000000000000..95b59280b5250
--- /dev/null
+++ b/tests/System/integration/cli/Finder.cy.js
@@ -0,0 +1,13 @@
+describe('Test that console command finder', () => {
+ it('can index content', () => {
+ cy.exec(`php ${Cypress.env('cmsPath')}/cli/joomla.php finder:index`)
+ .its('stdout')
+ .should('contain', 'Total Processing Time');
+ });
+ it('can purge and index content', () => {
+ cy.exec(`php ${Cypress.env('cmsPath')}/cli/joomla.php finder:index purge`)
+ .its('stdout')
+ .should('contain', 'Clear index')
+ .should('contain', 'Total Processing Time');
+ });
+});
diff --git a/tests/System/integration/install/Installation.cy.js b/tests/System/integration/install/Installation.cy.js
index e2e04997da1c8..fd3f1ccc6088b 100644
--- a/tests/System/integration/install/Installation.cy.js
+++ b/tests/System/integration/install/Installation.cy.js
@@ -19,6 +19,9 @@ describe('Install Joomla', () => {
cy.task('deleteRelativePath', 'configuration.php');
cy.installJoomla(config);
+ // Disable compat plugin
+ cy.db_enableExtension(0, 'plg_behaviour_compat');
+
cy.doAdministratorLogin(config.username, config.password, false);
cy.cancelTour();
cy.disableStatistics();
@@ -33,6 +36,5 @@ describe('Install Joomla', () => {
cy.config_setParameter('mailer', 'smtp');
cy.config_setParameter('smtphost', Cypress.env('smtp_host'));
cy.config_setParameter('smtpport', Cypress.env('smtp_port'));
- cy.config_setParameter('force_ssl', '2');
});
});
diff --git a/tests/System/integration/plugins/system/shortcut/ShortcutPlugin.cy.js b/tests/System/integration/plugins/system/shortcut/ShortcutPlugin.cy.js
new file mode 100644
index 0000000000000..97ce1411b6896
--- /dev/null
+++ b/tests/System/integration/plugins/system/shortcut/ShortcutPlugin.cy.js
@@ -0,0 +1,96 @@
+beforeEach(() => { cy.doAdministratorLogin(); });
+afterEach(() => {
+ cy.task('queryDB', "DELETE FROM #__banners WHERE name = 'Test banner'");
+ cy.task('queryDB', "DELETE FROM #__contact_details WHERE name = 'Test contact'");
+});
+
+describe('Test that the shortcut system plugin', () => {
+ it('can save (apply) edit form', () => {
+ cy.visit('/administrator/index.php?option=com_banners&task=banner.add');
+ cy.get('#jform_name').clear().type('Test banner').blur();
+ cy.get('body').type('JA');
+
+ cy.checkForSystemMessage('Banner saved.');
+ cy.get('#jform_name').should('have.value', 'Test banner');
+ });
+
+ it('can save and close edit form', () => {
+ cy.visit('/administrator/index.php?option=com_contact&task=contact.add');
+ cy.get('#jform_name').clear().type('Test contact').blur();
+ cy.get('body').type('JS');
+
+ cy.checkForSystemMessage('Contact saved.');
+ cy.get('#contactList').contains('Test contact');
+ });
+
+ it('can cancel edit form', () => {
+ cy.visit('/administrator/index.php?option=com_content&task=article.add');
+ cy.get('#jform_title').clear().type('Test article').blur();
+ cy.intercept('index.php?option=com_content&view=articles').as('listview');
+ cy.get('body').type('JQ');
+
+ cy.wait('@listview');
+ });
+
+ it('can open edit form', () => {
+ cy.visit('/administrator/index.php?option=com_menus&view=menus');
+ cy.get('body').type('JN');
+
+ cy.get('h1.page-title').should('contain', 'Menus: Add');
+ });
+
+ it('can search in list view', () => {
+ cy.visit('/administrator/index.php?option=com_plugins&view=plugins&filter=');
+ cy.get('body').type('JF');
+
+ cy.focused().should('have.attr', 'name', 'filter[search]').type('Keyboard Shortcuts{enter}');
+
+ cy.get('#pluginList').contains('System - Keyboard Shortcuts');
+ });
+
+ it('can open component options', () => {
+ cy.visit('/administrator/index.php?option=com_privacy');
+ cy.get('body').type('JO');
+
+ cy.get('h1.page-title').should('contain', 'Privacy: Options');
+ });
+
+ it('can open help screen', () => {
+ cy.visit('/administrator/index.php?option=com_users&view=users');
+ cy.window().then((win) => cy.stub(win, 'open').returns(win).as('help'));
+ cy.get('body').type('JH');
+
+ cy.get('@help').should('be.calledWithMatch', /https:\/\/help\.joomla\.org\/proxy\?keyref=Help\d+:Users&lang=en/);
+ });
+
+ it('can toggle menu', () => {
+ cy.visit('/administrator/index.php');
+ cy.get('#menu-collapse').contains('Toggle Menu').should('be.visible');
+ cy.get('#wrapper').should('not.have.class', 'closed');
+ cy.get('body').type('JM');
+
+ cy.get('#menu-collapse').contains('Toggle Menu').should('not.be.visible');
+ cy.get('#wrapper').should('have.class', 'closed');
+ cy.get('body').type('JM');
+
+ cy.get('#menu-collapse').contains('Toggle Menu').should('be.visible');
+ cy.get('#wrapper').should('not.have.class', 'closed');
+ });
+
+ it('can open dashboard', () => {
+ cy.visit('/administrator/index.php?option=com_cpanel&view=cpanel&dashboard=system');
+ cy.intercept('index.php').as('dashboard');
+ cy.get('body').type('JD');
+
+ cy.wait('@dashboard');
+ cy.get('h1.page-title').should('contain', 'Home Dashboard');
+ });
+
+ it('can open shortcut overview', () => {
+ cy.visit('/administrator/index.php?option=com_cpanel&view=cpanel&dashboard=help');
+ cy.get('div.container-fluid').contains('J then X Keyboard Shortcuts');
+ cy.get('body').type('JX');
+
+ cy.get('joomla-dialog[type="inline"] .joomla-dialog-header').should('contain', 'Keyboard Shortcuts');
+ });
+});
diff --git a/tests/System/integration/site/components/com_config/Config.cy.js b/tests/System/integration/site/components/com_config/Config.cy.js
new file mode 100644
index 0000000000000..b69209aa1b4b5
--- /dev/null
+++ b/tests/System/integration/site/components/com_config/Config.cy.js
@@ -0,0 +1,48 @@
+describe('Test in frontend that the config config view', () => {
+ beforeEach(() => cy.doFrontendLogin());
+
+ it('can edit site configuration without menu item', () => {
+ cy.visit('/index.php?option=com_config&view=config');
+ cy.title().should('equal', 'Home');
+ cy.get('#jform_sitename_pagetitles').select('After');
+ cy.get('#application-form button[data-submit-task="config.apply"]').click();
+
+ cy.checkForSystemMessage('Configuration saved.');
+ cy.title().should('equal', `Home - ${Cypress.env('sitename')}`);
+ cy.get('#jform_sitename_pagetitles').select('No');
+ cy.get('#application-form button[data-submit-task="config.apply"]').click();
+
+ cy.checkForSystemMessage('Configuration saved.');
+ cy.title().should('equal', 'Home');
+ });
+
+ it('can edit site configuration with menu item', () => {
+ cy.db_createMenuItem({ title: 'automated test site configuration', link: 'index.php?option=com_config&view=config' })
+ .then(() => {
+ cy.visit('/');
+ cy.get('a:contains(automated test site configuration)').click();
+
+ cy.title().should('equal', 'automated test site configuration');
+ cy.get('head meta[name=description]').should('not.exist');
+ cy.get('#jform_MetaDesc').clear().type('test meta description');
+ cy.get('#application-form button[data-submit-task="config.apply"]').click();
+
+ cy.checkForSystemMessage('Configuration saved.');
+ cy.get('head meta[name=description]').should('have.attr', 'content').should('contain', 'test meta description');
+ cy.get('#jform_MetaDesc').clear();
+ cy.get('#application-form button[data-submit-task="config.apply"]').click();
+
+ cy.checkForSystemMessage('Configuration saved.');
+ cy.get('head meta[name=description]').should('not.exist');
+ });
+ });
+
+ it('can toggle inline help options', () => {
+ cy.visit('/index.php?option=com_config&view=config');
+ cy.get('#jform_access-desc').should('be.not.visible');
+ cy.get('button.button-inlinehelp').click();
+ cy.get('#jform_access-desc').should('be.visible');
+ cy.get('button.button-inlinehelp').click();
+ cy.get('#jform_access-desc').should('be.not.visible');
+ });
+});
diff --git a/tests/System/integration/site/components/com_config/Modules.cy.js b/tests/System/integration/site/components/com_config/Modules.cy.js
new file mode 100644
index 0000000000000..65dd6da93c1f7
--- /dev/null
+++ b/tests/System/integration/site/components/com_config/Modules.cy.js
@@ -0,0 +1,24 @@
+describe('Test in frontend that the config modules view', () => {
+ beforeEach(() => cy.doFrontendLogin());
+
+ it('can edit a module', () => {
+ cy.visit('/');
+ cy.get('nav.mod-breadcrumbs__wrapper li.mod-breadcrumbs__here').should('exist');
+ cy.get('nav.mod-breadcrumbs__wrapper li.mod-breadcrumbs__divider').should('not.exist');
+ cy.get('nav.mod-breadcrumbs__wrapper a.jmodedit').click();
+
+ cy.title().should('equal', 'Module Settings');
+ cy.get('#options button.accordion-button').contains('Options').click();
+ cy.get('#jform_params_showHere0').click();
+ cy.get('#modules-form button[data-submit-task="modules.apply"]').click();
+
+ cy.checkForSystemMessage('Module saved.');
+ cy.get('nav.mod-breadcrumbs__wrapper li.mod-breadcrumbs__here').should('not.exist');
+ cy.get('nav.mod-breadcrumbs__wrapper li.mod-breadcrumbs__divider').should('exist');
+ cy.get('#options button.accordion-button').contains('Options').click();
+ cy.get('#jform_params_showHere1').click();
+ cy.get('#modules-form button[data-submit-task="modules.save"]').click();
+
+ cy.checkForSystemMessage('Module saved.');
+ });
+});
diff --git a/tests/System/integration/site/components/com_config/Templates.cy.js b/tests/System/integration/site/components/com_config/Templates.cy.js
new file mode 100644
index 0000000000000..85e659c511f42
--- /dev/null
+++ b/tests/System/integration/site/components/com_config/Templates.cy.js
@@ -0,0 +1,38 @@
+describe('Test in frontend that the config config view', () => {
+ beforeEach(() => cy.doFrontendLogin());
+
+ it('can edit template settings without menu item', () => {
+ cy.visit('/index.php?option=com_config&view=templates');
+ cy.title().should('equal', 'Home');
+ cy.get('#params_siteDescription').clear().type('test site description');
+ cy.get('#templates-form button[data-submit-task="templates.apply"]').click();
+
+ cy.checkForSystemMessage('Configuration saved.');
+ cy.get('header div.site-description').should('contain', 'test site description');
+ cy.get('#params_siteDescription').clear();
+ cy.get('#templates-form button[data-submit-task="templates.apply"]').click();
+
+ cy.checkForSystemMessage('Configuration saved.');
+ cy.get('header div.site-description').should('not.exist');
+ });
+
+ it('can edit template settings with menu item', () => {
+ cy.db_createMenuItem({ title: 'automated test template settings', link: 'index.php?option=com_config&view=templates' })
+ .then(() => {
+ cy.visit('/');
+ cy.get('a:contains(automated test template settings)').click();
+
+ cy.title().should('equal', 'automated test template settings');
+ cy.get('#params_brand0').click();
+ cy.get('#templates-form button[data-submit-task="templates.apply"]').click();
+
+ cy.checkForSystemMessage('Configuration saved.');
+ cy.get('header div.navbar-brand').should('not.exist');
+ cy.get('#params_brand1').click();
+ cy.get('#templates-form button[data-submit-task="templates.apply"]').click();
+
+ cy.checkForSystemMessage('Configuration saved.');
+ cy.get('header div.navbar-brand').should('exist');
+ });
+ });
+});
diff --git a/tests/System/integration/site/components/com_users/Mfa.cy.js b/tests/System/integration/site/components/com_users/Mfa.cy.js
new file mode 100644
index 0000000000000..91790661a79ea
--- /dev/null
+++ b/tests/System/integration/site/components/com_users/Mfa.cy.js
@@ -0,0 +1,103 @@
+import { TOTP } from 'totp-generator';
+
+afterEach(() => cy.db_getUserId().then((uid) => cy.task('queryDB', `DELETE FROM #__user_mfa WHERE user_id = ${uid}`)));
+
+describe('Test in frontend that the user', () => {
+ it('can login with Multi-factor Authentication (email)', () => {
+ cy.doFrontendLogin();
+ cy.visit('/index.php?option=com_users&view=profile&layout=edit');
+ cy.task('clearEmails');
+ cy.get('.com-users-methods-list-method-name-email a.com-users-methods-list-method-addnew').click();
+ cy.get('#com-users-method-edit-title').clear().type('Test Code');
+ cy.task('getMails').then((mails) => {
+ cy.wrap(mails).should('have.lengthOf', 1);
+ cy.wrap(mails[0].headers.subject).should('match', /code is -\d{6}-$/);
+ cy.wrap(/code is -(\d{6})-$/.exec(mails[0].headers.subject)[1]).as('code')
+ .then((code) => cy.wrap(mails[0].body).should('have.string', `Your authentication code is ${code}.`));
+ cy.wrap(mails[0].html).should('be.false');
+ });
+ cy.get('@code').then((code) => cy.get('#com-users-method-code').clear().type(code));
+ cy.get('#com-users-method-edit').submit();
+ cy.get('.com-users-methods-list-method-name-email .com-users-methods-list-method-record').contains('Test Code');
+ cy.doFrontendLogout();
+ cy.get('form.mod-login input[name="username"]').type(Cypress.env('username'));
+ cy.get('form.mod-login input[name="password"]').type(Cypress.env('password'));
+ cy.get('form.mod-login').submit();
+ cy.get('#users-mfa-title').contains('Test Code');
+ cy.task('getMails').then((mails) => {
+ cy.wrap(mails).should('have.lengthOf', 2);
+ cy.wrap(mails[1].headers.subject).should('match', /code is -\d{6}-$/);
+ cy.wrap(/code is -(\d{6})-$/.exec(mails[1].headers.subject)[1]).as('code');
+ });
+ cy.get('@code').then((code) => cy.get('#users-mfa-code').clear().type(code));
+ cy.get('#users-mfa-captive-form').submit();
+ cy.visit('/index.php?option=com_users&view=profile&layout=edit');
+ cy.get('#com-users-methods-reset-message').contains('is enabled');
+ cy.get('.com-users-methods-list-method-name-email a.com-users-methods-list-method-record-delete').click();
+ cy.on('window:confirm', (text) => expect(text).to.contains('Are you sure you want to delete?'));
+ cy.get('#com-users-methods-reset-message').contains('not enabled');
+ });
+
+ it('can login with Multi-factor Authentication (totp)', () => {
+ cy.doFrontendLogin();
+ cy.visit('/index.php?option=com_users&view=profile&layout=edit');
+ cy.get('.com-users-methods-list-method-name-totp a.com-users-methods-list-method-addnew').click();
+ cy.get('#com-users-method-edit-title').clear().type('Test Code');
+ cy.get('.com-users-method-edit-tabular-container table tr td')
+ .contains('Enter this key')
+ .next()
+ .invoke('text')
+ .then((key) => key.trim())
+ .as('secret');
+ cy.get('@secret').then((secret) => cy.get('#com-users-method-code').clear().type(TOTP.generate(secret).otp));
+ cy.get('#com-users-method-edit').submit();
+ cy.get('.com-users-methods-list-method-name-totp .com-users-methods-list-method-record').contains('Test Code');
+ cy.doFrontendLogout();
+ cy.get('form.mod-login input[name="username"]').type(Cypress.env('username'));
+ cy.get('form.mod-login input[name="password"]').type(Cypress.env('password'));
+ cy.get('form.mod-login').submit();
+ cy.get('#users-mfa-title').contains('Verification code');
+ cy.get('@secret').then((secret) => cy.get('#users-mfa-code').clear().type(TOTP.generate(secret).otp));
+ cy.get('#users-mfa-captive-form').submit();
+ cy.visit('/index.php?option=com_users&view=profile&layout=edit');
+ cy.get('#com-users-methods-reset-message').contains('is enabled');
+ cy.get('.com-users-methods-list-method-name-totp a.com-users-methods-list-method-record-delete').click();
+ cy.on('window:confirm', (text) => expect(text).to.contains('Are you sure you want to delete?'));
+ cy.get('#com-users-methods-reset-message').contains('not enabled');
+ });
+
+ it('can login with Multi-factor Authentication (backup codes)', () => {
+ cy.doFrontendLogin();
+ cy.visit('/index.php?option=com_users&view=profile&layout=edit');
+ cy.get('.com-users-methods-list-method-name-totp a.com-users-methods-list-method-addnew').click();
+ cy.get('#com-users-method-edit-title').clear().type('Test Code');
+ cy.get('.com-users-method-edit-tabular-container table tr td')
+ .contains('Enter this key')
+ .next()
+ .invoke('text')
+ .then((key) => key.trim())
+ .as('secret');
+ cy.get('@secret').then((secret) => cy.get('#com-users-method-code').clear().type(TOTP.generate(secret).otp));
+ cy.get('#com-users-method-edit').submit();
+ cy.get('.com-users-methods-list-method-name-totp .com-users-methods-list-method-record').contains('Test Code');
+ cy.get('.com-users-methods-list-method-name-backupcodes .com-users-methods-list-method-record-info a')
+ .should('have.text', 'Print these codes')
+ .click();
+ cy.get('table > tbody > tr > td').first().invoke('text').then((code) => cy.wrap(/\d{8}/.exec(code)[0]).as('code'));
+ cy.doFrontendLogout();
+ cy.get('form.mod-login input[name="username"]').type(Cypress.env('username'));
+ cy.get('form.mod-login input[name="password"]').type(Cypress.env('password'));
+ cy.get('form.mod-login').submit();
+ cy.get('#users-mfa-title').contains('Verification code');
+ cy.get('#users-mfa-captive-form-choose-another a').click();
+ cy.get('a.com-users-method').contains('Backup Codes').click();
+ cy.get('#users-mfa-title').contains('Backup Codes');
+ cy.get('@code').then((code) => cy.get('#users-mfa-code').clear().type(code));
+ cy.get('#users-mfa-captive-form').submit();
+ cy.visit('/index.php?option=com_users&view=profile&layout=edit');
+ cy.get('#com-users-methods-reset-message').contains('is enabled');
+ cy.get('.com-users-methods-list-method-name-totp a.com-users-methods-list-method-record-delete').click();
+ cy.on('window:confirm', (text) => expect(text).to.contains('Are you sure you want to delete?'));
+ cy.get('#com-users-methods-reset-message').contains('not enabled');
+ });
+});
diff --git a/tests/System/integration/site/components/com_users/Registration.cy.js b/tests/System/integration/site/components/com_users/Registration.cy.js
index bb856f52762a7..c48405cd519c6 100644
--- a/tests/System/integration/site/components/com_users/Registration.cy.js
+++ b/tests/System/integration/site/components/com_users/Registration.cy.js
@@ -5,6 +5,7 @@ describe('Test in frontend that the users registration view', () => {
});
afterEach(() => {
cy.db_updateExtensionParameter('allowUserRegistration', '0', 'com_users');
+ cy.task('queryDB', "DELETE FROM #__user_usergroup_map WHERE user_id = (SELECT id FROM #__users WHERE username = 'testuser')");
cy.task('queryDB', "DELETE FROM #__users WHERE username = 'testuser'");
});
diff --git a/tests/System/plugins/db.mjs b/tests/System/plugins/db.mjs
index 8d8c1d4deb47a..2190f09476897 100644
--- a/tests/System/plugins/db.mjs
+++ b/tests/System/plugins/db.mjs
@@ -165,6 +165,7 @@ function deleteInsertedItems(config) {
if (item.table === `${config.env.db_prefix}users`) {
promises.push(queryTestDB(`DELETE FROM #__user_usergroup_map WHERE user_id IN (${item.rows.join(',')})`, config));
promises.push(queryTestDB(`DELETE FROM #__user_profiles WHERE user_id IN (${item.rows.join(',')})`, config));
+ promises.push(queryTestDB(`DELETE FROM #__session WHERE userid IN (${item.rows.join(',')})`, config));
}
if (item.table === `${config.env.db_prefix}content`) {
diff --git a/tests/System/support/commands/db.mjs b/tests/System/support/commands/db.mjs
index 733b0c455f29f..ff11970ff4f7c 100644
--- a/tests/System/support/commands/db.mjs
+++ b/tests/System/support/commands/db.mjs
@@ -339,7 +339,7 @@ Cypress.Commands.add('db_createField', (field) => {
language: '*',
created_time: '2023-01-01 20:00:00',
modified_time: '2023-01-01 20:00:00',
- params: '',
+ params: '{"searchindex":"0"}',
fieldparams: '',
};
@@ -631,38 +631,16 @@ Cypress.Commands.add('db_getUserId', () => {
* @returns integer
*/
Cypress.Commands.add('db_setInvalidTufRoot', () => {
- cy.task('queryDB', 'DELETE FROM #__tuf_metadata WHERE id = 1');
cy.task('queryDB', 'DELETE FROM #__updates WHERE update_site_id = 1');
- cy.task('queryDB', createInsertQuery(
- 'tuf_metadata',
- {
- id: 1,
- update_site_id: 1,
- root: JSON.stringify(invalidTufMetadata.root),
- targets: '',
- snapshot: '',
- timestamp: '',
- },
- ));
+ cy.task('queryDB', `UPDATE #__tuf_metadata SET root = '${JSON.stringify(invalidTufMetadata.root)}', targets = '', snapshot = '', timestamp = '' WHERE id = 1`);
});
/**
- * Inserts an invalid tuf metadata set
+ * Inserts a valid tuf metadata set
*
* @returns integer
*/
Cypress.Commands.add('db_setValidTufRoot', () => {
- cy.task('queryDB', 'DELETE FROM #__tuf_metadata WHERE id = 1');
cy.task('queryDB', 'DELETE FROM #__updates WHERE update_site_id = 1');
- cy.task('queryDB', createInsertQuery(
- 'tuf_metadata',
- {
- id: 1,
- update_site_id: 1,
- root: JSON.stringify(validTufMetadata.root),
- targets: '',
- snapshot: '',
- timestamp: '',
- },
- ));
+ cy.task('queryDB', `UPDATE #__tuf_metadata SET root = '${JSON.stringify(validTufMetadata.root)}', targets = '', snapshot = '', timestamp = '' WHERE id = 1`);
});
diff --git a/tests/System/support/index.js b/tests/System/support/index.js
index 68b3967f8d96f..56187a334d676 100644
--- a/tests/System/support/index.js
+++ b/tests/System/support/index.js
@@ -3,11 +3,6 @@ import('joomla-cypress');
before(() => {
cy.task('startMailServer');
- Cypress.on('uncaught:exception', (err, runnable) => {
- console.log(`err :${err}`);
- console.log(`runnable :${runnable}`);
- return false;
- });
});
afterEach(() => {