diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 00000000..174a22a2 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,3 @@ +/temp/joomla +/vendor +/node_modules diff --git a/.env.4.4.example b/.env.4.4.example new file mode 100644 index 00000000..1eefab92 --- /dev/null +++ b/.env.4.4.example @@ -0,0 +1,5 @@ +JOOMLA_VERSION=4.4-php8.1 +JOOMLA_DB_NAME=joomla + +MARIADB_VERSION=12 +JOOMLA_FRAMEWORK_VERSION=^2.0 \ No newline at end of file diff --git a/.env.5.4.example b/.env.5.4.example new file mode 100644 index 00000000..6769ac63 --- /dev/null +++ b/.env.5.4.example @@ -0,0 +1,5 @@ +JOOMLA_VERSION=5.4-php8.3 +JOOMLA_DB_NAME=joomla + +MARIADB_VERSION=12 +JOOMLA_FRAMEWORK_VERSION=^3.0 \ No newline at end of file diff --git a/.env.6.example b/.env.6.example new file mode 100644 index 00000000..221bd74d --- /dev/null +++ b/.env.6.example @@ -0,0 +1,5 @@ +JOOMLA_VERSION=6-php8.3 +JOOMLA_DB_NAME=joomla + +MARIADB_VERSION=12 +JOOMLA_FRAMEWORK_VERSION=^4.0 \ No newline at end of file diff --git a/.gitignore b/.gitignore index b0b53e6b..ca1b5c8f 100644 --- a/.gitignore +++ b/.gitignore @@ -17,4 +17,7 @@ /unerrnum /watch* /vendor -/node_modules \ No newline at end of file +/node_modules +/.phpunit.result.cache +/.phpunit.cache +/.env \ No newline at end of file diff --git a/.svnignore b/.svnignore deleted file mode 100644 index 84682692..00000000 --- a/.svnignore +++ /dev/null @@ -1,12 +0,0 @@ -*.zip -*.xcf -.workspace -.git -.gitignore -.directory -_Checklist.txt -_attachments.ppr -base_nums.py -base_nums.pickle -fixerrnums.py - diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000..5f8d4a48 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,5 @@ +{ + "cSpell.enableFiletypes": [ + "ini" + ] +} \ No newline at end of file diff --git a/FOR_DEVELOPERS.md b/FOR_DEVELOPERS.md index 8f574308..8b3d7812 100644 --- a/FOR_DEVELOPERS.md +++ b/FOR_DEVELOPERS.md @@ -2,6 +2,7 @@ - [How to update release](#how-to-update-release-version) - [How to update release package](#how-to-update-release-package) +- [Testing](#testing) ### How to update release version @@ -24,3 +25,22 @@ create a release with v as name upload the package file attachments-.zip into this release + +### Testing + +This project uses PHPUnit for testing. To run the tests: + +1. Install dependencies: `composer install` +2. Run all tests: `composer test` or `make test` +3. Run tests with coverage: `composer test-coverage` or `make test-coverage` + +The test suite includes: +- Unit tests for core functionality in `tests/unit/` +- Integration tests in `tests/integration/` (when available) +- Helper tests for the AttachmentsPermissions class and related functionality + +To run specific tests: +- `vendor/bin/phpunit tests/unit/Helper/` - Run all helper tests +- `vendor/bin/phpunit --testdox` - Run with human-readable output +- `vendor/bin/phpunit --coverage-html coverage/` - Run with coverage report + diff --git a/Makefile b/Makefile index c052382a..47554289 100644 --- a/Makefile +++ b/Makefile @@ -119,14 +119,19 @@ purge: @find . -name '*.bak' -exec rm {} \; @rm -f .tx/*.bak -unittests: +test: @echo @echo "Running unit tests..." - @cd test; phing -Droot=/var/www/test/joomla25/ unit_tests + @php vendor/bin/phpunit -c phpunit.xml @echo -unittests_show: unittests - @firefox test/coverage_result/index.html +test-coverage: + @echo + @echo "Running unit tests with coverage..." + @php vendor/bin/phpunit -c phpunit.xml --coverage-html ./tests/coverage-report + @echo + @echo "Coverage report generated in tests/coverage-report/index.html" + @echo manual: extensions_manual/manual.rst @echo "Creating Attachments Extension Manual" diff --git a/attachments_component/admin/src/Helper/AttachmentsImport.php b/attachments_component/admin/src/Helper/AttachmentsImport.php index 57ee6630..651015d7 100644 --- a/attachments_component/admin/src/Helper/AttachmentsImport.php +++ b/attachments_component/admin/src/Helper/AttachmentsImport.php @@ -134,12 +134,12 @@ public static function importAttachmentsFromCSVFile( $ids_ok = array(); } - iconv_set_encoding("internal_encoding", "UTF-8"); + iconv_set_encoding("default_charset", "UTF-8"); setlocale(LC_ALL, 'en_US.UTF-8'); while (!feof($f)) { // Read the next line - $adata = fgetcsv($f); + $adata = fgetcsv($f, escape: '\\'); $line_num += 1; $line_str = ' [LINE: ' . $line_num . '] '; @@ -169,10 +169,11 @@ public static function importAttachmentsFromCSVFile( if (!$apm->attachmentsPluginInstalled($parent_type)) { return Text::sprintf('ATTACH_ERROR_UNKNOWN_PARENT_TYPE_S', $parent_type) . $line_str . ' (ERR 87)'; } - $parent = $apm->getAttachmentsPlugin($parent_type); - + // Does the parent exist? if ($verify_parent) { + $parent = $apm->getAttachmentsPlugin($parent_type); + // Make sure a parent with the specified ID exists if (!$parent->parentExists($parent_id, $parent_entity)) { return Text::sprintf('ATTACH_ERROR_UNKNOWN_PARENT_ID_N', $parent_id) . $line_str . ' (ERR 88)'; @@ -317,7 +318,7 @@ protected static function parseFieldNames($file) { // Load the field names from the file $field = array(); - $header_line = fgetcsv($file); + $header_line = fgetcsv($file, escape: '\\'); // Strip of the leading BOM, if present $header_line = filter_var_array($header_line, FILTER_DEFAULT , FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH); for ($i = 0; $i < count($header_line); $i++) { diff --git a/attachments_component/admin/src/Helper/AttachmentsPermissions.php b/attachments_component/admin/src/Helper/AttachmentsPermissions.php index ef1d93cc..1881af4c 100644 --- a/attachments_component/admin/src/Helper/AttachmentsPermissions.php +++ b/attachments_component/admin/src/Helper/AttachmentsPermissions.php @@ -35,7 +35,7 @@ class AttachmentsPermissions /** * Get the actions * - * @return an array of which actions are permitted for this user + * @return Registry a registry object of which actions are permitted for this user */ public static function getActions($user_id = null) { @@ -65,9 +65,9 @@ public static function getActions($user_id = null) ); foreach ($actions as $action) { + /** @var \Joomla\CMS\User\User $user */ $result->set($action, $user->authorise($action, $assetName)); } - return $result; } diff --git a/attachments_component/admin/src/Helper/ImportFromCSV.php b/attachments_component/admin/src/Helper/ImportFromCSV.php index 7a67913a..bf8d4be5 100644 --- a/attachments_component/admin/src/Helper/ImportFromCSV.php +++ b/attachments_component/admin/src/Helper/ImportFromCSV.php @@ -199,7 +199,7 @@ public function readNextRecord() // Keep reading until we get a non-blank line while (!feof($this->file)) { // Read the line - $this->data = fgetcsv($this->file); + $this->data = fgetcsv($this->file, escape: '\\'); $this->line_number += 1; // Do we have data? @@ -290,7 +290,7 @@ protected function parseFieldNames($file) $bad_fields = array(); // Load the field names from the file - $header_line = fgetcsv($file); + $header_line = fgetcsv($file, escape: '\\'); $this->line_number += 1; for ($i = 0; $i < count($header_line); $i++) { $field_name = strtolower(trim($header_line[$i])); diff --git a/attachments_component/install.attachments.php b/attachments_component/install.attachments.php index 9e96b9b0..20ce1a08 100644 --- a/attachments_component/install.attachments.php +++ b/attachments_component/install.attachments.php @@ -200,27 +200,6 @@ public function preflight(string $type, InstallerAdapter $adapter): bool return false; } - // If there is debris from a previous failed attempt to install Attachments, delete it - // NOTE: Creating custom query because using JComponentHelper::isEnabled insists on - // printing a warning if the component is not installed - $db = Factory::getContainer()->get('DatabaseDriver'); - $query = $db->getQuery(true); - $query->select('extension_id AS id, enabled'); - $query->from('#__extensions'); - $query->where($query->qn('type') . ' = ' . $db->quote('component')); - $query->where($query->qn('element') . ' = ' . $db->quote('com_attachments')); - $db->setQuery($query); - if ($db->loadResult() == 0) { - if ( - Folder::exists(JPATH_ROOT . '/components/com_attachments') - or Folder::exists(JPATH_ROOT . '/administrator/components/com_attachments') - ) { - $msg = Text::_('ATTACH_ERROR_UINSTALL_OLD_VERSION'); - $app->enqueueMessage($msg, 'error'); - return false; - } - } - // Temporarily move the attachments directory out of the way to avoid conflicts $attachdir = JPATH_ROOT . '/attachments'; if (Folder::exists($attachdir)) { diff --git a/composer.json b/composer.json index fa5eb968..0248141b 100644 --- a/composer.json +++ b/composer.json @@ -1,12 +1,33 @@ { "require-dev": { - "phpunit/phpunit": "^10.3", - "phpcompatibility/php-compatibility": "^10.0@dev" + "phpunit/phpunit": "^10.0", + "phpcompatibility/php-compatibility": "^9.0", + "joomla/test": "^4.0", + "joomla/string": "^4.0", + "joomla/registry": "^4.0", + "joomla/database": "^4.0", + "joomla/application": "^4.0", + "joomla/di": "^4.0", + "joomla/session": "^4.0", + "joomla/language": "^4.0", + "joomla/filter": "^4.0", + "joomla/filesystem": "^4.1", + "joomla/input": "^4.0", + "joomla/uri": "^4.0", + "algo26-matthias/idna-convert": "^4.2" + }, + "autoload": { + "psr-4": { + "JMCameron\\Component\\Attachments\\Administrator\\": "attachments_component/admin/src/", + "JMCameron\\Component\\Attachments\\Site\\": "attachments_component/site/src/", + "JMCameron\\Plugin\\AttachmentsPluginFramework\\": "attachments_plugin_framework/src" + } }, "autoload-dev": { - "Tests\\": "tests", - "JMCameron\\Component\\Attachments\\Administrator\\": "attachments_component/admin/src/", - "JMCameron\\Component\\Attachments\\Site\\": "attachments_component/site/src/" + "psr-4": { + "Tests\\": "tests/", + "Joomla\\CMS\\": "temp/joomla/libraries/src/" + } }, "config": { "allow-plugins": { @@ -14,6 +35,8 @@ } }, "scripts": { - "check-compatibility": "phpcs -p . --standard=PHPCompatibility --runtime-set testVersion 7.4- --ignore=*/vendor/*,temp/*" + "check-compatibility": "phpcs -p . --standard=PHPCompatibility --runtime-set testVersion 7.4- --ignore=*/vendor/*,temp/*", + "test": "phpunit -c ./phpunit.xml || pwd", + "test-coverage": "phpunit -c phpunit.xml --coverage-html ./tests/coverage-report" } } diff --git a/composer.lock b/composer.lock index 4106a965..7694c774 100644 --- a/composer.lock +++ b/composer.lock @@ -4,99 +4,991 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "67e137657ce526e75ee7b279e377073d", + "content-hash": "73f1f5b2a87cc68f89672f5df4dc6534", "packages": [], "packages-dev": [ { - "name": "dealerdirect/phpcodesniffer-composer-installer", - "version": "v1.0.0", + "name": "algo26-matthias/idna-convert", + "version": "v4.2.1", "source": { "type": "git", - "url": "https://github.com/PHPCSStandards/composer-installer.git", - "reference": "4be43904336affa5c2f70744a348312336afd0da" + "url": "https://github.com/algo26-matthias/idna-convert.git", + "reference": "bc263b9d9dd6bf82845cda763a4abea3481d0f83" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHPCSStandards/composer-installer/zipball/4be43904336affa5c2f70744a348312336afd0da", - "reference": "4be43904336affa5c2f70744a348312336afd0da", + "url": "https://api.github.com/repos/algo26-matthias/idna-convert/zipball/bc263b9d9dd6bf82845cda763a4abea3481d0f83", + "reference": "bc263b9d9dd6bf82845cda763a4abea3481d0f83", "shasum": "" }, "require": { - "composer-plugin-api": "^1.0 || ^2.0", - "php": ">=5.4", - "squizlabs/php_codesniffer": "^2.0 || ^3.1.0 || ^4.0" + "ext-pcre": "*", + "jakeasmith/http_build_url": "^1", + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^9 || ^10" + }, + "suggest": { + "ext-iconv": "Install ext/iconv for using input / output other than UTF-8 or ISO-8859-1", + "ext-mbstring": "Install ext/mbstring for using input / output other than UTF-8 or ISO-8859-1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Algo26\\IdnaConvert\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-2.1+" + ], + "authors": [ + { + "name": "Matthias Sommerfeld", + "email": "matthias.sommerfeld@algo26.de", + "role": "Developer" + } + ], + "description": "A library for encoding and decoding internationalized domain names", + "homepage": "https://github.com/algo26-matthias/idna-convert", + "keywords": [ + "idn", + "idna", + "php" + ], + "support": { + "issues": "https://github.com/algo26-matthias/idna-convert/issues", + "source": "https://github.com/algo26-matthias/idna-convert/tree/v4.2.1" + }, + "time": "2025-08-11T09:03:12+00:00" + }, + { + "name": "jakeasmith/http_build_url", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/jakeasmith/http_build_url.git", + "reference": "93c273e77cb1edead0cf8bcf8cd2003428e74e37" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/jakeasmith/http_build_url/zipball/93c273e77cb1edead0cf8bcf8cd2003428e74e37", + "reference": "93c273e77cb1edead0cf8bcf8cd2003428e74e37", + "shasum": "" + }, + "type": "library", + "autoload": { + "files": [ + "src/http_build_url.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jake A. Smith", + "email": "theman@jakeasmith.com" + } + ], + "description": "Provides functionality for http_build_url() to environments without pecl_http.", + "support": { + "issues": "https://github.com/jakeasmith/http_build_url/issues", + "source": "https://github.com/jakeasmith/http_build_url" + }, + "time": "2017-05-01T15:36:40+00:00" + }, + { + "name": "joomla/application", + "version": "4.0.0", + "source": { + "type": "git", + "url": "https://github.com/joomla-framework/application.git", + "reference": "878d1f4a2dc03b6197d0e6cfb4a969ec06a3314d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/joomla-framework/application/zipball/878d1f4a2dc03b6197d0e6cfb4a969ec06a3314d", + "reference": "878d1f4a2dc03b6197d0e6cfb4a969ec06a3314d", + "shasum": "" + }, + "require": { + "joomla/event": "^4.0", + "joomla/registry": "^4.0", + "laminas/laminas-diactoros": "^3.6.0", + "php": "^8.3.0", + "psr/http-message": "^2.0", + "psr/log": "^1.0|^2.0|^3.0", + "symfony/deprecation-contracts": "^2|^3" + }, + "require-dev": { + "ext-json": "*", + "joomla/controller": "^4.0", + "joomla/di": "^4.0", + "joomla/input": "^4.0", + "joomla/router": "^4.0", + "joomla/session": "^4.0", + "joomla/test": "^4.0", + "joomla/uri": "^4.0", + "phpstan/phpstan": "^2.1.17", + "phpstan/phpstan-deprecation-rules": "^2.0.3", + "phpunit/phpunit": "^10.0", + "squizlabs/php_codesniffer": "~3.10.2", + "symfony/phpunit-bridge": "^7.0" + }, + "suggest": { + "ext-json": "To use JSON format, ext-json is required", + "joomla/controller": "^4.0 To support resolving ControllerInterface objects in ControllerResolverInterface, install joomla/controller", + "joomla/input": "^4.0 To use WebApplicationInterface, install joomla/input", + "joomla/router": "^4.0 To use WebApplication or ControllerResolverInterface implementations, install joomla/router", + "joomla/session": "^4.0 To use SessionAwareWebApplicationInterface, install joomla/session", + "joomla/uri": "^4.0 To use AbstractWebApplication, install joomla/uri", + "psr/container": "^2.0 To use the ContainerControllerResolver, install any PSR-11 compatible container" + }, + "type": "library", + "autoload": { + "psr-4": { + "Joomla\\Application\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "The Joomla! Project", + "homepage": "https://framework.joomla.org/" + } + ], + "description": "Joomla Application Package", + "homepage": "https://github.com/joomla-framework/application", + "keywords": [ + "application", + "framework", + "joomla", + "joomla-package" + ], + "support": { + "docs": "https://developer.joomla.org/framework/documentation.html", + "forum": "https://groups.google.com/g/joomla-dev-framework", + "issues": "https://github.com/joomla-framework/application/issues", + "source": "https://github.com/joomla-framework/application", + "wiki": "https://github.com/joomla-framework/application/wiki" + }, + "funding": [ + { + "url": "https://community.joomla.org/sponsorship-campaigns.html", + "type": "custom" + }, + { + "url": "https://github.com/sponsors/joomla", + "type": "github" + } + ], + "time": "2025-07-24T09:55:44+00:00" + }, + { + "name": "joomla/database", + "version": "4.0.0", + "source": { + "type": "git", + "url": "https://github.com/joomla-framework/database.git", + "reference": "2e744e7959368891fe52ccb35790e201251f6f39" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/joomla-framework/database/zipball/2e744e7959368891fe52ccb35790e201251f6f39", + "reference": "2e744e7959368891fe52ccb35790e201251f6f39", + "shasum": "" + }, + "require": { + "joomla/event": "^4.0", + "php": "^8.3.0", + "symfony/deprecation-contracts": "^2|^3" + }, + "require-dev": { + "colinodell/psr-testlogger": "^1.3.0", + "joomla/archive": "^4.0", + "joomla/console": "^4.0", + "joomla/di": "^4.0", + "joomla/filesystem": "^4.0", + "joomla/registry": "^4.0", + "joomla/test": "^4.0", + "phpstan/phpstan": "^2.1.17", + "phpstan/phpstan-deprecation-rules": "^2.0.3", + "phpunit/phpunit": "^12.0", + "psr/log": "^3.0.2", + "squizlabs/php_codesniffer": "^3.10.2", + "symfony/phpunit-bridge": "^8.0" + }, + "suggest": { + "ext-mysqli": "To connect to a MySQL database via MySQLi", + "ext-pdo": "To connect to a MySQL, PostgreSQL, or SQLite database via PDO", + "ext-sqlsrv": "To connect to a SQL Server database", + "joomla/archive": "To use the ExportCommand class, install joomla/archive", + "joomla/console": "To use the ExportCommand and ImportCommand classes, install joomla/console", + "joomla/di": "To use the Database ServiceProviderInterface objects, install joomla/di.", + "joomla/filesystem": "To use the ExportCommand and ImportCommand classes, install joomla/filesystem", + "joomla/registry": "To use the Database ServiceProviderInterface objects, install joomla/registry.", + "psr/log": "To use the LoggingMonitor, install psr/log." + }, + "type": "joomla-package", + "autoload": { + "psr-4": { + "Joomla\\Database\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "description": "Joomla Database Package", + "homepage": "https://github.com/joomla-framework/database", + "keywords": [ + "database", + "framework", + "joomla" + ], + "support": { + "issues": "https://github.com/joomla-framework/database/issues", + "source": "https://github.com/joomla-framework/database/tree/4.0.0" + }, + "time": "2025-07-24T09:46:18+00:00" + }, + { + "name": "joomla/di", + "version": "4.0.0", + "source": { + "type": "git", + "url": "https://github.com/joomla-framework/di.git", + "reference": "e8511111e2b5b239f75116f9ff75b43c18809868" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/joomla-framework/di/zipball/e8511111e2b5b239f75116f9ff75b43c18809868", + "reference": "e8511111e2b5b239f75116f9ff75b43c18809868", + "shasum": "" + }, + "require": { + "php": "^8.3.0", + "psr/container": "^2.0", + "symfony/deprecation-contracts": "^2|^3" + }, + "provide": { + "psr/container-implementation": "~1.0" + }, + "require-dev": { + "joomla/test": "^4.0", + "phpstan/phpstan": "^2.1.17", + "phpstan/phpstan-deprecation-rules": "^2.0.3", + "phpunit/phpunit": "^12.2.6", + "squizlabs/php_codesniffer": "~3.7.2" + }, + "type": "joomla-package", + "autoload": { + "psr-4": { + "Joomla\\DI\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "description": "Joomla DI Package", + "homepage": "https://github.com/joomla-framework/di", + "keywords": [ + "container", + "dependency injection", + "di", + "framework", + "ioc", + "joomla" + ], + "support": { + "issues": "https://github.com/joomla-framework/di/issues", + "source": "https://github.com/joomla-framework/di/tree/4.0.0" + }, + "time": "2025-07-24T07:51:22+00:00" + }, + { + "name": "joomla/event", + "version": "4.0.0", + "source": { + "type": "git", + "url": "https://github.com/joomla-framework/event.git", + "reference": "4bbbfb0a3444cb3e3f9abd57d623caa06e9207b5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/joomla-framework/event/zipball/4bbbfb0a3444cb3e3f9abd57d623caa06e9207b5", + "reference": "4bbbfb0a3444cb3e3f9abd57d623caa06e9207b5", + "shasum": "" + }, + "require": { + "php": "^8.3.0", + "symfony/deprecation-contracts": "^2|^3" + }, + "require-dev": { + "joomla/console": "^4.0", + "phpstan/phpstan": "^2.1.17", + "phpstan/phpstan-deprecation-rules": "^2.0.3", + "phpunit/phpunit": "^12.2.7", + "psr/container": "^2.0", + "squizlabs/php_codesniffer": "^3.7.2" + }, + "suggest": { + "joomla/console": "If you want to use the DebugEventDispatcherCommand class, please install joomla/console", + "psr/container-implementation": "If you want to use the LazyServiceEventListener class, please install a PSR-11 container" + }, + "type": "joomla-package", + "autoload": { + "psr-4": { + "Joomla\\Event\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "description": "Joomla Event Package", + "homepage": "https://github.com/joomla-framework/event", + "keywords": [ + "event", + "framework", + "joomla" + ], + "support": { + "issues": "https://github.com/joomla-framework/event/issues", + "source": "https://github.com/joomla-framework/event/tree/4.0.0" + }, + "time": "2025-07-24T09:34:33+00:00" + }, + { + "name": "joomla/filesystem", + "version": "4.1.0", + "source": { + "type": "git", + "url": "https://github.com/joomla-framework/filesystem.git", + "reference": "cfcda2935605f14f396ccda7535f4417e27af868" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/joomla-framework/filesystem/zipball/cfcda2935605f14f396ccda7535f4417e27af868", + "reference": "cfcda2935605f14f396ccda7535f4417e27af868", + "shasum": "" + }, + "require": { + "php": "^8.3.0" + }, + "require-dev": { + "joomla/test": "^4.0", + "mikey179/vfsstream": "^1.6.11", + "phpstan/phpstan": "^2.1.17", + "phpstan/phpstan-deprecation-rules": "^2.0.3", + "phpunit/phpunit": "^12.2.7", + "squizlabs/php_codesniffer": "^3.13.2" + }, + "type": "joomla-package", + "autoload": { + "psr-4": { + "Joomla\\Filesystem\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "description": "Joomla Filesystem Package", + "homepage": "https://github.com/joomla/joomla-framework-filesystem", + "keywords": [ + "filesystem", + "framework", + "joomla" + ], + "support": { + "issues": "https://github.com/joomla-framework/filesystem/issues", + "source": "https://github.com/joomla-framework/filesystem/tree/4.1.0" + }, + "time": "2025-08-27T18:49:28+00:00" + }, + { + "name": "joomla/filter", + "version": "4.0.1", + "source": { + "type": "git", + "url": "https://github.com/joomla-framework/filter.git", + "reference": "fcde280785f188e93530f7da68102f7dd8f9f723" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/joomla-framework/filter/zipball/fcde280785f188e93530f7da68102f7dd8f9f723", + "reference": "fcde280785f188e93530f7da68102f7dd8f9f723", + "shasum": "" + }, + "require": { + "joomla/string": "^4.0", + "php": "^8.3.0" + }, + "require-dev": { + "joomla/language": "^4.0", + "phpstan/phpstan": "^2.1.17", + "phpstan/phpstan-deprecation-rules": "^2.0.3", + "phpunit/phpunit": "^12.2.7", + "squizlabs/php_codesniffer": "^3.7.2" + }, + "suggest": { + "joomla/language": "Required only if you want to use `OutputFilter::stringURLSafe`." + }, + "type": "joomla-package", + "autoload": { + "psr-4": { + "Joomla\\Filter\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "description": "Joomla Filter Package", + "homepage": "https://github.com/joomla-framework/filter", + "keywords": [ + "filter", + "framework", + "joomla" + ], + "support": { + "issues": "https://github.com/joomla-framework/filter/issues", + "source": "https://github.com/joomla-framework/filter/tree/4.0.1" + }, + "time": "2025-09-30T15:42:06+00:00" + }, + { + "name": "joomla/input", + "version": "4.0.0", + "source": { + "type": "git", + "url": "https://github.com/joomla-framework/input.git", + "reference": "f366f97b143bd9d15f57dad74b21f72ac99d89ec" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/joomla-framework/input/zipball/f366f97b143bd9d15f57dad74b21f72ac99d89ec", + "reference": "f366f97b143bd9d15f57dad74b21f72ac99d89ec", + "shasum": "" + }, + "require": { + "joomla/filter": "^4.0", + "php": "^8.3.0", + "symfony/deprecation-contracts": "^2|^3" + }, + "require-dev": { + "joomla/test": "^4.0", + "phpstan/phpstan": "2.1.17", + "phpstan/phpstan-deprecation-rules": "2.0.3", + "phpunit/phpunit": "^12.0", + "squizlabs/php_codesniffer": "^3.10.2" + }, + "type": "joomla-package", + "autoload": { + "psr-4": { + "Joomla\\Input\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "description": "Joomla Input Package", + "homepage": "https://github.com/joomla-framework/input", + "keywords": [ + "framework", + "input", + "joomla" + ], + "support": { + "issues": "https://github.com/joomla-framework/input/issues", + "source": "https://github.com/joomla-framework/input/tree/4.0.0" + }, + "time": "2025-07-23T19:52:44+00:00" + }, + { + "name": "joomla/language", + "version": "4.0.0", + "source": { + "type": "git", + "url": "https://github.com/joomla-framework/language.git", + "reference": "371507d84103e9e7b48253e72b3bcc8d91cf5a63" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/joomla-framework/language/zipball/371507d84103e9e7b48253e72b3bcc8d91cf5a63", + "reference": "371507d84103e9e7b48253e72b3bcc8d91cf5a63", + "shasum": "" + }, + "require": { + "ext-xml": "*", + "joomla/string": "^4.0", + "php": "^8.3.0", + "symfony/deprecation-contracts": "^2|^3" + }, + "require-dev": { + "joomla/di": "^4.0", + "joomla/registry": "^4.0", + "joomla/test": "^4.0", + "phpstan/phpstan": "^2.1.17", + "phpstan/phpstan-deprecation-rules": "^2.0.3", + "phpunit/phpunit": "^12.2.6", + "squizlabs/php_codesniffer": "^3.7.2" + }, + "suggest": { + "joomla/di": "To use the Language ServiceProviderInterface objects, install joomla/di." + }, + "type": "joomla-package", + "autoload": { + "psr-4": { + "Joomla\\Language\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "description": "Joomla Language Package", + "homepage": "https://github.com/joomla-framework/language", + "keywords": [ + "framework", + "joomla", + "language" + ], + "support": { + "issues": "https://github.com/joomla-framework/language/issues", + "source": "https://github.com/joomla-framework/language/tree/4.0.0" + }, + "time": "2025-07-23T19:48:37+00:00" + }, + { + "name": "joomla/registry", + "version": "4.0.0", + "source": { + "type": "git", + "url": "https://github.com/joomla-framework/registry.git", + "reference": "5692d8423c9b568627df701e9fd505eae5ea8f72" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/joomla-framework/registry/zipball/5692d8423c9b568627df701e9fd505eae5ea8f72", + "reference": "5692d8423c9b568627df701e9fd505eae5ea8f72", + "shasum": "" + }, + "require": { + "joomla/utilities": "^4.0", + "php": "^8.3.0" }, "require-dev": { - "composer/composer": "*", - "ext-json": "*", - "ext-zip": "*", - "php-parallel-lint/php-parallel-lint": "^1.3.1", - "phpcompatibility/php-compatibility": "^9.0", - "yoast/phpunit-polyfills": "^1.0" + "phpstan/phpstan": "^2.1.17", + "phpstan/phpstan-deprecation-rules": "^2.0.3", + "phpunit/phpunit": "^12.2.6", + "squizlabs/php_codesniffer": "^3.7.2", + "symfony/yaml": "^7.3" }, - "type": "composer-plugin", - "extra": { - "class": "PHPCSStandards\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\Plugin" + "suggest": { + "ext-json": "ext-json is needed for JSON support", + "ext-simplexml": "ext-simplexml is needed for XML support", + "symfony/yaml": "Install symfony/yaml if you require YAML support." }, + "type": "joomla-package", "autoload": { "psr-4": { - "PHPCSStandards\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\": "src/" + "Joomla\\Registry\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "GPL-2.0-or-later" ], - "authors": [ - { - "name": "Franck Nijhof", - "email": "franck.nijhof@dealerdirect.com", - "homepage": "http://www.frenck.nl", - "role": "Developer / IT Manager" - }, - { - "name": "Contributors", - "homepage": "https://github.com/PHPCSStandards/composer-installer/graphs/contributors" + "description": "Joomla Registry Package", + "homepage": "https://github.com/joomla-framework/registry", + "keywords": [ + "framework", + "joomla", + "registry" + ], + "support": { + "issues": "https://github.com/joomla-framework/registry/issues", + "source": "https://github.com/joomla-framework/registry/tree/4.0.0" + }, + "time": "2025-07-23T19:26:22+00:00" + }, + { + "name": "joomla/session", + "version": "4.0.0", + "source": { + "type": "git", + "url": "https://github.com/joomla-framework/session.git", + "reference": "3d1d8bc093d659053c46eec4962bef4c1e9e0206" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/joomla-framework/session/zipball/3d1d8bc093d659053c46eec4962bef4c1e9e0206", + "reference": "3d1d8bc093d659053c46eec4962bef4c1e9e0206", + "shasum": "" + }, + "require": { + "php": "^8.3.0", + "symfony/deprecation-contracts": "^2|^3" + }, + "require-dev": { + "joomla/console": "^4.0", + "joomla/database": "^4.0", + "joomla/event": "^4.0", + "joomla/input": "^4.0", + "joomla/test": "^4.0", + "joomla/utilities": "^4.0", + "phpstan/phpstan": "2.1.17", + "phpstan/phpstan-deprecation-rules": "2.0.3", + "phpunit/phpunit": "^12.0", + "squizlabs/php_codesniffer": "^3.10.2" + }, + "suggest": { + "ext-apcu": "To use APCu cache as a session handler", + "ext-memcached": "To use a Memcached server as a session handler", + "ext-redis": "To use a Redis server as a session handler", + "ext-session": "To use the Joomla\\Session\\Storage\\NativeStorage storage class.", + "ext-wincache": "To use WinCache as a session handler", + "joomla/console": "Install joomla/console if you want to use the CreateSessionTableCommand class.", + "joomla/database": "Install joomla/database if you want to use a database connection managed with Joomla\\Database\\DatabaseDriver as a session handler.", + "joomla/event": "The joomla/event package is required to use Joomla\\Session\\Session.", + "joomla/input": "The joomla/input package is required to use Address and Forwarded session validators." + }, + "type": "joomla-package", + "autoload": { + "psr-4": { + "Joomla\\Session\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "description": "Joomla Session Package", + "homepage": "https://github.com/joomla-framework/session", + "keywords": [ + "framework", + "joomla", + "session" + ], + "support": { + "issues": "https://github.com/joomla-framework/session/issues", + "source": "https://github.com/joomla-framework/session/tree/4.0.0" + }, + "time": "2025-07-23T19:16:20+00:00" + }, + { + "name": "joomla/string", + "version": "4.0.0", + "source": { + "type": "git", + "url": "https://github.com/joomla-framework/string.git", + "reference": "da2329e05f1f5fc98b709f8638f279513bcd1108" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/joomla-framework/string/zipball/da2329e05f1f5fc98b709f8638f279513bcd1108", + "reference": "da2329e05f1f5fc98b709f8638f279513bcd1108", + "shasum": "" + }, + "require": { + "php": "^8.3.0", + "symfony/deprecation-contracts": "^2|^3", + "symfony/polyfill-mbstring": "^1.31.0" + }, + "require-dev": { + "doctrine/inflector": "^2.0.10", + "joomla/test": "^4.0", + "phpstan/phpstan": "2.1.17", + "phpstan/phpstan-deprecation-rules": "2.0.3", + "phpunit/phpunit": "^12.2.6", + "squizlabs/php_codesniffer": "^3.7.2" + }, + "suggest": { + "doctrine/inflector": "To use the string inflector", + "ext-mbstring": "For improved processing" + }, + "type": "joomla-package", + "autoload": { + "psr-4": { + "Joomla\\String\\": "src/" } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" ], - "description": "PHP_CodeSniffer Standards Composer Installer Plugin", - "homepage": "http://www.dealerdirect.com", + "description": "Joomla String Package", + "homepage": "https://github.com/joomla-framework/string", "keywords": [ - "PHPCodeSniffer", - "PHP_CodeSniffer", - "code quality", - "codesniffer", - "composer", - "installer", - "phpcbf", - "phpcs", - "plugin", - "qa", - "quality", - "standard", - "standards", - "style guide", - "stylecheck", - "tests" + "framework", + "joomla", + "string" + ], + "support": { + "issues": "https://github.com/joomla-framework/string/issues", + "source": "https://github.com/joomla-framework/string/tree/4.0.0" + }, + "time": "2025-07-23T18:42:26+00:00" + }, + { + "name": "joomla/test", + "version": "4.0.1", + "source": { + "type": "git", + "url": "https://github.com/joomla-framework/test.git", + "reference": "cfc3ca98f363dc76c4e3cf7a0cd089eeb93e2480" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/joomla-framework/test/zipball/cfc3ca98f363dc76c4e3cf7a0cd089eeb93e2480", + "reference": "cfc3ca98f363dc76c4e3cf7a0cd089eeb93e2480", + "shasum": "" + }, + "require": { + "php": "^8.3.0" + }, + "require-dev": { + "joomla/database": "^4.0", + "phpstan/phpstan": "2.1.17", + "phpstan/phpstan-deprecation-rules": "2.0.3", + "phpunit/phpunit": "^12.0", + "squizlabs/php_codesniffer": "^3.10.2" + }, + "suggest": { + "joomla/database": "To use the database test case, install joomla/database", + "phpunit/phpunit": "To use the database test case, install phpunit/phpunit" + }, + "type": "joomla-package", + "autoload": { + "psr-4": { + "Joomla\\Test\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "description": "Joomla Test Helper Package", + "homepage": "https://github.com/joomla-framework/test", + "keywords": [ + "framework", + "joomla", + "phpunit", + "reflection", + "unit test" + ], + "support": { + "issues": "https://github.com/joomla-framework/test/issues", + "source": "https://github.com/joomla-framework/test/tree/4.0.1" + }, + "time": "2025-10-17T08:21:47+00:00" + }, + { + "name": "joomla/uri", + "version": "4.0.0", + "source": { + "type": "git", + "url": "https://github.com/joomla-framework/uri.git", + "reference": "9fa4fac811bf63e830d46d83031c353cf2765bcd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/joomla-framework/uri/zipball/9fa4fac811bf63e830d46d83031c353cf2765bcd", + "reference": "9fa4fac811bf63e830d46d83031c353cf2765bcd", + "shasum": "" + }, + "require": { + "php": "^8.3.0" + }, + "require-dev": { + "phpstan/phpstan": "^2.1.17", + "phpstan/phpstan-deprecation-rules": "^2.0.3", + "phpunit/phpunit": "^12.2.6", + "squizlabs/php_codesniffer": "^3.7.2" + }, + "suggest": { + "ext-mbstring": "Used to speed up url parsing" + }, + "type": "joomla-package", + "autoload": { + "psr-4": { + "Joomla\\Uri\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "description": "Joomla Uri Package", + "homepage": "https://github.com/joomla-framework/uri", + "keywords": [ + "framework", + "joomla", + "uri" + ], + "support": { + "issues": "https://github.com/joomla-framework/uri/issues", + "source": "https://github.com/joomla-framework/uri/tree/4.0.0" + }, + "time": "2025-07-23T19:02:38+00:00" + }, + { + "name": "joomla/utilities", + "version": "4.0.0", + "source": { + "type": "git", + "url": "https://github.com/joomla-framework/utilities.git", + "reference": "5f234527f7dad7111830b091aef52787c3c07cc8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/joomla-framework/utilities/zipball/5f234527f7dad7111830b091aef52787c3c07cc8", + "reference": "5f234527f7dad7111830b091aef52787c3c07cc8", + "shasum": "" + }, + "require": { + "joomla/string": "^4.0", + "php": "^8.3.0" + }, + "require-dev": { + "phpstan/phpstan": "^2.1.17", + "phpstan/phpstan-deprecation-rules": "^2.0.3", + "phpunit/phpunit": "^12.2.6", + "squizlabs/php_codesniffer": "^3.7.2" + }, + "type": "joomla-package", + "autoload": { + "psr-4": { + "Joomla\\Utilities\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "description": "Joomla Utilities Package", + "homepage": "https://github.com/joomla-framework/utilities", + "keywords": [ + "framework", + "joomla", + "utilities" + ], + "support": { + "issues": "https://github.com/joomla-framework/utilities/issues", + "source": "https://github.com/joomla-framework/utilities/tree/4.0.0" + }, + "time": "2025-07-23T18:52:12+00:00" + }, + { + "name": "laminas/laminas-diactoros", + "version": "3.8.0", + "source": { + "type": "git", + "url": "https://github.com/laminas/laminas-diactoros.git", + "reference": "60c182916b2749480895601649563970f3f12ec4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laminas/laminas-diactoros/zipball/60c182916b2749480895601649563970f3f12ec4", + "reference": "60c182916b2749480895601649563970f3f12ec4", + "shasum": "" + }, + "require": { + "php": "~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0", + "psr/http-factory": "^1.1", + "psr/http-message": "^1.1 || ^2.0" + }, + "conflict": { + "amphp/amp": "<2.6.4" + }, + "provide": { + "psr/http-factory-implementation": "^1.0", + "psr/http-message-implementation": "^1.1 || ^2.0" + }, + "require-dev": { + "ext-curl": "*", + "ext-dom": "*", + "ext-gd": "*", + "ext-libxml": "*", + "http-interop/http-factory-tests": "^2.2.0", + "laminas/laminas-coding-standard": "~3.1.0", + "php-http/psr7-integration-tests": "^1.4.0", + "phpunit/phpunit": "^10.5.36", + "psalm/plugin-phpunit": "^0.19.5", + "vimeo/psalm": "^6.13" + }, + "type": "library", + "extra": { + "laminas": { + "module": "Laminas\\Diactoros", + "config-provider": "Laminas\\Diactoros\\ConfigProvider" + } + }, + "autoload": { + "files": [ + "src/functions/create_uploaded_file.php", + "src/functions/marshal_headers_from_sapi.php", + "src/functions/marshal_method_from_sapi.php", + "src/functions/marshal_protocol_version_from_sapi.php", + "src/functions/normalize_server.php", + "src/functions/normalize_uploaded_files.php", + "src/functions/parse_cookie_header.php" + ], + "psr-4": { + "Laminas\\Diactoros\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "PSR HTTP Message implementations", + "homepage": "https://laminas.dev", + "keywords": [ + "http", + "laminas", + "psr", + "psr-17", + "psr-7" ], "support": { - "issues": "https://github.com/PHPCSStandards/composer-installer/issues", - "source": "https://github.com/PHPCSStandards/composer-installer" + "chat": "https://laminas.dev/chat", + "docs": "https://docs.laminas.dev/laminas-diactoros/", + "forum": "https://discourse.laminas.dev", + "issues": "https://github.com/laminas/laminas-diactoros/issues", + "rss": "https://github.com/laminas/laminas-diactoros/releases.atom", + "source": "https://github.com/laminas/laminas-diactoros" }, - "time": "2023-01-05T11:28:13+00:00" + "funding": [ + { + "url": "https://funding.communitybridge.org/projects/laminas-project", + "type": "community_bridge" + } + ], + "time": "2025-10-12T15:31:36+00:00" }, { "name": "myclabs/deep-copy", - "version": "1.11.1", + "version": "1.13.4", "source": { "type": "git", "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c" + "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", - "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/07d290f0c47959fd5eed98c95ee5602db07e0b6a", + "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a", "shasum": "" }, "require": { @@ -104,11 +996,12 @@ }, "conflict": { "doctrine/collections": "<1.6.8", - "doctrine/common": "<2.13.3 || >=3,<3.2.2" + "doctrine/common": "<2.13.3 || >=3 <3.2.2" }, "require-dev": { "doctrine/collections": "^1.6.8", "doctrine/common": "^2.13.3 || ^3.2.2", + "phpspec/prophecy": "^1.10", "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" }, "type": "library", @@ -134,7 +1027,7 @@ ], "support": { "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.11.1" + "source": "https://github.com/myclabs/DeepCopy/tree/1.13.4" }, "funding": [ { @@ -142,29 +1035,31 @@ "type": "tidelift" } ], - "time": "2023-03-08T13:26:56+00:00" + "time": "2025-08-01T08:46:24+00:00" }, { "name": "nikic/php-parser", - "version": "v4.17.1", + "version": "v5.6.2", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d" + "reference": "3a454ca033b9e06b63282ce19562e892747449bb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d", - "reference": "a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/3a454ca033b9e06b63282ce19562e892747449bb", + "reference": "3a454ca033b9e06b63282ce19562e892747449bb", "shasum": "" }, "require": { + "ext-ctype": "*", + "ext-json": "*", "ext-tokenizer": "*", - "php": ">=7.0" + "php": ">=7.4" }, "require-dev": { "ircmaxell/php-yacc": "^0.0.7", - "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0" + "phpunit/phpunit": "^9.0" }, "bin": [ "bin/php-parse" @@ -172,7 +1067,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.9-dev" + "dev-master": "5.x-dev" } }, "autoload": { @@ -196,26 +1091,27 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.17.1" + "source": "https://github.com/nikic/PHP-Parser/tree/v5.6.2" }, - "time": "2023-08-13T19:53:39+00:00" + "time": "2025-10-21T19:32:17+00:00" }, { "name": "phar-io/manifest", - "version": "2.0.3", + "version": "2.0.4", "source": { "type": "git", "url": "https://github.com/phar-io/manifest.git", - "reference": "97803eca37d319dfa7826cc2437fc020857acb53" + "reference": "54750ef60c58e43759730615a392c31c80e23176" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phar-io/manifest/zipball/97803eca37d319dfa7826cc2437fc020857acb53", - "reference": "97803eca37d319dfa7826cc2437fc020857acb53", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176", + "reference": "54750ef60c58e43759730615a392c31c80e23176", "shasum": "" }, "require": { "ext-dom": "*", + "ext-libxml": "*", "ext-phar": "*", "ext-xmlwriter": "*", "phar-io/version": "^3.0.1", @@ -256,9 +1152,15 @@ "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", "support": { "issues": "https://github.com/phar-io/manifest/issues", - "source": "https://github.com/phar-io/manifest/tree/2.0.3" + "source": "https://github.com/phar-io/manifest/tree/2.0.4" }, - "time": "2021-07-20T11:28:43+00:00" + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2024-03-03T12:33:53+00:00" }, { "name": "phar-io/version", @@ -296,140 +1198,60 @@ { "name": "Sebastian Heuer", "email": "sebastian@phpeople.de", - "role": "Developer" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "Developer" - } - ], - "description": "Library for handling version information and constraints", - "support": { - "issues": "https://github.com/phar-io/version/issues", - "source": "https://github.com/phar-io/version/tree/3.2.1" - }, - "time": "2022-02-21T01:04:05+00:00" - }, - { - "name": "phpcompatibility/php-compatibility", - "version": "dev-develop", - "source": { - "type": "git", - "url": "https://github.com/PHPCompatibility/PHPCompatibility.git", - "reference": "34a67f7eb4ec715df26d90429ea8cce88e0b38ff" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/PHPCompatibility/PHPCompatibility/zipball/34a67f7eb4ec715df26d90429ea8cce88e0b38ff", - "reference": "34a67f7eb4ec715df26d90429ea8cce88e0b38ff", - "shasum": "" - }, - "require": { - "php": ">=5.4", - "phpcsstandards/phpcsutils": "^1.0.5", - "squizlabs/php_codesniffer": "^3.7.1" - }, - "replace": { - "wimg/php-compatibility": "*" - }, - "require-dev": { - "php-parallel-lint/php-console-highlighter": "^1.0.0", - "php-parallel-lint/php-parallel-lint": "^1.3.2", - "phpcsstandards/phpcsdevcs": "^1.1.3", - "phpcsstandards/phpcsdevtools": "^1.2.0", - "phpunit/phpunit": "^4.8.36 || ^5.7.21 || ^6.0 || ^7.0 || ^8.0 || ^9.3.4 || ^10.1.0", - "yoast/phpunit-polyfills": "^1.0.5 || ^2.0.0" - }, - "suggest": { - "roave/security-advisories": "dev-master || Helps prevent installing dependencies with known security issues." - }, - "default-branch": true, - "type": "phpcodesniffer-standard", - "extra": { - "branch-alias": { - "dev-master": "9.x-dev", - "dev-develop": "10.x-dev" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "LGPL-3.0-or-later" - ], - "authors": [ - { - "name": "Wim Godden", - "homepage": "https://github.com/wimg", - "role": "lead" - }, - { - "name": "Juliette Reinders Folmer", - "homepage": "https://github.com/jrfnl", - "role": "lead" - }, - { - "name": "Contributors", - "homepage": "https://github.com/PHPCompatibility/PHPCompatibility/graphs/contributors" - } - ], - "description": "A set of sniffs for PHP_CodeSniffer that checks for PHP cross-version compatibility.", - "homepage": "http://techblog.wimgodden.be/tag/codesniffer/", - "keywords": [ - "compatibility", - "phpcs", - "standards", - "static analysis" + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } ], + "description": "Library for handling version information and constraints", "support": { - "issues": "https://github.com/PHPCompatibility/PHPCompatibility/issues", - "security": "https://github.com/PHPCompatibility/PHPCompatibility/security/policy", - "source": "https://github.com/PHPCompatibility/PHPCompatibility" + "issues": "https://github.com/phar-io/version/issues", + "source": "https://github.com/phar-io/version/tree/3.2.1" }, - "time": "2023-12-04T17:28:03+00:00" + "time": "2022-02-21T01:04:05+00:00" }, { - "name": "phpcsstandards/phpcsutils", - "version": "1.0.8", + "name": "phpcompatibility/php-compatibility", + "version": "9.3.5", "source": { "type": "git", - "url": "https://github.com/PHPCSStandards/PHPCSUtils.git", - "reference": "69465cab9d12454e5e7767b9041af0cd8cd13be7" + "url": "https://github.com/PHPCompatibility/PHPCompatibility.git", + "reference": "9fb324479acf6f39452e0655d2429cc0d3914243" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHPCSStandards/PHPCSUtils/zipball/69465cab9d12454e5e7767b9041af0cd8cd13be7", - "reference": "69465cab9d12454e5e7767b9041af0cd8cd13be7", + "url": "https://api.github.com/repos/PHPCompatibility/PHPCompatibility/zipball/9fb324479acf6f39452e0655d2429cc0d3914243", + "reference": "9fb324479acf6f39452e0655d2429cc0d3914243", "shasum": "" }, "require": { - "dealerdirect/phpcodesniffer-composer-installer": "^0.4.1 || ^0.5 || ^0.6.2 || ^0.7 || ^1.0", - "php": ">=5.4", - "squizlabs/php_codesniffer": "^3.7.1 || 4.0.x-dev@dev" + "php": ">=5.3", + "squizlabs/php_codesniffer": "^2.3 || ^3.0.2" }, - "require-dev": { - "ext-filter": "*", - "php-parallel-lint/php-console-highlighter": "^1.0", - "php-parallel-lint/php-parallel-lint": "^1.3.2", - "phpcsstandards/phpcsdevcs": "^1.1.6", - "yoast/phpunit-polyfills": "^1.0.5 || ^2.0.0" + "conflict": { + "squizlabs/php_codesniffer": "2.6.2" }, - "type": "phpcodesniffer-standard", - "extra": { - "branch-alias": { - "dev-stable": "1.x-dev", - "dev-develop": "1.x-dev" - } + "require-dev": { + "phpunit/phpunit": "~4.5 || ^5.0 || ^6.0 || ^7.0" }, - "autoload": { - "classmap": [ - "PHPCSUtils/" - ] + "suggest": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.5 || This Composer plugin will sort out the PHPCS 'installed_paths' automatically.", + "roave/security-advisories": "dev-master || Helps prevent installing dependencies with known security issues." }, + "type": "phpcodesniffer-standard", "notification-url": "https://packagist.org/downloads/", "license": [ "LGPL-3.0-or-later" ], "authors": [ + { + "name": "Wim Godden", + "homepage": "https://github.com/wimg", + "role": "lead" + }, { "name": "Juliette Reinders Folmer", "homepage": "https://github.com/jrfnl", @@ -437,57 +1259,50 @@ }, { "name": "Contributors", - "homepage": "https://github.com/PHPCSStandards/PHPCSUtils/graphs/contributors" + "homepage": "https://github.com/PHPCompatibility/PHPCompatibility/graphs/contributors" } ], - "description": "A suite of utility functions for use with PHP_CodeSniffer", - "homepage": "https://phpcsutils.com/", + "description": "A set of sniffs for PHP_CodeSniffer that checks for PHP cross-version compatibility.", + "homepage": "http://techblog.wimgodden.be/tag/codesniffer/", "keywords": [ - "PHP_CodeSniffer", - "phpcbf", - "phpcodesniffer-standard", + "compatibility", "phpcs", - "phpcs3", - "standards", - "static analysis", - "tokens", - "utility" + "standards" ], "support": { - "docs": "https://phpcsutils.com/", - "issues": "https://github.com/PHPCSStandards/PHPCSUtils/issues", - "source": "https://github.com/PHPCSStandards/PHPCSUtils" + "issues": "https://github.com/PHPCompatibility/PHPCompatibility/issues", + "source": "https://github.com/PHPCompatibility/PHPCompatibility" }, - "time": "2023-07-16T21:39:41+00:00" + "time": "2019-12-27T09:44:58+00:00" }, { "name": "phpunit/php-code-coverage", - "version": "10.1.4", + "version": "10.1.16", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "cd59bb34756a16ca8253ce9b2909039c227fff71" + "reference": "7e308268858ed6baedc8704a304727d20bc07c77" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/cd59bb34756a16ca8253ce9b2909039c227fff71", - "reference": "cd59bb34756a16ca8253ce9b2909039c227fff71", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/7e308268858ed6baedc8704a304727d20bc07c77", + "reference": "7e308268858ed6baedc8704a304727d20bc07c77", "shasum": "" }, "require": { "ext-dom": "*", "ext-libxml": "*", "ext-xmlwriter": "*", - "nikic/php-parser": "^4.15", + "nikic/php-parser": "^4.19.1 || ^5.1.0", "php": ">=8.1", - "phpunit/php-file-iterator": "^4.0", - "phpunit/php-text-template": "^3.0", - "sebastian/code-unit-reverse-lookup": "^3.0", - "sebastian/complexity": "^3.0", - "sebastian/environment": "^6.0", - "sebastian/lines-of-code": "^2.0", - "sebastian/version": "^4.0", - "theseer/tokenizer": "^1.2.0" + "phpunit/php-file-iterator": "^4.1.0", + "phpunit/php-text-template": "^3.0.1", + "sebastian/code-unit-reverse-lookup": "^3.0.0", + "sebastian/complexity": "^3.2.0", + "sebastian/environment": "^6.1.0", + "sebastian/lines-of-code": "^2.0.2", + "sebastian/version": "^4.0.1", + "theseer/tokenizer": "^1.2.3" }, "require-dev": { "phpunit/phpunit": "^10.1" @@ -499,7 +1314,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "10.1-dev" + "dev-main": "10.1.x-dev" } }, "autoload": { @@ -528,7 +1343,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.4" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.16" }, "funding": [ { @@ -536,7 +1351,7 @@ "type": "github" } ], - "time": "2023-08-31T14:04:38+00:00" + "time": "2024-08-22T04:31:57+00:00" }, { "name": "phpunit/php-file-iterator", @@ -704,196 +1519,415 @@ "role": "lead" } ], - "description": "Simple template engine.", - "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "keywords": [ + "template" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-text-template/issues", + "security": "https://github.com/sebastianbergmann/php-text-template/security/policy", + "source": "https://github.com/sebastianbergmann/php-text-template/tree/3.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-08-31T14:07:24+00:00" + }, + { + "name": "phpunit/php-timer", + "version": "6.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/e2a2d67966e740530f4a3343fe2e030ffdc1161d", + "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", + "keywords": [ + "timer" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-timer/issues", + "source": "https://github.com/sebastianbergmann/php-timer/tree/6.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:57:52+00:00" + }, + { + "name": "phpunit/phpunit", + "version": "10.5.58", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "e24fb46da450d8e6a5788670513c1af1424f16ca" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/e24fb46da450d8e6a5788670513c1af1424f16ca", + "reference": "e24fb46da450d8e6a5788670513c1af1424f16ca", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-xml": "*", + "ext-xmlwriter": "*", + "myclabs/deep-copy": "^1.13.4", + "phar-io/manifest": "^2.0.4", + "phar-io/version": "^3.2.1", + "php": ">=8.1", + "phpunit/php-code-coverage": "^10.1.16", + "phpunit/php-file-iterator": "^4.1.0", + "phpunit/php-invoker": "^4.0.0", + "phpunit/php-text-template": "^3.0.1", + "phpunit/php-timer": "^6.0.0", + "sebastian/cli-parser": "^2.0.1", + "sebastian/code-unit": "^2.0.0", + "sebastian/comparator": "^5.0.4", + "sebastian/diff": "^5.1.1", + "sebastian/environment": "^6.1.0", + "sebastian/exporter": "^5.1.4", + "sebastian/global-state": "^6.0.2", + "sebastian/object-enumerator": "^5.0.0", + "sebastian/recursion-context": "^5.0.1", + "sebastian/type": "^4.0.0", + "sebastian/version": "^4.0.1" + }, + "suggest": { + "ext-soap": "To be able to generate mocks based on WSDL files" + }, + "bin": [ + "phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "10.5-dev" + } + }, + "autoload": { + "files": [ + "src/Framework/Assert/Functions.php" + ], + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "The PHP Unit Testing framework.", + "homepage": "https://phpunit.de/", + "keywords": [ + "phpunit", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/phpunit/issues", + "security": "https://github.com/sebastianbergmann/phpunit/security/policy", + "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.58" + }, + "funding": [ + { + "url": "https://phpunit.de/sponsors.html", + "type": "custom" + }, + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", + "type": "tidelift" + } + ], + "time": "2025-09-28T12:04:46+00:00" + }, + { + "name": "psr/container", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "shasum": "" + }, + "require": { + "php": ">=7.4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/2.0.2" + }, + "time": "2021-11-05T16:47:00+00:00" + }, + { + "name": "psr/http-factory", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-factory.git", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "PSR-17: Common interfaces for PSR-7 HTTP message factories", "keywords": [ - "template" + "factory", + "http", + "message", + "psr", + "psr-17", + "psr-7", + "request", + "response" ], "support": { - "issues": "https://github.com/sebastianbergmann/php-text-template/issues", - "security": "https://github.com/sebastianbergmann/php-text-template/security/policy", - "source": "https://github.com/sebastianbergmann/php-text-template/tree/3.0.1" + "source": "https://github.com/php-fig/http-factory" }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2023-08-31T14:07:24+00:00" + "time": "2024-04-15T12:06:14+00:00" }, { - "name": "phpunit/php-timer", - "version": "6.0.0", + "name": "psr/http-message", + "version": "2.0", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d" + "url": "https://github.com/php-fig/http-message.git", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/e2a2d67966e740530f4a3343fe2e030ffdc1161d", - "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71", "shasum": "" }, "require": { - "php": ">=8.1" - }, - "require-dev": { - "phpunit/phpunit": "^10.0" + "php": "^7.2 || ^8.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "6.0-dev" + "dev-master": "2.0.x-dev" } }, "autoload": { - "classmap": [ - "src/" - ] + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" } ], - "description": "Utility class for timing", - "homepage": "https://github.com/sebastianbergmann/php-timer/", + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", "keywords": [ - "timer" + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" ], "support": { - "issues": "https://github.com/sebastianbergmann/php-timer/issues", - "source": "https://github.com/sebastianbergmann/php-timer/tree/6.0.0" + "source": "https://github.com/php-fig/http-message/tree/2.0" }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2023-02-03T06:57:52+00:00" + "time": "2023-04-04T09:54:51+00:00" }, { - "name": "phpunit/phpunit", - "version": "10.3.2", + "name": "psr/log", + "version": "3.0.2", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "0dafb1175c366dd274eaa9a625e914451506bcd1" + "url": "https://github.com/php-fig/log.git", + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/0dafb1175c366dd274eaa9a625e914451506bcd1", - "reference": "0dafb1175c366dd274eaa9a625e914451506bcd1", + "url": "https://api.github.com/repos/php-fig/log/zipball/f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", "shasum": "" }, "require": { - "ext-dom": "*", - "ext-json": "*", - "ext-libxml": "*", - "ext-mbstring": "*", - "ext-xml": "*", - "ext-xmlwriter": "*", - "myclabs/deep-copy": "^1.10.1", - "phar-io/manifest": "^2.0.3", - "phar-io/version": "^3.0.2", - "php": ">=8.1", - "phpunit/php-code-coverage": "^10.1.1", - "phpunit/php-file-iterator": "^4.0", - "phpunit/php-invoker": "^4.0", - "phpunit/php-text-template": "^3.0", - "phpunit/php-timer": "^6.0", - "sebastian/cli-parser": "^2.0", - "sebastian/code-unit": "^2.0", - "sebastian/comparator": "^5.0", - "sebastian/diff": "^5.0", - "sebastian/environment": "^6.0", - "sebastian/exporter": "^5.0", - "sebastian/global-state": "^6.0.1", - "sebastian/object-enumerator": "^5.0", - "sebastian/recursion-context": "^5.0", - "sebastian/type": "^4.0", - "sebastian/version": "^4.0" - }, - "suggest": { - "ext-soap": "To be able to generate mocks based on WSDL files" + "php": ">=8.0.0" }, - "bin": [ - "phpunit" - ], "type": "library", "extra": { "branch-alias": { - "dev-main": "10.3-dev" + "dev-master": "3.x-dev" } }, "autoload": { - "files": [ - "src/Framework/Assert/Functions.php" - ], - "classmap": [ - "src/" - ] + "psr-4": { + "Psr\\Log\\": "src" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" } ], - "description": "The PHP Unit Testing framework.", - "homepage": "https://phpunit.de/", + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", "keywords": [ - "phpunit", - "testing", - "xunit" + "log", + "psr", + "psr-3" ], "support": { - "issues": "https://github.com/sebastianbergmann/phpunit/issues", - "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/10.3.2" + "source": "https://github.com/php-fig/log/tree/3.0.2" }, - "funding": [ - { - "url": "https://phpunit.de/sponsors.html", - "type": "custom" - }, - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", - "type": "tidelift" - } - ], - "time": "2023-08-15T05:34:23+00:00" + "time": "2024-09-11T13:17:53+00:00" }, { "name": "sebastian/cli-parser", - "version": "2.0.0", + "version": "2.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/cli-parser.git", - "reference": "efdc130dbbbb8ef0b545a994fd811725c5282cae" + "reference": "c34583b87e7b7a8055bf6c450c2c77ce32a24084" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/efdc130dbbbb8ef0b545a994fd811725c5282cae", - "reference": "efdc130dbbbb8ef0b545a994fd811725c5282cae", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/c34583b87e7b7a8055bf6c450c2c77ce32a24084", + "reference": "c34583b87e7b7a8055bf6c450c2c77ce32a24084", "shasum": "" }, "require": { @@ -928,7 +1962,8 @@ "homepage": "https://github.com/sebastianbergmann/cli-parser", "support": { "issues": "https://github.com/sebastianbergmann/cli-parser/issues", - "source": "https://github.com/sebastianbergmann/cli-parser/tree/2.0.0" + "security": "https://github.com/sebastianbergmann/cli-parser/security/policy", + "source": "https://github.com/sebastianbergmann/cli-parser/tree/2.0.1" }, "funding": [ { @@ -936,7 +1971,7 @@ "type": "github" } ], - "time": "2023-02-03T06:58:15+00:00" + "time": "2024-03-02T07:12:49+00:00" }, { "name": "sebastian/code-unit", @@ -1051,16 +2086,16 @@ }, { "name": "sebastian/comparator", - "version": "5.0.1", + "version": "5.0.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "2db5010a484d53ebf536087a70b4a5423c102372" + "reference": "e8e53097718d2b53cfb2aa859b06a41abf58c62e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/2db5010a484d53ebf536087a70b4a5423c102372", - "reference": "2db5010a484d53ebf536087a70b4a5423c102372", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/e8e53097718d2b53cfb2aa859b06a41abf58c62e", + "reference": "e8e53097718d2b53cfb2aa859b06a41abf58c62e", "shasum": "" }, "require": { @@ -1071,7 +2106,7 @@ "sebastian/exporter": "^5.0" }, "require-dev": { - "phpunit/phpunit": "^10.3" + "phpunit/phpunit": "^10.5" }, "type": "library", "extra": { @@ -1116,32 +2151,44 @@ "support": { "issues": "https://github.com/sebastianbergmann/comparator/issues", "security": "https://github.com/sebastianbergmann/comparator/security/policy", - "source": "https://github.com/sebastianbergmann/comparator/tree/5.0.1" + "source": "https://github.com/sebastianbergmann/comparator/tree/5.0.4" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/comparator", + "type": "tidelift" } ], - "time": "2023-08-14T13:18:12+00:00" + "time": "2025-09-07T05:25:07+00:00" }, { "name": "sebastian/complexity", - "version": "3.0.1", + "version": "3.2.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/complexity.git", - "reference": "c70b73893e10757af9c6a48929fa6a333b56a97a" + "reference": "68ff824baeae169ec9f2137158ee529584553799" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/c70b73893e10757af9c6a48929fa6a333b56a97a", - "reference": "c70b73893e10757af9c6a48929fa6a333b56a97a", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/68ff824baeae169ec9f2137158ee529584553799", + "reference": "68ff824baeae169ec9f2137158ee529584553799", "shasum": "" }, "require": { - "nikic/php-parser": "^4.10", + "nikic/php-parser": "^4.18 || ^5.0", "php": ">=8.1" }, "require-dev": { @@ -1150,7 +2197,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "3.0-dev" + "dev-main": "3.2-dev" } }, "autoload": { @@ -1174,7 +2221,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/complexity/issues", "security": "https://github.com/sebastianbergmann/complexity/security/policy", - "source": "https://github.com/sebastianbergmann/complexity/tree/3.0.1" + "source": "https://github.com/sebastianbergmann/complexity/tree/3.2.0" }, "funding": [ { @@ -1182,20 +2229,20 @@ "type": "github" } ], - "time": "2023-08-31T09:55:53+00:00" + "time": "2023-12-21T08:37:17+00:00" }, { "name": "sebastian/diff", - "version": "5.0.3", + "version": "5.1.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "912dc2fbe3e3c1e7873313cc801b100b6c68c87b" + "reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/912dc2fbe3e3c1e7873313cc801b100b6c68c87b", - "reference": "912dc2fbe3e3c1e7873313cc801b100b6c68c87b", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/c41e007b4b62af48218231d6c2275e4c9b975b2e", + "reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e", "shasum": "" }, "require": { @@ -1203,12 +2250,12 @@ }, "require-dev": { "phpunit/phpunit": "^10.0", - "symfony/process": "^4.2 || ^5" + "symfony/process": "^6.4" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "5.0-dev" + "dev-main": "5.1-dev" } }, "autoload": { @@ -1241,7 +2288,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/diff/issues", "security": "https://github.com/sebastianbergmann/diff/security/policy", - "source": "https://github.com/sebastianbergmann/diff/tree/5.0.3" + "source": "https://github.com/sebastianbergmann/diff/tree/5.1.1" }, "funding": [ { @@ -1249,20 +2296,20 @@ "type": "github" } ], - "time": "2023-05-01T07:48:21+00:00" + "time": "2024-03-02T07:15:17+00:00" }, { "name": "sebastian/environment", - "version": "6.0.1", + "version": "6.1.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "43c751b41d74f96cbbd4e07b7aec9675651e2951" + "reference": "8074dbcd93529b357029f5cc5058fd3e43666984" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/43c751b41d74f96cbbd4e07b7aec9675651e2951", - "reference": "43c751b41d74f96cbbd4e07b7aec9675651e2951", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/8074dbcd93529b357029f5cc5058fd3e43666984", + "reference": "8074dbcd93529b357029f5cc5058fd3e43666984", "shasum": "" }, "require": { @@ -1277,7 +2324,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "6.0-dev" + "dev-main": "6.1-dev" } }, "autoload": { @@ -1305,7 +2352,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/environment/issues", "security": "https://github.com/sebastianbergmann/environment/security/policy", - "source": "https://github.com/sebastianbergmann/environment/tree/6.0.1" + "source": "https://github.com/sebastianbergmann/environment/tree/6.1.0" }, "funding": [ { @@ -1313,20 +2360,20 @@ "type": "github" } ], - "time": "2023-04-11T05:39:26+00:00" + "time": "2024-03-23T08:47:14+00:00" }, { "name": "sebastian/exporter", - "version": "5.0.0", + "version": "5.1.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "f3ec4bf931c0b31e5b413f5b4fc970a7d03338c0" + "reference": "0735b90f4da94969541dac1da743446e276defa6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/f3ec4bf931c0b31e5b413f5b4fc970a7d03338c0", - "reference": "f3ec4bf931c0b31e5b413f5b4fc970a7d03338c0", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/0735b90f4da94969541dac1da743446e276defa6", + "reference": "0735b90f4da94969541dac1da743446e276defa6", "shasum": "" }, "require": { @@ -1335,12 +2382,12 @@ "sebastian/recursion-context": "^5.0" }, "require-dev": { - "phpunit/phpunit": "^10.0" + "phpunit/phpunit": "^10.5" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "5.0-dev" + "dev-main": "5.1-dev" } }, "autoload": { @@ -1382,28 +2429,41 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/exporter/issues", - "source": "https://github.com/sebastianbergmann/exporter/tree/5.0.0" + "security": "https://github.com/sebastianbergmann/exporter/security/policy", + "source": "https://github.com/sebastianbergmann/exporter/tree/5.1.4" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/exporter", + "type": "tidelift" } ], - "time": "2023-02-03T07:06:49+00:00" + "time": "2025-09-24T06:09:11+00:00" }, { "name": "sebastian/global-state", - "version": "6.0.1", + "version": "6.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "7ea9ead78f6d380d2a667864c132c2f7b83055e4" + "reference": "987bafff24ecc4c9ac418cab1145b96dd6e9cbd9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/7ea9ead78f6d380d2a667864c132c2f7b83055e4", - "reference": "7ea9ead78f6d380d2a667864c132c2f7b83055e4", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/987bafff24ecc4c9ac418cab1145b96dd6e9cbd9", + "reference": "987bafff24ecc4c9ac418cab1145b96dd6e9cbd9", "shasum": "" }, "require": { @@ -1437,14 +2497,14 @@ } ], "description": "Snapshotting of global state", - "homepage": "http://www.github.com/sebastianbergmann/global-state", + "homepage": "https://www.github.com/sebastianbergmann/global-state", "keywords": [ "global state" ], "support": { "issues": "https://github.com/sebastianbergmann/global-state/issues", "security": "https://github.com/sebastianbergmann/global-state/security/policy", - "source": "https://github.com/sebastianbergmann/global-state/tree/6.0.1" + "source": "https://github.com/sebastianbergmann/global-state/tree/6.0.2" }, "funding": [ { @@ -1452,24 +2512,24 @@ "type": "github" } ], - "time": "2023-07-19T07:19:23+00:00" + "time": "2024-03-02T07:19:19+00:00" }, { "name": "sebastian/lines-of-code", - "version": "2.0.1", + "version": "2.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/lines-of-code.git", - "reference": "649e40d279e243d985aa8fb6e74dd5bb28dc185d" + "reference": "856e7f6a75a84e339195d48c556f23be2ebf75d0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/649e40d279e243d985aa8fb6e74dd5bb28dc185d", - "reference": "649e40d279e243d985aa8fb6e74dd5bb28dc185d", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/856e7f6a75a84e339195d48c556f23be2ebf75d0", + "reference": "856e7f6a75a84e339195d48c556f23be2ebf75d0", "shasum": "" }, "require": { - "nikic/php-parser": "^4.10", + "nikic/php-parser": "^4.18 || ^5.0", "php": ">=8.1" }, "require-dev": { @@ -1502,7 +2562,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy", - "source": "https://github.com/sebastianbergmann/lines-of-code/tree/2.0.1" + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/2.0.2" }, "funding": [ { @@ -1510,7 +2570,7 @@ "type": "github" } ], - "time": "2023-08-31T09:25:50+00:00" + "time": "2023-12-21T08:38:20+00:00" }, { "name": "sebastian/object-enumerator", @@ -1626,23 +2686,23 @@ }, { "name": "sebastian/recursion-context", - "version": "5.0.0", + "version": "5.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "05909fb5bc7df4c52992396d0116aed689f93712" + "reference": "47e34210757a2f37a97dcd207d032e1b01e64c7a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/05909fb5bc7df4c52992396d0116aed689f93712", - "reference": "05909fb5bc7df4c52992396d0116aed689f93712", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/47e34210757a2f37a97dcd207d032e1b01e64c7a", + "reference": "47e34210757a2f37a97dcd207d032e1b01e64c7a", "shasum": "" }, "require": { "php": ">=8.1" }, "require-dev": { - "phpunit/phpunit": "^10.0" + "phpunit/phpunit": "^10.5" }, "type": "library", "extra": { @@ -1677,15 +2737,28 @@ "homepage": "https://github.com/sebastianbergmann/recursion-context", "support": { "issues": "https://github.com/sebastianbergmann/recursion-context/issues", - "source": "https://github.com/sebastianbergmann/recursion-context/tree/5.0.0" + "security": "https://github.com/sebastianbergmann/recursion-context/security/policy", + "source": "https://github.com/sebastianbergmann/recursion-context/tree/5.0.1" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/recursion-context", + "type": "tidelift" } ], - "time": "2023-02-03T07:05:40+00:00" + "time": "2025-08-10T07:50:56+00:00" }, { "name": "sebastian/type", @@ -1798,16 +2871,16 @@ }, { "name": "squizlabs/php_codesniffer", - "version": "3.7.2", + "version": "3.13.5", "source": { "type": "git", - "url": "https://github.com/squizlabs/PHP_CodeSniffer.git", - "reference": "ed8e00df0a83aa96acf703f8c2979ff33341f879" + "url": "https://github.com/PHPCSStandards/PHP_CodeSniffer.git", + "reference": "0ca86845ce43291e8f5692c7356fccf3bcf02bf4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/ed8e00df0a83aa96acf703f8c2979ff33341f879", - "reference": "ed8e00df0a83aa96acf703f8c2979ff33341f879", + "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/0ca86845ce43291e8f5692c7356fccf3bcf02bf4", + "reference": "0ca86845ce43291e8f5692c7356fccf3bcf02bf4", "shasum": "" }, "require": { @@ -1817,18 +2890,13 @@ "php": ">=5.4.0" }, "require-dev": { - "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0" + "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.3.4" }, "bin": [ - "bin/phpcs", - "bin/phpcbf" + "bin/phpcbf", + "bin/phpcs" ], "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.x-dev" - } - }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" @@ -1836,35 +2904,214 @@ "authors": [ { "name": "Greg Sherwood", - "role": "lead" + "role": "Former lead" + }, + { + "name": "Juliette Reinders Folmer", + "role": "Current lead" + }, + { + "name": "Contributors", + "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer/graphs/contributors" } ], "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.", - "homepage": "https://github.com/squizlabs/PHP_CodeSniffer", + "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer", "keywords": [ "phpcs", "standards", "static analysis" ], "support": { - "issues": "https://github.com/squizlabs/PHP_CodeSniffer/issues", - "source": "https://github.com/squizlabs/PHP_CodeSniffer", - "wiki": "https://github.com/squizlabs/PHP_CodeSniffer/wiki" + "issues": "https://github.com/PHPCSStandards/PHP_CodeSniffer/issues", + "security": "https://github.com/PHPCSStandards/PHP_CodeSniffer/security/policy", + "source": "https://github.com/PHPCSStandards/PHP_CodeSniffer", + "wiki": "https://github.com/PHPCSStandards/PHP_CodeSniffer/wiki" + }, + "funding": [ + { + "url": "https://github.com/PHPCSStandards", + "type": "github" + }, + { + "url": "https://github.com/jrfnl", + "type": "github" + }, + { + "url": "https://opencollective.com/php_codesniffer", + "type": "open_collective" + }, + { + "url": "https://thanks.dev/u/gh/phpcsstandards", + "type": "thanks_dev" + } + ], + "time": "2025-11-04T16:30:35+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v3.6.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/63afe740e99a13ba87ec199bb07bbdee937a5b62", + "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" + } + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.6.0" }, - "time": "2023-02-22T23:07:41+00:00" + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:21:43+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/6d857f4d76bd4b343eac26d6b539585d2bc56493", + "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493", + "shasum": "" + }, + "require": { + "ext-iconv": "*", + "php": ">=7.2" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-12-23T08:48:59+00:00" }, { "name": "theseer/tokenizer", - "version": "1.2.1", + "version": "1.2.3", "source": { "type": "git", "url": "https://github.com/theseer/tokenizer.git", - "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e" + "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/34a41e998c2183e22995f158c581e7b5e755ab9e", - "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", + "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", "shasum": "" }, "require": { @@ -1893,7 +3140,7 @@ "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", "support": { "issues": "https://github.com/theseer/tokenizer/issues", - "source": "https://github.com/theseer/tokenizer/tree/1.2.1" + "source": "https://github.com/theseer/tokenizer/tree/1.2.3" }, "funding": [ { @@ -1901,17 +3148,15 @@ "type": "github" } ], - "time": "2021-07-28T10:34:58+00:00" + "time": "2024-03-03T12:36:25+00:00" } ], "aliases": [], "minimum-stability": "stable", - "stability-flags": { - "phpcompatibility/php-compatibility": 20 - }, + "stability-flags": {}, "prefer-stable": false, "prefer-lowest": false, - "platform": [], - "platform-dev": [], - "plugin-api-version": "2.3.0" + "platform": {}, + "platform-dev": {}, + "plugin-api-version": "2.6.0" } diff --git a/cypress.config.ts b/cypress.config.ts new file mode 100644 index 00000000..190fe140 --- /dev/null +++ b/cypress.config.ts @@ -0,0 +1,60 @@ +import * as fs from "fs"; +import * as mysql from 'cypress-mysql'; +import { defineConfig } from "cypress"; + +const db = { + host: process.env.JOOMLA_DB_HOST, + user: process.env.JOOMLA_DB_USER, + password: process.env.JOOMLA_DB_PASSWORD, + database: process.env.JOOMLA_DB_NAME, +}; + +export default defineConfig({ + e2e: { + baseUrl: process.env.JOOMLA_URL, + env: { + db: db, + }, + setupNodeEvents(on, config) { + mysql.configurePlugin(on); + + on("task", { + // Use mysql client to restore from a clean backup + resetDatabase: () => { + const { execSync } = require("child_process"); + execSync( + `mysql -h ${db.host} -u ${db.user} -p${db.password} ${db.database} < /tmp/clean_backup.sql` + ); + return null; + }, + + // Use mysqldump to create a backup of the database + dumpDatabase: () => { + const { execSync } = require("child_process"); + execSync( + `mysqldump -h ${db.host} -u ${db.user} -p${db.password} ${db.database} > /tmp/clean_backup.sql` + ); + return null; + }, + + // Find the built attachment file in the specified directory + findAttachmentFile(directory) { + const files = fs.readdirSync(directory); + const attachmentFile = files.find( + (file) => file.startsWith("attachments-") && file.endsWith(".zip") + ); + return attachmentFile || null; + }, + + // Run make to build the Joomla extension package + makePackage: () => { + const { execSync } = require("child_process"); + execSync( + "cd /app && make veryclean && make && mv attachments-*.zip /app/cypress/fixtures/" + ); + return null; + }, + }); + }, + }, +}); diff --git a/cypress/e2e/0-sanity-checks/joomlaIsReady.cy.ts b/cypress/e2e/0-sanity-checks/joomlaIsReady.cy.ts new file mode 100644 index 00000000..1df168dd --- /dev/null +++ b/cypress/e2e/0-sanity-checks/joomlaIsReady.cy.ts @@ -0,0 +1,21 @@ +import "../../support" + +describe("Joomla is ready", () => { + it("should load the Joomla admin login page", () => { + cy.visit("/administrator/"); + cy.get("#form-login").should("be.visible"); + }); + + it("should log in to the Joomla admin panel", () => { + cy.adminLogin().visit("/administrator/"); + cy.get(".admin.com_cpanel").should("be.visible"); + }); + + it("should log out from the Joomla admin panel", () => { + cy.adminLogin().visit("/administrator/"); + cy.get(".admin.com_cpanel").should("be.visible"); + + cy.doAdministratorLogout(); + cy.get("#form-login").should("be.visible"); + }); +}); diff --git a/cypress/e2e/1-attachments-install/installationTests.cy.ts b/cypress/e2e/1-attachments-install/installationTests.cy.ts new file mode 100644 index 00000000..721f9ffe --- /dev/null +++ b/cypress/e2e/1-attachments-install/installationTests.cy.ts @@ -0,0 +1,101 @@ +import "../../support" + +describe("Attachments package installation tests", () => { + it("should appear in the installed extensions list after installation", () => { + const extensionName = "Attachments"; + + // Log in as administrator + cy.adminLogin(); + + // Verify that no extension with this name exists in the installed extensions list + cy.visit("/administrator/index.php?option=com_installer&view=manage"); + cy.searchForItem(extensionName); + cy.contains(extensionName).should("not.exist"); + + // Install the Attachments extension from a local file + cy.task("findAttachmentFile", "/app/cypress/fixtures").then((filename) => { + if (filename) { + cy.log(`Found file: ${filename}`); + // Use the filename for further operations + cy.installExtensionFromFileUpload(filename); + } else { + throw new Error("Attachment file not found"); + } + }); + + // Verify that the extension appears in the installed extensions list + cy.visit("/administrator/index.php?option=com_installer&view=manage"); + cy.searchForItem(extensionName); + cy.contains(extensionName).should("exist"); + // Verify that there are 11 items listed (Attachments component, 9 plugins and 1 package) + cy.get('tbody > tr').should('have.length', 11); + cy.get('tbody > tr > :nth-child(5)').filter(':contains("Component")').should('have.length', 1); + cy.get('tbody > tr > :nth-child(5)').filter(':contains("Package")').should('have.length', 1); + cy.get('tbody > tr > :nth-child(5)').filter(':contains("Plugin")').should('have.length', 9); + }); + + it("should reinstall without errors", () => { + const extensionName = "Attachments"; + + // Log in as administrator + cy.adminLogin(); + + // Verify that no extension with this name exists in the installed extensions list + // Note: The previous test already installed the extension, so the files are present + // but the database entries were removed before this test + cy.visit("/administrator/index.php?option=com_installer&view=manage"); + cy.searchForItem(extensionName); + cy.contains(extensionName).should("not.exist"); + + // Install the Attachments extension from a local file + cy.task("findAttachmentFile", "/app/cypress/fixtures").then((filename) => { + if (filename) { + cy.log(`Found file: ${filename}`); + // Use the filename for further operations + cy.installExtensionFromFileUpload(filename); + } else { + throw new Error("Attachment file not found"); + } + }); + + // Verify that the extension appears in the installed extensions list + cy.visit("/administrator/index.php?option=com_installer&view=manage"); + cy.searchForItem(extensionName); + cy.contains(extensionName).should("exist"); + + // Verify that there are 11 items listed (Attachments component, 9 plugins and 1 package) + cy.get('tbody > tr').should('have.length', 11); + cy.get('tbody > tr > :nth-child(5)').filter(':contains("Component")').should('have.length', 1); + cy.get('tbody > tr > :nth-child(5)').filter(':contains("Package")').should('have.length', 1); + cy.get('tbody > tr > :nth-child(5)').filter(':contains("Plugin")').should('have.length', 9); + + // Clean up by uninstalling the extension + cy.uninstallExtension(`Package: ${extensionName}`); + + // Reinstall a second time to verify no errors occur + cy.task("findAttachmentFile", "/app/cypress/fixtures").then((filename) => { + if (filename) { + cy.log(`Found file: ${filename}`); + // Use the filename for further operations + cy.installExtensionFromFileUpload(filename); + } else { + throw new Error("Attachment file not found"); + } + }); + + // Verify that the extension appears in the installed extensions list + cy.visit("/administrator/index.php?option=com_installer&view=manage"); + cy.searchForItem(extensionName); + cy.contains(extensionName).should("exist"); + + // Verify that there are 11 items listed (Attachments component, 9 plugins and 1 package) + cy.get('tbody > tr').should('have.length', 11); + cy.get('tbody > tr > :nth-child(5)').filter(':contains("Component")').should('have.length', 1); + cy.get('tbody > tr > :nth-child(5)').filter(':contains("Package")').should('have.length', 1); + cy.get('tbody > tr > :nth-child(5)').filter(':contains("Plugin")').should('have.length', 9); + }); +}).beforeAll(() => { + cy.task("makePackage").then(() => { + cy.log("Package created"); + }); +});; diff --git a/cypress/e2e/1-getting-started/todo.cy.js b/cypress/e2e/1-getting-started/todo.cy.js new file mode 100644 index 00000000..4768ff92 --- /dev/null +++ b/cypress/e2e/1-getting-started/todo.cy.js @@ -0,0 +1,143 @@ +/// + +// Welcome to Cypress! +// +// This spec file contains a variety of sample tests +// for a todo list app that are designed to demonstrate +// the power of writing tests in Cypress. +// +// To learn more about how Cypress works and +// what makes it such an awesome testing tool, +// please read our getting started guide: +// https://on.cypress.io/introduction-to-cypress + +describe('example to-do app', () => { + beforeEach(() => { + // Cypress starts out with a blank slate for each test + // so we must tell it to visit our website with the `cy.visit()` command. + // Since we want to visit the same URL at the start of all our tests, + // we include it in our beforeEach function so that it runs before each test + cy.visit('https://example.cypress.io/todo') + }) + + it('displays two todo items by default', () => { + // We use the `cy.get()` command to get all elements that match the selector. + // Then, we use `should` to assert that there are two matched items, + // which are the two default items. + cy.get('.todo-list li').should('have.length', 2) + + // We can go even further and check that the default todos each contain + // the correct text. We use the `first` and `last` functions + // to get just the first and last matched elements individually, + // and then perform an assertion with `should`. + cy.get('.todo-list li').first().should('have.text', 'Pay electric bill') + cy.get('.todo-list li').last().should('have.text', 'Walk the dog') + }) + + it('can add new todo items', () => { + // We'll store our item text in a variable so we can reuse it + const newItem = 'Feed the cat' + + // Let's get the input element and use the `type` command to + // input our new list item. After typing the content of our item, + // we need to type the enter key as well in order to submit the input. + // This input has a data-test attribute so we'll use that to select the + // element in accordance with best practices: + // https://on.cypress.io/selecting-elements + cy.get('[data-test=new-todo]').type(`${newItem}{enter}`) + + // Now that we've typed our new item, let's check that it actually was added to the list. + // Since it's the newest item, it should exist as the last element in the list. + // In addition, with the two default items, we should have a total of 3 elements in the list. + // Since assertions yield the element that was asserted on, + // we can chain both of these assertions together into a single statement. + cy.get('.todo-list li') + .should('have.length', 3) + .last() + .should('have.text', newItem) + }) + + it('can check off an item as completed', () => { + // In addition to using the `get` command to get an element by selector, + // we can also use the `contains` command to get an element by its contents. + // However, this will yield the