From e25b9d03b26826c4550b8e547e06e72bc9a115b2 Mon Sep 17 00:00:00 2001 From: anonymoususer72041 <247563575+anonymoususer72041@users.noreply.github.com> Date: Thu, 23 Apr 2026 09:04:56 +0200 Subject: [PATCH 01/11] Squash chore/modernize-phpunit commit a0eecfd7e149ff2c59ec6deaebc2e296d0e4b0b3 Author: anonymoususer72041 <247563575+anonymoususer72041@users.noreply.github.com> Date: Wed Apr 22 19:59:58 2026 +0200 Use stricter assertions in tests commit 7dcf904e536746556b097c4f6fb801b7b3ec4f2e Author: anonymoususer72041 <247563575+anonymoususer72041@users.noreply.github.com> Date: Wed Apr 22 19:50:31 2026 +0200 Centralize PHPUnit test bootstrap commit 0393e63d958f615e571d01a6b17b441d995cbdc7 Author: anonymoususer72041 <247563575+anonymoususer72041@users.noreply.github.com> Date: Wed Apr 22 19:44:48 2026 +0200 Clean up PHPUnit configuration commit dd9b18407e66df4d8b8ecfe6e82f56dce34cf9cf Author: anonymoususer72041 <247563575+anonymoususer72041@users.noreply.github.com> Date: Wed Apr 22 19:36:22 2026 +0200 Refactor consecutive mock expectations commit b60e11a6ac001cae49454dcf867591e4bfd576d4 Author: anonymoususer72041 <247563575+anonymoususer72041@users.noreply.github.com> Date: Wed Apr 22 19:30:42 2026 +0200 Replace deprecated mock builder methods commit 3580471d7d99668005fa46fab847b4324b957c1e Author: anonymoususer72041 <247563575+anonymoususer72041@users.noreply.github.com> Date: Wed Apr 22 19:27:17 2026 +0200 Use expectException in CompanyRepositoryTest commit 9474ef7aab58beedc5b73fbf75c5da7e41db5b57 Author: anonymoususer72041 <247563575+anonymoususer72041@users.noreply.github.com> Date: Wed Apr 22 19:22:28 2026 +0200 Replace deprecated regex assertions in tests --- .github/workflows/ci.yml | 4 +- README-testing.md | 4 +- phpunit.xml.dist | 10 ++- .../DatabaseConnectionTest.php | 2 +- .../IntegrationTests/DatabaseSearchTest.php | 5 -- .../IntegrationTests/DatabaseTestCase.php | 6 -- .../Tests/UnitTests/AJAXInterfaceTest.php | 5 -- .../Tests/UnitTests/AddressParserTest.php | 5 -- .../Tests/UnitTests/ArrayUtilityTest.php | 5 -- .../Tests/UnitTests/BrowserDetectionTest.php | 5 -- .../Tests/UnitTests/CompanyRepositoryTest.php | 64 ++++++++++--------- .../Tests/UnitTests/DateUtilityTest.php | 5 -- .../Tests/UnitTests/FileUtilityTest.php | 27 ++++---- .../Tests/UnitTests/ResultSetUtilityTest.php | 5 -- .../Tests/UnitTests/SessionCSRFTest.php | 11 +--- .../Tests/UnitTests/StringUtilityTest.php | 5 -- .../Tests/UnitTests/TemplateEscapeTest.php | 5 -- src/OpenCATS/Tests/UnitTests/VCardTest.php | 29 +++++---- src/OpenCATS/Tests/bootstrap.php | 7 ++ test/runAllTests.sh | 2 +- 20 files changed, 86 insertions(+), 125 deletions(-) create mode 100644 src/OpenCATS/Tests/bootstrap.php diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index fafd81b91..883bf9366 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -52,7 +52,7 @@ jobs: run: mkdir -p reports/behat-default reports/behat-security test/screenshots - name: Run PHPUnit (Unit Tests) - run: ./vendor/bin/phpunit --log-junit reports/unit-report.xml src/OpenCATS/Tests/UnitTests + run: ./vendor/bin/phpunit --log-junit reports/unit-report.xml --testsuite UnitTests - name: Run Integration Tests (Docker) run: | @@ -79,7 +79,7 @@ jobs: docker compose -f docker-compose-test.yml exec -T php php -r "echo 'IP for integrationtestdb: ' . gethostbyname('integrationtestdb') . PHP_EOL;" echo "Running PHPUnit Integration Tests..." - docker compose -f docker-compose-test.yml exec -T --workdir /var/www/public php ./vendor/bin/phpunit --log-junit /var/www/public/reports/integration-report.xml src/OpenCATS/Tests/IntegrationTests + docker compose -f docker-compose-test.yml exec -T --workdir /var/www/public php ./vendor/bin/phpunit --log-junit /var/www/public/reports/integration-report.xml --testsuite IntegrationTests echo "Running Behat Suites..." docker compose -f docker-compose-test.yml exec -T --workdir /var/www/public php ./vendor/bin/behat -v -c ./test/behat.yml --suite="default" --format=progress diff --git a/README-testing.md b/README-testing.md index 5150f7b45..334d41c6c 100644 --- a/README-testing.md +++ b/README-testing.md @@ -35,8 +35,8 @@ To mirror the CI environment on your machine: ``` 4. **Run the suites:** - * **PHPUnit Unit Tests:** `docker exec -it opencats_test_php ./vendor/bin/phpunit src/OpenCATS/Tests/UnitTests` - * **PHPUnit Integration Tests:** `docker exec -it opencats_test_php ./vendor/bin/phpunit src/OpenCATS/Tests/IntegrationTests` + * **PHPUnit Unit Tests:** `docker exec -it opencats_test_php ./vendor/bin/phpunit --testsuite UnitTests` + * **PHPUnit Integration Tests:** `docker exec -it opencats_test_php ./vendor/bin/phpunit --testsuite IntegrationTests` * **Behat:** `docker exec -it opencats_test_php ./vendor/bin/behat -c ./test/behat.yml` --- diff --git a/phpunit.xml.dist b/phpunit.xml.dist index 24a485c4a..efc81f7fa 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -1,5 +1,13 @@ - + + + + src/OpenCATS/Tests/UnitTests + + + src/OpenCATS/Tests/IntegrationTests + + diff --git a/src/OpenCATS/Tests/IntegrationTests/DatabaseConnectionTest.php b/src/OpenCATS/Tests/IntegrationTests/DatabaseConnectionTest.php index 861984fc1..6a6e37767 100644 --- a/src/OpenCATS/Tests/IntegrationTests/DatabaseConnectionTest.php +++ b/src/OpenCATS/Tests/IntegrationTests/DatabaseConnectionTest.php @@ -174,7 +174,7 @@ function testQuery() false, 'SELECT query should succeed' ); - $this->assertEquals( + $this->assertSame( mysqli_num_rows($queryResult), 1, '1 row should be returned' diff --git a/src/OpenCATS/Tests/IntegrationTests/DatabaseSearchTest.php b/src/OpenCATS/Tests/IntegrationTests/DatabaseSearchTest.php index 8bc7da75d..51adb12c3 100644 --- a/src/OpenCATS/Tests/IntegrationTests/DatabaseSearchTest.php +++ b/src/OpenCATS/Tests/IntegrationTests/DatabaseSearchTest.php @@ -5,11 +5,6 @@ use DatabaseConnection; use DatabaseSearch; -if( !defined('LEGACY_ROOT') ) -{ - define('LEGACY_ROOT', '.'); -} - include_once(LEGACY_ROOT . '/lib/DatabaseSearch.php'); class DatabaseSearchTest extends DatabaseTestCase diff --git a/src/OpenCATS/Tests/IntegrationTests/DatabaseTestCase.php b/src/OpenCATS/Tests/IntegrationTests/DatabaseTestCase.php index 2d92352c9..a51400320 100644 --- a/src/OpenCATS/Tests/IntegrationTests/DatabaseTestCase.php +++ b/src/OpenCATS/Tests/IntegrationTests/DatabaseTestCase.php @@ -11,12 +11,6 @@ protected function setUp(): void { global $mySQLConnection; parent::setUp(); - - // Ensure roots are defined for legacy includes - if (!defined('LEGACY_ROOT')) { - define('LEGACY_ROOT', '.'); - } - include_once('./constants.php'); // We define these for the rest of the app logic, diff --git a/src/OpenCATS/Tests/UnitTests/AJAXInterfaceTest.php b/src/OpenCATS/Tests/UnitTests/AJAXInterfaceTest.php index 2aec763ad..d3325c0fc 100644 --- a/src/OpenCATS/Tests/UnitTests/AJAXInterfaceTest.php +++ b/src/OpenCATS/Tests/UnitTests/AJAXInterfaceTest.php @@ -1,11 +1,6 @@ getDatabaseConnectionMock(); + $expectedStringValues = [ + self::COMPANY_NAME, + self::ADDRESS, + self::ADDRESS2, + self::CITY, + self::STATE, + self::ZIP_CODE, + self::PHONE_NUMBER_ONE, + self::PHONE_NUMBER_TWO, + self::FAX_NUMBER, + self::URL, + self::KEY_TECHNOLOGIES, + self::NOTES + ]; + $stringCallIndex = 0; $databaseConnectionMock->expects($this->exactly(12)) ->method('makeQueryString') - ->withConsecutive( - [$this->equalTo(self::COMPANY_NAME)], - [$this->equalTo(self::ADDRESS)], - [$this->equalTo(self::ADDRESS2)], - [$this->equalTo(self::CITY)], - [$this->equalTo(self::STATE)], - [$this->equalTo(self::ZIP_CODE)], - [$this->equalTo(self::PHONE_NUMBER_ONE)], - [$this->equalTo(self::PHONE_NUMBER_TWO)], - [$this->equalTo(self::FAX_NUMBER)], - [$this->equalTo(self::URL)], - [$this->equalTo(self::KEY_TECHNOLOGIES)], - [$this->equalTo(self::NOTES)] - ); + ->willReturnCallback(function($value) use ($expectedStringValues, &$stringCallIndex) { + $this->assertSame($expectedStringValues[$stringCallIndex], $value); + $stringCallIndex++; + }); + $expectedIntegerValues = [ + self::ENTERED_BY, + self::OWNER + ]; + $integerCallIndex = 0; $databaseConnectionMock->expects($this->exactly(2)) ->method('makeQueryInteger') - ->withConsecutive( - [$this->equalTo(self::ENTERED_BY)], - [$this->equalTo(self::OWNER)] - ); + ->willReturnCallback(function($value) use ($expectedIntegerValues, &$integerCallIndex) { + $this->assertSame($expectedIntegerValues[$integerCallIndex], $value); + $integerCallIndex++; + }); $databaseConnectionMock->method('query') ->willReturn(true); $databaseConnectionMock->method('getLastInsertID') @@ -86,16 +92,14 @@ function test_persist_CreateNewCompany_StoresHistoryWithCompanyId() $historyMock = $this->getHistoryMock(); $historyMock->expects($this->exactly(1)) ->method('storeHistoryNew') - ->withConsecutive( - [DATA_ITEM_COMPANY, self::COMPANY_ID] + ->with( + $this->equalTo(DATA_ITEM_COMPANY), + $this->equalTo(self::COMPANY_ID) ); $CompanyRepository = new CompanyRepository($databaseConnectionMock); $CompanyRepository->persist($this->createCompany(), $historyMock); } - /** - * @expectedException OpenCATS\Entity\CompanyRepositoryException - */ function test_persist_FailToCreateNewCompany_ThrowsException() { $databaseConnectionMock = $this->getDatabaseConnectionMock(); @@ -103,6 +107,7 @@ function test_persist_FailToCreateNewCompany_ThrowsException() ->willReturn(false); $historyMock = $this->getHistoryMock(); $CompanyRepository = new CompanyRepository($databaseConnectionMock); + $this->expectException(\OpenCATS\Entity\CompanyRepositoryException::class); $CompanyRepository->persist($this->createCompany(), $historyMock); } @@ -114,7 +119,8 @@ private function getHistoryMock() private function getDatabaseConnectionMock() { return $this->getMockBuilder('\DatabaseConnection') - ->setMethods(['makeQueryString', 'makeQueryInteger', 'query', 'getLastInsertID']) + ->disableOriginalConstructor() + ->onlyMethods(['makeQueryString', 'makeQueryInteger', 'query', 'getLastInsertID']) ->getMock(); } diff --git a/src/OpenCATS/Tests/UnitTests/DateUtilityTest.php b/src/OpenCATS/Tests/UnitTests/DateUtilityTest.php index 8ce5cb86e..f71a8c7dc 100644 --- a/src/OpenCATS/Tests/UnitTests/DateUtilityTest.php +++ b/src/OpenCATS/Tests/UnitTests/DateUtilityTest.php @@ -38,11 +38,6 @@ use PHPUnit\Framework\TestCase; -if( !defined('LEGACY_ROOT') ) -{ - define('LEGACY_ROOT', '.'); -} - include_once(LEGACY_ROOT . '/constants.php'); include_once(LEGACY_ROOT . '/lib/StringUtility.php'); include_once(LEGACY_ROOT . '/lib/DateUtility.php'); /* Depends on StringUtility. */ diff --git a/src/OpenCATS/Tests/UnitTests/FileUtilityTest.php b/src/OpenCATS/Tests/UnitTests/FileUtilityTest.php index 174d59a8f..ba2787f57 100644 --- a/src/OpenCATS/Tests/UnitTests/FileUtilityTest.php +++ b/src/OpenCATS/Tests/UnitTests/FileUtilityTest.php @@ -1,11 +1,6 @@ assertEquals( + $this->assertSame( strlen($directoryA), 32, sprintf("'%s' should be 32 characters long", $directoryA) ); - $this->assertEquals( + $this->assertSame( strlen($directoryB), 32, sprintf("'%s' should be 32 characters long", $directoryB) ); - $this->assertEquals( + $this->assertSame( strlen($directoryC), 32, sprintf("'%s' should be 32 characters long", $directoryB) ); - $this->assertEquals( + $this->assertSame( strlen($directoryD), 32, sprintf("'%s' should be 32 characters long", $directoryB) @@ -81,32 +76,32 @@ function testGetUniqueDirectory() /* Make sure extra data is actually being added (directory names * should not be identical). */ - $this->assertNotEquals( + $this->assertNotSame( $directoryA, $directoryB, sprintf("'%s' should not equal '%s'", $directoryA, $directoryB) ); - $this->assertNotEquals( + $this->assertNotSame( $directoryA, $directoryC, sprintf("'%s' should not equal '%s'", $directoryA, $directoryC) ); - $this->assertNotEquals( + $this->assertNotSame( $directoryA, $directoryD, sprintf("'%s' should not equal '%s'", $directoryA, $directoryD) ); - $this->assertNotEquals( + $this->assertNotSame( $directoryB, $directoryC, sprintf("'%s' should not equal '%s'", $directoryB, $directoryC) ); - $this->assertNotEquals( + $this->assertNotSame( $directoryB, $directoryD, sprintf("'%s' should not equal '%s'", $directoryB, $directoryD) ); - $this->assertNotEquals( + $this->assertNotSame( $directoryC, $directoryD, sprintf("'%s' should not equal '%s'", $directoryC, $directoryD) @@ -131,4 +126,4 @@ function testGetUniqueDirectory() ); } } -?> \ No newline at end of file +?> diff --git a/src/OpenCATS/Tests/UnitTests/ResultSetUtilityTest.php b/src/OpenCATS/Tests/UnitTests/ResultSetUtilityTest.php index 8477b284a..f661c540d 100644 --- a/src/OpenCATS/Tests/UnitTests/ResultSetUtilityTest.php +++ b/src/OpenCATS/Tests/UnitTests/ResultSetUtilityTest.php @@ -1,11 +1,6 @@ _session->getCSRFToken(); $t2 = $this->_session->getCSRFToken(); - $this->assertEquals($t1, $t2); + $this->assertSame($t1, $t2); } function testRotateCSRFTokenChangesToken() @@ -39,8 +34,8 @@ function testRotateCSRFTokenChangesToken() $old = $this->_session->getCSRFToken(); $new = $this->_session->rotateCSRFToken(); - $this->assertNotEquals($old, $new); - $this->assertEquals($new, $this->_session->getCSRFToken()); + $this->assertNotSame($old, $new); + $this->assertSame($new, $this->_session->getCSRFToken()); $this->assertSame(64, strlen($new)); $this->assertTrue(ctype_xdigit($new)); } diff --git a/src/OpenCATS/Tests/UnitTests/StringUtilityTest.php b/src/OpenCATS/Tests/UnitTests/StringUtilityTest.php index 7a299856f..fb9076358 100644 --- a/src/OpenCATS/Tests/UnitTests/StringUtilityTest.php +++ b/src/OpenCATS/Tests/UnitTests/StringUtilityTest.php @@ -1,11 +1,6 @@ assertMatchesRegularExpression($pattern, $value); + } + else + { + $this->assertSame(1, preg_match($pattern, $value)); + } + } + function testVersion() { $this->assertSame(VCard::VCARD_VERSION, '2.1'); @@ -31,10 +38,7 @@ function testVCard1() $this->assertSame($outputLines[3], 'FN:John Smith'); /* Test revision timestamp. */ - $this->assertRegExp( - '/^REV:\d{8}T\d{6}$/', - $outputLines[4] - ); + $this->assertRegexCompat('/^REV:\d{8}T\d{6}$/', $outputLines[4]); $currentREVNumeric = date('YmdHis'); $vCardREVNumeric = preg_replace('/REV:|T/', '', $outputLines[4]); @@ -91,10 +95,7 @@ function testVCard2() $this->assertSame($outputLines[10], 'URL:http://www.slashdot.org'); /* Test revision timestamp. */ - $this->assertRegExp( - '/^REV:\d{8}T\d{6}$/', - $outputLines[11] - ); + $this->assertRegexCompat('/^REV:\d{8}T\d{6}$/', $outputLines[11]); $currentREVNumeric = date('YmdHis'); $vCardREVNumeric = preg_replace('/REV:|T/', '', $outputLines[11]); @@ -111,4 +112,4 @@ function testVCard2() $this->assertSame($vCard->getFilename(), 'John Smith.vcf'); } } -?> \ No newline at end of file +?> diff --git a/src/OpenCATS/Tests/bootstrap.php b/src/OpenCATS/Tests/bootstrap.php new file mode 100644 index 000000000..5daac1f15 --- /dev/null +++ b/src/OpenCATS/Tests/bootstrap.php @@ -0,0 +1,7 @@ + Date: Wed, 22 Apr 2026 15:30:00 +0200 Subject: [PATCH 02/11] Add local Docker PHP 7.4 image --- docker/docker-compose-test.yml | 4 ++- docker/docker-compose.yml | 4 ++- docker/php/Dockerfile | 47 ++++++++++++++++++++++++++ docker/php/scripts/install-composer.sh | 6 ++++ 4 files changed, 59 insertions(+), 2 deletions(-) create mode 100644 docker/php/Dockerfile create mode 100755 docker/php/scripts/install-composer.sh diff --git a/docker/docker-compose-test.yml b/docker/docker-compose-test.yml index 92265a29a..d27f00012 100644 --- a/docker/docker-compose-test.yml +++ b/docker/docker-compose-test.yml @@ -10,7 +10,9 @@ services: php: container_name: opencats_test_php - image: opencats/php-base:7.2-fpm-alpine + build: + context: .. + dockerfile: docker/php/Dockerfile working_dir: /var/www/public volumes_from: - opencatsdata diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index b7542cca5..746db0f2a 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -10,7 +10,9 @@ services: php: container_name: opencats_php - image: opencats/php-base:7.2-fpm-alpine + build: + context: .. + dockerfile: docker/php/Dockerfile volumes_from: - opencatsdata diff --git a/docker/php/Dockerfile b/docker/php/Dockerfile new file mode 100644 index 000000000..b53589646 --- /dev/null +++ b/docker/php/Dockerfile @@ -0,0 +1,47 @@ +FROM php:7.4-fpm-alpine + +# Runtime/system packages required by OpenCATS and helper tools. +RUN apk add --no-cache \ + antiword \ + coreutils \ + html2text \ + libltdl \ + poppler-utils \ + wget + +# Build dependencies for PHP extensions and external tools. +RUN apk add --no-cache \ + alpine-sdk \ + autoconf \ + automake \ + freetype-dev \ + libjpeg-turbo-dev \ + libmcrypt-dev \ + libpng-dev \ + libxml2-dev \ + libzip-dev \ + openldap-dev + +# External tools. +RUN cd /tmp && \ + wget http://www.gnu.org/software/unrtf/unrtf-0.21.9.tar.gz && \ + tar xzvf unrtf-0.21.9.tar.gz && \ + cd unrtf-0.21.9/ && \ + ./bootstrap && \ + ./configure && \ + make && \ + make install + +# PHP extensions expected by OpenCATS. +RUN pecl install mcrypt-1.0.9 && docker-php-ext-enable mcrypt +RUN docker-php-ext-configure gd --with-freetype --with-jpeg \ + && docker-php-ext-install -j"$(nproc)" mysqli gd soap zip ldap + +# Composer and helper binaries. +COPY docker/php/scripts/install-composer.sh /opt/install-composer.sh +RUN chmod +x /opt/install-composer.sh && \ + /opt/install-composer.sh && \ + mv /var/www/html/composer.phar /usr/local/bin/composer +ENV DOCKERIZE_VERSION=v0.2.0 +RUN wget https://github.com/jwilder/dockerize/releases/download/${DOCKERIZE_VERSION}/dockerize-linux-amd64-${DOCKERIZE_VERSION}.tar.gz \ + && tar -C /usr/local/bin -xzvf dockerize-linux-amd64-${DOCKERIZE_VERSION}.tar.gz diff --git a/docker/php/scripts/install-composer.sh b/docker/php/scripts/install-composer.sh new file mode 100755 index 000000000..bb200f00b --- /dev/null +++ b/docker/php/scripts/install-composer.sh @@ -0,0 +1,6 @@ +#!/bin/sh +set -eu + +php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" +php composer-setup.php +rm -f composer-setup.php From 22b72d98f6c38933f0b1408efbc0f07defd83092 Mon Sep 17 00:00:00 2001 From: anonymoususer72041 <247563575+anonymoususer72041@users.noreply.github.com> Date: Wed, 22 Apr 2026 15:30:00 +0200 Subject: [PATCH 03/11] Align test configuration with PHP 7.4 --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 883bf9366..32ace3f8a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -18,7 +18,7 @@ jobs: strategy: fail-fast: false matrix: - php-version: ['7.2'] + php-version: ['7.4'] steps: - name: Checkout Code From 0a59e7291fc33e4bf62c2e0bd8a1bf06344c04de Mon Sep 17 00:00:00 2001 From: anonymoususer72041 <247563575+anonymoususer72041@users.noreply.github.com> Date: Thu, 14 May 2026 12:30:00 +0200 Subject: [PATCH 04/11] Update testing README to run Composer in PHP container --- README-testing.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README-testing.md b/README-testing.md index 334d41c6c..b14dd33d7 100644 --- a/README-testing.md +++ b/README-testing.md @@ -26,18 +26,18 @@ To mirror the CI environment on your machine: 2. **Start the containers:** ```bash cd docker/ - docker compose -f docker-compose-test.yml up -d + docker compose -f docker-compose-test.yml up -d --build ``` 3. **Install PHP dependencies (Composer):** ```bash - docker run --rm -v "$(pwd)/..":/app -w /app composer:2 composer install --no-interaction --prefer-dist --ignore-platform-reqs + docker compose -f docker-compose-test.yml exec -T --workdir /var/www/public php composer install --no-interaction --prefer-dist ``` 4. **Run the suites:** - * **PHPUnit Unit Tests:** `docker exec -it opencats_test_php ./vendor/bin/phpunit --testsuite UnitTests` - * **PHPUnit Integration Tests:** `docker exec -it opencats_test_php ./vendor/bin/phpunit --testsuite IntegrationTests` - * **Behat:** `docker exec -it opencats_test_php ./vendor/bin/behat -c ./test/behat.yml` + * **PHPUnit Unit Tests:** `docker compose -f docker-compose-test.yml exec php ./vendor/bin/phpunit --testsuite UnitTests` + * **PHPUnit Integration Tests:** `docker compose -f docker-compose-test.yml exec php ./vendor/bin/phpunit --testsuite IntegrationTests` + * **Behat:** `docker compose -f docker-compose-test.yml exec php ./vendor/bin/behat -c ./test/behat.yml` --- From 4dc7c5c30d69e9cd143a322a9aa810e362d9b7e4 Mon Sep 17 00:00:00 2001 From: anonymoususer72041 <247563575+anonymoususer72041@users.noreply.github.com> Date: Wed, 22 Apr 2026 15:30:00 +0200 Subject: [PATCH 05/11] Remove deprecated magic quotes checks --- QueueCLI.php | 14 -------------- ajax.php | 14 -------------- index.php | 30 ------------------------------ lib/Attachments.php | 9 --------- lib/InstallationTests.php | 20 -------------------- modules/import/ImportUI.php | 9 --------- 6 files changed, 96 deletions(-) diff --git a/QueueCLI.php b/QueueCLI.php index bb11e0771..12b7f5fb5 100755 --- a/QueueCLI.php +++ b/QueueCLI.php @@ -55,20 +55,6 @@ @session_name(CATS_SESSION_NAME); session_start(); -/* Make sure we aren't getting screwed over by magic quotes. */ -if (get_magic_quotes_runtime()) -{ - if (function_exists('set_magic_quotes_runtime')) { - set_magic_quotes_runtime(0); - } -} -if (get_magic_quotes_gpc()) -{ - $_GET = array_map('stripslashes', $_GET); - $_POST = array_map('stripslashes', $_POST); - $_REQUEST = array_map('stripslashes', $_REQUEST); -} - if (!isset($_SESSION['CATS']) || empty($_SESSION['CATS'])) { $_SESSION['CATS'] = new CATSSession(); diff --git a/ajax.php b/ajax.php index 2fa9f7a73..6908707c0 100644 --- a/ajax.php +++ b/ajax.php @@ -53,20 +53,6 @@ session_start(); } -/* Make sure we aren't getting screwed over by magic quotes. */ -if (get_magic_quotes_runtime()) -{ - if (function_exists('set_magic_quotes_runtime')) { - set_magic_quotes_runtime(0); - } -} -if (get_magic_quotes_gpc()) -{ - $_GET = array_map('stripslashes', $_GET); - $_POST = array_map('stripslashes', $_POST); - $_REQUEST = array_map('stripslashes', $_REQUEST); -} - if (isset($_SERVER['REQUEST_METHOD']) && $_SERVER['REQUEST_METHOD'] === 'POST' && isset($_SESSION['CATS']) && $_SESSION['CATS']->isLoggedIn()) { diff --git a/index.php b/index.php index 3a37e49e9..fe76ea812 100644 --- a/index.php +++ b/index.php @@ -78,36 +78,6 @@ header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT'); header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); -// This function assures to strip the values from -// request arrays even if as values are arrays not only values -function stripslashes_deep($value) -{ - $value = is_array($value) ? - array_map('stripslashes_deep', $value) : - stripslashes($value); - - return $value; -} - -/* Make sure we aren't getting screwed over by magic quotes. */ -if (get_magic_quotes_runtime()) -{ - if (function_exists('set_magic_quotes_runtime')) { - set_magic_quotes_runtime(0); - } -} -if (get_magic_quotes_gpc()) -{ - include_once(LEGACY_ROOT . '/lib/ArrayUtility.php'); - - $_GET = array_map('stripslashes_deep', $_GET); - $_POST = array_map('stripslashes_deep', $_POST); - $_REQUEST = array_map('stripslashes_deep', $_REQUEST); - $_GET = ArrayUtility::arrayMapKeys('stripslashes_deep', $_GET); - $_POST = ArrayUtility::arrayMapKeys('stripslashes_deep', $_POST); - $_REQUEST = ArrayUtility::arrayMapKeys('stripslashes_deep', $_REQUEST); -} - /* Objects can't be stored in the session if session.auto_start is enabled. */ if (ini_get('session.auto_start') !== '0' && ini_get('session.auto_start') !== 'Off') diff --git a/lib/Attachments.php b/lib/Attachments.php index 8f2bf7a11..90da43d10 100755 --- a/lib/Attachments.php +++ b/lib/Attachments.php @@ -938,15 +938,6 @@ public function createFromUpload($dataItemType, $dataItemID, $fileField, $fileSize = $_FILES[$fileField]['size']; $uploadError = $_FILES[$fileField]['error']; - /* Recover from magic quotes. Note that tmp_name doesn't appear to - * get escaped, and stripslashes() on it breaks on Windows. - Will - */ - if (get_magic_quotes_gpc()) - { - $originalFilename = stripslashes($originalFilename); - $contentType = stripslashes($contentType); - } - /* Did a file upload error occur? */ if ($uploadError != UPLOAD_ERR_OK) { diff --git a/lib/InstallationTests.php b/lib/InstallationTests.php index 8344a675a..3740fee12 100755 --- a/lib/InstallationTests.php +++ b/lib/InstallationTests.php @@ -50,7 +50,6 @@ public static function runCoreTests() $proceed = $proceed && self::printCATSVersion(); $proceed = $proceed && self::checkPHPVersion(); - $proceed = $proceed && self::checkMagicQuotes(); $proceed = $proceed && self::checkRegisterGlobals(); $proceed = $proceed && self::checkSessionAutoStart(); $proceed = $proceed && self::checkMySQLExtension(); @@ -79,11 +78,6 @@ public static function runInstallerTests() $result = false; } - if (!InstallationTests::checkMagicQuotes()) - { - $result = false; - } - if (!InstallationTests::checkRegisterGlobals()) { $result = false; @@ -179,20 +173,6 @@ public static function checkPHPVersion() return false; } - /* magic_quotes_runtime cannot be enabled. */ - public static function checkMagicQuotes() - { - if (!self::DEBUG_FAIL && !get_magic_quotes_runtime()) - { - echo 'PHP.ini: magic_quotes_runtime is disabled.'; - return true; - } - - echo 'PHP.ini: magic_quotes_runtime must be set to Off in php.ini.
' - . 'Check your settings in php.ini.'; - return false; - } - /* Warn if register_globals is on. */ public static function checkRegisterGlobals() { diff --git a/modules/import/ImportUI.php b/modules/import/ImportUI.php index 53ff5a5ba..de563a641 100755 --- a/modules/import/ImportUI.php +++ b/modules/import/ImportUI.php @@ -510,15 +510,6 @@ private function onImport() $fileSize = $_FILES['file']['size']; $fileUploadError = $_FILES['file']['error']; - /* Recover from magic quotes. Note that tmp_name doesn't appear to - * get escaped, and stripslashes() on it breaks on Windows. - Will - */ - if (get_magic_quotes_gpc()) - { - $originalFilename = stripslashes($originalFilename); - $contentType = stripslashes($contentType); - } - if ($fileUploadError != UPLOAD_ERR_OK) { $this->_template->assign( From 52547bcafa67dbb4277303d2e7e7124e75a3f249 Mon Sep 17 00:00:00 2001 From: anonymoususer72041 <247563575+anonymoususer72041@users.noreply.github.com> Date: Wed, 22 Apr 2026 15:30:00 +0200 Subject: [PATCH 06/11] Replace deprecated curly brace offsets --- lib/CATSUtility.php | 4 ++-- lib/artichow/AntiSpam.class.php | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/CATSUtility.php b/lib/CATSUtility.php index 1a308640b..cfa53aa9d 100755 --- a/lib/CATSUtility.php +++ b/lib/CATSUtility.php @@ -105,7 +105,7 @@ public static function getBuild() $data = @file_get_contents('.svn/entries'); /* XML Data? */ - if ($data{0} === '<') + if ($data[0] === '<') { $xml = @simplexml_load_string($data); if (!$xml || !isset($xml->entry[0]['committed-rev'])) @@ -119,7 +119,7 @@ public static function getBuild() /* If the data is not XML, there is a version number at the first * character of the string. We can handle versions 7 and 8. */ - if ((int) $data{0} > 6 && (int) $data{0} < 9) + if ((int) $data[0] > 6 && (int) $data[0] < 9) { /* Return the text between the end of the first "dir" line and * the next linefeed. diff --git a/lib/artichow/AntiSpam.class.php b/lib/artichow/AntiSpam.class.php index bf6394abf..0d9dee637 100755 --- a/lib/artichow/AntiSpam.class.php +++ b/lib/artichow/AntiSpam.class.php @@ -60,7 +60,7 @@ public function setRand($length) { $number = strlen($letters); for($i = 0; $i < $length; $i++) { - $this->string .= $letters{mt_rand(0, $number - 1)}; + $this->string .= $letters[mt_rand(0, $number - 1)]; } return $this->string; @@ -152,7 +152,7 @@ public function draw() { ); $text = new awText( - $this->string{$i}, + $this->string[$i], $font, NULL, mt_rand(-15, 15) From 0093e7b26ef12ac539e7436d71ef647e68a48c53 Mon Sep 17 00:00:00 2001 From: anonymoususer72041 <247563575+anonymoususer72041@users.noreply.github.com> Date: Wed, 22 Apr 2026 15:30:00 +0200 Subject: [PATCH 07/11] Replace deprecated create_function in optional sphinx search --- optional-updates/latest-sphinx-search/Search.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/optional-updates/latest-sphinx-search/Search.php b/optional-updates/latest-sphinx-search/Search.php index 967df387a..c6b49fb5b 100644 --- a/optional-updates/latest-sphinx-search/Search.php +++ b/optional-updates/latest-sphinx-search/Search.php @@ -225,7 +225,7 @@ public static function searchExcerpt($keywords, $text) if (!empty($keywordsWild)) { $regex = implode('|', array_map( - create_function('$string','return preg_quote($string, \'/\');'), $keywordsWild + function ($string) { return preg_quote($string, '/'); }, $keywordsWild )); $text = preg_replace( '/(' . $regex . ')/i', @@ -237,7 +237,7 @@ public static function searchExcerpt($keywords, $text) if (!empty($keywords)) { $regex = implode('|', array_map( - create_function('$string','return preg_quote($string, \'/\');'), $keywords + function ($string) { return preg_quote($string, '/'); }, $keywords )); $text = preg_replace( '/\b(' . $regex . ')\b/i', @@ -298,7 +298,7 @@ public static function makePreview($keywords, $text) if (!empty($keywordsWild)) { $regex = implode('|', array_map( - create_function('$string','return preg_quote($string, \'/\');'), $keywordsWild + function ($string) { return preg_quote($string, '/'); }, $keywordsWild )); $text = preg_replace( '/(' . $regex . ')/i', @@ -310,7 +310,7 @@ public static function makePreview($keywords, $text) if (!empty($keywords)) { $regex = implode('|', array_map( - create_function('$string','return preg_quote($string, \'/\');'), $keywords + function ($string) { return preg_quote($string, '/'); }, $keywords )); $text = preg_replace( '/\b(' . $regex . ')\b/i', From 2142c705ef2e09ef96bd08210cdb6a66ae1bce8e Mon Sep 17 00:00:00 2001 From: anonymoususer72041 <247563575+anonymoususer72041@users.noreply.github.com> Date: Wed, 6 May 2026 09:45:19 +0200 Subject: [PATCH 08/11] Replace deprecated mcrypt usage in Encryption.php --- lib/Encryption.php | 199 +++++++++++++++++++++++++++++++++++++++------ 1 file changed, 173 insertions(+), 26 deletions(-) diff --git a/lib/Encryption.php b/lib/Encryption.php index 799996ae8..e07efe4dc 100755 --- a/lib/Encryption.php +++ b/lib/Encryption.php @@ -37,7 +37,12 @@ */ class Encryption { - private $_td; + private $_cipher = false; + private $_key = ''; + private $_iv = ''; + private $_blockSize = 16; + private $_useZeroPadding = true; + private $_isInitialized = false; public function __construct($key, $algorithm, $mode = 'ecb', $iv = false) @@ -48,55 +53,103 @@ public function __construct($key, $algorithm, $mode = 'ecb', $iv = false) return false; } - /* Try to open the encryption module. */ - $this->_td = mcrypt_module_open($algorithm, '', $mode, ''); - if ($this->_td === false) + /* Resolve the requested mcrypt algorithm/mode to an OpenSSL cipher. */ + $cipher = $this->_resolveCipher($algorithm, $mode); + if ($cipher === false) { return false; } - /* Use UNIX random number generator if available. */ - if (strstr(PHP_OS, 'WIN') !== false) + $ivLength = openssl_cipher_iv_length($cipher); + if ($ivLength === false) { - $randomSeed = MCRYPT_RAND; + return false; + } + + if (strtolower((string) $mode) === 'ecb' || $ivLength === 0) + { + $iv = ''; } else { - $randomSeed = MCRYPT_DEV_RANDOM; + $iv = substr((string) $iv, 0, $ivLength); + if (strlen($iv) < $ivLength) + { + $iv = str_pad($iv, $ivLength, "\0"); + } } - /* If an initialization vector was not specified, create one; - * otherwise ensure that the specified IV is the proper size. - */ - if ($iv === false) + $keyLength = $this->_resolveKeyLength($cipher); + if ($keyLength > 0) { - $iv = mcrypt_create_iv( - mcrypt_enc_get_iv_size($this->_td), $randomSeed - ); + $key = substr((string) $key, 0, $keyLength); } else { - $iv = substr($iv, 0, mcrypt_enc_get_iv_size($this->_td)); + $key = (string) $key; } - /* Trim the key to the maximum allowed key size. */ - $key = substr($key, 0, mcrypt_enc_get_key_size($this->_td)); - - /* Initialize the MCrypt library. */ - mcrypt_generic_init($this->_td, $key, $iv); + $this->_cipher = $cipher; + $this->_key = $key; + $this->_iv = $iv; + $this->_blockSize = $this->_resolveBlockSize($cipher); + $this->_useZeroPadding = $this->_shouldUseZeroPadding($mode); + $this->_isInitialized = true; } public function encrypt($plainText) { + if (!$this->_isInitialized) + { + return false; + } + + /* mcrypt used zero-padding for block ciphers. */ + if ($this->_useZeroPadding && $this->_blockSize > 1) + { + $paddingLength = strlen((string) $plainText) % $this->_blockSize; + if ($paddingLength !== 0) + { + $plainText .= str_repeat("\0", $this->_blockSize - $paddingLength); + } + } + /* Base64 encode data to protect special characters. */ - return base64_encode(mcrypt_generic($this->_td, $plainText)); + $encrypted = openssl_encrypt( + (string) $plainText, + $this->_cipher, + $this->_key, + OPENSSL_RAW_DATA | ($this->_useZeroPadding ? OPENSSL_ZERO_PADDING : 0), + $this->_iv + ); + if ($encrypted === false) + { + return false; + } + + return base64_encode($encrypted); } public function decrypt($cypherText) { + if (!$this->_isInitialized) + { + return false; + } + /* Base64-decode the encrypted data and decrypt it. */ - $plainText = mdecrypt_generic($this->_td, base64_decode($cypherText)); + $plainText = openssl_decrypt( + base64_decode((string) $cypherText), + $this->_cipher, + $this->_key, + OPENSSL_RAW_DATA | ($this->_useZeroPadding ? OPENSSL_ZERO_PADDING : 0), + $this->_iv + ); + if ($plainText === false) + { + return false; + } /* Remove any \0 padding. */ return rtrim($plainText, "\0"); @@ -105,9 +158,103 @@ public function decrypt($cypherText) public function __destruct() { - /* Clean up after ourselves. */ - mcrypt_generic_deinit($this->_td); - mcrypt_module_close($this->_td); + $this->_isInitialized = false; + } + + private function _resolveCipher($algorithm, $mode) + { + $algorithm = strtolower(str_replace('_', '-', (string) $algorithm)); + $mode = strtolower((string) $mode); + + if ($mode == 'nofb') + { + $mode = 'ofb'; + } + elseif ($mode == 'ncfb') + { + $mode = 'cfb'; + } + + /* Only map algorithms that are safely equivalent in OpenSSL. */ + if ($algorithm == 'rijndael-128') + { + $algorithm = 'aes-128'; + } + elseif ($algorithm == 'rijndael-192') + { + /* mcrypt rijndael-192 is not equivalent to AES-192. */ + return false; + } + elseif ($algorithm == 'rijndael-256') + { + /* mcrypt rijndael-256 is not equivalent to AES-256. */ + return false; + } + elseif ($algorithm == 'tripledes' || $algorithm == '3des') + { + $algorithm = 'des-ede3'; + } + elseif ($algorithm == 'blowfish') + { + $algorithm = 'bf'; + } + + $ciphers = openssl_get_cipher_methods(); + $candidate = $algorithm . '-' . $mode; + if (in_array($candidate, $ciphers)) + { + return $candidate; + } + + if (in_array($algorithm, $ciphers)) + { + return $algorithm; + } + + return false; + } + + private function _resolveKeyLength($cipher) + { + if (strpos($cipher, 'aes-128-') === 0) + { + return 16; + } + if (strpos($cipher, 'aes-192-') === 0) + { + return 24; + } + if (strpos($cipher, 'aes-256-') === 0) + { + return 32; + } + if (strpos($cipher, 'des-ede3-') === 0) + { + return 24; + } + if (strpos($cipher, 'des-') === 0) + { + return 8; + } + + return 0; + } + + private function _resolveBlockSize($cipher) + { + if (strpos($cipher, 'des-') === 0 || strpos($cipher, 'bf-') === 0) + { + return 8; + } + + return 16; + } + + private function _shouldUseZeroPadding($mode) + { + $mode = strtolower((string) $mode); + + return ($mode == 'ecb' || $mode == 'cbc'); } } From 7dfbb8a1259919ae71926ebc7a0fa135e349883e Mon Sep 17 00:00:00 2001 From: anonymoususer72041 <247563575+anonymoususer72041@users.noreply.github.com> Date: Wed, 6 May 2026 09:24:18 +0200 Subject: [PATCH 09/11] Fix deprecated implode argument order in DataGrid --- lib/DataGrid.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/DataGrid.php b/lib/DataGrid.php index e19f45c5a..9f03a1215 100755 --- a/lib/DataGrid.php +++ b/lib/DataGrid.php @@ -1352,14 +1352,14 @@ private function _getData() if (count($selectSQL) > 0) { - $selectSQL = '' . implode($selectSQL, ','."\n"); + $selectSQL = '' . implode(','."\n", $selectSQL); } else { $selectSQL = '0 as __nothing'; } - $joinSQL = implode($joinSQL, "\n"); + $joinSQL = implode("\n", $joinSQL); if ($this->_parameters['maxResults'] != -1) { if ($this->_parameters['rangeStart'] < 0) @@ -1388,8 +1388,8 @@ private function _getData() $limitSQL = ''; } - $whereSQL = implode($whereSQL, ' AND '."\n"); - $havingSQL = implode($havingSQL, ' AND '."\n"); + $whereSQL = implode(' AND '."\n", $whereSQL); + $havingSQL = implode(' AND '."\n", $havingSQL); $orderSQL = 'ORDER BY ' . $this->_parameters['sortBy'] . ' ' . $this->_parameters['sortDirection']; $sql = $this->getSQL($selectSQL, $joinSQL, $whereSQL, $havingSQL, $orderSQL, $limitSQL); From 4ad5b239847bcf22a30e36f1a8a44c28582ccc0b Mon Sep 17 00:00:00 2001 From: anonymoususer72041 <247563575+anonymoususer72041@users.noreply.github.com> Date: Wed, 22 Apr 2026 15:30:00 +0200 Subject: [PATCH 10/11] Raise minimum PHP version in composer to 7.4 --- composer.json | 2 +- composer.lock | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/composer.json b/composer.json index 0f9a2d0b2..9c41c7f4f 100644 --- a/composer.json +++ b/composer.json @@ -3,7 +3,7 @@ "description": "Free and open source candidate/applicant tracking system for recruiters.", "type": "project", "require": { - "php": ">=7.2", + "php": "^7.4", "ckeditor/ckeditor": "^4.25.1", "neutron/sphinxsearch-api": "^2.0.8", "phpmailer/phpmailer": "^7.0.2", diff --git a/composer.lock b/composer.lock index 8f2bfb7f7..d65a6c37a 100644 --- a/composer.lock +++ b/composer.lock @@ -3715,7 +3715,7 @@ "prefer-stable": false, "prefer-lowest": false, "platform": { - "php": ">=7.2" + "php": "^7.4" }, "platform-dev": {}, "plugin-api-version": "2.9.0" From 7e292acdf235d0fa7d8b7693889f582f2252baad Mon Sep 17 00:00:00 2001 From: anonymoususer72041 <247563575+anonymoususer72041@users.noreply.github.com> Date: Fri, 24 Apr 2026 11:33:45 +0200 Subject: [PATCH 11/11] Update Composer dependencies for PHP 7.4 --- composer.json | 4 +- composer.lock | 1572 ++++++++++++++++++++++++++++++++++++------------- 2 files changed, 1151 insertions(+), 425 deletions(-) diff --git a/composer.json b/composer.json index 9c41c7f4f..eeb4da7ea 100644 --- a/composer.json +++ b/composer.json @@ -12,10 +12,10 @@ "require-dev": { "behat/behat": "^3.15.0", "behat/mink": "^1.13.0", - "friends-of-behat/mink-extension": "^2.3.1", + "friends-of-behat/mink-extension": "^2.7.5", "behat/mink-browserkit-driver": "^2.3.0", "behat/mink-selenium2-driver": "^1.7.0", - "phpunit/phpunit": "^8.5.52" + "phpunit/phpunit": "^9.6.34" }, "autoload": { "psr-4": { diff --git a/composer.lock b/composer.lock index d65a6c37a..b6b9dd229 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "74b71e62d63a46a6e0ae814882295c57", + "content-hash": "901e6d048a03e4e220844866e5674905", "packages": [ { "name": "ckeditor/ckeditor", @@ -706,30 +706,30 @@ }, { "name": "friends-of-behat/mink-extension", - "version": "v2.5.0", + "version": "v2.7.5", "source": { "type": "git", "url": "https://github.com/FriendsOfBehat/MinkExtension.git", - "reference": "83119aa70be1f2c63061c29dced9d41775cd9db2" + "reference": "854336030e11983f580f49faad1b49a1238f9846" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/FriendsOfBehat/MinkExtension/zipball/83119aa70be1f2c63061c29dced9d41775cd9db2", - "reference": "83119aa70be1f2c63061c29dced9d41775cd9db2", + "url": "https://api.github.com/repos/FriendsOfBehat/MinkExtension/zipball/854336030e11983f580f49faad1b49a1238f9846", + "reference": "854336030e11983f580f49faad1b49a1238f9846", "shasum": "" }, "require": { "behat/behat": "^3.0.5", "behat/mink": "^1.5", - "php": ">=7.2", - "symfony/config": "^3.4 || ^4.4 || ^5.0" + "php": ">=7.4", + "symfony/config": "^4.4 || ^5.0 || ^6.0 || ^7.0" }, "replace": { "behat/mink-extension": "self.version" }, "require-dev": { - "behat/mink-goutte-driver": "^1.1", - "phpspec/phpspec": "^6.0 || ^7.0" + "behat/mink-goutte-driver": "^1.1 || ^2.0", + "phpspec/phpspec": "^6.0 || ^7.0 || 7.1.x-dev" }, "type": "behat-extension", "extra": { @@ -765,9 +765,10 @@ "web" ], "support": { - "source": "https://github.com/FriendsOfBehat/MinkExtension/tree/v2.5.0" + "issues": "https://github.com/FriendsOfBehat/MinkExtension/issues", + "source": "https://github.com/FriendsOfBehat/MinkExtension/tree/v2.7.5" }, - "time": "2021-01-21T09:27:44+00:00" + "time": "2024-01-11T09:12:02+00:00" }, { "name": "instaclick/php-webdriver", @@ -892,6 +893,64 @@ ], "time": "2025-08-01T08:46:24+00:00" }, + { + "name": "nikic/php-parser", + "version": "v5.7.0", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "dca41cd15c2ac9d055ad70dbfd011130757d1f82" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/dca41cd15c2ac9d055ad70dbfd011130757d1f82", + "reference": "dca41cd15c2ac9d055ad70dbfd011130757d1f82", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "ext-json": "*", + "ext-tokenizer": "*", + "php": ">=7.4" + }, + "require-dev": { + "ircmaxell/php-yacc": "^0.0.7", + "phpunit/phpunit": "^9.0" + }, + "bin": [ + "bin/php-parse" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.x-dev" + } + }, + "autoload": { + "psr-4": { + "PhpParser\\": "lib/PhpParser" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Nikita Popov" + } + ], + "description": "A PHP parser written in PHP", + "keywords": [ + "parser", + "php" + ], + "support": { + "issues": "https://github.com/nikic/PHP-Parser/issues", + "source": "https://github.com/nikic/PHP-Parser/tree/v5.7.0" + }, + "time": "2025-12-06T11:56:16+00:00" + }, { "name": "phar-io/manifest", "version": "2.0.4", @@ -1012,40 +1071,44 @@ }, { "name": "phpunit/php-code-coverage", - "version": "7.0.17", + "version": "9.2.32", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "40a4ed114a4aea5afd6df8d0f0c9cd3033097f66" + "reference": "85402a822d1ecf1db1096959413d35e1c37cf1a5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/40a4ed114a4aea5afd6df8d0f0c9cd3033097f66", - "reference": "40a4ed114a4aea5afd6df8d0f0c9cd3033097f66", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/85402a822d1ecf1db1096959413d35e1c37cf1a5", + "reference": "85402a822d1ecf1db1096959413d35e1c37cf1a5", "shasum": "" }, "require": { "ext-dom": "*", + "ext-libxml": "*", "ext-xmlwriter": "*", - "php": ">=7.2", - "phpunit/php-file-iterator": "^2.0.2", - "phpunit/php-text-template": "^1.2.1", - "phpunit/php-token-stream": "^3.1.3 || ^4.0", - "sebastian/code-unit-reverse-lookup": "^1.0.1", - "sebastian/environment": "^4.2.2", - "sebastian/version": "^2.0.1", - "theseer/tokenizer": "^1.1.3" + "nikic/php-parser": "^4.19.1 || ^5.1.0", + "php": ">=7.3", + "phpunit/php-file-iterator": "^3.0.6", + "phpunit/php-text-template": "^2.0.4", + "sebastian/code-unit-reverse-lookup": "^2.0.3", + "sebastian/complexity": "^2.0.3", + "sebastian/environment": "^5.1.5", + "sebastian/lines-of-code": "^1.0.4", + "sebastian/version": "^3.0.2", + "theseer/tokenizer": "^1.2.3" }, "require-dev": { - "phpunit/phpunit": "^8.2.2" + "phpunit/phpunit": "^9.6" }, "suggest": { - "ext-xdebug": "^2.7.2" + "ext-pcov": "PHP extension that provides line coverage", + "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "7.0-dev" + "dev-main": "9.2.x-dev" } }, "autoload": { @@ -1073,7 +1136,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/7.0.17" + "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.32" }, "funding": [ { @@ -1081,32 +1145,32 @@ "type": "github" } ], - "time": "2024-03-02T06:09:37+00:00" + "time": "2024-08-22T04:23:01+00:00" }, { "name": "phpunit/php-file-iterator", - "version": "2.0.6", + "version": "3.0.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "69deeb8664f611f156a924154985fbd4911eb36b" + "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/69deeb8664f611f156a924154985fbd4911eb36b", - "reference": "69deeb8664f611f156a924154985fbd4911eb36b", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", + "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "^8.5" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0.x-dev" + "dev-master": "3.0-dev" } }, "autoload": { @@ -1133,7 +1197,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", - "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/2.0.6" + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.6" }, "funding": [ { @@ -1141,26 +1205,38 @@ "type": "github" } ], - "time": "2024-03-01T13:39:50+00:00" + "time": "2021-12-02T12:48:52+00:00" }, { - "name": "phpunit/php-text-template", - "version": "1.2.1", + "name": "phpunit/php-invoker", + "version": "3.1.1", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/php-text-template.git", - "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686" + "url": "https://github.com/sebastianbergmann/php-invoker.git", + "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686", - "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67", + "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": ">=7.3" + }, + "require-dev": { + "ext-pcntl": "*", + "phpunit/phpunit": "^9.3" + }, + "suggest": { + "ext-pcntl": "*" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + } + }, "autoload": { "classmap": [ "src/" @@ -1177,41 +1253,47 @@ "role": "lead" } ], - "description": "Simple template engine.", - "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "description": "Invoke callables with a timeout", + "homepage": "https://github.com/sebastianbergmann/php-invoker/", "keywords": [ - "template" + "process" ], "support": { - "issues": "https://github.com/sebastianbergmann/php-text-template/issues", - "source": "https://github.com/sebastianbergmann/php-text-template/tree/1.2.1" + "issues": "https://github.com/sebastianbergmann/php-invoker/issues", + "source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1" }, - "time": "2015-06-21T13:50:34+00:00" + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T05:58:55+00:00" }, { - "name": "phpunit/php-timer", - "version": "2.1.4", + "name": "phpunit/php-text-template", + "version": "2.0.4", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "a691211e94ff39a34811abd521c31bd5b305b0bb" + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/a691211e94ff39a34811abd521c31bd5b305b0bb", - "reference": "a691211e94ff39a34811abd521c31bd5b305b0bb", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", + "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "^8.5" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.1-dev" + "dev-master": "2.0-dev" } }, "autoload": { @@ -1230,14 +1312,14 @@ "role": "lead" } ], - "description": "Utility class for timing", - "homepage": "https://github.com/sebastianbergmann/php-timer/", + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", "keywords": [ - "timer" + "template" ], "support": { - "issues": "https://github.com/sebastianbergmann/php-timer/issues", - "source": "https://github.com/sebastianbergmann/php-timer/tree/2.1.4" + "issues": "https://github.com/sebastianbergmann/php-text-template/issues", + "source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4" }, "funding": [ { @@ -1245,33 +1327,32 @@ "type": "github" } ], - "time": "2024-03-01T13:42:41+00:00" + "time": "2020-10-26T05:33:50+00:00" }, { - "name": "phpunit/php-token-stream", - "version": "3.1.3", + "name": "phpunit/php-timer", + "version": "5.0.3", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/php-token-stream.git", - "reference": "9c1da83261628cb24b6a6df371b6e312b3954768" + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/9c1da83261628cb24b6a6df371b6e312b3954768", - "reference": "9c1da83261628cb24b6a6df371b6e312b3954768", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", + "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", "shasum": "" }, "require": { - "ext-tokenizer": "*", - "php": ">=7.1" + "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "^7.0" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.1-dev" + "dev-master": "5.0-dev" } }, "autoload": { @@ -1286,17 +1367,18 @@ "authors": [ { "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" + "email": "sebastian@phpunit.de", + "role": "lead" } ], - "description": "Wrapper around PHP's tokenizer extension.", - "homepage": "https://github.com/sebastianbergmann/php-token-stream/", + "description": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", "keywords": [ - "tokenizer" + "timer" ], "support": { - "issues": "https://github.com/sebastianbergmann/php-token-stream/issues", - "source": "https://github.com/sebastianbergmann/php-token-stream/tree/3.1.3" + "issues": "https://github.com/sebastianbergmann/php-timer/issues", + "source": "https://github.com/sebastianbergmann/php-timer/tree/5.0.3" }, "funding": [ { @@ -1304,25 +1386,24 @@ "type": "github" } ], - "abandoned": true, - "time": "2021-07-26T12:15:06+00:00" + "time": "2020-10-26T13:16:10+00:00" }, { "name": "phpunit/phpunit", - "version": "8.5.52", + "version": "9.6.34", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "1015741814413c156abb0f53d7db7bbd03c6e858" + "reference": "b36f02317466907a230d3aa1d34467041271ef4a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/1015741814413c156abb0f53d7db7bbd03c6e858", - "reference": "1015741814413c156abb0f53d7db7bbd03c6e858", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/b36f02317466907a230d3aa1d34467041271ef4a", + "reference": "b36f02317466907a230d3aa1d34467041271ef4a", "shasum": "" }, "require": { - "doctrine/instantiator": "^1.5.0", + "doctrine/instantiator": "^1.5.0 || ^2", "ext-dom": "*", "ext-json": "*", "ext-libxml": "*", @@ -1332,25 +1413,27 @@ "myclabs/deep-copy": "^1.13.4", "phar-io/manifest": "^2.0.4", "phar-io/version": "^3.2.1", - "php": ">=7.2", - "phpunit/php-code-coverage": "^7.0.17", - "phpunit/php-file-iterator": "^2.0.6", - "phpunit/php-text-template": "^1.2.1", - "phpunit/php-timer": "^2.1.4", - "sebastian/comparator": "^3.0.7", - "sebastian/diff": "^3.0.6", - "sebastian/environment": "^4.2.5", - "sebastian/exporter": "^3.1.8", - "sebastian/global-state": "^3.0.6", - "sebastian/object-enumerator": "^3.0.5", - "sebastian/resource-operations": "^2.0.3", - "sebastian/type": "^1.1.5", - "sebastian/version": "^2.0.1" + "php": ">=7.3", + "phpunit/php-code-coverage": "^9.2.32", + "phpunit/php-file-iterator": "^3.0.6", + "phpunit/php-invoker": "^3.1.1", + "phpunit/php-text-template": "^2.0.4", + "phpunit/php-timer": "^5.0.3", + "sebastian/cli-parser": "^1.0.2", + "sebastian/code-unit": "^1.0.8", + "sebastian/comparator": "^4.0.10", + "sebastian/diff": "^4.0.6", + "sebastian/environment": "^5.1.5", + "sebastian/exporter": "^4.0.8", + "sebastian/global-state": "^5.0.8", + "sebastian/object-enumerator": "^4.0.4", + "sebastian/resource-operations": "^3.0.4", + "sebastian/type": "^3.2.1", + "sebastian/version": "^3.0.2" }, "suggest": { "ext-soap": "To be able to generate mocks based on WSDL files", - "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage", - "phpunit/php-invoker": "To allow enforcing time limits" + "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" }, "bin": [ "phpunit" @@ -1358,10 +1441,13 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "8.5-dev" + "dev-master": "9.6-dev" } }, "autoload": { + "files": [ + "src/Framework/Assert/Functions.php" + ], "classmap": [ "src/" ] @@ -1387,7 +1473,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/8.5.52" + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.34" }, "funding": [ { @@ -1411,24 +1497,24 @@ "type": "tidelift" } ], - "time": "2026-01-27T05:20:18+00:00" + "time": "2026-01-27T05:45:00+00:00" }, { "name": "psr/container", - "version": "1.1.1", + "version": "1.1.2", "source": { "type": "git", "url": "https://github.com/php-fig/container.git", - "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf" + "reference": "513e0666f7216c7459170d56df27dfcefe1689ea" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/container/zipball/8622567409010282b7aeebe4bb841fe98b58dcaf", - "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf", + "url": "https://api.github.com/repos/php-fig/container/zipball/513e0666f7216c7459170d56df27dfcefe1689ea", + "reference": "513e0666f7216c7459170d56df27dfcefe1689ea", "shasum": "" }, "require": { - "php": ">=7.2.0" + "php": ">=7.4.0" }, "type": "library", "autoload": { @@ -1457,34 +1543,196 @@ ], "support": { "issues": "https://github.com/php-fig/container/issues", - "source": "https://github.com/php-fig/container/tree/1.1.1" + "source": "https://github.com/php-fig/container/tree/1.1.2" + }, + "time": "2021-11-05T16:50:12+00:00" + }, + { + "name": "psr/event-dispatcher", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/event-dispatcher.git", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\EventDispatcher\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Standard interfaces for event handling.", + "keywords": [ + "events", + "psr", + "psr-14" + ], + "support": { + "issues": "https://github.com/php-fig/event-dispatcher/issues", + "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" + }, + "time": "2019-01-08T18:20:26+00:00" + }, + { + "name": "sebastian/cli-parser", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/cli-parser.git", + "reference": "2b56bea83a09de3ac06bb18b92f068e60cc6f50b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/2b56bea83a09de3ac06bb18b92f068e60cc6f50b", + "reference": "2b56bea83a09de3ac06bb18b92f068e60cc6f50b", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.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": "Library for parsing CLI options", + "homepage": "https://github.com/sebastianbergmann/cli-parser", + "support": { + "issues": "https://github.com/sebastianbergmann/cli-parser/issues", + "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-02T06:27:43+00:00" + }, + { + "name": "sebastian/code-unit", + "version": "1.0.8", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit.git", + "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/1fc9f64c0927627ef78ba436c9b17d967e68e120", + "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.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": "Collection of value objects that represent the PHP code units", + "homepage": "https://github.com/sebastianbergmann/code-unit", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit/issues", + "source": "https://github.com/sebastianbergmann/code-unit/tree/1.0.8" }, - "time": "2021-03-05T17:36:06+00:00" + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:08:54+00:00" }, { "name": "sebastian/code-unit-reverse-lookup", - "version": "1.0.3", + "version": "2.0.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", - "reference": "92a1a52e86d34cde6caa54f1b5ffa9fda18e5d54" + "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/92a1a52e86d34cde6caa54f1b5ffa9fda18e5d54", - "reference": "92a1a52e86d34cde6caa54f1b5ffa9fda18e5d54", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", + "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", "shasum": "" }, "require": { - "php": ">=5.6" + "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "^8.5" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "2.0-dev" } }, "autoload": { @@ -1506,7 +1754,7 @@ "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", "support": { "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", - "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/1.0.3" + "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3" }, "funding": [ { @@ -1514,34 +1762,34 @@ "type": "github" } ], - "time": "2024-03-01T13:45:45+00:00" + "time": "2020-09-28T05:30:19+00:00" }, { "name": "sebastian/comparator", - "version": "3.0.7", + "version": "4.0.10", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "bc7d8ac2fe1cce229bff9b5fd4efe65918a1ff52" + "reference": "e4df00b9b3571187db2831ae9aada2c6efbd715d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/bc7d8ac2fe1cce229bff9b5fd4efe65918a1ff52", - "reference": "bc7d8ac2fe1cce229bff9b5fd4efe65918a1ff52", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/e4df00b9b3571187db2831ae9aada2c6efbd715d", + "reference": "e4df00b9b3571187db2831ae9aada2c6efbd715d", "shasum": "" }, "require": { - "php": ">=7.1", - "sebastian/diff": "^3.0", - "sebastian/exporter": "^3.1" + "php": ">=7.3", + "sebastian/diff": "^4.0", + "sebastian/exporter": "^4.0" }, "require-dev": { - "phpunit/phpunit": "^8.5" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-master": "4.0-dev" } }, "autoload": { @@ -1580,7 +1828,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/comparator/issues", - "source": "https://github.com/sebastianbergmann/comparator/tree/3.0.7" + "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.10" }, "funding": [ { @@ -1600,33 +1848,90 @@ "type": "tidelift" } ], - "time": "2026-01-24T09:20:25+00:00" + "time": "2026-01-24T09:22:56+00:00" + }, + { + "name": "sebastian/complexity", + "version": "2.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/complexity.git", + "reference": "25f207c40d62b8b7aa32f5ab026c53561964053a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/25f207c40d62b8b7aa32f5ab026c53561964053a", + "reference": "25f207c40d62b8b7aa32f5ab026c53561964053a", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.18 || ^5.0", + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.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": "Library for calculating the complexity of PHP code units", + "homepage": "https://github.com/sebastianbergmann/complexity", + "support": { + "issues": "https://github.com/sebastianbergmann/complexity/issues", + "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-12-22T06:19:30+00:00" }, { "name": "sebastian/diff", - "version": "3.0.6", + "version": "4.0.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "98ff311ca519c3aa73ccd3de053bdb377171d7b6" + "reference": "ba01945089c3a293b01ba9badc29ad55b106b0bc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/98ff311ca519c3aa73ccd3de053bdb377171d7b6", - "reference": "98ff311ca519c3aa73ccd3de053bdb377171d7b6", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/ba01945089c3a293b01ba9badc29ad55b106b0bc", + "reference": "ba01945089c3a293b01ba9badc29ad55b106b0bc", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "^7.5 || ^8.0", - "symfony/process": "^2 || ^3.3 || ^4" + "phpunit/phpunit": "^9.3", + "symfony/process": "^4.2 || ^5" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-master": "4.0-dev" } }, "autoload": { @@ -1658,7 +1963,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/diff/issues", - "source": "https://github.com/sebastianbergmann/diff/tree/3.0.6" + "source": "https://github.com/sebastianbergmann/diff/tree/4.0.6" }, "funding": [ { @@ -1666,27 +1971,27 @@ "type": "github" } ], - "time": "2024-03-02T06:16:36+00:00" + "time": "2024-03-02T06:30:58+00:00" }, { "name": "sebastian/environment", - "version": "4.2.5", + "version": "5.1.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "56932f6049a0482853056ffd617c91ffcc754205" + "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/56932f6049a0482853056ffd617c91ffcc754205", - "reference": "56932f6049a0482853056ffd617c91ffcc754205", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/830c43a844f1f8d5b7a1f6d6076b784454d8b7ed", + "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "^7.5" + "phpunit/phpunit": "^9.3" }, "suggest": { "ext-posix": "*" @@ -1694,7 +1999,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.2-dev" + "dev-master": "5.1-dev" } }, "autoload": { @@ -1721,7 +2026,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/environment/issues", - "source": "https://github.com/sebastianbergmann/environment/tree/4.2.5" + "source": "https://github.com/sebastianbergmann/environment/tree/5.1.5" }, "funding": [ { @@ -1729,34 +2034,34 @@ "type": "github" } ], - "time": "2024-03-01T13:49:59+00:00" + "time": "2023-02-03T06:03:51+00:00" }, { "name": "sebastian/exporter", - "version": "3.1.8", + "version": "4.0.8", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "64cfeaa341951ceb2019d7b98232399d57bb2296" + "reference": "14c6ba52f95a36c3d27c835d65efc7123c446e8c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/64cfeaa341951ceb2019d7b98232399d57bb2296", - "reference": "64cfeaa341951ceb2019d7b98232399d57bb2296", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/14c6ba52f95a36c3d27c835d65efc7123c446e8c", + "reference": "14c6ba52f95a36c3d27c835d65efc7123c446e8c", "shasum": "" }, "require": { - "php": ">=7.2", - "sebastian/recursion-context": "^3.0" + "php": ">=7.3", + "sebastian/recursion-context": "^4.0" }, "require-dev": { "ext-mbstring": "*", - "phpunit/phpunit": "^8.5" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.1.x-dev" + "dev-master": "4.0-dev" } }, "autoload": { @@ -1791,14 +2096,14 @@ } ], "description": "Provides the functionality to export PHP variables for visualization", - "homepage": "http://www.github.com/sebastianbergmann/exporter", + "homepage": "https://www.github.com/sebastianbergmann/exporter", "keywords": [ "export", "exporter" ], "support": { "issues": "https://github.com/sebastianbergmann/exporter/issues", - "source": "https://github.com/sebastianbergmann/exporter/tree/3.1.8" + "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.8" }, "funding": [ { @@ -1818,30 +2123,30 @@ "type": "tidelift" } ], - "time": "2025-09-24T05:55:14+00:00" + "time": "2025-09-24T06:03:27+00:00" }, { "name": "sebastian/global-state", - "version": "3.0.6", + "version": "5.0.8", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "800689427e3e8cf57a8fe38fcd1d4344c9b2f046" + "reference": "b6781316bdcd28260904e7cc18ec983d0d2ef4f6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/800689427e3e8cf57a8fe38fcd1d4344c9b2f046", - "reference": "800689427e3e8cf57a8fe38fcd1d4344c9b2f046", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/b6781316bdcd28260904e7cc18ec983d0d2ef4f6", + "reference": "b6781316bdcd28260904e7cc18ec983d0d2ef4f6", "shasum": "" }, "require": { - "php": ">=7.2", - "sebastian/object-reflector": "^1.1.1", - "sebastian/recursion-context": "^3.0" + "php": ">=7.3", + "sebastian/object-reflector": "^2.0", + "sebastian/recursion-context": "^4.0" }, "require-dev": { "ext-dom": "*", - "phpunit/phpunit": "^8.0" + "phpunit/phpunit": "^9.3" }, "suggest": { "ext-uopz": "*" @@ -1849,7 +2154,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-master": "5.0-dev" } }, "autoload": { @@ -1874,7 +2179,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/global-state/issues", - "source": "https://github.com/sebastianbergmann/global-state/tree/3.0.6" + "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.8" }, "funding": [ { @@ -1894,34 +2199,91 @@ "type": "tidelift" } ], - "time": "2025-08-10T05:40:12+00:00" + "time": "2025-08-10T07:10:35+00:00" + }, + { + "name": "sebastian/lines-of-code", + "version": "1.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/lines-of-code.git", + "reference": "e1e4a170560925c26d424b6a03aed157e7dcc5c5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/e1e4a170560925c26d424b6a03aed157e7dcc5c5", + "reference": "e1e4a170560925c26d424b6a03aed157e7dcc5c5", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.18 || ^5.0", + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.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": "Library for counting the lines of code in PHP source code", + "homepage": "https://github.com/sebastianbergmann/lines-of-code", + "support": { + "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-12-22T06:20:34+00:00" }, { "name": "sebastian/object-enumerator", - "version": "3.0.5", + "version": "4.0.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-enumerator.git", - "reference": "ac5b293dba925751b808e02923399fb44ff0d541" + "reference": "5c9eeac41b290a3712d88851518825ad78f45c71" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/ac5b293dba925751b808e02923399fb44ff0d541", - "reference": "ac5b293dba925751b808e02923399fb44ff0d541", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71", + "reference": "5c9eeac41b290a3712d88851518825ad78f45c71", "shasum": "" }, "require": { - "php": ">=7.0", - "sebastian/object-reflector": "^1.1.1", - "sebastian/recursion-context": "^3.0" + "php": ">=7.3", + "sebastian/object-reflector": "^2.0", + "sebastian/recursion-context": "^4.0" }, "require-dev": { - "phpunit/phpunit": "^6.0" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0.x-dev" + "dev-master": "4.0-dev" } }, "autoload": { @@ -1943,7 +2305,7 @@ "homepage": "https://github.com/sebastianbergmann/object-enumerator/", "support": { "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", - "source": "https://github.com/sebastianbergmann/object-enumerator/tree/3.0.5" + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/4.0.4" }, "funding": [ { @@ -1951,32 +2313,32 @@ "type": "github" } ], - "time": "2024-03-01T13:54:02+00:00" + "time": "2020-10-26T13:12:34+00:00" }, { "name": "sebastian/object-reflector", - "version": "1.1.3", + "version": "2.0.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-reflector.git", - "reference": "1d439c229e61f244ff1f211e5c99737f90c67def" + "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/1d439c229e61f244ff1f211e5c99737f90c67def", - "reference": "1d439c229e61f244ff1f211e5c99737f90c67def", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", + "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", "shasum": "" }, "require": { - "php": ">=7.0" + "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "^6.0" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.1-dev" + "dev-master": "2.0-dev" } }, "autoload": { @@ -1998,7 +2360,7 @@ "homepage": "https://github.com/sebastianbergmann/object-reflector/", "support": { "issues": "https://github.com/sebastianbergmann/object-reflector/issues", - "source": "https://github.com/sebastianbergmann/object-reflector/tree/1.1.3" + "source": "https://github.com/sebastianbergmann/object-reflector/tree/2.0.4" }, "funding": [ { @@ -2006,32 +2368,32 @@ "type": "github" } ], - "time": "2024-03-01T13:56:04+00:00" + "time": "2020-10-26T13:14:26+00:00" }, { "name": "sebastian/recursion-context", - "version": "3.0.3", + "version": "4.0.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "8fe7e75986a9d24b4cceae847314035df7703a5a" + "reference": "539c6691e0623af6dc6f9c20384c120f963465a0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/8fe7e75986a9d24b4cceae847314035df7703a5a", - "reference": "8fe7e75986a9d24b4cceae847314035df7703a5a", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/539c6691e0623af6dc6f9c20384c120f963465a0", + "reference": "539c6691e0623af6dc6f9c20384c120f963465a0", "shasum": "" }, "require": { - "php": ">=7.0" + "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "^6.0" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0.x-dev" + "dev-master": "4.0-dev" } }, "autoload": { @@ -2058,10 +2420,10 @@ } ], "description": "Provides functionality to recursively process PHP variables", - "homepage": "http://www.github.com/sebastianbergmann/recursion-context", + "homepage": "https://github.com/sebastianbergmann/recursion-context", "support": { "issues": "https://github.com/sebastianbergmann/recursion-context/issues", - "source": "https://github.com/sebastianbergmann/recursion-context/tree/3.0.3" + "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.6" }, "funding": [ { @@ -2081,29 +2443,32 @@ "type": "tidelift" } ], - "time": "2025-08-10T05:25:53+00:00" + "time": "2025-08-10T06:57:39+00:00" }, { "name": "sebastian/resource-operations", - "version": "2.0.3", + "version": "3.0.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/resource-operations.git", - "reference": "72a7f7674d053d548003b16ff5a106e7e0e06eee" + "reference": "05d5692a7993ecccd56a03e40cd7e5b09b1d404e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/72a7f7674d053d548003b16ff5a106e7e0e06eee", - "reference": "72a7f7674d053d548003b16ff5a106e7e0e06eee", + "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/05d5692a7993ecccd56a03e40cd7e5b09b1d404e", + "reference": "05d5692a7993ecccd56a03e40cd7e5b09b1d404e", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0-dev" + "dev-main": "3.0-dev" } }, "autoload": { @@ -2124,7 +2489,7 @@ "description": "Provides a list of PHP built-in functions that operate on resources", "homepage": "https://www.github.com/sebastianbergmann/resource-operations", "support": { - "source": "https://github.com/sebastianbergmann/resource-operations/tree/2.0.3" + "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.4" }, "funding": [ { @@ -2132,32 +2497,32 @@ "type": "github" } ], - "time": "2024-03-01T13:59:09+00:00" + "time": "2024-03-14T16:00:52+00:00" }, { "name": "sebastian/type", - "version": "1.1.5", + "version": "3.2.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/type.git", - "reference": "18f071c3a29892b037d35e6b20ddf3ea39b42874" + "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/18f071c3a29892b037d35e6b20ddf3ea39b42874", - "reference": "18f071c3a29892b037d35e6b20ddf3ea39b42874", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7", + "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7", "shasum": "" }, "require": { - "php": ">=7.2" + "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "^8.2" + "phpunit/phpunit": "^9.5" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.1-dev" + "dev-master": "3.2-dev" } }, "autoload": { @@ -2180,7 +2545,7 @@ "homepage": "https://github.com/sebastianbergmann/type", "support": { "issues": "https://github.com/sebastianbergmann/type/issues", - "source": "https://github.com/sebastianbergmann/type/tree/1.1.5" + "source": "https://github.com/sebastianbergmann/type/tree/3.2.1" }, "funding": [ { @@ -2188,29 +2553,29 @@ "type": "github" } ], - "time": "2024-03-01T14:04:07+00:00" + "time": "2023-02-03T06:13:03+00:00" }, { "name": "sebastian/version", - "version": "2.0.1", + "version": "3.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/version.git", - "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019" + "reference": "c6c1022351a901512170118436c764e473f6de8c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019", - "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c", + "reference": "c6c1022351a901512170118436c764e473f6de8c", "shasum": "" }, "require": { - "php": ">=5.6" + "php": ">=7.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0.x-dev" + "dev-master": "3.0-dev" } }, "autoload": { @@ -2233,34 +2598,40 @@ "homepage": "https://github.com/sebastianbergmann/version", "support": { "issues": "https://github.com/sebastianbergmann/version/issues", - "source": "https://github.com/sebastianbergmann/version/tree/master" + "source": "https://github.com/sebastianbergmann/version/tree/3.0.2" }, - "time": "2016-10-03T07:35:21+00:00" + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T06:39:44+00:00" }, { "name": "symfony/browser-kit", - "version": "v4.4.44", + "version": "v5.4.45", "source": { "type": "git", "url": "https://github.com/symfony/browser-kit.git", - "reference": "2a1ff40723ef6b29c8229a860a9c8f815ad7dbbb" + "reference": "03cce39764429e07fbab9b989a1182a24578341d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/browser-kit/zipball/2a1ff40723ef6b29c8229a860a9c8f815ad7dbbb", - "reference": "2a1ff40723ef6b29c8229a860a9c8f815ad7dbbb", + "url": "https://api.github.com/repos/symfony/browser-kit/zipball/03cce39764429e07fbab9b989a1182a24578341d", + "reference": "03cce39764429e07fbab9b989a1182a24578341d", "shasum": "" }, "require": { - "php": ">=7.1.3", - "symfony/dom-crawler": "^3.4|^4.0|^5.0", + "php": ">=7.2.5", + "symfony/dom-crawler": "^4.4|^5.0|^6.0", "symfony/polyfill-php80": "^1.16" }, "require-dev": { - "symfony/css-selector": "^3.4|^4.0|^5.0", - "symfony/http-client": "^4.3|^5.0", - "symfony/mime": "^4.3|^5.0", - "symfony/process": "^3.4|^4.0|^5.0" + "symfony/css-selector": "^4.4|^5.0|^6.0", + "symfony/http-client": "^4.4|^5.0|^6.0", + "symfony/mime": "^4.4|^5.0|^6.0", + "symfony/process": "^4.4|^5.0|^6.0" }, "suggest": { "symfony/process": "" @@ -2291,7 +2662,7 @@ "description": "Simulates the behavior of a web browser, allowing you to make requests, click on links and submit forms programmatically", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/browser-kit/tree/v4.4.44" + "source": "https://github.com/symfony/browser-kit/tree/v5.4.45" }, "funding": [ { @@ -2307,38 +2678,39 @@ "type": "tidelift" } ], - "time": "2022-07-25T12:56:14+00:00" + "time": "2024-10-22T13:05:35+00:00" }, { "name": "symfony/config", - "version": "v4.4.44", + "version": "v5.4.46", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "ed42f8f9da528d2c6cae36fe1f380b0c1d8f0658" + "reference": "977c88a02d7d3f16904a81907531b19666a08e78" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/ed42f8f9da528d2c6cae36fe1f380b0c1d8f0658", - "reference": "ed42f8f9da528d2c6cae36fe1f380b0c1d8f0658", + "url": "https://api.github.com/repos/symfony/config/zipball/977c88a02d7d3f16904a81907531b19666a08e78", + "reference": "977c88a02d7d3f16904a81907531b19666a08e78", "shasum": "" }, "require": { - "php": ">=7.1.3", - "symfony/filesystem": "^3.4|^4.0|^5.0", + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/filesystem": "^4.4|^5.0|^6.0", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-php80": "^1.16", "symfony/polyfill-php81": "^1.22" }, "conflict": { - "symfony/finder": "<3.4" + "symfony/finder": "<4.4" }, "require-dev": { - "symfony/event-dispatcher": "^3.4|^4.0|^5.0", - "symfony/finder": "^3.4|^4.0|^5.0", - "symfony/messenger": "^4.1|^5.0", - "symfony/service-contracts": "^1.1|^2", - "symfony/yaml": "^3.4|^4.0|^5.0" + "symfony/event-dispatcher": "^4.4|^5.0|^6.0", + "symfony/finder": "^4.4|^5.0|^6.0", + "symfony/messenger": "^4.4|^5.0|^6.0", + "symfony/service-contracts": "^1.1|^2|^3", + "symfony/yaml": "^4.4|^5.0|^6.0" }, "suggest": { "symfony/yaml": "To use the yaml reference dumper" @@ -2369,7 +2741,7 @@ "description": "Helps you find, load, combine, autofill and validate configuration values of any kind", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/config/tree/v4.4.44" + "source": "https://github.com/symfony/config/tree/v5.4.46" }, "funding": [ { @@ -2385,47 +2757,50 @@ "type": "tidelift" } ], - "time": "2022-07-20T09:59:04+00:00" + "time": "2024-10-30T07:58:02+00:00" }, { "name": "symfony/console", - "version": "v4.4.49", + "version": "v5.4.47", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "33fa45ffc81fdcc1ca368d4946da859c8cdb58d9" + "reference": "c4ba980ca61a9eb18ee6bcc73f28e475852bb1ed" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/33fa45ffc81fdcc1ca368d4946da859c8cdb58d9", - "reference": "33fa45ffc81fdcc1ca368d4946da859c8cdb58d9", + "url": "https://api.github.com/repos/symfony/console/zipball/c4ba980ca61a9eb18ee6bcc73f28e475852bb1ed", + "reference": "c4ba980ca61a9eb18ee6bcc73f28e475852bb1ed", "shasum": "" }, "require": { - "php": ">=7.1.3", + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php73": "^1.8", + "symfony/polyfill-php73": "^1.9", "symfony/polyfill-php80": "^1.16", - "symfony/service-contracts": "^1.1|^2" + "symfony/service-contracts": "^1.1|^2|^3", + "symfony/string": "^5.1|^6.0" }, "conflict": { "psr/log": ">=3", - "symfony/dependency-injection": "<3.4", - "symfony/event-dispatcher": "<4.3|>=5", + "symfony/dependency-injection": "<4.4", + "symfony/dotenv": "<5.1", + "symfony/event-dispatcher": "<4.4", "symfony/lock": "<4.4", - "symfony/process": "<3.3" + "symfony/process": "<4.4" }, "provide": { "psr/log-implementation": "1.0|2.0" }, "require-dev": { "psr/log": "^1|^2", - "symfony/config": "^3.4|^4.0|^5.0", - "symfony/dependency-injection": "^3.4|^4.0|^5.0", - "symfony/event-dispatcher": "^4.3", - "symfony/lock": "^4.4|^5.0", - "symfony/process": "^3.4|^4.0|^5.0", - "symfony/var-dumper": "^4.3|^5.0" + "symfony/config": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/event-dispatcher": "^4.4|^5.0|^6.0", + "symfony/lock": "^4.4|^5.0|^6.0", + "symfony/process": "^4.4|^5.0|^6.0", + "symfony/var-dumper": "^4.4|^5.0|^6.0" }, "suggest": { "psr/log": "For using the console logger", @@ -2458,8 +2833,14 @@ ], "description": "Eases the creation of beautiful and testable command line interfaces", "homepage": "https://symfony.com", + "keywords": [ + "cli", + "command-line", + "console", + "terminal" + ], "support": { - "source": "https://github.com/symfony/console/tree/v4.4.49" + "source": "https://github.com/symfony/console/tree/v5.4.47" }, "funding": [ { @@ -2475,24 +2856,24 @@ "type": "tidelift" } ], - "time": "2022-11-05T17:10:16+00:00" + "time": "2024-11-06T11:30:55+00:00" }, { "name": "symfony/css-selector", - "version": "v4.4.44", + "version": "v5.4.45", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "bd0a6737e48de45b4b0b7b6fc98c78404ddceaed" + "reference": "4f7f3c35fba88146b56d0025d20ace3f3901f097" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/bd0a6737e48de45b4b0b7b6fc98c78404ddceaed", - "reference": "bd0a6737e48de45b4b0b7b6fc98c78404ddceaed", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/4f7f3c35fba88146b56d0025d20ace3f3901f097", + "reference": "4f7f3c35fba88146b56d0025d20ace3f3901f097", "shasum": "" }, "require": { - "php": ">=7.1.3", + "php": ">=7.2.5", "symfony/polyfill-php80": "^1.16" }, "type": "library", @@ -2522,10 +2903,99 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Converts CSS selectors to XPath expressions", + "description": "Converts CSS selectors to XPath expressions", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/css-selector/tree/v5.4.45" + }, + "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:11:13+00:00" + }, + { + "name": "symfony/dependency-injection", + "version": "v5.4.48", + "source": { + "type": "git", + "url": "https://github.com/symfony/dependency-injection.git", + "reference": "e5ca16dee39ef7d63e552ff0bf0a2526a1142c92" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/e5ca16dee39ef7d63e552ff0bf0a2526a1142c92", + "reference": "e5ca16dee39ef7d63e552ff0bf0a2526a1142c92", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/container": "^1.1.1", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-php80": "^1.16", + "symfony/polyfill-php81": "^1.22", + "symfony/service-contracts": "^1.1.6|^2" + }, + "conflict": { + "ext-psr": "<1.1|>=2", + "symfony/config": "<5.3", + "symfony/finder": "<4.4", + "symfony/proxy-manager-bridge": "<4.4", + "symfony/yaml": "<4.4.26" + }, + "provide": { + "psr/container-implementation": "1.0", + "symfony/service-implementation": "1.0|2.0" + }, + "require-dev": { + "symfony/config": "^5.3|^6.0", + "symfony/expression-language": "^4.4|^5.0|^6.0", + "symfony/yaml": "^4.4.26|^5.0|^6.0" + }, + "suggest": { + "symfony/config": "", + "symfony/expression-language": "For using expressions in service container configuration", + "symfony/finder": "For using double-star glob patterns or when GLOB_BRACE portability is required", + "symfony/proxy-manager-bridge": "Generate service proxies to lazy load them", + "symfony/yaml": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\DependencyInjection\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Allows you to standardize and centralize the way objects are constructed in your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/css-selector/tree/v4.4.44" + "source": "https://github.com/symfony/dependency-injection/tree/v5.4.48" }, "funding": [ { @@ -2541,57 +3011,38 @@ "type": "tidelift" } ], - "time": "2022-06-27T13:16:42+00:00" + "time": "2024-11-20T10:51:57+00:00" }, { - "name": "symfony/dependency-injection", - "version": "v4.4.49", + "name": "symfony/deprecation-contracts", + "version": "v2.5.4", "source": { "type": "git", - "url": "https://github.com/symfony/dependency-injection.git", - "reference": "9065fe97dbd38a897e95ea254eb5ddfe1310f734" + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "605389f2a7e5625f273b53960dc46aeaf9c62918" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/9065fe97dbd38a897e95ea254eb5ddfe1310f734", - "reference": "9065fe97dbd38a897e95ea254eb5ddfe1310f734", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/605389f2a7e5625f273b53960dc46aeaf9c62918", + "reference": "605389f2a7e5625f273b53960dc46aeaf9c62918", "shasum": "" }, "require": { - "php": ">=7.1.3", - "psr/container": "^1.0", - "symfony/polyfill-php80": "^1.16", - "symfony/service-contracts": "^1.1.6|^2" - }, - "conflict": { - "symfony/config": "<4.3|>=5.0", - "symfony/finder": "<3.4", - "symfony/proxy-manager-bridge": "<3.4", - "symfony/yaml": "<4.4.26" - }, - "provide": { - "psr/container-implementation": "1.0", - "symfony/service-implementation": "1.0|2.0" - }, - "require-dev": { - "symfony/config": "^4.3", - "symfony/expression-language": "^3.4|^4.0|^5.0", - "symfony/yaml": "^4.4.26|^5.0" - }, - "suggest": { - "symfony/config": "", - "symfony/expression-language": "For using expressions in service container configuration", - "symfony/finder": "For using double-star glob patterns or when GLOB_BRACE portability is required", - "symfony/proxy-manager-bridge": "Generate service proxies to lazy load them", - "symfony/yaml": "" + "php": ">=7.1" }, "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\DependencyInjection\\": "" + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" }, - "exclude-from-classmap": [ - "/Tests/" + "branch-alias": { + "dev-main": "2.5-dev" + } + }, + "autoload": { + "files": [ + "function.php" ] }, "notification-url": "https://packagist.org/downloads/", @@ -2600,18 +3051,18 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Allows you to standardize and centralize the way objects are constructed in your application", + "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dependency-injection/tree/v4.4.49" + "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.4" }, "funding": [ { @@ -2627,24 +3078,25 @@ "type": "tidelift" } ], - "time": "2022-11-16T16:18:09+00:00" + "time": "2024-09-25T14:11:13+00:00" }, { "name": "symfony/dom-crawler", - "version": "v4.4.45", + "version": "v5.4.48", "source": { "type": "git", "url": "https://github.com/symfony/dom-crawler.git", - "reference": "4b8daf6c56801e6d664224261cb100b73edc78a5" + "reference": "b57df76f4757a9a8dfbb57ba48d7780cc20776c6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/4b8daf6c56801e6d664224261cb100b73edc78a5", - "reference": "4b8daf6c56801e6d664224261cb100b73edc78a5", + "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/b57df76f4757a9a8dfbb57ba48d7780cc20776c6", + "reference": "b57df76f4757a9a8dfbb57ba48d7780cc20776c6", "shasum": "" }, "require": { - "php": ">=7.1.3", + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-mbstring": "~1.0", "symfony/polyfill-php80": "^1.16" @@ -2654,7 +3106,7 @@ }, "require-dev": { "masterminds/html5": "^2.6", - "symfony/css-selector": "^3.4|^4.0|^5.0" + "symfony/css-selector": "^4.4|^5.0|^6.0" }, "suggest": { "symfony/css-selector": "" @@ -2685,7 +3137,7 @@ "description": "Eases DOM navigation for HTML and XML documents", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dom-crawler/tree/v4.4.45" + "source": "https://github.com/symfony/dom-crawler/tree/v5.4.48" }, "funding": [ { @@ -2701,43 +3153,44 @@ "type": "tidelift" } ], - "time": "2022-08-03T12:57:57+00:00" + "time": "2024-11-13T14:36:38+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v4.4.44", + "version": "v5.4.45", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "1e866e9e5c1b22168e0ce5f0b467f19bba61266a" + "reference": "72982eb416f61003e9bb6e91f8b3213600dcf9e9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/1e866e9e5c1b22168e0ce5f0b467f19bba61266a", - "reference": "1e866e9e5c1b22168e0ce5f0b467f19bba61266a", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/72982eb416f61003e9bb6e91f8b3213600dcf9e9", + "reference": "72982eb416f61003e9bb6e91f8b3213600dcf9e9", "shasum": "" }, "require": { - "php": ">=7.1.3", - "symfony/event-dispatcher-contracts": "^1.1", + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/event-dispatcher-contracts": "^2|^3", "symfony/polyfill-php80": "^1.16" }, "conflict": { - "symfony/dependency-injection": "<3.4" + "symfony/dependency-injection": "<4.4" }, "provide": { "psr/event-dispatcher-implementation": "1.0", - "symfony/event-dispatcher-implementation": "1.1" + "symfony/event-dispatcher-implementation": "2.0" }, "require-dev": { "psr/log": "^1|^2|^3", - "symfony/config": "^3.4|^4.0|^5.0", - "symfony/dependency-injection": "^3.4|^4.0|^5.0", - "symfony/error-handler": "~3.4|~4.4", - "symfony/expression-language": "^3.4|^4.0|^5.0", - "symfony/http-foundation": "^3.4|^4.0|^5.0", - "symfony/service-contracts": "^1.1|^2", - "symfony/stopwatch": "^3.4|^4.0|^5.0" + "symfony/config": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/error-handler": "^4.4|^5.0|^6.0", + "symfony/expression-language": "^4.4|^5.0|^6.0", + "symfony/http-foundation": "^4.4|^5.0|^6.0", + "symfony/service-contracts": "^1.1|^2|^3", + "symfony/stopwatch": "^4.4|^5.0|^6.0" }, "suggest": { "symfony/dependency-injection": "", @@ -2769,7 +3222,7 @@ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v4.4.44" + "source": "https://github.com/symfony/event-dispatcher/tree/v5.4.45" }, "funding": [ { @@ -2785,27 +3238,27 @@ "type": "tidelift" } ], - "time": "2022-07-20T09:59:04+00:00" + "time": "2024-09-25T14:11:13+00:00" }, { "name": "symfony/event-dispatcher-contracts", - "version": "v1.10.0", + "version": "v2.5.4", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "761c8b8387cfe5f8026594a75fdf0a4e83ba6974" + "reference": "e0fe3d79b516eb75126ac6fa4cbf19b79b08c99f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/761c8b8387cfe5f8026594a75fdf0a4e83ba6974", - "reference": "761c8b8387cfe5f8026594a75fdf0a4e83ba6974", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/e0fe3d79b516eb75126ac6fa4cbf19b79b08c99f", + "reference": "e0fe3d79b516eb75126ac6fa4cbf19b79b08c99f", "shasum": "" }, "require": { - "php": ">=7.1.3" + "php": ">=7.2.5", + "psr/event-dispatcher": "^1" }, "suggest": { - "psr/event-dispatcher": "", "symfony/event-dispatcher-implementation": "" }, "type": "library", @@ -2815,7 +3268,7 @@ "name": "symfony/contracts" }, "branch-alias": { - "dev-main": "1.1-dev" + "dev-main": "2.5-dev" } }, "autoload": { @@ -2848,7 +3301,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v1.10.0" + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v2.5.4" }, "funding": [ { @@ -2864,27 +3317,31 @@ "type": "tidelift" } ], - "time": "2022-07-20T09:59:04+00:00" + "time": "2024-09-25T14:11:13+00:00" }, { "name": "symfony/filesystem", - "version": "v4.4.42", + "version": "v5.4.45", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "815412ee8971209bd4c1eecd5f4f481eacd44bf5" + "reference": "57c8294ed37d4a055b77057827c67f9558c95c54" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/815412ee8971209bd4c1eecd5f4f481eacd44bf5", - "reference": "815412ee8971209bd4c1eecd5f4f481eacd44bf5", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/57c8294ed37d4a055b77057827c67f9558c95c54", + "reference": "57c8294ed37d4a055b77057827c67f9558c95c54", "shasum": "" }, "require": { - "php": ">=7.1.3", + "php": ">=7.2.5", "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.8", "symfony/polyfill-php80": "^1.16" }, + "require-dev": { + "symfony/process": "^5.4|^6.4" + }, "type": "library", "autoload": { "psr-4": { @@ -2911,7 +3368,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v4.4.42" + "source": "https://github.com/symfony/filesystem/tree/v5.4.45" }, "funding": [ { @@ -2927,11 +3384,11 @@ "type": "tidelift" } ], - "time": "2022-05-20T08:49:14+00:00" + "time": "2024-10-22T13:05:35+00:00" }, { "name": "symfony/polyfill-ctype", - "version": "v1.36.0", + "version": "v1.37.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", @@ -2990,7 +3447,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.36.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.37.0" }, "funding": [ { @@ -3012,9 +3469,176 @@ ], "time": "2026-04-10T16:19:22+00:00" }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.37.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "4864388bfbd3001ce88e234fab652acd91fdc57e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/4864388bfbd3001ce88e234fab652acd91fdc57e", + "reference": "4864388bfbd3001ce88e234fab652acd91fdc57e", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + } + }, + "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 intl's grapheme_* functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "grapheme", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.37.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": "2026-04-26T13:13:48+00:00" + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.37.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "3833d7255cc303546435cb650316bff708a1c75c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c", + "reference": "3833d7255cc303546435cb650316bff708a1c75c", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "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 intl's Normalizer class and related functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "intl", + "normalizer", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.37.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-09-09T11:45:10+00:00" + }, { "name": "symfony/polyfill-mbstring", - "version": "v1.36.0", + "version": "v1.37.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", @@ -3075,7 +3699,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.36.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.37.0" }, "funding": [ { @@ -3099,7 +3723,7 @@ }, { "name": "symfony/polyfill-php73", - "version": "v1.36.0", + "version": "v1.37.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php73.git", @@ -3155,7 +3779,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.36.0" + "source": "https://github.com/symfony/polyfill-php73/tree/v1.37.0" }, "funding": [ { @@ -3179,7 +3803,7 @@ }, { "name": "symfony/polyfill-php80", - "version": "v1.36.0", + "version": "v1.37.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", @@ -3239,7 +3863,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.36.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.37.0" }, "funding": [ { @@ -3263,7 +3887,7 @@ }, { "name": "symfony/polyfill-php81", - "version": "v1.36.0", + "version": "v1.37.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php81.git", @@ -3319,7 +3943,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php81/tree/v1.36.0" + "source": "https://github.com/symfony/polyfill-php81/tree/v1.37.0" }, "funding": [ { @@ -3343,21 +3967,25 @@ }, { "name": "symfony/service-contracts", - "version": "v1.10.0", + "version": "v2.5.4", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "afa00c500c2d6aea6e3b2f4862355f507bc5ebb4" + "reference": "f37b419f7aea2e9abf10abd261832cace12e3300" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/afa00c500c2d6aea6e3b2f4862355f507bc5ebb4", - "reference": "afa00c500c2d6aea6e3b2f4862355f507bc5ebb4", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/f37b419f7aea2e9abf10abd261832cace12e3300", + "reference": "f37b419f7aea2e9abf10abd261832cace12e3300", "shasum": "" }, "require": { - "php": ">=7.1.3", - "psr/container": "^1.0" + "php": ">=7.2.5", + "psr/container": "^1.1", + "symfony/deprecation-contracts": "^2.1|^3" + }, + "conflict": { + "ext-psr": "<1.1|>=2" }, "suggest": { "symfony/service-implementation": "" @@ -3369,7 +3997,7 @@ "name": "symfony/contracts" }, "branch-alias": { - "dev-main": "1.1-dev" + "dev-main": "2.5-dev" } }, "autoload": { @@ -3402,7 +4030,93 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v1.10.0" + "source": "https://github.com/symfony/service-contracts/tree/v2.5.4" + }, + "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:11:13+00:00" + }, + { + "name": "symfony/string", + "version": "v5.4.47", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "136ca7d72f72b599f2631aca474a4f8e26719799" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/136ca7d72f72b599f2631aca474a4f8e26719799", + "reference": "136ca7d72f72b599f2631aca474a4f8e26719799", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.0", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "~1.15" + }, + "conflict": { + "symfony/translation-contracts": ">=3.0" + }, + "require-dev": { + "symfony/error-handler": "^4.4|^5.0|^6.0", + "symfony/http-client": "^4.4|^5.0|^6.0", + "symfony/translation-contracts": "^1.1|^2", + "symfony/var-exporter": "^4.4|^5.0|^6.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\String\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "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": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", + "homepage": "https://symfony.com", + "keywords": [ + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" + ], + "support": { + "source": "https://github.com/symfony/string/tree/v5.4.47" }, "funding": [ { @@ -3418,47 +4132,52 @@ "type": "tidelift" } ], - "time": "2022-05-27T14:01:05+00:00" + "time": "2024-11-10T20:33:58+00:00" }, { "name": "symfony/translation", - "version": "v4.4.47", + "version": "v5.4.45", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "45036b1d53accc48fe9bab71ccd86d57eba0dd94" + "reference": "98f26acc99341ca4bab345fb14d7b1d7cb825bed" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/45036b1d53accc48fe9bab71ccd86d57eba0dd94", - "reference": "45036b1d53accc48fe9bab71ccd86d57eba0dd94", + "url": "https://api.github.com/repos/symfony/translation/zipball/98f26acc99341ca4bab345fb14d7b1d7cb825bed", + "reference": "98f26acc99341ca4bab345fb14d7b1d7cb825bed", "shasum": "" }, "require": { - "php": ">=7.1.3", + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", "symfony/polyfill-mbstring": "~1.0", "symfony/polyfill-php80": "^1.16", - "symfony/translation-contracts": "^1.1.6|^2" + "symfony/translation-contracts": "^2.3" }, "conflict": { - "symfony/config": "<3.4", - "symfony/dependency-injection": "<3.4", - "symfony/http-kernel": "<4.4", - "symfony/yaml": "<3.4" + "symfony/config": "<4.4", + "symfony/console": "<5.3", + "symfony/dependency-injection": "<5.0", + "symfony/http-kernel": "<5.0", + "symfony/twig-bundle": "<5.0", + "symfony/yaml": "<4.4" }, "provide": { - "symfony/translation-implementation": "1.0|2.0" + "symfony/translation-implementation": "2.3" }, "require-dev": { "psr/log": "^1|^2|^3", - "symfony/config": "^3.4|^4.0|^5.0", - "symfony/console": "^3.4|^4.0|^5.0", - "symfony/dependency-injection": "^3.4|^4.0|^5.0", - "symfony/finder": "~2.8|~3.0|~4.0|^5.0", - "symfony/http-kernel": "^4.4", - "symfony/intl": "^3.4|^4.0|^5.0", - "symfony/service-contracts": "^1.1.2|^2", - "symfony/yaml": "^3.4|^4.0|^5.0" + "symfony/config": "^4.4|^5.0|^6.0", + "symfony/console": "^5.4|^6.0", + "symfony/dependency-injection": "^5.0|^6.0", + "symfony/finder": "^4.4|^5.0|^6.0", + "symfony/http-client-contracts": "^1.1|^2.0|^3.0", + "symfony/http-kernel": "^5.0|^6.0", + "symfony/intl": "^4.4|^5.0|^6.0", + "symfony/polyfill-intl-icu": "^1.21", + "symfony/service-contracts": "^1.1.2|^2|^3", + "symfony/yaml": "^4.4|^5.0|^6.0" }, "suggest": { "psr/log-implementation": "To use logging capability in translator", @@ -3467,6 +4186,9 @@ }, "type": "library", "autoload": { + "files": [ + "Resources/functions.php" + ], "psr-4": { "Symfony\\Component\\Translation\\": "" }, @@ -3491,7 +4213,7 @@ "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/translation/tree/v4.4.47" + "source": "https://github.com/symfony/translation/tree/v5.4.45" }, "funding": [ { @@ -3507,24 +4229,24 @@ "type": "tidelift" } ], - "time": "2022-10-03T15:15:11+00:00" + "time": "2024-09-25T14:11:13+00:00" }, { "name": "symfony/translation-contracts", - "version": "v1.10.0", + "version": "v2.5.4", "source": { "type": "git", "url": "https://github.com/symfony/translation-contracts.git", - "reference": "7462e5c4cb8b9cd152f992e8f10963b5641921f6" + "reference": "450d4172653f38818657022252f9d81be89ee9a8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/7462e5c4cb8b9cd152f992e8f10963b5641921f6", - "reference": "7462e5c4cb8b9cd152f992e8f10963b5641921f6", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/450d4172653f38818657022252f9d81be89ee9a8", + "reference": "450d4172653f38818657022252f9d81be89ee9a8", "shasum": "" }, "require": { - "php": ">=7.1.3" + "php": ">=7.2.5" }, "suggest": { "symfony/translation-implementation": "" @@ -3536,7 +4258,7 @@ "name": "symfony/contracts" }, "branch-alias": { - "dev-main": "1.1-dev" + "dev-main": "2.5-dev" } }, "autoload": { @@ -3569,7 +4291,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/translation-contracts/tree/v1.10.0" + "source": "https://github.com/symfony/translation-contracts/tree/v2.5.4" }, "funding": [ { @@ -3585,35 +4307,39 @@ "type": "tidelift" } ], - "time": "2022-06-27T13:16:42+00:00" + "time": "2024-09-25T14:11:13+00:00" }, { "name": "symfony/yaml", - "version": "v4.4.45", + "version": "v5.4.45", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "aeccc4dc52a9e634f1d1eebeb21eacfdcff1053d" + "reference": "a454d47278cc16a5db371fe73ae66a78a633371e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/aeccc4dc52a9e634f1d1eebeb21eacfdcff1053d", - "reference": "aeccc4dc52a9e634f1d1eebeb21eacfdcff1053d", + "url": "https://api.github.com/repos/symfony/yaml/zipball/a454d47278cc16a5db371fe73ae66a78a633371e", + "reference": "a454d47278cc16a5db371fe73ae66a78a633371e", "shasum": "" }, "require": { - "php": ">=7.1.3", - "symfony/polyfill-ctype": "~1.8" + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-ctype": "^1.8" }, "conflict": { - "symfony/console": "<3.4" + "symfony/console": "<5.3" }, "require-dev": { - "symfony/console": "^3.4|^4.0|^5.0" + "symfony/console": "^5.3|^6.0" }, "suggest": { "symfony/console": "For validating YAML files using the lint command" }, + "bin": [ + "Resources/bin/yaml-lint" + ], "type": "library", "autoload": { "psr-4": { @@ -3640,7 +4366,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v4.4.45" + "source": "https://github.com/symfony/yaml/tree/v5.4.45" }, "funding": [ { @@ -3656,7 +4382,7 @@ "type": "tidelift" } ], - "time": "2022-08-02T15:47:23+00:00" + "time": "2024-09-25T14:11:13+00:00" }, { "name": "theseer/tokenizer",