diff --git a/.github/workflows/deptrac.yml b/.github/workflows/deptrac.yml deleted file mode 100644 index d7b74fe02..000000000 --- a/.github/workflows/deptrac.yml +++ /dev/null @@ -1,48 +0,0 @@ -# https://help.github.com/en/categories/automating-your-workflow-with-github-actions - -name: "Static Analysis by Deptrac" - -on: - pull_request: - push: - branches: - - "[0-9]+.[0-9]+.x" - - "renovate/*" - -jobs: - static-analysis-deptrac: - name: "Static Analysis by Deptrac" - - runs-on: ${{ matrix.operating-system }} - - strategy: - matrix: - dependencies: - - "locked" - php-version: - - "8.5" - operating-system: - - "ubuntu-latest" - - steps: - - name: "Checkout" - uses: actions/checkout@v6 - - - name: "Install PHP" - uses: "shivammathur/setup-php@2.37.0" - with: - coverage: "pcov" - php-version: "${{ matrix.php-version }}" - ini-values: memory_limit=-1 - - - uses: ramsey/composer-install@4.0.0 - with: - dependency-versions: ${{ matrix.dependencies }} - - - uses: ramsey/composer-install@4.0.0 - with: - dependency-versions: ${{ matrix.dependencies }} - working-directory: 'tools' - - - name: "deptrac" - run: "cd tools && ./vendor/bin/deptrac -c ../deptrac.yaml" diff --git a/.gitignore b/.gitignore index ef267058e..79d0aa2b7 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,5 @@ infection.log .phpbench/ infection.html *.sqlite3 -.deptrac.cache docs_php/ docs/.cache \ No newline at end of file diff --git a/Makefile b/Makefile index b0a3455b0..1c909e259 100644 --- a/Makefile +++ b/Makefile @@ -51,14 +51,6 @@ infection: vendor infection-diff: vendor ## run infection on differences php -d memory_limit=312M vendor/bin/infection --threads=max --git-diff-lines --git-diff-base=origin/HEAD --ignore-msi-with-no-mutations --only-covered --min-msi=80 --min-covered-msi=95 -.PHONY: deptrac -deptrac: vendor-tools ## run deptrac - cd tools && ./vendor/bin/deptrac -c ../deptrac.yaml - -.PHONY: deptrac-baseline -deptrac-baseline: vendor-tools ## run deptrac and update baseline - cd tools && ./vendor/bin/deptrac -c ../deptrac.yaml --formatter=baseline --output=../deptrac-baseline.yaml - .PHONY: static static: phpstan cs ## run static analyser diff --git a/deptrac-baseline.yaml b/deptrac-baseline.yaml deleted file mode 100644 index eb6a9bb9d..000000000 --- a/deptrac-baseline.yaml +++ /dev/null @@ -1,27 +0,0 @@ -deptrac: - skip_violations: - Patchlevel\EventSourcing\Aggregate\AggregateRootId: - - Patchlevel\EventSourcing\Serializer\Normalizer\IdNormalizer - Patchlevel\EventSourcing\Aggregate\CustomId: - - Patchlevel\EventSourcing\Serializer\Normalizer\IdNormalizer - Patchlevel\EventSourcing\Aggregate\Uuid: - - Patchlevel\EventSourcing\Serializer\Normalizer\IdNormalizer - Patchlevel\EventSourcing\Attribute\Processor: - - Patchlevel\EventSourcing\Subscription\RunMode - Patchlevel\EventSourcing\Attribute\Projector: - - Patchlevel\EventSourcing\Subscription\RunMode - Patchlevel\EventSourcing\Attribute\SharedApplyContext: - - Patchlevel\EventSourcing\Aggregate\AggregateRoot - Patchlevel\EventSourcing\Attribute\Stream: - - Patchlevel\EventSourcing\Aggregate\AggregateRoot - Patchlevel\EventSourcing\Attribute\Subscriber: - - Patchlevel\EventSourcing\Subscription\RunMode - Patchlevel\EventSourcing\Store\DoctrineDbalStore: - - Patchlevel\EventSourcing\Aggregate\AggregateHeader - Patchlevel\EventSourcing\Store\DoctrineDbalStoreStream: - - Patchlevel\EventSourcing\Aggregate\AggregateHeader - Patchlevel\EventSourcing\Store\InMemoryStore: - - Patchlevel\EventSourcing\Aggregate\AggregateHeader - - Patchlevel\EventSourcing\Metadata\Event\EventRegistry - Patchlevel\EventSourcing\Store\MissingEventRegistry: - - Patchlevel\EventSourcing\Metadata\Event\EventRegistry diff --git a/deptrac.yaml b/deptrac.yaml deleted file mode 100644 index 9d7c64eb8..000000000 --- a/deptrac.yaml +++ /dev/null @@ -1,194 +0,0 @@ -imports: - - deptrac-baseline.yaml - -deptrac: - paths: - - ./src - layers: - - name: Aggregate - collectors: - - type: directory - value: src/Aggregate/.* - - name: Attribute - collectors: - - type: directory - value: src/Attribute/.* - - name: Clock - collectors: - - type: directory - value: src/Clock/.* - - name: CommandBus - collectors: - - type: directory - value: src/CommandBus/.* - - name: Console - collectors: - - type: directory - value: src/Console/.* - - name: Cryptography - collectors: - - type: directory - value: src/Cryptography/.* - - name: EventBus - collectors: - - type: directory - value: src/EventBus/.* - - name: Message - collectors: - - type: directory - value: src/Message/.* - - name: MetadataAggregate - collectors: - - type: directory - value: src/Metadata/AggregateRoot/.* - - name: MetadataEvent - collectors: - - type: directory - value: src/Metadata/Event/.* - - name: MetadataMessage - collectors: - - type: directory - value: src/Metadata/Message/.* - - name: MetadataSubscriber - collectors: - - type: directory - value: src/Metadata/Subscriber/.* - - name: Metadata - collectors: - - type: bool - must: - - type: directory - value: src/Metadata/.* - must_not: - - type: layer - value: MetadataAggregate - - type: layer - value: MetadataEvent - - type: layer - value: MetadataMessage - - type: layer - value: MetadataSubscriber - - name: QueryBus - collectors: - - type: directory - value: src/QueryBus/.* - - name: Repository - collectors: - - type: directory - value: src/Repository/.* - - name: Schema - collectors: - - type: directory - value: src/Schema/.* - - name: Serializer - collectors: - - type: directory - value: src/Serializer/.* - - name: Snapshot - collectors: - - type: directory - value: src/Snapshot/.* - - name: Store - collectors: - - type: directory - value: src/Store/.* - - name: Subscription - collectors: - - type: directory - value: src/Subscription/.* - - name: Test - collectors: - - type: directory - value: src/Test/.* - - ruleset: - Aggregate: - - Attribute - - MetadataAggregate - Attribute: - Clock: - CommandBus: - - Aggregate - - Attribute - - MetadataAggregate - - Repository - Console: - - Aggregate - - Message - - MetadataAggregate - - MetadataEvent - - Pipeline - - Schema - - Serializer - - Store - - Subscription - Cryptography: - - Schema - Debug: - - Attribute - - Message - - Repository - - Subscription - EventBus: - - Attribute - - Message - Message: - - Aggregate - - MetadataMessage - - Serializer - - Store - Metadata: - MetadataAggregate: - - Aggregate - - Attribute - - Metadata - MetadataEvent: - - Attribute - - Metadata - MetadataMessage: - - Aggregate - - Attribute - - Debug - - Metadata - - Store - MetadataSubscriber: - - Attribute - - Metadata - - Subscription - Subscription: - - Aggregate - - Attribute - - Clock - - Message - - MetadataEvent - - MetadataSubscriber - - Repository - - Schema - - Store - QueryBus: - - Attribute - Repository: - - Aggregate - - Clock - - Message - - MetadataAggregate - - MetadataEvent - - EventBus - - Snapshot - - Store - Schema: - Serializer: - - Aggregate - - Cryptography - - MetadataEvent - Snapshot: - - Aggregate - - Cryptography - - MetadataAggregate - Store: - - Clock - - Message - - Metadata - - Schema - - Serializer - Test: diff --git a/phpstan-baseline.neon b/phpstan-baseline.neon index 3764a738c..81ec8d23c 100644 --- a/phpstan-baseline.neon +++ b/phpstan-baseline.neon @@ -1,5 +1,35 @@ parameters: ignoreErrors: + - + message: '#^Patchlevel\\EventSourcing\\Aggregate\\AggregateRootId should not depend on Patchlevel\\EventSourcing\\Serializer\\Normalizer\\IdNormalizer$#' + identifier: phpat.testAggregateCanOnlyDependOnAllowedLayers + count: 1 + path: src/Aggregate/AggregateRootId.php + + - + message: '#^Patchlevel\\EventSourcing\\Attribute\\Processor should not depend on Patchlevel\\EventSourcing\\Subscription\\RunMode$#' + identifier: phpat.testAttributeCanOnlyDependOnAllowedLayers + count: 2 + path: src/Attribute/Processor.php + + - + message: '#^Patchlevel\\EventSourcing\\Attribute\\Projector should not depend on Patchlevel\\EventSourcing\\Subscription\\RunMode$#' + identifier: phpat.testAttributeCanOnlyDependOnAllowedLayers + count: 2 + path: src/Attribute/Projector.php + + - + message: '#^Patchlevel\\EventSourcing\\Attribute\\SharedApplyContext should not depend on Patchlevel\\EventSourcing\\Aggregate\\AggregateRoot$#' + identifier: phpat.testAttributeCanOnlyDependOnAllowedLayers + count: 1 + path: src/Attribute/SharedApplyContext.php + + - + message: '#^Patchlevel\\EventSourcing\\Attribute\\Subscriber should not depend on Patchlevel\\EventSourcing\\Subscription\\RunMode$#' + identifier: phpat.testAttributeCanOnlyDependOnAllowedLayers + count: 1 + path: src/Attribute/Subscriber.php + - message: '#^Cannot unset offset ''url'' on array\{application_name\?\: string, charset\?\: string, defaultTableOptions\?\: array\, driver\?\: ''ibm_db2''\|''mysqli''\|''oci8''\|''pdo_mysql''\|''pdo_oci''\|''pdo_pgsql''\|''pdo_sqlite''\|''pdo_sqlsrv''\|''pgsql''\|''sqlite3''\|''sqlsrv'', driverClass\?\: class\-string\, driverOptions\?\: array\, host\?\: string, keepReplica\?\: bool, \.\.\.\}\.$#' identifier: unset.offset @@ -96,6 +126,12 @@ parameters: count: 1 path: src/Store/Criteria/StreamCriterion.php + - + message: '#^Patchlevel\\EventSourcing\\Store\\DoctrineDbalStore should not depend on Patchlevel\\EventSourcing\\Aggregate\\AggregateHeader$#' + identifier: phpat.testStoreCanOnlyDependOnAllowedLayers + count: 2 + path: src/Store/DoctrineDbalStore.php + - message: '#^Method Patchlevel\\EventSourcing\\Store\\DoctrineDbalStoreStream\:\:current\(\) never returns null so it can be removed from the return type\.$#' identifier: return.unusedType @@ -114,12 +150,36 @@ parameters: count: 1 path: src/Store/DoctrineDbalStoreStream.php + - + message: '#^Patchlevel\\EventSourcing\\Store\\DoctrineDbalStoreStream should not depend on Patchlevel\\EventSourcing\\Aggregate\\AggregateHeader$#' + identifier: phpat.testStoreCanOnlyDependOnAllowedLayers + count: 1 + path: src/Store/DoctrineDbalStoreStream.php + - message: '#^Ternary operator condition is always true\.$#' identifier: ternary.alwaysTrue count: 1 path: src/Store/DoctrineDbalStoreStream.php + - + message: '#^Patchlevel\\EventSourcing\\Store\\InMemoryStore should not depend on Patchlevel\\EventSourcing\\Aggregate\\AggregateHeader$#' + identifier: phpat.testStoreCanOnlyDependOnAllowedLayers + count: 5 + path: src/Store/InMemoryStore.php + + - + message: '#^Patchlevel\\EventSourcing\\Store\\InMemoryStore should not depend on Patchlevel\\EventSourcing\\Metadata\\Event\\EventRegistry$#' + identifier: phpat.testStoreCanOnlyDependOnAllowedLayers + count: 1 + path: src/Store/InMemoryStore.php + + - + message: '#^Patchlevel\\EventSourcing\\Store\\MissingEventRegistry should not depend on Patchlevel\\EventSourcing\\Metadata\\Event\\EventRegistry$#' + identifier: phpat.testStoreCanOnlyDependOnAllowedLayers + count: 1 + path: src/Store/MissingEventRegistry.php + - message: '#^Method Patchlevel\\EventSourcing\\Store\\StreamDoctrineDbalStoreStream\:\:current\(\) never returns null so it can be removed from the return type\.$#' identifier: return.unusedType diff --git a/phpstan.neon.dist b/phpstan.neon.dist index 689e71a10..5f54b81e9 100644 --- a/phpstan.neon.dist +++ b/phpstan.neon.dist @@ -18,3 +18,8 @@ services: class: Patchlevel\EventSourcing\Tests\Architecture\FinalClassesTest tags: - phpat.test + + - + class: Patchlevel\EventSourcing\Tests\Architecture\LayerDependenciesTest + tags: + - phpat.test diff --git a/tests/Architecture/LayerDependenciesTest.php b/tests/Architecture/LayerDependenciesTest.php new file mode 100644 index 000000000..6e22895cd --- /dev/null +++ b/tests/Architecture/LayerDependenciesTest.php @@ -0,0 +1,273 @@ +layerCanOnlyDependOnAllowedLayers( + $this->layer('Aggregate'), + [ + $this->layer('Attribute'), + $this->layer('Metadata\AggregateRoot'), + ], + ); + } + + public function testAttributeCanOnlyDependOnAllowedLayers(): Rule + { + return $this->layerCanOnlyDependOnAllowedLayers($this->layer('Attribute')); + } + + public function testClockCanOnlyDependOnAllowedLayers(): Rule + { + return $this->layerCanOnlyDependOnAllowedLayers($this->layer('Clock')); + } + + public function testCommandBusCanOnlyDependOnAllowedLayers(): Rule + { + return $this->layerCanOnlyDependOnAllowedLayers( + $this->layer('CommandBus'), + [ + $this->layer('Aggregate'), + $this->layer('Attribute'), + $this->layer('Metadata\AggregateRoot'), + $this->layer('Repository'), + ], + ); + } + + public function testConsoleCanOnlyDependOnAllowedLayers(): Rule + { + return $this->layerCanOnlyDependOnAllowedLayers( + $this->layer('Console'), + [ + $this->layer('Aggregate'), + $this->layer('Message'), + $this->layer('Metadata\AggregateRoot'), + $this->layer('Metadata\Event'), + $this->layer('Schema'), + $this->layer('Serializer'), + $this->layer('Store'), + $this->layer('Subscription'), + ], + ); + } + + public function testCryptographyCanOnlyDependOnAllowedLayers(): Rule + { + return $this->layerCanOnlyDependOnAllowedLayers( + $this->layer('Cryptography'), + [$this->layer('Schema')], + ); + } + + public function testEventBusCanOnlyDependOnAllowedLayers(): Rule + { + return $this->layerCanOnlyDependOnAllowedLayers( + $this->layer('EventBus'), + [ + $this->layer('Attribute'), + $this->layer('Message'), + ], + ); + } + + public function testMessageCanOnlyDependOnAllowedLayers(): Rule + { + return $this->layerCanOnlyDependOnAllowedLayers( + $this->layer('Message'), + [ + $this->layer('Aggregate'), + $this->layer('Metadata\Message'), + $this->layer('Serializer'), + $this->layer('Store'), + ], + ); + } + + public function testMetadataCanOnlyDependOnAllowedLayers(): Rule + { + return $this->layerCanOnlyDependOnAllowedLayers($this->metadataLayer()); + } + + public function testMetadataAggregateCanOnlyDependOnAllowedLayers(): Rule + { + return $this->layerCanOnlyDependOnAllowedLayers( + $this->layer('Metadata\AggregateRoot'), + [ + $this->layer('Aggregate'), + $this->layer('Attribute'), + $this->metadataLayer(), + ], + ); + } + + public function testMetadataEventCanOnlyDependOnAllowedLayers(): Rule + { + return $this->layerCanOnlyDependOnAllowedLayers( + $this->layer('Metadata\Event'), + [ + $this->layer('Attribute'), + $this->metadataLayer(), + ], + ); + } + + public function testMetadataMessageCanOnlyDependOnAllowedLayers(): Rule + { + return $this->layerCanOnlyDependOnAllowedLayers( + $this->layer('Metadata\Message'), + [ + $this->layer('Aggregate'), + $this->layer('Attribute'), + $this->metadataLayer(), + $this->layer('Store'), + ], + ); + } + + public function testMetadataSubscriberCanOnlyDependOnAllowedLayers(): Rule + { + return $this->layerCanOnlyDependOnAllowedLayers( + $this->layer('Metadata\Subscriber'), + [ + $this->layer('Attribute'), + $this->metadataLayer(), + $this->layer('Subscription'), + ], + ); + } + + public function testQueryBusCanOnlyDependOnAllowedLayers(): Rule + { + return $this->layerCanOnlyDependOnAllowedLayers( + $this->layer('QueryBus'), + [$this->layer('Attribute')], + ); + } + + public function testRepositoryCanOnlyDependOnAllowedLayers(): Rule + { + return $this->layerCanOnlyDependOnAllowedLayers( + $this->layer('Repository'), + [ + $this->layer('Aggregate'), + $this->layer('Clock'), + $this->layer('Message'), + $this->layer('Metadata\AggregateRoot'), + $this->layer('Metadata\Event'), + $this->layer('EventBus'), + $this->layer('Snapshot'), + $this->layer('Store'), + ], + ); + } + + public function testSchemaCanOnlyDependOnAllowedLayers(): Rule + { + return $this->layerCanOnlyDependOnAllowedLayers($this->layer('Schema')); + } + + public function testSerializerCanOnlyDependOnAllowedLayers(): Rule + { + return $this->layerCanOnlyDependOnAllowedLayers( + $this->layer('Serializer'), + [ + $this->layer('Aggregate'), + $this->layer('Cryptography'), + $this->layer('Metadata\Event'), + ], + ); + } + + public function testSnapshotCanOnlyDependOnAllowedLayers(): Rule + { + return $this->layerCanOnlyDependOnAllowedLayers( + $this->layer('Snapshot'), + [ + $this->layer('Aggregate'), + $this->layer('Cryptography'), + $this->layer('Metadata\AggregateRoot'), + ], + ); + } + + public function testStoreCanOnlyDependOnAllowedLayers(): Rule + { + return $this->layerCanOnlyDependOnAllowedLayers( + $this->layer('Store'), + [ + $this->layer('Clock'), + $this->layer('Message'), + $this->metadataLayer(), + $this->layer('Schema'), + $this->layer('Serializer'), + ], + ); + } + + public function testSubscriptionCanOnlyDependOnAllowedLayers(): Rule + { + return $this->layerCanOnlyDependOnAllowedLayers( + $this->layer('Subscription'), + [ + $this->layer('Aggregate'), + $this->layer('Attribute'), + $this->layer('Clock'), + $this->layer('Message'), + $this->layer('Metadata\Event'), + $this->layer('Metadata\Subscriber'), + $this->layer('Repository'), + $this->layer('Schema'), + $this->layer('Store'), + ], + ); + } + + public function testTestCanOnlyDependOnAllowedLayers(): Rule + { + return $this->layerCanOnlyDependOnAllowedLayers($this->layer('Test')); + } + + /** @param array $allowedInternalLayers */ + private function layerCanOnlyDependOnAllowedLayers( + SelectorInterface $layer, + array $allowedInternalLayers = [], + ): Rule { + return PHPat::rule() + ->classes($layer) + ->canOnlyDependOn() + ->classes( + Selector::NOT(Selector::inNamespace('Patchlevel\EventSourcing')), // only internal deps + $layer, // allow itself + ...$allowedInternalLayers, + ); + } + + private function layer(string $layer): SelectorInterface + { + return Selector::inNamespace(sprintf('Patchlevel\\EventSourcing\\%s', $layer)); + } + + private function metadataLayer(): SelectorInterface + { + return Selector::AllOf( + $this->layer('Metadata'), + Selector::NOT($this->layer('Metadata\AggregateRoot')), + Selector::NOT($this->layer('Metadata\Event')), + Selector::NOT($this->layer('Metadata\Message')), + Selector::NOT($this->layer('Metadata\Subscriber')), + ); + } +} diff --git a/tools/composer.json b/tools/composer.json index 92d3a9dbd..74d1aab33 100644 --- a/tools/composer.json +++ b/tools/composer.json @@ -1,7 +1,6 @@ { "require": { "php": "~8.5.0", - "roave/backward-compatibility-check": "^8.16.0", - "deptrac/deptrac": "^4.2.1" + "roave/backward-compatibility-check": "^8.20.0" } } diff --git a/tools/composer.lock b/tools/composer.lock index ff1c3fb46..56ac7552c 100644 --- a/tools/composer.lock +++ b/tools/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": "bc2a574929879bec056439db3b8d8736", + "content-hash": "115628ecf995f1bedf175c263987938a", "packages": [ { "name": "beberlei/assert", @@ -694,139 +694,6 @@ ], "time": "2024-05-06T16:37:16+00:00" }, - { - "name": "deptrac/deptrac", - "version": "4.6.0", - "source": { - "type": "git", - "url": "https://github.com/deptrac/deptrac.git", - "reference": "b27bfc5291a1cbe1c0ebf514716b1d25c68c63fd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/deptrac/deptrac/zipball/b27bfc5291a1cbe1c0ebf514716b1d25c68c63fd", - "reference": "b27bfc5291a1cbe1c0ebf514716b1d25c68c63fd", - "shasum": "" - }, - "require": { - "composer/xdebug-handler": "^3.0", - "jetbrains/phpstorm-stubs": "2024.3 || 2025.3", - "nikic/php-parser": "^5", - "php": "^8.2", - "phpdocumentor/graphviz": "^2.1", - "phpdocumentor/type-resolver": "^1.9.0 || ^2.0.0", - "phpstan/phpdoc-parser": "^1.5.0 || ^2.1.0", - "phpstan/phpstan": "^2.0", - "psr/container": "^2.0", - "psr/event-dispatcher": "^1.0", - "symfony/config": "^6.4 || ^7.4 || ^8.0", - "symfony/console": "^6.4 || ^7.4 || ^8.0", - "symfony/dependency-injection": "^6.4 || ^7.4 || ^8.0", - "symfony/event-dispatcher": "^6.4 || ^7.4 || ^8.0", - "symfony/event-dispatcher-contracts": "^3.4", - "symfony/filesystem": "^6.4 || ^7.4 || ^8.0", - "symfony/finder": "^6.4 || ^7.4 || ^8.0", - "symfony/yaml": "^6.4 || ^7.4 || ^8.0" - }, - "require-dev": { - "bamarni/composer-bin-plugin": "^1.8", - "ergebnis/composer-normalize": "^2.45", - "ext-libxml": "*", - "symfony/stopwatch": "^6.4 || ^7.4 || ^8.0" - }, - "suggest": { - "ext-dom": "For using the JUnit output formatter" - }, - "bin": [ - "deptrac" - ], - "type": "library", - "extra": { - "bamarni-bin": { - "bin-links": false, - "forward-command": true, - "target-directory": "tools" - } - }, - "autoload": { - "psr-4": { - "Deptrac\\Deptrac\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Tim Glabisch" - }, - { - "name": "Simon Mönch" - }, - { - "name": "Denis Brumann" - } - ], - "description": "Deptrac is a static code analysis tool that helps to enforce rules for dependencies between software layers.", - "keywords": [ - "dev", - "static analysis" - ], - "support": { - "issues": "https://github.com/deptrac/deptrac/issues", - "source": "https://github.com/deptrac/deptrac/tree/4.6.0" - }, - "time": "2026-02-02T09:44:37+00:00" - }, - { - "name": "doctrine/deprecations", - "version": "1.1.6", - "source": { - "type": "git", - "url": "https://github.com/doctrine/deprecations.git", - "reference": "d4fe3e6fd9bb9e72557a19674f44d8ac7db4c6ca" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/deprecations/zipball/d4fe3e6fd9bb9e72557a19674f44d8ac7db4c6ca", - "reference": "d4fe3e6fd9bb9e72557a19674f44d8ac7db4c6ca", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0" - }, - "conflict": { - "phpunit/phpunit": "<=7.5 || >=14" - }, - "require-dev": { - "doctrine/coding-standard": "^9 || ^12 || ^14", - "phpstan/phpstan": "1.4.10 || 2.1.30", - "phpstan/phpstan-phpunit": "^1.0 || ^2", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6 || ^10.5 || ^11.5 || ^12.4 || ^13.0", - "psr/log": "^1 || ^2 || ^3" - }, - "suggest": { - "psr/log": "Allows logging deprecations via PSR-3 logger implementation" - }, - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\Deprecations\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.", - "homepage": "https://www.doctrine-project.org/", - "support": { - "issues": "https://github.com/doctrine/deprecations/issues", - "source": "https://github.com/doctrine/deprecations/tree/1.1.6" - }, - "time": "2026-02-07T07:09:04+00:00" - }, { "name": "jetbrains/phpstorm-stubs", "version": "v2025.3", @@ -2943,39 +2810,31 @@ "time": "2026-03-20T08:02:33+00:00" }, { - "name": "phpdocumentor/graphviz", - "version": "2.1.0", + "name": "psr/container", + "version": "2.0.2", "source": { "type": "git", - "url": "https://github.com/phpDocumentor/GraphViz.git", - "reference": "115999dc7f31f2392645aa825a94a6b165e1cedf" + "url": "https://github.com/php-fig/container.git", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/GraphViz/zipball/115999dc7f31f2392645aa825a94a6b165e1cedf", - "reference": "115999dc7f31f2392645aa825a94a6b165e1cedf", + "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", "shasum": "" }, "require": { - "php": "^7.2 || ^8.0" - }, - "require-dev": { - "ext-simplexml": "*", - "mockery/mockery": "^1.2", - "phpstan/phpstan": "^0.12", - "phpunit/phpunit": "^8.2 || ^9.2", - "psalm/phar": "^4.15" + "php": ">=7.4.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.x-dev" + "dev-master": "2.0.x-dev" } }, "autoload": { "psr-4": { - "phpDocumentor\\GraphViz\\": "src/phpDocumentor/GraphViz", - "phpDocumentor\\GraphViz\\PHPStan\\": "./src/phpDocumentor/PHPStan" + "Psr\\Container\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -2984,43 +2843,51 @@ ], "authors": [ { - "name": "Mike van Riel", - "email": "mike.vanriel@naenius.com" + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" } ], - "description": "Wrapper for Graphviz", + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], "support": { - "issues": "https://github.com/phpDocumentor/GraphViz/issues", - "source": "https://github.com/phpDocumentor/GraphViz/tree/2.1.0" + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/2.0.2" }, - "time": "2021-12-13T19:03:21+00:00" + "time": "2021-11-05T16:47:00+00:00" }, { - "name": "phpdocumentor/reflection-common", - "version": "2.2.0", + "name": "psr/log", + "version": "3.0.2", "source": { "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionCommon.git", - "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" + "url": "https://github.com/php-fig/log.git", + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", - "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "url": "https://api.github.com/repos/php-fig/log/zipball/f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", "shasum": "" }, "require": { - "php": "^7.2 || ^8.0" + "php": ">=8.0.0" }, "type": "library", "extra": { "branch-alias": { - "dev-2.x": "2.x-dev" + "dev-master": "3.x-dev" } }, "autoload": { "psr-4": { - "phpDocumentor\\Reflection\\": "src/" + "Psr\\Log\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -3029,64 +2896,50 @@ ], "authors": [ { - "name": "Jaap van Otterdijk", - "email": "opensource@ijaap.nl" + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" } ], - "description": "Common reflection classes used by phpdocumentor to reflect the code structure", - "homepage": "http://www.phpdoc.org", + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", "keywords": [ - "FQSEN", - "phpDocumentor", - "phpdoc", - "reflection", - "static analysis" + "log", + "psr", + "psr-3" ], "support": { - "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues", - "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x" + "source": "https://github.com/php-fig/log/tree/3.0.2" }, - "time": "2020-06-27T09:03:43+00:00" + "time": "2024-09-11T13:17:53+00:00" }, { - "name": "phpdocumentor/type-resolver", - "version": "2.0.0", + "name": "react/promise", + "version": "v3.3.0", "source": { "type": "git", - "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "327a05bbee54120d4786a0dc67aad30226ad4cf9" + "url": "https://github.com/reactphp/promise.git", + "reference": "23444f53a813a3296c1368bb104793ce8d88f04a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/327a05bbee54120d4786a0dc67aad30226ad4cf9", - "reference": "327a05bbee54120d4786a0dc67aad30226ad4cf9", + "url": "https://api.github.com/repos/reactphp/promise/zipball/23444f53a813a3296c1368bb104793ce8d88f04a", + "reference": "23444f53a813a3296c1368bb104793ce8d88f04a", "shasum": "" }, "require": { - "doctrine/deprecations": "^1.0", - "php": "^7.4 || ^8.0", - "phpdocumentor/reflection-common": "^2.0", - "phpstan/phpdoc-parser": "^2.0" + "php": ">=7.1.0" }, "require-dev": { - "ext-tokenizer": "*", - "phpbench/phpbench": "^1.2", - "phpstan/extension-installer": "^1.4", - "phpstan/phpstan": "^2.1", - "phpstan/phpstan-phpunit": "^2.0", - "phpunit/phpunit": "^9.5", - "psalm/phar": "^4" + "phpstan/phpstan": "1.12.28 || 1.4.10", + "phpunit/phpunit": "^9.6 || ^7.5" }, "type": "library", - "extra": { - "branch-alias": { - "dev-1.x": "1.x-dev", - "dev-2.x": "2.x-dev" - } - }, "autoload": { + "files": [ + "src/functions_include.php" + ], "psr-4": { - "phpDocumentor\\Reflection\\": "src" + "React\\Promise\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -3095,143 +2948,75 @@ ], "authors": [ { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" - } - ], - "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", - "support": { - "issues": "https://github.com/phpDocumentor/TypeResolver/issues", - "source": "https://github.com/phpDocumentor/TypeResolver/tree/2.0.0" - }, - "time": "2026-01-06T21:53:42+00:00" - }, - { - "name": "phpstan/phpdoc-parser", - "version": "2.3.2", - "source": { - "type": "git", - "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "a004701b11273a26cd7955a61d67a7f1e525a45a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/a004701b11273a26cd7955a61d67a7f1e525a45a", - "reference": "a004701b11273a26cd7955a61d67a7f1e525a45a", - "shasum": "" - }, - "require": { - "php": "^7.4 || ^8.0" - }, - "require-dev": { - "doctrine/annotations": "^2.0", - "nikic/php-parser": "^5.3.0", - "php-parallel-lint/php-parallel-lint": "^1.2", - "phpstan/extension-installer": "^1.0", - "phpstan/phpstan": "^2.0", - "phpstan/phpstan-phpunit": "^2.0", - "phpstan/phpstan-strict-rules": "^2.0", - "phpunit/phpunit": "^9.6", - "symfony/process": "^5.2" - }, - "type": "library", - "autoload": { - "psr-4": { - "PHPStan\\PhpDocParser\\": [ - "src/" - ] + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "PHPDoc parser with support for nullable, intersection and generic types", - "support": { - "issues": "https://github.com/phpstan/phpdoc-parser/issues", - "source": "https://github.com/phpstan/phpdoc-parser/tree/2.3.2" - }, - "time": "2026-01-25T14:56:51+00:00" - }, - { - "name": "phpstan/phpstan", - "version": "2.1.49", - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/d0082955396e7f5ba19cf298224b85e1099f0ed8", - "reference": "d0082955396e7f5ba19cf298224b85e1099f0ed8", - "shasum": "" - }, - "require": { - "php": "^7.4|^8.0" - }, - "conflict": { - "phpstan/phpstan-shim": "*" - }, - "bin": [ - "phpstan", - "phpstan.phar" - ], - "type": "library", - "autoload": { - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" ], - "description": "PHPStan - PHP Static Analysis Tool", + "description": "A lightweight implementation of CommonJS Promises/A for PHP", "keywords": [ - "dev", - "static analysis" + "promise", + "promises" ], "support": { - "docs": "https://phpstan.org/user-guide/getting-started", - "forum": "https://github.com/phpstan/phpstan/discussions", - "issues": "https://github.com/phpstan/phpstan/issues", - "security": "https://github.com/phpstan/phpstan/security/policy", - "source": "https://github.com/phpstan/phpstan-src" + "issues": "https://github.com/reactphp/promise/issues", + "source": "https://github.com/reactphp/promise/tree/v3.3.0" }, "funding": [ { - "url": "https://github.com/ondrejmirtes", - "type": "github" - }, - { - "url": "https://github.com/phpstan", - "type": "github" + "url": "https://opencollective.com/reactphp", + "type": "open_collective" } ], - "time": "2026-04-16T21:10:58+00:00" + "time": "2025-08-19T18:57:03+00:00" }, { - "name": "psr/container", - "version": "2.0.2", + "name": "revolt/event-loop", + "version": "v1.0.8", "source": { "type": "git", - "url": "https://github.com/php-fig/container.git", - "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" + "url": "https://github.com/revoltphp/event-loop.git", + "reference": "b6fc06dce8e9b523c9946138fa5e62181934f91c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", - "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "url": "https://api.github.com/repos/revoltphp/event-loop/zipball/b6fc06dce8e9b523c9946138fa5e62181934f91c", + "reference": "b6fc06dce8e9b523c9946138fa5e62181934f91c", "shasum": "" }, "require": { - "php": ">=7.4.0" + "php": ">=8.1" + }, + "require-dev": { + "ext-json": "*", + "jetbrains/phpstorm-stubs": "^2019.3", + "phpunit/phpunit": "^9", + "psalm/phar": "^5.15" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0.x-dev" + "dev-main": "1.x-dev" } }, "autoload": { "psr-4": { - "Psr\\Container\\": "src/" + "Revolt\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -3240,252 +3025,20 @@ ], "authors": [ { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common Container Interface (PHP FIG PSR-11)", - "homepage": "https://github.com/php-fig/container", - "keywords": [ - "PSR-11", - "container", - "container-interface", - "container-interop", - "psr" - ], - "support": { - "issues": "https://github.com/php-fig/container/issues", - "source": "https://github.com/php-fig/container/tree/2.0.2" - }, - "time": "2021-11-05T16:47:00+00:00" - }, - { - "name": "psr/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": "psr/log", - "version": "3.0.2", - "source": { - "type": "git", - "url": "https://github.com/php-fig/log.git", - "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", - "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", - "shasum": "" - }, - "require": { - "php": ">=8.0.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Log\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common interface for logging libraries", - "homepage": "https://github.com/php-fig/log", - "keywords": [ - "log", - "psr", - "psr-3" - ], - "support": { - "source": "https://github.com/php-fig/log/tree/3.0.2" - }, - "time": "2024-09-11T13:17:53+00:00" - }, - { - "name": "react/promise", - "version": "v3.3.0", - "source": { - "type": "git", - "url": "https://github.com/reactphp/promise.git", - "reference": "23444f53a813a3296c1368bb104793ce8d88f04a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/reactphp/promise/zipball/23444f53a813a3296c1368bb104793ce8d88f04a", - "reference": "23444f53a813a3296c1368bb104793ce8d88f04a", - "shasum": "" - }, - "require": { - "php": ">=7.1.0" - }, - "require-dev": { - "phpstan/phpstan": "1.12.28 || 1.4.10", - "phpunit/phpunit": "^9.6 || ^7.5" - }, - "type": "library", - "autoload": { - "files": [ - "src/functions_include.php" - ], - "psr-4": { - "React\\Promise\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jan Sorgalla", - "email": "jsorgalla@gmail.com", - "homepage": "https://sorgalla.com/" - }, - { - "name": "Christian Lück", - "email": "christian@clue.engineering", - "homepage": "https://clue.engineering/" - }, - { - "name": "Cees-Jan Kiewiet", - "email": "reactphp@ceesjankiewiet.nl", - "homepage": "https://wyrihaximus.net/" - }, - { - "name": "Chris Boden", - "email": "cboden@gmail.com", - "homepage": "https://cboden.dev/" - } - ], - "description": "A lightweight implementation of CommonJS Promises/A for PHP", - "keywords": [ - "promise", - "promises" - ], - "support": { - "issues": "https://github.com/reactphp/promise/issues", - "source": "https://github.com/reactphp/promise/tree/v3.3.0" - }, - "funding": [ - { - "url": "https://opencollective.com/reactphp", - "type": "open_collective" - } - ], - "time": "2025-08-19T18:57:03+00:00" - }, - { - "name": "revolt/event-loop", - "version": "v1.0.8", - "source": { - "type": "git", - "url": "https://github.com/revoltphp/event-loop.git", - "reference": "b6fc06dce8e9b523c9946138fa5e62181934f91c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/revoltphp/event-loop/zipball/b6fc06dce8e9b523c9946138fa5e62181934f91c", - "reference": "b6fc06dce8e9b523c9946138fa5e62181934f91c", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "ext-json": "*", - "jetbrains/phpstorm-stubs": "^2019.3", - "phpunit/phpunit": "^9", - "psalm/phar": "^5.15" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Revolt\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Aaron Piotrowski", - "email": "aaron@trowski.com" - }, - { - "name": "Cees-Jan Kiewiet", - "email": "ceesjank@gmail.com" - }, - { - "name": "Christian Lück", - "email": "christian@clue.engineering" - }, - { - "name": "Niklas Keller", - "email": "me@kelunik.com" + "name": "Aaron Piotrowski", + "email": "aaron@trowski.com" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "ceesjank@gmail.com" + }, + { + "name": "Christian Lück", + "email": "christian@clue.engineering" + }, + { + "name": "Niklas Keller", + "email": "me@kelunik.com" } ], "description": "Rock-solid event loop for concurrent PHP applications.", @@ -3594,30 +3147,30 @@ }, { "name": "roave/better-reflection", - "version": "6.69.0", + "version": "6.70.0", "source": { "type": "git", "url": "https://github.com/Roave/BetterReflection.git", - "reference": "dccbd10b5b3da8718f2945ad50faf90a1cb2db55" + "reference": "73df862c931946cf677eddc1cca176e3bb6a1d34" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Roave/BetterReflection/zipball/dccbd10b5b3da8718f2945ad50faf90a1cb2db55", - "reference": "dccbd10b5b3da8718f2945ad50faf90a1cb2db55", + "url": "https://api.github.com/repos/Roave/BetterReflection/zipball/73df862c931946cf677eddc1cca176e3bb6a1d34", + "reference": "73df862c931946cf677eddc1cca176e3bb6a1d34", "shasum": "" }, "require": { "ext-json": "*", "jetbrains/phpstorm-stubs": "2025.3", "nikic/php-parser": "^5.7.0", - "php": "~8.3.2 || ~8.4.1 || ~8.5.0" + "php": "~8.4.1 || ~8.5.0" }, "conflict": { "thecodingmachine/safe": "<1.1.3" }, "require-dev": { - "phpbench/phpbench": "^1.4.3", - "phpunit/phpunit": "^12.5.8" + "phpbench/phpbench": "^1.6.1", + "phpunit/phpunit": "^13.1.0" }, "suggest": { "composer/composer": "Required to use the ComposerSourceLocator" @@ -3657,9 +3210,9 @@ "description": "Better Reflection - an improved code reflection API", "support": { "issues": "https://github.com/Roave/BetterReflection/issues", - "source": "https://github.com/Roave/BetterReflection/tree/6.69.0" + "source": "https://github.com/Roave/BetterReflection/tree/6.70.0" }, - "time": "2026-02-01T13:20:30+00:00" + "time": "2026-04-07T18:16:42+00:00" }, { "name": "seld/jsonlint", @@ -3775,353 +3328,39 @@ }, { "name": "seld/signal-handler", - "version": "2.0.2", - "source": { - "type": "git", - "url": "https://github.com/Seldaek/signal-handler.git", - "reference": "04a6112e883ad76c0ada8e4a9f7520bbfdb6bb98" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Seldaek/signal-handler/zipball/04a6112e883ad76c0ada8e4a9f7520bbfdb6bb98", - "reference": "04a6112e883ad76c0ada8e4a9f7520bbfdb6bb98", - "shasum": "" - }, - "require": { - "php": ">=7.2.0" - }, - "require-dev": { - "phpstan/phpstan": "^1", - "phpstan/phpstan-deprecation-rules": "^1.0", - "phpstan/phpstan-phpunit": "^1", - "phpstan/phpstan-strict-rules": "^1.3", - "phpunit/phpunit": "^7.5.20 || ^8.5.23", - "psr/log": "^1 || ^2 || ^3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "2.x-dev" - } - }, - "autoload": { - "psr-4": { - "Seld\\Signal\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - } - ], - "description": "Simple unix signal handler that silently fails where signals are not supported for easy cross-platform development", - "keywords": [ - "posix", - "sigint", - "signal", - "sigterm", - "unix" - ], - "support": { - "issues": "https://github.com/Seldaek/signal-handler/issues", - "source": "https://github.com/Seldaek/signal-handler/tree/2.0.2" - }, - "time": "2023-09-03T09:24:00+00:00" - }, - { - "name": "symfony/config", - "version": "v8.0.8", - "source": { - "type": "git", - "url": "https://github.com/symfony/config.git", - "reference": "c7369cc1da250fcbfe0c5a9d109e419661549c39" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/c7369cc1da250fcbfe0c5a9d109e419661549c39", - "reference": "c7369cc1da250fcbfe0c5a9d109e419661549c39", - "shasum": "" - }, - "require": { - "php": ">=8.4", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/filesystem": "^7.4|^8.0", - "symfony/polyfill-ctype": "^1.8" - }, - "conflict": { - "symfony/service-contracts": "<2.5" - }, - "require-dev": { - "symfony/event-dispatcher": "^7.4|^8.0", - "symfony/finder": "^7.4|^8.0", - "symfony/messenger": "^7.4|^8.0", - "symfony/service-contracts": "^2.5|^3", - "symfony/yaml": "^7.4|^8.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Config\\": "" - }, - "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": "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/v8.0.8" - }, - "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-03-30T15:14:47+00:00" - }, - { - "name": "symfony/console", - "version": "v7.4.8", - "source": { - "type": "git", - "url": "https://github.com/symfony/console.git", - "reference": "1e92e39c51f95b88e3d66fa2d9f06d1fb45dd707" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/1e92e39c51f95b88e3d66fa2d9f06d1fb45dd707", - "reference": "1e92e39c51f95b88e3d66fa2d9f06d1fb45dd707", - "shasum": "" - }, - "require": { - "php": ">=8.2", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/polyfill-mbstring": "~1.0", - "symfony/service-contracts": "^2.5|^3", - "symfony/string": "^7.2|^8.0" - }, - "conflict": { - "symfony/dependency-injection": "<6.4", - "symfony/dotenv": "<6.4", - "symfony/event-dispatcher": "<6.4", - "symfony/lock": "<6.4", - "symfony/process": "<6.4" - }, - "provide": { - "psr/log-implementation": "1.0|2.0|3.0" - }, - "require-dev": { - "psr/log": "^1|^2|^3", - "symfony/config": "^6.4|^7.0|^8.0", - "symfony/dependency-injection": "^6.4|^7.0|^8.0", - "symfony/event-dispatcher": "^6.4|^7.0|^8.0", - "symfony/http-foundation": "^6.4|^7.0|^8.0", - "symfony/http-kernel": "^6.4|^7.0|^8.0", - "symfony/lock": "^6.4|^7.0|^8.0", - "symfony/messenger": "^6.4|^7.0|^8.0", - "symfony/process": "^6.4|^7.0|^8.0", - "symfony/stopwatch": "^6.4|^7.0|^8.0", - "symfony/var-dumper": "^6.4|^7.0|^8.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Console\\": "" - }, - "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": "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/v7.4.8" - }, - "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-03-30T13:54:39+00:00" - }, - { - "name": "symfony/dependency-injection", - "version": "v8.0.8", - "source": { - "type": "git", - "url": "https://github.com/symfony/dependency-injection.git", - "reference": "3ce58b0fa844dc647ca1d66ea34748af985728c5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/3ce58b0fa844dc647ca1d66ea34748af985728c5", - "reference": "3ce58b0fa844dc647ca1d66ea34748af985728c5", - "shasum": "" - }, - "require": { - "php": ">=8.4", - "psr/container": "^1.1|^2.0", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/service-contracts": "^3.6", - "symfony/var-exporter": "^7.4|^8.0" - }, - "conflict": { - "ext-psr": "<1.1|>=2" - }, - "provide": { - "psr/container-implementation": "1.1|2.0", - "symfony/service-implementation": "1.1|2.0|3.0" - }, - "require-dev": { - "symfony/config": "^7.4|^8.0", - "symfony/expression-language": "^7.4|^8.0", - "symfony/yaml": "^7.4|^8.0" - }, - "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/dependency-injection/tree/v8.0.8" - }, - "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-03-31T07:15:36+00:00" - }, - { - "name": "symfony/deprecation-contracts", - "version": "v3.6.0", + "version": "2.0.2", "source": { "type": "git", - "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62" + "url": "https://github.com/Seldaek/signal-handler.git", + "reference": "04a6112e883ad76c0ada8e4a9f7520bbfdb6bb98" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/63afe740e99a13ba87ec199bb07bbdee937a5b62", - "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62", + "url": "https://api.github.com/repos/Seldaek/signal-handler/zipball/04a6112e883ad76c0ada8e4a9f7520bbfdb6bb98", + "reference": "04a6112e883ad76c0ada8e4a9f7520bbfdb6bb98", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=7.2.0" + }, + "require-dev": { + "phpstan/phpstan": "^1", + "phpstan/phpstan-deprecation-rules": "^1.0", + "phpstan/phpstan-phpunit": "^1", + "phpstan/phpstan-strict-rules": "^1.3", + "phpunit/phpunit": "^7.5.20 || ^8.5.23", + "psr/log": "^1 || ^2 || ^3" }, "type": "library", "extra": { - "thanks": { - "url": "https://github.com/symfony/contracts", - "name": "symfony/contracts" - }, "branch-alias": { - "dev-main": "3.6-dev" + "dev-main": "2.x-dev" } }, "autoload": { - "files": [ - "function.php" - ] + "psr-4": { + "Seld\\Signal\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -4129,76 +3368,73 @@ ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" } ], - "description": "A generic function and convention to trigger deprecation notices", - "homepage": "https://symfony.com", + "description": "Simple unix signal handler that silently fails where signals are not supported for easy cross-platform development", + "keywords": [ + "posix", + "sigint", + "signal", + "sigterm", + "unix" + ], "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v3.6.0" + "issues": "https://github.com/Seldaek/signal-handler/issues", + "source": "https://github.com/Seldaek/signal-handler/tree/2.0.2" }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-09-25T14:21:43+00:00" + "time": "2023-09-03T09:24:00+00:00" }, { - "name": "symfony/event-dispatcher", - "version": "v8.0.8", + "name": "symfony/console", + "version": "v7.4.8", "source": { "type": "git", - "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "f662acc6ab22a3d6d716dcb44c381c6002940df6" + "url": "https://github.com/symfony/console.git", + "reference": "1e92e39c51f95b88e3d66fa2d9f06d1fb45dd707" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/f662acc6ab22a3d6d716dcb44c381c6002940df6", - "reference": "f662acc6ab22a3d6d716dcb44c381c6002940df6", + "url": "https://api.github.com/repos/symfony/console/zipball/1e92e39c51f95b88e3d66fa2d9f06d1fb45dd707", + "reference": "1e92e39c51f95b88e3d66fa2d9f06d1fb45dd707", "shasum": "" }, "require": { - "php": ">=8.4", - "symfony/event-dispatcher-contracts": "^2.5|^3" + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/string": "^7.2|^8.0" }, "conflict": { - "symfony/security-http": "<7.4", - "symfony/service-contracts": "<2.5" + "symfony/dependency-injection": "<6.4", + "symfony/dotenv": "<6.4", + "symfony/event-dispatcher": "<6.4", + "symfony/lock": "<6.4", + "symfony/process": "<6.4" }, "provide": { - "psr/event-dispatcher-implementation": "1.0", - "symfony/event-dispatcher-implementation": "2.0|3.0" + "psr/log-implementation": "1.0|2.0|3.0" }, "require-dev": { "psr/log": "^1|^2|^3", - "symfony/config": "^7.4|^8.0", - "symfony/dependency-injection": "^7.4|^8.0", - "symfony/error-handler": "^7.4|^8.0", - "symfony/expression-language": "^7.4|^8.0", - "symfony/framework-bundle": "^7.4|^8.0", - "symfony/http-foundation": "^7.4|^8.0", - "symfony/service-contracts": "^2.5|^3", - "symfony/stopwatch": "^7.4|^8.0" + "symfony/config": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/event-dispatcher": "^6.4|^7.0|^8.0", + "symfony/http-foundation": "^6.4|^7.0|^8.0", + "symfony/http-kernel": "^6.4|^7.0|^8.0", + "symfony/lock": "^6.4|^7.0|^8.0", + "symfony/messenger": "^6.4|^7.0|^8.0", + "symfony/process": "^6.4|^7.0|^8.0", + "symfony/stopwatch": "^6.4|^7.0|^8.0", + "symfony/var-dumper": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { "psr-4": { - "Symfony\\Component\\EventDispatcher\\": "" + "Symfony\\Component\\Console\\": "" }, "exclude-from-classmap": [ "/Tests/" @@ -4218,10 +3454,16 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", + "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/event-dispatcher/tree/v8.0.8" + "source": "https://github.com/symfony/console/tree/v7.4.8" }, "funding": [ { @@ -4241,25 +3483,24 @@ "type": "tidelift" } ], - "time": "2026-03-30T15:14:47+00:00" + "time": "2026-03-30T13:54:39+00:00" }, { - "name": "symfony/event-dispatcher-contracts", + "name": "symfony/deprecation-contracts", "version": "v3.6.0", "source": { "type": "git", - "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "59eb412e93815df44f05f342958efa9f46b1e586" + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/59eb412e93815df44f05f342958efa9f46b1e586", - "reference": "59eb412e93815df44f05f342958efa9f46b1e586", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/63afe740e99a13ba87ec199bb07bbdee937a5b62", + "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62", "shasum": "" }, "require": { - "php": ">=8.1", - "psr/event-dispatcher": "^1" + "php": ">=8.1" }, "type": "library", "extra": { @@ -4272,9 +3513,9 @@ } }, "autoload": { - "psr-4": { - "Symfony\\Contracts\\EventDispatcher\\": "" - } + "files": [ + "function.php" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -4290,18 +3531,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Generic abstractions related to dispatching event", + "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ], "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.6.0" + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.6.0" }, "funding": [ { @@ -5357,161 +4590,6 @@ } ], "time": "2026-03-30T15:14:47+00:00" - }, - { - "name": "symfony/var-exporter", - "version": "v8.0.8", - "source": { - "type": "git", - "url": "https://github.com/symfony/var-exporter.git", - "reference": "15776bb07a91b089037da89f8832fa41d5fa6ec6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/15776bb07a91b089037da89f8832fa41d5fa6ec6", - "reference": "15776bb07a91b089037da89f8832fa41d5fa6ec6", - "shasum": "" - }, - "require": { - "php": ">=8.4" - }, - "require-dev": { - "symfony/property-access": "^7.4|^8.0", - "symfony/serializer": "^7.4|^8.0", - "symfony/var-dumper": "^7.4|^8.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\VarExporter\\": "" - }, - "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": "Allows exporting any serializable PHP data structure to plain PHP code", - "homepage": "https://symfony.com", - "keywords": [ - "clone", - "construct", - "export", - "hydrate", - "instantiate", - "lazy-loading", - "proxy", - "serialize" - ], - "support": { - "source": "https://github.com/symfony/var-exporter/tree/v8.0.8" - }, - "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-03-30T15:14:47+00:00" - }, - { - "name": "symfony/yaml", - "version": "v8.0.8", - "source": { - "type": "git", - "url": "https://github.com/symfony/yaml.git", - "reference": "54174ab48c0c0f9e21512b304be17f8150ccf8f1" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/54174ab48c0c0f9e21512b304be17f8150ccf8f1", - "reference": "54174ab48c0c0f9e21512b304be17f8150ccf8f1", - "shasum": "" - }, - "require": { - "php": ">=8.4", - "symfony/polyfill-ctype": "^1.8" - }, - "conflict": { - "symfony/console": "<7.4" - }, - "require-dev": { - "symfony/console": "^7.4|^8.0" - }, - "bin": [ - "Resources/bin/yaml-lint" - ], - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Yaml\\": "" - }, - "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": "Loads and dumps YAML files", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/yaml/tree/v8.0.8" - }, - "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-03-30T15:14:47+00:00" } ], "packages-dev": [],